@analytics/type-utils
Version:
Tiny runtime type checking utils
1 lines • 23.7 kB
Source Map (JSON)
{"version":3,"file":"analytics-util-types.cjs","sources":["../src/index.js"],"sourcesContent":["\n/*\n Constants for reuse\n*/\n\nexport const FUNCTION = 'function'\nexport const STRING = 'string'\nexport const UNDEFINED = 'undefined'\nexport const BOOLEAN = 'boolean'\nexport const OBJECT = 'object'\nexport const ARRAY = 'array'\nexport const NUMBER = 'number'\nexport const SYMBOL = 'symbol'\nexport const NULL = 'null'\nexport const ERROR = 'error'\nexport const TYPE_ERROR = 'typeError'\nexport const SYNTAX_ERROR = 'syntaxError'\nexport const ASYNC_FUNCTION = 'asyncFunction'\nexport const GENERATOR_FUNCTION = 'generatorFunction'\nexport const ASYNC_GENERATOR_FUNCTION = 'asyncGeneratorFunction'\n\nexport const noOp = () => {}\nexport const ANY = 'any'\nexport const ALL = '*'\nexport const NONE = 'none'\nexport const HIDDEN = 'hidden'\nexport const PREFIX = '__'\n\n/* DOM Constants */\nexport const FORM = 'form'\nexport const INPUT = 'input'\nexport const BUTTON = 'button'\nexport const SELECT = 'select'\nexport const CHANGE = 'change'\nexport const SUBMIT = 'submit'\n\n/* Regex patterns */\nexport const REGEX_ISO = /^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)$/\nexport const REGEX_EMAIL = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\nexport const REGEX_JSON = /^\\{[\\s\\S]*\\}$|^\\[[\\s\\S]*\\]$/\n\n/* ────────────────────\nEnvironment checks\n─────────────────────── */\n// alt implementations \n// - https://github.com/MikeKovarik/platform-detect\n/** @type {Object} */\nconst PROCESS = typeof process !== UNDEFINED ? process : {}\n\n/** @type {String} */\nexport const ENV = (PROCESS.env && PROCESS.env.NODE_ENV) || ''\n\n/** @type {Boolean} */\nexport const isProd = ENV === 'production'\n\n/** @type {Boolean} */\nexport const isStaging = ENV === 'staging'\n\n/** @type {Boolean} */\nexport const isDev = ENV === 'development'\n\n/** @type {Boolean} */\nexport const isBrowser = typeof document !== UNDEFINED\n/** @type {Boolean} */\nexport const isLocalHost = isBrowser && window.location.hostname === 'localhost'\n\n/** @type {Boolean} */\nexport const isNode = PROCESS.versions != null && PROCESS.versions.node != null\n\n/** @type {Boolean} */\nexport const isDeno = typeof Deno !== UNDEFINED && typeof Deno.core !== UNDEFINED;\n\n/** @type {Boolean} */\nexport const isWebWorker = typeof self === OBJECT && self.constructor && self.constructor.name === 'DedicatedWorkerGlobalScope'\n\n/** @type {Boolean} */\nexport const isJsDom = (isBrowser && window.name === 'nodejs') || (typeof navigator !== UNDEFINED && typeof navigator.userAgent !== UNDEFINED && (navigator.userAgent.includes('Node.js') || navigator.userAgent.includes('jsdom')))\n\n/* ────────────────────\nType checks\n─────────────────────── */\n\nfunction text(method, s) {\n return s.charAt(0)[method]() + s.slice(1)\n}\n\nconst upper = text.bind(null, 'toUpperCase')\nconst lower = text.bind(null, 'toLowerCase')\n\n/**\n * Returns the object type of the given payload\n * @param {*} val\n * @returns {string}\n */\nexport function getTypeName(val) {\n if (isNull(val)) return upper(NULL)\n return (typeof val === OBJECT) ? ctorName(val) : Object.prototype.toString.call(val).slice(8, -1)\n}\n\n/**\n * Returns the object type of the given payload\n * @param {*} val\n * @returns {string}\n */\nexport function getType(val, toLowerCase = true) {\n const type = getTypeName(val)\n // console.log('type', type)\n return (toLowerCase) ? lower(type) : type\n}\n\n// export function getType(val) {\n// if (isNull(val)) return NULL\n// const type = typeof val\n// if (type === OBJECT) return ctorName(val).toLowerCase()\n// return type\n// }\n\nfunction typeOf(kind, val) {\n return typeof val === kind\n}\n\n/** \n * Check if value is function.\n * @param x\n * @return {x is Function}\n */\nexport const isFunction = typeOf.bind(null, FUNCTION)\n\n/** \n * Check if value is string.\n * @param x\n * @return {x is string}\n */\nexport const isString = typeOf.bind(null, STRING)\n\n/** \n * Check if value is undefined.\n * @param x\n * @return {x is undefined}\n */\nexport const isUndefined = typeOf.bind(null, UNDEFINED)\n\n/** \n * Check if value is not undefined.\n * @param x\n * @return {x is undefined}\n */\nexport function isDefined(x) {\n return !isUndefined(x)\n}\n\n/** \n * @param x\n * @return {x is boolean}\n */\nexport const isBoolean = typeOf.bind(null, BOOLEAN)\n\n/** \n * @param x\n * @return {x is symbol}\n */\nexport const isSymbol = typeOf.bind(null, SYMBOL)\n\n/** \n * @param x\n * @return {x is boolean}\n * @example\n * isNull(null)\n * // true\n */\nexport function isNull(x) {\n return x === null\n}\n\n/** \n * Check if value is number.\n * @param n\n * @return {boolean}\n * @example\n * > isNumber(0)\n * true\n * > isNumber(1)\n * true\n * > isNumber(1.1)\n * true\n * > isNumber(0xff)\n * true\n * > isNumber(0644)\n * true\n * > isNumber(6.2e5)\n * true\n * > isNumber(NaN)\n * false\n * > isNumber(Infinity)\n * true\n */\nexport function isNumber(n) {\n return getType(n) === NUMBER && !isNaN(n)\n}\n\nexport function isNumberLike(n) {\n return !isNaN(parseFloat(n))\n}\n\n/** \n * Check if value is ES2015 `class`.\n * @param x\n * @return {x is Class}\n */\nexport function isClass(x) {\n if (isFunction(x)) {\n return /^class /.test(Function.prototype.toString.call(x))\n }\n return false\n}\n\n/** \n * @template T\n * @param x\n * @return {x is Array<T>}\n */\nexport function isArray(x) {\n return getType(x) === ARRAY\n}\n\n/** \n * @param obj\n * @return {obj is Object}\n */\nexport function isObject(obj) {\n if (!isObjectLike(obj)) return false\n\n let proto = obj\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto)\n }\n\n return Object.getPrototypeOf(obj) === proto\n}\n\n/**\n * Check if value is object like\n * @param {*} obj \n * @returns {boolean}\n */\nexport function isObjectLike(obj) {\n return obj && (typeof obj === OBJECT || obj !== null)\n}\n\n/**\n* Tests if a value is a parsable JSON string.\n* @param {*} x - value to test\n* @returns {boolean} boolean indicating if a value is a parsable JSON string\n* @example\n* isJson('{\"a\":5}') // returns true\n* isJson('[]') // returns true\n* isJson('{a\":5}') // returns false\n*/\nexport function isJson(x) {\n if (!isString(x) || !REGEX_JSON.test(x)) return false\n try {\n JSON.parse(x)\n } catch (e) { \n return false\n }\n return true\n}\n\n/**\n * Is primitive scalar value\n * @param x\n * @return {boolean}\n * @example\n isPrimitive(true) => true\n isPrimitive({}) => false\n isPrimitive(0) => true\n isPrimitive('1') => true\n isPrimitive(1.1) => true\n isPrimitive(NaN) => true\n isPrimitive(Infinity) => true\n isPrimitive(function() {}) => false\n isPrimitive(Date), => false\n isPrimitive(null) => true\n isPrimitive(undefined) => true\n */\nexport function isPrimitive(x) {\n if (isNull(x)) return true\n // if (isNaN(x)) return false\n switch (typeof x) {\n case STRING:\n case NUMBER:\n case SYMBOL:\n case UNDEFINED:\n case BOOLEAN:\n return true\n default:\n return false\n }\n}\n\n/**\n* Tests if an object has a specified method name.\n* @param {*} value - value to test\n* @param {*} property - property to test\n* @returns {boolean} boolean indicating if an object has a specified method name\n* @example\n* const obj = {\n* key: myFunc,\n* keyTwo: 'foobar'\n* }\n* isMethod(obj, 'key' ) // returns true\n* isMethod(obj, 'keyTwo' ) // returns false\n* isMethod(obj, 'otherThing' ) // returns false\n*/\nexport function isMethod(value, prop) {\n return isObject(value) && isFunction(value[prop])\n}\n\n/**\n * Returns true if the input is a Promise.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isPromise(x) {\n if (!x) return false\n return !!(!isUndefined(Promise) && x instanceof Promise || x.then && isFunction(x.then))\n}\n\n/**\n * Returns true if the input is a generator.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isGenerator(x) {\n return isObjectLike(x) && isFunction(x.throw) && isFunction(x.return) && isFunction(x.next)\n}\n\n/** \n * Is generator function\n * @param x\n * @return {boolean}\n * @example\n isGeneratorFunction(() => {}) => false\n isGeneratorFunction(function* () => {}) => true\n isGeneratorFunction(function * () {\n yield 'my-val'\n }))\n */\nexport function isGeneratorFunction(x) {\n return getType(x) === GENERATOR_FUNCTION\n}\n\n/** \n * Is async function\n * @param x\n * @return {boolean}\n * @example\n isAsyncFunction(() => {}) => false\n isAsyncFunction(async () => {}) => true\n */\nexport function isAsyncFunction(x) {\n return getType(x) === ASYNC_FUNCTION\n}\n\n\nexport function ctorName(x) {\n return isFunction(x.constructor) ? x.constructor.name : null\n}\n\n/**\n * Returns true if the input is a Set.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isSet(value) {\n return value instanceof Set\n}\n\n/**\n * Returns true if the input is a Map.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isMap(value) {\n return value instanceof Map\n}\n\n/**\n * Check if value is regexp\n * @param {*} value - Value to check\n * @return {boolean} \n */\nexport function isRegex(value) {\n return value instanceof RegExp\n}\n\n/**\n * Check if value is Buffer\n * @param {*} value - Value to check\n * @return {boolean} \n */\nexport function isBuffer(val) {\n if (val.constructor && isFunction(val.constructor.isBuffer)) {\n return val.constructor.isBuffer(val)\n }\n return false\n}\n\n/**\n * Check if value is Error\n * @param x - Object to check\n * @return {Boolean} If value is error\n * @example\n * isError(new Error()) // True\n */\nexport function isError(x) {\n return x instanceof Error || (isString(x.message) && x.constructor && isNumber(x.constructor.stackTraceLimit))\n}\n\n/**\n * Check if value error like (i.e has the name and message properties, both of which are strings)\n * @param obj - Object to check\n * @return {Boolean} If object is error-like\n * via https://github.com/Luke-zhang-04/utils/blob/master/src/typeGuards.ts#L62\n * @example\n *\n * ```js\n * isErrorLike(new Error()) // True\n * isErrorLike({name: \"Error!\", message: \"This is an error\", other: 0}) // True\n * isErrorLike({}) // False\n * isErrorLike({name: \"Error\", message: null}) // False\n *\n * // Works as a type guard\n * const something = {name: \"Error\", message: \"This is an error\"} as unknown\n *\n * if (isErrorLike(something)) {\n * console.log(something.name) // No Typescript error\n * }\n * ```\n */\nexport function isErrorLike(obj) {\n return isObjectLike(obj) && isString(obj.message) && isString(obj.name)\n}\n\nfunction errorType(ErrKind, value) {\n if (typeof value !== 'object' || isNull(value)) return false\n // Check for `TypeError` objects from the same realm (same Node.js `vm` or same `Window` object)...\n if (value instanceof ErrKind) return true\n const typeName = getType(new ErrKind(''))\n // All `TypeError` objects are `Error` objects...\n if (isError(value)) {\n while (value) {\n if (getType(value) === typeName) {\n return true\n }\n value = Object.getPrototypeOf(value)\n }\n }\n return false\n}\n\nexport const isTypeError = errorType.bind(null, TypeError)\n\nexport const isSyntaxError = errorType.bind(null, SyntaxError)\n\n/** \n * @param func - function to check if noOp\n * @return {Boolean} - is noOp\n * @examples\n function foo() {}\n isNoOp(foo) // true\n isNoOp(() => { }) // true\n isNoOp(() => { console.log('hi') }) // false\n */\nexport function isNoOp(func) {\n if (!isFunction(func)) return false\n const emptyFunc = /{(\\r|\\n|\\s)*}/gm\n const noOpStr = noOp + ''\n const funcString = (func.toString().match(emptyFunc) || [''])[0].replace(emptyFunc, noOpStr)\n return noOpStr === funcString\n}\n\n/**\n * Check if value is function arguments\n * @param {*} val \n * @returns \n */\nexport function isArguments(val) {\n try {\n if (isNumber(val.length) && isFunction(val.callee)) return true\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) return true\n }\n return false\n}\n\n/**\n * Check if value is truthy\n * @param {*} value \n * @return {Boolean} - is truthy value\n */\nexport function isTruthy(v) {\n if (isString(v) && v.toLowerCase() === 'false') return false\n return !!v\n}\n\n/**\n * Check if value is falsy\n * @param {*} x \n * @return {Boolean} - is falsy value\n * @example\n * isFalsy(false) // returns true\n * isFalsy(null) // returns true\n * isFalsy('') // returns true\n * isFalsy(0) // returns true\n * isFalsy(void 0) // returns true\n * isFalsy(NaN) // returns true\n * isFalsy([]) // returns false\n */\nexport function isFalsy(x) {\n return x ? false : true\n}\n\n// ^ future updates https://github.com/thenativeweb/boolean\n\n/**\n * Check if value is true\n * @param {*} x \n * @return {Boolean} - is true\n */\nexport function isTrue(x) {\n return x === true\n}\n\n/**\n * Check if value is true\n * @param {*} x \n * @return {Boolean} - is true\n */\nexport function isFalse(x) {\n return x === false\n}\n\n/**\n * Check if value is email\n * @param {*} x \n * @return {Boolean} - is email like value\n */\nexport function isEmail(x) {\n if (x.length > 320) return false\n return REGEX_EMAIL.test(x)\n}\n\n/**\n * Check if value is date\n * @param {*} val \n * @returns {Boolean}\n */\nexport function isDate(x) {\n if (x instanceof Date) return true\n return isFunction(x.toDateString) && isFunction(x.getDate) && isFunction(x.setDate)\n}\n\n/**\n * Check if value is ISO date e.g. '2022-01-02T06:45:28.547Z'\n * @param {*} x\n * @return {Boolean} - is email like value\n */\nexport function isIsoDate(x) {\n return REGEX_ISO.test(x)\n}\n\n/**\n * Is value empty\n * @param {*} x \n * @returns {Boolean}\n * @example\n * isEmpty(null)\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n */\nexport function isEmpty(x) {\n if (isNull(x)) return true\n if (isArray(x)) return !x.length\n if (isSet(x) || isMap(x)) return !x.size\n if (isObject(x)) return !Object.keys(x).length\n return true\n}\n\n/* ────────────────────\nHTML Element checks\n─────────────────────── */\n\n/** \n * @param obj\n * @return {obj is NodeList}\n */\nexport function isNodeList(obj) {\n return NodeList.prototype.isPrototypeOf(obj)\n}\n\n/**\n * Check if input is DOM element\n * @param {HTMLElement|*} element\n * @return {boolean} \n */\nexport function isElement(element, type) {\n const isEl = element instanceof Element || element instanceof HTMLDocument\n if (!isEl || !type) return isEl\n return isNodeType(element, type)\n}\n\n/**\n * Check if element is specific DOMNode type\n * @param {HTMLElement|*} element\n * @param {String} type\n * @return {boolean}\n */\nexport function isNodeType(element, type = '') {\n return element && element.nodeName === type.toUpperCase()\n}\n\nfunction bindArgs(fn, ...boundArgs) {\n return function(...args) {\n return fn(...args, ...boundArgs)\n }\n}\n\n/**\n * Check if element is form element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isForm = bindArgs(isElement, FORM)\n\n/**\n * Check if element is button element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isButton = bindArgs(isElement, BUTTON)\n\n/**\n * Check if element is input element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isInput = bindArgs(isElement, INPUT)\n\n/**\n * Check if element is select element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isSelect = bindArgs(isElement, SELECT)\n\n/**\n * Check if DOM element is hidden\n * @param {HTMLElement|null|undefined} element\n * @param {HTMLElement|null|undefined} until\n * @return {boolean}\n */\nexport function isHidden(element, until) {\n if (!element || getComputedStyle(element).visibility === HIDDEN) return true\n\n while (element) {\n if (until != null && element === until) return false\n if (getComputedStyle(element).display === NONE) return true\n element = element.parentElement\n }\n\n return false\n}\n\n/* ────────────────────\nEnsure Values\n─────────────────────── */\n\n/**\n * Ensure value returned is Array\n * @param {*} singleOrArray \n * @returns [*]\n */\nexport function ensureArray(singleOrArray) {\n if (!singleOrArray) return []\n if (isArray(singleOrArray)) return singleOrArray\n return [singleOrArray]\n}\n"],"names":["FUNCTION","STRING","UNDEFINED","BOOLEAN","OBJECT","ARRAY","NUMBER","SYMBOL","NULL","ASYNC_FUNCTION","GENERATOR_FUNCTION","noOp","NONE","HIDDEN","FORM","INPUT","BUTTON","SELECT","REGEX_ISO","REGEX_EMAIL","REGEX_JSON","PROCESS","process","ENV","env","NODE_ENV","isProd","isStaging","isDev","isBrowser","document","isLocalHost","window","location","hostname","isNode","versions","node","isDeno","Deno","core","isWebWorker","self","constructor","name","isJsDom","navigator","userAgent","includes","text","method","s","charAt","slice","upper","bind","lower","getTypeName","val","isNull","ctorName","Object","prototype","toString","call","getType","toLowerCase","type","typeOf","kind","isFunction","isString","isUndefined","isBoolean","isSymbol","x","isNumber","n","isNaN","isArray","isObject","obj","isObjectLike","proto","getPrototypeOf","isSet","value","Set","isMap","Map","isError","Error","message","stackTraceLimit","errorType","ErrKind","typeName","isTypeError","TypeError","isSyntaxError","SyntaxError","isElement","element","isEl","Element","HTMLDocument","isNodeType","nodeName","toUpperCase","bindArgs","fn","boundArgs","arguments","apply","concat","isForm","isButton","isInput","isSelect","singleOrArray","length","callee","err","indexOf","isBuffer","test","Function","Date","toDateString","getDate","setDate","size","keys","next","until","getComputedStyle","visibility","display","parentElement","JSON","parse","e","prop","func","emptyFunc","noOpStr","match","replace","NodeList","isPrototypeOf","parseFloat","Promise","then","RegExp","v"],"mappings":"AAKa,IAAAA,EAAW,WACXC,EAAS,SACTC,EAAY,YACZC,EAAU,UACVC,EAAS,SACTC,EAAQ,QACRC,EAAS,SACTC,EAAS,SACTC,EAAO,OAIPC,EAAiB,gBACjBC,EAAqB,oBAGrBC,EAAO,WAAM,EAGbC,EAAO,OACPC,EAAS,SAITC,EAAO,OACPC,EAAQ,QACRC,EAAS,SACTC,EAAS,SAKTC,EAAY,6EACZC,EAAc,wIACdC,EAAa,8BAQpBC,SAAiBC,UAAYpB,EAAYoB,QAAU,CAAE,EAG9CC,EAAOF,EAAQG,KAAOH,EAAQG,IAAIC,UAAa,GAG/CC,EAAiB,eAARH,EAGTI,EAAoB,YAARJ,EAGZK,EAAgB,gBAARL,EAGRM,SAAmBC,WAAa5B,EAEhC6B,EAAcF,GAA0C,cAA7BG,OAAOC,SAASC,SAG3CC,EAA6B,MAApBd,EAAQe,UAA6C,MAAzBf,EAAQe,SAASC,KAGtDC,SAAgBC,OAASrC,UAAoBqC,KAAKC,OAAStC,EAG3DuC,SAAqBC,OAAStC,GAAUsC,KAAKC,aAAyC,+BAA1BD,KAAKC,YAAYC,KAG7EC,EAAWhB,GAA6B,WAAhBG,OAAOY,aAA8BE,YAAc5C,UAAoB4C,UAAUC,YAAc7C,IAAc4C,UAAUC,UAAUC,SAAS,YAAcF,UAAUC,UAAUC,SAAS,UAM1N,SAASC,EAAKC,EAAQC,GACpB,OAAOA,EAAEC,OAAO,GAAGF,KAAYC,EAAEE,MAAM,EACzC,CAEA,IAAMC,EAAQL,EAAKM,KAAK,KAAM,eACxBC,EAAQP,EAAKM,KAAK,KAAM,eAOvB,SAASE,EAAYC,GAC1B,OAAIC,EAAOD,GAAaJ,EAAM9C,UACfkD,IAAQtD,EAAUwD,EAASF,GAAOG,OAAOC,UAAUC,SAASC,KAAKN,GAAKL,MAAM,GAAI,EACjG,CAOO,SAASY,EAAQP,EAAKQ,QAAAA,IAAAA,IAAAA,GAAc,GACzC,IAAMC,EAAOV,EAAYC,GAEzB,OAAQQ,EAAeV,EAAMW,GAAQA,CACvC,CASA,SAASC,EAAOC,EAAMX,GACpB,cAAcA,IAAQW,CACxB,CAOa,IAAAC,EAAaF,EAAOb,KAAK,KAAMvD,GAO/BuE,EAAWH,EAAOb,KAAK,KAAMtD,GAO7BuE,EAAcJ,EAAOb,KAAK,KAAMrD,GAehCuE,EAAYL,EAAOb,KAAK,KAAMpD,GAM9BuE,EAAWN,EAAOb,KAAK,KAAMhD,GASnC,SAASoD,EAAOgB,GACrB,OAAa,OAANA,CACT,CAwBO,SAASC,EAASC,GACvB,OAAOZ,EAAQY,KAAOvE,IAAWwE,MAAMD,EACzC,CAuBgB,SAAAE,EAAQJ,GACtB,OAAOV,EAAQU,KAAOtE,CACxB,CAMgB,SAAA2E,EAASC,GACvB,IAAKC,EAAaD,GAAM,OAAY,EAGpC,IADA,IAAIE,EAAQF,EAC4B,OAAjCpB,OAAOuB,eAAeD,IAC3BA,EAAQtB,OAAOuB,eAAeD,GAGhC,OAAOtB,OAAOuB,eAAeH,KAASE,CACxC,CAOO,SAASD,EAAaD,GAC3B,OAAOA,WAAeA,IAAQ7E,GAAkB,OAAR6E,EAC1C,CAsHgB,SAAArB,EAASe,GACvB,OAAOL,EAAWK,EAAEhC,aAAegC,EAAEhC,YAAYC,KAAO,IAC1D,CAOgB,SAAAyC,EAAMC,GACpB,OAAOA,aAAiBC,GAC1B,CAOgB,SAAAC,EAAMF,GACpB,OAAOA,aAAiBG,GAC1B,CA8BgB,SAAAC,EAAQf,GACtB,OAAOA,aAAagB,OAAUpB,EAASI,EAAEiB,UAAYjB,EAAEhC,aAAeiC,EAASD,EAAEhC,YAAYkD,gBAC/F,CA2BA,SAASC,EAAUC,EAAST,GAC1B,GAAqB,iBAAVA,GAAsB3B,EAAO2B,GAAQ,OAAO,EAEvD,GAAIA,aAAiBS,EAAS,OAAW,EACzC,IAAMC,EAAW/B,EAAQ,IAAI8B,EAAQ,KAErC,GAAIL,EAAQJ,GACV,KAAOA,GAAO,CACZ,GAAIrB,EAAQqB,KAAWU,EACrB,OACF,EACEV,EAAQzB,OAAOuB,eAAeE,EAClC,CAEF,OACF,CAAA,CAEa,IAAAW,EAAcH,EAAUvC,KAAK,KAAM2C,WAEnCC,GAAgBL,EAAUvC,KAAK,KAAM6C,aAsJlC,SAAAC,GAAUC,EAASnC,GACjC,IAAMoC,EAAOD,aAAmBE,SAAWF,aAAmBG,aAC9D,OAAKF,GAASpC,EACPuC,GAAWJ,EAASnC,GADAoC,CAE7B,CAQO,SAASG,GAAWJ,EAASnC,GAClC,YADsC,IAAJA,IAAAA,EAAO,IAClCmC,GAAWA,EAAQK,WAAaxC,EAAKyC,aAC9C,CAEA,SAASC,GAASC,GAAkB,IAAXC,EAAS1D,GAAAA,MAAAW,KAAAgD,UAChC,GAAA,OAAyB,WACvB,OAAOF,EAAEG,WAAA,EAAA,GAAA5D,MAAAW,KAAAgD,WAAAE,OAAaH,GACxB,CACF,CAOa,IAAAI,GAASN,GAASR,GAAWvF,GAO7BsG,GAAWP,GAASR,GAAWrF,GAO/BqG,GAAUR,GAASR,GAAWtF,GAO9BuG,GAAWT,GAASR,GAAWpF,eA9nBzB,gBADA,gFAHqB,2EAclB,qCAnBD,uLAYC,qHAQA,+CAlBM,iCADF,uEAmqBnB,SAAqBsG,GAC1B,OAAKA,EACDxC,EAAQwC,GAAuBA,EAC5B,CAACA,GAFmB,EAG7B,8DA/MO,SAAqB7D,GAC1B,IACE,GAAIkB,EAASlB,EAAI8D,SAAWlD,EAAWZ,EAAI+D,QAAS,OAAO,CAC7D,CAAE,MAAOC,GACP,IAAuC,IAAnCA,EAAI9B,QAAQ+B,QAAQ,UAAkB,OAAO,CACnD,CACA,OACF,CAAA,4CAtIgB,SAAgBhD,GAC9B,OAAOV,EAAQU,KAAOlE,CACxB,2DAuCgB,SAASiD,GACvB,SAAIA,EAAIf,cAAe2B,EAAWZ,EAAIf,YAAYiF,YACzClE,EAAIf,YAAYiF,SAASlE,EAGpC,sCArMgB,SAAQiB,GACtB,QAAIL,EAAWK,IACN,UAAUkD,KAAKC,SAAShE,UAAUC,SAASC,KAAKW,GAG3D,iBAwVO,SAAgBA,GACrB,OAAIA,aAAaoD,MACVzD,EAAWK,EAAEqD,eAAiB1D,EAAWK,EAAEsD,UAAY3D,EAAWK,EAAEuD,QAC7E,oBA9ZO,SAAmBvD,GACxB,OAAQH,EAAYG,EACtB,wEA+YO,SAAiBA,GACtB,QAAIA,EAAE6C,OAAS,MACRrG,EAAY0G,KAAKlD,EAC1B,kBAqCO,SAAiBA,GACtB,SAAIhB,EAAOgB,KACPI,EAAQJ,GAAYA,EAAE6C,OACtBnC,EAAMV,IAAMa,EAAMb,GAAYA,EAAEwD,KAChCnD,EAASL,IAAYd,OAAOuE,KAAKzD,GAAG6C,QAE1C,wCA1JgB,SAAYvC,GAC1B,OAAOC,EAAaD,IAAQV,EAASU,EAAIW,UAAYrB,EAASU,EAAIrC,KACpE,kBAiGgB,SAAQ+B,GACtB,OAAa,IAANA,CACT,kBAtBO,SAAiBA,GACtB,OAAOA,CACT,6DA5LO,SAAqBA,GAC1B,OAAOO,EAAaP,IAAML,EAAWK,EAAC,QAAWL,EAAWK,EAAC,SAAYL,EAAWK,EAAE0D,KACxF,8BAagB,SAAoB1D,GAClC,OAAOV,EAAQU,KAAOjE,CACxB,4BA+TyB4F,EAASgC,GAChC,IAAKhC,GAAWiC,iBAAiBjC,GAASkC,aAAe3H,EAAQ,OAAW,EAE5E,KAAOyF,GAAS,CACd,GAAa,MAATgC,GAAiBhC,IAAYgC,EAAO,OAAO,EAC/C,GAAIC,iBAAiBjC,GAASmC,UAAY7H,EAAM,OAAW,EAC3D0F,EAAUA,EAAQoC,aACpB,CAEA,OAAO,CACT,gDA/G0B/D,GACxB,OAAOzD,EAAU2G,KAAKlD,EACxB,mCAxTO,SAAgBA,GACrB,IAAKJ,EAASI,KAAOvD,EAAWyG,KAAKlD,GAAI,OAAO,EAChD,IACEgE,KAAKC,MAAMjE,EACb,CAAE,MAAOkE,GACP,OACF,CAAA,CACA,OAAO,CACT,yDAgDgB,SAASvD,EAAOwD,GAC9B,OAAO9D,EAASM,IAAUhB,EAAWgB,EAAMwD,GAC7C,iBA8JgB,SAAOC,GACrB,IAAKzE,EAAWyE,GAAO,OAAY,EACnC,IAAMC,EAAY,kBACZC,EAAUtI,EAAO,GAEvB,OAAOsI,KADaF,EAAKhF,WAAWmF,MAAMF,IAAc,CAAC,KAAK,GAAGG,QAAQH,EAAWC,EAEtF,sCA4HO,SAAoBhE,GACzB,OAAOmE,SAAStF,UAAUuF,cAAcpE,EAC1C,iFAtZO,SAAsBJ,GAC3B,OAAQC,MAAMwE,WAAWzE,GAC3B,gEAmFgB,SAAYF,GAC1B,GAAIhB,EAAOgB,GAAI,OAAO,EAEtB,cAAeA,GACb,KAAK1E,EACL,KAAKK,EACL,KAAKC,EACL,KAAKL,EACL,KAAKC,EACH,OAAW,EACb,QACE,OACJ,EACF,qCAyBgB,SAAUwE,GACxB,QAAKA,OACMH,EAAY+E,UAAY5E,aAAa4E,SAAW5E,EAAE6E,MAAQlF,EAAWK,EAAE6E,MACpF,kBAkEgB,SAAQlE,GACtB,OAAOA,aAAiBmE,MAC1B,wIAwIgB,SAAO9E,GACrB,OAAa,IAANA,CACT,mBA/BO,SAAkB+E,GACvB,QAAInF,EAASmF,IAA0B,UAApBA,EAAExF,gBACZwF,EACX"}