package.dist.short-unique-id.js.map Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of short-unique-id Show documentation
Show all versions of short-unique-id Show documentation
Generate random or sequential UUID of any length
The newest version!
{
"version": 3,
"sources": ["../src/index.ts", "../package.json"],
"sourcesContent": ["/**\n * @packageDocumentation\n **/\n\n// Copyright 2017-2022 the Short Unique ID authors. All rights reserved. Apache 2.0 license.\n\n// @ts-ignore\nimport {version} from '../package.json';\n\nexport interface ShortUniqueIdRanges {\n [k: string]: [number, number];\n};\n\nexport interface ShortUniqueIdRangesMap {\n [k: string]: ShortUniqueIdRanges;\n};\n\nexport type ShortUniqueIdDefaultDictionaries = 'number' | 'alpha' | 'alpha_lower' | 'alpha_upper' | 'alphanum' | 'alphanum_lower' | 'alphanum_upper' | 'hex';\n\n/**\n * ```js\n * {\n * dictionary: ['z', 'a', 'p', 'h', 'o', 'd', ...],\n * shuffle: false,\n * debug: false,\n * length: 6,\n * }\n * ```\n *
\n * @see {@link DEFAULT_OPTIONS}\n */\nexport interface ShortUniqueIdOptions {\n /** User-defined character dictionary */\n dictionary: string[] | ShortUniqueIdDefaultDictionaries;\n\n /** If true, sequentialUUID use the dictionary in the given order */\n shuffle: boolean;\n\n /** If true the instance will console.log useful info */\n debug: boolean;\n\n /** From 1 to infinity, the length you wish your UUID to be */\n length: number;\n\n /** From 0 to infinity, the current value for the sequential UUID counter */\n counter: number;\n};\n\n/**\n * 6 was chosen as the default UUID length since for most cases\n * it will be more than aptly suitable to provide millions of UUIDs\n * with a very low probability of producing a duplicate UUID.\n *\n * For example, with a dictionary including digits from 0 to 9,\n * as well as the alphabet from a to z both in UPPER and lower case,\n * the probability of generating a duplicate in 1,000,000 rounds\n * is ~0.00000002, or about 1 in 50,000,000.\n */\nexport const DEFAULT_UUID_LENGTH: number = 6;\n\nexport const DEFAULT_OPTIONS: ShortUniqueIdOptions = {\n dictionary: 'alphanum',\n shuffle: true,\n debug: false,\n length: DEFAULT_UUID_LENGTH,\n counter: 0,\n};\n\n/**\n * Generate random or sequential UUID of any length.\n *\n * ### Use as module\n *\n * ```js\n * // Deno (web module) Import\n * import ShortUniqueId from 'https://cdn.jsdelivr.net/npm/short-unique-id@latest/src/index.ts';\n *\n * // ES6 / TypeScript Import\n * import ShortUniqueId from 'short-unique-id';\n *\n * // or Node.js require\n * const ShortUniqueId = require('short-unique-id');\n *\n * // Instantiate\n * const uid = new ShortUniqueId();\n *\n * // Random UUID\n * console.log(uid.rnd());\n *\n * // Sequential UUID\n * console.log(uid.seq());\n * ```\n *\n * ### Use in browser\n *\n * ```html\n * \n * \n *\n * \n * \n * ```\n *\n * ### Options\n *\n * Options can be passed when instantiating `uid`:\n *\n * ```js\n * const options = { ... };\n *\n * const uid = new ShortUniqueId(options);\n * ```\n *\n * For more information take a look at the [ShortUniqueIdOptions type definition](/interfaces/shortuniqueidoptions.html).\n */\nexport default class ShortUniqueId {\n /** @hidden */\n static default: typeof ShortUniqueId = ShortUniqueId;\n\n public counter: number;\n public debug: boolean;\n public dict: string[];\n public version: string;\n public dictIndex: number = 0;\n public dictRange: number[] =[];\n public lowerBound: number = 0;\n public upperBound: number = 0;\n public dictLength: number = 0;\n public uuidLength: number;\n\n protected _digit_first_ascii: number = 48;\n protected _digit_last_ascii: number = 58;\n protected _alpha_lower_first_ascii: number = 97;\n protected _alpha_lower_last_ascii: number = 123;\n protected _hex_last_ascii: number = 103;\n protected _alpha_upper_first_ascii: number = 65;\n protected _alpha_upper_last_ascii: number = 91;\n\n protected _number_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n };\n\n protected _alpha_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alpha_lower_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alpha_upper_dict_ranges: ShortUniqueIdRanges = {\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_lower_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alphanum_upper_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _hex_dict_ranges: ShortUniqueIdRanges = {\n decDigits: [this._digit_first_ascii, this._digit_last_ascii],\n alphaDigits: [this._alpha_lower_first_ascii, this._hex_last_ascii],\n };\n\n protected _dict_ranges: ShortUniqueIdRangesMap = {\n _number_dict_ranges: this._number_dict_ranges,\n _alpha_dict_ranges: this._alpha_dict_ranges,\n _alpha_lower_dict_ranges: this._alpha_lower_dict_ranges,\n _alpha_upper_dict_ranges: this._alpha_upper_dict_ranges,\n _alphanum_dict_ranges: this._alphanum_dict_ranges,\n _alphanum_lower_dict_ranges: this._alphanum_lower_dict_ranges,\n _alphanum_upper_dict_ranges: this._alphanum_upper_dict_ranges,\n _hex_dict_ranges: this._hex_dict_ranges,\n };\n\n /* tslint:disable consistent-return */\n protected log = (...args: any[]): void => {\n const finalArgs = [...args];\n finalArgs[0] = `[short-unique-id] ${args[0]}`;\n /* tslint:disable no-console */\n if (this.debug === true) {\n if (typeof console !== 'undefined' && console !== null) {\n return console.log(...finalArgs);\n }\n }\n /* tslint:enable no-console */\n };\n /* tslint:enable consistent-return */\n\n protected _normalizeDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): string[] => {\n let finalDict: string[];\n\n if (dictionary && Array.isArray(dictionary) && dictionary.length > 1) {\n finalDict = dictionary as string[];\n } else {\n finalDict = [];\n\n let i;\n\n this.dictIndex = i = 0;\n\n const rangesName = `_${dictionary as ShortUniqueIdDefaultDictionaries}_dict_ranges`;\n const ranges = this._dict_ranges[rangesName];\n\n Object.keys(ranges).forEach((rangeType) => {\n const rangeTypeKey = rangeType;\n\n this.dictRange = ranges[rangeTypeKey];\n\n this.lowerBound = this.dictRange[0];\n this.upperBound = this.dictRange[1];\n\n for (\n this.dictIndex = i = this.lowerBound;\n this.lowerBound <= this.upperBound ? i < this.upperBound : i > this.upperBound;\n this.dictIndex = this.lowerBound <= this.upperBound ? i += 1 : i -= 1\n ) {\n finalDict.push(String.fromCharCode(this.dictIndex));\n }\n });\n }\n\n if (shuffle) {\n // Shuffle Dictionary to remove selection bias.\n const PROBABILITY = 0.5;\n finalDict = finalDict.sort(() => Math.random() - PROBABILITY);\n }\n\n return finalDict;\n }\n\n /** Change the dictionary after initialization. */\n setDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): void => {\n this.dict = this._normalizeDictionary(dictionary, shuffle);\n\n // Cache Dictionary Length for future usage.\n this.dictLength = this.dict.length;\n\n // Reset internal counter.\n this.setCounter(0);\n };\n\n seq = (): string => {\n return this.sequentialUUID();\n };\n\n /**\n * Generates UUID based on internal counter that's incremented after each ID generation.\n * @alias `const uid = new ShortUniqueId(); uid.seq();`\n */\n sequentialUUID = (): string => {\n let counterDiv: number;\n let counterRem: number;\n let id: string = '';\n\n counterDiv = this.counter;\n\n do {\n counterRem = counterDiv % this.dictLength;\n counterDiv = Math.trunc(counterDiv / this.dictLength);\n id += this.dict[counterRem];\n } while (counterDiv !== 0);\n\n this.counter += 1;\n\n return id;\n };\n\n rnd = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n return this.randomUUID(uuidLength);\n };\n\n /**\n * Generates UUID by creating each part randomly.\n * @alias `const uid = new ShortUniqueId(); uid.rnd(uuidLength: number);`\n */\n randomUUID = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n let id: string;\n let randomPartIdx: number;\n let j: number;\n\n if ((uuidLength === null || typeof uuidLength === 'undefined') || uuidLength < 1) {\n throw new Error('Invalid UUID Length Provided');\n }\n\n const isPositive = uuidLength >= 0;\n\n // Generate random ID parts from Dictionary.\n id = '';\n for (\n j = 0;\n j < uuidLength;\n j += 1\n ) {\n randomPartIdx = parseInt(\n (Math.random() * this.dictLength).toFixed(0),\n 10,\n ) % this.dictLength;\n id += this.dict[randomPartIdx];\n }\n\n // Return random generated ID.\n return id;\n };\n\n fmt = (format: string, date?: Date): string => {\n return this.formattedUUID(format, date);\n };\n\n /**\n * Generates custom UUID with the provided format string.\n * @alias `const uid = new ShortUniqueId(); uid.fmt(format: string);`\n */\n formattedUUID = (format: string, date?: Date): string => {\n const fnMap = {\n '$r': this.randomUUID,\n '$s': this.sequentialUUID,\n '$t': this.stamp,\n };\n\n const result = format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n if (fn === '$s') {\n return fnMap[fn]().padStart(len, '0');\n }\n\n if (fn === '$t' && date) {\n return fnMap[fn](len, date);\n }\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n );\n\n return result;\n };\n\n /**\n * Calculates total number of possible UUIDs.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs\n * - `n` is the number of unique characters in the dictionary\n * - `l` is the UUID length\n *\n * Then `H` is defined as `n` to the power of `l`:\n *\n * \n * \n * \n *\n * This function returns `H`.\n */\n availableUUIDs = (uuidLength: number = this.uuidLength): number => {\n return parseFloat(\n Math.pow([...new Set(this.dict)].length, uuidLength).toFixed(0),\n );\n };\n\n /**\n * Calculates approximate number of hashes before first collision.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - the expected number of values we have to choose before finding the\n * first collision can be expressed as the quantity `Q(H)`\n *\n * Then `Q(H)` can be approximated as the square root of the product of half\n * of pi times `H`:\n *\n * \n * \n * \n *\n * This function returns `Q(H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n */\n approxMaxBeforeCollision = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n return parseFloat(\n Math.sqrt((Math.PI / 2) * rounds).toFixed(20),\n );\n };\n\n /**\n * Calculates probability of generating duplicate UUIDs (a collision) in a\n * given number of UUID generation rounds.\n *\n * Given that:\n *\n * - `r` is the maximum number of times that `randomUUID()` will be called,\n * or better said the number of _rounds_\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n *\n * Then the probability of collision `p(r; H)` can be approximated as the result\n * of dividing the square root of the product of half of pi times `r` by `H`:\n *\n * \n * \n * \n *\n * This function returns `p(r; H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n *\n * (Useful if you are wondering _\"If I use this lib and expect to perform at most\n * `r` rounds of UUID generations, what is the probability that I will hit a duplicate UUID?\"_.)\n */\n collisionProbability = (\n rounds: number = this.availableUUIDs(this.uuidLength),\n uuidLength: number = this.uuidLength,\n ): number => {\n return parseFloat(\n (\n this.approxMaxBeforeCollision(rounds) / this.availableUUIDs(uuidLength)\n ).toFixed(20),\n );\n };\n\n /**\n * Calculate a \"uniqueness\" score (from 0 to 1) of UUIDs based on size of\n * dictionary and chosen UUID length.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - `Q(H)` is the approximate number of hashes before first collision,\n * or in terms of this library, the result of running `approxMaxBeforeCollision()`\n *\n * Then `uniqueness` can be expressed as the additive inverse of the probability of\n * generating a \"word\" I had previously generated (a duplicate) at any given iteration\n * up to the the total number of possible UUIDs expressed as the quotiend of `Q(H)` and `H`:\n *\n * \n * \n * \n *\n * (Useful if you need a value to rate the \"quality\" of the combination of given dictionary\n * and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)\n */\n uniqueness = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n const score = parseFloat(\n (1 - (\n this.approxMaxBeforeCollision(rounds) / rounds\n )).toFixed(20),\n );\n return (\n score > 1\n ) ? (\n 1\n ) : (\n (score < 0) ? 0 : score\n );\n };\n\n /**\n * Return the version of this module.\n */\n getVersion = (): string => {\n return this.version;\n };\n\n /**\n * Generates a UUID with a timestamp that can be extracted using `uid.parseStamp(stampString);`.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n stamp = (finalLength: number, date?: Date): string => {\n const hexStamp = Math.floor(+(date || new Date()) / 1000).toString(16);\n\n if (typeof finalLength === 'number' && finalLength === 0) {\n return hexStamp;\n }\n\n if (typeof finalLength !== 'number' || finalLength < 10) {\n throw new Error(\n [\n 'Param finalLength must be a number greater than or equal to 10,',\n 'or 0 if you want the raw hexadecimal timestamp',\n ].join('\\n')\n );\n }\n\n const idLength = finalLength - 9;\n\n const rndIdx = Math.round(Math.random() * ((idLength > 15) ? 15 : idLength));\n\n const id = this.randomUUID(idLength);\n\n return `${id.substring(0, rndIdx)}${hexStamp}${id.substring(rndIdx)}${rndIdx.toString(16)}`;\n };\n\n /**\n * Extracts the date embeded in a UUID generated using the `uid.stamp(finalLength);` method.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n parseStamp = (suid: string, format?: string): Date => {\n if (format && !(/t0|t[1-9]\\d{1,}/).test(format)) {\n throw new Error('Cannot extract date from a formated UUID with no timestamp in the format');\n }\n\n const stamp = (\n format\n ) ? (\n format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fnMap = {\n '$r': (len: number) => [...Array(len)].map(() => 'r').join(''),\n '$s': (len: number) => [...Array(len)].map(() => 's').join(''),\n '$t': (len: number) => [...Array(len)].map(() => 't').join(''),\n };\n\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n ).replace(\n /^(.*?)(t{8,})(.*)$/g,\n (_m, p1, p2) => {\n return suid.substring(p1.length, p1.length + p2.length);\n },\n )\n ) : (\n suid\n );\n\n if (stamp.length === 8) {\n return new Date(parseInt(stamp, 16) * 1000);\n }\n\n if (stamp.length < 10) {\n throw new Error('Stamp length invalid');\n }\n\n const rndIdx = parseInt(stamp.substring(stamp.length - 1), 16);\n\n return new Date(parseInt(stamp.substring(rndIdx, rndIdx + 8), 16) * 1000);\n };\n\n /**\n * Set the counter to a specific value.\n */\n setCounter = (counter: number): void => {\n this.counter = counter;\n };\n\n /**\n * Validate given UID contains only characters from the instanced dictionary or optionally provided dictionary.\n */\n validate = (uid: string, dictionary?: string[] | ShortUniqueIdDefaultDictionaries): boolean => {\n const finalDictionary = dictionary ? this._normalizeDictionary(dictionary) : this.dict;\n\n return uid.split('').every((c) => finalDictionary.includes(c));\n };\n\n constructor(argOptions: Partial = {}) {\n const options: ShortUniqueIdOptions = {\n ...DEFAULT_OPTIONS,\n ...argOptions as Partial,\n };\n\n this.counter = 0;\n this.debug = false;\n this.dict = [];\n this.version = version;\n\n const {\n dictionary,\n shuffle,\n length,\n counter,\n } = options;\n\n this.uuidLength = length;\n\n this.setDictionary(dictionary, shuffle);\n this.setCounter(counter);\n\n this.debug = options.debug;\n this.log(this.dict);\n this.log(\n `Generator instantiated with Dictionary Size ${this.dictLength} and counter set to ${this.counter}`\n );\n\n this.log = this.log.bind(this);\n this.setDictionary = this.setDictionary.bind(this);\n this.setCounter = this.setCounter.bind(this);\n this.seq = this.seq.bind(this);\n this.sequentialUUID = this.sequentialUUID.bind(this);\n this.rnd = this.rnd.bind(this);\n this.randomUUID = this.randomUUID.bind(this);\n this.fmt = this.fmt.bind(this);\n this.formattedUUID = this.formattedUUID.bind(this);\n this.availableUUIDs = this.availableUUIDs.bind(this);\n this.approxMaxBeforeCollision = this.approxMaxBeforeCollision.bind(this);\n this.collisionProbability = this.collisionProbability.bind(this);\n this.uniqueness = this.uniqueness.bind(this);\n this.getVersion = this.getVersion.bind(this);\n this.stamp = this.stamp.bind(this);\n this.parseStamp = this.parseStamp.bind(this);\n\n return this;\n }\n}\n", "{\n \"name\": \"short-unique-id\",\n \"version\": \"5.2.0\",\n \"description\": \"Generate random or sequential UUID of any length\",\n \"keywords\": [\n \"short\",\n \"random\",\n \"uid\",\n \"uuid\",\n \"guid\",\n \"node\",\n \"unique id\",\n \"generator\",\n \"tiny\"\n ],\n \"bin\": {\n \"short-unique-id\": \"bin/short-unique-id\",\n \"suid\": \"bin/short-unique-id\"\n },\n \"main\": \"dist/short-unique-id.js\",\n \"types\": \"dist/short-unique-id.d.ts\",\n \"homepage\": \"https://shortunique.id\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jeanlescure/short-unique-id\"\n },\n \"license\": \"Apache-2.0\",\n \"runkitExampleFilename\": \"./runkit.js\",\n \"scripts\": {\n \"test\": \"tsx ./src/test.ts\",\n \"test:local\": \"tsx ./src/test.ts && tsx --tsconfig ./specs/esm/tsconfig.json ./specs/esm/import.spec.ts && ./scripts/cjs-test\",\n \"build\": \"./scripts/build\",\n \"docs\": \"./scripts/docs\",\n \"release\": \"release-it\"\n },\n \"release-it\": {\n \"git\": {\n \"changelog\": \"auto-changelog --stdout -l false -u -t ./assets/changelog-compact.hbs\"\n },\n \"hooks\": {\n \"after:bump\": \"./scripts/release\"\n },\n \"npm\": {\n \"publish\": false\n }\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"runkit.js\",\n \"package.json\"\n ],\n \"devDependencies\": {\n \"@types/node\": \"^20.12.7\",\n \"auto-changelog\": \"^2.4.0\",\n \"esbuild\": \"^0.18.10\",\n \"refup\": \"^1.1.0\",\n \"release-it\": \"^15.11.0\",\n \"tslib\": \"^2.6.2\",\n \"tsx\": \"^4.7.3\",\n \"typedoc\": \"^0.25.13\",\n \"typedoc-plugin-extras\": \"^3.0.0\",\n \"typedoc-plugin-rename-defaults\": \"^0.7.0\",\n \"typedoc-plugin-script-inject\": \"^2.0.0\",\n \"typescript\": \"^5.4.5\"\n },\n \"overrides\": {\n \"vm2\": \"npm:[email protected]\"\n }\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEE,gBAAW;;;ADwDN,MAAM,sBAA8B;AAEpC,MAAM,kBAAwC;AAAA,IACnD,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AA0DA,MAAqB,iBAArB,MAAqB,eAAc;AAAA,IA8djC,YAAY,aAA4C,CAAC,GAAG;AA1d5D,0BAAO;AACP,0BAAO;AACP,0BAAO;AACP,0BAAO;AACP,0BAAO,aAAoB;AAC3B,0BAAO,aAAqB,CAAC;AAC7B,0BAAO,cAAqB;AAC5B,0BAAO,cAAqB;AAC5B,0BAAO,cAAqB;AAC5B,0BAAO;AAEP,0BAAU,sBAA6B;AACvC,0BAAU,qBAA4B;AACtC,0BAAU,4BAAmC;AAC7C,0BAAU,2BAAkC;AAC5C,0BAAU,mBAA0B;AACpC,0BAAU,4BAAmC;AAC7C,0BAAU,2BAAkC;AAE5C,0BAAU,uBAA2C;AAAA,QACnD,QAAQ,CAAC,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,MAC1D;AAEA,0BAAU,sBAA0C;AAAA,QAClD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,QACvE,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,4BAAgD;AAAA,QACxD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,4BAAgD;AAAA,QACxD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,yBAA6C;AAAA,QACrD,QAAQ,CAAC,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,QACxD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,QACvE,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,+BAAmD;AAAA,QAC3D,QAAQ,CAAC,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,QACxD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,+BAAmD;AAAA,QAC3D,QAAQ,CAAC,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,QACxD,WAAW,CAAC,KAAK,0BAA0B,KAAK,uBAAuB;AAAA,MACzE;AAEA,0BAAU,oBAAwC;AAAA,QAChD,WAAW,CAAC,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,QAC3D,aAAa,CAAC,KAAK,0BAA0B,KAAK,eAAe;AAAA,MACnE;AAEA,0BAAU,gBAAuC;AAAA,QAC/C,qBAAqB,KAAK;AAAA,QAC1B,oBAAoB,KAAK;AAAA,QACzB,0BAA0B,KAAK;AAAA,QAC/B,0BAA0B,KAAK;AAAA,QAC/B,uBAAuB,KAAK;AAAA,QAC5B,6BAA6B,KAAK;AAAA,QAClC,6BAA6B,KAAK;AAAA,QAClC,kBAAkB,KAAK;AAAA,MACzB;AAGA;AAAA,0BAAU,OAAM,IAAI,SAAsB;AACxC,cAAM,YAAY,CAAC,GAAG,IAAI;AAC1B,kBAAU,CAAC,IAAI,qBAAqB,KAAK,CAAC,CAAC;AAE3C,YAAI,KAAK,UAAU,MAAM;AACvB,cAAI,OAAO,YAAY,eAAe,YAAY,MAAM;AACtD,mBAAO,QAAQ,IAAI,GAAG,SAAS;AAAA,UACjC;AAAA,QACF;AAAA,MAEF;AAGA;AAAA,0BAAU,wBAAuB,CAAC,YAAyD,YAAgC;AACzH,YAAI;AAEJ,YAAI,cAAc,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AACpE,sBAAY;AAAA,QACd,OAAO;AACL,sBAAY,CAAC;AAEb,cAAI;AAEJ,eAAK,YAAY,IAAI;AAErB,gBAAM,aAAa,IAAI,UAA8C;AACrE,gBAAM,SAAS,KAAK,aAAa,UAAU;AAE3C,iBAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,cAAc;AACzC,kBAAM,eAAe;AAErB,iBAAK,YAAY,OAAO,YAAY;AAEpC,iBAAK,aAAa,KAAK,UAAU,CAAC;AAClC,iBAAK,aAAa,KAAK,UAAU,CAAC;AAElC,iBACE,KAAK,YAAY,IAAI,KAAK,YAC1B,KAAK,cAAc,KAAK,aAAa,IAAI,KAAK,aAAa,IAAI,KAAK,YACpE,KAAK,YAAY,KAAK,cAAc,KAAK,aAAa,KAAK,IAAI,KAAK,GACpE;AACA,wBAAU,KAAK,OAAO,aAAa,KAAK,SAAS,CAAC;AAAA,YACpD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,SAAS;AAEX,gBAAM,cAAc;AACpB,sBAAY,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,WAAW;AAAA,QAC9D;AAEA,eAAO;AAAA,MACT;AAGA;AAAA,2CAAgB,CAAC,YAAyD,YAA4B;AACpG,aAAK,OAAO,KAAK,qBAAqB,YAAY,OAAO;AAGzD,aAAK,aAAa,KAAK,KAAK;AAG5B,aAAK,WAAW,CAAC;AAAA,MACnB;AAEA,iCAAM,MAAc;AAClB,eAAO,KAAK,eAAe;AAAA,MAC7B;AAMA;AAAA;AAAA;AAAA;AAAA,4CAAiB,MAAc;AAC7B,YAAI;AACJ,YAAI;AACJ,YAAI,KAAa;AAEjB,qBAAa,KAAK;AAElB,WAAG;AACD,uBAAa,aAAa,KAAK;AAC/B,uBAAa,KAAK,MAAM,aAAa,KAAK,UAAU;AACpD,gBAAM,KAAK,KAAK,UAAU;AAAA,QAC5B,SAAS,eAAe;AAExB,aAAK,WAAW;AAEhB,eAAO;AAAA,MACT;AAEA,iCAAM,CAAC,aAAqB,KAAK,cAAc,wBAAgC;AAC7E,eAAO,KAAK,WAAW,UAAU;AAAA,MACnC;AAMA;AAAA;AAAA;AAAA;AAAA,wCAAa,CAAC,aAAqB,KAAK,cAAc,wBAAgC;AACpF,YAAI;AACJ,YAAI;AACJ,YAAI;AAEJ,YAAK,eAAe,QAAQ,OAAO,eAAe,eAAgB,aAAa,GAAG;AAChF,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAEA,cAAM,aAAa,cAAc;AAGjC,aAAK;AACL,aACE,IAAI,GACJ,IAAI,YACJ,KAAK,GACL;AACA,0BAAgB;AAAA,aACb,KAAK,OAAO,IAAI,KAAK,YAAY,QAAQ,CAAC;AAAA,YAC3C;AAAA,UACF,IAAI,KAAK;AACT,gBAAM,KAAK,KAAK,aAAa;AAAA,QAC/B;AAGA,eAAO;AAAA,MACT;AAEA,iCAAM,CAAC,QAAgB,SAAwB;AAC7C,eAAO,KAAK,cAAc,QAAQ,IAAI;AAAA,MACxC;AAMA;AAAA;AAAA;AAAA;AAAA,2CAAgB,CAAC,QAAgB,SAAwB;AACvD,cAAM,QAAQ;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,QACb;AAEA,cAAM,SAAS,OAAO;AAAA,UACpB;AAAA,UACA,CAAC,MAAM;AACL,kBAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,kBAAM,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE;AAEnC,gBAAI,OAAO,MAAM;AACf,qBAAO,MAAM,EAAE,EAAE,EAAE,SAAS,KAAK,GAAG;AAAA,YACtC;AAEA,gBAAI,OAAO,QAAQ,MAAM;AACvB,qBAAO,MAAM,EAAE,EAAE,KAAK,IAAI;AAAA,YAC5B;AAEA,mBAAO,MAAM,EAAwB,EAAE,GAAG;AAAA,UAC5C;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAmBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAiB,CAAC,aAAqB,KAAK,eAAuB;AACjE,eAAO;AAAA,UACL,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ,UAAU,EAAE,QAAQ,CAAC;AAAA,QAChE;AAAA,MACF;AAuBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAA2B,CAAC,SAAiB,KAAK,eAAe,KAAK,UAAU,MAAc;AAC5F,eAAO;AAAA,UACL,KAAK,KAAM,KAAK,KAAK,IAAK,MAAM,EAAE,QAAQ,EAAE;AAAA,QAC9C;AAAA,MACF;AA2BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAAuB,CACrB,SAAiB,KAAK,eAAe,KAAK,UAAU,GACpD,aAAqB,KAAK,eACf;AACX,eAAO;AAAA,WAEH,KAAK,yBAAyB,MAAM,IAAI,KAAK,eAAe,UAAU,GACtE,QAAQ,EAAE;AAAA,QACd;AAAA,MACF;AAwBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAa,CAAC,SAAiB,KAAK,eAAe,KAAK,UAAU,MAAc;AAC9E,cAAM,QAAQ;AAAA,WACX,IACC,KAAK,yBAAyB,MAAM,IAAI,QACvC,QAAQ,EAAE;AAAA,QACf;AACA,eACE,QAAQ,IAER,IAEC,QAAQ,IAAK,IAAI;AAAA,MAEtB;AAKA;AAAA;AAAA;AAAA,wCAAa,MAAc;AACzB,eAAO,KAAK;AAAA,MACd;AAcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAQ,CAAC,aAAqB,SAAwB;AACpD,cAAM,WAAW,KAAK,MAAM,EAAE,QAAQ,oBAAI,KAAK,KAAK,GAAI,EAAE,SAAS,EAAE;AAErE,YAAI,OAAO,gBAAgB,YAAY,gBAAgB,GAAG;AACxD,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,gBAAgB,YAAY,cAAc,IAAI;AACvD,gBAAM,IAAI;AAAA,YACR;AAAA,cACE;AAAA,cACA;AAAA,YACF,EAAE,KAAK,IAAI;AAAA,UACb;AAAA,QACF;AAEA,cAAM,WAAW,cAAc;AAE/B,cAAM,SAAS,KAAK,MAAM,KAAK,OAAO,KAAM,WAAW,KAAM,KAAK,SAAS;AAE3E,cAAM,KAAK,KAAK,WAAW,QAAQ;AAEnC,eAAO,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,GAAG,QAAQ,GAAG,GAAG,UAAU,MAAM,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC;AAAA,MAC3F;AAcA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAa,CAAC,MAAc,WAA0B;AACpD,YAAI,UAAU,CAAE,kBAAmB,KAAK,MAAM,GAAG;AAC/C,gBAAM,IAAI,MAAM,0EAA0E;AAAA,QAC5F;AAEA,cAAM,QACJ,SAEA,OAAO;AAAA,UACL;AAAA,UACA,CAAC,MAAM;AACL,kBAAM,QAAQ;AAAA,cACZ,MAAM,CAACA,SAAgB,CAAC,GAAG,MAAMA,IAAG,CAAC,EAAE,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AAAA,cAC7D,MAAM,CAACA,SAAgB,CAAC,GAAG,MAAMA,IAAG,CAAC,EAAE,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AAAA,cAC7D,MAAM,CAACA,SAAgB,CAAC,GAAG,MAAMA,IAAG,CAAC,EAAE,IAAI,MAAM,GAAG,EAAE,KAAK,EAAE;AAAA,YAC/D;AAEA,kBAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AACvB,kBAAM,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE;AAEnC,mBAAO,MAAM,EAAwB,EAAE,GAAG;AAAA,UAC5C;AAAA,QACF,EAAE;AAAA,UACA;AAAA,UACA,CAAC,IAAI,IAAI,OAAO;AACd,mBAAO,KAAK,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM;AAAA,UACxD;AAAA,QACF,IAEA;AAGF,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO,IAAI,KAAK,SAAS,OAAO,EAAE,IAAI,GAAI;AAAA,QAC5C;AAEA,YAAI,MAAM,SAAS,IAAI;AACrB,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AAEA,cAAM,SAAS,SAAS,MAAM,UAAU,MAAM,SAAS,CAAC,GAAG,EAAE;AAE7D,eAAO,IAAI,KAAK,SAAS,MAAM,UAAU,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI,GAAI;AAAA,MAC1E;AAKA;AAAA;AAAA;AAAA,wCAAa,CAAC,YAA0B;AACtC,aAAK,UAAU;AAAA,MACjB;AAKA;AAAA;AAAA;AAAA,sCAAW,CAAC,KAAa,eAAsE;AAC7F,cAAM,kBAAkB,aAAa,KAAK,qBAAqB,UAAU,IAAI,KAAK;AAElF,eAAO,IAAI,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,gBAAgB,SAAS,CAAC,CAAC;AAAA,MAC/D;AAGE,YAAM,UAAgC,kCACjC,kBACA;AAGL,WAAK,UAAU;AACf,WAAK,QAAQ;AACb,WAAK,OAAO,CAAC;AACb,WAAK,UAAU;AAEf,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,WAAK,aAAa;AAElB,WAAK,cAAc,YAAY,OAAO;AACtC,WAAK,WAAW,OAAO;AAEvB,WAAK,QAAQ,QAAQ;AACrB,WAAK,IAAI,KAAK,IAAI;AAClB,WAAK;AAAA,QACH,+CAA+C,KAAK,UAAU,uBAAuB,KAAK,OAAO;AAAA,MACnG;AAEA,WAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,WAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AACjD,WAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,WAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,WAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,WAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,WAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,WAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,WAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AACjD,WAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,WAAK,2BAA2B,KAAK,yBAAyB,KAAK,IAAI;AACvE,WAAK,uBAAuB,KAAK,qBAAqB,KAAK,IAAI;AAC/D,WAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,WAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,WAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,WAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAE3C,aAAO;AAAA,IACT;AAAA,EACF;AA5gBE;AAAA,gBAFmB,gBAEZ,WAAgC;AAFzC,MAAqB,gBAArB;",
"names": ["len"]
}