{"version":3,"file":"search-Dho5XDps.js","sources":["../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/tokenizer/languages.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/utils.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/errors.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/defaults.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/internal-document-id-store.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/documents-store.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/plugins.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/hooks.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/trees/avl.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/trees/flat.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/levenshtein.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/trees/radix.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/trees/bkd.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/algorithms.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/cosine-similarity.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/index.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/sorter.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/tokenizer/diacritics.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/tokenizer/english-stemmer.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/tokenizer/index.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/create.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/types.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/sync-blocking-checker.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/insert.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/constants.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/filters.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/facets.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/components/groups.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/search-fulltext.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/search-vector.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/search-hybrid.js","../../node_modules/.pnpm/@orama+orama@2.0.17/node_modules/@orama/orama/dist/methods/search.js","../../src/pages/search.ts"],"sourcesContent":["export const STEMMERS = {\n arabic: 'ar',\n armenian: 'am',\n bulgarian: 'bg',\n danish: 'dk',\n dutch: 'nl',\n english: 'en',\n finnish: 'fi',\n french: 'fr',\n german: 'de',\n greek: 'gr',\n hungarian: 'hu',\n indian: 'in',\n indonesian: 'id',\n irish: 'ie',\n italian: 'it',\n lithuanian: 'lt',\n nepali: 'np',\n norwegian: 'no',\n portuguese: 'pt',\n romanian: 'ro',\n russian: 'ru',\n serbian: 'rs',\n slovenian: 'ru',\n spanish: 'es',\n swedish: 'se',\n tamil: 'ta',\n turkish: 'tr',\n ukrainian: 'uk',\n sanskrit: 'sk'\n};\nexport const SPLITTERS = {\n dutch: /[^A-Za-zàèéìòóù0-9_'-]+/gim,\n english: /[^A-Za-zàèéìòóù0-9_'-]+/gim,\n french: /[^a-z0-9äâàéèëêïîöôùüûœç-]+/gim,\n italian: /[^A-Za-zàèéìòóù0-9_'-]+/gim,\n norwegian: /[^a-z0-9_æøåÆØÅäÄöÖüÜ]+/gim,\n portuguese: /[^a-z0-9à-úÀ-Ú]/gim,\n russian: /[^a-z0-9а-яА-ЯёЁ]+/gim,\n spanish: /[^a-z0-9A-Zá-úÁ-ÚñÑüÜ]+/gim,\n swedish: /[^a-z0-9_åÅäÄöÖüÜ-]+/gim,\n german: /[^a-z0-9A-ZäöüÄÖÜß]+/gim,\n finnish: /[^a-z0-9äöÄÖ]+/gim,\n danish: /[^a-z0-9æøåÆØÅ]+/gim,\n hungarian: /[^a-z0-9áéíóöőúüűÁÉÍÓÖŐÚÜŰ]+/gim,\n romanian: /[^a-z0-9ăâîșțĂÂÎȘȚ]+/gim,\n serbian: /[^a-z0-9čćžšđČĆŽŠĐ]+/gim,\n turkish: /[^a-z0-9çÇğĞıİöÖşŞüÜ]+/gim,\n lithuanian: /[^a-z0-9ąčęėįšųūžĄČĘĖĮŠŲŪŽ]+/gim,\n arabic: /[^a-z0-9أ-ي]+/gim,\n nepali: /[^a-z0-9अ-ह]+/gim,\n irish: /[^a-z0-9áéíóúÁÉÍÓÚ]+/gim,\n indian: /[^a-z0-9अ-ह]+/gim,\n armenian: /[^a-z0-9ա-ֆ]+/gim,\n greek: /[^a-z0-9α-ωά-ώ]+/gim,\n indonesian: /[^a-z0-9]+/gim,\n ukrainian: /[^a-z0-9а-яА-ЯіїєІЇЄ]+/gim,\n slovenian: /[^a-z0-9螚ȎŠ]+/gim,\n bulgarian: /[^a-z0-9а-яА-Я]+/gim,\n tamil: /[^a-z0-9அ-ஹ]+/gim,\n sanskrit: /[^a-z0-9A-Zāīūṛḷṃṁḥśṣṭḍṇṅñḻḹṝ]+/gim\n};\nexport const SUPPORTED_LANGUAGES = Object.keys(STEMMERS);\nexport function getLocale(language) {\n return language !== undefined && SUPPORTED_LANGUAGES.includes(language) ? STEMMERS[language] : undefined;\n}\n\n//# sourceMappingURL=languages.js.map","import { createError } from './errors.js';\nconst baseId = Date.now().toString().slice(5);\nlet lastId = 0;\nconst k = 1024;\nconst nano = BigInt(1e3);\nconst milli = BigInt(1e6);\nconst second = BigInt(1e9);\nexport const isServer = typeof window === 'undefined';\n/**\n * This value can be increased up to 100_000\n * But i don't know if this value change from nodejs to nodejs\n * So I will keep a safer value here.\n */ export const MAX_ARGUMENT_FOR_STACK = 65535;\n/**\n * This method is needed to used because of issues like: https://github.com/oramasearch/orama/issues/301\n * that issue is caused because the array that is pushed is huge (>100k)\n *\n * @example\n * ```ts\n * safeArrayPush(myArray, [1, 2])\n * ```\n */ export function safeArrayPush(arr, newArr) {\n if (newArr.length < MAX_ARGUMENT_FOR_STACK) {\n Array.prototype.push.apply(arr, newArr);\n } else {\n const newArrLength = newArr.length;\n for(let i = 0; i < newArrLength; i += MAX_ARGUMENT_FOR_STACK){\n Array.prototype.push.apply(arr, newArr.slice(i, i + MAX_ARGUMENT_FOR_STACK));\n }\n }\n}\nexport function sprintf(template, ...args) {\n return template.replace(/%(?:(?\\d+)\\$)?(?-?\\d*\\.?\\d*)(?[dfs])/g, function(...replaceArgs) {\n const groups = replaceArgs[replaceArgs.length - 1];\n const { width: rawWidth , type , position } = groups;\n const replacement = position ? args[Number.parseInt(position) - 1] : args.shift();\n const width = rawWidth === '' ? 0 : Number.parseInt(rawWidth);\n switch(type){\n case 'd':\n return replacement.toString().padStart(width, '0');\n case 'f':\n {\n let value = replacement;\n const [padding, precision] = rawWidth.split('.').map((w)=>Number.parseFloat(w));\n if (typeof precision === 'number' && precision >= 0) {\n value = value.toFixed(precision);\n }\n return typeof padding === 'number' && padding >= 0 ? value.toString().padStart(width, '0') : value.toString();\n }\n case 's':\n return width < 0 ? replacement.toString().padEnd(-width, ' ') : replacement.toString().padStart(width, ' ');\n default:\n return replacement;\n }\n });\n}\nexport async function formatBytes(bytes, decimals = 2) {\n if (bytes === 0) {\n return '0 Bytes';\n }\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\n 'Bytes',\n 'KB',\n 'MB',\n 'GB',\n 'TB',\n 'PB',\n 'EB',\n 'ZB',\n 'YB'\n ];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\nexport function isInsideWebWorker() {\n // @ts-expect-error - WebWorker global scope\n return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n}\nexport function isInsideNode() {\n return typeof process !== 'undefined' && process.release && process.release.name === 'node';\n}\nexport function getNanosecondTimeViaPerformance() {\n return BigInt(Math.floor(performance.now() * 1e6));\n}\nexport async function formatNanoseconds(value) {\n if (typeof value === 'number') {\n value = BigInt(value);\n }\n if (value < nano) {\n return `${value}ns`;\n } else if (value < milli) {\n return `${value / nano}μs`;\n } else if (value < second) {\n return `${value / milli}ms`;\n }\n return `${value / second}s`;\n}\n// TODO: none of these operations is async. Should we change the signature of this function?\nexport async function getNanosecondsTime() {\n var _process_hrtime;\n if (isInsideWebWorker()) {\n return getNanosecondTimeViaPerformance();\n }\n if (isInsideNode()) {\n return process.hrtime.bigint();\n }\n if (typeof process !== 'undefined' && typeof (process === null || process === void 0 ? void 0 : (_process_hrtime = process.hrtime) === null || _process_hrtime === void 0 ? void 0 : _process_hrtime.bigint) === 'function') {\n return process.hrtime.bigint();\n }\n if (typeof performance !== 'undefined') {\n return getNanosecondTimeViaPerformance();\n }\n // @todo: fallback to V8 native method to get microtime\n return BigInt(0);\n}\nexport async function uniqueId() {\n return `${baseId}-${lastId++}`;\n}\nexport function getOwnProperty(object, property) {\n // Checks if `hasOwn` method is defined avoiding errors with older Node.js versions\n if (Object.hasOwn === undefined) {\n return Object.prototype.hasOwnProperty.call(object, property) ? object[property] : undefined;\n }\n return Object.hasOwn(object, property) ? object[property] : undefined;\n}\nexport function getTokenFrequency(token, tokens) {\n let count = 0;\n for (const t of tokens){\n if (t === token) {\n count++;\n }\n }\n return count;\n}\nexport function insertSortedValue(arr, el, compareFn = sortTokenScorePredicate) {\n let low = 0;\n let high = arr.length;\n let mid;\n while(low < high){\n mid = low + high >>> 1;\n if (compareFn(el, arr[mid]) < 0) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n arr.splice(low, 0, el);\n return arr;\n}\nexport function sortTokenScorePredicate(a, b) {\n if (b[1] === a[1]) {\n return a[0] - b[0];\n }\n return b[1] - a[1];\n}\n// Intersection function taken from https://github.com/lovasoa/fast_array_intersect.\n// MIT Licensed at the time of writing.\nexport function intersect(arrays) {\n if (arrays.length === 0) {\n return [];\n } else if (arrays.length === 1) {\n return arrays[0];\n }\n for(let i = 1; i < arrays.length; i++){\n if (arrays[i].length < arrays[0].length) {\n const tmp = arrays[0];\n arrays[0] = arrays[i];\n arrays[i] = tmp;\n }\n }\n const set = new Map();\n for (const elem of arrays[0]){\n set.set(elem, 1);\n }\n for(let i = 1; i < arrays.length; i++){\n let found = 0;\n for (const elem of arrays[i]){\n const count = set.get(elem);\n if (count === i) {\n set.set(elem, count + 1);\n found++;\n }\n }\n if (found === 0) return [];\n }\n return arrays[0].filter((e)=>{\n const count = set.get(e);\n if (count !== undefined) set.set(e, 0);\n return count === arrays.length;\n });\n}\nexport async function getDocumentProperties(doc, paths) {\n const properties = {};\n const pathsLength = paths.length;\n for(let i = 0; i < pathsLength; i++){\n const path = paths[i];\n const pathTokens = path.split('.');\n let current = doc;\n const pathTokensLength = pathTokens.length;\n for(let j = 0; j < pathTokensLength; j++){\n current = current[pathTokens[j]];\n // We found an object but we were supposed to be done\n if (typeof current === 'object') {\n if (current !== null && 'lat' in current && 'lon' in current && typeof current.lat === 'number' && typeof current.lon === 'number') {\n current = properties[path] = current;\n break;\n } else if (!Array.isArray(current) && current !== null && j === pathTokensLength - 1) {\n current = undefined;\n break;\n }\n } else if ((current === null || typeof current !== 'object') && j < pathTokensLength - 1) {\n // We can't recurse anymore but we were supposed to\n current = undefined;\n break;\n }\n }\n if (typeof current !== 'undefined') {\n properties[path] = current;\n }\n }\n return properties;\n}\nexport async function getNested(obj, path) {\n const props = await getDocumentProperties(obj, [\n path\n ]);\n return props[path];\n}\nexport function flattenObject(obj, prefix = '') {\n const result = {};\n for(const key in obj){\n const prop = `${prefix}${key}`;\n const objKey = obj[key];\n if (typeof objKey === 'object' && objKey !== null) {\n Object.assign(result, flattenObject(objKey, `${prop}.`));\n } else {\n result[prop] = objKey;\n }\n }\n return result;\n}\nconst mapDistanceToMeters = {\n cm: 0.01,\n m: 1,\n km: 1000,\n ft: 0.3048,\n yd: 0.9144,\n mi: 1609.344\n};\nexport function convertDistanceToMeters(distance, unit) {\n const ratio = mapDistanceToMeters[unit];\n if (ratio === undefined) {\n throw new Error(createError('INVALID_DISTANCE_SUFFIX', distance).message);\n }\n return distance * ratio;\n}\nexport function removeVectorsFromHits(searchResult, vectorProperties) {\n searchResult.hits = searchResult.hits.map((result)=>({\n ...result,\n document: {\n ...result.document,\n // Remove embeddings from the result\n ...vectorProperties.reduce((acc, prop)=>{\n const path = prop.split('.');\n const lastKey = path.pop();\n let obj = acc;\n for (const key of path){\n obj[key] = obj[key] ?? {};\n obj = obj[key];\n }\n obj[lastKey] = null;\n return acc;\n }, result.document)\n }\n }));\n}\n\n//# sourceMappingURL=utils.js.map","import { SUPPORTED_LANGUAGES } from './components/tokenizer/languages.js';\nimport { sprintf } from './utils.js';\nconst allLanguages = SUPPORTED_LANGUAGES.join('\\n - ');\nconst errors = {\n NO_LANGUAGE_WITH_CUSTOM_TOKENIZER: 'Do not pass the language option to create when using a custom tokenizer.',\n LANGUAGE_NOT_SUPPORTED: `Language \"%s\" is not supported.\\nSupported languages are:\\n - ${allLanguages}`,\n INVALID_STEMMER_FUNCTION_TYPE: `config.stemmer property must be a function.`,\n MISSING_STEMMER: `As of version 1.0.0 @orama/orama does not ship non English stemmers by default. To solve this, please explicitly import and specify the \"%s\" stemmer from the package @orama/stemmers. See https://docs.oramasearch.com/open-source/text-analysis/stemming for more information.`,\n CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY: 'Custom stop words array must only contain strings.',\n UNSUPPORTED_COMPONENT: `Unsupported component \"%s\".`,\n COMPONENT_MUST_BE_FUNCTION: `The component \"%s\" must be a function.`,\n COMPONENT_MUST_BE_FUNCTION_OR_ARRAY_FUNCTIONS: `The component \"%s\" must be a function or an array of functions.`,\n INVALID_SCHEMA_TYPE: `Unsupported schema type \"%s\" at \"%s\". Expected \"string\", \"boolean\" or \"number\" or array of them.`,\n DOCUMENT_ID_MUST_BE_STRING: `Document id must be of type \"string\". Got \"%s\" instead.`,\n DOCUMENT_ALREADY_EXISTS: `A document with id \"%s\" already exists.`,\n DOCUMENT_DOES_NOT_EXIST: `A document with id \"%s\" does not exists.`,\n MISSING_DOCUMENT_PROPERTY: `Missing searchable property \"%s\".`,\n INVALID_DOCUMENT_PROPERTY: `Invalid document property \"%s\": expected \"%s\", got \"%s\"`,\n UNKNOWN_INDEX: `Invalid property name \"%s\". Expected a wildcard string (\"*\") or array containing one of the following properties: %s`,\n INVALID_BOOST_VALUE: `Boost value must be a number greater than, or less than 0.`,\n INVALID_FILTER_OPERATION: `You can only use one operation per filter, you requested %d.`,\n SCHEMA_VALIDATION_FAILURE: `Cannot insert document due schema validation failure on \"%s\" property.`,\n INVALID_SORT_SCHEMA_TYPE: `Unsupported sort schema type \"%s\" at \"%s\". Expected \"string\" or \"number\".`,\n CANNOT_SORT_BY_ARRAY: `Cannot configure sort for \"%s\" because it is an array (%s).`,\n UNABLE_TO_SORT_ON_UNKNOWN_FIELD: `Unable to sort on unknown field \"%s\". Allowed fields: %s`,\n SORT_DISABLED: `Sort is disabled. Please read the documentation at https://docs.oramasearch for more information.`,\n UNKNOWN_GROUP_BY_PROPERTY: `Unknown groupBy property \"%s\".`,\n INVALID_GROUP_BY_PROPERTY: `Invalid groupBy property \"%s\". Allowed types: \"%s\", but given \"%s\".`,\n UNKNOWN_FILTER_PROPERTY: `Unknown filter property \"%s\".`,\n INVALID_VECTOR_SIZE: `Vector size must be a number greater than 0. Got \"%s\" instead.`,\n INVALID_VECTOR_VALUE: `Vector value must be a number greater than 0. Got \"%s\" instead.`,\n INVALID_INPUT_VECTOR: `Property \"%s\" was declared as a %s-dimensional vector, but got a %s-dimensional vector instead.\\nInput vectors must be of the size declared in the schema, as calculating similarity between vectors of different sizes can lead to unexpected results.`,\n WRONG_SEARCH_PROPERTY_TYPE: `Property \"%s\" is not searchable. Only \"string\" properties are searchable.`,\n FACET_NOT_SUPPORTED: `Facet doens't support the type \"%s\".`,\n INVALID_DISTANCE_SUFFIX: `Invalid distance suffix \"%s\". Valid suffixes are: cm, m, km, mi, yd, ft.`,\n INVALID_SEARCH_MODE: `Invalid search mode \"%s\". Valid modes are: \"fulltext\", \"vector\", \"hybrid\".`,\n MISSING_VECTOR_AND_SECURE_PROXY: `No vector was provided and no secure proxy was configured. Please provide a vector or configure an Orama Secure Proxy to perform hybrid search.`,\n MISSING_TERM: `\"term\" is a required parameter when performing hybrid search. Please provide a search term.`,\n INVALID_VECTOR_INPUT: `Invalid \"vector\" property. Expected an object with \"value\" and \"property\" properties, but got \"%s\" instead.`,\n PLUGIN_CRASHED: `A plugin crashed during initialization. Please check the error message for more information:`\n};\nexport function createError(code, ...args) {\n const error = new Error(sprintf(errors[code] ?? `Unsupported Orama Error code: ${code}`, ...args));\n error.code = code;\n if ('captureStackTrace' in Error.prototype) {\n Error.captureStackTrace(error);\n }\n return error;\n}\n\n//# sourceMappingURL=errors.js.map","import { createError } from '../errors.js';\nimport { formatNanoseconds, uniqueId } from '../utils.js';\nexport { getDocumentProperties } from '../utils.js';\nexport async function formatElapsedTime(n) {\n return {\n raw: Number(n),\n formatted: await formatNanoseconds(n)\n };\n}\nexport async function getDocumentIndexId(doc) {\n if (doc.id) {\n if (typeof doc.id !== 'string') {\n throw createError('DOCUMENT_ID_MUST_BE_STRING', typeof doc.id);\n }\n return doc.id;\n }\n return await uniqueId();\n}\nexport async function validateSchema(doc, schema) {\n for (const [prop, type] of Object.entries(schema)){\n const value = doc[prop];\n if (typeof value === 'undefined') {\n continue;\n }\n if (type === 'geopoint' && typeof value === 'object' && typeof value.lon === 'number' && typeof value.lat === 'number') {\n continue;\n }\n if (type === 'enum' && (typeof value === 'string' || typeof value === 'number')) {\n continue;\n }\n if (type === 'enum[]' && Array.isArray(value)) {\n const valueLength = value.length;\n for(let i = 0; i < valueLength; i++){\n if (typeof value[i] !== 'string' && typeof value[i] !== 'number') {\n return prop + '.' + i;\n }\n }\n continue;\n }\n if (isVectorType(type)) {\n const vectorSize = getVectorSize(type);\n if (!Array.isArray(value) || value.length !== vectorSize) {\n throw createError('INVALID_INPUT_VECTOR', prop, vectorSize, value.length);\n }\n continue;\n }\n if (isArrayType(type)) {\n if (!Array.isArray(value)) {\n return prop;\n }\n const expectedType = getInnerType(type);\n const valueLength = value.length;\n for(let i = 0; i < valueLength; i++){\n if (typeof value[i] !== expectedType) {\n return prop + '.' + i;\n }\n }\n continue;\n }\n if (typeof type === 'object') {\n if (!value || typeof value !== 'object') {\n return prop;\n }\n // using as ResultDocument is not exactly right but trying to be type-safe here is not useful\n const subProp = await validateSchema(value, type);\n if (subProp) {\n return prop + '.' + subProp;\n }\n continue;\n }\n if (typeof value !== type) {\n return prop;\n }\n }\n return undefined;\n}\nconst IS_ARRAY_TYPE = {\n string: false,\n number: false,\n boolean: false,\n enum: false,\n geopoint: false,\n 'string[]': true,\n 'number[]': true,\n 'boolean[]': true,\n 'enum[]': true\n};\nconst INNER_TYPE = {\n 'string[]': 'string',\n 'number[]': 'number',\n 'boolean[]': 'boolean',\n 'enum[]': 'enum'\n};\nexport function isGeoPointType(type) {\n return type === 'geopoint';\n}\nexport function isVectorType(type) {\n return typeof type === 'string' && /^vector\\[\\d+\\]$/.test(type);\n}\nexport function isArrayType(type) {\n return typeof type === 'string' && IS_ARRAY_TYPE[type];\n}\nexport function getInnerType(type) {\n return INNER_TYPE[type];\n}\nexport function getVectorSize(type) {\n const size = Number(type.slice(7, -1));\n switch(true){\n case isNaN(size):\n throw createError('INVALID_VECTOR_VALUE', type);\n case size <= 0:\n throw createError('INVALID_VECTOR_SIZE', type);\n default:\n return size;\n }\n}\n\n//# sourceMappingURL=defaults.js.map","export function createInternalDocumentIDStore() {\n return {\n idToInternalId: new Map(),\n internalIdToId: [],\n save,\n load\n };\n}\nexport function save(store) {\n return {\n internalIdToId: store.internalIdToId\n };\n}\nexport function load(orama, raw) {\n const { internalIdToId } = raw;\n orama.internalDocumentIDStore.idToInternalId.clear();\n orama.internalDocumentIDStore.internalIdToId = [];\n const internalIdToIdLength = internalIdToId.length;\n for(let i = 0; i < internalIdToIdLength; i++){\n const internalIdItem = internalIdToId[i];\n orama.internalDocumentIDStore.idToInternalId.set(internalIdItem, i + 1);\n orama.internalDocumentIDStore.internalIdToId.push(internalIdItem);\n }\n}\nexport function getInternalDocumentId(store, id) {\n if (typeof id === 'string') {\n const internalId = store.idToInternalId.get(id);\n if (internalId) {\n return internalId;\n }\n const currentId = store.idToInternalId.size + 1;\n store.idToInternalId.set(id, currentId);\n store.internalIdToId.push(id);\n return currentId;\n }\n if (id > store.internalIdToId.length) {\n return getInternalDocumentId(store, id.toString());\n }\n return id;\n}\nexport function getDocumentIdFromInternalId(store, internalId) {\n if (store.internalIdToId.length < internalId) {\n throw new Error(`Invalid internalId ${internalId}`);\n }\n return store.internalIdToId[internalId - 1];\n}\n\n//# sourceMappingURL=internal-document-id-store.js.map","import { getInternalDocumentId } from './internal-document-id-store.js';\nexport async function create(_, sharedInternalDocumentStore) {\n return {\n sharedInternalDocumentStore,\n docs: {},\n count: 0\n };\n}\nexport async function get(store, id) {\n const internalId = getInternalDocumentId(store.sharedInternalDocumentStore, id);\n return store.docs[internalId];\n}\nexport async function getMultiple(store, ids) {\n const idsLength = ids.length;\n const found = Array.from({\n length: idsLength\n });\n for(let i = 0; i < idsLength; i++){\n const internalId = getInternalDocumentId(store.sharedInternalDocumentStore, ids[i]);\n found[i] = store.docs[internalId];\n }\n return found;\n}\nexport async function getAll(store) {\n return store.docs;\n}\nexport async function store(store, id, doc) {\n const internalId = getInternalDocumentId(store.sharedInternalDocumentStore, id);\n if (typeof store.docs[internalId] !== 'undefined') {\n return false;\n }\n store.docs[internalId] = doc;\n store.count++;\n return true;\n}\nexport async function remove(store, id) {\n const internalId = getInternalDocumentId(store.sharedInternalDocumentStore, id);\n if (typeof store.docs[internalId] === 'undefined') {\n return false;\n }\n delete store.docs[internalId];\n store.count--;\n return true;\n}\nexport async function count(store) {\n return store.count;\n}\nexport async function load(sharedInternalDocumentStore, raw) {\n const rawDocument = raw;\n return {\n docs: rawDocument.docs,\n count: rawDocument.count,\n sharedInternalDocumentStore\n };\n}\nexport async function save(store) {\n return {\n docs: store.docs,\n count: store.count\n };\n}\nexport async function createDocumentsStore() {\n return {\n create,\n get,\n getMultiple,\n getAll,\n store,\n remove,\n count,\n load,\n save\n };\n}\n\n//# sourceMappingURL=documents-store.js.map","import { createError } from '../errors.js';\nexport const AVAILABLE_PLUGIN_HOOKS = [\n 'beforeInsert',\n 'afterInsert',\n 'beforeRemove',\n 'afterRemove',\n 'beforeUpdate',\n 'afterUpdate',\n 'beforeSearch',\n 'afterSearch',\n 'beforeInsertMultiple',\n 'afterInsertMultiple',\n 'beforeRemoveMultiple',\n 'afterRemoveMultiple',\n 'beforeUpdateMultiple',\n 'afterUpdateMultiple',\n 'beforeLoad',\n 'afterLoad',\n 'afterCreate'\n];\nexport async function getAllPluginsByHook(orama, hook) {\n var _orama_plugins;\n const pluginsToRun = [];\n const pluginsLength = (_orama_plugins = orama.plugins) === null || _orama_plugins === void 0 ? void 0 : _orama_plugins.length;\n if (!pluginsLength) {\n return pluginsToRun;\n }\n for(let i = 0; i < pluginsLength; i++){\n try {\n const plugin = await orama.plugins[i];\n if (typeof plugin[hook] === 'function') {\n pluginsToRun.push(plugin[hook]);\n }\n } catch (error) {\n console.error('Caught error in getAllPluginsByHook:', error);\n throw createError('PLUGIN_CRASHED');\n }\n }\n return pluginsToRun;\n}\n\n//# sourceMappingURL=plugins.js.map","export const OBJECT_COMPONENTS = [\n 'tokenizer',\n 'index',\n 'documentsStore',\n 'sorter'\n];\nexport const FUNCTION_COMPONENTS = [\n 'validateSchema',\n 'getDocumentIndexId',\n 'getDocumentProperties',\n 'formatElapsedTime'\n];\nexport const SINGLE_OR_ARRAY_COMPONENTS = [];\nexport async function runSingleHook(hooks, orama, id, doc) {\n const hooksLength = hooks.length;\n for(let i = 0; i < hooksLength; i++){\n await hooks[i](orama, id, doc);\n }\n}\nexport async function runMultipleHook(hooks, orama, docsOrIds) {\n const hooksLength = hooks.length;\n for(let i = 0; i < hooksLength; i++){\n await hooks[i](orama, docsOrIds);\n }\n}\nexport async function runAfterSearch(hooks, db, params, language, results) {\n const hooksLength = hooks.length;\n for(let i = 0; i < hooksLength; i++){\n await hooks[i](db, params, language, results);\n }\n}\nexport async function runBeforeSearch(hooks, db, params, language) {\n const hooksLength = hooks.length;\n for(let i = 0; i < hooksLength; i++){\n await hooks[i](db, params, language);\n }\n}\nexport async function runAfterCreate(hooks, db) {\n const hooksLength = hooks.length;\n for(let i = 0; i < hooksLength; i++){\n await hooks[i](db);\n }\n}\n\n//# sourceMappingURL=hooks.js.map","import { safeArrayPush } from '../utils.js';\nfunction rotateLeft(node) {\n const right = node.r;\n node.r = right.l;\n right.l = node;\n node.h = Math.max(getHeight(node.l), getHeight(node.r)) + 1;\n right.h = Math.max(getHeight(right.l), getHeight(right.r)) + 1;\n return right;\n}\nfunction rotateRight(node) {\n const left = node.l;\n node.l = left.r;\n left.r = node;\n node.h = Math.max(getHeight(node.l), getHeight(node.r)) + 1;\n left.h = Math.max(getHeight(left.l), getHeight(left.r)) + 1;\n return left;\n}\nexport function contains(node, key) {\n return !!find(node, key);\n}\nexport function getSize(root) {\n let size = 0;\n const queue = [];\n if (root !== null) {\n queue.push(root.root);\n }\n while(queue.length > 0){\n const node = queue.shift();\n size++;\n if (node.l !== null) {\n queue.push(node.l);\n }\n if (node.r !== null) {\n queue.push(node.r);\n }\n }\n return size;\n}\nexport function isBalanced(root) {\n if (root === null) return true;\n const stack = [\n root.root\n ];\n while(stack.length > 0){\n const node = stack.pop();\n if (node != null) {\n const leftHeight = getHeight(node.l);\n const rightHeight = getHeight(node.r);\n const heightDiff = leftHeight - rightHeight;\n if (Math.abs(heightDiff) > 1) {\n return false;\n }\n if (node.l !== null) {\n stack.push(node.l);\n }\n if (node.r !== null) {\n stack.push(node.r);\n }\n }\n }\n return true;\n}\nexport function rangeSearch(node, min, max) {\n const result = [];\n function traverse(node) {\n if (node === null) {\n return;\n }\n if (min < node.k) {\n traverse(node.l);\n }\n if (node.k >= min && node.k <= max) {\n safeArrayPush(result, node.v);\n }\n if (max > node.k) {\n traverse(node.r);\n }\n }\n traverse(node.root);\n return result;\n}\nexport function greaterThan(node, key, inclusive = false) {\n const result = [];\n if (node === null) return result;\n const stack = [\n node.root\n ];\n while(stack.length > 0){\n const node = stack.pop();\n if (!node) {\n continue;\n }\n if (inclusive && node.k >= key) {\n safeArrayPush(result, node.v);\n }\n if (!inclusive && node.k > key) {\n safeArrayPush(result, node.v);\n }\n stack.push(node.r);\n stack.push(node.l);\n }\n return result;\n}\nexport function lessThan(node, key, inclusive = false) {\n const result = [];\n if (node === null) return result;\n const stack = [\n node.root\n ];\n while(stack.length > 0){\n const node = stack.pop();\n if (!node) {\n continue;\n }\n if (inclusive && node.k <= key) {\n safeArrayPush(result, node.v);\n }\n if (!inclusive && node.k < key) {\n safeArrayPush(result, node.v);\n }\n stack.push(node.r);\n stack.push(node.l);\n }\n return result;\n}\nfunction getNodeByKey(node, key) {\n while(node !== null){\n if (key < node.k) {\n node = node.l;\n } else if (key > node.k) {\n node = node.r;\n } else {\n return node;\n }\n }\n return null;\n}\nexport function create(key, value) {\n return {\n root: {\n k: key,\n v: value,\n l: null,\n r: null,\n h: 0\n }\n };\n}\nexport function insert(rootNode, key, newValue) {\n function insertNode(node, key, newValue) {\n if (node === null) {\n return {\n k: key,\n v: newValue,\n l: null,\n r: null,\n h: 0\n };\n }\n if (key < node.k) {\n node.l = insertNode(node.l, key, newValue);\n } else if (key > node.k) {\n node.r = insertNode(node.r, key, newValue);\n } else {\n for (const value of newValue){\n node.v.push(value);\n }\n return node;\n }\n node.h = 1 + Math.max(getHeight(node.l), getHeight(node.r));\n const balanceFactor = getHeight(node.l) - getHeight(node.r);\n if (balanceFactor > 1 && key < node.l.k) {\n return rotateRight(node);\n }\n if (balanceFactor < -1 && key > node.r.k) {\n return rotateLeft(node);\n }\n if (balanceFactor > 1 && key > node.l.k) {\n node.l = rotateLeft(node.l);\n return rotateRight(node);\n }\n if (balanceFactor < -1 && key < node.r.k) {\n node.r = rotateRight(node.r);\n return rotateLeft(node);\n }\n return node;\n }\n rootNode.root = insertNode(rootNode.root, key, newValue);\n}\nfunction getHeight(node) {\n return node !== null ? node.h : -1;\n}\nexport function find(root, key) {\n const node = getNodeByKey(root.root, key);\n if (node === null) {\n return null;\n }\n return node.v;\n}\nexport function remove(rootNode, key) {\n if (rootNode === null || rootNode.root === null) {\n return;\n }\n let node = rootNode.root;\n let parentNode = null;\n while(node != null && node.k !== key){\n parentNode = node;\n if (key < node.k) {\n node = node.l;\n } else {\n node = node.r;\n }\n }\n if (node === null) {\n return;\n }\n const deleteNode = ()=>{\n if (node.l === null && node.r === null) {\n if (parentNode === null) {\n rootNode.root = null;\n } else {\n if (parentNode.l === node) {\n parentNode.l = null;\n } else {\n parentNode.r = null;\n }\n }\n } else if (node.l != null && node.r != null) {\n let minValueNode = node.r;\n let minValueParent = node;\n while(minValueNode.l != null){\n minValueParent = minValueNode;\n minValueNode = minValueNode.l;\n }\n node.k = minValueNode.k;\n if (minValueParent === node) {\n minValueParent.r = minValueNode.r;\n } else {\n minValueParent.l = minValueNode.r;\n }\n } else {\n const childNode = node.l != null ? node.l : node.r;\n if (parentNode === null) {\n rootNode.root = childNode;\n } else {\n if (parentNode.l === node) {\n parentNode.l = childNode;\n } else {\n parentNode.r = childNode;\n }\n }\n }\n };\n deleteNode();\n}\nexport function removeDocument(root, id, key) {\n const node = getNodeByKey(root.root, key);\n if (!node) {\n return;\n }\n if (node.v.length === 1) {\n remove(root, key);\n return;\n }\n node.v.splice(node.v.indexOf(id), 1);\n}\n\n//# sourceMappingURL=avl.js.map","import { intersect, safeArrayPush } from '../utils.js';\nexport function create() {\n return {\n numberToDocumentId: new Map()\n };\n}\nexport function insert(root, key, value) {\n if (root.numberToDocumentId.has(key)) {\n root.numberToDocumentId.get(key).push(value);\n return root;\n }\n root.numberToDocumentId.set(key, [\n value\n ]);\n return root;\n}\nexport function find(root, key) {\n return root.numberToDocumentId.get(key) ?? null;\n}\nexport function remove(root, key) {\n if (root != null) {\n root.numberToDocumentId.delete(key);\n }\n return root;\n}\nexport function removeDocument(root, id, key) {\n var _root_numberToDocumentId_get, _root_numberToDocumentId_get1;\n root === null || root === void 0 ? void 0 : root.numberToDocumentId.set(key, ((_root_numberToDocumentId_get = root === null || root === void 0 ? void 0 : root.numberToDocumentId.get(key)) === null || _root_numberToDocumentId_get === void 0 ? void 0 : _root_numberToDocumentId_get.filter((v)=>v !== id)) ?? []);\n if (((_root_numberToDocumentId_get1 = root === null || root === void 0 ? void 0 : root.numberToDocumentId.get(key)) === null || _root_numberToDocumentId_get1 === void 0 ? void 0 : _root_numberToDocumentId_get1.length) === 0) {\n root === null || root === void 0 ? void 0 : root.numberToDocumentId.delete(key);\n }\n}\nexport function contains(node, key) {\n return !(find(node, key) == null);\n}\nexport function getSize(root) {\n let size = 0;\n for (const [, value] of (root === null || root === void 0 ? void 0 : root.numberToDocumentId) ?? []){\n size += value.length;\n }\n return size;\n}\nexport function filter(root, operation) {\n const operationKeys = Object.keys(operation);\n if (operationKeys.length !== 1) {\n throw new Error('Invalid operation');\n }\n const operationType = operationKeys[0];\n switch(operationType){\n case 'eq':\n {\n const value = operation[operationType];\n return root.numberToDocumentId.get(value) ?? [];\n }\n case 'in':\n {\n const value = operation[operationType];\n const result = [];\n for (const v of value){\n const ids = root.numberToDocumentId.get(v);\n if (ids != null) {\n safeArrayPush(result, ids);\n }\n }\n return result;\n }\n case 'nin':\n {\n const value = operation[operationType];\n const result = [];\n const keys = root.numberToDocumentId.keys();\n for (const key of keys){\n if (value.includes(key)) {\n continue;\n }\n const ids = root.numberToDocumentId.get(key);\n if (ids != null) {\n safeArrayPush(result, ids);\n }\n }\n return result;\n }\n }\n throw new Error('Invalid operation');\n}\nexport function filterArr(root, operation) {\n const operationKeys = Object.keys(operation);\n if (operationKeys.length !== 1) {\n throw new Error('Invalid operation');\n }\n const operationType = operationKeys[0];\n switch(operationType){\n case 'containsAll':\n {\n const values = operation[operationType];\n const ids = values.map((value)=>root.numberToDocumentId.get(value) ?? []);\n return intersect(ids);\n }\n }\n throw new Error('Invalid operation');\n}\n\n//# sourceMappingURL=flat.js.map","/**\n * Inspired by:\n * https://github.com/Yomguithereal/talisman/blob/86ae55cbd040ff021d05e282e0e6c71f2dde21f8/src/metrics/levenshtein.js#L218-L340\n */ function _boundedLevenshtein(a, b, tolerance) {\n // the strings are the same\n if (a === b) {\n return 0;\n }\n // a should be the shortest string\n const swap = a;\n if (a.length > b.length) {\n a = b;\n b = swap;\n }\n let lenA = a.length;\n let lenB = b.length;\n // ignore common prefix\n let startIdx = 0;\n while(startIdx < lenA && a.charCodeAt(startIdx) === b.charCodeAt(startIdx)){\n startIdx++;\n }\n // if string A is subfix of B, we consider the distance 0\n // because we search for prefix!\n // fix https://github.com/oramasearch/orama/issues/544\n if (startIdx === lenA) {\n return 0;\n }\n // ignore common suffix\n // note: `~-` decreases by a unit in a bitwise fashion\n while(lenA > 0 && a.charCodeAt(~-lenA) === b.charCodeAt(~-lenB)){\n lenA--;\n lenB--;\n }\n // early return when the smallest string is empty\n if (!lenA) {\n return lenB > tolerance ? -1 : lenB;\n }\n lenA -= startIdx;\n lenB -= startIdx;\n // If both strings are smaller than the tolerance, we accept any distance\n // Probably the result distance is wrong, but we don't care:\n // It is always less then the tolerance!\n if (lenA <= tolerance && lenB <= tolerance) {\n return lenA > lenB ? lenA : lenB;\n }\n const delta = lenB - lenA;\n if (tolerance > lenB) {\n tolerance = lenB;\n } else if (delta > tolerance) {\n return -1;\n }\n let i = 0;\n const row = [];\n const characterCodeCache = [];\n while(i < tolerance){\n characterCodeCache[i] = b.charCodeAt(startIdx + i);\n row[i] = ++i;\n }\n while(i < lenB){\n characterCodeCache[i] = b.charCodeAt(startIdx + i);\n row[i++] = tolerance + 1;\n }\n const offset = tolerance - delta;\n const haveMax = tolerance < lenB;\n let jStart = 0;\n let jEnd = tolerance;\n let current = 0;\n let left = 0;\n let above = 0;\n let charA = 0;\n let j = 0;\n // Starting the nested loops\n for(i = 0; i < lenA; i++){\n left = i;\n current = i + 1;\n charA = a.charCodeAt(startIdx + i);\n jStart += i > offset ? 1 : 0;\n jEnd += jEnd < lenB ? 1 : 0;\n for(j = jStart; j < jEnd; j++){\n above = current;\n current = left;\n left = row[j];\n if (charA !== characterCodeCache[j]) {\n // insert current\n if (left < current) {\n current = left;\n }\n // delete current\n if (above < current) {\n current = above;\n }\n current++;\n }\n row[j] = current;\n }\n if (haveMax && row[i + delta] > tolerance) {\n return -1;\n }\n }\n return current <= tolerance ? current : -1;\n}\n/**\n * Computes the Levenshtein distance between two strings (a, b), returning early with -1 if the distance\n * is greater than the given tolerance.\n * It assumes that:\n * - tolerance >= ||a| - |b|| >= 0\n */ export async function boundedLevenshtein(a, b, tolerance) {\n const distance = _boundedLevenshtein(a, b, tolerance);\n return {\n distance,\n isBounded: distance >= 0\n };\n}\n// This is only used internally, keep in sync with the previous one\nexport function syncBoundedLevenshtein(a, b, tolerance) {\n const distance = _boundedLevenshtein(a, b, tolerance);\n return {\n distance,\n isBounded: distance >= 0\n };\n}\nexport function levenshtein(a, b) {\n /* c8 ignore next 3 */ if (!a.length) {\n return b.length;\n }\n /* c8 ignore next 3 */ if (!b.length) {\n return a.length;\n }\n const swap = a;\n if (a.length > b.length) {\n a = b;\n b = swap;\n }\n const row = Array.from({\n length: a.length + 1\n }, (_, i)=>i);\n let val = 0;\n for(let i = 1; i <= b.length; i++){\n let prev = i;\n for(let j = 1; j <= a.length; j++){\n if (b[i - 1] === a[j - 1]) {\n val = row[j - 1];\n } else {\n val = Math.min(row[j - 1] + 1, Math.min(prev + 1, row[j] + 1));\n }\n row[j - 1] = prev;\n prev = val;\n }\n row[a.length] = prev;\n }\n return row[a.length];\n}\n\n//# sourceMappingURL=levenshtein.js.map","import { syncBoundedLevenshtein } from '../components/levenshtein.js';\nimport { getOwnProperty } from '../utils.js';\nexport class Node {\n constructor(key, subWord, end){\n this.k = key;\n this.s = subWord;\n this.e = end;\n }\n // Node children\n c = {};\n // Node documents\n d = [];\n // Node word\n w = '';\n toJSON() {\n return {\n w: this.w,\n s: this.s,\n c: this.c,\n d: this.d,\n e: this.e\n };\n }\n}\nfunction updateParent(node, parent) {\n node.w = parent.w + node.s;\n}\nfunction addDocument(node, docID) {\n node.d.push(docID);\n}\nfunction removeDocument(node, docID) {\n const index = node.d.indexOf(docID);\n /* c8 ignore next 3 */ if (index === -1) {\n return false;\n }\n node.d.splice(index, 1);\n return true;\n}\nfunction findAllWords(node, output, term, exact, tolerance) {\n if (node.e) {\n const { w , d: docIDs } = node;\n if (exact && w !== term) {\n return {};\n }\n // always check in own property to prevent access to inherited properties\n // fix https://github.com/OramaSearch/orama/issues/137\n if (getOwnProperty(output, w) == null) {\n if (tolerance) {\n // computing the absolute difference of letters between the term and the word\n const difference = Math.abs(term.length - w.length);\n // if the tolerance is set, check whether the edit distance is within tolerance.\n // In that case, we don't need to add the word to the output\n if (difference <= tolerance && syncBoundedLevenshtein(term, w, tolerance).isBounded) {\n output[w] = [];\n }\n } else {\n // prevent default tolerance not set\n output[w] = [];\n }\n }\n // check if _output[w] exists and then add the doc to it\n // always check in own property to prevent access to inherited properties\n // fix https://github.com/OramaSearch/orama/issues/137\n if (getOwnProperty(output, w) != null && docIDs.length > 0) {\n const docs = new Set(output[w]);\n const docIDsLength = docIDs.length;\n for(let i = 0; i < docIDsLength; i++){\n docs.add(docIDs[i]);\n }\n output[w] = Array.from(docs);\n }\n }\n // recursively search the children\n for (const character of Object.keys(node.c)){\n findAllWords(node.c[character], output, term, exact, tolerance);\n }\n return output;\n}\nfunction getCommonPrefix(a, b) {\n let commonPrefix = '';\n const len = Math.min(a.length, b.length);\n for(let i = 0; i < len; i++){\n if (a[i] !== b[i]) {\n return commonPrefix;\n }\n commonPrefix += a[i];\n }\n return commonPrefix;\n}\nexport function create(end = false, subWord = '', key = '') {\n return new Node(key, subWord, end);\n}\nexport function insert(root, word, docId) {\n const wordLength = word.length;\n for(let i = 0; i < wordLength; i++){\n const currentCharacter = word[i];\n const wordAtIndex = word.substring(i);\n const rootChildCurrentChar = root.c[currentCharacter];\n if (rootChildCurrentChar) {\n const edgeLabel = rootChildCurrentChar.s;\n const edgeLabelLength = edgeLabel.length;\n const commonPrefix = getCommonPrefix(edgeLabel, wordAtIndex);\n const commonPrefixLength = commonPrefix.length;\n // the wordAtIndex matches exactly with an existing child node\n if (edgeLabel === wordAtIndex) {\n addDocument(rootChildCurrentChar, docId);\n rootChildCurrentChar.e = true;\n return;\n }\n const edgeLabelAtCommonPrefix = edgeLabel[commonPrefixLength];\n // the wordAtIndex is completely contained in the child node subword\n if (commonPrefixLength < edgeLabelLength && commonPrefixLength === wordAtIndex.length) {\n const newNode = create(true, wordAtIndex, currentCharacter) // Create a new node with end set to true\n ;\n newNode.c[edgeLabelAtCommonPrefix] = rootChildCurrentChar;\n const newNodeChild = newNode.c[edgeLabelAtCommonPrefix];\n newNodeChild.s = edgeLabel.substring(commonPrefixLength);\n newNodeChild.k = edgeLabelAtCommonPrefix;\n root.c[currentCharacter] = newNode;\n updateParent(newNode, root);\n updateParent(newNodeChild, newNode);\n addDocument(newNode, docId);\n return;\n }\n // the wordAtIndex is partially contained in the child node subword\n if (commonPrefixLength < edgeLabelLength && commonPrefixLength < wordAtIndex.length) {\n const inbetweenNode = create(false, commonPrefix, currentCharacter);\n inbetweenNode.c[edgeLabelAtCommonPrefix] = rootChildCurrentChar;\n root.c[currentCharacter] = inbetweenNode;\n const inbetweenNodeChild = inbetweenNode.c[edgeLabelAtCommonPrefix];\n inbetweenNodeChild.s = edgeLabel.substring(commonPrefixLength);\n inbetweenNodeChild.k = edgeLabelAtCommonPrefix;\n const wordAtCommonPrefix = wordAtIndex[commonPrefixLength];\n const newNode = create(true, word.substring(i + commonPrefixLength), wordAtCommonPrefix);\n addDocument(newNode, docId);\n inbetweenNode.c[wordAtCommonPrefix] = newNode;\n updateParent(inbetweenNode, root);\n updateParent(newNode, inbetweenNode);\n updateParent(inbetweenNodeChild, inbetweenNode);\n return;\n }\n // skip to the next divergent character\n i += edgeLabelLength - 1;\n // navigate in the child node\n root = rootChildCurrentChar;\n } else {\n // if the node for the current character doesn't exist create new node\n const newNode = create(true, wordAtIndex, currentCharacter);\n addDocument(newNode, docId);\n root.c[currentCharacter] = newNode;\n updateParent(newNode, root);\n return;\n }\n }\n}\nfunction _findLevenshtein(node, term, index, tolerance, originalTolerance, output) {\n if (tolerance < 0) {\n return;\n }\n if (node.w.startsWith(term)) {\n findAllWords(node, output, term, false, 0);\n return;\n }\n if (node.e) {\n const { w , d: docIDs } = node;\n if (w) {\n if (syncBoundedLevenshtein(term, w, originalTolerance).isBounded) {\n output[w] = [];\n }\n if (getOwnProperty(output, w) != null && docIDs.length > 0) {\n const docs = new Set(output[w]);\n const docIDsLength = docIDs.length;\n for(let i = 0; i < docIDsLength; i++){\n docs.add(docIDs[i]);\n }\n output[w] = Array.from(docs);\n }\n }\n }\n if (index >= term.length) {\n return;\n }\n // Match current character without consuming tolerance\n if (term[index] in node.c) {\n _findLevenshtein(node.c[term[index]], term, index + 1, tolerance, originalTolerance, output);\n }\n // If tolerance is still available, consider other branches:\n // 1. Deletion (skip the current term character)\n _findLevenshtein(node, term, index + 1, tolerance - 1, originalTolerance, output);\n // 2. Insertion (skip the current tree node character)\n for(const character in node.c){\n _findLevenshtein(node.c[character], term, index, tolerance - 1, originalTolerance, output);\n }\n // 3. Substitution (skip both current term character and tree node character)\n for(const character in node.c){\n if (character !== term[index]) {\n _findLevenshtein(node.c[character], term, index + 1, tolerance - 1, originalTolerance, output);\n }\n }\n}\nexport function find(root, { term , exact , tolerance }) {\n // Find the closest node to the term\n // Use `if` condition because tolerance `0` is supposed to match only prefix.\n // (allows infinite insertions at end, which is against normal levenshtein logic).\n // (new _findLevenshtein only handles not exact and tolerance>0 condition)\n if (tolerance && !exact) {\n const output = {};\n tolerance = tolerance || 0;\n _findLevenshtein(root, term, 0, tolerance || 0, tolerance, output);\n return output;\n } else {\n const termLength = term.length;\n for(let i = 0; i < termLength; i++){\n const character = term[i];\n if (character in root.c) {\n const rootChildCurrentChar = root.c[character];\n const edgeLabel = rootChildCurrentChar.s;\n const termSubstring = term.substring(i);\n // find the common prefix between two words ex: prime and primate = prim\n const commonPrefix = getCommonPrefix(edgeLabel, termSubstring);\n const commonPrefixLength = commonPrefix.length;\n // if the common prefix length is equal to edgeLabel length (the node subword) it means they are a match\n // if the common prefix is equal to the term means it is contained in the node\n if (commonPrefixLength !== edgeLabel.length && commonPrefixLength !== termSubstring.length) {\n // if tolerance is set we take the current node as the closest\n if (tolerance) break;\n return {};\n }\n // skip the subword length and check the next divergent character\n i += rootChildCurrentChar.s.length - 1;\n // navigate into the child node\n root = rootChildCurrentChar;\n } else {\n return {};\n }\n }\n const output = {};\n // found the closest node we recursively search through children\n findAllWords(root, output, term, exact, tolerance);\n return output;\n }\n}\nexport function contains(root, term) {\n const termLength = term.length;\n for(let i = 0; i < termLength; i++){\n const character = term[i];\n if (character in root.c) {\n const rootChildrenChar = root.c[character];\n const edgeLabel = rootChildrenChar.s;\n const termSubstring = term.substring(i);\n const commonPrefix = getCommonPrefix(edgeLabel, termSubstring);\n const commonPrefixLength = commonPrefix.length;\n if (commonPrefixLength !== edgeLabel.length && commonPrefixLength !== termSubstring.length) {\n return false;\n }\n i += rootChildrenChar.s.length - 1;\n root = rootChildrenChar;\n } else {\n return false;\n }\n }\n return true;\n}\nexport function removeWord(root, term) {\n if (!term) {\n return false;\n }\n const termLength = term.length;\n for(let i = 0; i < termLength; i++){\n const character = term[i];\n const parent = root;\n if (character in root.c) {\n i += root.c[character].s.length - 1;\n root = root.c[character];\n if (Object.keys(root.c).length === 0) {\n delete parent.c[root.k];\n return true;\n }\n } else {\n return false;\n }\n }\n return false;\n}\nexport function removeDocumentByWord(root, term, docID, exact = true) {\n if (!term) {\n return true;\n }\n const termLength = term.length;\n for(let i = 0; i < termLength; i++){\n const character = term[i];\n if (character in root.c) {\n const rootChildCurrentChar = root.c[character];\n i += rootChildCurrentChar.s.length - 1;\n root = rootChildCurrentChar;\n if (exact && root.w !== term) {\n // Do nothing if the exact condition is not met.\n } else {\n removeDocument(root, docID);\n }\n } else {\n return false;\n }\n }\n return true;\n}\n\n//# sourceMappingURL=radix.js.map","const K = 2 // 2D points\n;\nconst EARTH_RADIUS = 6371e3 // Earth radius in meters\n;\nexport function create() {\n return {\n root: null\n };\n}\nexport function insert(tree, point, docIDs) {\n const newNode = {\n point,\n docIDs\n };\n if (tree.root == null) {\n tree.root = newNode;\n return;\n }\n let node = tree.root;\n let depth = 0;\n while(node !== null){\n // Check if the current node's point matches the new point\n if (node.point.lon === point.lon && node.point.lat === point.lat) {\n // Merge the new docIDs with the existing ones and remove duplicates\n const newDocIDs = node.docIDs ?? [];\n node.docIDs = Array.from(new Set([\n ...newDocIDs,\n ...docIDs || []\n ]));\n return;\n }\n const axis = depth % K;\n // Compare by longitude\n if (axis === 0) {\n if (point.lon < node.point.lon) {\n if (node.left == null) {\n node.left = newNode;\n return;\n }\n node = node.left;\n } else {\n if (node.right == null) {\n node.right = newNode;\n return;\n }\n node = node.right;\n }\n // Compare by latitude\n } else {\n if (point.lat < node.point.lat) {\n if (node.left == null) {\n node.left = newNode;\n return;\n }\n node = node.left;\n } else {\n if (node.right == null) {\n node.right = newNode;\n return;\n }\n node = node.right;\n }\n }\n depth++;\n }\n}\nexport function contains(tree, point) {\n let node = tree.root;\n let depth = 0;\n while(node != null){\n if ((node === null || node === void 0 ? void 0 : node.point.lon) === point.lon && node.point.lat === point.lat) {\n return true;\n }\n const axis = depth % K;\n // Compare by longitude\n if (axis === 0) {\n if (point.lon < node.point.lon) {\n node = node === null || node === void 0 ? void 0 : node.left;\n } else {\n node = node === null || node === void 0 ? void 0 : node.right;\n }\n // Compare by latitude\n } else {\n if (point.lat < node.point.lat) {\n node = node === null || node === void 0 ? void 0 : node.left;\n } else {\n node = node === null || node === void 0 ? void 0 : node.right;\n }\n }\n depth++;\n }\n return false;\n}\n// @todo: this is very inefficient. Fix this later.\nexport function removeDocByID(tree, point, docID) {\n let node = tree.root;\n let depth = 0;\n let parentNode = null;\n let direction = null;\n while(node !== null){\n if ((node === null || node === void 0 ? void 0 : node.point.lon) === point.lon && node.point.lat === point.lat) {\n var _node_docIDs;\n const index = (_node_docIDs = node.docIDs) === null || _node_docIDs === void 0 ? void 0 : _node_docIDs.indexOf(docID);\n if (index !== undefined && index > -1) {\n var // Remove the docID from the array\n _node_docIDs1;\n (_node_docIDs1 = node.docIDs) === null || _node_docIDs1 === void 0 ? void 0 : _node_docIDs1.splice(index, 1);\n if (node.docIDs == null || node.docIDs.length === 0) {\n // If the node doesn't have any more docIDs, remove the node\n if (parentNode != null) {\n if (direction === 'left') {\n parentNode.left = node.left !== null ? node.left : node.right;\n } else if (direction === 'right') {\n parentNode.right = node.right !== null ? node.right : node.left;\n }\n } else {\n // If the node to be removed is the root\n tree.root = node.left !== null ? node.left : node.right;\n }\n }\n return;\n }\n }\n const axis = depth % K;\n parentNode = node;\n // Compare by longitude\n if (axis === 0) {\n if (point.lon < node.point.lon) {\n node = node === null || node === void 0 ? void 0 : node.left;\n direction = 'left';\n } else {\n node = node === null || node === void 0 ? void 0 : node.right;\n direction = 'right';\n }\n // Compare by latitude\n } else {\n if (point.lat < node.point.lat) {\n node = node === null || node === void 0 ? void 0 : node.left;\n direction = 'left';\n } else {\n node = node === null || node === void 0 ? void 0 : node.right;\n direction = 'right';\n }\n }\n depth++;\n }\n}\nexport function getDocIDsByCoordinates(tree, point) {\n let node = tree.root;\n let depth = 0;\n while(node !== null){\n if (node.point.lon === point.lon && node.point.lat === point.lat) {\n // prettier-ignore\n return node.docIDs ?? null;\n }\n const axis = depth % K;\n // Compare by longitude\n if (axis === 0) {\n if (point.lon < node.point.lon) {\n node = node.left;\n } else {\n node = node.right;\n }\n // Compare by latitude\n } else {\n if (point.lat < node.point.lat) {\n node = node.left;\n } else {\n node = node.right;\n }\n }\n depth++;\n }\n return null;\n}\nexport function searchByRadius(node, center, radius, inclusive = true, sort = 'asc', highPrecision = false) {\n const distanceFn = highPrecision ? vincentyDistance : haversineDistance;\n const stack = [\n {\n node,\n depth: 0\n }\n ];\n const result = [];\n while(stack.length > 0){\n const { node , depth } = stack.pop();\n if (node === null) continue;\n const dist = distanceFn(center, node.point);\n if (inclusive ? dist <= radius : dist > radius) {\n result.push({\n point: node.point,\n docIDs: node.docIDs ?? []\n });\n }\n if (node.left != null) {\n stack.push({\n node: node.left,\n depth: depth + 1\n });\n }\n if (node.right != null) {\n stack.push({\n node: node.right,\n depth: depth + 1\n });\n }\n }\n if (sort) {\n result.sort((a, b)=>{\n const distA = distanceFn(center, a.point);\n const distB = distanceFn(center, b.point);\n return sort.toLowerCase() === 'asc' ? distA - distB : distB - distA;\n });\n }\n return result;\n}\nexport function searchByPolygon(root, polygon, inclusive = true, sort = null, highPrecision = false) {\n const stack = [\n {\n node: root,\n depth: 0\n }\n ];\n const result = [];\n while(stack.length > 0){\n const task = stack.pop();\n if (task == null || task.node == null) continue;\n const { node , depth } = task;\n const nextDepth = depth + 1;\n if (node.left != null) {\n stack.push({\n node: node.left,\n depth: nextDepth\n });\n }\n if (node.right != null) {\n stack.push({\n node: node.right,\n depth: nextDepth\n });\n }\n const isInsidePolygon = isPointInPolygon(polygon, node.point);\n if (isInsidePolygon && inclusive) {\n result.push({\n point: node.point,\n docIDs: node.docIDs ?? []\n });\n } else if (!isInsidePolygon && !inclusive) {\n result.push({\n point: node.point,\n docIDs: node.docIDs ?? []\n });\n }\n }\n const centroid = calculatePolygonCentroid(polygon);\n if (sort) {\n const sortFn = highPrecision ? vincentyDistance : haversineDistance;\n result.sort((a, b)=>{\n const distA = sortFn(centroid, a.point);\n const distB = sortFn(centroid, b.point);\n return sort.toLowerCase() === 'asc' ? distA - distB : distB - distA;\n });\n }\n return result;\n}\nfunction calculatePolygonCentroid(polygon) {\n let totalArea = 0;\n let centroidX = 0;\n let centroidY = 0;\n const polygonLength = polygon.length;\n for(let i = 0, j = polygonLength - 1; i < polygonLength; j = i++){\n const xi = polygon[i].lon;\n const yi = polygon[i].lat;\n const xj = polygon[j].lon;\n const yj = polygon[j].lat;\n const areaSegment = xi * yj - xj * yi;\n totalArea += areaSegment;\n centroidX += (xi + xj) * areaSegment;\n centroidY += (yi + yj) * areaSegment;\n }\n totalArea /= 2;\n const centroidCoordinate = 6 * totalArea;\n centroidX /= centroidCoordinate;\n centroidY /= centroidCoordinate;\n return {\n lon: centroidX,\n lat: centroidY\n };\n}\nfunction isPointInPolygon(polygon, point) {\n let isInside = false;\n const x = point.lon;\n const y = point.lat;\n const polygonLength = polygon.length;\n for(let i = 0, j = polygonLength - 1; i < polygonLength; j = i++){\n const xi = polygon[i].lon;\n const yi = polygon[i].lat;\n const xj = polygon[j].lon;\n const yj = polygon[j].lat;\n const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) isInside = !isInside;\n }\n return isInside;\n}\nfunction haversineDistance(coord1, coord2) {\n const P = Math.PI / 180;\n const lat1 = coord1.lat * P;\n const lat2 = coord2.lat * P;\n const deltaLat = (coord2.lat - coord1.lat) * P;\n const deltaLon = (coord2.lon - coord1.lon) * P;\n const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return EARTH_RADIUS * c;\n}\nfunction vincentyDistance(coord1, coord2) {\n // Constants for WGS 84 ellipsoidal Earth model (https://epsg.org/ellipsoid_7030/WGS-84.html)\n // Semi-major axis of the Earth in meters\n const a = 6378137;\n // Flattening of the ellipsoid\n const f = 1 / 298.257223563;\n // Semi-minor axis\n const b = (1 - f) * a;\n // Convert degrees to radians for calculations\n const P = Math.PI / 180;\n const lat1 = coord1.lat * P;\n const lat2 = coord2.lat * P;\n const deltaLon = (coord2.lon - coord1.lon) * P;\n // Reduced latitudes - account for flattening by transforming from geodetic to auxiliary latitude\n const U1 = Math.atan((1 - f) * Math.tan(lat1));\n const U2 = Math.atan((1 - f) * Math.tan(lat2));\n const sinU1 = Math.sin(U1);\n const cosU1 = Math.cos(U1);\n const sinU2 = Math.sin(U2);\n const cosU2 = Math.cos(U2);\n // Initial approximation for the longitude difference between the two points\n let lambda = deltaLon;\n let prevLambda;\n // Limit the iterations to ensure we don't get stuck in an infinite loop\n let iterationLimit = 1000;\n let sinAlpha;\n let cos2Alpha;\n let sinSigma;\n let cosSigma;\n let sigma;\n // Refine the value of lambda (longitude difference)\n do {\n const sinLambda = Math.sin(lambda);\n const cosLambda = Math.cos(lambda);\n // Compute the trigonometric values required for Vincenty formulae\n sinSigma = Math.sqrt(cosU2 * sinLambda * (cosU2 * sinLambda) + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));\n cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n sigma = Math.atan2(sinSigma, cosSigma);\n // Angular separation between the two points and the equator\n sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;\n cos2Alpha = 1 - sinAlpha * sinAlpha;\n const cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cos2Alpha;\n // Compensation factor for the Earth's shape\n const C = f / 16 * cos2Alpha * (4 + f * (4 - 3 * cos2Alpha));\n // Store previous lambda to check for convergence\n prevLambda = lambda;\n // Refine the estimate of lambda using the Vincenty formula\n lambda = deltaLon + (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));\n }while (Math.abs(lambda - prevLambda) > 1e-12 && --iterationLimit > 0)\n // Compute factors that depend on the shape of the Earth and angular distances\n const u2 = cos2Alpha * (a * a - b * b) / (b * b);\n const A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)));\n const B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47 * u2)));\n // Compute the correction factor for the ellipsoidal shape of the Earth\n const deltaSigma = B * sinSigma * (cosSigma - 2 * sinU1 * sinU2 / cos2Alpha + B / 4 * (cosSigma * (-1 + 2 * sinSigma * sinSigma) - B / 6 * sigma * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * sigma * sigma)));\n // Final calculation of distance using Vincenty formula\n const s = b * A * (sigma - deltaSigma);\n return s;\n}\n\n//# sourceMappingURL=bkd.js.map","import { createError } from '../errors.js';\nexport function prioritizeTokenScores(arrays, boost, threshold = 1, keywordsCount) {\n if (boost === 0) {\n throw createError('INVALID_BOOST_VALUE');\n }\n const tokenScoresMap = new Map();\n const mapsLength = arrays.length;\n for(let i = 0; i < mapsLength; i++){\n const arr = arrays[i];\n const entriesLength = arr.length;\n for(let j = 0; j < entriesLength; j++){\n var _tokenScoresMap_get;\n const [token, score] = arr[j];\n const boostScore = score * boost;\n const oldScore = (_tokenScoresMap_get = tokenScoresMap.get(token)) === null || _tokenScoresMap_get === void 0 ? void 0 : _tokenScoresMap_get[0];\n if (oldScore !== undefined) {\n var _tokenScoresMap_get1;\n tokenScoresMap.set(token, [\n oldScore * 1.5 + boostScore,\n (((_tokenScoresMap_get1 = tokenScoresMap === null || tokenScoresMap === void 0 ? void 0 : tokenScoresMap.get(token)) === null || _tokenScoresMap_get1 === void 0 ? void 0 : _tokenScoresMap_get1[1]) || 0) + 1\n ]);\n } else {\n tokenScoresMap.set(token, [\n boostScore,\n 1\n ]);\n }\n }\n }\n const tokenScores = [];\n for (const tokenScoreEntry of tokenScoresMap.entries()){\n tokenScores.push([\n tokenScoreEntry[0],\n tokenScoreEntry[1][0]\n ]);\n }\n const results = tokenScores.sort((a, b)=>b[1] - a[1]);\n // If threshold is 1, it means we will return all the results with at least one search term,\n // prioritizig the ones that contains more search terms (fuzzy match)\n if (threshold === 1) {\n return results;\n }\n // Prepare keywords count tracking for threshold handling\n const allResults = results.length;\n const tokenScoreWithKeywordsCount = [];\n for (const tokenScoreEntry of tokenScoresMap.entries()){\n tokenScoreWithKeywordsCount.push([\n tokenScoreEntry[0],\n tokenScoreEntry[1][0],\n tokenScoreEntry[1][1]\n ]);\n }\n // Find the index of the last result with all keywords.\n // Order the documents by the number of keywords they contain, and then by the score.\n const keywordsPerToken = tokenScoreWithKeywordsCount.sort((a, b)=>{\n // Compare by the third element, higher numbers first\n if (a[2] > b[2]) return -1;\n if (a[2] < b[2]) return 1;\n // If the third elements are equal, compare by the second element, higher numbers first\n if (a[1] > b[1]) return -1;\n if (a[1] < b[1]) return 1;\n // If both the second and third elements are equal, consider the elements equal\n return 0;\n });\n let lastTokenWithAllKeywords = undefined;\n for(let i = 0; i < allResults; i++){\n if (keywordsPerToken[i][2] === keywordsCount) {\n lastTokenWithAllKeywords = i;\n } else {\n break;\n }\n }\n // If no results had all the keywords, either bail out earlier or normalize\n if (typeof lastTokenWithAllKeywords === 'undefined') {\n if (threshold === 0) {\n return [];\n }\n lastTokenWithAllKeywords = 0;\n }\n const keywordsPerTokenLength = keywordsPerToken.length;\n const resultsWithIdAndScore = new Array(keywordsPerTokenLength);\n for(let i = 0; i < keywordsPerTokenLength; i++){\n resultsWithIdAndScore[i] = [\n keywordsPerToken[i][0],\n keywordsPerToken[i][1]\n ];\n }\n // If threshold is 0, it means we will only return all the results that contains ALL the search terms (exact match)\n if (threshold === 0) {\n return resultsWithIdAndScore.slice(0, lastTokenWithAllKeywords + 1);\n }\n // If the threshold is between 0 and 1, we will return all the results that contains at least the threshold of search terms\n // For example, if threshold is 0.5, we will return all the results that contains at least 50% of the search terms\n // (fuzzy match with a minimum threshold)\n const thresholdLength = lastTokenWithAllKeywords + Math.ceil(threshold * 100 * (allResults - lastTokenWithAllKeywords) / 100);\n return resultsWithIdAndScore.slice(0, allResults + thresholdLength);\n}\nexport function BM25(tf, matchingCount, docsCount, fieldLength, averageFieldLength, { k , b , d }) {\n const idf = Math.log(1 + (docsCount - matchingCount + 0.5) / (matchingCount + 0.5));\n return idf * (d + tf * (k + 1)) / (tf + k * (1 - b + b * fieldLength / averageFieldLength));\n}\n\n//# sourceMappingURL=algorithms.js.map","export function getMagnitude(vector, vectorLength) {\n let magnitude = 0;\n for(let i = 0; i < vectorLength; i++){\n magnitude += vector[i] * vector[i];\n }\n return Math.sqrt(magnitude);\n}\n// @todo: Write plugins for Node and Browsers to use parallel computation for this function\nexport function findSimilarVectors(targetVector, vectors, length, threshold = 0.8) {\n const targetMagnitude = getMagnitude(targetVector, length);\n const similarVectors = [];\n for (const [vectorId, [magnitude, vector]] of Object.entries(vectors)){\n let dotProduct = 0;\n for(let i = 0; i < length; i++){\n dotProduct += targetVector[i] * vector[i];\n }\n const similarity = dotProduct / (targetMagnitude * magnitude);\n if (similarity >= threshold) {\n similarVectors.push([\n vectorId,\n similarity\n ]);\n }\n }\n return similarVectors.sort((a, b)=>b[1] - a[1]);\n}\n\n//# sourceMappingURL=cosine-similarity.js.map","import { createError } from '../errors.js';\nimport { create as avlCreate, find as avlFind, greaterThan as avlGreaterThan, insert as avlInsert, lessThan as avlLessThan, rangeSearch as avlRangeSearch, removeDocument as avlRemoveDocument } from '../trees/avl.js';\nimport { create as flatCreate, filter as flatFilter, filterArr as flatFilterArr, insert as flatInsert, removeDocument as flatRemoveDocument } from '../trees/flat.js';\nimport { create as radixCreate, find as radixFind, insert as radixInsert, removeDocumentByWord as radixRemoveDocument } from '../trees/radix.js';\nimport { create as bkdCreate, insert as bkdInsert, removeDocByID as bkdRemoveDocByID, searchByRadius, searchByPolygon } from '../trees/bkd.js';\nimport { convertDistanceToMeters, intersect, safeArrayPush, getOwnProperty } from '../utils.js';\nimport { BM25 } from './algorithms.js';\nimport { getMagnitude } from './cosine-similarity.js';\nimport { getInnerType, getVectorSize, isArrayType, isVectorType } from './defaults.js';\nimport { getInternalDocumentId } from './internal-document-id-store.js';\nexport async function insertDocumentScoreParameters(index, prop, id, tokens, docsCount) {\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);\n index.avgFieldLength[prop] = ((index.avgFieldLength[prop] ?? 0) * (docsCount - 1) + tokens.length) / docsCount;\n index.fieldLengths[prop][internalId] = tokens.length;\n index.frequencies[prop][internalId] = {};\n}\nexport async function insertTokenScoreParameters(index, prop, id, tokens, token) {\n let tokenFrequency = 0;\n for (const t of tokens){\n if (t === token) {\n tokenFrequency++;\n }\n }\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);\n const tf = tokenFrequency / tokens.length;\n index.frequencies[prop][internalId][token] = tf;\n if (!(token in index.tokenOccurrences[prop])) {\n index.tokenOccurrences[prop][token] = 0;\n }\n // increase a token counter that may not yet exist\n index.tokenOccurrences[prop][token] = (index.tokenOccurrences[prop][token] ?? 0) + 1;\n}\nexport async function removeDocumentScoreParameters(index, prop, id, docsCount) {\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);\n index.avgFieldLength[prop] = (index.avgFieldLength[prop] * docsCount - index.fieldLengths[prop][internalId]) / (docsCount - 1);\n index.fieldLengths[prop][internalId] = undefined;\n index.frequencies[prop][internalId] = undefined;\n}\nexport async function removeTokenScoreParameters(index, prop, token) {\n index.tokenOccurrences[prop][token]--;\n}\nexport async function calculateResultScores(context, index, prop, term, ids) {\n const documentIDs = Array.from(ids);\n // Exact fields for TF-IDF\n const avgFieldLength = index.avgFieldLength[prop];\n const fieldLengths = index.fieldLengths[prop];\n const oramaOccurrences = index.tokenOccurrences[prop];\n const oramaFrequencies = index.frequencies[prop];\n // oramaOccurrences[term] can be undefined, 0, string, or { [k: string]: number }\n const termOccurrences = typeof oramaOccurrences[term] === 'number' ? oramaOccurrences[term] ?? 0 : 0;\n const scoreList = [];\n // Calculate TF-IDF value for each term, in each document, for each index.\n const documentIDsLength = documentIDs.length;\n for(let k = 0; k < documentIDsLength; k++){\n var _oramaFrequencies_internalId;\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, documentIDs[k]);\n const tf = (oramaFrequencies === null || oramaFrequencies === void 0 ? void 0 : (_oramaFrequencies_internalId = oramaFrequencies[internalId]) === null || _oramaFrequencies_internalId === void 0 ? void 0 : _oramaFrequencies_internalId[term]) ?? 0;\n const bm25 = BM25(tf, termOccurrences, context.docsCount, fieldLengths[internalId], avgFieldLength, context.params.relevance);\n scoreList.push([\n internalId,\n bm25\n ]);\n }\n return scoreList;\n}\nexport async function create(orama, sharedInternalDocumentStore, schema, index, prefix = '') {\n if (!index) {\n index = {\n sharedInternalDocumentStore,\n indexes: {},\n vectorIndexes: {},\n searchableProperties: [],\n searchablePropertiesWithTypes: {},\n frequencies: {},\n tokenOccurrences: {},\n avgFieldLength: {},\n fieldLengths: {}\n };\n }\n for (const [prop, type] of Object.entries(schema)){\n const path = `${prefix}${prefix ? '.' : ''}${prop}`;\n if (typeof type === 'object' && !Array.isArray(type)) {\n // Nested\n create(orama, sharedInternalDocumentStore, type, index, path);\n continue;\n }\n if (isVectorType(type)) {\n index.searchableProperties.push(path);\n index.searchablePropertiesWithTypes[path] = type;\n index.vectorIndexes[path] = {\n size: getVectorSize(type),\n vectors: {}\n };\n } else {\n const isArray = /\\[/.test(type);\n switch(type){\n case 'boolean':\n case 'boolean[]':\n index.indexes[path] = {\n type: 'Bool',\n node: {\n true: [],\n false: []\n },\n isArray\n };\n break;\n case 'number':\n case 'number[]':\n index.indexes[path] = {\n type: 'AVL',\n node: avlCreate(0, []),\n isArray\n };\n break;\n case 'string':\n case 'string[]':\n index.indexes[path] = {\n type: 'Radix',\n node: radixCreate(),\n isArray\n };\n index.avgFieldLength[path] = 0;\n index.frequencies[path] = {};\n index.tokenOccurrences[path] = {};\n index.fieldLengths[path] = {};\n break;\n case 'enum':\n case 'enum[]':\n index.indexes[path] = {\n type: 'Flat',\n node: flatCreate(),\n isArray\n };\n break;\n case 'geopoint':\n index.indexes[path] = {\n type: 'BKD',\n node: bkdCreate(),\n isArray\n };\n break;\n default:\n throw createError('INVALID_SCHEMA_TYPE', Array.isArray(type) ? 'array' : type, path);\n }\n index.searchableProperties.push(path);\n index.searchablePropertiesWithTypes[path] = type;\n }\n }\n return index;\n}\nfunction insertScalarBuilder(implementation, index, prop, id, language, tokenizer, docsCount) {\n return async (value)=>{\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);\n const { type , node } = index.indexes[prop];\n switch(type){\n case 'Bool':\n {\n node[value ? 'true' : 'false'].push(internalId);\n break;\n }\n case 'AVL':\n {\n avlInsert(node, value, [\n internalId\n ]);\n break;\n }\n case 'Radix':\n {\n const tokens = await tokenizer.tokenize(value, language, prop);\n await implementation.insertDocumentScoreParameters(index, prop, internalId, tokens, docsCount);\n for (const token of tokens){\n await implementation.insertTokenScoreParameters(index, prop, internalId, tokens, token);\n radixInsert(node, token, internalId);\n }\n break;\n }\n case 'Flat':\n {\n flatInsert(node, value, internalId);\n break;\n }\n case 'BKD':\n {\n bkdInsert(node, value, [\n internalId\n ]);\n break;\n }\n }\n };\n}\nexport async function insert(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {\n if (isVectorType(schemaType)) {\n return insertVector(index, prop, value, id);\n }\n const insertScalar = insertScalarBuilder(implementation, index, prop, id, language, tokenizer, docsCount);\n if (!isArrayType(schemaType)) {\n return insertScalar(value);\n }\n const elements = value;\n const elementsLength = elements.length;\n for(let i = 0; i < elementsLength; i++){\n await insertScalar(elements[i]);\n }\n}\nfunction insertVector(index, prop, value, id) {\n if (!(value instanceof Float32Array)) {\n value = new Float32Array(value);\n }\n const size = index.vectorIndexes[prop].size;\n const magnitude = getMagnitude(value, size);\n index.vectorIndexes[prop].vectors[id] = [\n magnitude,\n value\n ];\n}\nasync function removeScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {\n const internalId = getInternalDocumentId(index.sharedInternalDocumentStore, id);\n if (isVectorType(schemaType)) {\n delete index.vectorIndexes[prop].vectors[id];\n return true;\n }\n const { type , node } = index.indexes[prop];\n switch(type){\n case 'AVL':\n {\n avlRemoveDocument(node, internalId, value);\n return true;\n }\n case 'Bool':\n {\n const booleanKey = value ? 'true' : 'false';\n const position = node[booleanKey].indexOf(internalId);\n node[value ? 'true' : 'false'].splice(position, 1);\n return true;\n }\n case 'Radix':\n {\n const tokens = await tokenizer.tokenize(value, language, prop);\n await implementation.removeDocumentScoreParameters(index, prop, id, docsCount);\n for (const token of tokens){\n await implementation.removeTokenScoreParameters(index, prop, token);\n radixRemoveDocument(node, token, internalId);\n }\n return true;\n }\n case 'Flat':\n {\n flatRemoveDocument(node, internalId, value);\n return true;\n }\n case 'BKD':\n {\n bkdRemoveDocByID(node, value, internalId);\n return false;\n }\n }\n}\nexport async function remove(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount) {\n if (!isArrayType(schemaType)) {\n return removeScalar(implementation, index, prop, id, value, schemaType, language, tokenizer, docsCount);\n }\n const innerSchemaType = getInnerType(schemaType);\n const elements = value;\n const elementsLength = elements.length;\n for(let i = 0; i < elementsLength; i++){\n await removeScalar(implementation, index, prop, id, elements[i], innerSchemaType, language, tokenizer, docsCount);\n }\n return true;\n}\nexport async function search(context, index, prop, term) {\n if (!(prop in index.tokenOccurrences)) {\n return [];\n }\n const { node , type } = index.indexes[prop];\n if (type !== 'Radix') {\n throw createError('WRONG_SEARCH_PROPERTY_TYPE', prop);\n }\n const { exact , tolerance } = context.params;\n const searchResult = radixFind(node, {\n term,\n exact,\n tolerance\n });\n const ids = new Set();\n for(const key in searchResult){\n //skip keys inherited from prototype\n const ownProperty = getOwnProperty(searchResult, key);\n if (!ownProperty) continue;\n for (const id of searchResult[key]){\n ids.add(id);\n }\n }\n return context.index.calculateResultScores(context, index, prop, term, Array.from(ids));\n}\nexport async function searchByWhereClause(context, index, filters) {\n const filterKeys = Object.keys(filters);\n const filtersMap = filterKeys.reduce((acc, key)=>({\n [key]: [],\n ...acc\n }), {});\n for (const param of filterKeys){\n const operation = filters[param];\n if (typeof index.indexes[param] === 'undefined') {\n throw createError('UNKNOWN_FILTER_PROPERTY', param);\n }\n const { node , type , isArray } = index.indexes[param];\n if (type === 'Bool') {\n const idx = node;\n const filteredIDs = idx[operation.toString()];\n safeArrayPush(filtersMap[param], filteredIDs);\n continue;\n }\n if (type === 'BKD') {\n let reqOperation;\n if ('radius' in operation) {\n reqOperation = 'radius';\n } else if ('polygon' in operation) {\n reqOperation = 'polygon';\n } else {\n throw new Error(`Invalid operation ${operation}`);\n }\n if (reqOperation === 'radius') {\n const { value , coordinates , unit ='m' , inside =true , highPrecision =false } = operation[reqOperation];\n const distanceInMeters = convertDistanceToMeters(value, unit);\n const ids = searchByRadius(node.root, coordinates, distanceInMeters, inside, undefined, highPrecision);\n // @todo: convert this into a for loop\n safeArrayPush(filtersMap[param], ids.map(({ docIDs })=>docIDs).flat());\n } else {\n const { coordinates , inside =true , highPrecision =false } = operation[reqOperation];\n const ids = searchByPolygon(node.root, coordinates, inside, undefined, highPrecision);\n // @todo: convert this into a for loop\n safeArrayPush(filtersMap[param], ids.map(({ docIDs })=>docIDs).flat());\n }\n continue;\n }\n if (type === 'Radix' && (typeof operation === 'string' || Array.isArray(operation))) {\n for (const raw of [\n operation\n ].flat()){\n const term = await context.tokenizer.tokenize(raw, context.language, param);\n for (const t of term){\n const filteredIDsResults = radixFind(node, {\n term: t,\n exact: true\n });\n safeArrayPush(filtersMap[param], Object.values(filteredIDsResults).flat());\n }\n }\n continue;\n }\n const operationKeys = Object.keys(operation);\n if (operationKeys.length > 1) {\n throw createError('INVALID_FILTER_OPERATION', operationKeys.length);\n }\n if (type === 'Flat') {\n if (isArray) {\n safeArrayPush(filtersMap[param], flatFilterArr(node, operation));\n } else {\n safeArrayPush(filtersMap[param], flatFilter(node, operation));\n }\n continue;\n }\n if (type === 'AVL') {\n const operationOpt = operationKeys[0];\n const operationValue = operation[operationOpt];\n let filteredIDs = [];\n switch(operationOpt){\n case 'gt':\n {\n filteredIDs = avlGreaterThan(node, operationValue, false);\n break;\n }\n case 'gte':\n {\n filteredIDs = avlGreaterThan(node, operationValue, true);\n break;\n }\n case 'lt':\n {\n filteredIDs = avlLessThan(node, operationValue, false);\n break;\n }\n case 'lte':\n {\n filteredIDs = avlLessThan(node, operationValue, true);\n break;\n }\n case 'eq':\n {\n filteredIDs = avlFind(node, operationValue) ?? [];\n break;\n }\n case 'between':\n {\n const [min, max] = operationValue;\n filteredIDs = avlRangeSearch(node, min, max);\n break;\n }\n }\n safeArrayPush(filtersMap[param], filteredIDs);\n }\n }\n // AND operation: calculate the intersection between all the IDs in filterMap\n const result = intersect(Object.values(filtersMap));\n return result;\n}\nexport async function getSearchableProperties(index) {\n return index.searchableProperties;\n}\nexport async function getSearchablePropertiesWithTypes(index) {\n return index.searchablePropertiesWithTypes;\n}\nfunction loadRadixNode(node) {\n const convertedNode = radixCreate(node.e, node.s, node.k);\n convertedNode.d = node.d;\n convertedNode.w = node.w;\n for (const childrenKey of Object.keys(node.c)){\n convertedNode.c[childrenKey] = loadRadixNode(node.c[childrenKey]);\n }\n return convertedNode;\n}\nfunction loadFlatNode(node) {\n return {\n numberToDocumentId: new Map(node)\n };\n}\nfunction saveFlatNode(node) {\n return Array.from(node.numberToDocumentId.entries());\n}\nexport async function load(sharedInternalDocumentStore, raw) {\n const { indexes: rawIndexes , vectorIndexes: rawVectorIndexes , searchableProperties , searchablePropertiesWithTypes , frequencies , tokenOccurrences , avgFieldLength , fieldLengths } = raw;\n const indexes = {};\n const vectorIndexes = {};\n for (const prop of Object.keys(rawIndexes)){\n const { node , type , isArray } = rawIndexes[prop];\n switch(type){\n case 'Radix':\n indexes[prop] = {\n type: 'Radix',\n node: loadRadixNode(node),\n isArray\n };\n break;\n case 'Flat':\n indexes[prop] = {\n type: 'Flat',\n node: loadFlatNode(node),\n isArray\n };\n break;\n default:\n indexes[prop] = rawIndexes[prop];\n }\n }\n for (const idx of Object.keys(rawVectorIndexes)){\n const vectors = rawVectorIndexes[idx].vectors;\n for(const vec in vectors){\n vectors[vec] = [\n vectors[vec][0],\n new Float32Array(vectors[vec][1])\n ];\n }\n vectorIndexes[idx] = {\n size: rawVectorIndexes[idx].size,\n vectors\n };\n }\n return {\n sharedInternalDocumentStore,\n indexes,\n vectorIndexes,\n searchableProperties,\n searchablePropertiesWithTypes,\n frequencies,\n tokenOccurrences,\n avgFieldLength,\n fieldLengths\n };\n}\nexport async function save(index) {\n const { indexes , vectorIndexes , searchableProperties , searchablePropertiesWithTypes , frequencies , tokenOccurrences , avgFieldLength , fieldLengths } = index;\n const vectorIndexesAsArrays = {};\n for (const idx of Object.keys(vectorIndexes)){\n const vectors = vectorIndexes[idx].vectors;\n for(const vec in vectors){\n vectors[vec] = [\n vectors[vec][0],\n Array.from(vectors[vec][1])\n ];\n }\n vectorIndexesAsArrays[idx] = {\n size: vectorIndexes[idx].size,\n vectors\n };\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const savedIndexes = {};\n for (const name of Object.keys(indexes)){\n const { type , node , isArray } = indexes[name];\n if (type !== 'Flat') {\n savedIndexes[name] = indexes[name];\n continue;\n }\n savedIndexes[name] = {\n type: 'Flat',\n node: saveFlatNode(node),\n isArray\n };\n }\n return {\n indexes: savedIndexes,\n vectorIndexes: vectorIndexesAsArrays,\n searchableProperties,\n searchablePropertiesWithTypes,\n frequencies,\n tokenOccurrences,\n avgFieldLength,\n fieldLengths\n };\n}\nexport async function createIndex() {\n return {\n create,\n insert,\n remove,\n insertDocumentScoreParameters,\n insertTokenScoreParameters,\n removeDocumentScoreParameters,\n removeTokenScoreParameters,\n calculateResultScores,\n search,\n searchByWhereClause,\n getSearchableProperties,\n getSearchablePropertiesWithTypes,\n load,\n save\n };\n}\n\n//# sourceMappingURL=index.js.map","import { createError } from '../errors.js';\nimport { isVectorType } from './defaults.js';\nimport { getInternalDocumentId } from './internal-document-id-store.js';\nimport { safeArrayPush } from '../utils.js';\nimport { getLocale } from './tokenizer/languages.js';\nfunction innerCreate(orama, sharedInternalDocumentStore, schema, sortableDeniedProperties, prefix) {\n const sorter = {\n language: orama.tokenizer.language,\n sharedInternalDocumentStore,\n enabled: true,\n isSorted: true,\n sortableProperties: [],\n sortablePropertiesWithTypes: {},\n sorts: {}\n };\n for (const [prop, type] of Object.entries(schema)){\n const path = `${prefix}${prefix ? '.' : ''}${prop}`;\n if (sortableDeniedProperties.includes(path)) {\n continue;\n }\n if (typeof type === 'object' && !Array.isArray(type)) {\n // Nested\n const ret = innerCreate(orama, sharedInternalDocumentStore, type, sortableDeniedProperties, path);\n safeArrayPush(sorter.sortableProperties, ret.sortableProperties);\n sorter.sorts = {\n ...sorter.sorts,\n ...ret.sorts\n };\n sorter.sortablePropertiesWithTypes = {\n ...sorter.sortablePropertiesWithTypes,\n ...ret.sortablePropertiesWithTypes\n };\n continue;\n }\n if (!isVectorType(type)) {\n switch(type){\n case 'boolean':\n case 'number':\n case 'string':\n sorter.sortableProperties.push(path);\n sorter.sortablePropertiesWithTypes[path] = type;\n sorter.sorts[path] = {\n docs: new Map(),\n orderedDocsToRemove: new Map(),\n orderedDocs: [],\n type: type\n };\n break;\n case 'geopoint':\n case 'enum':\n continue;\n case 'enum[]':\n case 'boolean[]':\n case 'number[]':\n case 'string[]':\n continue;\n default:\n throw createError('INVALID_SORT_SCHEMA_TYPE', Array.isArray(type) ? 'array' : type, path);\n }\n }\n }\n return sorter;\n}\nasync function create(orama, sharedInternalDocumentStore, schema, config) {\n const isSortEnabled = (config === null || config === void 0 ? void 0 : config.enabled) !== false;\n if (!isSortEnabled) {\n return {\n disabled: true\n };\n }\n return innerCreate(orama, sharedInternalDocumentStore, schema, (config || {}).unsortableProperties || [], '');\n}\nasync function insert(sorter, prop, id, value) {\n if (!sorter.enabled) {\n return;\n }\n sorter.isSorted = false;\n const internalId = getInternalDocumentId(sorter.sharedInternalDocumentStore, id);\n const s = sorter.sorts[prop];\n // This happen during a document updating\n // Because we re-use the same internalId\n // We need to clean-up the data structure before re-inserting\n // to avoid duplicates in the orderedDocs array\n // See: https://github.com/oramasearch/orama/issues/629\n if (s.orderedDocsToRemove.has(internalId)) {\n ensureOrderedDocsAreDeletedByProperty(sorter, prop);\n }\n s.docs.set(internalId, s.orderedDocs.length);\n s.orderedDocs.push([\n internalId,\n value\n ]);\n}\nfunction ensureIsSorted(sorter) {\n if (sorter.isSorted || !sorter.enabled) {\n return;\n }\n const properties = Object.keys(sorter.sorts);\n for (const prop of properties){\n ensurePropertyIsSorted(sorter, prop);\n }\n sorter.isSorted = true;\n}\nfunction stringSort(language, value, d) {\n return value[1].localeCompare(d[1], getLocale(language));\n}\nfunction numberSort(value, d) {\n return value[1] - d[1];\n}\nfunction booleanSort(value, d) {\n return d[1] ? -1 : 1;\n}\nfunction ensurePropertyIsSorted(sorter, prop) {\n const s = sorter.sorts[prop];\n let predicate;\n switch(s.type){\n case 'string':\n predicate = stringSort.bind(null, sorter.language);\n break;\n case 'number':\n predicate = numberSort.bind(null);\n break;\n case 'boolean':\n predicate = booleanSort.bind(null);\n break;\n }\n s.orderedDocs.sort(predicate);\n // Increment position for the greather documents\n const orderedDocsLength = s.orderedDocs.length;\n for(let i = 0; i < orderedDocsLength; i++){\n const docId = s.orderedDocs[i][0];\n s.docs.set(docId, i);\n }\n}\nfunction ensureOrderedDocsAreDeleted(sorter) {\n const properties = Object.keys(sorter.sorts);\n for (const prop of properties){\n ensureOrderedDocsAreDeletedByProperty(sorter, prop);\n }\n}\nfunction ensureOrderedDocsAreDeletedByProperty(sorter, prop) {\n const s = sorter.sorts[prop];\n if (!s.orderedDocsToRemove.size) return;\n s.orderedDocs = s.orderedDocs.filter((doc)=>!s.orderedDocsToRemove.has(doc[0]));\n s.orderedDocsToRemove.clear();\n}\nasync function remove(sorter, prop, id) {\n if (!sorter.enabled) {\n return;\n }\n const s = sorter.sorts[prop];\n const internalId = getInternalDocumentId(sorter.sharedInternalDocumentStore, id);\n const index = s.docs.get(internalId);\n if (!index) return;\n s.docs.delete(internalId);\n s.orderedDocsToRemove.set(internalId, true);\n}\nasync function sortBy(sorter, docIds, by) {\n if (!sorter.enabled) {\n throw createError('SORT_DISABLED');\n }\n const property = by.property;\n const isDesc = by.order === 'DESC';\n const s = sorter.sorts[property];\n if (!s) {\n throw createError('UNABLE_TO_SORT_ON_UNKNOWN_FIELD', property, sorter.sortableProperties.join(', '));\n }\n ensureOrderedDocsAreDeletedByProperty(sorter, property);\n ensureIsSorted(sorter);\n docIds.sort((a, b)=>{\n // This sort algorithm works leveraging on\n // that s.docs is a map of docId -> position\n // If a document is not indexed, it will be not present in the map\n const indexOfA = s.docs.get(getInternalDocumentId(sorter.sharedInternalDocumentStore, a[0]));\n const indexOfB = s.docs.get(getInternalDocumentId(sorter.sharedInternalDocumentStore, b[0]));\n const isAIndexed = typeof indexOfA !== 'undefined';\n const isBIndexed = typeof indexOfB !== 'undefined';\n if (!isAIndexed && !isBIndexed) {\n return 0;\n }\n // unindexed documents are always at the end\n if (!isAIndexed) {\n return 1;\n }\n if (!isBIndexed) {\n return -1;\n }\n return isDesc ? indexOfB - indexOfA : indexOfA - indexOfB;\n });\n return docIds;\n}\nasync function getSortableProperties(sorter) {\n if (!sorter.enabled) {\n return [];\n }\n return sorter.sortableProperties;\n}\nasync function getSortablePropertiesWithTypes(sorter) {\n if (!sorter.enabled) {\n return {};\n }\n return sorter.sortablePropertiesWithTypes;\n}\nexport async function load(sharedInternalDocumentStore, raw) {\n const rawDocument = raw;\n if (!rawDocument.enabled) {\n return {\n enabled: false\n };\n }\n const sorts = Object.keys(rawDocument.sorts).reduce((acc, prop)=>{\n const { docs , orderedDocs , type } = rawDocument.sorts[prop];\n acc[prop] = {\n docs: new Map(Object.entries(docs).map(([k, v])=>[\n +k,\n v\n ])),\n orderedDocsToRemove: new Map(),\n orderedDocs,\n type\n };\n return acc;\n }, {});\n return {\n sharedInternalDocumentStore,\n language: rawDocument.language,\n sortableProperties: rawDocument.sortableProperties,\n sortablePropertiesWithTypes: rawDocument.sortablePropertiesWithTypes,\n sorts,\n enabled: true,\n isSorted: rawDocument.isSorted\n };\n}\nexport async function save(sorter) {\n if (!sorter.enabled) {\n return {\n enabled: false\n };\n }\n ensureOrderedDocsAreDeleted(sorter);\n ensureIsSorted(sorter);\n const sorts = Object.keys(sorter.sorts).reduce((acc, prop)=>{\n const { docs , orderedDocs , type } = sorter.sorts[prop];\n acc[prop] = {\n docs: Object.fromEntries(docs.entries()),\n orderedDocs,\n type\n };\n return acc;\n }, {});\n return {\n language: sorter.language,\n sortableProperties: sorter.sortableProperties,\n sortablePropertiesWithTypes: sorter.sortablePropertiesWithTypes,\n sorts,\n enabled: sorter.enabled,\n isSorted: sorter.isSorted\n };\n}\nexport async function createSorter() {\n return {\n create,\n insert,\n remove,\n save,\n load,\n sortBy,\n getSortableProperties,\n getSortablePropertiesWithTypes\n };\n}\n\n//# sourceMappingURL=sorter.js.map","const DIACRITICS_CHARCODE_START = 192;\nconst DIACRITICS_CHARCODE_END = 383;\nconst CHARCODE_REPLACE_MAPPING = [\n 65,\n 65,\n 65,\n 65,\n 65,\n 65,\n 65,\n 67,\n 69,\n 69,\n 69,\n 69,\n 73,\n 73,\n 73,\n 73,\n 69,\n 78,\n 79,\n 79,\n 79,\n 79,\n 79,\n null,\n 79,\n 85,\n 85,\n 85,\n 85,\n 89,\n 80,\n 115,\n 97,\n 97,\n 97,\n 97,\n 97,\n 97,\n 97,\n 99,\n 101,\n 101,\n 101,\n 101,\n 105,\n 105,\n 105,\n 105,\n 101,\n 110,\n 111,\n 111,\n 111,\n 111,\n 111,\n null,\n 111,\n 117,\n 117,\n 117,\n 117,\n 121,\n 112,\n 121,\n 65,\n 97,\n 65,\n 97,\n 65,\n 97,\n 67,\n 99,\n 67,\n 99,\n 67,\n 99,\n 67,\n 99,\n 68,\n 100,\n 68,\n 100,\n 69,\n 101,\n 69,\n 101,\n 69,\n 101,\n 69,\n 101,\n 69,\n 101,\n 71,\n 103,\n 71,\n 103,\n 71,\n 103,\n 71,\n 103,\n 72,\n 104,\n 72,\n 104,\n 73,\n 105,\n 73,\n 105,\n 73,\n 105,\n 73,\n 105,\n 73,\n 105,\n 73,\n 105,\n 74,\n 106,\n 75,\n 107,\n 107,\n 76,\n 108,\n 76,\n 108,\n 76,\n 108,\n 76,\n 108,\n 76,\n 108,\n 78,\n 110,\n 78,\n 110,\n 78,\n 110,\n 110,\n 78,\n 110,\n 79,\n 111,\n 79,\n 111,\n 79,\n 111,\n 79,\n 111,\n 82,\n 114,\n 82,\n 114,\n 82,\n 114,\n 83,\n 115,\n 83,\n 115,\n 83,\n 115,\n 83,\n 115,\n 84,\n 116,\n 84,\n 116,\n 84,\n 116,\n 85,\n 117,\n 85,\n 117,\n 85,\n 117,\n 85,\n 117,\n 85,\n 117,\n 85,\n 117,\n 87,\n 119,\n 89,\n 121,\n 89,\n 90,\n 122,\n 90,\n 122,\n 90,\n 122,\n 115\n];\nfunction replaceChar(charCode) {\n if (charCode < DIACRITICS_CHARCODE_START || charCode > DIACRITICS_CHARCODE_END) return charCode;\n /* c8 ignore next */ return CHARCODE_REPLACE_MAPPING[charCode - DIACRITICS_CHARCODE_START] || charCode;\n}\nexport function replaceDiacritics(str) {\n const stringCharCode = [];\n for(let idx = 0; idx < str.length; idx++){\n stringCharCode[idx] = replaceChar(str.charCodeAt(idx));\n }\n return String.fromCharCode(...stringCharCode);\n}\n\n//# sourceMappingURL=diacritics.js.map","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nconst step2List = {\n ational: 'ate',\n tional: 'tion',\n enci: 'ence',\n anci: 'ance',\n izer: 'ize',\n bli: 'ble',\n alli: 'al',\n entli: 'ent',\n eli: 'e',\n ousli: 'ous',\n ization: 'ize',\n ation: 'ate',\n ator: 'ate',\n alism: 'al',\n iveness: 'ive',\n fulness: 'ful',\n ousness: 'ous',\n aliti: 'al',\n iviti: 'ive',\n biliti: 'ble',\n logi: 'log'\n};\nconst step3List = {\n icate: 'ic',\n ative: '',\n alize: 'al',\n iciti: 'ic',\n ical: 'ic',\n ful: '',\n ness: ''\n};\n// Consonant\nconst c = '[^aeiou]';\n// Vowel\nconst v = '[aeiouy]';\n// Consonant sequence\nconst C = c + '[^aeiouy]*';\n// Vowel sequence\nconst V = v + '[aeiou]*';\n// [C]VC... is m>0\nconst mgr0 = '^(' + C + ')?' + V + C;\n// [C]VC[V] is m=1\nconst meq1 = '^(' + C + ')?' + V + C + '(' + V + ')?$';\n// [C]VCVC... is m>1\nconst mgr1 = '^(' + C + ')?' + V + C + V + C;\n// vowel in stem\nconst s_v = '^(' + C + ')?' + v;\nexport function stemmer(w) {\n let stem;\n let suffix;\n let re;\n let re2;\n let re3;\n let re4;\n if (w.length < 3) {\n return w;\n }\n const firstch = w.substring(0, 1);\n if (firstch == 'y') {\n w = firstch.toUpperCase() + w.substring(1);\n }\n re = /^(.+?)(ss|i)es$/;\n re2 = /^(.+?)([^s])s$/;\n if (re.test(w)) {\n w = w.replace(re, '$1$2');\n } else if (re2.test(w)) {\n w = w.replace(re2, '$1$2');\n }\n re = /^(.+?)eed$/;\n re2 = /^(.+?)(ed|ing)$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n re = new RegExp(mgr0);\n if (re.test(fp[1])) {\n re = /.$/;\n w = w.replace(re, '');\n }\n } else if (re2.test(w)) {\n const fp = re2.exec(w);\n stem = fp[1];\n re2 = new RegExp(s_v);\n if (re2.test(stem)) {\n w = stem;\n re2 = /(at|bl|iz)$/;\n re3 = new RegExp('([^aeiouylsz])\\\\1$');\n re4 = new RegExp('^' + C + v + '[^aeiouwxy]$');\n if (re2.test(w)) {\n w = w + 'e';\n } else if (re3.test(w)) {\n re = /.$/;\n w = w.replace(re, '');\n } else if (re4.test(w)) {\n w = w + 'e';\n }\n }\n }\n re = /^(.+?)y$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n stem = fp === null || fp === void 0 ? void 0 : fp[1];\n re = new RegExp(s_v);\n if (stem && re.test(stem)) {\n w = stem + 'i';\n }\n }\n re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n stem = fp === null || fp === void 0 ? void 0 : fp[1];\n suffix = fp === null || fp === void 0 ? void 0 : fp[2];\n re = new RegExp(mgr0);\n if (stem && re.test(stem)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n w = stem + step2List[suffix];\n }\n }\n re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n stem = fp === null || fp === void 0 ? void 0 : fp[1];\n suffix = fp === null || fp === void 0 ? void 0 : fp[2];\n re = new RegExp(mgr0);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (stem && re.test(stem)) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n w = stem + step3List[suffix];\n }\n }\n re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n re2 = /^(.+?)(s|t)(ion)$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n stem = fp === null || fp === void 0 ? void 0 : fp[1];\n re = new RegExp(mgr1);\n if (stem && re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n const fp = re2.exec(w);\n stem = (fp === null || fp === void 0 ? void 0 : fp[1]) ?? '' + (fp === null || fp === void 0 ? void 0 : fp[2]) ?? '';\n re2 = new RegExp(mgr1);\n if (re2.test(stem)) {\n w = stem;\n }\n }\n re = /^(.+?)e$/;\n if (re.test(w)) {\n const fp = re.exec(w);\n stem = fp === null || fp === void 0 ? void 0 : fp[1];\n re = new RegExp(mgr1);\n re2 = new RegExp(meq1);\n re3 = new RegExp('^' + C + v + '[^aeiouwxy]$');\n if (stem && (re.test(stem) || re2.test(stem) && !re3.test(stem))) {\n w = stem;\n }\n }\n re = /ll$/;\n re2 = new RegExp(mgr1);\n if (re.test(w) && re2.test(w)) {\n re = /.$/;\n w = w.replace(re, '');\n }\n if (firstch == 'y') {\n w = firstch.toLowerCase() + w.substring(1);\n }\n return w;\n}\n\n//# sourceMappingURL=english-stemmer.js.map","import { createError } from '../../errors.js';\nimport { replaceDiacritics } from './diacritics.js';\nimport { SPLITTERS, SUPPORTED_LANGUAGES } from './languages.js';\nimport { stemmer as english } from './english-stemmer.js';\nexport function normalizeToken(prop, token) {\n var _this_stopWords;\n const key = `${this.language}:${prop}:${token}`;\n if (this.normalizationCache.has(key)) {\n return this.normalizationCache.get(key);\n }\n // Remove stopwords if enabled\n if ((_this_stopWords = this.stopWords) === null || _this_stopWords === void 0 ? void 0 : _this_stopWords.includes(token)) {\n this.normalizationCache.set(key, '');\n return '';\n }\n // Apply stemming if enabled\n if (this.stemmer && !this.stemmerSkipProperties.has(prop)) {\n token = this.stemmer(token);\n }\n token = replaceDiacritics(token);\n this.normalizationCache.set(key, token);\n return token;\n}\n/* c8 ignore next 10 */ function trim(text) {\n while(text[text.length - 1] === ''){\n text.pop();\n }\n while(text[0] === ''){\n text.shift();\n }\n return text;\n}\nfunction tokenize(input, language, prop) {\n if (language && language !== this.language) {\n throw createError('LANGUAGE_NOT_SUPPORTED', language);\n }\n /* c8 ignore next 3 */ if (typeof input !== 'string') {\n return [\n input\n ];\n }\n let tokens;\n if (prop && this.tokenizeSkipProperties.has(prop)) {\n tokens = [\n this.normalizeToken.bind(this, prop ?? '')(input)\n ];\n } else {\n const splitRule = SPLITTERS[this.language];\n tokens = input.toLowerCase().split(splitRule).map(this.normalizeToken.bind(this, prop ?? '')).filter(Boolean);\n }\n const trimTokens = trim(tokens);\n if (!this.allowDuplicates) {\n return Array.from(new Set(trimTokens));\n }\n return trimTokens;\n}\nexport async function createTokenizer(config = {}) {\n if (!config.language) {\n config.language = 'english';\n } else if (!SUPPORTED_LANGUAGES.includes(config.language)) {\n throw createError('LANGUAGE_NOT_SUPPORTED', config.language);\n }\n // Handle stemming - It is disabled by default\n let stemmer;\n if (config.stemming || config.stemmer && !('stemming' in config)) {\n if (config.stemmer) {\n if (typeof config.stemmer !== 'function') {\n throw createError('INVALID_STEMMER_FUNCTION_TYPE');\n }\n stemmer = config.stemmer;\n } else {\n if (config.language === 'english') {\n stemmer = english;\n } else {\n throw createError('MISSING_STEMMER', config.language);\n }\n }\n }\n // Handle stopwords\n let stopWords;\n if (config.stopWords !== false) {\n stopWords = [];\n if (Array.isArray(config.stopWords)) {\n stopWords = config.stopWords;\n } else if (typeof config.stopWords === 'function') {\n stopWords = await config.stopWords(stopWords);\n } else if (config.stopWords) {\n throw createError('CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY');\n }\n // Make sure stopWords is just an array of strings\n if (!Array.isArray(stopWords)) {\n throw createError('CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY');\n }\n for (const s of stopWords){\n if (typeof s !== 'string') {\n throw createError('CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY');\n }\n }\n }\n // Create the tokenizer\n const tokenizer = {\n tokenize,\n language: config.language,\n stemmer,\n stemmerSkipProperties: new Set(config.stemmerSkipProperties ? [\n config.stemmerSkipProperties\n ].flat() : []),\n tokenizeSkipProperties: new Set(config.tokenizeSkipProperties ? [\n config.tokenizeSkipProperties\n ].flat() : []),\n stopWords,\n allowDuplicates: Boolean(config.allowDuplicates),\n normalizeToken,\n normalizationCache: new Map()\n };\n tokenizer.tokenize = tokenize.bind(tokenizer);\n tokenizer.normalizeToken = normalizeToken;\n return tokenizer;\n}\n\n//# sourceMappingURL=index.js.map","import { formatElapsedTime, getDocumentIndexId, getDocumentProperties, validateSchema } from '../components/defaults.js';\nimport { createDocumentsStore } from '../components/documents-store.js';\nimport { AVAILABLE_PLUGIN_HOOKS, getAllPluginsByHook } from '../components/plugins.js';\nimport { FUNCTION_COMPONENTS, OBJECT_COMPONENTS, runAfterCreate } from '../components/hooks.js';\nimport { createIndex } from '../components/index.js';\nimport { createInternalDocumentIDStore } from '../components/internal-document-id-store.js';\nimport { createSorter } from '../components/sorter.js';\nimport { createTokenizer } from '../components/tokenizer/index.js';\nimport { createError } from '../errors.js';\nimport { uniqueId } from '../utils.js';\nfunction validateComponents(components) {\n const defaultComponents = {\n formatElapsedTime,\n getDocumentIndexId,\n getDocumentProperties,\n validateSchema\n };\n for (const rawKey of FUNCTION_COMPONENTS){\n const key = rawKey;\n if (components[key]) {\n if (typeof components[key] !== 'function') {\n throw createError('COMPONENT_MUST_BE_FUNCTION', key);\n }\n } else {\n // @ts-expect-error TSC is unable to resolve this\n components[key] = defaultComponents[key];\n }\n }\n for (const rawKey of Object.keys(components)){\n if (!OBJECT_COMPONENTS.includes(rawKey) && !FUNCTION_COMPONENTS.includes(rawKey)) {\n throw createError('UNSUPPORTED_COMPONENT', rawKey);\n }\n }\n}\nexport async function create({ schema , sort , language , components , id , plugins }) {\n if (!components) {\n components = {};\n }\n if (!id) {\n id = await uniqueId();\n }\n let tokenizer = components.tokenizer;\n let index = components.index;\n let documentsStore = components.documentsStore;\n let sorter = components.sorter;\n if (!tokenizer) {\n // Use the default tokenizer\n tokenizer = await createTokenizer({\n language: language ?? 'english'\n });\n } else if (!tokenizer.tokenize) {\n // If there is no tokenizer function, we assume this is a TokenizerConfig\n tokenizer = await createTokenizer(tokenizer);\n } else {\n const customTokenizer = tokenizer;\n tokenizer = customTokenizer;\n }\n if (components.tokenizer && language) {\n // Accept language only if a tokenizer is not provided\n throw createError('NO_LANGUAGE_WITH_CUSTOM_TOKENIZER');\n }\n const internalDocumentStore = createInternalDocumentIDStore();\n index ||= await createIndex();\n sorter ||= await createSorter();\n documentsStore ||= await createDocumentsStore();\n // Validate all other components\n validateComponents(components);\n // Assign only recognized components and hooks\n const { getDocumentProperties , getDocumentIndexId , validateSchema , formatElapsedTime } = components;\n const orama = {\n data: {},\n caches: {},\n schema,\n tokenizer,\n index,\n sorter,\n documentsStore,\n internalDocumentIDStore: internalDocumentStore,\n getDocumentProperties,\n getDocumentIndexId,\n validateSchema,\n beforeInsert: [],\n afterInsert: [],\n beforeRemove: [],\n afterRemove: [],\n beforeUpdate: [],\n afterUpdate: [],\n beforeSearch: [],\n afterSearch: [],\n beforeInsertMultiple: [],\n afterInsertMultiple: [],\n beforeRemoveMultiple: [],\n afterRemoveMultiple: [],\n afterUpdateMultiple: [],\n beforeUpdateMultiple: [],\n afterCreate: [],\n formatElapsedTime,\n id,\n plugins,\n version: getVersion()\n };\n orama.data = {\n index: await orama.index.create(orama, internalDocumentStore, schema),\n docs: await orama.documentsStore.create(orama, internalDocumentStore),\n sorting: await orama.sorter.create(orama, internalDocumentStore, schema, sort)\n };\n for (const hook of AVAILABLE_PLUGIN_HOOKS){\n orama[hook] = (orama[hook] ?? []).concat(await getAllPluginsByHook(orama, hook));\n }\n const afterCreate = orama['afterCreate'];\n if (afterCreate) {\n await runAfterCreate(afterCreate, orama);\n }\n return orama;\n}\nfunction getVersion() {\n return '2.0.17';\n}\n\n//# sourceMappingURL=create.js.map","export const kInsertions = Symbol('orama.insertions');\nexport const kRemovals = Symbol('orama.removals');\n\n//# sourceMappingURL=types.js.map","var _globalThis_process;\nimport { kInsertions, kRemovals } from '../types.js';\n// Web platforms don't have process. React-Native doesn't have process.emitWarning.\nconst warn = ((_globalThis_process = globalThis.process) === null || _globalThis_process === void 0 ? void 0 : _globalThis_process.emitWarning) ?? function emitWarning(message, options) {\n console.warn(`[WARNING] [${options.code}] ${message}`);\n};\nexport function trackInsertion(orama) {\n if (typeof orama[kInsertions] !== 'number') {\n queueMicrotask(()=>{\n orama[kInsertions] = undefined;\n });\n orama[kInsertions] = 0;\n }\n if (orama[kInsertions] > 1000) {\n warn(\"Orama's insert operation is synchronous. Please avoid inserting a large number of document in a single operation in order not to block the main thread or, in alternative, please use insertMultiple.\", {\n code: 'ORAMA0001'\n });\n orama[kInsertions] = -1;\n } else if (orama[kInsertions] >= 0) {\n orama[kInsertions]++;\n }\n}\nexport function trackRemoval(orama) {\n if (typeof orama[kRemovals] !== 'number') {\n queueMicrotask(()=>{\n orama[kRemovals] = undefined;\n });\n orama[kRemovals] = 0;\n }\n if (orama[kRemovals] > 1000) {\n warn(\"Orama's remove operation is synchronous. Please avoid removing a large number of document in a single operation in order not to block the main thread, in alternative, please use updateMultiple.\", {\n code: 'ORAMA0002'\n });\n orama[kRemovals] = -1;\n } else if (orama[kRemovals] >= 0) {\n orama[kRemovals]++;\n }\n}\n\n//# sourceMappingURL=sync-blocking-checker.js.map","import { isArrayType, isGeoPointType, isVectorType } from '../components.js';\nimport { runMultipleHook, runSingleHook } from '../components/hooks.js';\nimport { trackInsertion } from '../components/sync-blocking-checker.js';\nimport { createError } from '../errors.js';\nexport async function insert(orama, doc, language, skipHooks) {\n const errorProperty = await orama.validateSchema(doc, orama.schema);\n if (errorProperty) {\n throw createError('SCHEMA_VALIDATION_FAILURE', errorProperty);\n }\n return innerInsert(orama, doc, language, skipHooks);\n}\nconst ENUM_TYPE = new Set([\n 'enum',\n 'enum[]'\n]);\nconst STRING_NUMBER_TYPE = new Set([\n 'string',\n 'number'\n]);\nasync function innerInsert(orama, doc, language, skipHooks) {\n const { index , docs } = orama.data;\n const id = await orama.getDocumentIndexId(doc);\n if (typeof id !== 'string') {\n throw createError('DOCUMENT_ID_MUST_BE_STRING', typeof id);\n }\n if (!await orama.documentsStore.store(docs, id, doc)) {\n throw createError('DOCUMENT_ALREADY_EXISTS', id);\n }\n const docsCount = await orama.documentsStore.count(docs);\n if (!skipHooks) {\n await runSingleHook(orama.beforeInsert, orama, id, doc);\n }\n const indexableProperties = await orama.index.getSearchableProperties(index);\n const indexablePropertiesWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);\n const indexableValues = await orama.getDocumentProperties(doc, indexableProperties);\n for (const [key, value] of Object.entries(indexableValues)){\n if (typeof value === 'undefined') {\n continue;\n }\n const actualType = typeof value;\n const expectedType = indexablePropertiesWithTypes[key];\n if (isGeoPointType(expectedType) && typeof value === 'object' && typeof value.lon === 'number' && typeof value.lat === 'number') {\n continue;\n }\n if (isVectorType(expectedType) && Array.isArray(value)) {\n continue;\n }\n if (isArrayType(expectedType) && Array.isArray(value)) {\n continue;\n }\n if (ENUM_TYPE.has(expectedType) && STRING_NUMBER_TYPE.has(actualType)) {\n continue;\n }\n if (actualType !== expectedType) {\n throw createError('INVALID_DOCUMENT_PROPERTY', key, expectedType, actualType);\n }\n }\n for (const prop of indexableProperties){\n var _orama_index, _orama_index_beforeInsert, _orama_index1, _orama_index_afterInsert;\n const value = indexableValues[prop];\n if (typeof value === 'undefined') {\n continue;\n }\n const expectedType = indexablePropertiesWithTypes[prop];\n await ((_orama_index_beforeInsert = (_orama_index = orama.index).beforeInsert) === null || _orama_index_beforeInsert === void 0 ? void 0 : _orama_index_beforeInsert.call(_orama_index, orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount));\n await orama.index.insert(orama.index, orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount);\n await ((_orama_index_afterInsert = (_orama_index1 = orama.index).afterInsert) === null || _orama_index_afterInsert === void 0 ? void 0 : _orama_index_afterInsert.call(_orama_index1, orama.data.index, prop, id, value, expectedType, language, orama.tokenizer, docsCount));\n }\n const sortableProperties = await orama.sorter.getSortableProperties(orama.data.sorting);\n const sortablePropertiesWithTypes = await orama.sorter.getSortablePropertiesWithTypes(orama.data.sorting);\n const sortableValues = await orama.getDocumentProperties(doc, sortableProperties);\n for (const prop of sortableProperties){\n const value = sortableValues[prop];\n if (typeof value === 'undefined') {\n continue;\n }\n const expectedType = sortablePropertiesWithTypes[prop];\n await orama.sorter.insert(orama.data.sorting, prop, id, value, expectedType, language);\n }\n if (!skipHooks) {\n await runSingleHook(orama.afterInsert, orama, id, doc);\n }\n trackInsertion(orama);\n return id;\n}\nexport async function insertMultiple(orama, docs, batchSize, language, skipHooks, timeout) {\n if (!skipHooks) {\n await runMultipleHook(orama.beforeInsertMultiple, orama, docs);\n }\n // Validate all documents before the insertion\n const docsLength = docs.length;\n const oramaSchema = orama.schema;\n for(let i = 0; i < docsLength; i++){\n const errorProperty = await orama.validateSchema(docs[i], oramaSchema);\n if (errorProperty) {\n throw createError('SCHEMA_VALIDATION_FAILURE', errorProperty);\n }\n }\n return innerInsertMultiple(orama, docs, batchSize, language, skipHooks, timeout);\n}\nexport async function innerInsertMultiple(orama, docs, batchSize, language, skipHooks, timeout) {\n if (!batchSize) {\n batchSize = 1000;\n }\n timeout ??= 0;\n const ids = [];\n await new Promise((resolve, reject)=>{\n let i = 0;\n async function _insertMultiple() {\n const batch = docs.slice(i * batchSize, ++i * batchSize);\n if (!batch.length) {\n return resolve();\n }\n for (const doc of batch){\n try {\n const id = await insert(orama, doc, language, skipHooks);\n ids.push(id);\n } catch (err) {\n reject(err);\n }\n }\n setTimeout(_insertMultiple, timeout);\n }\n setTimeout(_insertMultiple, timeout);\n });\n if (!skipHooks) {\n await runMultipleHook(orama.afterInsertMultiple, orama, docs);\n }\n return ids;\n}\n\n//# sourceMappingURL=insert.js.map","export const MODE_FULLTEXT_SEARCH = 'fulltext';\nexport const MODE_HYBRID_SEARCH = 'hybrid';\nexport const MODE_VECTOR_SEARCH = 'vector';\n\n//# sourceMappingURL=constants.js.map","export function intersectFilteredIDs(filtered, lookedUp) {\n const map = new Map();\n const result = [];\n for (const id of filtered){\n map.set(id, true);\n }\n for (const looked of lookedUp){\n const [id] = looked;\n if (map.has(id)) {\n result.push(looked);\n map.delete(id);\n }\n }\n return result;\n}\n\n//# sourceMappingURL=filters.js.map","import { createError } from '../errors.js';\nimport { getNested } from '../utils.js';\nfunction sortAsc(a, b) {\n return a[1] - b[1];\n}\nfunction sortDesc(a, b) {\n return b[1] - a[1];\n}\nfunction sortingPredicateBuilder(order = 'desc') {\n return order.toLowerCase() === 'asc' ? sortAsc : sortDesc;\n}\nexport async function getFacets(orama, results, facetsConfig) {\n const facets = {};\n const allIDs = results.map(([id])=>id);\n const allDocs = await orama.documentsStore.getMultiple(orama.data.docs, allIDs);\n const facetKeys = Object.keys(facetsConfig);\n const properties = await orama.index.getSearchablePropertiesWithTypes(orama.data.index);\n for (const facet of facetKeys){\n let values;\n // Hack to guarantee the same order of ranges as specified by the user\n // TODO: Revisit this once components land\n if (properties[facet] === 'number') {\n const { ranges } = facetsConfig[facet];\n const rangesLength = ranges.length;\n const tmp = Array.from({\n length: rangesLength\n });\n for(let i = 0; i < rangesLength; i++){\n const range = ranges[i];\n tmp[i] = [\n `${range.from}-${range.to}`,\n 0\n ];\n }\n values = Object.fromEntries(tmp);\n }\n facets[facet] = {\n count: 0,\n values: values ?? {}\n };\n }\n const allDocsLength = allDocs.length;\n for(let i = 0; i < allDocsLength; i++){\n const doc = allDocs[i];\n for (const facet of facetKeys){\n const facetValue = facet.includes('.') ? await getNested(doc, facet) : doc[facet];\n const propertyType = properties[facet];\n const facetValues = facets[facet].values;\n switch(propertyType){\n case 'number':\n {\n const ranges = facetsConfig[facet].ranges;\n calculateNumberFacetBuilder(ranges, facetValues)(facetValue);\n break;\n }\n case 'number[]':\n {\n const alreadyInsertedValues = new Set();\n const ranges = facetsConfig[facet].ranges;\n const calculateNumberFacet = calculateNumberFacetBuilder(ranges, facetValues, alreadyInsertedValues);\n for (const v of facetValue){\n calculateNumberFacet(v);\n }\n break;\n }\n case 'boolean':\n case 'enum':\n case 'string':\n {\n calculateBooleanStringOrEnumFacetBuilder(facetValues, propertyType)(facetValue);\n break;\n }\n case 'boolean[]':\n case 'enum[]':\n case 'string[]':\n {\n const alreadyInsertedValues = new Set();\n const innerType = propertyType === 'boolean[]' ? 'boolean' : 'string';\n const calculateBooleanStringOrEnumFacet = calculateBooleanStringOrEnumFacetBuilder(facetValues, innerType, alreadyInsertedValues);\n for (const v of facetValue){\n calculateBooleanStringOrEnumFacet(v);\n }\n break;\n }\n default:\n throw createError('FACET_NOT_SUPPORTED', propertyType);\n }\n }\n }\n // TODO: We are looping again with the same previous keys, should we creat a single loop instead?\n for (const facet of facetKeys){\n const currentFacet = facets[facet];\n // Count the number of values for each facet\n currentFacet.count = Object.keys(currentFacet.values).length;\n // Sort only string-based facets\n if (properties[facet] === 'string') {\n const stringFacetDefinition = facetsConfig[facet];\n const sortingPredicate = sortingPredicateBuilder(stringFacetDefinition.sort);\n currentFacet.values = Object.fromEntries(Object.entries(currentFacet.values).sort(sortingPredicate).slice(stringFacetDefinition.offset ?? 0, stringFacetDefinition.limit ?? 10));\n }\n }\n return facets;\n}\nfunction calculateNumberFacetBuilder(ranges, values, alreadyInsertedValues) {\n return (facetValue)=>{\n for (const range of ranges){\n const value = `${range.from}-${range.to}`;\n if (alreadyInsertedValues === null || alreadyInsertedValues === void 0 ? void 0 : alreadyInsertedValues.has(value)) {\n continue;\n }\n if (facetValue >= range.from && facetValue <= range.to) {\n if (values[value] === undefined) {\n values[value] = 1;\n } else {\n values[value]++;\n alreadyInsertedValues === null || alreadyInsertedValues === void 0 ? void 0 : alreadyInsertedValues.add(value);\n }\n }\n }\n };\n}\nfunction calculateBooleanStringOrEnumFacetBuilder(values, propertyType, alreadyInsertedValues) {\n const defaultValue = propertyType === 'boolean' ? 'false' : '';\n return (facetValue)=>{\n // String or boolean based facets\n const value = (facetValue === null || facetValue === void 0 ? void 0 : facetValue.toString()) ?? defaultValue;\n if (alreadyInsertedValues === null || alreadyInsertedValues === void 0 ? void 0 : alreadyInsertedValues.has(value)) {\n return;\n }\n values[value] = (values[value] ?? 0) + 1;\n alreadyInsertedValues === null || alreadyInsertedValues === void 0 ? void 0 : alreadyInsertedValues.add(value);\n };\n}\n\n//# sourceMappingURL=facets.js.map","import { createError } from '../errors.js';\nimport { getNested, intersect, safeArrayPush } from '../utils.js';\nimport { getDocumentIdFromInternalId } from './internal-document-id-store.js';\nconst DEFAULT_REDUCE = {\n reducer: (_, acc, res, index)=>{\n acc[index] = res;\n return acc;\n },\n getInitialValue: (length)=>Array.from({\n length\n })\n};\nconst ALLOWED_TYPES = [\n 'string',\n 'number',\n 'boolean'\n];\nexport async function getGroups(orama, results, groupBy) {\n const properties = groupBy.properties;\n const propertiesLength = properties.length;\n const schemaProperties = await orama.index.getSearchablePropertiesWithTypes(orama.data.index);\n for(let i = 0; i < propertiesLength; i++){\n const property = properties[i];\n if (typeof schemaProperties[property] === 'undefined') {\n throw createError('UNKNOWN_GROUP_BY_PROPERTY', property);\n }\n if (!ALLOWED_TYPES.includes(schemaProperties[property])) {\n throw createError('INVALID_GROUP_BY_PROPERTY', property, ALLOWED_TYPES.join(', '), schemaProperties[property]);\n }\n }\n const allIDs = results.map(([id])=>getDocumentIdFromInternalId(orama.internalDocumentIDStore, id));\n // allDocs is already sorted by the sortBy algorithm\n // We leverage on that to limit the number of documents returned\n const allDocs = await orama.documentsStore.getMultiple(orama.data.docs, allIDs);\n const allDocsLength = allDocs.length;\n const returnedCount = groupBy.maxResult || Number.MAX_SAFE_INTEGER;\n const listOfValues = [];\n // We want to understand which documents have which values\n // and group them by the property and values\n const g = {};\n for(let i = 0; i < propertiesLength; i++){\n const groupByKey = properties[i];\n const group = {\n property: groupByKey,\n perValue: {}\n };\n const values = new Set();\n for(let j = 0; j < allDocsLength; j++){\n const doc = allDocs[j];\n const value = await getNested(doc, groupByKey);\n // we don't want to consider undefined values\n if (typeof value === 'undefined') {\n continue;\n }\n const keyValue = typeof value !== 'boolean' ? value : '' + value;\n const perValue = group.perValue[keyValue] ?? {\n indexes: [],\n count: 0\n };\n if (perValue.count >= returnedCount) {\n continue;\n }\n // We use the index to keep track of the original order\n perValue.indexes.push(j);\n perValue.count++;\n group.perValue[keyValue] = perValue;\n values.add(value);\n }\n listOfValues.push(Array.from(values));\n g[groupByKey] = group;\n }\n const combinations = calculateCombination(listOfValues);\n const combinationsLength = combinations.length;\n const groups = [];\n for(let i = 0; i < combinationsLength; i++){\n const combination = combinations[i];\n const combinationLength = combination.length;\n const group = {\n values: [],\n indexes: []\n };\n const indexes = [];\n for(let j = 0; j < combinationLength; j++){\n const value = combination[j];\n const property = properties[j];\n indexes.push(g[property].perValue[typeof value !== 'boolean' ? value : '' + value].indexes);\n group.values.push(value);\n }\n // We leverage on the index to sort the results by the original order\n group.indexes = intersect(indexes).sort((a, b)=>a - b);\n // don't generate empty groups\n if (group.indexes.length === 0) {\n continue;\n }\n groups.push(group);\n }\n const groupsLength = groups.length;\n const res = Array.from({\n length: groupsLength\n });\n for(let i = 0; i < groupsLength; i++){\n const group = groups[i];\n const reduce = groupBy.reduce || DEFAULT_REDUCE;\n const docs = group.indexes.map((index)=>{\n return {\n id: allIDs[index],\n score: results[index][1],\n document: allDocs[index]\n };\n });\n const func = reduce.reducer.bind(null, group.values);\n const initialValue = reduce.getInitialValue(group.indexes.length);\n const aggregationValue = docs.reduce(func, initialValue);\n res[i] = {\n values: group.values,\n result: aggregationValue\n };\n }\n return res;\n}\nfunction calculateCombination(arrs, index = 0) {\n if (index + 1 === arrs.length) return arrs[index].map((item)=>[\n item\n ]);\n const head = arrs[index];\n const c = calculateCombination(arrs, index + 1);\n const combinations = [];\n for (const value of head){\n for (const combination of c){\n const result = [\n value\n ];\n safeArrayPush(result, combination);\n combinations.push(result);\n }\n }\n return combinations;\n}\n\n//# sourceMappingURL=groups.js.map","import { getInternalDocumentId } from '../components/internal-document-id-store.js';\nimport { getNanosecondsTime, removeVectorsFromHits, safeArrayPush, sortTokenScorePredicate } from '../utils.js';\nimport { intersectFilteredIDs } from '../components/filters.js';\nimport { prioritizeTokenScores } from '../components/algorithms.js';\nimport { createError } from '../errors.js';\nimport { createSearchContext, defaultBM25Params, fetchDocumentsWithDistinct, fetchDocuments } from './search.js';\nimport { getFacets } from '../components/facets.js';\nimport { getGroups } from '../components/groups.js';\nimport { runBeforeSearch, runAfterSearch } from '../components/hooks.js';\nexport async function fullTextSearch(orama, params, language) {\n const timeStart = await getNanosecondsTime();\n if (orama.beforeSearch) {\n await runBeforeSearch(orama.beforeSearch, orama, params, language);\n }\n params.relevance = Object.assign(defaultBM25Params, params.relevance ?? {});\n const vectorProperties = Object.keys(orama.data.index.vectorIndexes);\n const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;\n const { limit =10 , offset =0 , term , properties , threshold =1 , distinctOn , includeVectors =false } = params;\n const isPreflight = params.preflight === true;\n const { index , docs } = orama.data;\n const tokens = await orama.tokenizer.tokenize(term ?? '', language);\n // Get searchable string properties\n let propertiesToSearch = orama.caches['propertiesToSearch'];\n if (!propertiesToSearch) {\n const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);\n propertiesToSearch = await orama.index.getSearchableProperties(index);\n propertiesToSearch = propertiesToSearch.filter((prop)=>propertiesToSearchWithTypes[prop].startsWith('string'));\n orama.caches['propertiesToSearch'] = propertiesToSearch;\n }\n if (properties && properties !== '*') {\n for (const prop of properties){\n if (!propertiesToSearch.includes(prop)) {\n throw createError('UNKNOWN_INDEX', prop, propertiesToSearch.join(', '));\n }\n }\n propertiesToSearch = propertiesToSearch.filter((prop)=>properties.includes(prop));\n }\n // Create the search context and the results\n const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);\n // If filters are enabled, we need to get the IDs of the documents that match the filters.\n const hasFilters = Object.keys(params.where ?? {}).length > 0;\n let whereFiltersIDs = [];\n if (hasFilters) {\n whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);\n }\n const tokensLength = tokens.length;\n if (tokensLength || properties && properties.length > 0) {\n // Now it's time to loop over all the indices and get the documents IDs for every single term\n const indexesLength = propertiesToSearch.length;\n for(let i = 0; i < indexesLength; i++){\n var _params_boost;\n const prop = propertiesToSearch[i];\n if (tokensLength !== 0) {\n for(let j = 0; j < tokensLength; j++){\n const term = tokens[j];\n // Lookup\n const scoreList = await orama.index.search(context, index, prop, term);\n safeArrayPush(context.indexMap[prop][term], scoreList);\n }\n } else {\n context.indexMap[prop][''] = [];\n const scoreList = await orama.index.search(context, index, prop, '');\n safeArrayPush(context.indexMap[prop][''], scoreList);\n }\n const docIds = context.indexMap[prop];\n const vals = Object.values(docIds);\n context.docsIntersection[prop] = prioritizeTokenScores(vals, (params === null || params === void 0 ? void 0 : (_params_boost = params.boost) === null || _params_boost === void 0 ? void 0 : _params_boost[prop]) ?? 1, threshold, tokensLength);\n const uniqueDocs = context.docsIntersection[prop];\n const uniqueDocsLength = uniqueDocs.length;\n for(let i = 0; i < uniqueDocsLength; i++){\n const [id, score] = uniqueDocs[i];\n const prevScore = context.uniqueDocsIDs[id];\n if (prevScore) {\n context.uniqueDocsIDs[id] = prevScore + score + 0.5;\n } else {\n context.uniqueDocsIDs[id] = score;\n }\n }\n }\n } else if (tokens.length === 0 && term) {\n // This case is hard to handle correctly.\n // For the time being, if tokenizer returns empty array but the term is not empty,\n // we returns an empty result set\n context.uniqueDocsIDs = {};\n } else {\n context.uniqueDocsIDs = Object.fromEntries(Object.keys(await orama.documentsStore.getAll(orama.data.docs)).map((k)=>[\n k,\n 0\n ]));\n }\n // Get unique doc IDs from uniqueDocsIDs map\n let uniqueDocsArray = Object.entries(context.uniqueDocsIDs).map(([id, score])=>[\n +id,\n score\n ]);\n // If filters are enabled, we need to remove the IDs of the documents that don't match the filters.\n if (hasFilters) {\n uniqueDocsArray = intersectFilteredIDs(whereFiltersIDs, uniqueDocsArray);\n }\n if (params.sortBy) {\n if (typeof params.sortBy === 'function') {\n const ids = uniqueDocsArray.map(([id])=>id);\n const docs = await orama.documentsStore.getMultiple(orama.data.docs, ids);\n const docsWithIdAndScore = docs.map((d, i)=>[\n uniqueDocsArray[i][0],\n uniqueDocsArray[i][1],\n d\n ]);\n docsWithIdAndScore.sort(params.sortBy);\n uniqueDocsArray = docsWithIdAndScore.map(([id, score])=>[\n id,\n score\n ]);\n } else {\n uniqueDocsArray = await orama.sorter.sortBy(orama.data.sorting, uniqueDocsArray, params.sortBy).then((results)=>results.map(([id, score])=>[\n getInternalDocumentId(orama.internalDocumentIDStore, id),\n score\n ]));\n }\n } else {\n uniqueDocsArray = uniqueDocsArray.sort(sortTokenScorePredicate);\n }\n let results;\n if (!isPreflight) {\n results = await (distinctOn ? fetchDocumentsWithDistinct(orama, uniqueDocsArray, offset, limit, distinctOn) : fetchDocuments(orama, uniqueDocsArray, offset, limit));\n }\n const searchResult = {\n elapsed: {\n formatted: '',\n raw: 0\n },\n // We keep the hits array empty if it's a preflight request.\n hits: [],\n count: uniqueDocsArray.length\n };\n if (typeof results !== 'undefined') {\n searchResult.hits = results.filter(Boolean);\n // Vectors can be very large, so we remove them from the result if not needed\n if (!includeVectors) {\n removeVectorsFromHits(searchResult, vectorProperties);\n }\n }\n if (shouldCalculateFacets) {\n // Populate facets if needed\n const facets = await getFacets(orama, uniqueDocsArray, params.facets);\n searchResult.facets = facets;\n }\n if (params.groupBy) {\n searchResult.groups = await getGroups(orama, uniqueDocsArray, params.groupBy);\n }\n if (orama.afterSearch) {\n await runAfterSearch(orama.afterSearch, orama, params, language, searchResult);\n }\n // Calculate elapsed time only at the end of the function\n searchResult.elapsed = await orama.formatElapsedTime(await getNanosecondsTime() - context.timeStart);\n return searchResult;\n}\n\n//# sourceMappingURL=search-fulltext.js.map","import { createSearchContext } from './search.js';\nimport { getNanosecondsTime, formatNanoseconds } from '../utils.js';\nimport { getFacets } from '../components/facets.js';\nimport { createError } from '../errors.js';\nimport { findSimilarVectors } from '../components/cosine-similarity.js';\nimport { intersectFilteredIDs } from '../components/filters.js';\nimport { getGroups } from '../components/groups.js';\nimport { getInternalDocumentId, getDocumentIdFromInternalId } from '../components/internal-document-id-store.js';\nimport { runBeforeSearch, runAfterSearch } from '../components/hooks.js';\nexport async function searchVector(orama, params, language = 'english') {\n const timeStart = await getNanosecondsTime();\n if (orama.beforeSearch) {\n await runBeforeSearch(orama.beforeSearch, orama, params, language);\n }\n const { vector } = params;\n if (vector && (!('value' in vector) || !('property' in vector))) {\n throw createError('INVALID_VECTOR_INPUT', Object.keys(vector).join(', '));\n }\n const { limit =10 , offset =0 , includeVectors =false } = params;\n const vectorIndex = orama.data.index.vectorIndexes[vector.property];\n const vectorSize = vectorIndex.size;\n const vectors = vectorIndex.vectors;\n const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;\n const hasFilters = Object.keys(params.where ?? {}).length > 0;\n const { index , docs: oramaDocs } = orama.data;\n if ((vector === null || vector === void 0 ? void 0 : vector.value.length) !== vectorSize) {\n // eslint-disable-next-line\n throw createError('INVALID_INPUT_VECTOR', vector === null || vector === void 0 ? void 0 : vector.property, vectorSize, vector === null || vector === void 0 ? void 0 : vector.value.length);\n }\n if (!(vector instanceof Float32Array)) {\n vector.value = new Float32Array(vector.value);\n }\n let results = findSimilarVectors(vector.value, vectors, vectorSize, params.similarity).map(([id, score])=>[\n getInternalDocumentId(orama.internalDocumentIDStore, id),\n score\n ]);\n let propertiesToSearch = orama.caches['propertiesToSearch'];\n if (!propertiesToSearch) {\n const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);\n propertiesToSearch = await orama.index.getSearchableProperties(index);\n propertiesToSearch = propertiesToSearch.filter((prop)=>propertiesToSearchWithTypes[prop].startsWith('string'));\n orama.caches['propertiesToSearch'] = propertiesToSearch;\n }\n const tokens = [];\n const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(oramaDocs), timeStart);\n let whereFiltersIDs = [];\n if (hasFilters) {\n whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);\n results = intersectFilteredIDs(whereFiltersIDs, results);\n }\n let facetsResults = [];\n if (shouldCalculateFacets) {\n // Populate facets if needed\n const facets = await getFacets(orama, results, params.facets);\n facetsResults = facets;\n }\n const docs = Array.from({\n length: limit\n });\n for(let i = 0; i < limit; i++){\n const result = results[i + offset];\n if (!result) {\n break;\n }\n const doc = orama.data.docs.docs[result[0]];\n if (doc) {\n if (!includeVectors) {\n doc[vector.property] = null;\n }\n const newDoc = {\n id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, result[0]),\n score: result[1],\n document: doc\n };\n docs[i] = newDoc;\n }\n }\n let groups = [];\n if (params.groupBy) {\n groups = await getGroups(orama, results, params.groupBy);\n }\n if (orama.afterSearch) {\n await runAfterSearch(orama.afterSearch, orama, params, language, results);\n }\n const timeEnd = await getNanosecondsTime();\n const elapsedTime = timeEnd - timeStart;\n return {\n count: results.length,\n hits: docs.filter(Boolean),\n elapsed: {\n raw: Number(elapsedTime),\n formatted: await formatNanoseconds(elapsedTime)\n },\n ...facetsResults ? {\n facets: facetsResults\n } : {},\n ...groups ? {\n groups\n } : {}\n };\n}\n\n//# sourceMappingURL=search-vector.js.map","import { getNanosecondsTime, safeArrayPush, formatNanoseconds, removeVectorsFromHits } from '../utils.js';\nimport { intersectFilteredIDs } from '../components/filters.js';\nimport { prioritizeTokenScores } from '../components/algorithms.js';\nimport { createError } from '../errors.js';\nimport { createSearchContext, defaultBM25Params } from './search.js';\nimport { getFacets } from '../components/facets.js';\nimport { getGroups } from '../components/groups.js';\nimport { findSimilarVectors } from '../components/cosine-similarity.js';\nimport { getInternalDocumentId } from '../components/internal-document-id-store.js';\nimport { fetchDocuments } from './search.js';\nimport { runBeforeSearch, runAfterSearch } from '../components/hooks.js';\nexport async function hybridSearch(orama, params, language) {\n const timeStart = await getNanosecondsTime();\n if (orama.beforeSearch) {\n await runBeforeSearch(orama.beforeSearch, orama, params, language);\n }\n const { offset =0 , limit =10 , includeVectors =false } = params;\n const shouldCalculateFacets = params.facets && Object.keys(params.facets).length > 0;\n const [fullTextIDs, vectorIDs] = await Promise.all([\n getFullTextSearchIDs(orama, params, language),\n getVectorSearchIDs(orama, params)\n ]);\n const { index , docs } = orama.data;\n const hybridWeights = params.hybridWeights;\n let uniqueTokenScores = mergeAndRankResults(fullTextIDs, vectorIDs, params.term ?? '', hybridWeights);\n // @todo avoid tokenize twice\n const tokens = await orama.tokenizer.tokenize(params.term ?? '', language);\n let propertiesToSearch = orama.caches['propertiesToSearch'];\n if (!propertiesToSearch) {\n const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);\n propertiesToSearch = await orama.index.getSearchableProperties(index);\n propertiesToSearch = propertiesToSearch.filter((prop)=>propertiesToSearchWithTypes[prop].startsWith('string'));\n orama.caches['propertiesToSearch'] = propertiesToSearch;\n }\n if (params.properties && params.properties !== '*') {\n for (const prop of params.properties){\n if (!propertiesToSearch.includes(prop)) {\n throw createError('UNKNOWN_INDEX', prop, propertiesToSearch.join(', '));\n }\n }\n propertiesToSearch = propertiesToSearch.filter((prop)=>params.properties.includes(prop));\n }\n // @todo avoid create context twice\n const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);\n const hasFilters = Object.keys(params.where ?? {}).length > 0;\n let whereFiltersIDs = [];\n if (hasFilters) {\n whereFiltersIDs = await orama.index.searchByWhereClause(context, index, params.where);\n uniqueTokenScores = intersectFilteredIDs(whereFiltersIDs, uniqueTokenScores).slice(offset, offset + limit);\n }\n let facetsResults;\n if (shouldCalculateFacets) {\n const facets = await getFacets(orama, uniqueTokenScores, params.facets);\n facetsResults = facets;\n }\n let groups;\n if (params.groupBy) {\n groups = await getGroups(orama, uniqueTokenScores, params.groupBy);\n }\n const results = (await fetchDocuments(orama, uniqueTokenScores, offset, limit)).filter(Boolean);\n if (orama.afterSearch) {\n await runAfterSearch(orama.afterSearch, orama, params, language, results);\n }\n const timeEnd = await getNanosecondsTime();\n const returningResults = {\n count: uniqueTokenScores.length,\n elapsed: {\n raw: Number(timeEnd - timeStart),\n formatted: await formatNanoseconds(timeEnd - timeStart)\n },\n hits: results,\n ...facetsResults ? {\n facets: facetsResults\n } : {},\n ...groups ? {\n groups\n } : {}\n };\n if (!includeVectors) {\n const vectorProperties = Object.keys(orama.data.index.vectorIndexes);\n removeVectorsFromHits(returningResults, vectorProperties);\n }\n return returningResults;\n}\nasync function getFullTextSearchIDs(orama, params, language) {\n const timeStart = await getNanosecondsTime();\n params.relevance = Object.assign(defaultBM25Params, params.relevance ?? {});\n const { term ='' , properties , threshold =1 } = params;\n const { index , docs } = orama.data;\n const tokens = await orama.tokenizer.tokenize(term, language);\n // Get searchable string properties\n let propertiesToSearch = orama.caches['propertiesToSearch'];\n if (!propertiesToSearch) {\n const propertiesToSearchWithTypes = await orama.index.getSearchablePropertiesWithTypes(index);\n propertiesToSearch = await orama.index.getSearchableProperties(index);\n propertiesToSearch = propertiesToSearch.filter((prop)=>propertiesToSearchWithTypes[prop].startsWith('string'));\n orama.caches['propertiesToSearch'] = propertiesToSearch;\n }\n if (properties && properties !== '*') {\n const propertiesToSearchSet = new Set(propertiesToSearch);\n const propertiesSet = new Set(properties);\n for (const prop of properties){\n if (!propertiesToSearchSet.has(prop)) {\n throw createError('UNKNOWN_INDEX', prop, propertiesToSearch.join(', '));\n }\n }\n propertiesToSearch = propertiesToSearch.filter((prop)=>propertiesSet.has(prop));\n }\n // Create the search context and the results\n const context = await createSearchContext(orama.tokenizer, orama.index, orama.documentsStore, language, params, propertiesToSearch, tokens, await orama.documentsStore.count(docs), timeStart);\n const tokensLength = tokens.length;\n if (tokensLength || properties && properties.length > 0) {\n // Now it's time to loop over all the indices and get the documents IDs for every single term\n const indexesLength = propertiesToSearch.length;\n for(let i = 0; i < indexesLength; i++){\n var _params_boost;\n const prop = propertiesToSearch[i];\n if (tokensLength !== 0) {\n for(let j = 0; j < tokensLength; j++){\n const term = tokens[j];\n // Lookup\n const scoreList = await orama.index.search(context, index, prop, term);\n safeArrayPush(context.indexMap[prop][term], scoreList);\n }\n } else {\n const indexMapContent = [];\n context.indexMap[prop][''] = indexMapContent;\n const scoreList = await orama.index.search(context, index, prop, '');\n safeArrayPush(indexMapContent, scoreList);\n }\n const docIds = context.indexMap[prop];\n const vals = Object.values(docIds);\n context.docsIntersection[prop] = prioritizeTokenScores(vals, (params === null || params === void 0 ? void 0 : (_params_boost = params.boost) === null || _params_boost === void 0 ? void 0 : _params_boost[prop]) ?? 1, threshold, tokensLength);\n const uniqueDocs = context.docsIntersection[prop];\n const uniqueDocsLength = uniqueDocs.length;\n for(let i = 0; i < uniqueDocsLength; i++){\n const [id, score] = uniqueDocs[i];\n const prevScore = context.uniqueDocsIDs[id];\n context.uniqueDocsIDs[id] = prevScore ? prevScore + score + 0.5 : score;\n }\n }\n } else if (tokens.length === 0 && term) {\n // This case is hard to handle correctly.\n // For the time being, if tokenizer returns empty array but the term is not empty,\n // we returns an empty result set\n context.uniqueDocsIDs = {};\n } else {\n context.uniqueDocsIDs = Object.fromEntries(Object.keys(await orama.documentsStore.getAll(orama.data.docs)).map((k)=>[\n k,\n 0\n ]));\n }\n const uniqueIDs = Object.entries(context.uniqueDocsIDs).map(([id, score])=>[\n +id,\n score\n ]).sort((a, b)=>b[1] - a[1]);\n return minMaxScoreNormalization(uniqueIDs);\n}\nexport async function getVectorSearchIDs(orama, params) {\n const vector = params.vector;\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n const vectorIndex = orama.data.index.vectorIndexes[vector === null || vector === void 0 ? void 0 : vector.property];\n const vectorSize = vectorIndex.size;\n const vectors = vectorIndex.vectors;\n if (vector && (!vector.value || !vector.property)) {\n throw createError('INVALID_VECTOR_INPUT', Object.keys(vector).join(', '));\n }\n if (vector.value.length !== vectorSize) {\n throw createError('INVALID_INPUT_VECTOR', vector.property, vectorSize, vector.value.length);\n }\n if (!(vector instanceof Float32Array)) {\n vector.value = new Float32Array(vector.value);\n }\n const uniqueIDs = findSimilarVectors(vector.value, vectors, vectorSize, params.similarity).map(([id, score])=>[\n getInternalDocumentId(orama.internalDocumentIDStore, id),\n score\n ]);\n return minMaxScoreNormalization(uniqueIDs);\n}\nfunction extractScore([, score]) {\n return score;\n}\nfunction minMaxScoreNormalization(results) {\n // In this case I disabled the `prefer-spread` rule because spread seems to be slower\n // eslint-disable-next-line prefer-spread\n const maxScore = Math.max.apply(Math, results.map(extractScore));\n return results.map(([id, score])=>[\n id,\n score / maxScore\n ]);\n}\nfunction normalizeScore(score, maxScore) {\n return score / maxScore;\n}\nfunction hybridScoreBuilder(textWeight, vectorWeight) {\n return (textScore, vectorScore)=>textScore * textWeight + vectorScore * vectorWeight;\n}\nfunction mergeAndRankResults(textResults, vectorResults, query, hybridWeights) {\n // eslint-disable-next-line prefer-spread\n const maxTextScore = Math.max.apply(Math, textResults.map(extractScore));\n // eslint-disable-next-line prefer-spread\n const maxVectorScore = Math.max.apply(Math, vectorResults.map(extractScore));\n const hasHybridWeights = hybridWeights && hybridWeights.text && hybridWeights.vector;\n const { text: textWeight , vector: vectorWeight } = hasHybridWeights ? hybridWeights : getQueryWeights(query);\n const mergedResults = new Map();\n const textResultsLength = textResults.length;\n const hybridScore = hybridScoreBuilder(textWeight, vectorWeight);\n for(let i = 0; i < textResultsLength; i++){\n const [id, score] = textResults[i];\n const normalizedScore = normalizeScore(score, maxTextScore);\n const hybridScoreValue = hybridScore(normalizedScore, 0);\n mergedResults.set(id, hybridScoreValue);\n }\n const vectorResultsLength = vectorResults.length;\n for(let i = 0; i < vectorResultsLength; i++){\n const [resultId, score] = vectorResults[i];\n const normalizedScore = normalizeScore(score, maxVectorScore);\n const existingRes = mergedResults.get(resultId) ?? 0;\n mergedResults.set(resultId, existingRes + hybridScore(0, normalizedScore));\n }\n return [\n ...mergedResults\n ].sort((a, b)=>b[1] - a[1]);\n}\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction getQueryWeights(query) {\n // In the next versions of Orama, we will ship a plugin containing a ML model to adjust the weights\n // based on whether the query is keyword-focused, conceptual, etc.\n // For now, we just return a fixed value.\n return {\n text: 0.5,\n vector: 0.5\n };\n}\n\n//# sourceMappingURL=search-hybrid.js.map","import { getDocumentIdFromInternalId } from '../components/internal-document-id-store.js';\nimport { createError } from '../errors.js';\nimport { getNested } from '../utils.js';\nimport { MODE_FULLTEXT_SEARCH, MODE_HYBRID_SEARCH, MODE_VECTOR_SEARCH } from '../constants.js';\nimport { fullTextSearch } from './search-fulltext.js';\nimport { searchVector } from './search-vector.js';\nimport { hybridSearch } from './search-hybrid.js';\nexport const defaultBM25Params = {\n k: 1.2,\n b: 0.75,\n d: 0.5\n};\nexport async function createSearchContext(tokenizer, index, documentsStore, language, params, properties, tokens, docsCount, timeStart) {\n // If filters are enabled, we need to get the IDs of the documents that match the filters.\n // const hasFilters = Object.keys(params.where ?? {}).length > 0;\n // let whereFiltersIDs: string[] = [];\n // if (hasFilters) {\n // whereFiltersIDs = getWhereFiltersIDs(params.where!, orama);\n // }\n // indexMap is an object containing all the indexes considered for the current search,\n // and an array of doc IDs for each token in all the indices.\n //\n // Given the search term \"quick brown fox\" on the \"description\" index,\n // indexMap will look like this:\n //\n // {\n // description: {\n // quick: [doc1, doc2, doc3],\n // brown: [doc2, doc4],\n // fox: [doc2]\n // }\n // }\n const indexMap = {};\n // After we create the indexMap, we need to calculate the intersection\n // between all the postings lists for each token.\n // Given the example above, docsIntersection will look like this:\n //\n // {\n // description: [doc2]\n // }\n //\n // as doc2 is the only document present in all the postings lists for the \"description\" index.\n const docsIntersection = {};\n for (const prop of properties){\n const tokensMap = {};\n for (const token of tokens){\n tokensMap[token] = [];\n }\n indexMap[prop] = tokensMap;\n docsIntersection[prop] = [];\n }\n return {\n timeStart,\n tokenizer,\n index,\n documentsStore,\n language,\n params,\n docsCount,\n uniqueDocsIDs: {},\n indexMap,\n docsIntersection\n };\n}\nexport async function search(orama, params, language) {\n const mode = params.mode ?? MODE_FULLTEXT_SEARCH;\n if (mode === MODE_FULLTEXT_SEARCH) {\n return fullTextSearch(orama, params, language);\n }\n if (mode === MODE_VECTOR_SEARCH) {\n return searchVector(orama, params);\n }\n if (mode === MODE_HYBRID_SEARCH) {\n return hybridSearch(orama, params);\n }\n throw createError('INVALID_SEARCH_MODE', mode);\n}\nexport async function fetchDocumentsWithDistinct(orama, uniqueDocsArray, offset, limit, distinctOn) {\n const docs = orama.data.docs;\n // Keep track which values we already seen\n const values = new Map();\n // We cannot know how many results we will have in the end,\n // so we need cannot pre-allocate the array.\n const results = [];\n const resultIDs = new Set();\n const uniqueDocsArrayLength = uniqueDocsArray.length;\n let count = 0;\n for(let i = 0; i < uniqueDocsArrayLength; i++){\n const idAndScore = uniqueDocsArray[i];\n // If there are no more results, just break the loop\n if (typeof idAndScore === 'undefined') {\n continue;\n }\n const [id, score] = idAndScore;\n if (resultIDs.has(id)) {\n continue;\n }\n const doc = await orama.documentsStore.get(docs, id);\n const value = await getNested(doc, distinctOn);\n if (typeof value === 'undefined' || values.has(value)) {\n continue;\n }\n values.set(value, true);\n count++;\n // We shouldn't consider the document if it's not in the offset range\n if (count <= offset) {\n continue;\n }\n results.push({\n id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, id),\n score,\n document: doc\n });\n resultIDs.add(id);\n // reached the limit, break the loop\n if (count >= offset + limit) {\n break;\n }\n }\n return results;\n}\nexport async function fetchDocuments(orama, uniqueDocsArray, offset, limit) {\n const docs = orama.data.docs;\n const results = Array.from({\n length: limit\n });\n const resultIDs = new Set();\n // We already have the list of ALL the document IDs containing the search terms.\n // We loop over them starting from a positional value \"offset\" and ending at \"offset + limit\"\n // to provide pagination capabilities to the search.\n for(let i = offset; i < limit + offset; i++){\n const idAndScore = uniqueDocsArray[i];\n // If there are no more results, just break the loop\n if (typeof idAndScore === 'undefined') {\n break;\n }\n const [id, score] = idAndScore;\n if (!resultIDs.has(id)) {\n // We retrieve the full document only AFTER making sure that we really want it.\n // We never retrieve the full document preventively.\n const fullDoc = await orama.documentsStore.get(docs, id);\n results[i] = {\n id: getDocumentIdFromInternalId(orama.internalDocumentIDStore, id),\n score,\n document: fullDoc\n };\n resultIDs.add(id);\n }\n }\n return results;\n}\n\n//# sourceMappingURL=search.js.map","import \"../styles/theme.scss\"\r\nimport \"../styles/samples.scss\"\r\nimport \"../styles/events.scss\"\r\nimport { create, insertMultiple, search } from \"@orama/orama\"\r\nimport { getSampleEvents } from \"../scripts/downloadSampleEvents\"\r\n\r\nconst db = await create({\r\n schema: {\r\n resource_kind: \"string\",\r\n resource_uri: \"string\",\r\n resource_id: \"string\",\r\n data: {\r\n barcode: \"string\",\r\n category: \"string\",\r\n date: \"string\",\r\n description: \"string\",\r\n description_values: {\r\n made_up_date: \"string\"\r\n },\r\n links: {\r\n document_metadata: \"string\",\r\n self: \"string\"\r\n },\r\n pages: \"number\",\r\n transaction_id: \"string\",\r\n type: \"string\"\r\n },\r\n event: {\r\n fields_changed: \"string[]\",\r\n published_at: \"string\",\r\n type: \"string\"\r\n }\r\n },\r\n components: {\r\n tokenizer: {\r\n stemming: false\r\n }\r\n }\r\n})\r\n\r\nconst resultsDiv = document.getElementById(\"search-results\")\r\n\r\nfunction initSearchPage(target: string) {\r\n const container = document.getElementById(target)\r\n if (!container) throw new Error(\"Target does not exist\")\r\n}\r\n\r\n\r\nasync function loadEvents() {\r\n let start = performance.now()\r\n const events = await getSampleEvents(\"filings\", 10_00)\r\n console.log(\"Took\", performance.now() - start, \"to fetch data\")\r\n start = performance.now()\r\n await insertMultiple(db, events, 200)\r\n console.log(\"Took\", performance.now() - start, \"to insert events into db\")\r\n}\r\n\r\nasync function performSearch(query: string) {\r\n const start = performance.now()\r\n const results = await search(db, {\r\n term: query,\r\n facets: { \"data.category\": {}, \"data.type\": {}, \"data.description\": {} }\r\n })\r\n console.log(\"Search took\", performance.now() - start, \"to query\", query)\r\n console.log(results)\r\n resultsDiv.innerHTML = `
${JSON.stringify(results, null, 2)}
`\r\n}\r\n\r\n\r\nconst searchBox = document.getElementById(\"search-query\") as HTMLInputElement\r\nconst searchButton = document.getElementById(\"search-button\") as HTMLButtonElement\r\nconst loadButton = document.getElementById(\"load-button\") as HTMLButtonElement\r\n\r\nsearchBox.addEventListener(\"keyup\", async () => {\r\n const query = searchBox.value\r\n await performSearch(query)\r\n})\r\n\r\nsearchButton.addEventListener(\"click\", async () => {\r\n const query = searchBox.value\r\n await performSearch(query)\r\n})\r\n\r\nloadButton.addEventListener(\"click\", async () => {\r\n await loadEvents()\r\n const query = searchBox.value\r\n await performSearch(query)\r\n})\r\n"],"names":["STEMMERS","SPLITTERS","SUPPORTED_LANGUAGES","getLocale","language","baseId","lastId","nano","milli","second","MAX_ARGUMENT_FOR_STACK","safeArrayPush","arr","newArr","newArrLength","i","sprintf","template","args","replaceArgs","groups","rawWidth","type","position","replacement","width","value","padding","precision","w","isInsideWebWorker","isInsideNode","getNanosecondTimeViaPerformance","formatNanoseconds","getNanosecondsTime","_process_hrtime","uniqueId","getOwnProperty","object","property","sortTokenScorePredicate","a","b","intersect","arrays","tmp","set","elem","found","count","e","getDocumentProperties","doc","paths","properties","pathsLength","path","pathTokens","current","pathTokensLength","j","getNested","obj","mapDistanceToMeters","convertDistanceToMeters","distance","unit","ratio","createError","removeVectorsFromHits","searchResult","vectorProperties","result","acc","prop","lastKey","key","allLanguages","errors","code","error","formatElapsedTime","n","getDocumentIndexId","validateSchema","schema","valueLength","isVectorType","vectorSize","getVectorSize","isArrayType","expectedType","getInnerType","subProp","IS_ARRAY_TYPE","INNER_TYPE","isGeoPointType","size","createInternalDocumentIDStore","save","load","store","orama","raw","internalIdToId","internalIdToIdLength","internalIdItem","getInternalDocumentId","id","internalId","currentId","getDocumentIdFromInternalId","create","_","sharedInternalDocumentStore","get","getMultiple","ids","idsLength","getAll","remove","rawDocument","createDocumentsStore","AVAILABLE_PLUGIN_HOOKS","getAllPluginsByHook","hook","_orama_plugins","pluginsToRun","pluginsLength","plugin","OBJECT_COMPONENTS","FUNCTION_COMPONENTS","runSingleHook","hooks","hooksLength","runMultipleHook","docsOrIds","runAfterSearch","db","params","results","runBeforeSearch","runAfterCreate","rotateLeft","node","right","getHeight","rotateRight","left","rangeSearch","min","max","traverse","greaterThan","inclusive","stack","lessThan","getNodeByKey","insert","rootNode","newValue","insertNode","balanceFactor","find","root","parentNode","minValueNode","minValueParent","childNode","removeDocument","_root_numberToDocumentId_get","_root_numberToDocumentId_get1","v","filter","operation","operationKeys","operationType","keys","filterArr","_boundedLevenshtein","tolerance","swap","lenA","lenB","startIdx","delta","row","characterCodeCache","offset","haveMax","jStart","jEnd","above","charA","syncBoundedLevenshtein","Node","subWord","end","updateParent","parent","addDocument","docID","index","findAllWords","output","term","exact","docIDs","docs","docIDsLength","character","getCommonPrefix","commonPrefix","len","word","docId","wordLength","currentCharacter","wordAtIndex","rootChildCurrentChar","edgeLabel","edgeLabelLength","commonPrefixLength","edgeLabelAtCommonPrefix","newNode","newNodeChild","inbetweenNode","inbetweenNodeChild","wordAtCommonPrefix","_findLevenshtein","originalTolerance","termLength","termSubstring","removeDocumentByWord","K","EARTH_RADIUS","tree","point","depth","newDocIDs","removeDocByID","direction","_node_docIDs","_node_docIDs1","axis","searchByRadius","center","radius","sort","highPrecision","distanceFn","vincentyDistance","haversineDistance","dist","distA","distB","searchByPolygon","polygon","task","nextDepth","isInsidePolygon","isPointInPolygon","centroid","calculatePolygonCentroid","sortFn","totalArea","centroidX","centroidY","polygonLength","xi","yi","xj","yj","areaSegment","centroidCoordinate","isInside","x","y","coord1","coord2","P","lat1","lat2","deltaLat","deltaLon","c","f","U1","U2","sinU1","cosU1","sinU2","cosU2","lambda","prevLambda","iterationLimit","sinAlpha","cos2Alpha","sinSigma","cosSigma","sigma","sinLambda","cosLambda","cos2SigmaM","C","u2","A","B","deltaSigma","prioritizeTokenScores","boost","threshold","keywordsCount","tokenScoresMap","mapsLength","entriesLength","_tokenScoresMap_get","token","score","boostScore","oldScore","_tokenScoresMap_get1","tokenScores","tokenScoreEntry","allResults","tokenScoreWithKeywordsCount","keywordsPerToken","lastTokenWithAllKeywords","keywordsPerTokenLength","resultsWithIdAndScore","thresholdLength","BM25","tf","matchingCount","docsCount","fieldLength","averageFieldLength","k","d","getMagnitude","vector","vectorLength","magnitude","findSimilarVectors","targetVector","vectors","length","targetMagnitude","similarVectors","vectorId","dotProduct","similarity","insertDocumentScoreParameters","tokens","insertTokenScoreParameters","tokenFrequency","t","removeDocumentScoreParameters","removeTokenScoreParameters","calculateResultScores","context","documentIDs","avgFieldLength","fieldLengths","oramaOccurrences","oramaFrequencies","termOccurrences","scoreList","documentIDsLength","_oramaFrequencies_internalId","bm25","prefix","isArray","avlCreate","radixCreate","flatCreate","bkdCreate","insertScalarBuilder","implementation","tokenizer","avlInsert","radixInsert","flatInsert","bkdInsert","schemaType","insertVector","insertScalar","elements","elementsLength","removeScalar","avlRemoveDocument","radixRemoveDocument","flatRemoveDocument","bkdRemoveDocByID","innerSchemaType","search","radixFind","searchByWhereClause","filters","filterKeys","filtersMap","param","filteredIDs","reqOperation","coordinates","inside","distanceInMeters","filteredIDsResults","flatFilterArr","flatFilter","operationOpt","operationValue","avlGreaterThan","avlLessThan","avlFind","avlRangeSearch","getSearchableProperties","getSearchablePropertiesWithTypes","loadRadixNode","convertedNode","childrenKey","loadFlatNode","saveFlatNode","rawIndexes","rawVectorIndexes","searchableProperties","searchablePropertiesWithTypes","frequencies","tokenOccurrences","indexes","vectorIndexes","idx","vec","vectorIndexesAsArrays","savedIndexes","name","createIndex","innerCreate","sortableDeniedProperties","sorter","ret","config","s","ensureOrderedDocsAreDeletedByProperty","ensureIsSorted","ensurePropertyIsSorted","stringSort","numberSort","booleanSort","predicate","orderedDocsLength","ensureOrderedDocsAreDeleted","sortBy","docIds","by","isDesc","indexOfA","indexOfB","isAIndexed","isBIndexed","getSortableProperties","getSortablePropertiesWithTypes","sorts","orderedDocs","createSorter","DIACRITICS_CHARCODE_START","DIACRITICS_CHARCODE_END","CHARCODE_REPLACE_MAPPING","replaceChar","charCode","replaceDiacritics","str","stringCharCode","step2List","step3List","V","mgr0","meq1","mgr1","s_v","stemmer","stem","suffix","re","re2","re3","re4","firstch","fp","normalizeToken","_this_stopWords","trim","text","tokenize","input","splitRule","trimTokens","createTokenizer","english","stopWords","validateComponents","components","defaultComponents","rawKey","plugins","documentsStore","internalDocumentStore","getVersion","afterCreate","kInsertions","_globalThis_process","warn","message","options","trackInsertion","skipHooks","errorProperty","innerInsert","ENUM_TYPE","STRING_NUMBER_TYPE","indexableProperties","indexablePropertiesWithTypes","indexableValues","actualType","_orama_index","_orama_index_beforeInsert","_orama_index1","_orama_index_afterInsert","sortableProperties","sortablePropertiesWithTypes","sortableValues","insertMultiple","batchSize","timeout","docsLength","oramaSchema","innerInsertMultiple","resolve","reject","_insertMultiple","batch","err","MODE_FULLTEXT_SEARCH","MODE_HYBRID_SEARCH","MODE_VECTOR_SEARCH","intersectFilteredIDs","filtered","lookedUp","map","looked","sortAsc","sortDesc","sortingPredicateBuilder","order","getFacets","facetsConfig","facets","allIDs","allDocs","facetKeys","facet","values","ranges","rangesLength","range","allDocsLength","facetValue","propertyType","facetValues","calculateNumberFacetBuilder","alreadyInsertedValues","calculateNumberFacet","calculateBooleanStringOrEnumFacetBuilder","calculateBooleanStringOrEnumFacet","currentFacet","stringFacetDefinition","sortingPredicate","defaultValue","DEFAULT_REDUCE","res","ALLOWED_TYPES","getGroups","groupBy","propertiesLength","schemaProperties","returnedCount","listOfValues","g","groupByKey","group","keyValue","perValue","combinations","calculateCombination","combinationsLength","combination","combinationLength","groupsLength","reduce","func","initialValue","aggregationValue","arrs","item","head","fullTextSearch","timeStart","defaultBM25Params","shouldCalculateFacets","limit","distinctOn","includeVectors","isPreflight","propertiesToSearch","propertiesToSearchWithTypes","createSearchContext","hasFilters","whereFiltersIDs","tokensLength","indexesLength","_params_boost","vals","uniqueDocs","uniqueDocsLength","prevScore","uniqueDocsArray","docsWithIdAndScore","fetchDocumentsWithDistinct","fetchDocuments","searchVector","vectorIndex","oramaDocs","facetsResults","newDoc","elapsedTime","hybridSearch","fullTextIDs","vectorIDs","getFullTextSearchIDs","getVectorSearchIDs","hybridWeights","uniqueTokenScores","mergeAndRankResults","timeEnd","returningResults","propertiesToSearchSet","propertiesSet","indexMapContent","uniqueIDs","minMaxScoreNormalization","extractScore","maxScore","normalizeScore","hybridScoreBuilder","textWeight","vectorWeight","textScore","vectorScore","textResults","vectorResults","query","maxTextScore","maxVectorScore","hasHybridWeights","getQueryWeights","mergedResults","textResultsLength","hybridScore","normalizedScore","hybridScoreValue","vectorResultsLength","resultId","existingRes","indexMap","docsIntersection","tokensMap","mode","resultIDs","uniqueDocsArrayLength","idAndScore","fullDoc","resultsDiv","loadEvents","start","events","getSampleEvents","performSearch","searchBox","searchButton","loadButton"],"mappings":"8JAAO,MAAMA,GAAW,CACpB,OAAQ,KACR,SAAU,KACV,UAAW,KACX,OAAQ,KACR,MAAO,KACP,QAAS,KACT,QAAS,KACT,OAAQ,KACR,OAAQ,KACR,MAAO,KACP,UAAW,KACX,OAAQ,KACR,WAAY,KACZ,MAAO,KACP,QAAS,KACT,WAAY,KACZ,OAAQ,KACR,UAAW,KACX,WAAY,KACZ,SAAU,KACV,QAAS,KACT,QAAS,KACT,UAAW,KACX,QAAS,KACT,QAAS,KACT,MAAO,KACP,QAAS,KACT,UAAW,KACX,SAAU,IACd,EACaC,GAAY,CACrB,MAAO,6BACP,QAAS,6BACT,OAAQ,iCACR,QAAS,6BACT,UAAW,6BACX,WAAY,qBACZ,QAAS,wBACT,QAAS,6BACT,QAAS,0BACT,OAAQ,0BACR,QAAS,oBACT,OAAQ,sBACR,UAAW,kCACX,SAAU,0BACV,QAAS,0BACT,QAAS,4BACT,WAAY,kCACZ,OAAQ,mBACR,OAAQ,mBACR,MAAO,0BACP,OAAQ,mBACR,SAAU,mBACV,MAAO,sBACP,WAAY,gBACZ,UAAW,4BACX,UAAW,sBACX,UAAW,sBACX,MAAO,mBACP,SAAU,oCACd,EACaC,GAAsB,OAAO,KAAKF,EAAQ,EAChD,SAASG,GAAUC,EAAU,CAChC,OAAOA,IAAa,QAAaF,GAAoB,SAASE,CAAQ,EAAIJ,GAASI,CAAQ,EAAI,MACnG,CChEA,MAAMC,GAAS,KAAK,IAAK,EAAC,SAAQ,EAAG,MAAM,CAAC,EAC5C,IAAIC,GAAS,EAEb,MAAMC,GAAO,OAAO,GAAG,EACjBC,GAAQ,OAAO,GAAG,EAClBC,GAAS,OAAO,GAAG,EAMRC,GAAyB,MAS/B,SAASC,EAAcC,EAAKC,EAAQ,CAC3C,GAAIA,EAAO,OAASH,GAChB,MAAM,UAAU,KAAK,MAAME,EAAKC,CAAM,MACnC,CACH,MAAMC,EAAeD,EAAO,OAC5B,QAAQE,EAAI,EAAGA,EAAID,EAAcC,GAAKL,GAClC,MAAM,UAAU,KAAK,MAAME,EAAKC,EAAO,MAAME,EAAGA,EAAIL,EAAsB,CAAC,CAElF,CACL,CACO,SAASM,GAAQC,KAAaC,EAAM,CACvC,OAAOD,EAAS,QAAQ,+DAAgE,YAAYE,EAAa,CAC7G,MAAMC,EAASD,EAAYA,EAAY,OAAS,CAAC,EAC3C,CAAE,MAAOE,EAAW,KAAAC,EAAO,SAAAC,CAAQ,EAAMH,EACzCI,EAAcD,EAAWL,EAAK,OAAO,SAASK,CAAQ,EAAI,CAAC,EAAIL,EAAK,MAAK,EACzEO,EAAQJ,IAAa,GAAK,EAAI,OAAO,SAASA,CAAQ,EAC5D,OAAOC,EAAI,CACP,IAAK,IACD,OAAOE,EAAY,SAAU,EAAC,SAASC,EAAO,GAAG,EACrD,IAAK,IACD,CACI,IAAIC,EAAQF,EACZ,KAAM,CAACG,EAASC,CAAS,EAAIP,EAAS,MAAM,GAAG,EAAE,IAAKQ,GAAI,OAAO,WAAWA,CAAC,CAAC,EAC9E,OAAI,OAAOD,GAAc,UAAYA,GAAa,IAC9CF,EAAQA,EAAM,QAAQE,CAAS,GAE5B,OAAOD,GAAY,UAAYA,GAAW,EAAID,EAAM,WAAW,SAASD,EAAO,GAAG,EAAIC,EAAM,SAAQ,CAC9G,CACL,IAAK,IACD,OAAOD,EAAQ,EAAID,EAAY,SAAU,EAAC,OAAO,CAACC,EAAO,GAAG,EAAID,EAAY,SAAQ,EAAG,SAASC,EAAO,GAAG,EAC9G,QACI,OAAOD,CACd,CACT,CAAK,CACL,CAoBO,SAASM,IAAoB,CAEhC,OAAO,OAAO,kBAAsB,KAAe,gBAAgB,iBACvE,CACO,SAASC,IAAe,CAC3B,OAAO,OAAO,QAAY,KAAe,QAAQ,SAAW,QAAQ,QAAQ,OAAS,MACzF,CACO,SAASC,IAAkC,CAC9C,OAAO,OAAO,KAAK,MAAM,YAAY,IAAK,EAAG,GAAG,CAAC,CACrD,CACO,eAAeC,GAAkBP,EAAO,CAI3C,OAHI,OAAOA,GAAU,WACjBA,EAAQ,OAAOA,CAAK,GAEpBA,EAAQnB,GACD,GAAGmB,CAAK,KACRA,EAAQlB,GACR,GAAGkB,EAAQnB,EAAI,KACfmB,EAAQjB,GACR,GAAGiB,EAAQlB,EAAK,KAEpB,GAAGkB,EAAQjB,EAAM,GAC5B,CAEO,eAAeyB,GAAqB,CACvC,IAAIC,EACJ,OAAIL,GAAiB,EACVE,GAA+B,EAEtCD,GAAY,GAGZ,OAAO,QAAY,KAAe,OAAQ,SAAY,OAAuCI,EAAkB,QAAQ,UAAY,MAAQA,IAAoB,OAA5E,OAA8FA,EAAgB,SAAY,WACtM,QAAQ,OAAO,SAEtB,OAAO,YAAgB,IAChBH,GAA+B,EAGnC,OAAO,CAAC,CACnB,CACO,eAAeI,IAAW,CAC7B,MAAO,GAAG/B,EAAM,IAAIC,IAAQ,EAChC,CACO,SAAS+B,EAAeC,EAAQC,EAAU,CAE7C,OAAI,OAAO,SAAW,OACX,OAAO,UAAU,eAAe,KAAKD,EAAQC,CAAQ,EAAID,EAAOC,CAAQ,EAAI,OAEhF,OAAO,OAAOD,EAAQC,CAAQ,EAAID,EAAOC,CAAQ,EAAI,MAChE,CAyBO,SAASC,GAAwBC,EAAGC,EAAG,CAC1C,OAAIA,EAAE,CAAC,IAAMD,EAAE,CAAC,EACLA,EAAE,CAAC,EAAIC,EAAE,CAAC,EAEdA,EAAE,CAAC,EAAID,EAAE,CAAC,CACrB,CAGO,SAASE,GAAUC,EAAQ,CAC9B,GAAIA,EAAO,SAAW,EAClB,MAAO,GACJ,GAAIA,EAAO,SAAW,EACzB,OAAOA,EAAO,CAAC,EAEnB,QAAQ7B,EAAI,EAAGA,EAAI6B,EAAO,OAAQ7B,IAC9B,GAAI6B,EAAO7B,CAAC,EAAE,OAAS6B,EAAO,CAAC,EAAE,OAAQ,CACrC,MAAMC,EAAMD,EAAO,CAAC,EACpBA,EAAO,CAAC,EAAIA,EAAO7B,CAAC,EACpB6B,EAAO7B,CAAC,EAAI8B,CACf,CAEL,MAAMC,EAAM,IAAI,IAChB,UAAWC,KAAQH,EAAO,CAAC,EACvBE,EAAI,IAAIC,EAAM,CAAC,EAEnB,QAAQhC,EAAI,EAAGA,EAAI6B,EAAO,OAAQ7B,IAAI,CAClC,IAAIiC,EAAQ,EACZ,UAAWD,KAAQH,EAAO7B,CAAC,EAAE,CACzB,MAAMkC,EAAQH,EAAI,IAAIC,CAAI,EACtBE,IAAUlC,IACV+B,EAAI,IAAIC,EAAME,EAAQ,CAAC,EACvBD,IAEP,CACD,GAAIA,IAAU,EAAG,MAAO,EAC3B,CACD,OAAOJ,EAAO,CAAC,EAAE,OAAQM,GAAI,CACzB,MAAMD,EAAQH,EAAI,IAAII,CAAC,EACvB,OAAID,IAAU,QAAWH,EAAI,IAAII,EAAG,CAAC,EAC9BD,IAAUL,EAAO,MAChC,CAAK,CACL,CACO,eAAeO,GAAsBC,EAAKC,EAAO,CACpD,MAAMC,EAAa,CAAA,EACbC,EAAcF,EAAM,OAC1B,QAAQtC,EAAI,EAAGA,EAAIwC,EAAaxC,IAAI,CAChC,MAAMyC,EAAOH,EAAMtC,CAAC,EACd0C,EAAaD,EAAK,MAAM,GAAG,EACjC,IAAIE,EAAUN,EACd,MAAMO,EAAmBF,EAAW,OACpC,QAAQG,EAAI,EAAGA,EAAID,EAAkBC,IAGjC,GAFAF,EAAUA,EAAQD,EAAWG,CAAC,CAAC,EAE3B,OAAOF,GAAY,UACnB,GAAIA,IAAY,MAAQ,QAASA,GAAW,QAASA,GAAW,OAAOA,EAAQ,KAAQ,UAAY,OAAOA,EAAQ,KAAQ,SAAU,CAChIA,EAAUJ,EAAWE,CAAI,EAAIE,EAC7B,KACpB,SAA2B,CAAC,MAAM,QAAQA,CAAO,GAAKA,IAAY,MAAQE,IAAMD,EAAmB,EAAG,CAClFD,EAAU,OACV,KACH,WACOA,IAAY,MAAQ,OAAOA,GAAY,WAAaE,EAAID,EAAmB,EAAG,CAEtFD,EAAU,OACV,KACH,CAED,OAAOA,EAAY,MACnBJ,EAAWE,CAAI,EAAIE,EAE1B,CACD,OAAOJ,CACX,CACO,eAAeO,GAAUC,EAAKN,EAAM,CAIvC,OAHc,MAAML,GAAsBW,EAAK,CAC3CN,CACR,CAAK,GACYA,CAAI,CACrB,CAcA,MAAMO,GAAsB,CACxB,GAAI,IACJ,EAAG,EACH,GAAI,IACJ,GAAI,MACJ,GAAI,MACJ,GAAI,QACR,EACO,SAASC,GAAwBC,EAAUC,EAAM,CACpD,MAAMC,EAAQJ,GAAoBG,CAAI,EACtC,GAAIC,IAAU,OACV,MAAM,IAAI,MAAMC,EAAY,0BAA2BH,CAAQ,EAAE,OAAO,EAE5E,OAAOA,EAAWE,CACtB,CACO,SAASE,GAAsBC,EAAcC,EAAkB,CAClED,EAAa,KAAOA,EAAa,KAAK,IAAKE,IAAU,CAC7C,GAAGA,EACH,SAAU,CACN,GAAGA,EAAO,SAEV,GAAGD,EAAiB,OAAO,CAACE,EAAKC,IAAO,CACpC,MAAMlB,EAAOkB,EAAK,MAAM,GAAG,EACrBC,EAAUnB,EAAK,MACrB,IAAIM,EAAMW,EACV,UAAWG,KAAOpB,EACdM,EAAIc,CAAG,EAAId,EAAIc,CAAG,GAAK,CAAA,EACvBd,EAAMA,EAAIc,CAAG,EAEjB,OAAAd,EAAIa,CAAO,EAAI,KACRF,CAC3B,EAAmBD,EAAO,QAAQ,CACrB,CACJ,EAAC,CACV,CClRA,MAAMK,GAAe3E,GAAoB,KAAK;AAAA,IAAO,EAC/C4E,GAAS,CACX,kCAAmC,2EACnC,uBAAwB;AAAA;AAAA,KAAiED,EAAY,GACrG,8BAA+B,8CAC/B,gBAAiB,mRACjB,4CAA6C,qDAC7C,sBAAuB,8BACvB,2BAA4B,yCAC5B,8CAA+C,kEAC/C,oBAAqB,mGACrB,2BAA4B,0DAC5B,wBAAyB,0CACzB,wBAAyB,2CACzB,0BAA2B,oCAC3B,0BAA2B,0DAC3B,cAAe,uHACf,oBAAqB,6DACrB,yBAA0B,+DAC1B,0BAA2B,yEAC3B,yBAA0B,4EAC1B,qBAAsB,8DACtB,gCAAiC,2DACjC,cAAe,oGACf,0BAA2B,iCAC3B,0BAA2B,sEAC3B,wBAAyB,gCACzB,oBAAqB,iEACrB,qBAAsB,kEACtB,qBAAsB;AAAA,wJACtB,2BAA4B,4EAC5B,oBAAqB,uCACrB,wBAAyB,2EACzB,oBAAqB,6EACrB,gCAAiC,kJACjC,aAAc,8FACd,qBAAsB,8GACtB,eAAgB,8FACpB,EACO,SAAST,EAAYW,KAAS7D,EAAM,CACvC,MAAM8D,EAAQ,IAAI,MAAMhE,GAAQ8D,GAAOC,CAAI,GAAK,iCAAiCA,CAAI,GAAI,GAAG7D,CAAI,CAAC,EACjG,OAAA8D,EAAM,KAAOD,EACT,sBAAuB,MAAM,WAC7B,MAAM,kBAAkBC,CAAK,EAE1BA,CACX,CC7CO,eAAeC,GAAkBC,EAAG,CACvC,MAAO,CACH,IAAK,OAAOA,CAAC,EACb,UAAW,MAAMjD,GAAkBiD,CAAC,CAC5C,CACA,CACO,eAAeC,GAAmB/B,EAAK,CAC1C,GAAIA,EAAI,GAAI,CACR,GAAI,OAAOA,EAAI,IAAO,SAClB,MAAMgB,EAAY,6BAA8B,OAAOhB,EAAI,EAAE,EAEjE,OAAOA,EAAI,EACd,CACD,OAAO,MAAMhB,GAAQ,CACzB,CACO,eAAegD,GAAehC,EAAKiC,EAAQ,CAC9C,SAAW,CAACX,EAAMpD,CAAI,IAAK,OAAO,QAAQ+D,CAAM,EAAE,CAC9C,MAAM3D,EAAQ0B,EAAIsB,CAAI,EACtB,GAAI,SAAOhD,EAAU,MAGjB,EAAAJ,IAAS,YAAc,OAAOI,GAAU,UAAY,OAAOA,EAAM,KAAQ,UAAY,OAAOA,EAAM,KAAQ,WAG1G,EAAAJ,IAAS,SAAW,OAAOI,GAAU,UAAY,OAAOA,GAAU,WAGtE,IAAIJ,IAAS,UAAY,MAAM,QAAQI,CAAK,EAAG,CAC3C,MAAM4D,EAAc5D,EAAM,OAC1B,QAAQ,EAAI,EAAG,EAAI4D,EAAa,IAC5B,GAAI,OAAO5D,EAAM,CAAC,GAAM,UAAY,OAAOA,EAAM,CAAC,GAAM,SACpD,OAAOgD,EAAO,IAAM,EAG5B,QACH,CACD,GAAIa,EAAajE,CAAI,EAAG,CACpB,MAAMkE,EAAaC,GAAcnE,CAAI,EACrC,GAAI,CAAC,MAAM,QAAQI,CAAK,GAAKA,EAAM,SAAW8D,EAC1C,MAAMpB,EAAY,uBAAwBM,EAAMc,EAAY9D,EAAM,MAAM,EAE5E,QACH,CACD,GAAIgE,EAAYpE,CAAI,EAAG,CACnB,GAAI,CAAC,MAAM,QAAQI,CAAK,EACpB,OAAOgD,EAEX,MAAMiB,EAAeC,GAAatE,CAAI,EAChCgE,EAAc5D,EAAM,OAC1B,QAAQX,EAAI,EAAGA,EAAIuE,EAAavE,IAC5B,GAAI,OAAOW,EAAMX,CAAC,IAAM4E,EACpB,OAAOjB,EAAO,IAAM3D,EAG5B,QACH,CACD,GAAI,OAAOO,GAAS,SAAU,CAC1B,GAAI,CAACI,GAAS,OAAOA,GAAU,SAC3B,OAAOgD,EAGX,MAAMmB,EAAU,MAAMT,GAAe1D,EAAOJ,CAAI,EAChD,GAAIuE,EACA,OAAOnB,EAAO,IAAMmB,EAExB,QACH,CACD,GAAI,OAAOnE,IAAUJ,EACjB,OAAOoD,EAEd,CAEL,CACA,MAAMoB,GAAgB,CAClB,OAAQ,GACR,OAAQ,GACR,QAAS,GACT,KAAM,GACN,SAAU,GACV,WAAY,GACZ,WAAY,GACZ,YAAa,GACb,SAAU,EACd,EACMC,GAAa,CACf,WAAY,SACZ,WAAY,SACZ,YAAa,UACb,SAAU,MACd,EACO,SAASC,GAAe1E,EAAM,CACjC,OAAOA,IAAS,UACpB,CACO,SAASiE,EAAajE,EAAM,CAC/B,OAAO,OAAOA,GAAS,UAAY,kBAAkB,KAAKA,CAAI,CAClE,CACO,SAASoE,EAAYpE,EAAM,CAC9B,OAAO,OAAOA,GAAS,UAAYwE,GAAcxE,CAAI,CACzD,CACO,SAASsE,GAAatE,EAAM,CAC/B,OAAOyE,GAAWzE,CAAI,CAC1B,CACO,SAASmE,GAAcnE,EAAM,CAChC,MAAM2E,EAAO,OAAO3E,EAAK,MAAM,EAAG,EAAE,CAAC,EACrC,OAAO,GAAI,CACP,KAAK,MAAM2E,CAAI,EACX,MAAM7B,EAAY,uBAAwB9C,CAAI,EAClD,KAAK2E,GAAQ,EACT,MAAM7B,EAAY,sBAAuB9C,CAAI,EACjD,QACI,OAAO2E,CACd,CACL,CCnHO,SAASC,IAAgC,CAC5C,MAAO,CACH,eAAgB,IAAI,IACpB,eAAgB,CAAE,EAC1B,KAAQC,GACR,KAAQC,EACR,CACA,CACO,SAASD,GAAKE,EAAO,CACxB,MAAO,CACH,eAAgBA,EAAM,cAC9B,CACA,CACO,SAASD,GAAKE,EAAOC,EAAK,CAC7B,KAAM,CAAE,eAAAC,CAAiB,EAAGD,EAC5BD,EAAM,wBAAwB,eAAe,QAC7CA,EAAM,wBAAwB,eAAiB,GAC/C,MAAMG,EAAuBD,EAAe,OAC5C,QAAQzF,EAAI,EAAGA,EAAI0F,EAAsB1F,IAAI,CACzC,MAAM2F,EAAiBF,EAAezF,CAAC,EACvCuF,EAAM,wBAAwB,eAAe,IAAII,EAAgB3F,EAAI,CAAC,EACtEuF,EAAM,wBAAwB,eAAe,KAAKI,CAAc,CACnE,CACL,CACO,SAASC,EAAsBN,EAAOO,EAAI,CAC7C,GAAI,OAAOA,GAAO,SAAU,CACxB,MAAMC,EAAaR,EAAM,eAAe,IAAIO,CAAE,EAC9C,GAAIC,EACA,OAAOA,EAEX,MAAMC,EAAYT,EAAM,eAAe,KAAO,EAC9C,OAAAA,EAAM,eAAe,IAAIO,EAAIE,CAAS,EACtCT,EAAM,eAAe,KAAKO,CAAE,EACrBE,CACV,CACD,OAAIF,EAAKP,EAAM,eAAe,OACnBM,EAAsBN,EAAOO,EAAG,SAAU,CAAA,EAE9CA,CACX,CACO,SAASG,EAA4BV,EAAOQ,EAAY,CAC3D,GAAIR,EAAM,eAAe,OAASQ,EAC9B,MAAM,IAAI,MAAM,sBAAsBA,CAAU,EAAE,EAEtD,OAAOR,EAAM,eAAeQ,EAAa,CAAC,CAC9C,CC5CO,eAAeG,GAAOC,EAAGC,EAA6B,CACzD,MAAO,CACH,4BAAAA,EACA,KAAM,CAAE,EACR,MAAO,CACf,CACA,CACO,eAAeC,GAAId,EAAOO,EAAI,CACjC,MAAMC,EAAaF,EAAsBN,EAAM,4BAA6BO,CAAE,EAC9E,OAAOP,EAAM,KAAKQ,CAAU,CAChC,CACO,eAAeO,GAAYf,EAAOgB,EAAK,CAC1C,MAAMC,EAAYD,EAAI,OAChBrE,EAAQ,MAAM,KAAK,CACrB,OAAQsE,CAChB,CAAK,EACD,QAAQvG,EAAI,EAAGA,EAAIuG,EAAWvG,IAAI,CAC9B,MAAM8F,EAAaF,EAAsBN,EAAM,4BAA6BgB,EAAItG,CAAC,CAAC,EAClFiC,EAAMjC,CAAC,EAAIsF,EAAM,KAAKQ,CAAU,CACnC,CACD,OAAO7D,CACX,CACO,eAAeuE,GAAOlB,EAAO,CAChC,OAAOA,EAAM,IACjB,CACO,eAAeA,GAAMA,EAAOO,EAAIxD,EAAK,CACxC,MAAMyD,EAAaF,EAAsBN,EAAM,4BAA6BO,CAAE,EAC9E,OAAI,OAAOP,EAAM,KAAKQ,CAAU,EAAM,IAC3B,IAEXR,EAAM,KAAKQ,CAAU,EAAIzD,EACzBiD,EAAM,QACC,GACX,CACO,eAAemB,GAAOnB,EAAOO,EAAI,CACpC,MAAMC,EAAaF,EAAsBN,EAAM,4BAA6BO,CAAE,EAC9E,OAAI,OAAOP,EAAM,KAAKQ,CAAU,EAAM,IAC3B,IAEX,OAAOR,EAAM,KAAKQ,CAAU,EAC5BR,EAAM,QACC,GACX,CACO,eAAepD,GAAMoD,EAAO,CAC/B,OAAOA,EAAM,KACjB,CACO,eAAeD,GAAKc,EAA6BX,EAAK,CACzD,MAAMkB,EAAclB,EACpB,MAAO,CACH,KAAMkB,EAAY,KAClB,MAAOA,EAAY,MACnB,4BAAAP,CACR,CACA,CACO,eAAef,GAAKE,EAAO,CAC9B,MAAO,CACH,KAAMA,EAAM,KACZ,MAAOA,EAAM,KACrB,CACA,CACO,eAAeqB,IAAuB,CACzC,MAAO,CACX,OAAQV,GACA,IAAAG,GACA,YAAAC,GACA,OAAAG,GACA,MAAAlB,GACR,OAAQmB,GACA,MAAAvE,GACR,KAAQmD,GACR,KAAQD,EACR,CACA,CCxEO,MAAMwB,GAAyB,CAClC,eACA,cACA,eACA,cACA,eACA,cACA,eACA,cACA,uBACA,sBACA,uBACA,sBACA,uBACA,sBACA,aACA,YACA,aACJ,EACO,eAAeC,GAAoBtB,EAAOuB,EAAM,CACnD,IAAIC,EACJ,MAAMC,EAAe,CAAA,EACfC,GAAiBF,EAAiBxB,EAAM,WAAa,MAAQwB,IAAmB,OAAS,OAASA,EAAe,OACvH,GAAI,CAACE,EACD,OAAOD,EAEX,QAAQhH,EAAI,EAAGA,EAAIiH,EAAejH,IAC9B,GAAI,CACA,MAAMkH,EAAS,MAAM3B,EAAM,QAAQvF,CAAC,EAChC,OAAOkH,EAAOJ,CAAI,GAAM,YACxBE,EAAa,KAAKE,EAAOJ,CAAI,CAAC,CAErC,OAAQ7C,EAAO,CACZ,cAAQ,MAAM,uCAAwCA,CAAK,EACrDZ,EAAY,gBAAgB,CACrC,CAEL,OAAO2D,CACX,CCvCO,MAAMG,GAAoB,CAC7B,YACA,QACA,iBACA,QACJ,EACaC,GAAsB,CAC/B,iBACA,qBACA,wBACA,mBACJ,EAEO,eAAeC,GAAcC,EAAO/B,EAAOM,EAAIxD,EAAK,CACvD,MAAMkF,EAAcD,EAAM,OAC1B,QAAQtH,EAAI,EAAGA,EAAIuH,EAAavH,IAC5B,MAAMsH,EAAMtH,CAAC,EAAEuF,EAAOM,EAAIxD,CAAG,CAErC,CACO,eAAemF,GAAgBF,EAAO/B,EAAOkC,EAAW,CAC3D,MAAMF,EAAcD,EAAM,OAC1B,QAAQtH,EAAI,EAAGA,EAAIuH,EAAavH,IAC5B,MAAMsH,EAAMtH,CAAC,EAAEuF,EAAOkC,CAAS,CAEvC,CACO,eAAeC,GAAeJ,EAAOK,EAAIC,EAAQvI,EAAUwI,EAAS,CACvE,MAAMN,EAAcD,EAAM,OAC1B,QAAQ,EAAI,EAAG,EAAIC,EAAa,IAC5B,MAAMD,EAAM,CAAC,EAAEK,EAAIC,EAAQvI,EAAUwI,CAAO,CAEpD,CACO,eAAeC,GAAgBR,EAAOK,EAAIC,EAAQvI,EAAU,CAC/D,MAAMkI,EAAcD,EAAM,OAC1B,QAAQtH,EAAI,EAAGA,EAAIuH,EAAavH,IAC5B,MAAMsH,EAAMtH,CAAC,EAAE2H,EAAIC,EAAQvI,CAAQ,CAE3C,CACO,eAAe0I,GAAeT,EAAOK,EAAI,CAC5C,MAAMJ,EAAcD,EAAM,OAC1B,QAAQtH,EAAI,EAAGA,EAAIuH,EAAavH,IAC5B,MAAMsH,EAAMtH,CAAC,EAAE2H,CAAE,CAEzB,CCzCA,SAASK,GAAWC,EAAM,CACtB,MAAMC,EAAQD,EAAK,EACnB,OAAAA,EAAK,EAAIC,EAAM,EACfA,EAAM,EAAID,EACVA,EAAK,EAAI,KAAK,IAAIE,EAAUF,EAAK,CAAC,EAAGE,EAAUF,EAAK,CAAC,CAAC,EAAI,EAC1DC,EAAM,EAAI,KAAK,IAAIC,EAAUD,EAAM,CAAC,EAAGC,EAAUD,EAAM,CAAC,CAAC,EAAI,EACtDA,CACX,CACA,SAASE,GAAYH,EAAM,CACvB,MAAMI,EAAOJ,EAAK,EAClB,OAAAA,EAAK,EAAII,EAAK,EACdA,EAAK,EAAIJ,EACTA,EAAK,EAAI,KAAK,IAAIE,EAAUF,EAAK,CAAC,EAAGE,EAAUF,EAAK,CAAC,CAAC,EAAI,EAC1DI,EAAK,EAAI,KAAK,IAAIF,EAAUE,EAAK,CAAC,EAAGF,EAAUE,EAAK,CAAC,CAAC,EAAI,EACnDA,CACX,CA8CO,SAASC,GAAYL,EAAMM,EAAKC,EAAK,CACxC,MAAM/E,EAAS,CAAA,EACf,SAASgF,EAASR,EAAM,CAChBA,IAAS,OAGTM,EAAMN,EAAK,GACXQ,EAASR,EAAK,CAAC,EAEfA,EAAK,GAAKM,GAAON,EAAK,GAAKO,GAC3B5I,EAAc6D,EAAQwE,EAAK,CAAC,EAE5BO,EAAMP,EAAK,GACXQ,EAASR,EAAK,CAAC,EAEtB,CACD,OAAAQ,EAASR,EAAK,IAAI,EACXxE,CACX,CACO,SAASiF,GAAYT,EAAMpE,EAAK8E,EAAY,GAAO,CACtD,MAAMlF,EAAS,CAAA,EACf,GAAIwE,IAAS,KAAM,OAAOxE,EAC1B,MAAMmF,EAAQ,CACVX,EAAK,IACb,EACI,KAAMW,EAAM,OAAS,GAAE,CACnB,MAAMX,EAAOW,EAAM,MACdX,IAGDU,GAAaV,EAAK,GAAKpE,GACvBjE,EAAc6D,EAAQwE,EAAK,CAAC,EAE5B,CAACU,GAAaV,EAAK,EAAIpE,GACvBjE,EAAc6D,EAAQwE,EAAK,CAAC,EAEhCW,EAAM,KAAKX,EAAK,CAAC,EACjBW,EAAM,KAAKX,EAAK,CAAC,EACpB,CACD,OAAOxE,CACX,CACO,SAASoF,GAASZ,EAAMpE,EAAK8E,EAAY,GAAO,CACnD,MAAMlF,EAAS,CAAA,EACf,GAAIwE,IAAS,KAAM,OAAOxE,EAC1B,MAAMmF,EAAQ,CACVX,EAAK,IACb,EACI,KAAMW,EAAM,OAAS,GAAE,CACnB,MAAMX,EAAOW,EAAM,MACdX,IAGDU,GAAaV,EAAK,GAAKpE,GACvBjE,EAAc6D,EAAQwE,EAAK,CAAC,EAE5B,CAACU,GAAaV,EAAK,EAAIpE,GACvBjE,EAAc6D,EAAQwE,EAAK,CAAC,EAEhCW,EAAM,KAAKX,EAAK,CAAC,EACjBW,EAAM,KAAKX,EAAK,CAAC,EACpB,CACD,OAAOxE,CACX,CACA,SAASqF,GAAab,EAAMpE,EAAK,CAC7B,KAAMoE,IAAS,MACX,GAAIpE,EAAMoE,EAAK,EACXA,EAAOA,EAAK,UACLpE,EAAMoE,EAAK,EAClBA,EAAOA,EAAK,MAEZ,QAAOA,EAGf,OAAO,IACX,CACO,SAAShC,GAAOpC,EAAKlD,EAAO,CAC/B,MAAO,CACH,KAAM,CACF,EAAGkD,EACH,EAAGlD,EACH,EAAG,KACH,EAAG,KACH,EAAG,CACN,CACT,CACA,CACO,SAASoI,GAAOC,EAAUnF,EAAKoF,EAAU,CAC5C,SAASC,EAAWjB,EAAMpE,EAAKoF,EAAU,CACrC,GAAIhB,IAAS,KACT,MAAO,CACH,EAAGpE,EACH,EAAGoF,EACH,EAAG,KACH,EAAG,KACH,EAAG,CACnB,EAEQ,GAAIpF,EAAMoE,EAAK,EACXA,EAAK,EAAIiB,EAAWjB,EAAK,EAAGpE,EAAKoF,CAAQ,UAClCpF,EAAMoE,EAAK,EAClBA,EAAK,EAAIiB,EAAWjB,EAAK,EAAGpE,EAAKoF,CAAQ,MACtC,CACH,UAAWtI,KAASsI,EAChBhB,EAAK,EAAE,KAAKtH,CAAK,EAErB,OAAOsH,CACV,CACDA,EAAK,EAAI,EAAI,KAAK,IAAIE,EAAUF,EAAK,CAAC,EAAGE,EAAUF,EAAK,CAAC,CAAC,EAC1D,MAAMkB,EAAgBhB,EAAUF,EAAK,CAAC,EAAIE,EAAUF,EAAK,CAAC,EAC1D,OAAIkB,EAAgB,GAAKtF,EAAMoE,EAAK,EAAE,EAC3BG,GAAYH,CAAI,EAEvBkB,EAAgB,IAAMtF,EAAMoE,EAAK,EAAE,EAC5BD,GAAWC,CAAI,EAEtBkB,EAAgB,GAAKtF,EAAMoE,EAAK,EAAE,GAClCA,EAAK,EAAID,GAAWC,EAAK,CAAC,EACnBG,GAAYH,CAAI,GAEvBkB,EAAgB,IAAMtF,EAAMoE,EAAK,EAAE,GACnCA,EAAK,EAAIG,GAAYH,EAAK,CAAC,EACpBD,GAAWC,CAAI,GAEnBA,CACV,CACDe,EAAS,KAAOE,EAAWF,EAAS,KAAMnF,EAAKoF,CAAQ,CAC3D,CACA,SAASd,EAAUF,EAAM,CACrB,OAAOA,IAAS,KAAOA,EAAK,EAAI,EACpC,CACO,SAASmB,GAAKC,EAAMxF,EAAK,CAC5B,MAAMoE,EAAOa,GAAaO,EAAK,KAAMxF,CAAG,EACxC,OAAIoE,IAAS,KACF,KAEJA,EAAK,CAChB,CACO,SAASxB,GAAOuC,EAAUnF,EAAK,CAClC,GAAImF,IAAa,MAAQA,EAAS,OAAS,KACvC,OAEJ,IAAIf,EAAOe,EAAS,KAChBM,EAAa,KACjB,KAAMrB,GAAQ,MAAQA,EAAK,IAAMpE,GAC7ByF,EAAarB,EACTpE,EAAMoE,EAAK,EACXA,EAAOA,EAAK,EAEZA,EAAOA,EAAK,EAGpB,GAAIA,IAAS,KACT,QAEe,IAAI,CACnB,GAAIA,EAAK,IAAM,MAAQA,EAAK,IAAM,KAC1BqB,IAAe,KACfN,EAAS,KAAO,KAEZM,EAAW,IAAMrB,EACjBqB,EAAW,EAAI,KAEfA,EAAW,EAAI,aAGhBrB,EAAK,GAAK,MAAQA,EAAK,GAAK,KAAM,CACzC,IAAIsB,EAAetB,EAAK,EACpBuB,EAAiBvB,EACrB,KAAMsB,EAAa,GAAK,MACpBC,EAAiBD,EACjBA,EAAeA,EAAa,EAEhCtB,EAAK,EAAIsB,EAAa,EAClBC,IAAmBvB,EACnBuB,EAAe,EAAID,EAAa,EAEhCC,EAAe,EAAID,EAAa,CAEhD,KAAe,CACH,MAAME,EAAYxB,EAAK,GAAK,KAAOA,EAAK,EAAIA,EAAK,EAC7CqB,IAAe,KACfN,EAAS,KAAOS,EAEZH,EAAW,IAAMrB,EACjBqB,EAAW,EAAIG,EAEfH,EAAW,EAAIG,CAG1B,CACT,IAEA,CACO,SAASC,GAAeL,EAAMxD,EAAIhC,EAAK,CAC1C,MAAMoE,EAAOa,GAAaO,EAAK,KAAMxF,CAAG,EACxC,GAAKoE,EAGL,IAAIA,EAAK,EAAE,SAAW,EAAG,CACrBxB,GAAO4C,EAAMxF,CAAG,EAChB,MACH,CACDoE,EAAK,EAAE,OAAOA,EAAK,EAAE,QAAQpC,CAAE,EAAG,CAAC,EACvC,CCxQO,SAASI,IAAS,CACrB,MAAO,CACH,mBAAoB,IAAI,GAChC,CACA,CACO,SAAS8C,GAAOM,EAAMxF,EAAKlD,EAAO,CACrC,OAAI0I,EAAK,mBAAmB,IAAIxF,CAAG,GAC/BwF,EAAK,mBAAmB,IAAIxF,CAAG,EAAE,KAAKlD,CAAK,EACpC0I,IAEXA,EAAK,mBAAmB,IAAIxF,EAAK,CAC7BlD,CACR,CAAK,EACM0I,EACX,CAUO,SAASK,GAAeL,EAAMxD,EAAIhC,EAAK,CAC1C,IAAI8F,EAA8BC,EACUP,GAAK,mBAAmB,IAAIxF,IAAO8F,EAA2EN,GAAK,mBAAmB,IAAIxF,CAAG,KAAO,MAAQ8F,IAAiC,OAAS,OAASA,EAA6B,OAAQE,GAAIA,IAAMhE,CAAE,IAAM,CAAA,CAAE,IAC9S+D,EAA4EP,GAAK,mBAAmB,IAAIxF,CAAG,KAAO,MAAQ+F,IAAkC,OAAS,OAASA,EAA8B,UAAY,GAC9KP,GAAK,mBAAmB,OAAOxF,CAAG,CAEtF,CAWO,SAASiG,GAAOT,EAAMU,EAAW,CACpC,MAAMC,EAAgB,OAAO,KAAKD,CAAS,EAC3C,GAAIC,EAAc,SAAW,EACzB,MAAM,IAAI,MAAM,mBAAmB,EAEvC,MAAMC,EAAgBD,EAAc,CAAC,EACrC,OAAOC,EAAa,CAChB,IAAK,KACD,CACI,MAAMtJ,EAAQoJ,EAAUE,CAAa,EACrC,OAAOZ,EAAK,mBAAmB,IAAI1I,CAAK,GAAK,CAAA,CAChD,CACL,IAAK,KACD,CACI,MAAMA,EAAQoJ,EAAUE,CAAa,EAC/BxG,EAAS,CAAA,EACf,UAAWoG,KAAKlJ,EAAM,CAClB,MAAM2F,EAAM+C,EAAK,mBAAmB,IAAIQ,CAAC,EACrCvD,GAAO,MACP1G,EAAc6D,EAAQ6C,CAAG,CAEhC,CACD,OAAO7C,CACV,CACL,IAAK,MACD,CACI,MAAM9C,EAAQoJ,EAAUE,CAAa,EAC/BxG,EAAS,CAAA,EACTyG,EAAOb,EAAK,mBAAmB,KAAI,EACzC,UAAWxF,KAAOqG,EAAK,CACnB,GAAIvJ,EAAM,SAASkD,CAAG,EAClB,SAEJ,MAAMyC,EAAM+C,EAAK,mBAAmB,IAAIxF,CAAG,EACvCyC,GAAO,MACP1G,EAAc6D,EAAQ6C,CAAG,CAEhC,CACD,OAAO7C,CACV,CACR,CACD,MAAM,IAAI,MAAM,mBAAmB,CACvC,CACO,SAAS0G,GAAUd,EAAMU,EAAW,CACvC,MAAMC,EAAgB,OAAO,KAAKD,CAAS,EAC3C,GAAIC,EAAc,SAAW,EACzB,MAAM,IAAI,MAAM,mBAAmB,EAEvC,MAAMC,EAAgBD,EAAc,CAAC,EACrC,OAAOC,EAAa,CAChB,IAAK,cACD,CAEI,MAAM3D,EADSyD,EAAUE,CAAa,EACnB,IAAKtJ,GAAQ0I,EAAK,mBAAmB,IAAI1I,CAAK,GAAK,CAAE,CAAA,EACxE,OAAOiB,GAAU0E,CAAG,CACvB,CACR,CACD,MAAM,IAAI,MAAM,mBAAmB,CACvC,CCjGI,SAAS8D,GAAoB1I,EAAGC,EAAG0I,EAAW,CAE9C,GAAI3I,IAAMC,EACN,MAAO,GAGX,MAAM2I,EAAO5I,EACTA,EAAE,OAASC,EAAE,SACbD,EAAIC,EACJA,EAAI2I,GAER,IAAIC,EAAO7I,EAAE,OACT8I,EAAO7I,EAAE,OAET8I,EAAW,EACf,KAAMA,EAAWF,GAAQ7I,EAAE,WAAW+I,CAAQ,IAAM9I,EAAE,WAAW8I,CAAQ,GACrEA,IAKJ,GAAIA,IAAaF,EACb,MAAO,GAIX,KAAMA,EAAO,GAAK7I,EAAE,WAAW,CAAC,CAAC6I,CAAI,IAAM5I,EAAE,WAAW,CAAC,CAAC6I,CAAI,GAC1DD,IACAC,IAGJ,GAAI,CAACD,EACD,OAAOC,EAAOH,EAAY,GAAKG,EAOnC,GALAD,GAAQE,EACRD,GAAQC,EAIJF,GAAQF,GAAaG,GAAQH,EAC7B,OAAOE,EAAOC,EAAOD,EAAOC,EAEhC,MAAME,EAAQF,EAAOD,EACrB,GAAIF,EAAYG,EACZH,EAAYG,UACLE,EAAQL,EACf,MAAO,GAEX,IAAIrK,EAAI,EACR,MAAM2K,EAAM,CAAA,EACNC,EAAqB,CAAA,EAC3B,KAAM5K,EAAIqK,GACNO,EAAmB5K,CAAC,EAAI2B,EAAE,WAAW8I,EAAWzK,CAAC,EACjD2K,EAAI3K,CAAC,EAAI,EAAEA,EAEf,KAAMA,EAAIwK,GACNI,EAAmB5K,CAAC,EAAI2B,EAAE,WAAW8I,EAAWzK,CAAC,EACjD2K,EAAI3K,GAAG,EAAIqK,EAAY,EAE3B,MAAMQ,EAASR,EAAYK,EACrBI,EAAUT,EAAYG,EAC5B,IAAIO,EAAS,EACTC,EAAOX,EACP1H,EAAU,EACV0F,EAAO,EACP4C,EAAQ,EACRC,EAAQ,EACRrI,EAAI,EAER,IAAI7C,EAAI,EAAGA,EAAIuK,EAAMvK,IAAI,CAMrB,IALAqI,EAAOrI,EACP2C,EAAU3C,EAAI,EACdkL,EAAQxJ,EAAE,WAAW+I,EAAWzK,CAAC,EACjC+K,GAAU/K,EAAI6K,EAAS,EAAI,EAC3BG,GAAQA,EAAOR,EAAO,EAAI,EACtB3H,EAAIkI,EAAQlI,EAAImI,EAAMnI,IACtBoI,EAAQtI,EACRA,EAAU0F,EACVA,EAAOsC,EAAI9H,CAAC,EACRqI,IAAUN,EAAmB/H,CAAC,IAE1BwF,EAAO1F,IACPA,EAAU0F,GAGV4C,EAAQtI,IACRA,EAAUsI,GAEdtI,KAEJgI,EAAI9H,CAAC,EAAIF,EAEb,GAAImI,GAAWH,EAAI3K,EAAI0K,CAAK,EAAIL,EAC5B,MAAO,EAEd,CACD,OAAO1H,GAAW0H,EAAY1H,EAAU,EAC5C,CAcO,SAASwI,GAAuBzJ,EAAGC,EAAG0I,EAAW,CACpD,MAAMnH,EAAWkH,GAAoB1I,EAAGC,EAAG0I,CAAS,EACpD,MAAO,CACH,SAAAnH,EACA,UAAWA,GAAY,CAC/B,CACA,CCtHO,MAAMkI,EAAK,CACd,YAAYvH,EAAKwH,EAASC,EAAI,CAC1B,KAAK,EAAIzH,EACT,KAAK,EAAIwH,EACT,KAAK,EAAIC,CACZ,CAED,EAAI,CAAA,EAEJ,EAAI,CAAA,EAEJ,EAAI,GACJ,QAAS,CACL,MAAO,CACH,EAAG,KAAK,EACR,EAAG,KAAK,EACR,EAAG,KAAK,EACR,EAAG,KAAK,EACR,EAAG,KAAK,CACpB,CACK,CACL,CACA,SAASC,EAAatD,EAAMuD,EAAQ,CAChCvD,EAAK,EAAIuD,EAAO,EAAIvD,EAAK,CAC7B,CACA,SAASwD,EAAYxD,EAAMyD,EAAO,CAC9BzD,EAAK,EAAE,KAAKyD,CAAK,CACrB,CACA,SAAShC,GAAezB,EAAMyD,EAAO,CACjC,MAAMC,EAAQ1D,EAAK,EAAE,QAAQyD,CAAK,EACX,OAAIC,IAAU,GAC1B,IAEX1D,EAAK,EAAE,OAAO0D,EAAO,CAAC,EACf,GACX,CACA,SAASC,GAAa3D,EAAM4D,EAAQC,EAAMC,EAAO1B,EAAW,CACxD,GAAIpC,EAAK,EAAG,CACR,KAAM,CAAE,EAAAnH,EAAI,EAAGkL,CAAM,EAAM/D,EAC3B,GAAI8D,GAASjL,IAAMgL,EACf,MAAO,GAqBX,GAjBIxK,EAAeuK,EAAQ/K,CAAC,GAAK,OACzBuJ,EAEmB,KAAK,IAAIyB,EAAK,OAAShL,EAAE,MAAM,GAGhCuJ,GAAac,GAAuBW,EAAMhL,EAAGuJ,CAAS,EAAE,YACtEwB,EAAO/K,CAAC,EAAI,IAIhB+K,EAAO/K,CAAC,EAAI,IAMhBQ,EAAeuK,EAAQ/K,CAAC,GAAK,MAAQkL,EAAO,OAAS,EAAG,CACxD,MAAMC,EAAO,IAAI,IAAIJ,EAAO/K,CAAC,CAAC,EACxBoL,EAAeF,EAAO,OAC5B,QAAQhM,EAAI,EAAGA,EAAIkM,EAAclM,IAC7BiM,EAAK,IAAID,EAAOhM,CAAC,CAAC,EAEtB6L,EAAO/K,CAAC,EAAI,MAAM,KAAKmL,CAAI,CAC9B,CACJ,CAED,UAAWE,KAAa,OAAO,KAAKlE,EAAK,CAAC,EACtC2D,GAAa3D,EAAK,EAAEkE,CAAS,EAAGN,EAAQC,EAAMC,EAAO1B,CAAS,EAElE,OAAOwB,CACX,CACA,SAASO,GAAgB1K,EAAGC,EAAG,CAC3B,IAAI0K,EAAe,GACnB,MAAMC,EAAM,KAAK,IAAI5K,EAAE,OAAQC,EAAE,MAAM,EACvC,QAAQ3B,EAAI,EAAGA,EAAIsM,EAAKtM,IAAI,CACxB,GAAI0B,EAAE1B,CAAC,IAAM2B,EAAE3B,CAAC,EACZ,OAAOqM,EAEXA,GAAgB3K,EAAE1B,CAAC,CACtB,CACD,OAAOqM,CACX,CACO,SAASpG,EAAOqF,EAAM,GAAOD,EAAU,GAAIxH,EAAM,GAAI,CACxD,OAAO,IAAIuH,GAAKvH,EAAKwH,EAASC,CAAG,CACrC,CACO,SAASvC,GAAOM,EAAMkD,EAAMC,EAAO,CACtC,MAAMC,EAAaF,EAAK,OACxB,QAAQvM,EAAI,EAAGA,EAAIyM,EAAYzM,IAAI,CAC/B,MAAM0M,EAAmBH,EAAKvM,CAAC,EACzB2M,EAAcJ,EAAK,UAAUvM,CAAC,EAC9B4M,EAAuBvD,EAAK,EAAEqD,CAAgB,EACpD,GAAIE,EAAsB,CACtB,MAAMC,EAAYD,EAAqB,EACjCE,EAAkBD,EAAU,OAC5BR,EAAeD,GAAgBS,EAAWF,CAAW,EACrDI,EAAqBV,EAAa,OAExC,GAAIQ,IAAcF,EAAa,CAC3BlB,EAAYmB,EAAsBJ,CAAK,EACvCI,EAAqB,EAAI,GACzB,MACH,CACD,MAAMI,EAA0BH,EAAUE,CAAkB,EAE5D,GAAIA,EAAqBD,GAAmBC,IAAuBJ,EAAY,OAAQ,CACnF,MAAMM,EAAUhH,EAAO,GAAM0G,EAAaD,CAAgB,EAE1DO,EAAQ,EAAED,CAAuB,EAAIJ,EACrC,MAAMM,EAAeD,EAAQ,EAAED,CAAuB,EACtDE,EAAa,EAAIL,EAAU,UAAUE,CAAkB,EACvDG,EAAa,EAAIF,EACjB3D,EAAK,EAAEqD,CAAgB,EAAIO,EAC3B1B,EAAa0B,EAAS5D,CAAI,EAC1BkC,EAAa2B,EAAcD,CAAO,EAClCxB,EAAYwB,EAAST,CAAK,EAC1B,MACH,CAED,GAAIO,EAAqBD,GAAmBC,EAAqBJ,EAAY,OAAQ,CACjF,MAAMQ,EAAgBlH,EAAO,GAAOoG,EAAcK,CAAgB,EAClES,EAAc,EAAEH,CAAuB,EAAIJ,EAC3CvD,EAAK,EAAEqD,CAAgB,EAAIS,EAC3B,MAAMC,EAAqBD,EAAc,EAAEH,CAAuB,EAClEI,EAAmB,EAAIP,EAAU,UAAUE,CAAkB,EAC7DK,EAAmB,EAAIJ,EACvB,MAAMK,EAAqBV,EAAYI,CAAkB,EACnDE,EAAUhH,EAAO,GAAMsG,EAAK,UAAUvM,EAAI+M,CAAkB,EAAGM,CAAkB,EACvF5B,EAAYwB,EAAST,CAAK,EAC1BW,EAAc,EAAEE,CAAkB,EAAIJ,EACtC1B,EAAa4B,EAAe9D,CAAI,EAChCkC,EAAa0B,EAASE,CAAa,EACnC5B,EAAa6B,EAAoBD,CAAa,EAC9C,MACH,CAEDnN,GAAK8M,EAAkB,EAEvBzD,EAAOuD,CACnB,KAAe,CAEH,MAAMK,EAAUhH,EAAO,GAAM0G,EAAaD,CAAgB,EAC1DjB,EAAYwB,EAAST,CAAK,EAC1BnD,EAAK,EAAEqD,CAAgB,EAAIO,EAC3B1B,EAAa0B,EAAS5D,CAAI,EAC1B,MACH,CACJ,CACL,CACA,SAASiE,EAAiBrF,EAAM6D,EAAMH,EAAOtB,EAAWkD,EAAmB1B,EAAQ,CAC/E,GAAI,EAAAxB,EAAY,GAGhB,IAAIpC,EAAK,EAAE,WAAW6D,CAAI,EAAG,CACzBF,GAAa3D,EAAM4D,EAAQC,EAAM,GAAO,CAAC,EACzC,MACH,CACD,GAAI7D,EAAK,EAAG,CACR,KAAM,CAAE,EAAAnH,EAAI,EAAGkL,CAAM,EAAM/D,EAC3B,GAAInH,IACIqK,GAAuBW,EAAMhL,EAAGyM,CAAiB,EAAE,YACnD1B,EAAO/K,CAAC,EAAI,IAEZQ,EAAeuK,EAAQ/K,CAAC,GAAK,MAAQkL,EAAO,OAAS,GAAG,CACxD,MAAMC,EAAO,IAAI,IAAIJ,EAAO/K,CAAC,CAAC,EACxBoL,EAAeF,EAAO,OAC5B,QAAQhM,EAAI,EAAGA,EAAIkM,EAAclM,IAC7BiM,EAAK,IAAID,EAAOhM,CAAC,CAAC,EAEtB6L,EAAO/K,CAAC,EAAI,MAAM,KAAKmL,CAAI,CAC9B,CAER,CACD,GAAI,EAAAN,GAASG,EAAK,QAIlB,CAAIA,EAAKH,CAAK,IAAK1D,EAAK,GACpBqF,EAAiBrF,EAAK,EAAE6D,EAAKH,CAAK,CAAC,EAAGG,EAAMH,EAAQ,EAAGtB,EAAWkD,EAAmB1B,CAAM,EAI/FyB,EAAiBrF,EAAM6D,EAAMH,EAAQ,EAAGtB,EAAY,EAAGkD,EAAmB1B,CAAM,EAEhF,UAAUM,KAAalE,EAAK,EACxBqF,EAAiBrF,EAAK,EAAEkE,CAAS,EAAGL,EAAMH,EAAOtB,EAAY,EAAGkD,EAAmB1B,CAAM,EAG7F,UAAUM,KAAalE,EAAK,EACpBkE,IAAcL,EAAKH,CAAK,GACxB2B,EAAiBrF,EAAK,EAAEkE,CAAS,EAAGL,EAAMH,EAAQ,EAAGtB,EAAY,EAAGkD,EAAmB1B,CAAM,GAGzG,CACO,SAASzC,GAAKC,EAAM,CAAE,KAAAyC,EAAO,MAAAC,EAAQ,UAAA1B,CAAS,EAAK,CAKtD,GAAIA,GAAa,CAAC0B,EAAO,CACrB,MAAMF,EAAS,CAAA,EACf,OAAAxB,EAAYA,GAAa,EACzBiD,EAAiBjE,EAAMyC,EAAM,EAAGzB,GAAa,EAAGA,EAAWwB,CAAM,EAC1DA,CACf,KAAW,CACH,MAAM2B,EAAa1B,EAAK,OACxB,QAAQ,EAAI,EAAG,EAAI0B,EAAY,IAAI,CAC/B,MAAMrB,EAAYL,EAAK,CAAC,EACxB,GAAIK,KAAa9C,EAAK,EAAG,CACrB,MAAMuD,EAAuBvD,EAAK,EAAE8C,CAAS,EACvCU,EAAYD,EAAqB,EACjCa,EAAgB3B,EAAK,UAAU,CAAC,EAGhCiB,EADeX,GAAgBS,EAAWY,CAAa,EACrB,OAGxC,GAAIV,IAAuBF,EAAU,QAAUE,IAAuBU,EAAc,OAAQ,CAExF,GAAIpD,EAAW,MACf,MAAO,EACV,CAED,GAAKuC,EAAqB,EAAE,OAAS,EAErCvD,EAAOuD,CACvB,KACgB,OAAO,EAEd,CACD,MAAMf,EAAS,CAAA,EAEf,OAAAD,GAAavC,EAAMwC,EAAQC,EAAMC,EAAO1B,CAAS,EAC1CwB,CACV,CACL,CA2CO,SAAS6B,GAAqBrE,EAAMyC,EAAMJ,EAAOK,EAAQ,GAAM,CAClE,GAAI,CAACD,EACD,MAAO,GAEX,MAAM0B,EAAa1B,EAAK,OACxB,QAAQ9L,EAAI,EAAGA,EAAIwN,EAAYxN,IAAI,CAC/B,MAAMmM,EAAYL,EAAK9L,CAAC,EACxB,GAAImM,KAAa9C,EAAK,EAAG,CACrB,MAAMuD,EAAuBvD,EAAK,EAAE8C,CAAS,EAC7CnM,GAAK4M,EAAqB,EAAE,OAAS,EACrCvD,EAAOuD,EACHb,GAAS1C,EAAK,IAAMyC,GAGpBpC,GAAeL,EAAMqC,CAAK,CAE1C,KACY,OAAO,EAEd,CACD,MAAO,EACX,CCjTA,MAAMiC,GAAI,EAEJC,GAAe,OAEd,SAAS3H,IAAS,CACrB,MAAO,CACH,KAAM,IACd,CACA,CACO,SAAS8C,GAAO8E,EAAMC,EAAO9B,EAAQ,CACxC,MAAMiB,EAAU,CACZ,MAAAa,EACA,OAAA9B,CACR,EACI,GAAI6B,EAAK,MAAQ,KAAM,CACnBA,EAAK,KAAOZ,EACZ,MACH,CACD,IAAIhF,EAAO4F,EAAK,KACZE,EAAQ,EACZ,KAAM9F,IAAS,MAAK,CAEhB,GAAIA,EAAK,MAAM,MAAQ6F,EAAM,KAAO7F,EAAK,MAAM,MAAQ6F,EAAM,IAAK,CAE9D,MAAME,EAAY/F,EAAK,QAAU,GACjCA,EAAK,OAAS,MAAM,KAAK,IAAI,IAAI,CAC7B,GAAG+F,EACH,GAAGhC,GAAU,CAAE,CAClB,CAAA,CAAC,EACF,MACH,CAGD,GAFa+B,EAAQJ,KAER,EACT,GAAIG,EAAM,IAAM7F,EAAK,MAAM,IAAK,CAC5B,GAAIA,EAAK,MAAQ,KAAM,CACnBA,EAAK,KAAOgF,EACZ,MACH,CACDhF,EAAOA,EAAK,IAC5B,KAAmB,CACH,GAAIA,EAAK,OAAS,KAAM,CACpBA,EAAK,MAAQgF,EACb,MACH,CACDhF,EAAOA,EAAK,KACf,SAGG6F,EAAM,IAAM7F,EAAK,MAAM,IAAK,CAC5B,GAAIA,EAAK,MAAQ,KAAM,CACnBA,EAAK,KAAOgF,EACZ,MACH,CACDhF,EAAOA,EAAK,IAC5B,KAAmB,CACH,GAAIA,EAAK,OAAS,KAAM,CACpBA,EAAK,MAAQgF,EACb,MACH,CACDhF,EAAOA,EAAK,KACf,CAEL8F,GACH,CACL,CA6BO,SAASE,GAAcJ,EAAMC,EAAOpC,EAAO,CAC9C,IAAIzD,EAAO4F,EAAK,KACZE,EAAQ,EACRzE,EAAa,KACb4E,EAAY,KAChB,KAAMjG,IAAS,MAAK,CAChB,GAAiDA,GAAK,MAAM,MAAS6F,EAAM,KAAO7F,EAAK,MAAM,MAAQ6F,EAAM,IAAK,CAC5G,IAAIK,EACJ,MAAMxC,GAASwC,EAAelG,EAAK,UAAY,MAAQkG,IAAiB,OAAS,OAASA,EAAa,QAAQzC,CAAK,EACpH,GAAIC,IAAU,QAAaA,EAAQ,GAAI,CACnC,IACAyC,GACCA,EAAgBnG,EAAK,UAAY,MAAQmG,IAAkB,QAAkBA,EAAc,OAAOzC,EAAO,CAAC,GACvG1D,EAAK,QAAU,MAAQA,EAAK,OAAO,SAAW,KAE1CqB,GAAc,KACV4E,IAAc,OACd5E,EAAW,KAAOrB,EAAK,OAAS,KAAOA,EAAK,KAAOA,EAAK,MACjDiG,IAAc,UACrB5E,EAAW,MAAQrB,EAAK,QAAU,KAAOA,EAAK,MAAQA,EAAK,MAI/D4F,EAAK,KAAO5F,EAAK,OAAS,KAAOA,EAAK,KAAOA,EAAK,OAG1D,MACH,CACJ,CACD,MAAMoG,EAAON,EAAQJ,GACrBrE,EAAarB,EAEToG,IAAS,EACLP,EAAM,IAAM7F,EAAK,MAAM,KACvBA,EAAmDA,GAAK,KACxDiG,EAAY,SAEZjG,EAAmDA,GAAK,MACxDiG,EAAY,SAIZJ,EAAM,IAAM7F,EAAK,MAAM,KACvBA,EAAmDA,GAAK,KACxDiG,EAAY,SAEZjG,EAAmDA,GAAK,MACxDiG,EAAY,SAGpBH,GACH,CACL,CA6BO,SAASO,GAAerG,EAAMsG,EAAQC,EAAQ7F,EAAY,GAAM8F,EAAO,MAAOC,EAAgB,GAAO,CACxG,MAAMC,EAAaD,EAAgBE,GAAmBC,GAChDjG,EAAQ,CACV,CACI,KAAAX,EACA,MAAO,CACV,CACT,EACUxE,EAAS,CAAA,EACf,KAAMmF,EAAM,OAAS,GAAE,CACnB,KAAM,CAAE,KAAAX,EAAO,MAAA8F,CAAQ,EAAGnF,EAAM,IAAG,EACnC,GAAIX,IAAS,KAAM,SACnB,MAAM6G,EAAOH,EAAWJ,EAAQtG,EAAK,KAAK,GACtCU,EAAYmG,GAAQN,EAASM,EAAON,IACpC/K,EAAO,KAAK,CACR,MAAOwE,EAAK,MACZ,OAAQA,EAAK,QAAU,CAAE,CACzC,CAAa,EAEDA,EAAK,MAAQ,MACbW,EAAM,KAAK,CACP,KAAMX,EAAK,KACX,MAAO8F,EAAQ,CAC/B,CAAa,EAED9F,EAAK,OAAS,MACdW,EAAM,KAAK,CACP,KAAMX,EAAK,MACX,MAAO8F,EAAQ,CAC/B,CAAa,CAER,CACD,OAAIU,GACAhL,EAAO,KAAK,CAAC,EAAG9B,IAAI,CAChB,MAAMoN,EAAQJ,EAAWJ,EAAQ,EAAE,KAAK,EAClCS,EAAQL,EAAWJ,EAAQ5M,EAAE,KAAK,EACxC,OAAO8M,EAAK,gBAAkB,MAAQM,EAAQC,EAAQA,EAAQD,CAC1E,CAAS,EAEEtL,CACX,CACO,SAASwL,GAAgB5F,EAAM6F,EAASvG,EAAY,GAAM8F,EAAO,KAAMC,EAAgB,GAAO,CACjG,MAAM9F,EAAQ,CACV,CACI,KAAMS,EACN,MAAO,CACV,CACT,EACU5F,EAAS,CAAA,EACf,KAAMmF,EAAM,OAAS,GAAE,CACnB,MAAMuG,EAAOvG,EAAM,MACnB,GAAIuG,GAAQ,MAAQA,EAAK,MAAQ,KAAM,SACvC,KAAM,CAAE,KAAAlH,EAAO,MAAA8F,CAAQ,EAAGoB,EACpBC,EAAYrB,EAAQ,EACtB9F,EAAK,MAAQ,MACbW,EAAM,KAAK,CACP,KAAMX,EAAK,KACX,MAAOmH,CACvB,CAAa,EAEDnH,EAAK,OAAS,MACdW,EAAM,KAAK,CACP,KAAMX,EAAK,MACX,MAAOmH,CACvB,CAAa,EAEL,MAAMC,EAAkBC,GAAiBJ,EAASjH,EAAK,KAAK,EACxDoH,GAAmB1G,EACnBlF,EAAO,KAAK,CACR,MAAOwE,EAAK,MACZ,OAAQA,EAAK,QAAU,CAAE,CACzC,CAAa,EACM,CAACoH,GAAmB,CAAC1G,GAC5BlF,EAAO,KAAK,CACR,MAAOwE,EAAK,MACZ,OAAQA,EAAK,QAAU,CAAE,CACzC,CAAa,CAER,CACD,MAAMsH,EAAWC,GAAyBN,CAAO,EACjD,GAAIT,EAAM,CACN,MAAMgB,EAASf,EAAgBE,GAAmBC,GAClDpL,EAAO,KAAK,CAAC,EAAG9B,IAAI,CAChB,MAAMoN,EAAQU,EAAOF,EAAU,EAAE,KAAK,EAChCP,EAAQS,EAAOF,EAAU5N,EAAE,KAAK,EACtC,OAAO8M,EAAK,gBAAkB,MAAQM,EAAQC,EAAQA,EAAQD,CAC1E,CAAS,CACJ,CACD,OAAOtL,CACX,CACA,SAAS+L,GAAyBN,EAAS,CACvC,IAAIQ,EAAY,EACZC,EAAY,EACZC,EAAY,EAChB,MAAMC,EAAgBX,EAAQ,OAC9B,QAAQ,EAAI,EAAGrM,EAAIgN,EAAgB,EAAG,EAAIA,EAAehN,EAAI,IAAI,CAC7D,MAAMiN,EAAKZ,EAAQ,CAAC,EAAE,IAChBa,EAAKb,EAAQ,CAAC,EAAE,IAChBc,EAAKd,EAAQrM,CAAC,EAAE,IAChBoN,EAAKf,EAAQrM,CAAC,EAAE,IAChBqN,EAAcJ,EAAKG,EAAKD,EAAKD,EACnCL,GAAaQ,EACbP,IAAcG,EAAKE,GAAME,EACzBN,IAAcG,EAAKE,GAAMC,CAC5B,CACDR,GAAa,EACb,MAAMS,EAAqB,EAAIT,EAC/B,OAAAC,GAAaQ,EACbP,GAAaO,EACN,CACH,IAAKR,EACL,IAAKC,CACb,CACA,CACA,SAASN,GAAiBJ,EAASpB,EAAO,CACtC,IAAIsC,EAAW,GACf,MAAMC,EAAIvC,EAAM,IACVwC,EAAIxC,EAAM,IACV+B,EAAgBX,EAAQ,OAC9B,QAAQ,EAAI,EAAGrM,EAAIgN,EAAgB,EAAG,EAAIA,EAAehN,EAAI,IAAI,CAC7D,MAAMiN,EAAKZ,EAAQ,CAAC,EAAE,IAChBa,EAAKb,EAAQ,CAAC,EAAE,IAChBc,EAAKd,EAAQrM,CAAC,EAAE,IAChBoN,EAAKf,EAAQrM,CAAC,EAAE,IACJkN,EAAKO,GAAML,EAAKK,GAAKD,GAAKL,EAAKF,IAAOQ,EAAIP,IAAOE,EAAKF,GAAMD,IAC/DM,EAAW,CAACA,EAC9B,CACD,OAAOA,CACX,CACA,SAASvB,GAAkB0B,EAAQC,EAAQ,CACvC,MAAMC,EAAI,KAAK,GAAK,IACdC,EAAOH,EAAO,IAAME,EACpBE,EAAOH,EAAO,IAAMC,EACpBG,GAAYJ,EAAO,IAAMD,EAAO,KAAOE,EACvCI,GAAYL,EAAO,IAAMD,EAAO,KAAOE,EACvC/O,EAAI,KAAK,IAAIkP,EAAW,CAAC,EAAI,KAAK,IAAIA,EAAW,CAAC,EAAI,KAAK,IAAIF,CAAI,EAAI,KAAK,IAAIC,CAAI,EAAI,KAAK,IAAIE,EAAW,CAAC,EAAI,KAAK,IAAIA,EAAW,CAAC,EACtIC,EAAI,EAAI,KAAK,MAAM,KAAK,KAAKpP,CAAC,EAAG,KAAK,KAAK,EAAIA,CAAC,CAAC,EACvD,OAAOkM,GAAekD,CAC1B,CACA,SAASlC,GAAiB2B,EAAQC,EAAQ,CAKtC,MAAMO,EAAI,qBAEJpP,GAAK,EAAIoP,GAAK,QAEdN,EAAI,KAAK,GAAK,IACdC,EAAOH,EAAO,IAAME,EACpBE,EAAOH,EAAO,IAAMC,EACpBI,GAAYL,EAAO,IAAMD,EAAO,KAAOE,EAEvCO,EAAK,KAAK,MAAM,EAAID,GAAK,KAAK,IAAIL,CAAI,CAAC,EACvCO,EAAK,KAAK,MAAM,EAAIF,GAAK,KAAK,IAAIJ,CAAI,CAAC,EACvCO,EAAQ,KAAK,IAAIF,CAAE,EACnBG,EAAQ,KAAK,IAAIH,CAAE,EACnBI,EAAQ,KAAK,IAAIH,CAAE,EACnBI,EAAQ,KAAK,IAAIJ,CAAE,EAEzB,IAAIK,EAAST,EACTU,EAEAC,EAAiB,IACjBC,EACAC,EACAC,EACAC,EACAC,EAEJ,EAAG,CACC,MAAMC,EAAY,KAAK,IAAIR,CAAM,EAC3BS,EAAY,KAAK,IAAIT,CAAM,EAEjCK,EAAW,KAAK,KAAKN,EAAQS,GAAaT,EAAQS,IAAcX,EAAQC,EAAQF,EAAQG,EAAQU,IAAcZ,EAAQC,EAAQF,EAAQG,EAAQU,EAAU,EACxJH,EAAWV,EAAQE,EAAQD,EAAQE,EAAQU,EAC3CF,EAAQ,KAAK,MAAMF,EAAUC,CAAQ,EAErCH,EAAWN,EAAQE,EAAQS,EAAYH,EACvCD,EAAY,EAAID,EAAWA,EAC3B,MAAMO,EAAaJ,EAAW,EAAIV,EAAQE,EAAQM,EAE5CO,EAAIlB,EAAI,GAAKW,GAAa,EAAIX,GAAK,EAAI,EAAIW,IAEjDH,EAAaD,EAEbA,EAAST,GAAY,EAAIoB,GAAKlB,EAAIU,GAAYI,EAAQI,EAAIN,GAAYK,EAAaC,EAAIL,GAAY,GAAK,EAAII,EAAaA,IACjI,OAAY,KAAK,IAAIV,EAASC,CAAU,EAAI,OAAS,EAAEC,EAAiB,GAEpE,MAAMU,EAAKR,GAAa,QAAI,QAAI/P,EAAIA,IAAMA,EAAIA,GACxCwQ,EAAI,EAAID,EAAK,OAAS,KAAOA,GAAM,KAAOA,GAAM,IAAM,IAAMA,KAC5DE,EAAIF,EAAK,MAAQ,IAAMA,GAAM,KAAOA,GAAM,GAAK,GAAKA,KAEpDG,EAAaD,EAAIT,GAAYC,EAAW,EAAIV,EAAQE,EAAQM,EAAYU,EAAI,GAAKR,GAAY,GAAK,EAAID,EAAWA,GAAYS,EAAI,EAAIP,GAAS,GAAK,EAAIF,EAAWA,IAAa,GAAK,EAAIE,EAAQA,KAGtM,OADUlQ,EAAIwQ,GAAKN,EAAQQ,EAE/B,CCnXO,SAASC,GAAsBzQ,EAAQ0Q,EAAOC,EAAY,EAAGC,EAAe,CAC/E,GAAIF,IAAU,EACV,MAAMlP,EAAY,qBAAqB,EAE3C,MAAMqP,EAAiB,IAAI,IACrBC,EAAa9Q,EAAO,OAC1B,QAAQ7B,EAAI,EAAGA,EAAI2S,EAAY3S,IAAI,CAC/B,MAAMH,EAAMgC,EAAO7B,CAAC,EACd4S,EAAgB/S,EAAI,OAC1B,QAAQgD,EAAI,EAAGA,EAAI+P,EAAe/P,IAAI,CAClC,IAAIgQ,EACJ,KAAM,CAACC,EAAOC,CAAK,EAAIlT,EAAIgD,CAAC,EACtBmQ,EAAaD,EAAQR,EACrBU,GAAYJ,EAAsBH,EAAe,IAAII,CAAK,KAAO,MAAQD,IAAwB,OAAS,OAASA,EAAoB,CAAC,EAC9I,GAAII,IAAa,OAAW,CACxB,IAAIC,EACJR,EAAe,IAAII,EAAO,CACtBG,EAAW,IAAMD,KACdE,EAAuFR,GAAe,IAAII,CAAK,KAAO,MAAQI,IAAyB,OAAS,OAASA,EAAqB,CAAC,IAAM,GAAK,CACjO,CAAiB,CACjB,MACgBR,EAAe,IAAII,EAAO,CACtBE,EACA,CACpB,CAAiB,CAER,CACJ,CACD,MAAMG,EAAc,CAAA,EACpB,UAAWC,KAAmBV,EAAe,UACzCS,EAAY,KAAK,CACbC,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EAAE,CAAC,CAChC,CAAS,EAEL,MAAMvL,EAAUsL,EAAY,KAAK,CAACzR,EAAGC,IAAIA,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,EAGpD,GAAI8Q,IAAc,EACd,OAAO3K,EAGX,MAAMwL,EAAaxL,EAAQ,OACrByL,EAA8B,CAAA,EACpC,UAAWF,KAAmBV,EAAe,UACzCY,EAA4B,KAAK,CAC7BF,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EAAE,CAAC,EACpBA,EAAgB,CAAC,EAAE,CAAC,CAChC,CAAS,EAIL,MAAMG,EAAmBD,EAA4B,KAAK,CAAC5R,EAAGC,IAEtDD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAU,GACpBD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAU,EAEpBD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAU,GACpBD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAU,EAEjB,CACV,EACD,IAAI6R,EACJ,QAAQxT,EAAI,EAAGA,EAAIqT,GACXE,EAAiBvT,CAAC,EAAE,CAAC,IAAMyS,EADJzS,IAEvBwT,EAA2BxT,EAMnC,GAAI,OAAOwT,EAA6B,IAAa,CACjD,GAAIhB,IAAc,EACd,MAAO,GAEXgB,EAA2B,CAC9B,CACD,MAAMC,EAAyBF,EAAiB,OAC1CG,EAAwB,IAAI,MAAMD,CAAsB,EAC9D,QAAQzT,EAAI,EAAGA,EAAIyT,EAAwBzT,IACvC0T,EAAsB1T,CAAC,EAAI,CACvBuT,EAAiBvT,CAAC,EAAE,CAAC,EACrBuT,EAAiBvT,CAAC,EAAE,CAAC,CACjC,EAGI,GAAIwS,IAAc,EACd,OAAOkB,EAAsB,MAAM,EAAGF,EAA2B,CAAC,EAKtE,MAAMG,EAAkBH,EAA2B,KAAK,KAAKhB,EAAY,KAAOa,EAAaG,GAA4B,GAAG,EAC5H,OAAOE,EAAsB,MAAM,EAAGL,EAAaM,CAAe,CACtE,CACO,SAASC,GAAKC,EAAIC,EAAeC,EAAWC,EAAaC,EAAoB,CAAE,EAAAC,EAAI,EAAAvS,EAAI,EAAAwS,GAAM,CAEhG,OADY,KAAK,IAAI,GAAKJ,EAAYD,EAAgB,KAAQA,EAAgB,GAAI,GACpEK,EAAIN,GAAMK,EAAI,KAAOL,EAAKK,GAAK,EAAIvS,EAAIA,EAAIqS,EAAcC,GAC3E,CCpGO,SAASG,GAAaC,EAAQC,EAAc,CAC/C,IAAIC,EAAY,EAChB,QAAQvU,EAAI,EAAGA,EAAIsU,EAActU,IAC7BuU,GAAaF,EAAOrU,CAAC,EAAIqU,EAAOrU,CAAC,EAErC,OAAO,KAAK,KAAKuU,CAAS,CAC9B,CAEO,SAASC,GAAmBC,EAAcC,EAASC,EAAQnC,EAAY,GAAK,CAC/E,MAAMoC,EAAkBR,GAAaK,EAAcE,CAAM,EACnDE,EAAiB,CAAA,EACvB,SAAW,CAACC,EAAU,CAACP,EAAWF,CAAM,CAAC,IAAK,OAAO,QAAQK,CAAO,EAAE,CAClE,IAAIK,EAAa,EACjB,QAAQ/U,EAAI,EAAGA,EAAI2U,EAAQ3U,IACvB+U,GAAcN,EAAazU,CAAC,EAAIqU,EAAOrU,CAAC,EAE5C,MAAMgV,EAAaD,GAAcH,EAAkBL,GAC/CS,GAAcxC,GACdqC,EAAe,KAAK,CAChBC,EACAE,CAChB,CAAa,CAER,CACD,OAAOH,EAAe,KAAK,CAACnT,EAAGC,IAAIA,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,CAClD,CCfO,eAAeuT,GAA8BtJ,EAAOhI,EAAMkC,EAAIqP,EAAQnB,EAAW,CACpF,MAAMjO,EAAaF,EAAsB+F,EAAM,4BAA6B9F,CAAE,EAC9E8F,EAAM,eAAehI,CAAI,IAAMgI,EAAM,eAAehI,CAAI,GAAK,IAAMoQ,EAAY,GAAKmB,EAAO,QAAUnB,EACrGpI,EAAM,aAAahI,CAAI,EAAEmC,CAAU,EAAIoP,EAAO,OAC9CvJ,EAAM,YAAYhI,CAAI,EAAEmC,CAAU,EAAI,CAAA,CAC1C,CACO,eAAeqP,GAA2BxJ,EAAOhI,EAAMkC,EAAIqP,EAAQpC,EAAO,CAC7E,IAAIsC,EAAiB,EACrB,UAAWC,KAAKH,EACRG,IAAMvC,GACNsC,IAGR,MAAMtP,EAAaF,EAAsB+F,EAAM,4BAA6B9F,CAAE,EACxEgO,EAAKuB,EAAiBF,EAAO,OACnCvJ,EAAM,YAAYhI,CAAI,EAAEmC,CAAU,EAAEgN,CAAK,EAAIe,EACvCf,KAASnH,EAAM,iBAAiBhI,CAAI,IACtCgI,EAAM,iBAAiBhI,CAAI,EAAEmP,CAAK,EAAI,GAG1CnH,EAAM,iBAAiBhI,CAAI,EAAEmP,CAAK,GAAKnH,EAAM,iBAAiBhI,CAAI,EAAEmP,CAAK,GAAK,GAAK,CACvF,CACO,eAAewC,GAA8B3J,EAAOhI,EAAMkC,EAAIkO,EAAW,CAC5E,MAAMjO,EAAaF,EAAsB+F,EAAM,4BAA6B9F,CAAE,EAC9E8F,EAAM,eAAehI,CAAI,GAAKgI,EAAM,eAAehI,CAAI,EAAIoQ,EAAYpI,EAAM,aAAahI,CAAI,EAAEmC,CAAU,IAAMiO,EAAY,GAC5HpI,EAAM,aAAahI,CAAI,EAAEmC,CAAU,EAAI,OACvC6F,EAAM,YAAYhI,CAAI,EAAEmC,CAAU,EAAI,MAC1C,CACO,eAAeyP,GAA2B5J,EAAOhI,EAAMmP,EAAO,CACjEnH,EAAM,iBAAiBhI,CAAI,EAAEmP,CAAK,GACtC,CACO,eAAe0C,GAAsBC,EAAS9J,EAAOhI,EAAMmI,EAAMxF,EAAK,CACzE,MAAMoP,EAAc,MAAM,KAAKpP,CAAG,EAE5BqP,EAAiBhK,EAAM,eAAehI,CAAI,EAC1CiS,EAAejK,EAAM,aAAahI,CAAI,EACtCkS,EAAmBlK,EAAM,iBAAiBhI,CAAI,EAC9CmS,EAAmBnK,EAAM,YAAYhI,CAAI,EAEzCoS,EAAkB,OAAOF,EAAiB/J,CAAI,GAAM,SAAW+J,EAAiB/J,CAAI,GAAK,EAAI,EAC7FkK,EAAY,CAAA,EAEZC,EAAoBP,EAAY,OACtC,QAAQxB,EAAI,EAAGA,EAAI+B,EAAmB/B,IAAI,CACtC,IAAIgC,EACJ,MAAMpQ,EAAaF,EAAsB+F,EAAM,4BAA6B+J,EAAYxB,CAAC,CAAC,EACpFL,GAAMiC,GAAqB,OAAgDI,EAA+BJ,EAAiBhQ,CAAU,KAAO,MAAQoQ,IAAiC,OAApH,OAAsIA,EAA6BpK,CAAI,IAAM,EAC9OqK,EAAOvC,GAAKC,EAAIkC,EAAiBN,EAAQ,UAAWG,EAAa9P,CAAU,EAAG6P,EAAgBF,EAAQ,OAAO,SAAS,EAC5HO,EAAU,KAAK,CACXlQ,EACAqQ,CACZ,CAAS,CACJ,CACD,OAAOH,CACX,CACO,eAAe/P,GAAOV,EAAOY,EAA6B7B,EAAQqH,EAAOyK,EAAS,GAAI,CACpFzK,IACDA,EAAQ,CACJ,4BAAAxF,EACA,QAAS,CAAE,EACX,cAAe,CAAE,EACjB,qBAAsB,CAAE,EACxB,8BAA+B,CAAE,EACjC,YAAa,CAAE,EACf,iBAAkB,CAAE,EACpB,eAAgB,CAAE,EAClB,aAAc,CAAE,CAC5B,GAEI,SAAW,CAACxC,EAAMpD,CAAI,IAAK,OAAO,QAAQ+D,CAAM,EAAE,CAC9C,MAAM7B,EAAO,GAAG2T,CAAM,GAAGA,EAAS,IAAM,EAAE,GAAGzS,CAAI,GACjD,GAAI,OAAOpD,GAAS,UAAY,CAAC,MAAM,QAAQA,CAAI,EAAG,CAElD0F,GAAOV,EAAOY,EAA6B5F,EAAMoL,EAAOlJ,CAAI,EAC5D,QACH,CACD,GAAI+B,EAAajE,CAAI,EACjBoL,EAAM,qBAAqB,KAAKlJ,CAAI,EACpCkJ,EAAM,8BAA8BlJ,CAAI,EAAIlC,EAC5CoL,EAAM,cAAclJ,CAAI,EAAI,CACxB,KAAMiC,GAAcnE,CAAI,EACxB,QAAS,CAAE,CAC3B,MACe,CACH,MAAM8V,EAAU,KAAK,KAAK9V,CAAI,EAC9B,OAAOA,EAAI,CACP,IAAK,UACL,IAAK,YACDoL,EAAM,QAAQlJ,CAAI,EAAI,CAClB,KAAM,OACN,KAAM,CACF,KAAM,CAAE,EACR,MAAO,CAAE,CACZ,EACD,QAAA4T,CACxB,EACoB,MACJ,IAAK,SACL,IAAK,WACD1K,EAAM,QAAQlJ,CAAI,EAAI,CAClB,KAAM,MACN,KAAM6T,GAAU,EAAG,EAAE,EACrB,QAAAD,CACxB,EACoB,MACJ,IAAK,SACL,IAAK,WACD1K,EAAM,QAAQlJ,CAAI,EAAI,CAClB,KAAM,QACN,KAAM8T,EAAa,EACnB,QAAAF,CACxB,EACoB1K,EAAM,eAAelJ,CAAI,EAAI,EAC7BkJ,EAAM,YAAYlJ,CAAI,EAAI,GAC1BkJ,EAAM,iBAAiBlJ,CAAI,EAAI,GAC/BkJ,EAAM,aAAalJ,CAAI,EAAI,GAC3B,MACJ,IAAK,OACL,IAAK,SACDkJ,EAAM,QAAQlJ,CAAI,EAAI,CAClB,KAAM,OACN,KAAM+T,GAAY,EAClB,QAAAH,CACxB,EACoB,MACJ,IAAK,WACD1K,EAAM,QAAQlJ,CAAI,EAAI,CAClB,KAAM,MACN,KAAMgU,GAAW,EACjB,QAAAJ,CACxB,EACoB,MACJ,QACI,MAAMhT,EAAY,sBAAuB,MAAM,QAAQ9C,CAAI,EAAI,QAAUA,EAAMkC,CAAI,CAC1F,CACDkJ,EAAM,qBAAqB,KAAKlJ,CAAI,EACpCkJ,EAAM,8BAA8BlJ,CAAI,EAAIlC,CAC/C,CACJ,CACD,OAAOoL,CACX,CACA,SAAS+K,GAAoBC,EAAgBhL,EAAOhI,EAAMkC,EAAIxG,EAAUuX,EAAW7C,EAAW,CAC1F,MAAO,OAAOpT,GAAQ,CAClB,MAAMmF,EAAaF,EAAsB+F,EAAM,4BAA6B9F,CAAE,EACxE,CAAE,KAAAtF,EAAO,KAAA0H,CAAI,EAAM0D,EAAM,QAAQhI,CAAI,EAC3C,OAAOpD,EAAI,CACP,IAAK,OACD,CACI0H,EAAKtH,EAAQ,OAAS,OAAO,EAAE,KAAKmF,CAAU,EAC9C,KACH,CACL,IAAK,MACD,CACI+Q,GAAU5O,EAAMtH,EAAO,CACnBmF,CACxB,CAAqB,EACD,KACH,CACL,IAAK,QACD,CACI,MAAMoP,EAAS,MAAM0B,EAAU,SAASjW,EAAOtB,EAAUsE,CAAI,EAC7D,MAAMgT,EAAe,8BAA8BhL,EAAOhI,EAAMmC,EAAYoP,EAAQnB,CAAS,EAC7F,UAAWjB,KAASoC,EAChB,MAAMyB,EAAe,2BAA2BhL,EAAOhI,EAAMmC,EAAYoP,EAAQpC,CAAK,EACtFgE,GAAY7O,EAAM6K,EAAOhN,CAAU,EAEvC,KACH,CACL,IAAK,OACD,CACIiR,GAAW9O,EAAMtH,EAAOmF,CAAU,EAClC,KACH,CACL,IAAK,MACD,CACIkR,GAAU/O,EAAMtH,EAAO,CACnBmF,CACxB,CAAqB,EACD,KACH,CACR,CACT,CACA,CACO,eAAeiD,GAAO4N,EAAgBhL,EAAOhI,EAAMkC,EAAIlF,EAAOsW,EAAY5X,EAAUuX,EAAW7C,EAAW,CAC7G,GAAIvP,EAAayS,CAAU,EACvB,OAAOC,GAAavL,EAAOhI,EAAMhD,EAAOkF,CAAE,EAE9C,MAAMsR,EAAeT,GAAoBC,EAAgBhL,EAAOhI,EAAMkC,EAAIxG,EAAUuX,EAAW7C,CAAS,EACxG,GAAI,CAACpP,EAAYsS,CAAU,EACvB,OAAOE,EAAaxW,CAAK,EAE7B,MAAMyW,EAAWzW,EACX0W,EAAiBD,EAAS,OAChC,QAAQpX,EAAI,EAAGA,EAAIqX,EAAgBrX,IAC/B,MAAMmX,EAAaC,EAASpX,CAAC,CAAC,CAEtC,CACA,SAASkX,GAAavL,EAAOhI,EAAMhD,EAAOkF,EAAI,CACpClF,aAAiB,eACnBA,EAAQ,IAAI,aAAaA,CAAK,GAElC,MAAMuE,EAAOyG,EAAM,cAAchI,CAAI,EAAE,KACjC4Q,EAAYH,GAAazT,EAAOuE,CAAI,EAC1CyG,EAAM,cAAchI,CAAI,EAAE,QAAQkC,CAAE,EAAI,CACpC0O,EACA5T,CACR,CACA,CACA,eAAe2W,GAAaX,EAAgBhL,EAAOhI,EAAMkC,EAAIlF,EAAOsW,EAAY5X,EAAUuX,EAAW7C,EAAW,CAC5G,MAAMjO,EAAaF,EAAsB+F,EAAM,4BAA6B9F,CAAE,EAC9E,GAAIrB,EAAayS,CAAU,EACvB,cAAOtL,EAAM,cAAchI,CAAI,EAAE,QAAQkC,CAAE,EACpC,GAEX,KAAM,CAAE,KAAAtF,EAAO,KAAA0H,CAAI,EAAM0D,EAAM,QAAQhI,CAAI,EAC3C,OAAOpD,EAAI,CACP,IAAK,MAEGgX,OAAAA,GAAkBtP,EAAMnC,EAAYnF,CAAK,EAClC,GAEf,IAAK,OACD,CAEI,MAAMH,EAAWyH,EADEtH,EAAQ,OAAS,OACJ,EAAE,QAAQmF,CAAU,EACpD,OAAAmC,EAAKtH,EAAQ,OAAS,OAAO,EAAE,OAAOH,EAAU,CAAC,EAC1C,EACV,CACL,IAAK,QACD,CACI,MAAM0U,EAAS,MAAM0B,EAAU,SAASjW,EAAOtB,EAAUsE,CAAI,EAC7D,MAAMgT,EAAe,8BAA8BhL,EAAOhI,EAAMkC,EAAIkO,CAAS,EAC7E,UAAWjB,KAASoC,EAChB,MAAMyB,EAAe,2BAA2BhL,EAAOhI,EAAMmP,CAAK,EAClE0E,GAAoBvP,EAAM6K,EAAOhN,CAAU,EAE/C,MAAO,EACV,CACL,IAAK,OAEG2R,OAAAA,GAAmBxP,EAAMnC,EAAYnF,CAAK,EACnC,GAEf,IAAK,MAEG+W,OAAAA,GAAiBzP,EAAMtH,EAAOmF,CAAU,EACjC,EAElB,CACL,CACO,eAAeW,GAAOkQ,EAAgBhL,EAAOhI,EAAMkC,EAAIlF,EAAOsW,EAAY5X,EAAUuX,EAAW7C,EAAW,CAC7G,GAAI,CAACpP,EAAYsS,CAAU,EACvB,OAAOK,GAAaX,EAAgBhL,EAAOhI,EAAMkC,EAAIlF,EAAOsW,EAAY5X,EAAUuX,EAAW7C,CAAS,EAE1G,MAAM4D,EAAkB9S,GAAaoS,CAAU,EACzCG,EAAWzW,EACX0W,EAAiBD,EAAS,OAChC,QAAQpX,EAAI,EAAGA,EAAIqX,EAAgBrX,IAC/B,MAAMsX,GAAaX,EAAgBhL,EAAOhI,EAAMkC,EAAIuR,EAASpX,CAAC,EAAG2X,EAAiBtY,EAAUuX,EAAW7C,CAAS,EAEpH,MAAO,EACX,CACO,eAAe6D,GAAOnC,EAAS9J,EAAOhI,EAAMmI,EAAM,CACrD,GAAI,EAAEnI,KAAQgI,EAAM,kBAChB,MAAO,GAEX,KAAM,CAAE,KAAA1D,EAAO,KAAA1H,CAAI,EAAMoL,EAAM,QAAQhI,CAAI,EAC3C,GAAIpD,IAAS,QACT,MAAM8C,EAAY,6BAA8BM,CAAI,EAExD,KAAM,CAAE,MAAAoI,EAAQ,UAAA1B,GAAeoL,EAAQ,OACjClS,EAAesU,GAAU5P,EAAM,CACjC,KAAA6D,EACA,MAAAC,EACA,UAAA1B,CACR,CAAK,EACK/D,EAAM,IAAI,IAChB,UAAUzC,KAAON,EAGb,GADoBjC,EAAeiC,EAAcM,CAAG,EAEpD,UAAWgC,KAAMtC,EAAaM,CAAG,EAC7ByC,EAAI,IAAIT,CAAE,EAGlB,OAAO4P,EAAQ,MAAM,sBAAsBA,EAAS9J,EAAOhI,EAAMmI,EAAM,MAAM,KAAKxF,CAAG,CAAC,CAC1F,CACO,eAAewR,GAAoBrC,EAAS9J,EAAOoM,EAAS,CAC/D,MAAMC,EAAa,OAAO,KAAKD,CAAO,EAChCE,EAAaD,EAAW,OAAO,CAACtU,EAAKG,KAAO,CAC1C,CAACA,CAAG,EAAG,CAAE,EACT,GAAGH,CACf,GAAY,CAAE,CAAA,EACV,UAAWwU,KAASF,EAAW,CAC3B,MAAMjO,EAAYgO,EAAQG,CAAK,EAC/B,GAAI,OAAOvM,EAAM,QAAQuM,CAAK,EAAM,IAChC,MAAM7U,EAAY,0BAA2B6U,CAAK,EAEtD,KAAM,CAAE,KAAAjQ,EAAO,KAAA1H,EAAO,QAAA8V,CAAU,EAAG1K,EAAM,QAAQuM,CAAK,EACtD,GAAI3X,IAAS,OAAQ,CAEjB,MAAM4X,EADMlQ,EACY8B,EAAU,SAAU,CAAA,EAC5CnK,EAAcqY,EAAWC,CAAK,EAAGC,CAAW,EAC5C,QACH,CACD,GAAI5X,IAAS,MAAO,CAChB,IAAI6X,EACJ,GAAI,WAAYrO,EACZqO,EAAe,iBACR,YAAarO,EACpBqO,EAAe,cAEf,OAAM,IAAI,MAAM,qBAAqBrO,CAAS,EAAE,EAEpD,GAAIqO,IAAiB,SAAU,CAC3B,KAAM,CAAE,MAAAzX,EAAQ,YAAA0X,EAAc,KAAAlV,EAAM,IAAM,OAAAmV,EAAQ,GAAO,cAAA5J,EAAe,EAAK,EAAM3E,EAAUqO,CAAY,EACnGG,EAAmBtV,GAAwBtC,EAAOwC,CAAI,EACtDmD,EAAMgI,GAAerG,EAAK,KAAMoQ,EAAaE,EAAkBD,EAAQ,OAAW5J,CAAa,EAErG9O,EAAcqY,EAAWC,CAAK,EAAG5R,EAAI,IAAI,CAAC,CAAE,OAAA0F,KAAYA,CAAM,EAAE,KAAM,CAAA,CACtF,KAAmB,CACH,KAAM,CAAE,YAAAqM,EAAc,OAAAC,EAAQ,GAAO,cAAA5J,EAAe,EAAQ,EAAG3E,EAAUqO,CAAY,EAC/E9R,EAAM2I,GAAgBhH,EAAK,KAAMoQ,EAAaC,EAAQ,OAAW5J,CAAa,EAEpF9O,EAAcqY,EAAWC,CAAK,EAAG5R,EAAI,IAAI,CAAC,CAAE,OAAA0F,KAAYA,CAAM,EAAE,KAAM,CAAA,CACzE,CACD,QACH,CACD,GAAIzL,IAAS,UAAY,OAAOwJ,GAAc,UAAY,MAAM,QAAQA,CAAS,GAAI,CACjF,UAAWvE,IAAO,CACduE,CACH,EAAC,KAAI,EAAG,CACL,MAAM+B,EAAO,MAAM2J,EAAQ,UAAU,SAASjQ,EAAKiQ,EAAQ,SAAUyC,CAAK,EAC1E,UAAW7C,KAAKvJ,EAAK,CACjB,MAAM0M,EAAqBX,GAAU5P,EAAM,CACvC,KAAMoN,EACN,MAAO,EAC/B,CAAqB,EACDzV,EAAcqY,EAAWC,CAAK,EAAG,OAAO,OAAOM,CAAkB,EAAE,KAAI,CAAE,CAC5E,CACJ,CACD,QACH,CACD,MAAMxO,EAAgB,OAAO,KAAKD,CAAS,EAC3C,GAAIC,EAAc,OAAS,EACvB,MAAM3G,EAAY,2BAA4B2G,EAAc,MAAM,EAEtE,GAAIzJ,IAAS,OAAQ,CACb8V,EACAzW,EAAcqY,EAAWC,CAAK,EAAGO,GAAcxQ,EAAM8B,CAAS,CAAC,EAE/DnK,EAAcqY,EAAWC,CAAK,EAAGQ,GAAWzQ,EAAM8B,CAAS,CAAC,EAEhE,QACH,CACD,GAAIxJ,IAAS,MAAO,CAChB,MAAMoY,EAAe3O,EAAc,CAAC,EAC9B4O,EAAiB7O,EAAU4O,CAAY,EAC7C,IAAIR,EAAc,CAAA,EAClB,OAAOQ,EAAY,CACf,IAAK,KACD,CACIR,EAAcU,GAAe5Q,EAAM2Q,EAAgB,EAAK,EACxD,KACH,CACL,IAAK,MACD,CACIT,EAAcU,GAAe5Q,EAAM2Q,EAAgB,EAAI,EACvD,KACH,CACL,IAAK,KACD,CACIT,EAAcW,GAAY7Q,EAAM2Q,EAAgB,EAAK,EACrD,KACH,CACL,IAAK,MACD,CACIT,EAAcW,GAAY7Q,EAAM2Q,EAAgB,EAAI,EACpD,KACH,CACL,IAAK,KACD,CACIT,EAAcY,GAAQ9Q,EAAM2Q,CAAc,GAAK,CAAA,EAC/C,KACH,CACL,IAAK,UACD,CACI,KAAM,CAACrQ,EAAKC,CAAG,EAAIoQ,EACnBT,EAAca,GAAe/Q,EAAMM,EAAKC,CAAG,EAC3C,KACH,CACR,CACD5I,EAAcqY,EAAWC,CAAK,EAAGC,CAAW,CAC/C,CACJ,CAGD,OADevW,GAAU,OAAO,OAAOqW,CAAU,CAAC,CAEtD,CACO,eAAegB,GAAwBtN,EAAO,CACjD,OAAOA,EAAM,oBACjB,CACO,eAAeuN,GAAiCvN,EAAO,CAC1D,OAAOA,EAAM,6BACjB,CACA,SAASwN,GAAclR,EAAM,CACzB,MAAMmR,EAAgB7C,EAAYtO,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAC,EACxDmR,EAAc,EAAInR,EAAK,EACvBmR,EAAc,EAAInR,EAAK,EACvB,UAAWoR,KAAe,OAAO,KAAKpR,EAAK,CAAC,EACxCmR,EAAc,EAAEC,CAAW,EAAIF,GAAclR,EAAK,EAAEoR,CAAW,CAAC,EAEpE,OAAOD,CACX,CACA,SAASE,GAAarR,EAAM,CACxB,MAAO,CACH,mBAAoB,IAAI,IAAIA,CAAI,CACxC,CACA,CACA,SAASsR,GAAatR,EAAM,CACxB,OAAO,MAAM,KAAKA,EAAK,mBAAmB,QAAS,CAAA,CACvD,CACO,eAAe5C,GAAKc,EAA6BX,EAAK,CACzD,KAAM,CAAE,QAASgU,EAAa,cAAeC,EAAmB,qBAAAC,EAAuB,8BAAAC,EAAgC,YAAAC,EAAc,iBAAAC,EAAmB,eAAAlE,EAAiB,aAAAC,CAAY,EAAMpQ,EACrLsU,EAAU,CAAA,EACVC,EAAgB,CAAA,EACtB,UAAWpW,KAAQ,OAAO,KAAK6V,CAAU,EAAE,CACvC,KAAM,CAAE,KAAAvR,EAAO,KAAA1H,EAAO,QAAA8V,CAAO,EAAMmD,EAAW7V,CAAI,EAClD,OAAOpD,EAAI,CACP,IAAK,QACDuZ,EAAQnW,CAAI,EAAI,CACZ,KAAM,QACN,KAAMwV,GAAclR,CAAI,EACxB,QAAAoO,CACpB,EACgB,MACJ,IAAK,OACDyD,EAAQnW,CAAI,EAAI,CACZ,KAAM,OACN,KAAM2V,GAAarR,CAAI,EACvB,QAAAoO,CACpB,EACgB,MACJ,QACIyD,EAAQnW,CAAI,EAAI6V,EAAW7V,CAAI,CACtC,CACJ,CACD,UAAWqW,KAAO,OAAO,KAAKP,CAAgB,EAAE,CAC5C,MAAM/E,EAAU+E,EAAiBO,CAAG,EAAE,QACtC,UAAUC,KAAOvF,EACbA,EAAQuF,CAAG,EAAI,CACXvF,EAAQuF,CAAG,EAAE,CAAC,EACd,IAAI,aAAavF,EAAQuF,CAAG,EAAE,CAAC,CAAC,CAChD,EAEQF,EAAcC,CAAG,EAAI,CACjB,KAAMP,EAAiBO,CAAG,EAAE,KAC5B,QAAAtF,CACZ,CACK,CACD,MAAO,CACH,4BAAAvO,EACA,QAAA2T,EACA,cAAAC,EACA,qBAAAL,EACA,8BAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,eAAAlE,EACA,aAAAC,CACR,CACA,CACO,eAAexQ,GAAKuG,EAAO,CAC9B,KAAM,CAAE,QAAAmO,EAAU,cAAAC,EAAgB,qBAAAL,EAAuB,8BAAAC,EAAgC,YAAAC,EAAc,iBAAAC,EAAmB,eAAAlE,EAAiB,aAAAC,CAAe,EAAGjK,EACvJuO,EAAwB,CAAA,EAC9B,UAAWF,KAAO,OAAO,KAAKD,CAAa,EAAE,CACzC,MAAMrF,EAAUqF,EAAcC,CAAG,EAAE,QACnC,UAAUC,KAAOvF,EACbA,EAAQuF,CAAG,EAAI,CACXvF,EAAQuF,CAAG,EAAE,CAAC,EACd,MAAM,KAAKvF,EAAQuF,CAAG,EAAE,CAAC,CAAC,CAC1C,EAEQC,EAAsBF,CAAG,EAAI,CACzB,KAAMD,EAAcC,CAAG,EAAE,KACzB,QAAAtF,CACZ,CACK,CAED,MAAMyF,EAAe,CAAA,EACrB,UAAWC,KAAQ,OAAO,KAAKN,CAAO,EAAE,CACpC,KAAM,CAAE,KAAAvZ,EAAO,KAAA0H,EAAO,QAAAoO,CAAO,EAAMyD,EAAQM,CAAI,EAC/C,GAAI7Z,IAAS,OAAQ,CACjB4Z,EAAaC,CAAI,EAAIN,EAAQM,CAAI,EACjC,QACH,CACDD,EAAaC,CAAI,EAAI,CACjB,KAAM,OACN,KAAMb,GAAatR,CAAI,EACvB,QAAAoO,CACZ,CACK,CACD,MAAO,CACH,QAAS8D,EACT,cAAeD,EACf,qBAAAR,EACA,8BAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,eAAAlE,EACA,aAAAC,CACR,CACA,CACO,eAAeyE,IAAc,CAChC,MAAO,CACX,OAAQpU,GACR,OAAQ8C,GACR,OAAQtC,GACA,8BAAAwO,GACA,2BAAAE,GACA,8BAAAG,GACA,2BAAAC,GACA,sBAAAC,GACR,OAAQoC,GACA,oBAAAE,GACA,wBAAAmB,GACA,iCAAAC,GACR,KAAQ7T,GACR,KAAQD,EACR,CACA,CCvhBA,SAASkV,GAAY/U,EAAOY,EAA6B7B,EAAQiW,EAA0BnE,EAAQ,CAC/F,MAAMoE,EAAS,CACX,SAAUjV,EAAM,UAAU,SAC1B,4BAAAY,EACA,QAAS,GACT,SAAU,GACV,mBAAoB,CAAE,EACtB,4BAA6B,CAAE,EAC/B,MAAO,CAAE,CACjB,EACI,SAAW,CAACxC,EAAMpD,CAAI,IAAK,OAAO,QAAQ+D,CAAM,EAAE,CAC9C,MAAM7B,EAAO,GAAG2T,CAAM,GAAGA,EAAS,IAAM,EAAE,GAAGzS,CAAI,GACjD,GAAI,CAAA4W,EAAyB,SAAS9X,CAAI,EAG1C,IAAI,OAAOlC,GAAS,UAAY,CAAC,MAAM,QAAQA,CAAI,EAAG,CAElD,MAAMka,EAAMH,GAAY/U,EAAOY,EAA6B5F,EAAMga,EAA0B9X,CAAI,EAChG7C,EAAc4a,EAAO,mBAAoBC,EAAI,kBAAkB,EAC/DD,EAAO,MAAQ,CACX,GAAGA,EAAO,MACV,GAAGC,EAAI,KACvB,EACYD,EAAO,4BAA8B,CACjC,GAAGA,EAAO,4BACV,GAAGC,EAAI,2BACvB,EACY,QACH,CACD,GAAI,CAACjW,EAAajE,CAAI,EAClB,OAAOA,EAAI,CACP,IAAK,UACL,IAAK,SACL,IAAK,SACDia,EAAO,mBAAmB,KAAK/X,CAAI,EACnC+X,EAAO,4BAA4B/X,CAAI,EAAIlC,EAC3Cia,EAAO,MAAM/X,CAAI,EAAI,CACjB,KAAM,IAAI,IACV,oBAAqB,IAAI,IACzB,YAAa,CAAE,EACf,KAAMlC,CAC9B,EACoB,MACJ,IAAK,WACL,IAAK,OACD,SACJ,IAAK,SACL,IAAK,YACL,IAAK,WACL,IAAK,WACD,SACJ,QACI,MAAM8C,EAAY,2BAA4B,MAAM,QAAQ9C,CAAI,EAAI,QAAUA,EAAMkC,CAAI,CAC/F,EAER,CACD,OAAO+X,CACX,CACA,eAAevU,GAAOV,EAAOY,EAA6B7B,EAAQoW,EAAQ,CAEtE,OADuEA,GAAO,UAAa,GAMpFJ,GAAY/U,EAAOY,EAA6B7B,GAASoW,GAAU,CAAA,GAAI,sBAAwB,GAAI,EAAE,EAJjG,CACH,SAAU,EACtB,CAGA,CACA,eAAe3R,GAAOyR,EAAQ7W,EAAMkC,EAAIlF,EAAO,CAC3C,GAAI,CAAC6Z,EAAO,QACR,OAEJA,EAAO,SAAW,GAClB,MAAM1U,EAAaF,EAAsB4U,EAAO,4BAA6B3U,CAAE,EACzE8U,EAAIH,EAAO,MAAM7W,CAAI,EAMvBgX,EAAE,oBAAoB,IAAI7U,CAAU,GACpC8U,GAAsCJ,EAAQ7W,CAAI,EAEtDgX,EAAE,KAAK,IAAI7U,EAAY6U,EAAE,YAAY,MAAM,EAC3CA,EAAE,YAAY,KAAK,CACf7U,EACAnF,CACR,CAAK,CACL,CACA,SAASka,GAAeL,EAAQ,CAC5B,GAAIA,EAAO,UAAY,CAACA,EAAO,QAC3B,OAEJ,MAAMjY,EAAa,OAAO,KAAKiY,EAAO,KAAK,EAC3C,UAAW7W,KAAQpB,EACfuY,GAAuBN,EAAQ7W,CAAI,EAEvC6W,EAAO,SAAW,EACtB,CACA,SAASO,GAAW1b,EAAUsB,EAAOwT,EAAG,CACpC,OAAOxT,EAAM,CAAC,EAAE,cAAcwT,EAAE,CAAC,EAAG/U,GAAUC,CAAQ,CAAC,CAC3D,CACA,SAAS2b,GAAWra,EAAOwT,EAAG,CAC1B,OAAOxT,EAAM,CAAC,EAAIwT,EAAE,CAAC,CACzB,CACA,SAAS8G,GAAYta,EAAOwT,EAAG,CAC3B,OAAOA,EAAE,CAAC,EAAI,GAAK,CACvB,CACA,SAAS2G,GAAuBN,EAAQ7W,EAAM,CAC1C,MAAMgX,EAAIH,EAAO,MAAM7W,CAAI,EAC3B,IAAIuX,EACJ,OAAOP,EAAE,KAAI,CACT,IAAK,SACDO,EAAYH,GAAW,KAAK,KAAMP,EAAO,QAAQ,EACjD,MACJ,IAAK,SACDU,EAAYF,GAAW,KAAK,IAAI,EAChC,MACJ,IAAK,UACDE,EAAYD,GAAY,KAAK,IAAI,EACjC,KACP,CACDN,EAAE,YAAY,KAAKO,CAAS,EAE5B,MAAMC,EAAoBR,EAAE,YAAY,OACxC,QAAQ3a,EAAI,EAAGA,EAAImb,EAAmBnb,IAAI,CACtC,MAAMwM,EAAQmO,EAAE,YAAY3a,CAAC,EAAE,CAAC,EAChC2a,EAAE,KAAK,IAAInO,EAAOxM,CAAC,CACtB,CACL,CACA,SAASob,GAA4BZ,EAAQ,CACzC,MAAMjY,EAAa,OAAO,KAAKiY,EAAO,KAAK,EAC3C,UAAW7W,KAAQpB,EACfqY,GAAsCJ,EAAQ7W,CAAI,CAE1D,CACA,SAASiX,GAAsCJ,EAAQ7W,EAAM,CACzD,MAAMgX,EAAIH,EAAO,MAAM7W,CAAI,EACtBgX,EAAE,oBAAoB,OAC3BA,EAAE,YAAcA,EAAE,YAAY,OAAQtY,GAAM,CAACsY,EAAE,oBAAoB,IAAItY,EAAI,CAAC,CAAC,CAAC,EAC9EsY,EAAE,oBAAoB,QAC1B,CACA,eAAelU,GAAO+T,EAAQ7W,EAAMkC,EAAI,CACpC,GAAI,CAAC2U,EAAO,QACR,OAEJ,MAAMG,EAAIH,EAAO,MAAM7W,CAAI,EACrBmC,EAAaF,EAAsB4U,EAAO,4BAA6B3U,CAAE,EACjE8U,EAAE,KAAK,IAAI7U,CAAU,IAEnC6U,EAAE,KAAK,OAAO7U,CAAU,EACxB6U,EAAE,oBAAoB,IAAI7U,EAAY,EAAI,EAC9C,CACA,eAAeuV,GAAOb,EAAQc,EAAQC,EAAI,CACtC,GAAI,CAACf,EAAO,QACR,MAAMnX,EAAY,eAAe,EAErC,MAAM7B,EAAW+Z,EAAG,SACdC,EAASD,EAAG,QAAU,OACtBZ,EAAIH,EAAO,MAAMhZ,CAAQ,EAC/B,GAAI,CAACmZ,EACD,MAAMtX,EAAY,kCAAmC7B,EAAUgZ,EAAO,mBAAmB,KAAK,IAAI,CAAC,EAEvG,OAAAI,GAAsCJ,EAAQhZ,CAAQ,EACtDqZ,GAAeL,CAAM,EACrBc,EAAO,KAAK,CAAC5Z,EAAGC,IAAI,CAIhB,MAAM8Z,EAAWd,EAAE,KAAK,IAAI/U,EAAsB4U,EAAO,4BAA6B9Y,EAAE,CAAC,CAAC,CAAC,EACrFga,EAAWf,EAAE,KAAK,IAAI/U,EAAsB4U,EAAO,4BAA6B7Y,EAAE,CAAC,CAAC,CAAC,EACrFga,EAAa,OAAOF,EAAa,IACjCG,EAAa,OAAOF,EAAa,IACvC,MAAI,CAACC,GAAc,CAACC,EACT,EAGND,EAGAC,EAGEJ,EAASE,EAAWD,EAAWA,EAAWC,EAFtC,GAHA,CAMnB,CAAK,EACMJ,CACX,CACA,eAAeO,GAAsBrB,EAAQ,CACzC,OAAKA,EAAO,QAGLA,EAAO,mBAFH,EAGf,CACA,eAAesB,GAA+BtB,EAAQ,CAClD,OAAKA,EAAO,QAGLA,EAAO,4BAFH,EAGf,CACO,eAAenV,GAAKc,EAA6BX,EAAK,CACzD,MAAMkB,EAAclB,EACpB,GAAI,CAACkB,EAAY,QACb,MAAO,CACH,QAAS,EACrB,EAEI,MAAMqV,EAAQ,OAAO,KAAKrV,EAAY,KAAK,EAAE,OAAO,CAAChD,EAAKC,IAAO,CAC7D,KAAM,CAAE,KAAAsI,EAAO,YAAA+P,EAAc,KAAAzb,CAAO,EAAGmG,EAAY,MAAM/C,CAAI,EAC7D,OAAAD,EAAIC,CAAI,EAAI,CACR,KAAM,IAAI,IAAI,OAAO,QAAQsI,CAAI,EAAE,IAAI,CAAC,CAACiI,EAAGrK,CAAC,IAAI,CACzC,CAACqK,EACDrK,CACpB,CAAiB,CAAC,EACN,oBAAqB,IAAI,IACzB,YAAAmS,EACA,KAAAzb,CACZ,EACemD,CACV,EAAE,CAAE,CAAA,EACL,MAAO,CACH,4BAAAyC,EACA,SAAUO,EAAY,SACtB,mBAAoBA,EAAY,mBAChC,4BAA6BA,EAAY,4BACzC,MAAAqV,EACA,QAAS,GACT,SAAUrV,EAAY,QAC9B,CACA,CACO,eAAetB,GAAKoV,EAAQ,CAC/B,GAAI,CAACA,EAAO,QACR,MAAO,CACH,QAAS,EACrB,EAEIY,GAA4BZ,CAAM,EAClCK,GAAeL,CAAM,EACrB,MAAMuB,EAAQ,OAAO,KAAKvB,EAAO,KAAK,EAAE,OAAO,CAAC9W,EAAKC,IAAO,CACxD,KAAM,CAAE,KAAAsI,EAAO,YAAA+P,EAAc,KAAAzb,CAAO,EAAGia,EAAO,MAAM7W,CAAI,EACxD,OAAAD,EAAIC,CAAI,EAAI,CACR,KAAM,OAAO,YAAYsI,EAAK,QAAO,CAAE,EACvC,YAAA+P,EACA,KAAAzb,CACZ,EACemD,CACV,EAAE,CAAE,CAAA,EACL,MAAO,CACH,SAAU8W,EAAO,SACjB,mBAAoBA,EAAO,mBAC3B,4BAA6BA,EAAO,4BACpC,MAAAuB,EACA,QAASvB,EAAO,QAChB,SAAUA,EAAO,QACzB,CACA,CACO,eAAeyB,IAAe,CACjC,MAAO,CACX,OAAQhW,GACR,OAAQ8C,GACA,OAAAtC,GACA,KAAArB,GACA,KAAAC,GACA,OAAAgW,GACA,sBAAAQ,GACA,+BAAAC,EACR,CACA,CC9QA,MAAMI,GAA4B,IAC5BC,GAA0B,IAC1BC,GAA2B,CAC7B,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,KACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,IACA,GACA,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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]}