@novely/core 0.19.2 → 0.19.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -294,6 +294,25 @@ var Novely = (() => {
294
294
  });
295
295
  return Object.fromEntries(entries);
296
296
  };
297
+ var isExitImpossible = (path) => {
298
+ const blockStatements = path.filter(([item]) => isBlockStatement(item));
299
+ const blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));
300
+ if (blockStatements.length === 0 && blockExitStatements.length === 0) {
301
+ return true;
302
+ }
303
+ if (blockStatements.length > blockExitStatements.length) {
304
+ return false;
305
+ }
306
+ for (let i = 0; i++; i < blockStatements.length) {
307
+ const b = blockStatements[i][0];
308
+ const be = blockExitStatements[i][0];
309
+ if (!b || !be)
310
+ return false;
311
+ if (!be.startsWith(b))
312
+ return false;
313
+ }
314
+ return true;
315
+ };
297
316
 
298
317
  // src/global.ts
299
318
  var PRELOADED_ASSETS = /* @__PURE__ */ new Set();
@@ -1091,7 +1110,7 @@ var Novely = (() => {
1091
1110
  path.pop();
1092
1111
  }
1093
1112
  }
1094
- if (path.every(([name]) => !isBlockStatement(name))) {
1113
+ if (isExitImpossible(path)) {
1095
1114
  const referred = refer(path);
1096
1115
  if (isAction(referred) && isSkippedDuringRestore(referred[0])) {
1097
1116
  match("end", []);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/yocto-queue@0.1.0/node_modules/yocto-queue/index.js","../../../node_modules/.pnpm/p-limit@3.1.0/node_modules/p-limit/index.js","../src/index.ts","../src/constants.ts","../src/utils.ts","../src/global.ts","../src/store.ts","../../deepmerge/src/utils.ts","../../deepmerge/src/index.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/json/index.mjs","../src/translation.ts","../src/storage.ts","../src/novely.ts","../../../node_modules/.pnpm/esm-env@1.0.0/node_modules/esm-env/prod-ssr.js","../src/translations.ts"],"sourcesContent":["class Node {\n\t/// value;\n\t/// next;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\n\t\t// TODO: Remove this when targeting Node.js 12.\n\t\tthis.next = undefined;\n\t}\n}\n\nclass Queue {\n\t// TODO: Use private class fields when targeting Node.js 12.\n\t// #_head;\n\t// #_tail;\n\t// #_size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this._head) {\n\t\t\tthis._tail.next = node;\n\t\t\tthis._tail = node;\n\t\t} else {\n\t\t\tthis._head = node;\n\t\t\tthis._tail = node;\n\t\t}\n\n\t\tthis._size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this._head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._head = this._head.next;\n\t\tthis._size--;\n\t\treturn current.value;\n\t}\n\n\tclear() {\n\t\tthis._head = undefined;\n\t\tthis._tail = undefined;\n\t\tthis._size = 0;\n\t}\n\n\tget size() {\n\t\treturn this._size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this._head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n\nmodule.exports = Queue;\n","'use strict';\nconst Queue = require('yocto-queue');\n\nconst pLimit = concurrency => {\n\tif (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, ...args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, ...args) => {\n\t\tqueue.enqueue(run.bind(null, fn, resolve, ...args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, ...args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn generator;\n};\n\nmodule.exports = pLimit;\n","export type {\n\tValidAction,\n\tStory,\n\tActionProxyProvider,\n\tDefaultActionProxyProvider,\n\tGetActionParameters,\n\tUnwrappable,\n\tCustomHandler,\n\tCustomHandlerGetResult,\n\tCustomHandlerGetResultDataFunction,\n\tFunctionableValue,\n} from './action';\nexport type { Emotions, Character } from './character';\nexport type { CharacterHandle, AudioHandle, RendererStore, Renderer, RendererInit } from './renderer';\nexport type { Storage } from './storage';\nexport type {\n\tThenable,\n\tPath,\n\tStorageData,\n\tStorageMeta,\n\tTypewriterSpeed,\n\tLang,\n\tNovelyScreen,\n\tCoreData,\n} from './types';\nexport type { Stored } from './store';\nexport type { BaseTranslationStrings } from './translations';\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions } from './translation';\n\nexport { novely } from './novely';\nexport { localStorageStorage } from './storage';\n\nexport { RU, EN, JP, KK } from './translations';\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nexport { SKIPPED_DURING_RESTORE, EMPTY_SET, DEFAULT_TYPEWRITER_SPEED, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS };\n","import type { ActionProxyProvider, CustomHandler, Story, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Thenable, Path, PathItem } from './types';\nimport { BLOCK_STATEMENTS, BLOCK_EXIT_STATEMENTS, SKIPPED_DURING_RESTORE } from './constants';\n\ntype MatchActionMap = {\n\t[Key in keyof ActionProxyProvider<Record<string, Character>, string>]: (\n\t\tdata: Parameters<ActionProxyProvider<Record<string, Character>, string>[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (value: [handler: CustomHandler]) => Thenable<void>;\n};\n\nconst matchAction = <M extends MatchActionMapComplete>(values: M) => {\n\treturn (action: keyof MatchActionMap, props: any) => {\n\t\treturn values[action](props);\n\t};\n};\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\nconst isCSSImage = (str: string) => {\n\tconst startsWith = String.prototype.startsWith.bind(str);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\nconst str = String;\n\nconst isUserRequiredAction = (\n\taction: keyof MatchActionMapComplete,\n\tmeta: Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n) => {\n\treturn action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction;\n};\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\n/**\n * @copyright Techlead LLC\n * @see https://learn.javascript.ru/task/throttle\n */\nconst throttle = <Fn extends (...args: any[]) => any>(fn: Fn, ms: number) => {\n\tlet throttled = false,\n\t\tsavedArgs: any,\n\t\tsavedThis: any;\n\n\tfunction wrapper(this: any, ...args: any[]) {\n\t\tif (throttled) {\n\t\t\tsavedArgs = args;\n\t\t\t/* eslint-disable @typescript-eslint/no-this-alias */\n\t\t\tsavedThis = this;\n\t\t\treturn;\n\t\t}\n\n\t\tfn.apply(this, args as unknown as any[]);\n\n\t\tthrottled = true;\n\n\t\tsetTimeout(function () {\n\t\t\tthrottled = false;\n\n\t\t\tif (savedArgs) {\n\t\t\t\twrapper.apply(savedThis, savedArgs);\n\t\t\t\tsavedArgs = savedThis = null;\n\t\t\t}\n\t\t}, ms);\n\t}\n\n\treturn wrapper as unknown as (...args: Parameters<Fn>) => void;\n};\n\nconst findLastIndex = <T>(array: T[], fn: (item: T, next?: T) => boolean) => {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (fn(array[i], array[i + 1])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\ntype ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\t// @ts-expect-error Types does not match and this is expected\n\t\tobject.promise = promise;\n\t};\n\n\treturn init(), object;\n};\n\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst index = findLastIndex(path, ([_name, _value], next) => {\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn path[index] as undefined | [null, number];\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\nconst noop = () => {};\n\nconst isAction = (\n\telement: unknown,\n): element is [\n\tkeyof MatchActionMapComplete,\n\t...Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n] => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`\n */\nconst flattenStory = (story: Story) => {\n\tconst entries = Object.entries(story).map(([name, items]) => {\n\t\tconst flat = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\t\t\treturn item.flatMap((data) => {\n\t\t\t\tconst type = data[0];\n\n\t\t\t\t/**\n\t\t\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t\t\t */\n\t\t\t\tif (Array.isArray(type)) return flat(data as ValidAction[]);\n\n\t\t\t\treturn [data as ValidAction];\n\t\t\t});\n\t\t};\n\n\t\treturn [name, flat(items)];\n\t});\n\n\treturn Object.fromEntries(entries);\n};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nexport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisString,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tnoop,\n\tisAction,\n\tflattenStory,\n\tonce,\n};\n","const PRELOADED_ASSETS = new Set<string>();\n\nexport { PRELOADED_ASSETS };\n","type Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, get } as const;\n};\n\nexport { store };\nexport type { Stored };\n","const { isArray } = Array;\nconst { hasOwnProperty, propertyIsEnumerable, getOwnPropertySymbols } = Object;\n\nconst propertyIsOnObject = <T extends Record<PropertyKey, unknown>, K extends PropertyKey>(object: T, property: K): object is T & { [Key in K]: unknown } => {\n\ttry {\n\t\treturn property in object\n\t} catch {\n\t\treturn false\n\t}\n}\n\nconst propertyIsUnsafe = (target: Record<PropertyKey, unknown>, key: PropertyKey) => {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nconst getEnumerableOwnPropertySymbols = (target: Record<PropertyKey, unknown>) => {\n if (!getOwnPropertySymbols) return [];\n\n return getOwnPropertySymbols(target).filter(symbol => propertyIsEnumerable.call(target, symbol))\n}\n\nconst keys = <T extends Record<PropertyKey, unknown>>(target: T): (keyof T)[] => {\n return [...Object.keys(target), ...getEnumerableOwnPropertySymbols(target)];\n}\n\nconst isMergeableObject = (value: unknown): value is Record<PropertyKey, unknown> => {\n return !!value && typeof value === 'object' && !(['RegExp', 'Date'].includes(Object.prototype.toString.call(value).slice(8, -1)));\n}\n\nexport { isArray, propertyIsOnObject, propertyIsUnsafe, getEnumerableOwnPropertySymbols, isMergeableObject, keys }\n","import { isArray, propertyIsOnObject, propertyIsUnsafe, isMergeableObject, keys } from './utils';\n\nconst empty = <T extends (Record<PropertyKey, unknown> | unknown[])>(value: T): T => {\n return (isArray(value) ? [] : {}) as T;\n}\n\nconst clone = <T>(value: T): T => {\n return isMergeableObject(value)\n ? deepmerge(empty(value), value)\n : value;\n}\n\nconst mergeArray = <T>(target: T[], source: T[]) => {\n const destination = target.slice();\n\n source.forEach((item, index) => {\n if (typeof destination[index] === 'undefined') {\n destination[index] = clone(item);\n } else if (isMergeableObject(item)) {\n destination[index] = deepmerge(target[index] as any, item as any);\n } else if (target.indexOf(item) === -1) {\n destination.push(item);\n }\n });\n\n return destination;\n}\n\nconst mergeObject = <T extends Record<PropertyKey, unknown>>(target: T, source: T): T => {\n const destination: Record<PropertyKey, any> = {};\n\n for (const key of keys(target)) {\n destination[key] = clone(target[key]);\n }\n\n for (const key of keys(source)) {\n if (propertyIsUnsafe(target, key)) {\n continue;\n }\n\n if (propertyIsOnObject(target, key) && isMergeableObject(source[key])) {\n destination[key] = deepmerge(target[key] as any, source[key] as any);\n } else {\n destination[key] = clone(source[key]);\n }\n }\n\n return destination as unknown as T;\n}\n\nconst deepmerge = <T extends (Record<PropertyKey, unknown> | unknown[])>(target: T, source: T): T => {\n if (isArray(target) && isArray(source)) {\n const merged = mergeArray(target, source);\n\n return merged as unknown as T;\n } else if (!isArray(target) && !isArray(source)) {\n const merged = mergeObject(target, source);\n\n return merged as unknown as T;\n } else {\n return clone(source);\n }\n}\n\nexport { deepmerge }\n","export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n","type PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent = string | (() => string | string[]) | string[] | (string | (() => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Unwraps any allowed content into string\n * @param c Content\n */\nconst unwrap = (c: AllowedContent): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => unwrap(item)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn unwrap(c());\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tstr: AllowedContent,\n\tobj: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn unwrap(str).replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = obj;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action && actions[action];\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { unwrap, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import type { StorageData } from './types';\n\ninterface LocalStorageStorageSettings {\n\tkey: string;\n}\n\ninterface Storage {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n}\n\nconst localStorageStorage = (options: LocalStorageStorageSettings): Storage => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(options.key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(options.key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { Storage };\nexport { localStorageStorage };\n","import type { Character } from './character';\nimport type {\n\tActionProxyProvider,\n\tGetActionParameters,\n\tStory,\n\tValidAction,\n\tUnwrappable,\n\tCustomHandler,\n} from './action';\nimport type { Storage } from './storage';\nimport type {\n\tSave,\n\tState,\n\tData,\n\tStorageData,\n\tDeepPartial,\n\tNovelyScreen,\n\tMigration,\n\tActionFN,\n\tCoreData,\n} from './types';\nimport type { Renderer, RendererInit } from './renderer';\nimport type { TranslationActions, Pluralization } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage as defaultGetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAction,\n\tnoop,\n\tflattenStory,\n} from './utils';\nimport { PRELOADED_ASSETS } from './global';\nimport { store } from './store';\nimport { deepmerge } from '@novely/deepmerge';\nimport { klona } from 'klona/json';\nimport { EMPTY_SET, DEFAULT_TYPEWRITER_SPEED } from './constants';\nimport { replace as replaceT9N } from './translation';\nimport { localStorageStorage } from './storage';\nimport pLimit from 'p-limit';\n\nimport { DEV } from 'esm-env';\n\ninterface NovelyInit<\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n> {\n\t/**\n\t * An array of languages supported by the game.\n\t */\n\tlanguages: Languages[];\n\t/**\n\t * An object containing the characters in the game.\n\t */\n\tcharacters: Characters;\n\t/**\n\t * An object that provides access to the game's storage system.\n\t * @default localStorage // at key `novely-game-storage`\n\t */\n\tstorage?: Storage;\n\t/**\n\t * Delay loading data until Promise is resolved\n\t */\n\tstorageDelay?: Promise<void>;\n\t/**\n\t * A function that returns a Renderer object used to display the game's content\n\t */\n\trenderer: (characters: RendererInit) => Renderer;\n\t/**\n\t * An optional property that specifies the initial screen to display when the game starts\n\t */\n\tinitialScreen?: NovelyScreen;\n\t/**\n\t * An object containing the translation functions used in the game\n\t */\n\ttranslation: Record<\n\t\tLanguages,\n\t\t{\n\t\t\tinternal: Record<BaseTranslationStrings, string>;\n\t\t\t/**\n\t\t\t * IETF BCP 47 language tag\n\t\t\t */\n\t\t\ttag?: string;\n\t\t\tplural?: Record<string, Pluralization>;\n\t\t\tactions?: TranslationActions;\n\t\t}\n\t>;\n\t/**\n\t * Initial state value\n\t */\n\tstate?: StateScheme;\n\t/**\n\t * Initial data value\n\t */\n\tdata?: DataScheme;\n\t/**\n\t * Enable autosaves or disable\n\t * @default true\n\t */\n\tautosaves?: boolean;\n\t/**\n\t * Migration from old saves to newer\n\t */\n\tmigrations?: Migration[];\n\t/**\n\t * For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage\n\t * @default 799\n\t */\n\tthrottleTimeout?: number;\n\t/**\n\t * Custom language detector\n\t * @param languages Supported languages aka `languages: []` in the config\n\t * @example ```ts\n\t * novely({\n\t * \t\tgetLanguage(languages, original) {\n\t * \t\t\t\tif (!sdk) return original(languages);\n\t * \t\t\t\treturn sdk.environment.i18n.lang // i.e. custom language from some sdk\n\t * \t\t}\n\t * })\n\t * ```\n\t */\n\tgetLanguage?: (languages: string[], original: typeof defaultGetLanguage) => string;\n\t/**\n\t * Ignores saved language, and uses `getLanguage` to get it on every engine start\n\t * @default false\n\t */\n\toverrideLanguage?: boolean;\n\t/**\n\t * Show a prompt before exiting a game\n\t * @default true\n\t */\n\taskBeforeExit?: boolean;\n\t/**\n\t * @default \"lazy\"\n\t */\n\tpreloadAssets?: 'lazy' | 'blocking';\n}\n\nconst novely = <\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n>({\n\tcharacters,\n\tstorage = localStorageStorage({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tlanguages,\n\tstate: defaultState,\n\tdata: defaultData,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 799,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'lazy',\n}: NovelyInit<Languages, Characters, StateScheme, DataScheme>) => {\n\tconst limitScript = pLimit(1);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst ASSETS_TO_PRELOAD = new Set<string>();\n\tconst assetsLoaded = createControlledPromise();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet scriptCalled = false;\n\n\t/**\n\t * Prevent `undefined`\n\t */\n\tdefaultData ||= {} as DataScheme;\n\tdefaultState ||= {} as StateScheme;\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\tObject.assign(story, flattenStory(part));\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\trenderer.ui.showScreen('loading');\n\n\t\t\tawait renderer.misc.preloadImagesBlocking(ASSETS_TO_PRELOAD);\n\t\t}\n\n\t\tconst screen = renderer.ui.getScreen();\n\t\tconst nextScreen = (scriptCalled ? screen : initialScreen) as NovelyScreen;\n\n\t\tASSETS_TO_PRELOAD.clear();\n\t\tassetsLoaded.resolve();\n\n\t\tif (nextScreen === 'game') {\n\t\t\tawait assetsLoaded.promise;\n\t\t\tawait dataLoaded.promise;\n\n\t\t\tif (!scriptCalled) {\n\t\t\t\trestore();\n\t\t\t}\n\t\t} else {\n\t\t\trenderer.ui.showScreen(nextScreen);\n\t\t}\n\n\t\tscriptCalled = true;\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t}\n\n\tconst action = new Proxy({} as ActionProxyProvider<Characters, Languages>, {\n\t\tget(_, prop) {\n\t\t\treturn (...props: Parameters<ActionFN>) => {\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\t/**\n\t\t\t\t\t * Load backgrounds\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showBackground' && typeof props[0] === 'string' && isCSSImage(props[0])) {\n\t\t\t\t\t\tASSETS_TO_PRELOAD.add(props[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Load characters\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showCharacter' && typeof props[0] === 'string' && typeof props[1] === 'string') {\n\t\t\t\t\t\tconst images = characters[props[0]].emotions[props[1]];\n\n\t\t\t\t\t\tif (Array.isArray(images)) {\n\t\t\t\t\t\t\tfor (const asset of images) {\n\t\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(asset);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(images)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [prop, ...props];\n\t\t\t};\n\t\t},\n\t});\n\n\tfunction state(value: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): void;\n\tfunction state(): StateScheme;\n\tfunction state(value?: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): StateScheme | void {\n\t\tif (!value) return stack.value[1] as StateScheme | void;\n\n\t\tconst prev = stack.value[1];\n\t\tconst val = isFunction(value) ? value(prev as StateScheme) : deepmerge(prev, value);\n\n\t\tstack.value[1] = val as StateScheme;\n\t}\n\n\tconst getDefaultSave = (state = {}) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', 'start'],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t] as Save;\n\t};\n\n\tconst createStack = (current: Save, stack = [current]) => {\n\t\treturn {\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value: Save) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\t\t\tback() {\n\t\t\t\tif (stack.length > 1) stack.pop(), (goingBack = true);\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack = [getDefaultSave(klona(defaultState))];\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getLanguageWithoutParameters = () => {\n\t\treturn getLanguage(languages, defaultGetLanguage);\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData = {\n\t\tsaves: [],\n\t\tdata: klona(defaultData) as Data,\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst coreData: CoreData = {\n\t\tdataLoaded: false,\n\t};\n\n\tconst $ = store(initialData);\n\tconst $$ = store(coreData);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif ($$.get().dataLoaded) storage.set(value);\n\t};\n\n\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tonStorageDataChange($.get());\n\t}, 10);\n\n\t$.subscribe(throttledOnStorageDataChange);\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= DEFAULT_TYPEWRITER_SPEED;\n\n\t\tif (overrideLanguage) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t} else {\n\t\t\tstored.meta[0] ||= getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\t$$.update((prev) => ((prev.dataLoaded = true), prev));\n\t\tdataLoaded.resolve();\n\n\t\t/**\n\t\t * Yay\n\t\t */\n\t\t$.update(() => stored);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(klona(defaultState));\n\tconst stack = createStack(initial);\n\n\t/**\n\t * Try to save data when page is switched\n\t */\n\taddEventListener('visibilitychange', () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tthrottledEmergencyOnStorageDataChange();\n\t\t}\n\t});\n\n\t/**\n\t * Try to save data when page is going to be unloaded\n\t */\n\taddEventListener('beforeunload', throttledEmergencyOnStorageDataChange);\n\n\tconst save = (override = false, type: Save[2][1] = override ? 'auto' : 'manual') => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\tconst current = klona(stack.value);\n\n\t\t$.update((prev) => {\n\t\t\t/**\n\t\t\t * Find latest save that were created in current session, and check if it is latest in an array\n\t\t\t *\n\t\t\t * We check if save was created in current session and it is latest in array\n\t\t\t * When it is not then replacing it will break logical chain\n\t\t\t *\n\t\t\t * [auto save 1]\n\t\t\t * [manual save 1]\n\t\t\t * [auto save 2] <- should not replace first auto save\n\t\t\t */\n\t\t\tconst isLatest = findLastIndex(prev.saves, (value) => times.has(value[2][0])) === prev.saves.length - 1;\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\tif (!override || !isLatest) {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst latest = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * When that save is the same type, replace it\n\t\t\t */\n\t\t\tif (latest && latest[2][1] === type) {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\t\t\t} else {\n\t\t\t\tprev.saves.push(current);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\tconst newGame = () => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(klona(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\t$.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\trestore(save);\n\t};\n\n\t/**\n\t * Set's the save\n\t */\n\tconst set = (save: Save) => {\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet restoring = false;\n\tlet goingBack = false;\n\tlet interacted = 0;\n\n\t/**\n\t * Restore\n\t */\n\tconst restore = async (save?: Save) => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tlet latest = save || $.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no game, then make a new game\n\t\t */\n\t\tif (!latest) {\n\t\t\t$.update(() => ({\n\t\t\t\tsaves: [initial],\n\t\t\t\tdata: klona(defaultData) as Data,\n\t\t\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t\t\t}));\n\n\t\t\tlatest = klona(initial);\n\t\t}\n\n\t\t(restoring = true), (stack.value = latest);\n\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Current item in the story\n\t\t */\n\t\tlet current: any = story;\n\t\t/**\n\t\t * Previous `current` value\n\t\t */\n\t\tlet precurrent: any;\n\t\t/**\n\t\t * Should we ignore some actions\n\t\t */\n\t\tlet ignoreNested = false;\n\n\t\t/**\n\t\t * Current item of type `[null, int]`\n\t\t */\n\t\tlet index = 0;\n\n\t\t/**\n\t\t * Cound of items of type `[null, int]`\n\t\t */\n\t\tconst max = stack.value[0].reduce((acc, [type, val]) => {\n\t\t\tif (isNull(type) && isNumber(val)) {\n\t\t\t\treturn acc + 1;\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, 0);\n\n\t\tconst queue = [] as [any, any][];\n\t\tconst keep = new Set();\n\t\tconst characters = new Set();\n\t\tconst blocks = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\n\t\t\t\tif (isNumber(val)) {\n\t\t\t\t\tindex++;\n\n\t\t\t\t\tlet startIndex = 0;\n\n\t\t\t\t\tif (ignoreNested) {\n\t\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), 'block');\n\n\t\t\t\t\t\tif (prev) {\n\t\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\t\tignoreNested = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t\t */\n\t\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t\t * But is should not happen\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\t\tconst [action, ...meta] = item;\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Add item to queue and action to keep\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst push = () => {\n\t\t\t\t\t\t\tkeep.add(action);\n\t\t\t\t\t\t\tqueue.push([action, meta]);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Do not remove characters that will be here anyways\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (action === 'showCharacter') characters.add(meta[0]);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Экшены, для закрытия которых пользователь должен с ними взаимодействовать\n\t\t\t\t\t\t * Также в эту группу входят экшены, которые не должны быть вызваны при восстановлении\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (isSkippedDuringRestore(action) || isUserRequiredAction(action, meta)) {\n\t\t\t\t\t\t\tif (index === max && i === val) {\n\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpush();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[val + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t\tignoreNested = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Run these exactly before the main loop.\n\t\t */\n\t\trenderer.ui.showScreen('game');\n\t\t/**\n\t\t * Provide the `keep` in there\n\t\t */\n\t\tmatch('clear', [keep, characters]);\n\n\t\t/**\n\t\t * Get the next actions array.\n\t\t */\n\t\tconst next = (i: number) => queue.slice(i + 1);\n\n\t\tfor await (const [i, [action, meta]] of queue.entries()) {\n\t\t\tif (action === 'function' || action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * When `callOnlyLatest` is `true`\n\t\t\t\t */\n\t\t\t\tif (action === 'custom' && (meta as GetActionParameters<'Custom'>)[0].callOnlyLatest) {\n\t\t\t\t\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, _meta]) => {\n\t\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t\tconst c0 = _meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\t\t\t\t\t\tconst c1 = meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Also check for `undefined`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst isIdenticalID = c0.id && c1.id && c0.id === c1.id;\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || str(c0) === str(c1);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Action can return Promise.\n\t\t\t\t */\n\t\t\t\tconst result = match(action, meta);\n\n\t\t\t\t/**\n\t\t\t\t * Should wait until it resolved\n\t\t\t\t */\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Await it!\n\t\t\t\t\t */\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t} else if (action === 'showCharacter') {\n\t\t\t\tconst skip = next(i).some(([_action, _meta]) => {\n\t\t\t\t\t/**\n\t\t\t\t\t * Проверка на возможный `undefined`\n\t\t\t\t\t */\n\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Будет ли персонаж скрыт в будущем\n\t\t\t\t\t * Нет смысла при загрузке сохранения загружать и отрисовывать персонажа, который будет скрыт\n\t\t\t\t\t */\n\t\t\t\t\tconst hidden = _action === 'hideCharacter' && _meta[0] === meta[0];\n\t\t\t\t\t/**\n\t\t\t\t\t * Не нужно запускать рендер персонажа, если после этого будет ещё один рендер этого персонажа\n\t\t\t\t\t * Таким образом избегаем ситуации, когда при загрузке вследствие гонки при загрузки изображений отрисовывается не последняя эмоция\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = _action === action && _meta[0] === meta[0];\n\n\t\t\t\t\treturn hidden || notLatest;\n\t\t\t\t});\n\n\t\t\t\tif (skip) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else if (action === 'showBackground' || action === 'animateCharacter' || action === 'preload') {\n\t\t\t\t/**\n\t\t\t\t * @todo: Также сравнивать персонажей в animateCharacter. Чтобы не просто последний запускался, а последний для персонажа.\n\t\t\t\t * Тем не менее таким образом могут быть лишнии анимации.\n\t\t\t\t * Можно проверить, что одна анимация идёт сразу за другой, а не через, например, dialog\n\t\t\t\t */\n\n\t\t\t\t/**\n\t\t\t\t * Такая же оптимизация применяется к фонам и анимированию персонажей, и `preload`.\n\t\t\t\t * Если фон изменится, то нет смысла устанавливать или предзагружать текущий\n\t\t\t\t */\n\t\t\t\tconst notLatest = next(i).some(([_action]) => action === _action);\n\n\t\t\t\tif (notLatest) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else {\n\t\t\t\tmatch(action, meta);\n\t\t\t}\n\t\t}\n\n\t\t(restoring = goingBack = false), render();\n\t};\n\n\tconst refer = (path = stack.value[0]) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false) => {\n\t\tif (interacted > 1 && !force && askBeforeExit) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = stack.value;\n\n\t\tstack.clear();\n\t\trenderer.ui.showScreen('mainmenu');\n\t\trenderer.audio.destroy();\n\n\t\t/**\n\t\t * First two save elements and it's type\n\t\t */\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\t$.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\n\tconst back = () => {\n\t\treturn stack.back(), restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | Languages) => {\n\t\treturn translation[lang as Languages].internal[key];\n\t};\n\n\tconst renderer = createRenderer({\n\t\tcharacters,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tstack,\n\t\tlanguages,\n\t\t$,\n\t\t$$,\n\t});\n\n\trenderer.ui.start();\n\n\tconst match = matchAction({\n\t\twait([time]) {\n\t\t\tif (!restoring) setTimeout(push, isFunction(time) ? time() : time);\n\t\t},\n\t\tshowBackground([background]) {\n\t\t\trenderer.background(background);\n\t\t\tpush();\n\t\t},\n\t\tplayMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music', true).play();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound([source, loop]) {\n\t\t\trenderer.audio.music(source, 'sound', loop || false).play();\n\t\t\tpush();\n\t\t},\n\t\tstopSound([source]) {\n\t\t\trenderer.audio.music(source, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice([source]) {\n\t\t\trenderer.audio.voice(source);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice() {\n\t\t\trenderer.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter([character, emotion, className, style]) {\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`)\n\t\t\t}\n\n\t\t\tconst handle = renderer.character(character);\n\n\t\t\thandle.append(className, style, restoring);\n\t\t\thandle.withEmotion(emotion)();\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter([character, className, style, duration]) {\n\t\t\trenderer.character(character).remove(className, style, duration)(push, restoring);\n\t\t},\n\t\tdialog([character, content, emotion]) {\n\t\t\t/**\n\t\t\t * Person name\n\t\t\t */\n\t\t\tconst name = (() => {\n\t\t\t\tconst c = character;\n\t\t\t\tconst cs = characters;\n\t\t\t\tconst lang = $.get().meta[0];\n\n\t\t\t\tif (c && c in cs) {\n\t\t\t\t\tconst block = cs[c].name;\n\n\t\t\t\t\tif (typeof block === 'string') {\n\t\t\t\t\t\treturn block;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (lang in block) {\n\t\t\t\t\t\treturn block[lang as Languages];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn c || '';\n\t\t\t})();\n\n\t\t\tconst run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);\n\n\t\t\trun(forward, goingBack);\n\t\t},\n\t\tfunction([fn]) {\n\t\t\tconst result = fn(restoring, goingBack);\n\n\t\t\tif (!restoring) result ? result.then(push) : push();\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice([question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Первый элемент может быть как строкой, так и элементов выбора\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as [Unwrappable<Languages>, ValidAction[], () => boolean]);\n\t\t\t\t/**\n\t\t\t\t * Значит, текст не требуется\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst unwrapped = choices.map(([content, action, visible]) => {\n\t\t\t\tif (DEV && action.length === 0 && (!visible || visible())) {\n\t\t\t\t\tconsole.warn(`Choice children should not be empty, either add content there or make item not selectable`)\n\t\t\t\t}\n\n\t\t\t\treturn [unwrap(content), action, visible] as [string, ValidAction[], () => boolean];\n\t\t\t});\n\n\t\t\tif (DEV && unwrapped.length === 0) {\n\t\t\t\tthrow new Error(`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`)\n\t\t\t}\n\n\t\t\tconst run = renderer.choices(unwrap(question), unwrapped);\n\n\t\t\trun((selected) => {\n\t\t\t\tenmemory();\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !unwrapped[selected + offset]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable')\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender();\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tmatch('clear', []);\n\t\t},\n\t\tclear([keep, characters]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\trenderer.clear(goingBack, keep || EMPTY_SET, characters || EMPTY_SET)(push);\n\n\t\t\trenderer.audio.clear();\n\t\t},\n\t\tcondition([condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tconst val = String(condition());\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\t/**\n\t\t\t * Clear the Scene\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * No-op used there because using push will make an infinite loop\n\t\t\t */\n\t\t\trenderer.clear(goingBack, EMPTY_SET, EMPTY_SET)(noop);\n\n\t\t\t/**\n\t\t\t * Go to the main menu\n\t\t\t */\n\t\t\trenderer.ui.showScreen('mainmenu');\n\t\t\t/**\n\t\t\t * Reset interactive value\n\t\t\t */\n\t\t\tinteractivity(false);\n\t\t\t/**\n\t\t\t * Reset session times\n\t\t\t */\n\t\t\ttimes.clear();\n\t\t},\n\t\tinput([question, onInput, setup]) {\n\t\t\trenderer.input(unwrap(question), onInput, setup)(forward);\n\t\t},\n\t\tcustom([handler]) {\n\t\t\tconst result = renderer.custom(handler, goingBack, () => {\n\t\t\t\tif (!restoring && handler.requireUserAction) enmemory(), interactivity(true);\n\t\t\t\tif (!restoring) push();\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate(pattern) {\n\t\t\trenderer.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext() {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter([character, timeout, ...classes]) {\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]')\n\t\t\t}\n\n\t\t\tif (DEV && (timeout <= 0 || !Number.isFinite(timeout) || Number.isNaN(timeout))) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter with unacceptable timeout. It should be finite and greater than zero')\n\t\t\t}\n\n\t\t\tconst handler: CustomHandler = (get) => {\n\t\t\t\tconst { clear } = get('@@internal-animate-character', false);\n\t\t\t\tconst char = renderer.store.characters[character];\n\n\t\t\t\t/**\n\t\t\t\t * Character is not defined, maybe, `animateCharacter` was called before `showCharacter` OR character was not just loaded yet\n\t\t\t\t */\n\n\t\t\t\tif (!char) return;\n\n\t\t\t\tconst target = char.canvas;\n\n\t\t\t\t/**\n\t\t\t\t * Character is not found\n\t\t\t\t */\n\t\t\t\tif (!target) return;\n\n\t\t\t\tconst classNames = classes.filter((className) => !target.classList.contains(className));\n\n\t\t\t\ttarget.classList.add(...classNames);\n\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\t\t\t\t}, timeout);\n\n\t\t\t\tclear(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Clear timeout, because when you will game re-runs some callback might remove classes from character\n\t\t\t\t\t */\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * `callOnlyLatest` property will not have any effect, because `custom` is called directly\n\t\t\t */\n\t\t\tmatch('custom', [handler]);\n\t\t},\n\t\ttext(text) {\n\t\t\tconst string = text.map((content) => unwrap(content)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`)\n\t\t\t}\n\n\t\t\trenderer.text(string, forward, goingBack);\n\t\t},\n\t\texit() {\n\t\t\tif (restoring) return;\n\n\t\t\tconst path = stack.value[0];\n\t\t\tconst last = path.at(-1);\n\t\t\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\t\t\t/**\n\t\t\t * - should be an array\n\t\t\t * - first element is action name\n\t\t\t */\n\t\t\tif (!isAction(refer(path))) {\n\t\t\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\t\t\tlast[1]--;\n\t\t\t\t} else {\n\t\t\t\t\tpath.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Exit is impossible\n\t\t\t */\n\t\t\tif (path.every(([name]) => !isBlockStatement(name))) {\n\t\t\t\tconst referred = refer(path);\n\n\t\t\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\t\t\tmatch('end', []);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let i = path.length - 1; i > 0; i--) {\n\t\t\t\tconst [name] = path[i];\n\n\t\t\t\t/**\n\t\t\t\t * Remember already exited paths\n\t\t\t\t */\n\t\t\t\tif (isBlockExitStatement(name)) {\n\t\t\t\t\tignore.push(name);\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Ignore everything that we do not need there\n\t\t\t\t */\n\t\t\t\tif (!isBlockStatement(name)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * When we found an already exited path we remove it from the list\n\t\t\t\t */\n\t\t\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\t\t\tignore.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Exit from the path\n\t\t\t\t */\n\t\t\t\tpath.push([`${name}:exit`]);\n\n\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t\t\t/**\n\t\t\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t\t\t */\n\t\t\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t\t\t/**\n\t\t\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t\t\t *\n\t\t\t\t * - remove that item\n\t\t\t\t * - close another block\n\t\t\t\t */\n\t\t\t\tif (!isAction(refer(path))) {\n\t\t\t\t\tpath.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\trender();\n\t\t},\n\t\tpreload([source]) {\n\t\t\tif (!goingBack && !restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Make image load\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t});\n\n\tconst enmemory = () => {\n\t\tif (restoring) return;\n\n\t\tconst current = klona(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave(true, 'auto');\n\t};\n\n\tconst next = () => {\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Last path element\n\t\t */\n\t\tconst last = path.at(-1);\n\n\t\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\t\tlast[1]++;\n\t\t} else {\n\t\t\tpath.push([null, 0]);\n\t\t}\n\t};\n\n\tconst render = () => {\n\t\tconst referred = refer();\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props);\n\t\t} else {\n\t\t\tmatch('exit', []);\n\t\t}\n\t};\n\n\tconst push = () => {\n\t\tif (!restoring) next(), render();\n\t};\n\n\tconst forward = () => {\n\t\tenmemory();\n\t\tpush();\n\t\tinteractivity(true);\n\t};\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Unwraps translatable content to string\n\t *\n\t * @example ```\n\t * unwrap({ en: 'Hello', ru: 'Привет' });\n\t * unwrap({ en: () => data().ad_viewed ? 'Diamond Hat' : 'Diamond Hat (Watch Adv)' })\n\t * unwrap(() => `Today is ${new Date()}`)\n\t * unwrap('Hello, {{name}}');\n\t * ```\n\t */\n\tconst unwrap = (content: Unwrappable<Languages>, global = false) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = $.get();\n\n\t\tconst obj = global ? data : state();\n\t\tconst cnt = isFunction(content)\n\t\t\t? content()\n\t\t\t: typeof content === 'string'\n\t\t\t ? content\n\t\t\t : content[lang as Languages];\n\n\t\tconst str = isFunction(cnt) ? cnt() : cnt;\n\n\t\tconst trans = translation[lang as Languages];\n\n\t\tif (trans.actions || trans.plural) {\n\t\t\t/**\n\t\t\t * Should kinda work, but creating PluralRules each time is not really efficient\n\t\t\t */\n\t\t\treturn replaceT9N(str, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));\n\t\t}\n\n\t\treturn replaceT9N(str, obj);\n\t};\n\n\tfunction data(value: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): void;\n\tfunction data(): DataScheme;\n\tfunction data(value?: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): DataScheme | void {\n\t\tif (!value) return $.get().data as DataScheme | void;\n\n\t\tconst prev = $.get().data;\n\t\tconst val = isFunction(value) ? value(prev as DataScheme) : deepmerge(prev, value);\n\n\t\t$.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Function to get actions\n\t\t */\n\t\taction,\n\t\t/**\n\t\t * State that belongs to games\n\t\t */\n\t\tstate,\n\t\t/**\n\t\t * Unlike `state`, stored at global scope instead and shared between games\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Unwraps translatable content to a string value\n\t\t */\n\t\tunwrap(content: Exclude<Unwrappable<Languages>, Record<string, string>> | Record<Languages, string>) {\n\t\t\treturn unwrap(content, true);\n\t\t},\n\t};\n};\n\nexport { novely };\n","export const BROWSER = false;\nexport const DEV = false;\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость Текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи'\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume'\n};\n\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'Жаңа ойын',\n\tHomeScreen: 'Негізгі экран',\n\tToTheGame: 'Ойынға',\n\tLanguage: 'Тіл',\n\tNoSaves: 'Сақтау жоқ',\n\tLoadSave: 'Жүктеу',\n\tSaves: 'Сақтау',\n\tSettings: 'Параметрлер',\n\tSumbit: 'Растау',\n\tGoBack: 'Артқа',\n\tDoSave: 'Сақтау',\n\tAuto: 'Авто',\n\tStop: 'Тоқта',\n\tExit: 'Шығу',\n\tAutomatic: 'Автоматты',\n\tManual: 'Қолмен',\n\tRemove: 'Жою',\n\tLoadASaveFrom: 'Сақтауды жүктеу',\n\tDeleteASaveFrom: 'Сақтауды жою',\n\tTextSpeed: 'Мәтін Жылдамдығы',\n\tTextSpeedSlow: 'Баяу',\n\tTextSpeedMedium: 'Орташа',\n\tTextSpeedFast: 'Жылдам',\n\tTextSpeedAuto: 'Автоматты',\n\tCompleteText: 'Мәтінді аяқтау',\n\tGoForward: 'Алға жылжу',\n\tExitDialogWarning: 'Сіз шыққыңыз келетініне сенімдісіз бе? Прогресс сақталады',\n\tExitDialogExit: 'Шығу',\n\tExitDialogBack: 'Ойынға оралу',\n\tOpenMenu: 'Мәзірді ашыңыз',\n\tCloseMenu: 'Мәзірді жабу',\n\tMusicVolume: 'Музыканың көлемі',\n\tSoundVolume: 'Дыбыстардың көлемі',\n\tVoiceVolume: 'Сөйлеу көлемі'\n};\n\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\n\tNewGame: '「新しいゲーム」',\n\tHomeScreen: 'ホーム画面',\n\tToTheGame: '「ゲームに戻る」',\n\tLanguage: '言語',\n\tNoSaves: 'ノーセーブ',\n\tLoadSave: 'ダウンロード',\n\tSaves: '保存',\n\tSettings: '設定',\n\tSumbit: '確認',\n\tGoBack: '「戻る」',\n\tDoSave: '保存',\n\tAuto: 'オート',\n\tStop: '止まれ',\n\tExit: '出口',\n\tAutomatic: '自動',\n\tManual: 'マニュアル',\n\tRemove: '削除',\n\tLoadASaveFrom: 'ロードセーブから',\n\tDeleteASaveFrom: 'から保存を削除',\n\tTextSpeed: 'テキストスピード',\n\tTextSpeedSlow: '「遅い」',\n\tTextSpeedMedium: 'ミディアム',\n\tTextSpeedFast: '「速い」',\n\tTextSpeedAuto: '自動',\n\tCompleteText: 'テキストを完成させる',\n\tGoForward: '先に行く',\n\tExitDialogWarning: '本当に終了しますか?進行状況は保存されます',\n\tExitDialogExit: '終了',\n\tExitDialogBack: 'ゲームに戻る',\n\tOpenMenu: 'メニューを開く',\n\tCloseMenu: 'メニューを閉じる',\n\tMusicVolume: '音楽のボリューム',\n\tSoundVolume: '音量',\n\tVoiceVolume: 'スピーチの量'\n};\n\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\n"],"mappings":"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","names":["pLimit","str","str","getLanguage","pLimit","state","stack","save","characters","action","push","next","unwrap","data","str","prev"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/yocto-queue@0.1.0/node_modules/yocto-queue/index.js","../../../node_modules/.pnpm/p-limit@3.1.0/node_modules/p-limit/index.js","../src/index.ts","../src/constants.ts","../src/utils.ts","../src/global.ts","../src/store.ts","../../deepmerge/src/utils.ts","../../deepmerge/src/index.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/json/index.mjs","../src/translation.ts","../src/storage.ts","../src/novely.ts","../../../node_modules/.pnpm/esm-env@1.0.0/node_modules/esm-env/prod-ssr.js","../src/translations.ts"],"sourcesContent":["class Node {\n\t/// value;\n\t/// next;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\n\t\t// TODO: Remove this when targeting Node.js 12.\n\t\tthis.next = undefined;\n\t}\n}\n\nclass Queue {\n\t// TODO: Use private class fields when targeting Node.js 12.\n\t// #_head;\n\t// #_tail;\n\t// #_size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this._head) {\n\t\t\tthis._tail.next = node;\n\t\t\tthis._tail = node;\n\t\t} else {\n\t\t\tthis._head = node;\n\t\t\tthis._tail = node;\n\t\t}\n\n\t\tthis._size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this._head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._head = this._head.next;\n\t\tthis._size--;\n\t\treturn current.value;\n\t}\n\n\tclear() {\n\t\tthis._head = undefined;\n\t\tthis._tail = undefined;\n\t\tthis._size = 0;\n\t}\n\n\tget size() {\n\t\treturn this._size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this._head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n\nmodule.exports = Queue;\n","'use strict';\nconst Queue = require('yocto-queue');\n\nconst pLimit = concurrency => {\n\tif (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, ...args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, ...args) => {\n\t\tqueue.enqueue(run.bind(null, fn, resolve, ...args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, ...args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn generator;\n};\n\nmodule.exports = pLimit;\n","export type {\n\tValidAction,\n\tStory,\n\tActionProxyProvider,\n\tDefaultActionProxyProvider,\n\tGetActionParameters,\n\tUnwrappable,\n\tCustomHandler,\n\tCustomHandlerGetResult,\n\tCustomHandlerGetResultDataFunction,\n\tFunctionableValue,\n} from './action';\nexport type { Emotions, Character } from './character';\nexport type { CharacterHandle, AudioHandle, RendererStore, Renderer, RendererInit } from './renderer';\nexport type { Storage } from './storage';\nexport type {\n\tThenable,\n\tPath,\n\tStorageData,\n\tStorageMeta,\n\tTypewriterSpeed,\n\tLang,\n\tNovelyScreen,\n\tCoreData,\n} from './types';\nexport type { Stored } from './store';\nexport type { BaseTranslationStrings } from './translations';\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions } from './translation';\n\nexport { novely } from './novely';\nexport { localStorageStorage } from './storage';\n\nexport { RU, EN, JP, KK } from './translations';\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nexport { SKIPPED_DURING_RESTORE, EMPTY_SET, DEFAULT_TYPEWRITER_SPEED, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS };\n","import type { ActionProxyProvider, CustomHandler, Story, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Thenable, Path, PathItem } from './types';\nimport { BLOCK_STATEMENTS, BLOCK_EXIT_STATEMENTS, SKIPPED_DURING_RESTORE } from './constants';\n\ntype MatchActionMap = {\n\t[Key in keyof ActionProxyProvider<Record<string, Character>, string>]: (\n\t\tdata: Parameters<ActionProxyProvider<Record<string, Character>, string>[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (value: [handler: CustomHandler]) => Thenable<void>;\n};\n\nconst matchAction = <M extends MatchActionMapComplete>(values: M) => {\n\treturn (action: keyof MatchActionMap, props: any) => {\n\t\treturn values[action](props);\n\t};\n};\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\nconst isCSSImage = (str: string) => {\n\tconst startsWith = String.prototype.startsWith.bind(str);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\nconst str = String;\n\nconst isUserRequiredAction = (\n\taction: keyof MatchActionMapComplete,\n\tmeta: Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n) => {\n\treturn action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction;\n};\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\n/**\n * @copyright Techlead LLC\n * @see https://learn.javascript.ru/task/throttle\n */\nconst throttle = <Fn extends (...args: any[]) => any>(fn: Fn, ms: number) => {\n\tlet throttled = false,\n\t\tsavedArgs: any,\n\t\tsavedThis: any;\n\n\tfunction wrapper(this: any, ...args: any[]) {\n\t\tif (throttled) {\n\t\t\tsavedArgs = args;\n\t\t\t/* eslint-disable @typescript-eslint/no-this-alias */\n\t\t\tsavedThis = this;\n\t\t\treturn;\n\t\t}\n\n\t\tfn.apply(this, args as unknown as any[]);\n\n\t\tthrottled = true;\n\n\t\tsetTimeout(function () {\n\t\t\tthrottled = false;\n\n\t\t\tif (savedArgs) {\n\t\t\t\twrapper.apply(savedThis, savedArgs);\n\t\t\t\tsavedArgs = savedThis = null;\n\t\t\t}\n\t\t}, ms);\n\t}\n\n\treturn wrapper as unknown as (...args: Parameters<Fn>) => void;\n};\n\nconst findLastIndex = <T>(array: T[], fn: (item: T, next?: T) => boolean) => {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (fn(array[i], array[i + 1])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\ntype ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\t// @ts-expect-error Types does not match and this is expected\n\t\tobject.promise = promise;\n\t};\n\n\treturn init(), object;\n};\n\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst index = findLastIndex(path, ([_name, _value], next) => {\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn path[index] as undefined | [null, number];\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\nconst noop = () => {};\n\nconst isAction = (\n\telement: unknown,\n): element is [\n\tkeyof MatchActionMapComplete,\n\t...Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n] => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`\n */\nconst flattenStory = (story: Story) => {\n\tconst entries = Object.entries(story).map(([name, items]) => {\n\t\tconst flat = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\t\t\treturn item.flatMap((data) => {\n\t\t\t\tconst type = data[0];\n\n\t\t\t\t/**\n\t\t\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t\t\t */\n\t\t\t\tif (Array.isArray(type)) return flat(data as ValidAction[]);\n\n\t\t\t\treturn [data as ValidAction];\n\t\t\t});\n\t\t};\n\n\t\treturn [name, flat(items)];\n\t});\n\n\treturn Object.fromEntries(entries);\n};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i++; i < blockStatements.length) {\n\t\tconst b = blockStatements[i][0];\n\t\tconst be = blockExitStatements[i][0];\n\n\t\tif (!b || !be) return false;\n\t\tif (!be.startsWith(b)) return false;\n\t}\n\n\treturn true;\n}\n\nexport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisString,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tnoop,\n\tisAction,\n\tflattenStory,\n\tonce,\n\tisExitImpossible\n};\n","const PRELOADED_ASSETS = new Set<string>();\n\nexport { PRELOADED_ASSETS };\n","type Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, get } as const;\n};\n\nexport { store };\nexport type { Stored };\n","const { isArray } = Array;\nconst { hasOwnProperty, propertyIsEnumerable, getOwnPropertySymbols } = Object;\n\nconst propertyIsOnObject = <T extends Record<PropertyKey, unknown>, K extends PropertyKey>(object: T, property: K): object is T & { [Key in K]: unknown } => {\n\ttry {\n\t\treturn property in object\n\t} catch {\n\t\treturn false\n\t}\n}\n\nconst propertyIsUnsafe = (target: Record<PropertyKey, unknown>, key: PropertyKey) => {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nconst getEnumerableOwnPropertySymbols = (target: Record<PropertyKey, unknown>) => {\n if (!getOwnPropertySymbols) return [];\n\n return getOwnPropertySymbols(target).filter(symbol => propertyIsEnumerable.call(target, symbol))\n}\n\nconst keys = <T extends Record<PropertyKey, unknown>>(target: T): (keyof T)[] => {\n return [...Object.keys(target), ...getEnumerableOwnPropertySymbols(target)];\n}\n\nconst isMergeableObject = (value: unknown): value is Record<PropertyKey, unknown> => {\n return !!value && typeof value === 'object' && !(['RegExp', 'Date'].includes(Object.prototype.toString.call(value).slice(8, -1)));\n}\n\nexport { isArray, propertyIsOnObject, propertyIsUnsafe, getEnumerableOwnPropertySymbols, isMergeableObject, keys }\n","import { isArray, propertyIsOnObject, propertyIsUnsafe, isMergeableObject, keys } from './utils';\n\nconst empty = <T extends (Record<PropertyKey, unknown> | unknown[])>(value: T): T => {\n return (isArray(value) ? [] : {}) as T;\n}\n\nconst clone = <T>(value: T): T => {\n return isMergeableObject(value)\n ? deepmerge(empty(value), value)\n : value;\n}\n\nconst mergeArray = <T>(target: T[], source: T[]) => {\n const destination = target.slice();\n\n source.forEach((item, index) => {\n if (typeof destination[index] === 'undefined') {\n destination[index] = clone(item);\n } else if (isMergeableObject(item)) {\n destination[index] = deepmerge(target[index] as any, item as any);\n } else if (target.indexOf(item) === -1) {\n destination.push(item);\n }\n });\n\n return destination;\n}\n\nconst mergeObject = <T extends Record<PropertyKey, unknown>>(target: T, source: T): T => {\n const destination: Record<PropertyKey, any> = {};\n\n for (const key of keys(target)) {\n destination[key] = clone(target[key]);\n }\n\n for (const key of keys(source)) {\n if (propertyIsUnsafe(target, key)) {\n continue;\n }\n\n if (propertyIsOnObject(target, key) && isMergeableObject(source[key])) {\n destination[key] = deepmerge(target[key] as any, source[key] as any);\n } else {\n destination[key] = clone(source[key]);\n }\n }\n\n return destination as unknown as T;\n}\n\nconst deepmerge = <T extends (Record<PropertyKey, unknown> | unknown[])>(target: T, source: T): T => {\n if (isArray(target) && isArray(source)) {\n const merged = mergeArray(target, source);\n\n return merged as unknown as T;\n } else if (!isArray(target) && !isArray(source)) {\n const merged = mergeObject(target, source);\n\n return merged as unknown as T;\n } else {\n return clone(source);\n }\n}\n\nexport { deepmerge }\n","export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n","type PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent = string | (() => string | string[]) | string[] | (string | (() => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Unwraps any allowed content into string\n * @param c Content\n */\nconst unwrap = (c: AllowedContent): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => unwrap(item)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn unwrap(c());\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tstr: AllowedContent,\n\tobj: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn unwrap(str).replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = obj;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action && actions[action];\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { unwrap, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import type { StorageData } from './types';\n\ninterface LocalStorageStorageSettings {\n\tkey: string;\n}\n\ninterface Storage {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n}\n\nconst localStorageStorage = (options: LocalStorageStorageSettings): Storage => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(options.key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(options.key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { Storage };\nexport { localStorageStorage };\n","import type { Character } from './character';\nimport type {\n\tActionProxyProvider,\n\tGetActionParameters,\n\tStory,\n\tValidAction,\n\tUnwrappable,\n\tCustomHandler,\n} from './action';\nimport type { Storage } from './storage';\nimport type {\n\tSave,\n\tState,\n\tData,\n\tStorageData,\n\tDeepPartial,\n\tNovelyScreen,\n\tMigration,\n\tActionFN,\n\tCoreData,\n} from './types';\nimport type { Renderer, RendererInit } from './renderer';\nimport type { TranslationActions, Pluralization } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage as defaultGetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAction,\n\tnoop,\n\tflattenStory,\n\tisExitImpossible\n} from './utils';\nimport { PRELOADED_ASSETS } from './global';\nimport { store } from './store';\nimport { deepmerge } from '@novely/deepmerge';\nimport { klona } from 'klona/json';\nimport { EMPTY_SET, DEFAULT_TYPEWRITER_SPEED } from './constants';\nimport { replace as replaceT9N } from './translation';\nimport { localStorageStorage } from './storage';\nimport pLimit from 'p-limit';\n\nimport { DEV } from 'esm-env';\n\ninterface NovelyInit<\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n> {\n\t/**\n\t * An array of languages supported by the game.\n\t */\n\tlanguages: Languages[];\n\t/**\n\t * An object containing the characters in the game.\n\t */\n\tcharacters: Characters;\n\t/**\n\t * An object that provides access to the game's storage system.\n\t * @default localStorage // at key `novely-game-storage`\n\t */\n\tstorage?: Storage;\n\t/**\n\t * Delay loading data until Promise is resolved\n\t */\n\tstorageDelay?: Promise<void>;\n\t/**\n\t * A function that returns a Renderer object used to display the game's content\n\t */\n\trenderer: (characters: RendererInit) => Renderer;\n\t/**\n\t * An optional property that specifies the initial screen to display when the game starts\n\t */\n\tinitialScreen?: NovelyScreen;\n\t/**\n\t * An object containing the translation functions used in the game\n\t */\n\ttranslation: Record<\n\t\tLanguages,\n\t\t{\n\t\t\tinternal: Record<BaseTranslationStrings, string>;\n\t\t\t/**\n\t\t\t * IETF BCP 47 language tag\n\t\t\t */\n\t\t\ttag?: string;\n\t\t\tplural?: Record<string, Pluralization>;\n\t\t\tactions?: TranslationActions;\n\t\t}\n\t>;\n\t/**\n\t * Initial state value\n\t */\n\tstate?: StateScheme;\n\t/**\n\t * Initial data value\n\t */\n\tdata?: DataScheme;\n\t/**\n\t * Enable autosaves or disable\n\t * @default true\n\t */\n\tautosaves?: boolean;\n\t/**\n\t * Migration from old saves to newer\n\t */\n\tmigrations?: Migration[];\n\t/**\n\t * For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage\n\t * @default 799\n\t */\n\tthrottleTimeout?: number;\n\t/**\n\t * Custom language detector\n\t * @param languages Supported languages aka `languages: []` in the config\n\t * @example ```ts\n\t * novely({\n\t * \t\tgetLanguage(languages, original) {\n\t * \t\t\t\tif (!sdk) return original(languages);\n\t * \t\t\t\treturn sdk.environment.i18n.lang // i.e. custom language from some sdk\n\t * \t\t}\n\t * })\n\t * ```\n\t */\n\tgetLanguage?: (languages: string[], original: typeof defaultGetLanguage) => string;\n\t/**\n\t * Ignores saved language, and uses `getLanguage` to get it on every engine start\n\t * @default false\n\t */\n\toverrideLanguage?: boolean;\n\t/**\n\t * Show a prompt before exiting a game\n\t * @default true\n\t */\n\taskBeforeExit?: boolean;\n\t/**\n\t * @default \"lazy\"\n\t */\n\tpreloadAssets?: 'lazy' | 'blocking';\n}\n\nconst novely = <\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n>({\n\tcharacters,\n\tstorage = localStorageStorage({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tlanguages,\n\tstate: defaultState,\n\tdata: defaultData,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 799,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'lazy',\n}: NovelyInit<Languages, Characters, StateScheme, DataScheme>) => {\n\tconst limitScript = pLimit(1);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst ASSETS_TO_PRELOAD = new Set<string>();\n\tconst assetsLoaded = createControlledPromise();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet scriptCalled = false;\n\n\t/**\n\t * Prevent `undefined`\n\t */\n\tdefaultData ||= {} as DataScheme;\n\tdefaultState ||= {} as StateScheme;\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\tObject.assign(story, flattenStory(part));\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\trenderer.ui.showScreen('loading');\n\n\t\t\tawait renderer.misc.preloadImagesBlocking(ASSETS_TO_PRELOAD);\n\t\t}\n\n\t\tconst screen = renderer.ui.getScreen();\n\t\tconst nextScreen = (scriptCalled ? screen : initialScreen) as NovelyScreen;\n\n\t\tASSETS_TO_PRELOAD.clear();\n\t\tassetsLoaded.resolve();\n\n\t\tif (nextScreen === 'game') {\n\t\t\tawait assetsLoaded.promise;\n\t\t\tawait dataLoaded.promise;\n\n\t\t\tif (!scriptCalled) {\n\t\t\t\trestore();\n\t\t\t}\n\t\t} else {\n\t\t\trenderer.ui.showScreen(nextScreen);\n\t\t}\n\n\t\tscriptCalled = true;\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t}\n\n\tconst action = new Proxy({} as ActionProxyProvider<Characters, Languages>, {\n\t\tget(_, prop) {\n\t\t\treturn (...props: Parameters<ActionFN>) => {\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\t/**\n\t\t\t\t\t * Load backgrounds\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showBackground' && typeof props[0] === 'string' && isCSSImage(props[0])) {\n\t\t\t\t\t\tASSETS_TO_PRELOAD.add(props[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Load characters\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showCharacter' && typeof props[0] === 'string' && typeof props[1] === 'string') {\n\t\t\t\t\t\tconst images = characters[props[0]].emotions[props[1]];\n\n\t\t\t\t\t\tif (Array.isArray(images)) {\n\t\t\t\t\t\t\tfor (const asset of images) {\n\t\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(asset);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(images)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [prop, ...props];\n\t\t\t};\n\t\t},\n\t});\n\n\tfunction state(value: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): void;\n\tfunction state(): StateScheme;\n\tfunction state(value?: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): StateScheme | void {\n\t\tif (!value) return stack.value[1] as StateScheme | void;\n\n\t\tconst prev = stack.value[1];\n\t\tconst val = isFunction(value) ? value(prev as StateScheme) : deepmerge(prev, value);\n\n\t\tstack.value[1] = val as StateScheme;\n\t}\n\n\tconst getDefaultSave = (state = {}) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', 'start'],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t] as Save;\n\t};\n\n\tconst createStack = (current: Save, stack = [current]) => {\n\t\treturn {\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value: Save) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\t\t\tback() {\n\t\t\t\tif (stack.length > 1) stack.pop(), (goingBack = true);\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack = [getDefaultSave(klona(defaultState))];\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getLanguageWithoutParameters = () => {\n\t\treturn getLanguage(languages, defaultGetLanguage);\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData = {\n\t\tsaves: [],\n\t\tdata: klona(defaultData) as Data,\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst coreData: CoreData = {\n\t\tdataLoaded: false,\n\t};\n\n\tconst $ = store(initialData);\n\tconst $$ = store(coreData);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif ($$.get().dataLoaded) storage.set(value);\n\t};\n\n\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tonStorageDataChange($.get());\n\t}, 10);\n\n\t$.subscribe(throttledOnStorageDataChange);\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= DEFAULT_TYPEWRITER_SPEED;\n\n\t\tif (overrideLanguage) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t} else {\n\t\t\tstored.meta[0] ||= getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\t$$.update((prev) => ((prev.dataLoaded = true), prev));\n\t\tdataLoaded.resolve();\n\n\t\t/**\n\t\t * Yay\n\t\t */\n\t\t$.update(() => stored);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(klona(defaultState));\n\tconst stack = createStack(initial);\n\n\t/**\n\t * Try to save data when page is switched\n\t */\n\taddEventListener('visibilitychange', () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tthrottledEmergencyOnStorageDataChange();\n\t\t}\n\t});\n\n\t/**\n\t * Try to save data when page is going to be unloaded\n\t */\n\taddEventListener('beforeunload', throttledEmergencyOnStorageDataChange);\n\n\tconst save = (override = false, type: Save[2][1] = override ? 'auto' : 'manual') => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\tconst current = klona(stack.value);\n\n\t\t$.update((prev) => {\n\t\t\t/**\n\t\t\t * Find latest save that were created in current session, and check if it is latest in an array\n\t\t\t *\n\t\t\t * We check if save was created in current session and it is latest in array\n\t\t\t * When it is not then replacing it will break logical chain\n\t\t\t *\n\t\t\t * [auto save 1]\n\t\t\t * [manual save 1]\n\t\t\t * [auto save 2] <- should not replace first auto save\n\t\t\t */\n\t\t\tconst isLatest = findLastIndex(prev.saves, (value) => times.has(value[2][0])) === prev.saves.length - 1;\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\tif (!override || !isLatest) {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst latest = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * When that save is the same type, replace it\n\t\t\t */\n\t\t\tif (latest && latest[2][1] === type) {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\t\t\t} else {\n\t\t\t\tprev.saves.push(current);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\tconst newGame = () => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(klona(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\t$.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\trestore(save);\n\t};\n\n\t/**\n\t * Set's the save\n\t */\n\tconst set = (save: Save) => {\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet restoring = false;\n\tlet goingBack = false;\n\tlet interacted = 0;\n\n\t/**\n\t * Restore\n\t */\n\tconst restore = async (save?: Save) => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tlet latest = save || $.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no game, then make a new game\n\t\t */\n\t\tif (!latest) {\n\t\t\t$.update(() => ({\n\t\t\t\tsaves: [initial],\n\t\t\t\tdata: klona(defaultData) as Data,\n\t\t\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t\t\t}));\n\n\t\t\tlatest = klona(initial);\n\t\t}\n\n\t\t(restoring = true), (stack.value = latest);\n\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Current item in the story\n\t\t */\n\t\tlet current: any = story;\n\t\t/**\n\t\t * Previous `current` value\n\t\t */\n\t\tlet precurrent: any;\n\t\t/**\n\t\t * Should we ignore some actions\n\t\t */\n\t\tlet ignoreNested = false;\n\n\t\t/**\n\t\t * Current item of type `[null, int]`\n\t\t */\n\t\tlet index = 0;\n\n\t\t/**\n\t\t * Cound of items of type `[null, int]`\n\t\t */\n\t\tconst max = stack.value[0].reduce((acc, [type, val]) => {\n\t\t\tif (isNull(type) && isNumber(val)) {\n\t\t\t\treturn acc + 1;\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, 0);\n\n\t\tconst queue = [] as [any, any][];\n\t\tconst keep = new Set();\n\t\tconst characters = new Set();\n\t\tconst blocks = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\n\t\t\t\tif (isNumber(val)) {\n\t\t\t\t\tindex++;\n\n\t\t\t\t\tlet startIndex = 0;\n\n\t\t\t\t\tif (ignoreNested) {\n\t\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), 'block');\n\n\t\t\t\t\t\tif (prev) {\n\t\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\t\tignoreNested = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t\t */\n\t\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t\t * But is should not happen\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\t\tconst [action, ...meta] = item;\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Add item to queue and action to keep\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst push = () => {\n\t\t\t\t\t\t\tkeep.add(action);\n\t\t\t\t\t\t\tqueue.push([action, meta]);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Do not remove characters that will be here anyways\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (action === 'showCharacter') characters.add(meta[0]);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Экшены, для закрытия которых пользователь должен с ними взаимодействовать\n\t\t\t\t\t\t * Также в эту группу входят экшены, которые не должны быть вызваны при восстановлении\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (isSkippedDuringRestore(action) || isUserRequiredAction(action, meta)) {\n\t\t\t\t\t\t\tif (index === max && i === val) {\n\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpush();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[val + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t\tignoreNested = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Run these exactly before the main loop.\n\t\t */\n\t\trenderer.ui.showScreen('game');\n\t\t/**\n\t\t * Provide the `keep` in there\n\t\t */\n\t\tmatch('clear', [keep, characters]);\n\n\t\t/**\n\t\t * Get the next actions array.\n\t\t */\n\t\tconst next = (i: number) => queue.slice(i + 1);\n\n\t\tfor await (const [i, [action, meta]] of queue.entries()) {\n\t\t\tif (action === 'function' || action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * When `callOnlyLatest` is `true`\n\t\t\t\t */\n\t\t\t\tif (action === 'custom' && (meta as GetActionParameters<'Custom'>)[0].callOnlyLatest) {\n\t\t\t\t\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, _meta]) => {\n\t\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t\tconst c0 = _meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\t\t\t\t\t\tconst c1 = meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Also check for `undefined`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst isIdenticalID = c0.id && c1.id && c0.id === c1.id;\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || str(c0) === str(c1);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Action can return Promise.\n\t\t\t\t */\n\t\t\t\tconst result = match(action, meta);\n\n\t\t\t\t/**\n\t\t\t\t * Should wait until it resolved\n\t\t\t\t */\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Await it!\n\t\t\t\t\t */\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t} else if (action === 'showCharacter') {\n\t\t\t\tconst skip = next(i).some(([_action, _meta]) => {\n\t\t\t\t\t/**\n\t\t\t\t\t * Проверка на возможный `undefined`\n\t\t\t\t\t */\n\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Будет ли персонаж скрыт в будущем\n\t\t\t\t\t * Нет смысла при загрузке сохранения загружать и отрисовывать персонажа, который будет скрыт\n\t\t\t\t\t */\n\t\t\t\t\tconst hidden = _action === 'hideCharacter' && _meta[0] === meta[0];\n\t\t\t\t\t/**\n\t\t\t\t\t * Не нужно запускать рендер персонажа, если после этого будет ещё один рендер этого персонажа\n\t\t\t\t\t * Таким образом избегаем ситуации, когда при загрузке вследствие гонки при загрузки изображений отрисовывается не последняя эмоция\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = _action === action && _meta[0] === meta[0];\n\n\t\t\t\t\treturn hidden || notLatest;\n\t\t\t\t});\n\n\t\t\t\tif (skip) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else if (action === 'showBackground' || action === 'animateCharacter' || action === 'preload') {\n\t\t\t\t/**\n\t\t\t\t * @todo: Также сравнивать персонажей в animateCharacter. Чтобы не просто последний запускался, а последний для персонажа.\n\t\t\t\t * Тем не менее таким образом могут быть лишнии анимации.\n\t\t\t\t * Можно проверить, что одна анимация идёт сразу за другой, а не через, например, dialog\n\t\t\t\t */\n\n\t\t\t\t/**\n\t\t\t\t * Такая же оптимизация применяется к фонам и анимированию персонажей, и `preload`.\n\t\t\t\t * Если фон изменится, то нет смысла устанавливать или предзагружать текущий\n\t\t\t\t */\n\t\t\t\tconst notLatest = next(i).some(([_action]) => action === _action);\n\n\t\t\t\tif (notLatest) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else {\n\t\t\t\tmatch(action, meta);\n\t\t\t}\n\t\t}\n\n\t\t(restoring = goingBack = false), render();\n\t};\n\n\tconst refer = (path = stack.value[0]) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false) => {\n\t\tif (interacted > 1 && !force && askBeforeExit) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = stack.value;\n\n\t\tstack.clear();\n\t\trenderer.ui.showScreen('mainmenu');\n\t\trenderer.audio.destroy();\n\n\t\t/**\n\t\t * First two save elements and it's type\n\t\t */\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\t$.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\n\tconst back = () => {\n\t\treturn stack.back(), restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | Languages) => {\n\t\treturn translation[lang as Languages].internal[key];\n\t};\n\n\tconst renderer = createRenderer({\n\t\tcharacters,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tstack,\n\t\tlanguages,\n\t\t$,\n\t\t$$,\n\t});\n\n\trenderer.ui.start();\n\n\tconst match = matchAction({\n\t\twait([time]) {\n\t\t\tif (!restoring) setTimeout(push, isFunction(time) ? time() : time);\n\t\t},\n\t\tshowBackground([background]) {\n\t\t\trenderer.background(background);\n\t\t\tpush();\n\t\t},\n\t\tplayMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music', true).play();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound([source, loop]) {\n\t\t\trenderer.audio.music(source, 'sound', loop || false).play();\n\t\t\tpush();\n\t\t},\n\t\tstopSound([source]) {\n\t\t\trenderer.audio.music(source, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice([source]) {\n\t\t\trenderer.audio.voice(source);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice() {\n\t\t\trenderer.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter([character, emotion, className, style]) {\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`)\n\t\t\t}\n\n\t\t\tconst handle = renderer.character(character);\n\n\t\t\thandle.append(className, style, restoring);\n\t\t\thandle.withEmotion(emotion)();\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter([character, className, style, duration]) {\n\t\t\trenderer.character(character).remove(className, style, duration)(push, restoring);\n\t\t},\n\t\tdialog([character, content, emotion]) {\n\t\t\t/**\n\t\t\t * Person name\n\t\t\t */\n\t\t\tconst name = (() => {\n\t\t\t\tconst c = character;\n\t\t\t\tconst cs = characters;\n\t\t\t\tconst lang = $.get().meta[0];\n\n\t\t\t\tif (c && c in cs) {\n\t\t\t\t\tconst block = cs[c].name;\n\n\t\t\t\t\tif (typeof block === 'string') {\n\t\t\t\t\t\treturn block;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (lang in block) {\n\t\t\t\t\t\treturn block[lang as Languages];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn c || '';\n\t\t\t})();\n\n\t\t\tconst run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);\n\n\t\t\trun(forward, goingBack);\n\t\t},\n\t\tfunction([fn]) {\n\t\t\tconst result = fn(restoring, goingBack);\n\n\t\t\tif (!restoring) result ? result.then(push) : push();\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice([question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Первый элемент может быть как строкой, так и элементов выбора\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as [Unwrappable<Languages>, ValidAction[], () => boolean]);\n\t\t\t\t/**\n\t\t\t\t * Значит, текст не требуется\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst unwrapped = choices.map(([content, action, visible]) => {\n\t\t\t\tif (DEV && action.length === 0 && (!visible || visible())) {\n\t\t\t\t\tconsole.warn(`Choice children should not be empty, either add content there or make item not selectable`)\n\t\t\t\t}\n\n\t\t\t\treturn [unwrap(content), action, visible] as [string, ValidAction[], () => boolean];\n\t\t\t});\n\n\t\t\tif (DEV && unwrapped.length === 0) {\n\t\t\t\tthrow new Error(`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`)\n\t\t\t}\n\n\t\t\tconst run = renderer.choices(unwrap(question), unwrapped);\n\n\t\t\trun((selected) => {\n\t\t\t\tenmemory();\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !unwrapped[selected + offset]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable')\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender();\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tmatch('clear', []);\n\t\t},\n\t\tclear([keep, characters]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\trenderer.clear(goingBack, keep || EMPTY_SET, characters || EMPTY_SET)(push);\n\n\t\t\trenderer.audio.clear();\n\t\t},\n\t\tcondition([condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tconst val = String(condition());\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\t/**\n\t\t\t * Clear the Scene\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * No-op used there because using push will make an infinite loop\n\t\t\t */\n\t\t\trenderer.clear(goingBack, EMPTY_SET, EMPTY_SET)(noop);\n\n\t\t\t/**\n\t\t\t * Go to the main menu\n\t\t\t */\n\t\t\trenderer.ui.showScreen('mainmenu');\n\t\t\t/**\n\t\t\t * Reset interactive value\n\t\t\t */\n\t\t\tinteractivity(false);\n\t\t\t/**\n\t\t\t * Reset session times\n\t\t\t */\n\t\t\ttimes.clear();\n\t\t},\n\t\tinput([question, onInput, setup]) {\n\t\t\trenderer.input(unwrap(question), onInput, setup)(forward);\n\t\t},\n\t\tcustom([handler]) {\n\t\t\tconst result = renderer.custom(handler, goingBack, () => {\n\t\t\t\tif (!restoring && handler.requireUserAction) enmemory(), interactivity(true);\n\t\t\t\tif (!restoring) push();\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate(pattern) {\n\t\t\trenderer.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext() {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter([character, timeout, ...classes]) {\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]')\n\t\t\t}\n\n\t\t\tif (DEV && (timeout <= 0 || !Number.isFinite(timeout) || Number.isNaN(timeout))) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter with unacceptable timeout. It should be finite and greater than zero')\n\t\t\t}\n\n\t\t\tconst handler: CustomHandler = (get) => {\n\t\t\t\tconst { clear } = get('@@internal-animate-character', false);\n\t\t\t\tconst char = renderer.store.characters[character];\n\n\t\t\t\t/**\n\t\t\t\t * Character is not defined, maybe, `animateCharacter` was called before `showCharacter` OR character was not just loaded yet\n\t\t\t\t */\n\n\t\t\t\tif (!char) return;\n\n\t\t\t\tconst target = char.canvas;\n\n\t\t\t\t/**\n\t\t\t\t * Character is not found\n\t\t\t\t */\n\t\t\t\tif (!target) return;\n\n\t\t\t\tconst classNames = classes.filter((className) => !target.classList.contains(className));\n\n\t\t\t\ttarget.classList.add(...classNames);\n\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\t\t\t\t}, timeout);\n\n\t\t\t\tclear(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Clear timeout, because when you will game re-runs some callback might remove classes from character\n\t\t\t\t\t */\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * `callOnlyLatest` property will not have any effect, because `custom` is called directly\n\t\t\t */\n\t\t\tmatch('custom', [handler]);\n\t\t},\n\t\ttext(text) {\n\t\t\tconst string = text.map((content) => unwrap(content)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`)\n\t\t\t}\n\n\t\t\trenderer.text(string, forward, goingBack);\n\t\t},\n\t\texit() {\n\t\t\tif (restoring) return;\n\n\t\t\tconst path = stack.value[0];\n\t\t\tconst last = path.at(-1);\n\t\t\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\t\t\t/**\n\t\t\t * - should be an array\n\t\t\t * - first element is action name\n\t\t\t */\n\t\t\tif (!isAction(refer(path))) {\n\t\t\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\t\t\tlast[1]--;\n\t\t\t\t} else {\n\t\t\t\t\tpath.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isExitImpossible(path)) {\n\t\t\t\tconst referred = refer(path);\n\n\t\t\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\t\t\tmatch('end', []);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let i = path.length - 1; i > 0; i--) {\n\t\t\t\tconst [name] = path[i];\n\n\t\t\t\t/**\n\t\t\t\t * Remember already exited paths\n\t\t\t\t */\n\t\t\t\tif (isBlockExitStatement(name)) {\n\t\t\t\t\tignore.push(name);\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Ignore everything that we do not need there\n\t\t\t\t */\n\t\t\t\tif (!isBlockStatement(name)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * When we found an already exited path we remove it from the list\n\t\t\t\t */\n\t\t\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\t\t\tignore.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Exit from the path\n\t\t\t\t */\n\t\t\t\tpath.push([`${name}:exit`]);\n\n\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t\t\t/**\n\t\t\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t\t\t */\n\t\t\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t\t\t/**\n\t\t\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t\t\t *\n\t\t\t\t * - remove that item\n\t\t\t\t * - close another block\n\t\t\t\t */\n\t\t\t\tif (!isAction(refer(path))) {\n\t\t\t\t\tpath.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\trender();\n\t\t},\n\t\tpreload([source]) {\n\t\t\tif (!goingBack && !restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Make image load\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t});\n\n\tconst enmemory = () => {\n\t\tif (restoring) return;\n\n\t\tconst current = klona(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave(true, 'auto');\n\t};\n\n\tconst next = () => {\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Last path element\n\t\t */\n\t\tconst last = path.at(-1);\n\n\t\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\t\tlast[1]++;\n\t\t} else {\n\t\t\tpath.push([null, 0]);\n\t\t}\n\t};\n\n\tconst render = () => {\n\t\tconst referred = refer();\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props);\n\t\t} else {\n\t\t\tmatch('exit', []);\n\t\t}\n\t};\n\n\tconst push = () => {\n\t\tif (!restoring) next(), render();\n\t};\n\n\tconst forward = () => {\n\t\tenmemory();\n\t\tpush();\n\t\tinteractivity(true);\n\t};\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Unwraps translatable content to string\n\t *\n\t * @example ```\n\t * unwrap({ en: 'Hello', ru: 'Привет' });\n\t * unwrap({ en: () => data().ad_viewed ? 'Diamond Hat' : 'Diamond Hat (Watch Adv)' })\n\t * unwrap(() => `Today is ${new Date()}`)\n\t * unwrap('Hello, {{name}}');\n\t * ```\n\t */\n\tconst unwrap = (content: Unwrappable<Languages>, global = false) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = $.get();\n\n\t\tconst obj = global ? data : state();\n\t\tconst cnt = isFunction(content)\n\t\t\t? content()\n\t\t\t: typeof content === 'string'\n\t\t\t ? content\n\t\t\t : content[lang as Languages];\n\n\t\tconst str = isFunction(cnt) ? cnt() : cnt;\n\n\t\tconst trans = translation[lang as Languages];\n\n\t\tif (trans.actions || trans.plural) {\n\t\t\t/**\n\t\t\t * Should kinda work, but creating PluralRules each time is not really efficient\n\t\t\t */\n\t\t\treturn replaceT9N(str, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));\n\t\t}\n\n\t\treturn replaceT9N(str, obj);\n\t};\n\n\tfunction data(value: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): void;\n\tfunction data(): DataScheme;\n\tfunction data(value?: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): DataScheme | void {\n\t\tif (!value) return $.get().data as DataScheme | void;\n\n\t\tconst prev = $.get().data;\n\t\tconst val = isFunction(value) ? value(prev as DataScheme) : deepmerge(prev, value);\n\n\t\t$.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Function to get actions\n\t\t */\n\t\taction,\n\t\t/**\n\t\t * State that belongs to games\n\t\t */\n\t\tstate,\n\t\t/**\n\t\t * Unlike `state`, stored at global scope instead and shared between games\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Unwraps translatable content to a string value\n\t\t */\n\t\tunwrap(content: Exclude<Unwrappable<Languages>, Record<string, string>> | Record<Languages, string>) {\n\t\t\treturn unwrap(content, true);\n\t\t},\n\t};\n};\n\nexport { novely };\n","export const BROWSER = false;\nexport const DEV = false;\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость Текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи'\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume'\n};\n\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'Жаңа ойын',\n\tHomeScreen: 'Негізгі экран',\n\tToTheGame: 'Ойынға',\n\tLanguage: 'Тіл',\n\tNoSaves: 'Сақтау жоқ',\n\tLoadSave: 'Жүктеу',\n\tSaves: 'Сақтау',\n\tSettings: 'Параметрлер',\n\tSumbit: 'Растау',\n\tGoBack: 'Артқа',\n\tDoSave: 'Сақтау',\n\tAuto: 'Авто',\n\tStop: 'Тоқта',\n\tExit: 'Шығу',\n\tAutomatic: 'Автоматты',\n\tManual: 'Қолмен',\n\tRemove: 'Жою',\n\tLoadASaveFrom: 'Сақтауды жүктеу',\n\tDeleteASaveFrom: 'Сақтауды жою',\n\tTextSpeed: 'Мәтін Жылдамдығы',\n\tTextSpeedSlow: 'Баяу',\n\tTextSpeedMedium: 'Орташа',\n\tTextSpeedFast: 'Жылдам',\n\tTextSpeedAuto: 'Автоматты',\n\tCompleteText: 'Мәтінді аяқтау',\n\tGoForward: 'Алға жылжу',\n\tExitDialogWarning: 'Сіз шыққыңыз келетініне сенімдісіз бе? Прогресс сақталады',\n\tExitDialogExit: 'Шығу',\n\tExitDialogBack: 'Ойынға оралу',\n\tOpenMenu: 'Мәзірді ашыңыз',\n\tCloseMenu: 'Мәзірді жабу',\n\tMusicVolume: 'Музыканың көлемі',\n\tSoundVolume: 'Дыбыстардың көлемі',\n\tVoiceVolume: 'Сөйлеу көлемі'\n};\n\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\n\tNewGame: '「新しいゲーム」',\n\tHomeScreen: 'ホーム画面',\n\tToTheGame: '「ゲームに戻る」',\n\tLanguage: '言語',\n\tNoSaves: 'ノーセーブ',\n\tLoadSave: 'ダウンロード',\n\tSaves: '保存',\n\tSettings: '設定',\n\tSumbit: '確認',\n\tGoBack: '「戻る」',\n\tDoSave: '保存',\n\tAuto: 'オート',\n\tStop: '止まれ',\n\tExit: '出口',\n\tAutomatic: '自動',\n\tManual: 'マニュアル',\n\tRemove: '削除',\n\tLoadASaveFrom: 'ロードセーブから',\n\tDeleteASaveFrom: 'から保存を削除',\n\tTextSpeed: 'テキストスピード',\n\tTextSpeedSlow: '「遅い」',\n\tTextSpeedMedium: 'ミディアム',\n\tTextSpeedFast: '「速い」',\n\tTextSpeedAuto: '自動',\n\tCompleteText: 'テキストを完成させる',\n\tGoForward: '先に行く',\n\tExitDialogWarning: '本当に終了しますか?進行状況は保存されます',\n\tExitDialogExit: '終了',\n\tExitDialogBack: 'ゲームに戻る',\n\tOpenMenu: 'メニューを開く',\n\tCloseMenu: 'メニューを閉じる',\n\tMusicVolume: '音楽のボリューム',\n\tSoundVolume: '音量',\n\tVoiceVolume: 'スピーチの量'\n};\n\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,UAAM,OAAN,MAAW;AAAA;AAAA;AAAA,QAIV,YAAY,OAAO;AAClB,eAAK,QAAQ;AAGb,eAAK,OAAO;AAAA,QACb;AAAA,MACD;AAEA,UAAM,QAAN,MAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QAMX,cAAc;AACb,eAAK,MAAM;AAAA,QACZ;AAAA,QAEA,QAAQ,OAAO;AACd,gBAAM,OAAO,IAAI,KAAK,KAAK;AAE3B,cAAI,KAAK,OAAO;AACf,iBAAK,MAAM,OAAO;AAClB,iBAAK,QAAQ;AAAA,UACd,OAAO;AACN,iBAAK,QAAQ;AACb,iBAAK,QAAQ;AAAA,UACd;AAEA,eAAK;AAAA,QACN;AAAA,QAEA,UAAU;AACT,gBAAM,UAAU,KAAK;AACrB,cAAI,CAAC,SAAS;AACb;AAAA,UACD;AAEA,eAAK,QAAQ,KAAK,MAAM;AACxB,eAAK;AACL,iBAAO,QAAQ;AAAA,QAChB;AAAA,QAEA,QAAQ;AACP,eAAK,QAAQ;AACb,eAAK,QAAQ;AACb,eAAK,QAAQ;AAAA,QACd;AAAA,QAEA,IAAI,OAAO;AACV,iBAAO,KAAK;AAAA,QACb;AAAA,QAEA,EAAG,OAAO,QAAQ,IAAI;AACrB,cAAI,UAAU,KAAK;AAEnB,iBAAO,SAAS;AACf,kBAAM,QAAQ;AACd,sBAAU,QAAQ;AAAA,UACnB;AAAA,QACD;AAAA,MACD;AAEA,aAAO,UAAU;AAAA;AAAA;;;ACnEjB;AAAA;AAAA;AACA,UAAM,QAAQ;AAEd,UAAMA,UAAS,iBAAe;AAC7B,YAAI,GAAG,OAAO,UAAU,WAAW,KAAK,gBAAgB,aAAa,cAAc,IAAI;AACtF,gBAAM,IAAI,UAAU,qDAAqD;AAAA,QAC1E;AAEA,cAAM,QAAQ,IAAI,MAAM;AACxB,YAAI,cAAc;AAElB,cAAM,OAAO,MAAM;AAClB;AAEA,cAAI,MAAM,OAAO,GAAG;AACnB,kBAAM,QAAQ,EAAE;AAAA,UACjB;AAAA,QACD;AAEA,cAAM,MAAM,OAAO,IAAI,YAAY,SAAS;AAC3C;AAEA,gBAAM,UAAU,YAAY,GAAG,GAAG,IAAI,GAAG;AAEzC,kBAAQ,MAAM;AAEd,cAAI;AACH,kBAAM;AAAA,UACP,QAAQ;AAAA,UAAC;AAET,eAAK;AAAA,QACN;AAEA,cAAM,UAAU,CAAC,IAAI,YAAY,SAAS;AACzC,gBAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC;AAElD,WAAC,YAAY;AAKZ,kBAAM,QAAQ,QAAQ;AAEtB,gBAAI,cAAc,eAAe,MAAM,OAAO,GAAG;AAChD,oBAAM,QAAQ,EAAE;AAAA,YACjB;AAAA,UACD,GAAG;AAAA,QACJ;AAEA,cAAM,YAAY,CAAC,OAAO,SAAS,IAAI,QAAQ,aAAW;AACzD,kBAAQ,IAAI,SAAS,GAAG,IAAI;AAAA,QAC7B,CAAC;AAED,eAAO,iBAAiB,WAAW;AAAA,UAClC,aAAa;AAAA,YACZ,KAAK,MAAM;AAAA,UACZ;AAAA,UACA,cAAc;AAAA,YACb,KAAK,MAAM,MAAM;AAAA,UAClB;AAAA,UACA,YAAY;AAAA,YACX,OAAO,MAAM;AACZ,oBAAM,MAAM;AAAA,YACb;AAAA,UACD;AAAA,QACD,CAAC;AAED,eAAO;AAAA,MACR;AAEA,aAAO,UAAUA;AAAA;AAAA;;;ACtEjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,MAAM,yBAAyB,oBAAI,IAAI,CAAC,UAAU,UAAU,SAAS,WAAW,MAAM,CAAU;AAEhG,MAAM,wBAAwB,oBAAI,IAAI,CAAC,eAAe,kBAAkB,YAAY,CAAU;AAE9F,MAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,aAAa,OAAO,CAAU;AAE1E,MAAM,YAAY,oBAAI,IAAS;AAE/B,MAAM,2BAA4C;;;ACKlD,MAAM,cAAc,CAAmC,WAAc;AACpE,WAAO,CAAC,QAA8B,UAAe;AACpD,aAAO,OAAO,MAAM,EAAE,KAAK;AAAA,IAC5B;AAAA,EACD;AAEA,MAAM,WAAW,CAAC,QAAgC;AACjD,WAAO,OAAO,QAAQ;AAAA,EACvB;AAEA,MAAM,SAAS,CAAC,QAA8B;AAC7C,WAAO,QAAQ;AAAA,EAChB;AAEA,MAAM,WAAW,CAAC,QAAgC;AACjD,WAAO,OAAO,QAAQ;AAAA,EACvB;AAEA,MAAM,aAAa,CAAC,QAAuD;AAC1E,WAAO,OAAO,QAAQ;AAAA,EACvB;AAEA,MAAM,YAAY,CAAC,QAAsC;AACxD,WAAO,QAAQ,GAAG,MAAM,OAAO,QAAQ,YAAY,WAAW,GAAG,MAAM,WAAY,IAAY,IAAI;AAAA,EACpG;AAEA,MAAM,UAAU,CAAC,QAAoD;AACpE,WAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,GAAG,KAAK,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,EAC/E;AAEA,MAAM,aAAa,CAACC,SAAgB;AACnC,UAAM,aAAa,OAAO,UAAU,WAAW,KAAKA,IAAG;AAEvD,WAAO,WAAW,MAAM,KAAK,WAAW,GAAG,KAAK,WAAW,GAAG,KAAK,WAAW,MAAM;AAAA,EACrF;AAEA,MAAM,MAAM;AAEZ,MAAM,uBAAuB,CAC5B,QACA,SACI;AACJ,WAAO,WAAW,YAAY,KAAK,CAAC,KAAM,KAAK,CAAC,EAA+B;AAAA,EAChF;AAEA,MAAM,cAAc,CAAC,cAAwB;AAC5C,QAAI,EAAE,SAAS,IAAI;AAEnB,QAAI,UAAU,SAAS,QAAQ,GAAG;AACjC,aAAO;AAAA,IACR,WAAW,UAAU,SAAU,WAAW,SAAS,MAAM,GAAG,CAAC,CAAE,GAAG;AACjE,aAAO;AAAA,IACR,WAAY,WAAW,UAAU,KAAK,CAAC,UAAU,UAAU,UAAU,SAAS,KAAK,CAAC,GAAK;AACxF,aAAO;AAAA,IACR;AAKA,WAAO,UAAU,CAAC;AAAA,EACnB;AAMA,MAAM,WAAW,CAAqC,IAAQ,OAAe;AAC5E,QAAI,YAAY,OACf,WACA;AAED,aAAS,WAAsB,MAAa;AAC3C,UAAI,WAAW;AACd,oBAAY;AAEZ,oBAAY;AACZ;AAAA,MACD;AAEA,SAAG,MAAM,MAAM,IAAwB;AAEvC,kBAAY;AAEZ,iBAAW,WAAY;AACtB,oBAAY;AAEZ,YAAI,WAAW;AACd,kBAAQ,MAAM,WAAW,SAAS;AAClC,sBAAY,YAAY;AAAA,QACzB;AAAA,MACD,GAAG,EAAE;AAAA,IACN;AAEA,WAAO;AAAA,EACR;AAEA,MAAM,gBAAgB,CAAI,OAAY,OAAuC;AAC5E,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAI,GAAG,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,GAAG;AAC/B,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAsBA,MAAM,0BAA0B,MAAgB;AAC/C,UAAM,SAAS;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MAER,SAAS;AAAA,MAET,QAAQ;AAAA,IACT;AAEA,UAAM,OAAO,MAAM;AAClB,YAAM,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW;AAChD,eAAO,SAAS;AAChB,eAAO,UAAU,CAAC,UAAU;AAC3B,kBAAQ,EAAE,WAAW,OAAO,MAAM,CAAC;AAAA,QACpC;AAEA,eAAO,SAAS,MAAM;AACrB,kBAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxC,eAAK;AAAA,QACN;AAAA,MACD,CAAC;AAGD,aAAO,UAAU;AAAA,IAClB;AAEA,WAAO,KAAK,GAAG;AAAA,EAChB;AAEA,MAAM,mCAAmC,CAAC,MAAY,SAAsB;AAC3E,UAAM,QAAQ,cAAc,MAAM,CAAC,CAAC,OAAO,MAAM,GAAG,SAAS;AAC5D,aAAO,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM;AAAA,IACzE,CAAC;AAED,WAAO,KAAK,KAAK;AAAA,EAClB;AAEA,MAAM,mBAAmB,CAAC,cAAsE;AAC/F,WAAO,iBAAiB,IAAI,SAAgB;AAAA,EAC7C;AAEA,MAAM,uBAAuB,CAC5B,cACkE;AAClE,WAAO,sBAAsB,IAAI,SAAgB;AAAA,EAClD;AAEA,MAAM,yBAAyB,CAAC,SAA8E;AAC7G,WAAO,uBAAuB,IAAI,IAAW;AAAA,EAC9C;AAEA,MAAM,OAAO,MAAM;AAAA,EAAC;AAEpB,MAAM,WAAW,CAChB,YAII;AACJ,WAAO,MAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,EACrD;AAKA,MAAM,eAAe,CAAC,UAAiB;AACtC,UAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAC5D,YAAM,OAAO,CAAC,SAAyD;AACtE,eAAO,KAAK,QAAQ,CAAC,SAAS;AAC7B,gBAAM,OAAO,KAAK,CAAC;AAKnB,cAAI,MAAM,QAAQ,IAAI;AAAG,mBAAO,KAAK,IAAqB;AAE1D,iBAAO,CAAC,IAAmB;AAAA,QAC5B,CAAC;AAAA,MACF;AAEA,aAAO,CAAC,MAAM,KAAK,KAAK,CAAC;AAAA,IAC1B,CAAC;AAED,WAAO,OAAO,YAAY,OAAO;AAAA,EAClC;AAiBA,MAAM,mBAAmB,CAAC,SAAe;AACxC,UAAM,kBAAkB,KAAK,OAAO,CAAC,CAAC,IAAI,MAAM,iBAAiB,IAAI,CAAC;AACtE,UAAM,sBAAsB,KAAK,OAAO,CAAC,CAAC,IAAI,MAAM,qBAAqB,IAAI,CAAC;AAK9E,QAAI,gBAAgB,WAAW,KAAK,oBAAoB,WAAW,GAAG;AACrE,aAAO;AAAA,IACR;AAKA,QAAI,gBAAgB,SAAS,oBAAoB,QAAQ;AACxD,aAAO;AAAA,IACR;AAEA,aAAS,IAAI,GAAG,KAAK,IAAI,gBAAgB,QAAQ;AAChD,YAAM,IAAI,gBAAgB,CAAC,EAAE,CAAC;AAC9B,YAAM,KAAK,oBAAoB,CAAC,EAAE,CAAC;AAEnC,UAAI,CAAC,KAAK,CAAC;AAAI,eAAO;AACtB,UAAI,CAAC,GAAG,WAAW,CAAC;AAAG,eAAO;AAAA,IAC/B;AAEA,WAAO;AAAA,EACR;;;AC9QA,MAAM,mBAAmB,oBAAI,IAAY;;;ACMzC,MAAM,QAAQ,CAAI,SAAY,cAAc,oBAAI,IAAwB,MAAiB;AACxF,UAAM,YAAY,CAAC,OAA2B;AAC7C,kBAAY,IAAI,EAAE,GAAG,GAAG,OAAO;AAE/B,aAAO,MAAM;AACZ,oBAAY,OAAO,EAAE;AAAA,MACtB;AAAA,IACD;AAEA,UAAM,OAAO,CAAC,UAAa;AAC1B,iBAAW,MAAM;AAAa,WAAG,KAAK;AAAA,IACvC;AAEA,UAAM,SAAS,CAAC,OAAuB;AACtC,WAAM,UAAU,GAAG,OAAO,CAAE;AAAA,IAC7B;AAEA,UAAM,MAAM,MAAM;AACjB,aAAO;AAAA,IACR;AAEA,WAAO,EAAE,WAAW,QAAQ,IAAI;AAAA,EACjC;;;AC5BA,MAAM,EAAE,QAAQ,IAAI;AACpB,MAAM,EAAE,gBAAgB,sBAAsB,sBAAsB,IAAI;AAExE,MAAM,qBAAqB,CAAgE,QAAW,aAAuD;AAC5J,QAAI;AACH,aAAO,YAAY;IACpB,QAAQ;AACP,aAAO;IACR;EACD;AAEA,MAAM,mBAAmB,CAAC,QAAsC,QAAqB;AACpF,WAAO,mBAAmB,QAAQ,GAAG,KACjC,EAAE,eAAe,KAAK,QAAQ,GAAG,KAChC,qBAAqB,KAAK,QAAQ,GAAG;EAC3C;AAEA,MAAM,kCAAkC,CAAC,WAAyC;AAChF,QAAI,CAAC;AAAuB,aAAO,CAAC;AAEpC,WAAO,sBAAsB,MAAM,EAAE,OAAO,CAAA,WAAU,qBAAqB,KAAK,QAAQ,MAAM,CAAC;EACjG;AAEA,MAAM,OAAO,CAAyC,WAA2B;AAC/E,WAAO,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,gCAAgC,MAAM,CAAC;EAC5E;AAEA,MAAM,oBAAoB,CAAC,UAA0D;AACnF,WAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAE,CAAC,UAAU,MAAM,EAAE,SAAS,OAAO,UAAU,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;EACjI;AC3BA,MAAM,QAAQ,CAAuD,UAAgB;AACnF,WAAQ,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC;EACjC;AAEA,MAAM,QAAQ,CAAI,UAAgB;AAChC,WAAO,kBAAkB,KAAK,IAC1B,UAAU,MAAM,KAAK,GAAG,KAAK,IAC7B;EACN;AAEA,MAAM,aAAa,CAAI,QAAa,WAAgB;AAClD,UAAM,cAAc,OAAO,MAAM;AAEjC,WAAO,QAAQ,CAAC,MAAM,UAAU;AAC9B,UAAI,OAAO,YAAY,KAAK,MAAM,aAAa;AAC7C,oBAAY,KAAK,IAAI,MAAM,IAAI;MACjC,WAAW,kBAAkB,IAAI,GAAG;AAClC,oBAAY,KAAK,IAAI,UAAU,OAAO,KAAK,GAAU,IAAW;MAClE,WAAW,OAAO,QAAQ,IAAI,MAAM,IAAI;AACtC,oBAAY,KAAK,IAAI;MACvB;IACF,CAAC;AAED,WAAO;EACT;AAEA,MAAM,cAAc,CAAyC,QAAW,WAAiB;AACvF,UAAM,cAAwC,CAAC;AAE/C,eAAW,OAAO,KAAK,MAAM,GAAG;AAC9B,kBAAY,GAAG,IAAI,MAAM,OAAO,GAAG,CAAC;IACtC;AAEA,eAAW,OAAO,KAAK,MAAM,GAAG;AAC9B,UAAI,iBAAiB,QAAQ,GAAG,GAAG;AACjC;MACF;AAEA,UAAI,mBAAmB,QAAQ,GAAG,KAAK,kBAAkB,OAAO,GAAG,CAAC,GAAG;AACrE,oBAAY,GAAG,IAAI,UAAU,OAAO,GAAG,GAAU,OAAO,GAAG,CAAQ;MACrE,OAAO;AACL,oBAAY,GAAG,IAAI,MAAM,OAAO,GAAG,CAAC;MACtC;IACF;AAEA,WAAO;EACT;AAEA,MAAM,YAAY,CAAuD,QAAW,WAAiB;AACnG,QAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,GAAG;AACtC,YAAM,SAAS,WAAW,QAAQ,MAAM;AAExC,aAAO;IACT,WAAW,CAAC,QAAQ,MAAM,KAAK,CAAC,QAAQ,MAAM,GAAG;AAC/C,YAAM,SAAS,YAAY,QAAQ,MAAM;AAEzC,aAAO;IACT,OAAO;AACL,aAAO,MAAM,MAAM;IACrB;EACF;;;AC9DO,WAAS,MAAM,KAAK;AAC1B,QAAI,GAAG,KAAK;AAEZ,QAAI,MAAM,QAAQ,GAAG,GAAG;AACvB,YAAM,MAAM,IAAE,IAAI,MAAM;AACxB,aAAO;AAAK,YAAI,CAAC,KAAK,MAAI,IAAI,CAAC,MAAM,OAAO,QAAQ,WAAW,MAAM,GAAG,IAAI;AAC5E,aAAO;AAAA,IACR;AAEA,QAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,mBAAmB;AAC9D,YAAM,CAAC;AACP,WAAK,KAAK,KAAK;AACd,YAAI,MAAM,aAAa;AACtB,iBAAO,eAAe,KAAK,GAAG;AAAA,YAC7B,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,YACnB,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,UAAU;AAAA,UACX,CAAC;AAAA,QACF,OAAO;AACN,cAAI,CAAC,KAAK,MAAI,IAAI,CAAC,MAAM,OAAO,QAAQ,WAAW,MAAM,GAAG,IAAI;AAAA,QACjE;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;;;ACtBA,MAAM,MAAM;AAEZ,MAAM,QAAQ,CAAC,OAAe,eAAyB;AACtD,UAAM,SAAiC,CAAC;AAExC,eAAW,aAAa,YAAY;AACnC,UAAI,CAAC;AAAO;AAEZ,YAAM,CAAC,OAAO,GAAG,IAAI,MAAM,MAAM,WAAW,CAAC;AAE7C,aAAO,KAAK,KAAK;AACjB,cAAQ;AAAA,IACT;AAEA,WAAO,KAAK,KAAK;AAEjB,WAAO;AAAA,EACR;AAMA,MAAM,SAAS,CAAC,MAA8B;AAC7C,QAAI,MAAM,QAAQ,CAAC,GAAG;AACrB,aAAO,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM;AAAA,IACjD;AAEA,QAAI,OAAO,MAAM,YAAY;AAC5B,aAAO,OAAO,EAAE,CAAC;AAAA,IAClB;AAEA,WAAO;AAAA,EACR;AAEA,MAAM,UAAU,CACfC,MACA,KACA,eACA,SACA,OACI;AACJ,WAAO,OAAOA,IAAG,EAAE,WAAW,KAAK,CAAC,GAAQ,KAAa,MAAW;AACnE,UAAI;AACJ,UAAI;AAEJ,YAAM,CAAC,SAAS,QAAQ,MAAM,IAAI,MAAM,IAAI,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC;AAE9D,UAAI,CAAC,SAAS;AACb,eAAO;AAAA,MACR;AAEA,YAAM,OAAO,QAAQ,MAAM,GAAG;AAE9B,aAAO,KAAK,IAAI,KAAK;AAAQ,YAAI,EAAE,KAAK,GAAG,CAAC;AAE5C,UAAI,UAAU,iBAAiB,KAAK,IAAI;AACvC,YAAI,cAAc,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AAAA,MACvC;AAEA,YAAM,gBAAgB,WAAW,UAAU,QAAQ,MAAM;AAEzD,UAAI;AAAe,YAAI,cAAc,CAAC;AAEtC,aAAO,KAAK,OAAO,KAAK;AAAA,IACzB,CAAC;AAAA,EACF;;;AC5DA,MAAM,sBAAsB,CAAC,YAAkD;AAC9E,WAAO;AAAA,MACN,MAAM,MAAM;AACX,cAAM,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE;AAEjD,YAAI;AACH,gBAAM,QAAQ,aAAa,QAAQ,QAAQ,GAAG;AAE9C,iBAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,QACpC,QAAQ;AACP,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,MAAM,IAAI,MAAM;AACf,YAAI;AACH,uBAAa,QAAQ,QAAQ,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,QACvD,QAAQ;AAAA,QAAC;AAAA,MACV;AAAA,IACD;AAAA,EACD;;;ACwBA,uBAAmB;;;ACrDZ,MAAM,MAAM;;;AD0JnB,MAAM,SAAS,CAKb;AAAA,IACD;AAAA,IACA,UAAU,oBAAoB,EAAE,KAAK,sBAAsB,CAAC;AAAA,IAC5D,eAAe,QAAQ,QAAQ;AAAA,IAC/B,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,kBAAkB;AAAA,IAClB,aAAAC,eAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EACjB,MAAkE;AACjE,UAAM,kBAAc,eAAAC,SAAO,CAAC;AAE5B,UAAM,QAAe,CAAC;AAEtB,UAAM,QAAQ,oBAAI,IAAY;AAE9B,UAAM,oBAAoB,oBAAI,IAAY;AAC1C,UAAM,eAAe,wBAAwB;AAE7C,UAAM,aAAa,wBAAwB;AAE3C,QAAI,eAAe;AAKnB,oBAAgB,CAAC;AACjB,qBAAiB,CAAC;AAKlB,UAAM,SAAS,CAAC,UAAkB;AACjC,aAAO,MAAM,IAAI,KAAK,GAAG;AAAA,IAC1B;AAEA,UAAM,aAAa,OAAO,SAAgB;AACzC,aAAO,OAAO,OAAO,aAAa,IAAI,CAAC;AAEvC,UAAI,kBAAkB,cAAc,kBAAkB,OAAO,GAAG;AAC/D,iBAAS,GAAG,WAAW,SAAS;AAEhC,cAAM,SAAS,KAAK,sBAAsB,iBAAiB;AAAA,MAC5D;AAEA,YAAM,SAAS,SAAS,GAAG,UAAU;AACrC,YAAM,aAAc,eAAe,SAAS;AAE5C,wBAAkB,MAAM;AACxB,mBAAa,QAAQ;AAErB,UAAI,eAAe,QAAQ;AAC1B,cAAM,aAAa;AACnB,cAAM,WAAW;AAEjB,YAAI,CAAC,cAAc;AAClB,kBAAQ;AAAA,QACT;AAAA,MACD,OAAO;AACN,iBAAS,GAAG,WAAW,UAAU;AAAA,MAClC;AAEA,qBAAe;AAAA,IAChB;AAmBA,UAAM,SAAS,CAAC,SAAgB;AAC/B,aAAO,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,IAC1C;AAEA,UAAM,SAAS,IAAI,MAAM,CAAC,GAAiD;AAAA,MAC1E,IAAI,GAAG,MAAM;AACZ,eAAO,IAAI,UAAgC;AAC1C,cAAI,kBAAkB,YAAY;AAIjC,gBAAI,SAAS,oBAAoB,OAAO,MAAM,CAAC,MAAM,YAAY,WAAW,MAAM,CAAC,CAAC,GAAG;AACtF,gCAAkB,IAAI,MAAM,CAAC,CAAC;AAAA,YAC/B;AAKA,gBAAI,SAAS,mBAAmB,OAAO,MAAM,CAAC,MAAM,YAAY,OAAO,MAAM,CAAC,MAAM,UAAU;AAC7F,oBAAM,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,CAAC;AAErD,kBAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,2BAAW,SAAS,QAAQ;AAC3B,oCAAkB,IAAI,KAAK;AAAA,gBAC5B;AAAA,cACD,OAAO;AACN,kCAAkB,IAAI,MAAM;AAAA,cAC7B;AAAA,YACD;AAAA,UACD;AAEA,iBAAO,CAAC,MAAM,GAAG,KAAK;AAAA,QACvB;AAAA,MACD;AAAA,IACD,CAAC;AAID,aAAS,MAAM,OAA6F;AAC3G,UAAI,CAAC;AAAO,eAAO,MAAM,MAAM,CAAC;AAEhC,YAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,YAAM,MAAM,WAAW,KAAK,IAAI,MAAM,IAAmB,IAAI,UAAU,MAAM,KAAK;AAElF,YAAM,MAAM,CAAC,IAAI;AAAA,IAClB;AAEA,UAAM,iBAAiB,CAACC,SAAQ,CAAC,MAAM;AACtC,aAAO;AAAA,QACN;AAAA,UACC,CAAC,QAAQ,OAAO;AAAA,UAChB,CAAC,MAAM,CAAC;AAAA,QACT;AAAA,QACAA;AAAA,QACA,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM;AAAA,MAC5B;AAAA,IACD;AAEA,UAAM,cAAc,CAAC,SAAeC,SAAQ,CAAC,OAAO,MAAM;AACzD,aAAO;AAAA,QACN,IAAI,QAAQ;AACX,iBAAOA,OAAM,GAAG,EAAE;AAAA,QACnB;AAAA,QACA,IAAI,MAAM,OAAa;AACtB,UAAAA,OAAMA,OAAM,SAAS,CAAC,IAAI;AAAA,QAC3B;AAAA,QACA,OAAO;AACN,cAAIA,OAAM,SAAS;AAAG,YAAAA,OAAM,IAAI,GAAI,YAAY;AAAA,QACjD;AAAA,QACA,KAAK,OAAa;AACjB,UAAAA,OAAM,KAAK,KAAK;AAAA,QACjB;AAAA,QACA,QAAQ;AACP,UAAAA,SAAQ,CAAC,eAAe,MAAM,YAAY,CAAC,CAAC;AAAA,QAC7C;AAAA,MACD;AAAA,IACD;AAEA,UAAM,+BAA+B,MAAM;AAC1C,aAAOH,aAAY,WAAW,WAAkB;AAAA,IACjD;AAMA,UAAM,cAA2B;AAAA,MAChC,OAAO,CAAC;AAAA,MACR,MAAM,MAAM,WAAW;AAAA,MACvB,MAAM,CAAC,6BAA6B,GAAG,0BAA0B,GAAG,GAAG,CAAC;AAAA,IACzE;AAEA,UAAM,WAAqB;AAAA,MAC1B,YAAY;AAAA,IACb;AAEA,UAAM,IAAI,MAAM,WAAW;AAC3B,UAAM,KAAK,MAAM,QAAQ;AAEzB,UAAM,sBAAsB,CAAC,UAAuB;AACnD,UAAI,GAAG,IAAI,EAAE;AAAY,gBAAQ,IAAI,KAAK;AAAA,IAC3C;AAEA,UAAM,+BAA+B,SAAS,qBAAqB,eAAe;AAClF,UAAM,wCAAwC,SAAS,MAAM;AAC5D,0BAAoB,EAAE,IAAI,CAAC;AAAA,IAC5B,GAAG,EAAE;AAEL,MAAE,UAAU,4BAA4B;AAExC,UAAM,gBAAgB,YAAY;AACjC,UAAI,SAAS,MAAM,QAAQ,IAAI;AAE/B,iBAAW,aAAa,YAAY;AACnC,iBAAS,UAAU,MAAM;AAAA,MAC1B;AAKA,aAAO,KAAK,CAAC,MAAM;AAEnB,UAAI,kBAAkB;AACrB,eAAO,KAAK,CAAC,IAAI,6BAA6B;AAAA,MAC/C,OAAO;AACN,eAAO,KAAK,CAAC,MAAM,6BAA6B;AAAA,MACjD;AAKA,aAAO,KAAK,CAAC,MAAM;AACnB,aAAO,KAAK,CAAC,MAAM;AACnB,aAAO,KAAK,CAAC,MAAM;AAMnB,UAAI,QAAQ,OAAO,IAAI,GAAG;AACzB,eAAO,OAAO;AAAA,MACf;AAKA,SAAG,OAAO,CAAC,UAAW,KAAK,aAAa,MAAO,KAAK;AACpD,iBAAW,QAAQ;AAKnB,QAAE,OAAO,MAAM,MAAM;AAAA,IACtB;AAMA,iBAAa,KAAK,aAAa;AAE/B,UAAM,UAAU,eAAe,MAAM,YAAY,CAAC;AAClD,UAAM,QAAQ,YAAY,OAAO;AAKjC,qBAAiB,oBAAoB,MAAM;AAC1C,UAAI,SAAS,oBAAoB,UAAU;AAC1C,8CAAsC;AAAA,MACvC;AAAA,IACD,CAAC;AAKD,qBAAiB,gBAAgB,qCAAqC;AAEtE,UAAM,OAAO,CAAC,WAAW,OAAO,OAAmB,WAAW,SAAS,aAAa;AACnF,UAAI,CAAC,GAAG,IAAI,EAAE;AAAY;AAK1B,UAAI,CAAC,aAAa,SAAS;AAAQ;AAEnC,YAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,QAAE,OAAO,CAAC,SAAS;AAWlB,cAAM,WAAW,cAAc,KAAK,OAAO,CAAC,UAAU,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,SAAS;AAKtG,gBAAQ,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC;AACjC,gBAAQ,CAAC,EAAE,CAAC,IAAI;AAEhB,YAAI,CAAC,YAAY,CAAC,UAAU;AAC3B,eAAK,MAAM,KAAK,OAAO;AAEvB,iBAAO;AAAA,QACR;AAKA,cAAM,SAAS,KAAK,MAAM,GAAG,EAAE;AAK/B,YAAI,UAAU,OAAO,CAAC,EAAE,CAAC,MAAM,MAAM;AACpC,eAAK,MAAM,KAAK,MAAM,SAAS,CAAC,IAAI;AAAA,QACrC,OAAO;AACN,eAAK,MAAM,KAAK,OAAO;AAAA,QACxB;AAEA,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAEA,UAAM,UAAU,MAAM;AACrB,UAAI,CAAC,GAAG,IAAI,EAAE;AAAY;AAE1B,YAAMI,QAAO,eAAe,MAAM,YAAY,CAAC;AAK/C,UAAI,WAAW;AACd,UAAE,OAAO,CAAC,SAAS;AAClB,iBAAO,KAAK,MAAM,KAAKA,KAAI,GAAG;AAAA,QAC/B,CAAC;AAAA,MACF;AAEA,cAAQA,KAAI;AAAA,IACb;AAKA,UAAM,MAAM,CAACA,UAAe;AAC3B,YAAM,QAAQA;AAEd,aAAO,QAAQA,KAAI;AAAA,IACpB;AAEA,QAAI,YAAY;AAChB,QAAI,YAAY;AAChB,QAAI,aAAa;AAKjB,UAAM,UAAU,OAAOA,UAAgB;AACtC,UAAI,CAAC,GAAG,IAAI,EAAE;AAAY;AAE1B,UAAI,SAASA,SAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE;AAKxC,UAAI,CAAC,QAAQ;AACZ,UAAE,OAAO,OAAO;AAAA,UACf,OAAO,CAAC,OAAO;AAAA,UACf,MAAM,MAAM,WAAW;AAAA,UACvB,MAAM,CAAC,6BAA6B,GAAG,0BAA0B,GAAG,GAAG,CAAC;AAAA,QACzE,EAAE;AAEF,iBAAS,MAAM,OAAO;AAAA,MACvB;AAEA,MAAC,YAAY,MAAQ,MAAM,QAAQ;AAEnC,YAAM,OAAO,MAAM,MAAM,CAAC;AAK1B,UAAI,UAAe;AAInB,UAAI;AAIJ,UAAI,eAAe;AAKnB,UAAI,QAAQ;AAKZ,YAAM,MAAM,MAAM,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACvD,YAAI,OAAO,IAAI,KAAK,SAAS,GAAG,GAAG;AAClC,iBAAO,MAAM;AAAA,QACd;AAEA,eAAO;AAAA,MACR,GAAG,CAAC;AAEJ,YAAM,QAAQ,CAAC;AACf,YAAM,OAAO,oBAAI,IAAI;AACrB,YAAMC,cAAa,oBAAI,IAAI;AAC3B,YAAM,SAAS,CAAC;AAEhB,iBAAW,CAAC,MAAM,GAAG,KAAK,MAAM;AAC/B,YAAI,SAAS,QAAQ;AACpB,uBAAa;AACb,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,MAAM;AACzB,uBAAa;AAEb,cAAI,SAAS,GAAG,GAAG;AAClB;AAEA,gBAAI,aAAa;AAEjB,gBAAI,cAAc;AACjB,oBAAM,OAAO,iCAAiC,KAAK,MAAM,GAAG,KAAK,GAAG,OAAO;AAE3E,kBAAI,MAAM;AACT,6BAAa,KAAK,CAAC;AACnB,+BAAe;AAAA,cAChB;AAAA,YACD;AAMA,qBAAS,IAAI,YAAY,KAAK,KAAK,KAAK;AACvC,oBAAM,OAAO,QAAQ,CAAC;AAMtB,kBAAI,CAAC,SAAS,IAAI;AAAG;AAErB,oBAAM,CAACC,SAAQ,GAAG,IAAI,IAAI;AAK1B,oBAAMC,QAAO,MAAM;AAClB,qBAAK,IAAID,OAAM;AACf,sBAAM,KAAK,CAACA,SAAQ,IAAI,CAAC;AAAA,cAC1B;AAKA,kBAAIA,YAAW;AAAiB,gBAAAD,YAAW,IAAI,KAAK,CAAC,CAAC;AAMtD,kBAAI,uBAAuBC,OAAM,KAAK,qBAAqBA,SAAQ,IAAI,GAAG;AACzE,oBAAI,UAAU,OAAO,MAAM,KAAK;AAC/B,kBAAAC,MAAK;AAAA,gBACN,OAAO;AACN;AAAA,gBACD;AAAA,cACD;AAEA,cAAAA,MAAK;AAAA,YACN;AAAA,UACD;AAEA,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,UAAU;AAC7B,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,QAC7B,WAAW,SAAS,aAAa;AAChC,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAQ,CAAC,EAAE,GAAG;AAAA,QACzB,WAAW,SAAS,SAAS;AAC5B,iBAAO,KAAK,UAAU;AACtB,oBAAU,MAAM,GAAG;AAAA,QACpB,WAAW,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,kBAAkB;AACxF,oBAAU,OAAO,IAAI;AACrB,yBAAe;AAAA,QAChB;AAAA,MACD;AAKA,eAAS,GAAG,WAAW,MAAM;AAI7B,YAAM,SAAS,CAAC,MAAMF,WAAU,CAAC;AAKjC,YAAMG,QAAO,CAAC,MAAc,MAAM,MAAM,IAAI,CAAC;AAE7C,uBAAiB,CAAC,GAAG,CAACF,SAAQ,IAAI,CAAC,KAAK,MAAM,QAAQ,GAAG;AACxD,YAAIA,YAAW,cAAcA,YAAW,UAAU;AAIjD,cAAIA,YAAW,YAAa,KAAuC,CAAC,EAAE,gBAAgB;AAIrF,kBAAM,YAAYE,MAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM;AAC7C,kBAAI,CAAC,SAAS,CAAC;AAAM,uBAAO;AAE5B,oBAAM,KAAK,MAAM,CAAC;AAClB,oBAAM,KAAK,KAAK,CAAC;AAKjB,oBAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;AACrD,oBAAM,yBAAyB,OAAO;AAEtC,qBAAO,iBAAiB,0BAA0B,IAAI,EAAE,MAAM,IAAI,EAAE;AAAA,YACrE,CAAC;AAED,gBAAI;AAAW;AAAA,UAChB;AAKA,gBAAM,SAAS,MAAMF,SAAQ,IAAI;AAKjC,cAAI,UAAU,MAAM,GAAG;AAItB,kBAAM;AAAA,UACP;AAAA,QACD,WAAWA,YAAW,iBAAiB;AACtC,gBAAM,OAAOE,MAAK,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,KAAK,MAAM;AAI/C,gBAAI,CAAC,SAAS,CAAC;AAAM,qBAAO;AAM5B,kBAAM,SAAS,YAAY,mBAAmB,MAAM,CAAC,MAAM,KAAK,CAAC;AAKjE,kBAAM,YAAY,YAAYF,WAAU,MAAM,CAAC,MAAM,KAAK,CAAC;AAE3D,mBAAO,UAAU;AAAA,UAClB,CAAC;AAED,cAAI;AAAM;AAEV,gBAAMA,SAAQ,IAAI;AAAA,QACnB,WAAWA,YAAW,oBAAoBA,YAAW,sBAAsBA,YAAW,WAAW;AAWhG,gBAAM,YAAYE,MAAK,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,MAAMF,YAAW,OAAO;AAEhE,cAAI;AAAW;AAEf,gBAAMA,SAAQ,IAAI;AAAA,QACnB,OAAO;AACN,gBAAMA,SAAQ,IAAI;AAAA,QACnB;AAAA,MACD;AAEA,MAAC,YAAY,YAAY,OAAQ,OAAO;AAAA,IACzC;AAEA,UAAM,QAAQ,CAAC,OAAO,MAAM,MAAM,CAAC,MAAM;AACxC,UAAI,UAAe;AACnB,UAAI,aAAkB;AAEtB,YAAM,SAAgB,CAAC;AAEvB,iBAAW,CAAC,MAAM,GAAG,KAAK,MAAM;AAC/B,YAAI,SAAS,QAAQ;AACpB,uBAAa;AACb,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,MAAM;AACzB,uBAAa;AACb,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,UAAU;AAC7B,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAS,MAAiB,CAAC,EAAE,CAAC;AAAA,QACzC,WAAW,SAAS,aAAa;AAChC,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAQ,CAAC,EAAE,GAAG;AAAA,QACzB,WAAW,SAAS,SAAS;AAC5B,iBAAO,KAAK,UAAU;AACtB,oBAAU,MAAM,GAAG;AAAA,QACpB,WAAW,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,kBAAkB;AACxF,oBAAU,OAAO,IAAI;AAAA,QACtB;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAKA,UAAM,OAAO,CAAC,QAAQ,UAAU;AAC/B,UAAI,aAAa,KAAK,CAAC,SAAS,eAAe;AAC9C,iBAAS,GAAG,eAAe;AAC3B;AAAA,MACD;AAEA,YAAM,UAAU,MAAM;AAEtB,YAAM,MAAM;AACZ,eAAS,GAAG,WAAW,UAAU;AACjC,eAAS,MAAM,QAAQ;AAKvB,YAAM,CAAC,MAAM,IAAI,IAAI,QAAQ,CAAC;AAM9B,UAAI,SAAS,UAAU,cAAc,KAAK,MAAM,IAAI,IAAI,GAAG;AAC1D,UAAE,OAAO,CAAC,SAAS;AAClB,eAAK,QAAQ,KAAK,MAAM,OAAO,CAACF,UAASA,UAAS,OAAO;AAEzD,iBAAO;AAAA,QACR,CAAC;AAAA,MACF;AAKA,oBAAc,KAAK;AAInB,YAAM,MAAM;AAAA,IACb;AAEA,UAAM,OAAO,MAAM;AAClB,aAAO,MAAM,KAAK,GAAG,QAAQ,MAAM,KAAK;AAAA,IACzC;AAEA,UAAM,IAAI,CAAC,KAA6B,SAA6B;AACpE,aAAO,YAAY,IAAiB,EAAE,SAAS,GAAG;AAAA,IACnD;AAEA,UAAM,WAAW,eAAe;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAED,aAAS,GAAG,MAAM;AAElB,UAAM,QAAQ,YAAY;AAAA,MACzB,KAAK,CAAC,IAAI,GAAG;AACZ,YAAI,CAAC;AAAW,qBAAW,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI;AAAA,MAClE;AAAA,MACA,eAAe,CAAC,UAAU,GAAG;AAC5B,iBAAS,WAAW,UAAU;AAC9B,aAAK;AAAA,MACN;AAAA,MACA,UAAU,CAAC,MAAM,GAAG;AACnB,iBAAS,MAAM,MAAM,QAAQ,SAAS,IAAI,EAAE,KAAK;AACjD,aAAK;AAAA,MACN;AAAA,MACA,UAAU,CAAC,MAAM,GAAG;AACnB,iBAAS,MAAM,MAAM,QAAQ,OAAO,EAAE,KAAK;AAC3C,aAAK;AAAA,MACN;AAAA,MACA,UAAU,CAAC,QAAQ,IAAI,GAAG;AACzB,iBAAS,MAAM,MAAM,QAAQ,SAAS,QAAQ,KAAK,EAAE,KAAK;AAC1D,aAAK;AAAA,MACN;AAAA,MACA,UAAU,CAAC,MAAM,GAAG;AACnB,iBAAS,MAAM,MAAM,QAAQ,OAAO,EAAE,KAAK;AAC3C,aAAK;AAAA,MACN;AAAA,MACA,MAAM,CAAC,MAAM,GAAG;AACf,iBAAS,MAAM,MAAM,MAAM;AAC3B,aAAK;AAAA,MACN;AAAA,MACA,YAAY;AACX,iBAAS,MAAM,UAAU;AACzB,aAAK;AAAA,MACN;AAAA,MACA,cAAc,CAAC,WAAW,SAAS,WAAW,KAAK,GAAG;AACrD,YAAI,OAAO,CAAC,WAAW,SAAS,EAAE,SAAS,OAAO,GAAG;AACpD,gBAAM,IAAI,MAAM,8BAA8B,SAAS,2BAA2B,OAAO,GAAG;AAAA,QAC7F;AAEA,cAAM,SAAS,SAAS,UAAU,SAAS;AAE3C,eAAO,OAAO,WAAW,OAAO,SAAS;AACzC,eAAO,YAAY,OAAO,EAAE;AAE5B,aAAK;AAAA,MACN;AAAA,MACA,cAAc,CAAC,WAAW,WAAW,OAAO,QAAQ,GAAG;AACtD,iBAAS,UAAU,SAAS,EAAE,OAAO,WAAW,OAAO,QAAQ,EAAE,MAAM,SAAS;AAAA,MACjF;AAAA,MACA,OAAO,CAAC,WAAW,SAAS,OAAO,GAAG;AAIrC,cAAM,QAAQ,MAAM;AACnB,gBAAM,IAAI;AACV,gBAAM,KAAK;AACX,gBAAM,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;AAE3B,cAAI,KAAK,KAAK,IAAI;AACjB,kBAAM,QAAQ,GAAG,CAAC,EAAE;AAEpB,gBAAI,OAAO,UAAU,UAAU;AAC9B,qBAAO;AAAA,YACR;AAEA,gBAAI,QAAQ,OAAO;AAClB,qBAAO,MAAM,IAAiB;AAAA,YAC/B;AAAA,UACD;AAEA,iBAAO,KAAK;AAAA,QACb,GAAG;AAEH,cAAM,MAAM,SAAS,OAAOK,QAAO,OAAO,GAAGA,QAAO,IAAI,GAAG,WAAW,OAAO;AAE7E,YAAI,SAAS,SAAS;AAAA,MACvB;AAAA,MACA,SAAS,CAAC,EAAE,GAAG;AACd,cAAM,SAAS,GAAG,WAAW,SAAS;AAEtC,YAAI,CAAC;AAAW,mBAAS,OAAO,KAAK,IAAI,IAAI,KAAK;AAElD,eAAO;AAAA,MACR;AAAA,MACA,OAAO,CAAC,UAAU,GAAG,OAAO,GAAG;AAC9B,cAAM,oBAAoB,MAAM,QAAQ,QAAQ;AAEhD,YAAI,mBAAmB;AAItB,kBAAQ,QAAQ,QAA6E;AAI7F,qBAAW;AAAA,QACZ;AAEA,cAAM,YAAY,QAAQ,IAAI,CAAC,CAAC,SAASH,SAAQ,OAAO,MAAM;AAC7D,cAAI,OAAOA,QAAO,WAAW,MAAM,CAAC,WAAW,QAAQ,IAAI;AAC1D,oBAAQ,KAAK,2FAA2F;AAAA,UACzG;AAEA,iBAAO,CAACG,QAAO,OAAO,GAAGH,SAAQ,OAAO;AAAA,QACzC,CAAC;AAED,YAAI,OAAO,UAAU,WAAW,GAAG;AAClC,gBAAM,IAAI,MAAM,iJAAiJ;AAAA,QAClK;AAEA,cAAM,MAAM,SAAS,QAAQG,QAAO,QAAQ,GAAG,SAAS;AAExD,YAAI,CAAC,aAAa;AACjB,mBAAS;AAKT,gBAAM,SAAS,oBAAoB,IAAI;AAEvC,cAAI,OAAO,CAAC,UAAU,WAAW,MAAM,GAAG;AACzC,kBAAM,IAAI,MAAM,gFAAgF;AAAA,UACjG;AAEA,gBAAM,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,WAAW,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5D,iBAAO;AACP,wBAAc,IAAI;AAAA,QACnB,CAAC;AAAA,MACF;AAAA,MACA,KAAK,CAAC,KAAK,GAAG;AACb,YAAI,OAAO,CAAC,MAAM,KAAK,GAAG;AACzB,gBAAM,IAAI,MAAM,qCAAqC,KAAK,GAAG;AAAA,QAC9D;AAEA,YAAI,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,gBAAM,IAAI,MAAM,mCAAmC,KAAK,GAAG;AAAA,QAC5D;AAKA,cAAM,MAAM,CAAC,IAAI;AAAA,UAChB,CAAC,QAAQ,KAAK;AAAA,UACd,CAAC,MAAM,EAAE;AAAA,QACV;AAEA,cAAM,SAAS,CAAC,CAAC;AAAA,MAClB;AAAA,MACA,MAAM,CAAC,MAAMJ,WAAU,GAAG;AAIzB,iBAAS,QAAQ,CAAC;AAIlB,iBAAS,MAAM,WAAW,QAAQ,WAAWA,eAAc,SAAS,EAAE,IAAI;AAE1E,iBAAS,MAAM,MAAM;AAAA,MACtB;AAAA,MACA,UAAU,CAAC,WAAW,QAAQ,GAAG;AAChC,YAAI,OAAO,OAAO,OAAO,QAAQ,EAAE,WAAW,GAAG;AAChD,gBAAM,IAAI,MAAM,4DAA4D;AAAA,QAC7E;AAEA,YAAI,CAAC,WAAW;AACf,gBAAM,MAAM,OAAO,UAAU,CAAC;AAE9B,cAAI,OAAO,CAAC,SAAS,GAAG,GAAG;AAC1B,kBAAM,IAAI,MAAM,qCAAqC,GAAG,GAAG;AAAA,UAC5D;AAEA,cAAI,OAAO,SAAS,GAAG,EAAE,WAAW,GAAG;AACtC,kBAAM,IAAI,MAAM,mCAAmC,GAAG,GAAG;AAAA,UAC1D;AAEA,gBAAM,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAEjD,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,MAAM;AAIL,iBAAS,QAAQ,CAAC;AAIlB,iBAAS,MAAM,WAAW,WAAW,SAAS,EAAE,IAAI;AAKpD,iBAAS,GAAG,WAAW,UAAU;AAIjC,sBAAc,KAAK;AAInB,cAAM,MAAM;AAAA,MACb;AAAA,MACA,MAAM,CAAC,UAAU,SAAS,KAAK,GAAG;AACjC,iBAAS,MAAMI,QAAO,QAAQ,GAAG,SAAS,KAAK,EAAE,OAAO;AAAA,MACzD;AAAA,MACA,OAAO,CAAC,OAAO,GAAG;AACjB,cAAM,SAAS,SAAS,OAAO,SAAS,WAAW,MAAM;AACxD,cAAI,CAAC,aAAa,QAAQ;AAAmB,qBAAS,GAAG,cAAc,IAAI;AAC3E,cAAI,CAAC;AAAW,iBAAK;AAAA,QACtB,CAAC;AAED,eAAO;AAAA,MACR;AAAA,MACA,QAAQ,SAAS;AAChB,iBAAS,QAAQ,OAAO;AACxB,aAAK;AAAA,MACN;AAAA,MACA,OAAO;AACN,aAAK;AAAA,MACN;AAAA,MACA,iBAAiB,CAAC,WAAW,SAAS,GAAG,OAAO,GAAG;AAClD,YAAI,OAAO,QAAQ,WAAW,GAAG;AAChC,gBAAM,IAAI,MAAM,4IAA4I;AAAA,QAC7J;AAEA,YAAI,QAAQ,WAAW,KAAK,CAAC,OAAO,SAAS,OAAO,KAAK,OAAO,MAAM,OAAO,IAAI;AAChF,gBAAM,IAAI,MAAM,sGAAsG;AAAA,QACvH;AAEA,cAAM,UAAyB,CAAC,QAAQ;AACvC,gBAAM,EAAE,MAAM,IAAI,IAAI,gCAAgC,KAAK;AAC3D,gBAAM,OAAO,SAAS,MAAM,WAAW,SAAS;AAMhD,cAAI,CAAC;AAAM;AAEX,gBAAM,SAAS,KAAK;AAKpB,cAAI,CAAC;AAAQ;AAEb,gBAAM,aAAa,QAAQ,OAAO,CAAC,cAAc,CAAC,OAAO,UAAU,SAAS,SAAS,CAAC;AAEtF,iBAAO,UAAU,IAAI,GAAG,UAAU;AAElC,gBAAM,YAAY,WAAW,MAAM;AAClC,mBAAO,UAAU,OAAO,GAAG,UAAU;AAAA,UACtC,GAAG,OAAO;AAEV,gBAAM,MAAM;AACX,mBAAO,UAAU,OAAO,GAAG,UAAU;AAKrC,yBAAa,SAAS;AAAA,UACvB,CAAC;AAAA,QACF;AAKA,cAAM,UAAU,CAAC,OAAO,CAAC;AAAA,MAC1B;AAAA,MACA,KAAK,MAAM;AACV,cAAM,SAAS,KAAK,IAAI,CAAC,YAAYA,QAAO,OAAO,CAAC,EAAE,KAAK,GAAG;AAE9D,YAAI,OAAO,OAAO,WAAW,GAAG;AAC/B,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACpE;AAEA,iBAAS,KAAK,QAAQ,SAAS,SAAS;AAAA,MACzC;AAAA,MACA,OAAO;AACN,YAAI;AAAW;AAEf,cAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,cAAM,OAAO,KAAK,GAAG,EAAE;AACvB,cAAM,SAA8D,CAAC;AAMrE,YAAI,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;AAC3B,cAAI,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,GAAG;AACjD,iBAAK,CAAC;AAAA,UACP,OAAO;AACN,iBAAK,IAAI;AAAA,UACV;AAAA,QACD;AAEA,YAAI,iBAAiB,IAAI,GAAG;AAC3B,gBAAM,WAAW,MAAM,IAAI;AAE3B,cAAI,SAAS,QAAQ,KAAK,uBAAuB,SAAS,CAAC,CAAC,GAAG;AAC9D,kBAAM,OAAO,CAAC,CAAC;AAAA,UAChB;AAEA;AAAA,QACD;AAEA,iBAAS,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,gBAAM,CAAC,IAAI,IAAI,KAAK,CAAC;AAKrB,cAAI,qBAAqB,IAAI,GAAG;AAC/B,mBAAO,KAAK,IAAI;AAAA,UACjB;AAKA,cAAI,CAAC,iBAAiB,IAAI;AAAG;AAK7B,cAAI,OAAO,GAAG,EAAE,GAAG,WAAW,IAAI,GAAG;AACpC,mBAAO,IAAI;AACX;AAAA,UACD;AAKA,eAAK,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC;AAE1B,gBAAM,OAAO,iCAAiC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;AAKxE,cAAI;AAAM,iBAAK,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAQvC,cAAI,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;AAC3B,iBAAK,IAAI;AACT;AAAA,UACD;AAEA;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AAAA,MACA,QAAQ,CAAC,MAAM,GAAG;AACjB,YAAI,CAAC,aAAa,CAAC,aAAa,CAAC,iBAAiB,IAAI,MAAM,GAAG;AAI9D,2BAAiB,IAAI,SAAS,KAAK,aAAa,MAAM,CAAC;AAAA,QACxD;AAEA,aAAK;AAAA,MACN;AAAA,MACA,MAAM,CAAC,KAAK,GAAG;AACd,YAAI,OAAO,CAAC,MAAM,KAAK,GAAG;AACzB,gBAAM,IAAI,MAAM,oDAAoD,KAAK,GAAG;AAAA,QAC7E;AAEA,YAAI,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,gBAAM,IAAI,MAAM,kDAAkD,KAAK,GAAG;AAAA,QAC3E;AAEA,YAAI,CAAC,WAAW;AACf,gBAAM,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;AAE/C,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,WAAW,MAAM;AACtB,UAAI;AAAW;AAEf,YAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,cAAQ,CAAC,EAAE,CAAC,IAAI;AAEhB,YAAM,KAAK,OAAO;AAElB,WAAK,MAAM,MAAM;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM;AAClB,YAAM,OAAO,MAAM,MAAM,CAAC;AAK1B,YAAM,OAAO,KAAK,GAAG,EAAE;AAEvB,UAAI,SAAS,OAAO,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,WAAW,SAAS,KAAK,CAAC,CAAC,GAAG;AACzE,aAAK,CAAC;AAAA,MACP,OAAO;AACN,aAAK,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,MACpB;AAAA,IACD;AAEA,UAAM,SAAS,MAAM;AACpB,YAAM,WAAW,MAAM;AAEvB,UAAI,SAAS,QAAQ,GAAG;AACvB,cAAM,CAACH,SAAQ,GAAG,KAAK,IAAI;AAE3B,cAAMA,SAAQ,KAAK;AAAA,MACpB,OAAO;AACN,cAAM,QAAQ,CAAC,CAAC;AAAA,MACjB;AAAA,IACD;AAEA,UAAM,OAAO,MAAM;AAClB,UAAI,CAAC;AAAW,aAAK,GAAG,OAAO;AAAA,IAChC;AAEA,UAAM,UAAU,MAAM;AACrB,eAAS;AACT,WAAK;AACL,oBAAc,IAAI;AAAA,IACnB;AAEA,UAAM,gBAAgB,CAAC,QAAQ,UAAU;AACxC,mBAAa,QAAQ,aAAa,IAAI;AAAA,IACvC;AAYA,UAAMG,UAAS,CAAC,SAAiC,SAAS,UAAU;AACnE,YAAM;AAAA,QACL,MAAAC;AAAA,QACA,MAAM,CAAC,IAAI;AAAA,MACZ,IAAI,EAAE,IAAI;AAEV,YAAM,MAAM,SAASA,QAAO,MAAM;AAClC,YAAM,MAAM,WAAW,OAAO,IAC3B,QAAQ,IACR,OAAO,YAAY,WACjB,UACA,QAAQ,IAAiB;AAE9B,YAAMC,OAAM,WAAW,GAAG,IAAI,IAAI,IAAI;AAEtC,YAAM,QAAQ,YAAY,IAAiB;AAE3C,UAAI,MAAM,WAAW,MAAM,QAAQ;AAIlC,eAAO,QAAWA,MAAK,KAAK,MAAM,QAAQ,MAAM,SAAS,IAAI,KAAK,YAAY,MAAM,OAAO,IAAI,CAAC;AAAA,MACjG;AAEA,aAAO,QAAWA,MAAK,GAAG;AAAA,IAC3B;AAIA,aAAS,KAAK,OAAyF;AACtG,UAAI,CAAC;AAAO,eAAO,EAAE,IAAI,EAAE;AAE3B,YAAM,OAAO,EAAE,IAAI,EAAE;AACrB,YAAM,MAAM,WAAW,KAAK,IAAI,MAAM,IAAkB,IAAI,UAAU,MAAM,KAAK;AAEjF,QAAE,OAAO,CAACC,UAAS;AAClB,QAAAA,MAAK,OAAO;AAEZ,eAAOA;AAAA,MACR,CAAC;AAAA,IACF;AAEA,WAAO;AAAA;AAAA;AAAA;AAAA,MAIN;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA;AAAA;AAAA;AAAA,MAIA,OAAO,SAA8F;AACpG,eAAOH,QAAO,SAAS,IAAI;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;;;AEr1CA,MAAM,KAAK;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,EACd;AAIA,MAAM,KAA6C;AAAA,IAClD,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,EACd;AAKA,MAAM,KAA6C;AAAA,IAClD,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,EACd;AAKA,MAAM,KAA6C;AAAA,IAClD,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,EACd;","names":["pLimit","str","str","getLanguage","pLimit","state","stack","save","characters","action","push","next","unwrap","data","str","prev"]}
package/dist/index.js CHANGED
@@ -132,6 +132,25 @@ var flattenStory = (story) => {
132
132
  });
133
133
  return Object.fromEntries(entries);
134
134
  };
135
+ var isExitImpossible = (path) => {
136
+ const blockStatements = path.filter(([item]) => isBlockStatement(item));
137
+ const blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));
138
+ if (blockStatements.length === 0 && blockExitStatements.length === 0) {
139
+ return true;
140
+ }
141
+ if (blockStatements.length > blockExitStatements.length) {
142
+ return false;
143
+ }
144
+ for (let i = 0; i++; i < blockStatements.length) {
145
+ const b = blockStatements[i][0];
146
+ const be = blockExitStatements[i][0];
147
+ if (!b || !be)
148
+ return false;
149
+ if (!be.startsWith(b))
150
+ return false;
151
+ }
152
+ return true;
153
+ };
135
154
 
136
155
  // src/global.ts
137
156
  var PRELOADED_ASSETS = /* @__PURE__ */ new Set();
@@ -925,7 +944,7 @@ var novely = ({
925
944
  path.pop();
926
945
  }
927
946
  }
928
- if (path.every(([name]) => !isBlockStatement(name))) {
947
+ if (isExitImpossible(path)) {
929
948
  const referred = refer(path);
930
949
  if (isAction(referred) && isSkippedDuringRestore(referred[0])) {
931
950
  match("end", []);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/global.ts","../src/store.ts","../../deepmerge/src/utils.ts","../../deepmerge/src/index.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/json/index.mjs","../src/translation.ts","../src/storage.ts","../src/novely.ts","../src/translations.ts"],"sourcesContent":["import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nexport { SKIPPED_DURING_RESTORE, EMPTY_SET, DEFAULT_TYPEWRITER_SPEED, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS };\n","import type { ActionProxyProvider, CustomHandler, Story, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Thenable, Path, PathItem } from './types';\nimport { BLOCK_STATEMENTS, BLOCK_EXIT_STATEMENTS, SKIPPED_DURING_RESTORE } from './constants';\n\ntype MatchActionMap = {\n\t[Key in keyof ActionProxyProvider<Record<string, Character>, string>]: (\n\t\tdata: Parameters<ActionProxyProvider<Record<string, Character>, string>[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (value: [handler: CustomHandler]) => Thenable<void>;\n};\n\nconst matchAction = <M extends MatchActionMapComplete>(values: M) => {\n\treturn (action: keyof MatchActionMap, props: any) => {\n\t\treturn values[action](props);\n\t};\n};\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\nconst isCSSImage = (str: string) => {\n\tconst startsWith = String.prototype.startsWith.bind(str);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\nconst str = String;\n\nconst isUserRequiredAction = (\n\taction: keyof MatchActionMapComplete,\n\tmeta: Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n) => {\n\treturn action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction;\n};\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\n/**\n * @copyright Techlead LLC\n * @see https://learn.javascript.ru/task/throttle\n */\nconst throttle = <Fn extends (...args: any[]) => any>(fn: Fn, ms: number) => {\n\tlet throttled = false,\n\t\tsavedArgs: any,\n\t\tsavedThis: any;\n\n\tfunction wrapper(this: any, ...args: any[]) {\n\t\tif (throttled) {\n\t\t\tsavedArgs = args;\n\t\t\t/* eslint-disable @typescript-eslint/no-this-alias */\n\t\t\tsavedThis = this;\n\t\t\treturn;\n\t\t}\n\n\t\tfn.apply(this, args as unknown as any[]);\n\n\t\tthrottled = true;\n\n\t\tsetTimeout(function () {\n\t\t\tthrottled = false;\n\n\t\t\tif (savedArgs) {\n\t\t\t\twrapper.apply(savedThis, savedArgs);\n\t\t\t\tsavedArgs = savedThis = null;\n\t\t\t}\n\t\t}, ms);\n\t}\n\n\treturn wrapper as unknown as (...args: Parameters<Fn>) => void;\n};\n\nconst findLastIndex = <T>(array: T[], fn: (item: T, next?: T) => boolean) => {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (fn(array[i], array[i + 1])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\ntype ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\t// @ts-expect-error Types does not match and this is expected\n\t\tobject.promise = promise;\n\t};\n\n\treturn init(), object;\n};\n\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst index = findLastIndex(path, ([_name, _value], next) => {\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn path[index] as undefined | [null, number];\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\nconst noop = () => {};\n\nconst isAction = (\n\telement: unknown,\n): element is [\n\tkeyof MatchActionMapComplete,\n\t...Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n] => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`\n */\nconst flattenStory = (story: Story) => {\n\tconst entries = Object.entries(story).map(([name, items]) => {\n\t\tconst flat = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\t\t\treturn item.flatMap((data) => {\n\t\t\t\tconst type = data[0];\n\n\t\t\t\t/**\n\t\t\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t\t\t */\n\t\t\t\tif (Array.isArray(type)) return flat(data as ValidAction[]);\n\n\t\t\t\treturn [data as ValidAction];\n\t\t\t});\n\t\t};\n\n\t\treturn [name, flat(items)];\n\t});\n\n\treturn Object.fromEntries(entries);\n};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nexport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisString,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tnoop,\n\tisAction,\n\tflattenStory,\n\tonce,\n};\n","const PRELOADED_ASSETS = new Set<string>();\n\nexport { PRELOADED_ASSETS };\n","type Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, get } as const;\n};\n\nexport { store };\nexport type { Stored };\n","const { isArray } = Array;\nconst { hasOwnProperty, propertyIsEnumerable, getOwnPropertySymbols } = Object;\n\nconst propertyIsOnObject = <T extends Record<PropertyKey, unknown>, K extends PropertyKey>(object: T, property: K): object is T & { [Key in K]: unknown } => {\n\ttry {\n\t\treturn property in object\n\t} catch {\n\t\treturn false\n\t}\n}\n\nconst propertyIsUnsafe = (target: Record<PropertyKey, unknown>, key: PropertyKey) => {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nconst getEnumerableOwnPropertySymbols = (target: Record<PropertyKey, unknown>) => {\n if (!getOwnPropertySymbols) return [];\n\n return getOwnPropertySymbols(target).filter(symbol => propertyIsEnumerable.call(target, symbol))\n}\n\nconst keys = <T extends Record<PropertyKey, unknown>>(target: T): (keyof T)[] => {\n return [...Object.keys(target), ...getEnumerableOwnPropertySymbols(target)];\n}\n\nconst isMergeableObject = (value: unknown): value is Record<PropertyKey, unknown> => {\n return !!value && typeof value === 'object' && !(['RegExp', 'Date'].includes(Object.prototype.toString.call(value).slice(8, -1)));\n}\n\nexport { isArray, propertyIsOnObject, propertyIsUnsafe, getEnumerableOwnPropertySymbols, isMergeableObject, keys }\n","import { isArray, propertyIsOnObject, propertyIsUnsafe, isMergeableObject, keys } from './utils';\n\nconst empty = <T extends (Record<PropertyKey, unknown> | unknown[])>(value: T): T => {\n return (isArray(value) ? [] : {}) as T;\n}\n\nconst clone = <T>(value: T): T => {\n return isMergeableObject(value)\n ? deepmerge(empty(value), value)\n : value;\n}\n\nconst mergeArray = <T>(target: T[], source: T[]) => {\n const destination = target.slice();\n\n source.forEach((item, index) => {\n if (typeof destination[index] === 'undefined') {\n destination[index] = clone(item);\n } else if (isMergeableObject(item)) {\n destination[index] = deepmerge(target[index] as any, item as any);\n } else if (target.indexOf(item) === -1) {\n destination.push(item);\n }\n });\n\n return destination;\n}\n\nconst mergeObject = <T extends Record<PropertyKey, unknown>>(target: T, source: T): T => {\n const destination: Record<PropertyKey, any> = {};\n\n for (const key of keys(target)) {\n destination[key] = clone(target[key]);\n }\n\n for (const key of keys(source)) {\n if (propertyIsUnsafe(target, key)) {\n continue;\n }\n\n if (propertyIsOnObject(target, key) && isMergeableObject(source[key])) {\n destination[key] = deepmerge(target[key] as any, source[key] as any);\n } else {\n destination[key] = clone(source[key]);\n }\n }\n\n return destination as unknown as T;\n}\n\nconst deepmerge = <T extends (Record<PropertyKey, unknown> | unknown[])>(target: T, source: T): T => {\n if (isArray(target) && isArray(source)) {\n const merged = mergeArray(target, source);\n\n return merged as unknown as T;\n } else if (!isArray(target) && !isArray(source)) {\n const merged = mergeObject(target, source);\n\n return merged as unknown as T;\n } else {\n return clone(source);\n }\n}\n\nexport { deepmerge }\n","export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n","type PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent = string | (() => string | string[]) | string[] | (string | (() => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Unwraps any allowed content into string\n * @param c Content\n */\nconst unwrap = (c: AllowedContent): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => unwrap(item)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn unwrap(c());\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tstr: AllowedContent,\n\tobj: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn unwrap(str).replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = obj;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action && actions[action];\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { unwrap, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import type { StorageData } from './types';\n\ninterface LocalStorageStorageSettings {\n\tkey: string;\n}\n\ninterface Storage {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n}\n\nconst localStorageStorage = (options: LocalStorageStorageSettings): Storage => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(options.key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(options.key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { Storage };\nexport { localStorageStorage };\n","import type { Character } from './character';\nimport type {\n\tActionProxyProvider,\n\tGetActionParameters,\n\tStory,\n\tValidAction,\n\tUnwrappable,\n\tCustomHandler,\n} from './action';\nimport type { Storage } from './storage';\nimport type {\n\tSave,\n\tState,\n\tData,\n\tStorageData,\n\tDeepPartial,\n\tNovelyScreen,\n\tMigration,\n\tActionFN,\n\tCoreData,\n} from './types';\nimport type { Renderer, RendererInit } from './renderer';\nimport type { TranslationActions, Pluralization } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage as defaultGetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAction,\n\tnoop,\n\tflattenStory,\n} from './utils';\nimport { PRELOADED_ASSETS } from './global';\nimport { store } from './store';\nimport { deepmerge } from '@novely/deepmerge';\nimport { klona } from 'klona/json';\nimport { EMPTY_SET, DEFAULT_TYPEWRITER_SPEED } from './constants';\nimport { replace as replaceT9N } from './translation';\nimport { localStorageStorage } from './storage';\nimport pLimit from 'p-limit';\n\nimport { DEV } from 'esm-env';\n\ninterface NovelyInit<\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n> {\n\t/**\n\t * An array of languages supported by the game.\n\t */\n\tlanguages: Languages[];\n\t/**\n\t * An object containing the characters in the game.\n\t */\n\tcharacters: Characters;\n\t/**\n\t * An object that provides access to the game's storage system.\n\t * @default localStorage // at key `novely-game-storage`\n\t */\n\tstorage?: Storage;\n\t/**\n\t * Delay loading data until Promise is resolved\n\t */\n\tstorageDelay?: Promise<void>;\n\t/**\n\t * A function that returns a Renderer object used to display the game's content\n\t */\n\trenderer: (characters: RendererInit) => Renderer;\n\t/**\n\t * An optional property that specifies the initial screen to display when the game starts\n\t */\n\tinitialScreen?: NovelyScreen;\n\t/**\n\t * An object containing the translation functions used in the game\n\t */\n\ttranslation: Record<\n\t\tLanguages,\n\t\t{\n\t\t\tinternal: Record<BaseTranslationStrings, string>;\n\t\t\t/**\n\t\t\t * IETF BCP 47 language tag\n\t\t\t */\n\t\t\ttag?: string;\n\t\t\tplural?: Record<string, Pluralization>;\n\t\t\tactions?: TranslationActions;\n\t\t}\n\t>;\n\t/**\n\t * Initial state value\n\t */\n\tstate?: StateScheme;\n\t/**\n\t * Initial data value\n\t */\n\tdata?: DataScheme;\n\t/**\n\t * Enable autosaves or disable\n\t * @default true\n\t */\n\tautosaves?: boolean;\n\t/**\n\t * Migration from old saves to newer\n\t */\n\tmigrations?: Migration[];\n\t/**\n\t * For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage\n\t * @default 799\n\t */\n\tthrottleTimeout?: number;\n\t/**\n\t * Custom language detector\n\t * @param languages Supported languages aka `languages: []` in the config\n\t * @example ```ts\n\t * novely({\n\t * \t\tgetLanguage(languages, original) {\n\t * \t\t\t\tif (!sdk) return original(languages);\n\t * \t\t\t\treturn sdk.environment.i18n.lang // i.e. custom language from some sdk\n\t * \t\t}\n\t * })\n\t * ```\n\t */\n\tgetLanguage?: (languages: string[], original: typeof defaultGetLanguage) => string;\n\t/**\n\t * Ignores saved language, and uses `getLanguage` to get it on every engine start\n\t * @default false\n\t */\n\toverrideLanguage?: boolean;\n\t/**\n\t * Show a prompt before exiting a game\n\t * @default true\n\t */\n\taskBeforeExit?: boolean;\n\t/**\n\t * @default \"lazy\"\n\t */\n\tpreloadAssets?: 'lazy' | 'blocking';\n}\n\nconst novely = <\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n>({\n\tcharacters,\n\tstorage = localStorageStorage({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tlanguages,\n\tstate: defaultState,\n\tdata: defaultData,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 799,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'lazy',\n}: NovelyInit<Languages, Characters, StateScheme, DataScheme>) => {\n\tconst limitScript = pLimit(1);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst ASSETS_TO_PRELOAD = new Set<string>();\n\tconst assetsLoaded = createControlledPromise();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet scriptCalled = false;\n\n\t/**\n\t * Prevent `undefined`\n\t */\n\tdefaultData ||= {} as DataScheme;\n\tdefaultState ||= {} as StateScheme;\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\tObject.assign(story, flattenStory(part));\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\trenderer.ui.showScreen('loading');\n\n\t\t\tawait renderer.misc.preloadImagesBlocking(ASSETS_TO_PRELOAD);\n\t\t}\n\n\t\tconst screen = renderer.ui.getScreen();\n\t\tconst nextScreen = (scriptCalled ? screen : initialScreen) as NovelyScreen;\n\n\t\tASSETS_TO_PRELOAD.clear();\n\t\tassetsLoaded.resolve();\n\n\t\tif (nextScreen === 'game') {\n\t\t\tawait assetsLoaded.promise;\n\t\t\tawait dataLoaded.promise;\n\n\t\t\tif (!scriptCalled) {\n\t\t\t\trestore();\n\t\t\t}\n\t\t} else {\n\t\t\trenderer.ui.showScreen(nextScreen);\n\t\t}\n\n\t\tscriptCalled = true;\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t}\n\n\tconst action = new Proxy({} as ActionProxyProvider<Characters, Languages>, {\n\t\tget(_, prop) {\n\t\t\treturn (...props: Parameters<ActionFN>) => {\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\t/**\n\t\t\t\t\t * Load backgrounds\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showBackground' && typeof props[0] === 'string' && isCSSImage(props[0])) {\n\t\t\t\t\t\tASSETS_TO_PRELOAD.add(props[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Load characters\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showCharacter' && typeof props[0] === 'string' && typeof props[1] === 'string') {\n\t\t\t\t\t\tconst images = characters[props[0]].emotions[props[1]];\n\n\t\t\t\t\t\tif (Array.isArray(images)) {\n\t\t\t\t\t\t\tfor (const asset of images) {\n\t\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(asset);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(images)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [prop, ...props];\n\t\t\t};\n\t\t},\n\t});\n\n\tfunction state(value: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): void;\n\tfunction state(): StateScheme;\n\tfunction state(value?: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): StateScheme | void {\n\t\tif (!value) return stack.value[1] as StateScheme | void;\n\n\t\tconst prev = stack.value[1];\n\t\tconst val = isFunction(value) ? value(prev as StateScheme) : deepmerge(prev, value);\n\n\t\tstack.value[1] = val as StateScheme;\n\t}\n\n\tconst getDefaultSave = (state = {}) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', 'start'],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t] as Save;\n\t};\n\n\tconst createStack = (current: Save, stack = [current]) => {\n\t\treturn {\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value: Save) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\t\t\tback() {\n\t\t\t\tif (stack.length > 1) stack.pop(), (goingBack = true);\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack = [getDefaultSave(klona(defaultState))];\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getLanguageWithoutParameters = () => {\n\t\treturn getLanguage(languages, defaultGetLanguage);\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData = {\n\t\tsaves: [],\n\t\tdata: klona(defaultData) as Data,\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst coreData: CoreData = {\n\t\tdataLoaded: false,\n\t};\n\n\tconst $ = store(initialData);\n\tconst $$ = store(coreData);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif ($$.get().dataLoaded) storage.set(value);\n\t};\n\n\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tonStorageDataChange($.get());\n\t}, 10);\n\n\t$.subscribe(throttledOnStorageDataChange);\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= DEFAULT_TYPEWRITER_SPEED;\n\n\t\tif (overrideLanguage) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t} else {\n\t\t\tstored.meta[0] ||= getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\t$$.update((prev) => ((prev.dataLoaded = true), prev));\n\t\tdataLoaded.resolve();\n\n\t\t/**\n\t\t * Yay\n\t\t */\n\t\t$.update(() => stored);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(klona(defaultState));\n\tconst stack = createStack(initial);\n\n\t/**\n\t * Try to save data when page is switched\n\t */\n\taddEventListener('visibilitychange', () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tthrottledEmergencyOnStorageDataChange();\n\t\t}\n\t});\n\n\t/**\n\t * Try to save data when page is going to be unloaded\n\t */\n\taddEventListener('beforeunload', throttledEmergencyOnStorageDataChange);\n\n\tconst save = (override = false, type: Save[2][1] = override ? 'auto' : 'manual') => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\tconst current = klona(stack.value);\n\n\t\t$.update((prev) => {\n\t\t\t/**\n\t\t\t * Find latest save that were created in current session, and check if it is latest in an array\n\t\t\t *\n\t\t\t * We check if save was created in current session and it is latest in array\n\t\t\t * When it is not then replacing it will break logical chain\n\t\t\t *\n\t\t\t * [auto save 1]\n\t\t\t * [manual save 1]\n\t\t\t * [auto save 2] <- should not replace first auto save\n\t\t\t */\n\t\t\tconst isLatest = findLastIndex(prev.saves, (value) => times.has(value[2][0])) === prev.saves.length - 1;\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\tif (!override || !isLatest) {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst latest = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * When that save is the same type, replace it\n\t\t\t */\n\t\t\tif (latest && latest[2][1] === type) {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\t\t\t} else {\n\t\t\t\tprev.saves.push(current);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\tconst newGame = () => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(klona(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\t$.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\trestore(save);\n\t};\n\n\t/**\n\t * Set's the save\n\t */\n\tconst set = (save: Save) => {\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet restoring = false;\n\tlet goingBack = false;\n\tlet interacted = 0;\n\n\t/**\n\t * Restore\n\t */\n\tconst restore = async (save?: Save) => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tlet latest = save || $.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no game, then make a new game\n\t\t */\n\t\tif (!latest) {\n\t\t\t$.update(() => ({\n\t\t\t\tsaves: [initial],\n\t\t\t\tdata: klona(defaultData) as Data,\n\t\t\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t\t\t}));\n\n\t\t\tlatest = klona(initial);\n\t\t}\n\n\t\t(restoring = true), (stack.value = latest);\n\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Current item in the story\n\t\t */\n\t\tlet current: any = story;\n\t\t/**\n\t\t * Previous `current` value\n\t\t */\n\t\tlet precurrent: any;\n\t\t/**\n\t\t * Should we ignore some actions\n\t\t */\n\t\tlet ignoreNested = false;\n\n\t\t/**\n\t\t * Current item of type `[null, int]`\n\t\t */\n\t\tlet index = 0;\n\n\t\t/**\n\t\t * Cound of items of type `[null, int]`\n\t\t */\n\t\tconst max = stack.value[0].reduce((acc, [type, val]) => {\n\t\t\tif (isNull(type) && isNumber(val)) {\n\t\t\t\treturn acc + 1;\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, 0);\n\n\t\tconst queue = [] as [any, any][];\n\t\tconst keep = new Set();\n\t\tconst characters = new Set();\n\t\tconst blocks = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\n\t\t\t\tif (isNumber(val)) {\n\t\t\t\t\tindex++;\n\n\t\t\t\t\tlet startIndex = 0;\n\n\t\t\t\t\tif (ignoreNested) {\n\t\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), 'block');\n\n\t\t\t\t\t\tif (prev) {\n\t\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\t\tignoreNested = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t\t */\n\t\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t\t * But is should not happen\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\t\tconst [action, ...meta] = item;\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Add item to queue and action to keep\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst push = () => {\n\t\t\t\t\t\t\tkeep.add(action);\n\t\t\t\t\t\t\tqueue.push([action, meta]);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Do not remove characters that will be here anyways\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (action === 'showCharacter') characters.add(meta[0]);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Экшены, для закрытия которых пользователь должен с ними взаимодействовать\n\t\t\t\t\t\t * Также в эту группу входят экшены, которые не должны быть вызваны при восстановлении\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (isSkippedDuringRestore(action) || isUserRequiredAction(action, meta)) {\n\t\t\t\t\t\t\tif (index === max && i === val) {\n\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpush();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[val + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t\tignoreNested = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Run these exactly before the main loop.\n\t\t */\n\t\trenderer.ui.showScreen('game');\n\t\t/**\n\t\t * Provide the `keep` in there\n\t\t */\n\t\tmatch('clear', [keep, characters]);\n\n\t\t/**\n\t\t * Get the next actions array.\n\t\t */\n\t\tconst next = (i: number) => queue.slice(i + 1);\n\n\t\tfor await (const [i, [action, meta]] of queue.entries()) {\n\t\t\tif (action === 'function' || action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * When `callOnlyLatest` is `true`\n\t\t\t\t */\n\t\t\t\tif (action === 'custom' && (meta as GetActionParameters<'Custom'>)[0].callOnlyLatest) {\n\t\t\t\t\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, _meta]) => {\n\t\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t\tconst c0 = _meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\t\t\t\t\t\tconst c1 = meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Also check for `undefined`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst isIdenticalID = c0.id && c1.id && c0.id === c1.id;\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || str(c0) === str(c1);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Action can return Promise.\n\t\t\t\t */\n\t\t\t\tconst result = match(action, meta);\n\n\t\t\t\t/**\n\t\t\t\t * Should wait until it resolved\n\t\t\t\t */\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Await it!\n\t\t\t\t\t */\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t} else if (action === 'showCharacter') {\n\t\t\t\tconst skip = next(i).some(([_action, _meta]) => {\n\t\t\t\t\t/**\n\t\t\t\t\t * Проверка на возможный `undefined`\n\t\t\t\t\t */\n\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Будет ли персонаж скрыт в будущем\n\t\t\t\t\t * Нет смысла при загрузке сохранения загружать и отрисовывать персонажа, который будет скрыт\n\t\t\t\t\t */\n\t\t\t\t\tconst hidden = _action === 'hideCharacter' && _meta[0] === meta[0];\n\t\t\t\t\t/**\n\t\t\t\t\t * Не нужно запускать рендер персонажа, если после этого будет ещё один рендер этого персонажа\n\t\t\t\t\t * Таким образом избегаем ситуации, когда при загрузке вследствие гонки при загрузки изображений отрисовывается не последняя эмоция\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = _action === action && _meta[0] === meta[0];\n\n\t\t\t\t\treturn hidden || notLatest;\n\t\t\t\t});\n\n\t\t\t\tif (skip) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else if (action === 'showBackground' || action === 'animateCharacter' || action === 'preload') {\n\t\t\t\t/**\n\t\t\t\t * @todo: Также сравнивать персонажей в animateCharacter. Чтобы не просто последний запускался, а последний для персонажа.\n\t\t\t\t * Тем не менее таким образом могут быть лишнии анимации.\n\t\t\t\t * Можно проверить, что одна анимация идёт сразу за другой, а не через, например, dialog\n\t\t\t\t */\n\n\t\t\t\t/**\n\t\t\t\t * Такая же оптимизация применяется к фонам и анимированию персонажей, и `preload`.\n\t\t\t\t * Если фон изменится, то нет смысла устанавливать или предзагружать текущий\n\t\t\t\t */\n\t\t\t\tconst notLatest = next(i).some(([_action]) => action === _action);\n\n\t\t\t\tif (notLatest) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else {\n\t\t\t\tmatch(action, meta);\n\t\t\t}\n\t\t}\n\n\t\t(restoring = goingBack = false), render();\n\t};\n\n\tconst refer = (path = stack.value[0]) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false) => {\n\t\tif (interacted > 1 && !force && askBeforeExit) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = stack.value;\n\n\t\tstack.clear();\n\t\trenderer.ui.showScreen('mainmenu');\n\t\trenderer.audio.destroy();\n\n\t\t/**\n\t\t * First two save elements and it's type\n\t\t */\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\t$.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\n\tconst back = () => {\n\t\treturn stack.back(), restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | Languages) => {\n\t\treturn translation[lang as Languages].internal[key];\n\t};\n\n\tconst renderer = createRenderer({\n\t\tcharacters,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tstack,\n\t\tlanguages,\n\t\t$,\n\t\t$$,\n\t});\n\n\trenderer.ui.start();\n\n\tconst match = matchAction({\n\t\twait([time]) {\n\t\t\tif (!restoring) setTimeout(push, isFunction(time) ? time() : time);\n\t\t},\n\t\tshowBackground([background]) {\n\t\t\trenderer.background(background);\n\t\t\tpush();\n\t\t},\n\t\tplayMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music', true).play();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound([source, loop]) {\n\t\t\trenderer.audio.music(source, 'sound', loop || false).play();\n\t\t\tpush();\n\t\t},\n\t\tstopSound([source]) {\n\t\t\trenderer.audio.music(source, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice([source]) {\n\t\t\trenderer.audio.voice(source);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice() {\n\t\t\trenderer.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter([character, emotion, className, style]) {\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`)\n\t\t\t}\n\n\t\t\tconst handle = renderer.character(character);\n\n\t\t\thandle.append(className, style, restoring);\n\t\t\thandle.withEmotion(emotion)();\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter([character, className, style, duration]) {\n\t\t\trenderer.character(character).remove(className, style, duration)(push, restoring);\n\t\t},\n\t\tdialog([character, content, emotion]) {\n\t\t\t/**\n\t\t\t * Person name\n\t\t\t */\n\t\t\tconst name = (() => {\n\t\t\t\tconst c = character;\n\t\t\t\tconst cs = characters;\n\t\t\t\tconst lang = $.get().meta[0];\n\n\t\t\t\tif (c && c in cs) {\n\t\t\t\t\tconst block = cs[c].name;\n\n\t\t\t\t\tif (typeof block === 'string') {\n\t\t\t\t\t\treturn block;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (lang in block) {\n\t\t\t\t\t\treturn block[lang as Languages];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn c || '';\n\t\t\t})();\n\n\t\t\tconst run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);\n\n\t\t\trun(forward, goingBack);\n\t\t},\n\t\tfunction([fn]) {\n\t\t\tconst result = fn(restoring, goingBack);\n\n\t\t\tif (!restoring) result ? result.then(push) : push();\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice([question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Первый элемент может быть как строкой, так и элементов выбора\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as [Unwrappable<Languages>, ValidAction[], () => boolean]);\n\t\t\t\t/**\n\t\t\t\t * Значит, текст не требуется\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst unwrapped = choices.map(([content, action, visible]) => {\n\t\t\t\tif (DEV && action.length === 0 && (!visible || visible())) {\n\t\t\t\t\tconsole.warn(`Choice children should not be empty, either add content there or make item not selectable`)\n\t\t\t\t}\n\n\t\t\t\treturn [unwrap(content), action, visible] as [string, ValidAction[], () => boolean];\n\t\t\t});\n\n\t\t\tif (DEV && unwrapped.length === 0) {\n\t\t\t\tthrow new Error(`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`)\n\t\t\t}\n\n\t\t\tconst run = renderer.choices(unwrap(question), unwrapped);\n\n\t\t\trun((selected) => {\n\t\t\t\tenmemory();\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !unwrapped[selected + offset]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable')\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender();\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tmatch('clear', []);\n\t\t},\n\t\tclear([keep, characters]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\trenderer.clear(goingBack, keep || EMPTY_SET, characters || EMPTY_SET)(push);\n\n\t\t\trenderer.audio.clear();\n\t\t},\n\t\tcondition([condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tconst val = String(condition());\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\t/**\n\t\t\t * Clear the Scene\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * No-op used there because using push will make an infinite loop\n\t\t\t */\n\t\t\trenderer.clear(goingBack, EMPTY_SET, EMPTY_SET)(noop);\n\n\t\t\t/**\n\t\t\t * Go to the main menu\n\t\t\t */\n\t\t\trenderer.ui.showScreen('mainmenu');\n\t\t\t/**\n\t\t\t * Reset interactive value\n\t\t\t */\n\t\t\tinteractivity(false);\n\t\t\t/**\n\t\t\t * Reset session times\n\t\t\t */\n\t\t\ttimes.clear();\n\t\t},\n\t\tinput([question, onInput, setup]) {\n\t\t\trenderer.input(unwrap(question), onInput, setup)(forward);\n\t\t},\n\t\tcustom([handler]) {\n\t\t\tconst result = renderer.custom(handler, goingBack, () => {\n\t\t\t\tif (!restoring && handler.requireUserAction) enmemory(), interactivity(true);\n\t\t\t\tif (!restoring) push();\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate(pattern) {\n\t\t\trenderer.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext() {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter([character, timeout, ...classes]) {\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]')\n\t\t\t}\n\n\t\t\tif (DEV && (timeout <= 0 || !Number.isFinite(timeout) || Number.isNaN(timeout))) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter with unacceptable timeout. It should be finite and greater than zero')\n\t\t\t}\n\n\t\t\tconst handler: CustomHandler = (get) => {\n\t\t\t\tconst { clear } = get('@@internal-animate-character', false);\n\t\t\t\tconst char = renderer.store.characters[character];\n\n\t\t\t\t/**\n\t\t\t\t * Character is not defined, maybe, `animateCharacter` was called before `showCharacter` OR character was not just loaded yet\n\t\t\t\t */\n\n\t\t\t\tif (!char) return;\n\n\t\t\t\tconst target = char.canvas;\n\n\t\t\t\t/**\n\t\t\t\t * Character is not found\n\t\t\t\t */\n\t\t\t\tif (!target) return;\n\n\t\t\t\tconst classNames = classes.filter((className) => !target.classList.contains(className));\n\n\t\t\t\ttarget.classList.add(...classNames);\n\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\t\t\t\t}, timeout);\n\n\t\t\t\tclear(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Clear timeout, because when you will game re-runs some callback might remove classes from character\n\t\t\t\t\t */\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * `callOnlyLatest` property will not have any effect, because `custom` is called directly\n\t\t\t */\n\t\t\tmatch('custom', [handler]);\n\t\t},\n\t\ttext(text) {\n\t\t\tconst string = text.map((content) => unwrap(content)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`)\n\t\t\t}\n\n\t\t\trenderer.text(string, forward, goingBack);\n\t\t},\n\t\texit() {\n\t\t\tif (restoring) return;\n\n\t\t\tconst path = stack.value[0];\n\t\t\tconst last = path.at(-1);\n\t\t\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\t\t\t/**\n\t\t\t * - should be an array\n\t\t\t * - first element is action name\n\t\t\t */\n\t\t\tif (!isAction(refer(path))) {\n\t\t\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\t\t\tlast[1]--;\n\t\t\t\t} else {\n\t\t\t\t\tpath.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Exit is impossible\n\t\t\t */\n\t\t\tif (path.every(([name]) => !isBlockStatement(name))) {\n\t\t\t\tconst referred = refer(path);\n\n\t\t\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\t\t\tmatch('end', []);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let i = path.length - 1; i > 0; i--) {\n\t\t\t\tconst [name] = path[i];\n\n\t\t\t\t/**\n\t\t\t\t * Remember already exited paths\n\t\t\t\t */\n\t\t\t\tif (isBlockExitStatement(name)) {\n\t\t\t\t\tignore.push(name);\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Ignore everything that we do not need there\n\t\t\t\t */\n\t\t\t\tif (!isBlockStatement(name)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * When we found an already exited path we remove it from the list\n\t\t\t\t */\n\t\t\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\t\t\tignore.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Exit from the path\n\t\t\t\t */\n\t\t\t\tpath.push([`${name}:exit`]);\n\n\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t\t\t/**\n\t\t\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t\t\t */\n\t\t\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t\t\t/**\n\t\t\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t\t\t *\n\t\t\t\t * - remove that item\n\t\t\t\t * - close another block\n\t\t\t\t */\n\t\t\t\tif (!isAction(refer(path))) {\n\t\t\t\t\tpath.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\trender();\n\t\t},\n\t\tpreload([source]) {\n\t\t\tif (!goingBack && !restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Make image load\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t});\n\n\tconst enmemory = () => {\n\t\tif (restoring) return;\n\n\t\tconst current = klona(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave(true, 'auto');\n\t};\n\n\tconst next = () => {\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Last path element\n\t\t */\n\t\tconst last = path.at(-1);\n\n\t\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\t\tlast[1]++;\n\t\t} else {\n\t\t\tpath.push([null, 0]);\n\t\t}\n\t};\n\n\tconst render = () => {\n\t\tconst referred = refer();\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props);\n\t\t} else {\n\t\t\tmatch('exit', []);\n\t\t}\n\t};\n\n\tconst push = () => {\n\t\tif (!restoring) next(), render();\n\t};\n\n\tconst forward = () => {\n\t\tenmemory();\n\t\tpush();\n\t\tinteractivity(true);\n\t};\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Unwraps translatable content to string\n\t *\n\t * @example ```\n\t * unwrap({ en: 'Hello', ru: 'Привет' });\n\t * unwrap({ en: () => data().ad_viewed ? 'Diamond Hat' : 'Diamond Hat (Watch Adv)' })\n\t * unwrap(() => `Today is ${new Date()}`)\n\t * unwrap('Hello, {{name}}');\n\t * ```\n\t */\n\tconst unwrap = (content: Unwrappable<Languages>, global = false) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = $.get();\n\n\t\tconst obj = global ? data : state();\n\t\tconst cnt = isFunction(content)\n\t\t\t? content()\n\t\t\t: typeof content === 'string'\n\t\t\t ? content\n\t\t\t : content[lang as Languages];\n\n\t\tconst str = isFunction(cnt) ? cnt() : cnt;\n\n\t\tconst trans = translation[lang as Languages];\n\n\t\tif (trans.actions || trans.plural) {\n\t\t\t/**\n\t\t\t * Should kinda work, but creating PluralRules each time is not really efficient\n\t\t\t */\n\t\t\treturn replaceT9N(str, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));\n\t\t}\n\n\t\treturn replaceT9N(str, obj);\n\t};\n\n\tfunction data(value: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): void;\n\tfunction data(): DataScheme;\n\tfunction data(value?: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): DataScheme | void {\n\t\tif (!value) return $.get().data as DataScheme | void;\n\n\t\tconst prev = $.get().data;\n\t\tconst val = isFunction(value) ? value(prev as DataScheme) : deepmerge(prev, value);\n\n\t\t$.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Function to get actions\n\t\t */\n\t\taction,\n\t\t/**\n\t\t * State that belongs to games\n\t\t */\n\t\tstate,\n\t\t/**\n\t\t * Unlike `state`, stored at global scope instead and shared between games\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Unwraps translatable content to a string value\n\t\t */\n\t\tunwrap(content: Exclude<Unwrappable<Languages>, Record<string, string>> | Record<Languages, string>) {\n\t\t\treturn unwrap(content, true);\n\t\t},\n\t};\n};\n\nexport { novely };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость Текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи'\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume'\n};\n\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'Жаңа ойын',\n\tHomeScreen: 'Негізгі экран',\n\tToTheGame: 'Ойынға',\n\tLanguage: 'Тіл',\n\tNoSaves: 'Сақтау жоқ',\n\tLoadSave: 'Жүктеу',\n\tSaves: 'Сақтау',\n\tSettings: 'Параметрлер',\n\tSumbit: 'Растау',\n\tGoBack: 'Артқа',\n\tDoSave: 'Сақтау',\n\tAuto: 'Авто',\n\tStop: 'Тоқта',\n\tExit: 'Шығу',\n\tAutomatic: 'Автоматты',\n\tManual: 'Қолмен',\n\tRemove: 'Жою',\n\tLoadASaveFrom: 'Сақтауды жүктеу',\n\tDeleteASaveFrom: 'Сақтауды жою',\n\tTextSpeed: 'Мәтін Жылдамдығы',\n\tTextSpeedSlow: 'Баяу',\n\tTextSpeedMedium: 'Орташа',\n\tTextSpeedFast: 'Жылдам',\n\tTextSpeedAuto: 'Автоматты',\n\tCompleteText: 'Мәтінді аяқтау',\n\tGoForward: 'Алға жылжу',\n\tExitDialogWarning: 'Сіз шыққыңыз келетініне сенімдісіз бе? Прогресс сақталады',\n\tExitDialogExit: 'Шығу',\n\tExitDialogBack: 'Ойынға оралу',\n\tOpenMenu: 'Мәзірді ашыңыз',\n\tCloseMenu: 'Мәзірді жабу',\n\tMusicVolume: 'Музыканың көлемі',\n\tSoundVolume: 'Дыбыстардың көлемі',\n\tVoiceVolume: 'Сөйлеу көлемі'\n};\n\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\n\tNewGame: '「新しいゲーム」',\n\tHomeScreen: 'ホーム画面',\n\tToTheGame: '「ゲームに戻る」',\n\tLanguage: '言語',\n\tNoSaves: 'ノーセーブ',\n\tLoadSave: 'ダウンロード',\n\tSaves: '保存',\n\tSettings: '設定',\n\tSumbit: '確認',\n\tGoBack: '「戻る」',\n\tDoSave: '保存',\n\tAuto: 'オート',\n\tStop: '止まれ',\n\tExit: '出口',\n\tAutomatic: '自動',\n\tManual: 'マニュアル',\n\tRemove: '削除',\n\tLoadASaveFrom: 'ロードセーブから',\n\tDeleteASaveFrom: 'から保存を削除',\n\tTextSpeed: 'テキストスピード',\n\tTextSpeedSlow: '「遅い」',\n\tTextSpeedMedium: 'ミディアム',\n\tTextSpeedFast: '「速い」',\n\tTextSpeedAuto: '自動',\n\tCompleteText: 'テキストを完成させる',\n\tGoForward: '先に行く',\n\tExitDialogWarning: '本当に終了しますか?進行状況は保存されます',\n\tExitDialogExit: '終了',\n\tExitDialogBack: 'ゲームに戻る',\n\tOpenMenu: 'メニューを開く',\n\tCloseMenu: 'メニューを閉じる',\n\tMusicVolume: '音楽のボリューム',\n\tSoundVolume: '音量',\n\tVoiceVolume: 'スピーチの量'\n};\n\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\n"],"mappings":"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","names":["str","str","getLanguage","state","stack","save","characters","action","push","next","unwrap","data","str","prev"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/global.ts","../src/store.ts","../../deepmerge/src/utils.ts","../../deepmerge/src/index.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/json/index.mjs","../src/translation.ts","../src/storage.ts","../src/novely.ts","../src/translations.ts"],"sourcesContent":["import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nexport { SKIPPED_DURING_RESTORE, EMPTY_SET, DEFAULT_TYPEWRITER_SPEED, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS };\n","import type { ActionProxyProvider, CustomHandler, Story, ValidAction } from './action';\nimport type { Character } from './character';\nimport type { Thenable, Path, PathItem } from './types';\nimport { BLOCK_STATEMENTS, BLOCK_EXIT_STATEMENTS, SKIPPED_DURING_RESTORE } from './constants';\n\ntype MatchActionMap = {\n\t[Key in keyof ActionProxyProvider<Record<string, Character>, string>]: (\n\t\tdata: Parameters<ActionProxyProvider<Record<string, Character>, string>[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (value: [handler: CustomHandler]) => Thenable<void>;\n};\n\nconst matchAction = <M extends MatchActionMapComplete>(values: M) => {\n\treturn (action: keyof MatchActionMap, props: any) => {\n\t\treturn values[action](props);\n\t};\n};\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\nconst isCSSImage = (str: string) => {\n\tconst startsWith = String.prototype.startsWith.bind(str);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\nconst str = String;\n\nconst isUserRequiredAction = (\n\taction: keyof MatchActionMapComplete,\n\tmeta: Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n) => {\n\treturn action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction;\n};\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\n/**\n * @copyright Techlead LLC\n * @see https://learn.javascript.ru/task/throttle\n */\nconst throttle = <Fn extends (...args: any[]) => any>(fn: Fn, ms: number) => {\n\tlet throttled = false,\n\t\tsavedArgs: any,\n\t\tsavedThis: any;\n\n\tfunction wrapper(this: any, ...args: any[]) {\n\t\tif (throttled) {\n\t\t\tsavedArgs = args;\n\t\t\t/* eslint-disable @typescript-eslint/no-this-alias */\n\t\t\tsavedThis = this;\n\t\t\treturn;\n\t\t}\n\n\t\tfn.apply(this, args as unknown as any[]);\n\n\t\tthrottled = true;\n\n\t\tsetTimeout(function () {\n\t\t\tthrottled = false;\n\n\t\t\tif (savedArgs) {\n\t\t\t\twrapper.apply(savedThis, savedArgs);\n\t\t\t\tsavedArgs = savedThis = null;\n\t\t\t}\n\t\t}, ms);\n\t}\n\n\treturn wrapper as unknown as (...args: Parameters<Fn>) => void;\n};\n\nconst findLastIndex = <T>(array: T[], fn: (item: T, next?: T) => boolean) => {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tif (fn(array[i], array[i + 1])) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\ntype ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\t// @ts-expect-error Types does not match and this is expected\n\t\tobject.promise = promise;\n\t};\n\n\treturn init(), object;\n};\n\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst index = findLastIndex(path, ([_name, _value], next) => {\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn path[index] as undefined | [null, number];\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\nconst noop = () => {};\n\nconst isAction = (\n\telement: unknown,\n): element is [\n\tkeyof MatchActionMapComplete,\n\t...Parameters<MatchActionMapComplete[keyof MatchActionMapComplete]>,\n] => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`\n */\nconst flattenStory = (story: Story) => {\n\tconst entries = Object.entries(story).map(([name, items]) => {\n\t\tconst flat = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\t\t\treturn item.flatMap((data) => {\n\t\t\t\tconst type = data[0];\n\n\t\t\t\t/**\n\t\t\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t\t\t */\n\t\t\t\tif (Array.isArray(type)) return flat(data as ValidAction[]);\n\n\t\t\t\treturn [data as ValidAction];\n\t\t\t});\n\t\t};\n\n\t\treturn [name, flat(items)];\n\t});\n\n\treturn Object.fromEntries(entries);\n};\n\n/**\n * A wrapper on `fn` to make it run only once!\n * @param fn Function that needed to run no more than one time\n */\nconst once = (fn: () => void) => {\n\tlet ran = false;\n\n\treturn () => {\n\t\tif (ran) return;\n\n\t\tran = true;\n\t\tfn();\n\t};\n};\n\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i++; i < blockStatements.length) {\n\t\tconst b = blockStatements[i][0];\n\t\tconst be = blockExitStatements[i][0];\n\n\t\tif (!b || !be) return false;\n\t\tif (!be.startsWith(b)) return false;\n\t}\n\n\treturn true;\n}\n\nexport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisString,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tnoop,\n\tisAction,\n\tflattenStory,\n\tonce,\n\tisExitImpossible\n};\n","const PRELOADED_ASSETS = new Set<string>();\n\nexport { PRELOADED_ASSETS };\n","type Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, get } as const;\n};\n\nexport { store };\nexport type { Stored };\n","const { isArray } = Array;\nconst { hasOwnProperty, propertyIsEnumerable, getOwnPropertySymbols } = Object;\n\nconst propertyIsOnObject = <T extends Record<PropertyKey, unknown>, K extends PropertyKey>(object: T, property: K): object is T & { [Key in K]: unknown } => {\n\ttry {\n\t\treturn property in object\n\t} catch {\n\t\treturn false\n\t}\n}\n\nconst propertyIsUnsafe = (target: Record<PropertyKey, unknown>, key: PropertyKey) => {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nconst getEnumerableOwnPropertySymbols = (target: Record<PropertyKey, unknown>) => {\n if (!getOwnPropertySymbols) return [];\n\n return getOwnPropertySymbols(target).filter(symbol => propertyIsEnumerable.call(target, symbol))\n}\n\nconst keys = <T extends Record<PropertyKey, unknown>>(target: T): (keyof T)[] => {\n return [...Object.keys(target), ...getEnumerableOwnPropertySymbols(target)];\n}\n\nconst isMergeableObject = (value: unknown): value is Record<PropertyKey, unknown> => {\n return !!value && typeof value === 'object' && !(['RegExp', 'Date'].includes(Object.prototype.toString.call(value).slice(8, -1)));\n}\n\nexport { isArray, propertyIsOnObject, propertyIsUnsafe, getEnumerableOwnPropertySymbols, isMergeableObject, keys }\n","import { isArray, propertyIsOnObject, propertyIsUnsafe, isMergeableObject, keys } from './utils';\n\nconst empty = <T extends (Record<PropertyKey, unknown> | unknown[])>(value: T): T => {\n return (isArray(value) ? [] : {}) as T;\n}\n\nconst clone = <T>(value: T): T => {\n return isMergeableObject(value)\n ? deepmerge(empty(value), value)\n : value;\n}\n\nconst mergeArray = <T>(target: T[], source: T[]) => {\n const destination = target.slice();\n\n source.forEach((item, index) => {\n if (typeof destination[index] === 'undefined') {\n destination[index] = clone(item);\n } else if (isMergeableObject(item)) {\n destination[index] = deepmerge(target[index] as any, item as any);\n } else if (target.indexOf(item) === -1) {\n destination.push(item);\n }\n });\n\n return destination;\n}\n\nconst mergeObject = <T extends Record<PropertyKey, unknown>>(target: T, source: T): T => {\n const destination: Record<PropertyKey, any> = {};\n\n for (const key of keys(target)) {\n destination[key] = clone(target[key]);\n }\n\n for (const key of keys(source)) {\n if (propertyIsUnsafe(target, key)) {\n continue;\n }\n\n if (propertyIsOnObject(target, key) && isMergeableObject(source[key])) {\n destination[key] = deepmerge(target[key] as any, source[key] as any);\n } else {\n destination[key] = clone(source[key]);\n }\n }\n\n return destination as unknown as T;\n}\n\nconst deepmerge = <T extends (Record<PropertyKey, unknown> | unknown[])>(target: T, source: T): T => {\n if (isArray(target) && isArray(source)) {\n const merged = mergeArray(target, source);\n\n return merged as unknown as T;\n } else if (!isArray(target) && !isArray(source)) {\n const merged = mergeObject(target, source);\n\n return merged as unknown as T;\n } else {\n return clone(source);\n }\n}\n\nexport { deepmerge }\n","export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n","type PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent = string | (() => string | string[]) | string[] | (string | (() => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Unwraps any allowed content into string\n * @param c Content\n */\nconst unwrap = (c: AllowedContent): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => unwrap(item)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn unwrap(c());\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tstr: AllowedContent,\n\tobj: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn unwrap(str).replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = obj;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action && actions[action];\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { unwrap, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import type { StorageData } from './types';\n\ninterface LocalStorageStorageSettings {\n\tkey: string;\n}\n\ninterface Storage {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n}\n\nconst localStorageStorage = (options: LocalStorageStorageSettings): Storage => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(options.key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(options.key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { Storage };\nexport { localStorageStorage };\n","import type { Character } from './character';\nimport type {\n\tActionProxyProvider,\n\tGetActionParameters,\n\tStory,\n\tValidAction,\n\tUnwrappable,\n\tCustomHandler,\n} from './action';\nimport type { Storage } from './storage';\nimport type {\n\tSave,\n\tState,\n\tData,\n\tStorageData,\n\tDeepPartial,\n\tNovelyScreen,\n\tMigration,\n\tActionFN,\n\tCoreData,\n} from './types';\nimport type { Renderer, RendererInit } from './renderer';\nimport type { TranslationActions, Pluralization } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport {\n\tmatchAction,\n\tisNumber,\n\tisNull,\n\tisPromise,\n\tisEmpty,\n\tisCSSImage,\n\tstr,\n\tisUserRequiredAction,\n\tgetLanguage as defaultGetLanguage,\n\tthrottle,\n\tisFunction,\n\tfindLastIndex,\n\tcreateControlledPromise,\n\tfindLastPathItemBeforeItemOfType,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAction,\n\tnoop,\n\tflattenStory,\n\tisExitImpossible\n} from './utils';\nimport { PRELOADED_ASSETS } from './global';\nimport { store } from './store';\nimport { deepmerge } from '@novely/deepmerge';\nimport { klona } from 'klona/json';\nimport { EMPTY_SET, DEFAULT_TYPEWRITER_SPEED } from './constants';\nimport { replace as replaceT9N } from './translation';\nimport { localStorageStorage } from './storage';\nimport pLimit from 'p-limit';\n\nimport { DEV } from 'esm-env';\n\ninterface NovelyInit<\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n> {\n\t/**\n\t * An array of languages supported by the game.\n\t */\n\tlanguages: Languages[];\n\t/**\n\t * An object containing the characters in the game.\n\t */\n\tcharacters: Characters;\n\t/**\n\t * An object that provides access to the game's storage system.\n\t * @default localStorage // at key `novely-game-storage`\n\t */\n\tstorage?: Storage;\n\t/**\n\t * Delay loading data until Promise is resolved\n\t */\n\tstorageDelay?: Promise<void>;\n\t/**\n\t * A function that returns a Renderer object used to display the game's content\n\t */\n\trenderer: (characters: RendererInit) => Renderer;\n\t/**\n\t * An optional property that specifies the initial screen to display when the game starts\n\t */\n\tinitialScreen?: NovelyScreen;\n\t/**\n\t * An object containing the translation functions used in the game\n\t */\n\ttranslation: Record<\n\t\tLanguages,\n\t\t{\n\t\t\tinternal: Record<BaseTranslationStrings, string>;\n\t\t\t/**\n\t\t\t * IETF BCP 47 language tag\n\t\t\t */\n\t\t\ttag?: string;\n\t\t\tplural?: Record<string, Pluralization>;\n\t\t\tactions?: TranslationActions;\n\t\t}\n\t>;\n\t/**\n\t * Initial state value\n\t */\n\tstate?: StateScheme;\n\t/**\n\t * Initial data value\n\t */\n\tdata?: DataScheme;\n\t/**\n\t * Enable autosaves or disable\n\t * @default true\n\t */\n\tautosaves?: boolean;\n\t/**\n\t * Migration from old saves to newer\n\t */\n\tmigrations?: Migration[];\n\t/**\n\t * For saves Novely uses `throttle` function. This might be needed if you want to control frequency of saves to the storage\n\t * @default 799\n\t */\n\tthrottleTimeout?: number;\n\t/**\n\t * Custom language detector\n\t * @param languages Supported languages aka `languages: []` in the config\n\t * @example ```ts\n\t * novely({\n\t * \t\tgetLanguage(languages, original) {\n\t * \t\t\t\tif (!sdk) return original(languages);\n\t * \t\t\t\treturn sdk.environment.i18n.lang // i.e. custom language from some sdk\n\t * \t\t}\n\t * })\n\t * ```\n\t */\n\tgetLanguage?: (languages: string[], original: typeof defaultGetLanguage) => string;\n\t/**\n\t * Ignores saved language, and uses `getLanguage` to get it on every engine start\n\t * @default false\n\t */\n\toverrideLanguage?: boolean;\n\t/**\n\t * Show a prompt before exiting a game\n\t * @default true\n\t */\n\taskBeforeExit?: boolean;\n\t/**\n\t * @default \"lazy\"\n\t */\n\tpreloadAssets?: 'lazy' | 'blocking';\n}\n\nconst novely = <\n\tLanguages extends string,\n\tCharacters extends Record<string, Character<Languages>>,\n\tStateScheme extends State,\n\tDataScheme extends Data,\n>({\n\tcharacters,\n\tstorage = localStorageStorage({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tlanguages,\n\tstate: defaultState,\n\tdata: defaultData,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 799,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'lazy',\n}: NovelyInit<Languages, Characters, StateScheme, DataScheme>) => {\n\tconst limitScript = pLimit(1);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst ASSETS_TO_PRELOAD = new Set<string>();\n\tconst assetsLoaded = createControlledPromise();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet scriptCalled = false;\n\n\t/**\n\t * Prevent `undefined`\n\t */\n\tdefaultData ||= {} as DataScheme;\n\tdefaultState ||= {} as StateScheme;\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\tObject.assign(story, flattenStory(part));\n\n\t\tif (preloadAssets === 'blocking' && ASSETS_TO_PRELOAD.size > 0) {\n\t\t\trenderer.ui.showScreen('loading');\n\n\t\t\tawait renderer.misc.preloadImagesBlocking(ASSETS_TO_PRELOAD);\n\t\t}\n\n\t\tconst screen = renderer.ui.getScreen();\n\t\tconst nextScreen = (scriptCalled ? screen : initialScreen) as NovelyScreen;\n\n\t\tASSETS_TO_PRELOAD.clear();\n\t\tassetsLoaded.resolve();\n\n\t\tif (nextScreen === 'game') {\n\t\t\tawait assetsLoaded.promise;\n\t\t\tawait dataLoaded.promise;\n\n\t\t\tif (!scriptCalled) {\n\t\t\t\trestore();\n\t\t\t}\n\t\t} else {\n\t\t\trenderer.ui.showScreen(nextScreen);\n\t\t}\n\n\t\tscriptCalled = true;\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t}\n\n\tconst action = new Proxy({} as ActionProxyProvider<Characters, Languages>, {\n\t\tget(_, prop) {\n\t\t\treturn (...props: Parameters<ActionFN>) => {\n\t\t\t\tif (preloadAssets === 'blocking') {\n\t\t\t\t\t/**\n\t\t\t\t\t * Load backgrounds\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showBackground' && typeof props[0] === 'string' && isCSSImage(props[0])) {\n\t\t\t\t\t\tASSETS_TO_PRELOAD.add(props[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Load characters\n\t\t\t\t\t */\n\t\t\t\t\tif (prop === 'showCharacter' && typeof props[0] === 'string' && typeof props[1] === 'string') {\n\t\t\t\t\t\tconst images = characters[props[0]].emotions[props[1]];\n\n\t\t\t\t\t\tif (Array.isArray(images)) {\n\t\t\t\t\t\t\tfor (const asset of images) {\n\t\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(asset);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tASSETS_TO_PRELOAD.add(images)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [prop, ...props];\n\t\t\t};\n\t\t},\n\t});\n\n\tfunction state(value: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): void;\n\tfunction state(): StateScheme;\n\tfunction state(value?: DeepPartial<StateScheme> | ((prev: StateScheme) => StateScheme)): StateScheme | void {\n\t\tif (!value) return stack.value[1] as StateScheme | void;\n\n\t\tconst prev = stack.value[1];\n\t\tconst val = isFunction(value) ? value(prev as StateScheme) : deepmerge(prev, value);\n\n\t\tstack.value[1] = val as StateScheme;\n\t}\n\n\tconst getDefaultSave = (state = {}) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', 'start'],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t] as Save;\n\t};\n\n\tconst createStack = (current: Save, stack = [current]) => {\n\t\treturn {\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value: Save) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\t\t\tback() {\n\t\t\t\tif (stack.length > 1) stack.pop(), (goingBack = true);\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack = [getDefaultSave(klona(defaultState))];\n\t\t\t},\n\t\t};\n\t};\n\n\tconst getLanguageWithoutParameters = () => {\n\t\treturn getLanguage(languages, defaultGetLanguage);\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData = {\n\t\tsaves: [],\n\t\tdata: klona(defaultData) as Data,\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst coreData: CoreData = {\n\t\tdataLoaded: false,\n\t};\n\n\tconst $ = store(initialData);\n\tconst $$ = store(coreData);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif ($$.get().dataLoaded) storage.set(value);\n\t};\n\n\tconst throttledOnStorageDataChange = throttle(onStorageDataChange, throttleTimeout);\n\tconst throttledEmergencyOnStorageDataChange = throttle(() => {\n\t\tonStorageDataChange($.get());\n\t}, 10);\n\n\t$.subscribe(throttledOnStorageDataChange);\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= DEFAULT_TYPEWRITER_SPEED;\n\n\t\tif (overrideLanguage) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t} else {\n\t\t\tstored.meta[0] ||= getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\t$$.update((prev) => ((prev.dataLoaded = true), prev));\n\t\tdataLoaded.resolve();\n\n\t\t/**\n\t\t * Yay\n\t\t */\n\t\t$.update(() => stored);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(klona(defaultState));\n\tconst stack = createStack(initial);\n\n\t/**\n\t * Try to save data when page is switched\n\t */\n\taddEventListener('visibilitychange', () => {\n\t\tif (document.visibilityState === 'hidden') {\n\t\t\tthrottledEmergencyOnStorageDataChange();\n\t\t}\n\t});\n\n\t/**\n\t * Try to save data when page is going to be unloaded\n\t */\n\taddEventListener('beforeunload', throttledEmergencyOnStorageDataChange);\n\n\tconst save = (override = false, type: Save[2][1] = override ? 'auto' : 'manual') => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\tconst current = klona(stack.value);\n\n\t\t$.update((prev) => {\n\t\t\t/**\n\t\t\t * Find latest save that were created in current session, and check if it is latest in an array\n\t\t\t *\n\t\t\t * We check if save was created in current session and it is latest in array\n\t\t\t * When it is not then replacing it will break logical chain\n\t\t\t *\n\t\t\t * [auto save 1]\n\t\t\t * [manual save 1]\n\t\t\t * [auto save 2] <- should not replace first auto save\n\t\t\t */\n\t\t\tconst isLatest = findLastIndex(prev.saves, (value) => times.has(value[2][0])) === prev.saves.length - 1;\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\tif (!override || !isLatest) {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst latest = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * When that save is the same type, replace it\n\t\t\t */\n\t\t\tif (latest && latest[2][1] === type) {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\t\t\t} else {\n\t\t\t\tprev.saves.push(current);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\tconst newGame = () => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(klona(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\t$.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\trestore(save);\n\t};\n\n\t/**\n\t * Set's the save\n\t */\n\tconst set = (save: Save) => {\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet restoring = false;\n\tlet goingBack = false;\n\tlet interacted = 0;\n\n\t/**\n\t * Restore\n\t */\n\tconst restore = async (save?: Save) => {\n\t\tif (!$$.get().dataLoaded) return;\n\n\t\tlet latest = save || $.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no game, then make a new game\n\t\t */\n\t\tif (!latest) {\n\t\t\t$.update(() => ({\n\t\t\t\tsaves: [initial],\n\t\t\t\tdata: klona(defaultData) as Data,\n\t\t\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t\t\t}));\n\n\t\t\tlatest = klona(initial);\n\t\t}\n\n\t\t(restoring = true), (stack.value = latest);\n\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Current item in the story\n\t\t */\n\t\tlet current: any = story;\n\t\t/**\n\t\t * Previous `current` value\n\t\t */\n\t\tlet precurrent: any;\n\t\t/**\n\t\t * Should we ignore some actions\n\t\t */\n\t\tlet ignoreNested = false;\n\n\t\t/**\n\t\t * Current item of type `[null, int]`\n\t\t */\n\t\tlet index = 0;\n\n\t\t/**\n\t\t * Cound of items of type `[null, int]`\n\t\t */\n\t\tconst max = stack.value[0].reduce((acc, [type, val]) => {\n\t\t\tif (isNull(type) && isNumber(val)) {\n\t\t\t\treturn acc + 1;\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, 0);\n\n\t\tconst queue = [] as [any, any][];\n\t\tconst keep = new Set();\n\t\tconst characters = new Set();\n\t\tconst blocks = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\n\t\t\t\tif (isNumber(val)) {\n\t\t\t\t\tindex++;\n\n\t\t\t\t\tlet startIndex = 0;\n\n\t\t\t\t\tif (ignoreNested) {\n\t\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), 'block');\n\n\t\t\t\t\t\tif (prev) {\n\t\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\t\tignoreNested = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t\t */\n\t\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t\t * But is should not happen\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\t\tconst [action, ...meta] = item;\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Add item to queue and action to keep\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst push = () => {\n\t\t\t\t\t\t\tkeep.add(action);\n\t\t\t\t\t\t\tqueue.push([action, meta]);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Do not remove characters that will be here anyways\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (action === 'showCharacter') characters.add(meta[0]);\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Экшены, для закрытия которых пользователь должен с ними взаимодействовать\n\t\t\t\t\t\t * Также в эту группу входят экшены, которые не должны быть вызваны при восстановлении\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (isSkippedDuringRestore(action) || isUserRequiredAction(action, meta)) {\n\t\t\t\t\t\t\tif (index === max && i === val) {\n\t\t\t\t\t\t\t\tpush();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpush();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[val + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t\tignoreNested = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Run these exactly before the main loop.\n\t\t */\n\t\trenderer.ui.showScreen('game');\n\t\t/**\n\t\t * Provide the `keep` in there\n\t\t */\n\t\tmatch('clear', [keep, characters]);\n\n\t\t/**\n\t\t * Get the next actions array.\n\t\t */\n\t\tconst next = (i: number) => queue.slice(i + 1);\n\n\t\tfor await (const [i, [action, meta]] of queue.entries()) {\n\t\t\tif (action === 'function' || action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * When `callOnlyLatest` is `true`\n\t\t\t\t */\n\t\t\t\tif (action === 'custom' && (meta as GetActionParameters<'Custom'>)[0].callOnlyLatest) {\n\t\t\t\t\t/**\n\t\t\t\t\t * We'll calculate it is `latest` or not\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = next(i).some(([, _meta]) => {\n\t\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t\tconst c0 = _meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\t\t\t\t\t\tconst c1 = meta[0] as unknown as GetActionParameters<'Custom'>[0];\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Also check for `undefined`\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst isIdenticalID = c0.id && c1.id && c0.id === c1.id;\n\t\t\t\t\t\tconst isIdenticalByReference = c0 === c1;\n\n\t\t\t\t\t\treturn isIdenticalID || isIdenticalByReference || str(c0) === str(c1);\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Action can return Promise.\n\t\t\t\t */\n\t\t\t\tconst result = match(action, meta);\n\n\t\t\t\t/**\n\t\t\t\t * Should wait until it resolved\n\t\t\t\t */\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Await it!\n\t\t\t\t\t */\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t} else if (action === 'showCharacter') {\n\t\t\t\tconst skip = next(i).some(([_action, _meta]) => {\n\t\t\t\t\t/**\n\t\t\t\t\t * Проверка на возможный `undefined`\n\t\t\t\t\t */\n\t\t\t\t\tif (!_meta || !meta) return false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Будет ли персонаж скрыт в будущем\n\t\t\t\t\t * Нет смысла при загрузке сохранения загружать и отрисовывать персонажа, который будет скрыт\n\t\t\t\t\t */\n\t\t\t\t\tconst hidden = _action === 'hideCharacter' && _meta[0] === meta[0];\n\t\t\t\t\t/**\n\t\t\t\t\t * Не нужно запускать рендер персонажа, если после этого будет ещё один рендер этого персонажа\n\t\t\t\t\t * Таким образом избегаем ситуации, когда при загрузке вследствие гонки при загрузки изображений отрисовывается не последняя эмоция\n\t\t\t\t\t */\n\t\t\t\t\tconst notLatest = _action === action && _meta[0] === meta[0];\n\n\t\t\t\t\treturn hidden || notLatest;\n\t\t\t\t});\n\n\t\t\t\tif (skip) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else if (action === 'showBackground' || action === 'animateCharacter' || action === 'preload') {\n\t\t\t\t/**\n\t\t\t\t * @todo: Также сравнивать персонажей в animateCharacter. Чтобы не просто последний запускался, а последний для персонажа.\n\t\t\t\t * Тем не менее таким образом могут быть лишнии анимации.\n\t\t\t\t * Можно проверить, что одна анимация идёт сразу за другой, а не через, например, dialog\n\t\t\t\t */\n\n\t\t\t\t/**\n\t\t\t\t * Такая же оптимизация применяется к фонам и анимированию персонажей, и `preload`.\n\t\t\t\t * Если фон изменится, то нет смысла устанавливать или предзагружать текущий\n\t\t\t\t */\n\t\t\t\tconst notLatest = next(i).some(([_action]) => action === _action);\n\n\t\t\t\tif (notLatest) continue;\n\n\t\t\t\tmatch(action, meta);\n\t\t\t} else {\n\t\t\t\tmatch(action, meta);\n\t\t\t}\n\t\t}\n\n\t\t(restoring = goingBack = false), render();\n\t};\n\n\tconst refer = (path = stack.value[0]) => {\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tfor (const [type, val] of path) {\n\t\t\tif (type === 'jump') {\n\t\t\t\tprecurrent = story;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === null) {\n\t\t\t\tprecurrent = current;\n\t\t\t\tcurrent = current[val];\n\t\t\t} else if (type === 'choice') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t} else if (type === 'condition') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = current[2][val];\n\t\t\t} else if (type === 'block') {\n\t\t\t\tblocks.push(precurrent);\n\t\t\t\tcurrent = story[val];\n\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\tcurrent = blocks.pop();\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false) => {\n\t\tif (interacted > 1 && !force && askBeforeExit) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = stack.value;\n\n\t\tstack.clear();\n\t\trenderer.ui.showScreen('mainmenu');\n\t\trenderer.audio.destroy();\n\n\t\t/**\n\t\t * First two save elements and it's type\n\t\t */\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\t$.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\n\tconst back = () => {\n\t\treturn stack.back(), restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | Languages) => {\n\t\treturn translation[lang as Languages].internal[key];\n\t};\n\n\tconst renderer = createRenderer({\n\t\tcharacters,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tstack,\n\t\tlanguages,\n\t\t$,\n\t\t$$,\n\t});\n\n\trenderer.ui.start();\n\n\tconst match = matchAction({\n\t\twait([time]) {\n\t\t\tif (!restoring) setTimeout(push, isFunction(time) ? time() : time);\n\t\t},\n\t\tshowBackground([background]) {\n\t\t\trenderer.background(background);\n\t\t\tpush();\n\t\t},\n\t\tplayMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music', true).play();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic([source]) {\n\t\t\trenderer.audio.music(source, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound([source, loop]) {\n\t\t\trenderer.audio.music(source, 'sound', loop || false).play();\n\t\t\tpush();\n\t\t},\n\t\tstopSound([source]) {\n\t\t\trenderer.audio.music(source, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice([source]) {\n\t\t\trenderer.audio.voice(source);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice() {\n\t\t\trenderer.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter([character, emotion, className, style]) {\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`)\n\t\t\t}\n\n\t\t\tconst handle = renderer.character(character);\n\n\t\t\thandle.append(className, style, restoring);\n\t\t\thandle.withEmotion(emotion)();\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter([character, className, style, duration]) {\n\t\t\trenderer.character(character).remove(className, style, duration)(push, restoring);\n\t\t},\n\t\tdialog([character, content, emotion]) {\n\t\t\t/**\n\t\t\t * Person name\n\t\t\t */\n\t\t\tconst name = (() => {\n\t\t\t\tconst c = character;\n\t\t\t\tconst cs = characters;\n\t\t\t\tconst lang = $.get().meta[0];\n\n\t\t\t\tif (c && c in cs) {\n\t\t\t\t\tconst block = cs[c].name;\n\n\t\t\t\t\tif (typeof block === 'string') {\n\t\t\t\t\t\treturn block;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (lang in block) {\n\t\t\t\t\t\treturn block[lang as Languages];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn c || '';\n\t\t\t})();\n\n\t\t\tconst run = renderer.dialog(unwrap(content), unwrap(name), character, emotion);\n\n\t\t\trun(forward, goingBack);\n\t\t},\n\t\tfunction([fn]) {\n\t\t\tconst result = fn(restoring, goingBack);\n\n\t\t\tif (!restoring) result ? result.then(push) : push();\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice([question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Первый элемент может быть как строкой, так и элементов выбора\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as [Unwrappable<Languages>, ValidAction[], () => boolean]);\n\t\t\t\t/**\n\t\t\t\t * Значит, текст не требуется\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst unwrapped = choices.map(([content, action, visible]) => {\n\t\t\t\tif (DEV && action.length === 0 && (!visible || visible())) {\n\t\t\t\t\tconsole.warn(`Choice children should not be empty, either add content there or make item not selectable`)\n\t\t\t\t}\n\n\t\t\t\treturn [unwrap(content), action, visible] as [string, ValidAction[], () => boolean];\n\t\t\t});\n\n\t\t\tif (DEV && unwrapped.length === 0) {\n\t\t\t\tthrow new Error(`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`)\n\t\t\t}\n\n\t\t\tconst run = renderer.choices(unwrap(question), unwrapped);\n\n\t\t\trun((selected) => {\n\t\t\t\tenmemory();\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !unwrapped[selected + offset]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable')\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender();\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tmatch('clear', []);\n\t\t},\n\t\tclear([keep, characters]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\trenderer.clear(goingBack, keep || EMPTY_SET, characters || EMPTY_SET)(push);\n\n\t\t\trenderer.audio.clear();\n\t\t},\n\t\tcondition([condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tconst val = String(condition());\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`)\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\t/**\n\t\t\t * Clear the Scene\n\t\t\t */\n\t\t\trenderer.vibrate(0);\n\t\t\t/**\n\t\t\t * No-op used there because using push will make an infinite loop\n\t\t\t */\n\t\t\trenderer.clear(goingBack, EMPTY_SET, EMPTY_SET)(noop);\n\n\t\t\t/**\n\t\t\t * Go to the main menu\n\t\t\t */\n\t\t\trenderer.ui.showScreen('mainmenu');\n\t\t\t/**\n\t\t\t * Reset interactive value\n\t\t\t */\n\t\t\tinteractivity(false);\n\t\t\t/**\n\t\t\t * Reset session times\n\t\t\t */\n\t\t\ttimes.clear();\n\t\t},\n\t\tinput([question, onInput, setup]) {\n\t\t\trenderer.input(unwrap(question), onInput, setup)(forward);\n\t\t},\n\t\tcustom([handler]) {\n\t\t\tconst result = renderer.custom(handler, goingBack, () => {\n\t\t\t\tif (!restoring && handler.requireUserAction) enmemory(), interactivity(true);\n\t\t\t\tif (!restoring) push();\n\t\t\t});\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate(pattern) {\n\t\t\trenderer.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext() {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter([character, timeout, ...classes]) {\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]')\n\t\t\t}\n\n\t\t\tif (DEV && (timeout <= 0 || !Number.isFinite(timeout) || Number.isNaN(timeout))) {\n\t\t\t\tthrow new Error('Attempt to use AnimateCharacter with unacceptable timeout. It should be finite and greater than zero')\n\t\t\t}\n\n\t\t\tconst handler: CustomHandler = (get) => {\n\t\t\t\tconst { clear } = get('@@internal-animate-character', false);\n\t\t\t\tconst char = renderer.store.characters[character];\n\n\t\t\t\t/**\n\t\t\t\t * Character is not defined, maybe, `animateCharacter` was called before `showCharacter` OR character was not just loaded yet\n\t\t\t\t */\n\n\t\t\t\tif (!char) return;\n\n\t\t\t\tconst target = char.canvas;\n\n\t\t\t\t/**\n\t\t\t\t * Character is not found\n\t\t\t\t */\n\t\t\t\tif (!target) return;\n\n\t\t\t\tconst classNames = classes.filter((className) => !target.classList.contains(className));\n\n\t\t\t\ttarget.classList.add(...classNames);\n\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\t\t\t\t}, timeout);\n\n\t\t\t\tclear(() => {\n\t\t\t\t\ttarget.classList.remove(...classNames);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Clear timeout, because when you will game re-runs some callback might remove classes from character\n\t\t\t\t\t */\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * `callOnlyLatest` property will not have any effect, because `custom` is called directly\n\t\t\t */\n\t\t\tmatch('custom', [handler]);\n\t\t},\n\t\ttext(text) {\n\t\t\tconst string = text.map((content) => unwrap(content)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`)\n\t\t\t}\n\n\t\t\trenderer.text(string, forward, goingBack);\n\t\t},\n\t\texit() {\n\t\t\tif (restoring) return;\n\n\t\t\tconst path = stack.value[0];\n\t\t\tconst last = path.at(-1);\n\t\t\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\t\t\t/**\n\t\t\t * - should be an array\n\t\t\t * - first element is action name\n\t\t\t */\n\t\t\tif (!isAction(refer(path))) {\n\t\t\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\t\t\tlast[1]--;\n\t\t\t\t} else {\n\t\t\t\t\tpath.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isExitImpossible(path)) {\n\t\t\t\tconst referred = refer(path);\n\n\t\t\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\t\t\tmatch('end', []);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let i = path.length - 1; i > 0; i--) {\n\t\t\t\tconst [name] = path[i];\n\n\t\t\t\t/**\n\t\t\t\t * Remember already exited paths\n\t\t\t\t */\n\t\t\t\tif (isBlockExitStatement(name)) {\n\t\t\t\t\tignore.push(name);\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Ignore everything that we do not need there\n\t\t\t\t */\n\t\t\t\tif (!isBlockStatement(name)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * When we found an already exited path we remove it from the list\n\t\t\t\t */\n\t\t\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\t\t\tignore.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Exit from the path\n\t\t\t\t */\n\t\t\t\tpath.push([`${name}:exit`]);\n\n\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t\t\t/**\n\t\t\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t\t\t */\n\t\t\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t\t\t/**\n\t\t\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t\t\t *\n\t\t\t\t * - remove that item\n\t\t\t\t * - close another block\n\t\t\t\t */\n\t\t\t\tif (!isAction(refer(path))) {\n\t\t\t\t\tpath.pop();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\trender();\n\t\t},\n\t\tpreload([source]) {\n\t\t\tif (!goingBack && !restoring && !PRELOADED_ASSETS.has(source)) {\n\t\t\t\t/**\n\t\t\t\t * Make image load\n\t\t\t\t */\n\t\t\t\tPRELOADED_ASSETS.add(renderer.misc.preloadImage(source));\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock([scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`)\n\t\t\t}\n\n\t\t\tif (!restoring) {\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender();\n\t\t\t}\n\t\t},\n\t});\n\n\tconst enmemory = () => {\n\t\tif (restoring) return;\n\n\t\tconst current = klona(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave(true, 'auto');\n\t};\n\n\tconst next = () => {\n\t\tconst path = stack.value[0];\n\n\t\t/**\n\t\t * Last path element\n\t\t */\n\t\tconst last = path.at(-1);\n\n\t\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\t\tlast[1]++;\n\t\t} else {\n\t\t\tpath.push([null, 0]);\n\t\t}\n\t};\n\n\tconst render = () => {\n\t\tconst referred = refer();\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props);\n\t\t} else {\n\t\t\tmatch('exit', []);\n\t\t}\n\t};\n\n\tconst push = () => {\n\t\tif (!restoring) next(), render();\n\t};\n\n\tconst forward = () => {\n\t\tenmemory();\n\t\tpush();\n\t\tinteractivity(true);\n\t};\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Unwraps translatable content to string\n\t *\n\t * @example ```\n\t * unwrap({ en: 'Hello', ru: 'Привет' });\n\t * unwrap({ en: () => data().ad_viewed ? 'Diamond Hat' : 'Diamond Hat (Watch Adv)' })\n\t * unwrap(() => `Today is ${new Date()}`)\n\t * unwrap('Hello, {{name}}');\n\t * ```\n\t */\n\tconst unwrap = (content: Unwrappable<Languages>, global = false) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = $.get();\n\n\t\tconst obj = global ? data : state();\n\t\tconst cnt = isFunction(content)\n\t\t\t? content()\n\t\t\t: typeof content === 'string'\n\t\t\t ? content\n\t\t\t : content[lang as Languages];\n\n\t\tconst str = isFunction(cnt) ? cnt() : cnt;\n\n\t\tconst trans = translation[lang as Languages];\n\n\t\tif (trans.actions || trans.plural) {\n\t\t\t/**\n\t\t\t * Should kinda work, but creating PluralRules each time is not really efficient\n\t\t\t */\n\t\t\treturn replaceT9N(str, obj, trans.plural, trans.actions, new Intl.PluralRules(trans.tag || lang));\n\t\t}\n\n\t\treturn replaceT9N(str, obj);\n\t};\n\n\tfunction data(value: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): void;\n\tfunction data(): DataScheme;\n\tfunction data(value?: DeepPartial<DataScheme> | ((prev: DataScheme) => DataScheme)): DataScheme | void {\n\t\tif (!value) return $.get().data as DataScheme | void;\n\n\t\tconst prev = $.get().data;\n\t\tconst val = isFunction(value) ? value(prev as DataScheme) : deepmerge(prev, value);\n\n\t\t$.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Function to get actions\n\t\t */\n\t\taction,\n\t\t/**\n\t\t * State that belongs to games\n\t\t */\n\t\tstate,\n\t\t/**\n\t\t * Unlike `state`, stored at global scope instead and shared between games\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Unwraps translatable content to a string value\n\t\t */\n\t\tunwrap(content: Exclude<Unwrappable<Languages>, Record<string, string>> | Record<Languages, string>) {\n\t\t\treturn unwrap(content, true);\n\t\t},\n\t};\n};\n\nexport { novely };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость Текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи'\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume'\n};\n\n/**\n * Translated automatically\n */\nconst KK: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'Жаңа ойын',\n\tHomeScreen: 'Негізгі экран',\n\tToTheGame: 'Ойынға',\n\tLanguage: 'Тіл',\n\tNoSaves: 'Сақтау жоқ',\n\tLoadSave: 'Жүктеу',\n\tSaves: 'Сақтау',\n\tSettings: 'Параметрлер',\n\tSumbit: 'Растау',\n\tGoBack: 'Артқа',\n\tDoSave: 'Сақтау',\n\tAuto: 'Авто',\n\tStop: 'Тоқта',\n\tExit: 'Шығу',\n\tAutomatic: 'Автоматты',\n\tManual: 'Қолмен',\n\tRemove: 'Жою',\n\tLoadASaveFrom: 'Сақтауды жүктеу',\n\tDeleteASaveFrom: 'Сақтауды жою',\n\tTextSpeed: 'Мәтін Жылдамдығы',\n\tTextSpeedSlow: 'Баяу',\n\tTextSpeedMedium: 'Орташа',\n\tTextSpeedFast: 'Жылдам',\n\tTextSpeedAuto: 'Автоматты',\n\tCompleteText: 'Мәтінді аяқтау',\n\tGoForward: 'Алға жылжу',\n\tExitDialogWarning: 'Сіз шыққыңыз келетініне сенімдісіз бе? Прогресс сақталады',\n\tExitDialogExit: 'Шығу',\n\tExitDialogBack: 'Ойынға оралу',\n\tOpenMenu: 'Мәзірді ашыңыз',\n\tCloseMenu: 'Мәзірді жабу',\n\tMusicVolume: 'Музыканың көлемі',\n\tSoundVolume: 'Дыбыстардың көлемі',\n\tVoiceVolume: 'Сөйлеу көлемі'\n};\n\n/**\n * Translated automatically\n */\nconst JP: Record<BaseTranslationStrings, string> = {\n\tNewGame: '「新しいゲーム」',\n\tHomeScreen: 'ホーム画面',\n\tToTheGame: '「ゲームに戻る」',\n\tLanguage: '言語',\n\tNoSaves: 'ノーセーブ',\n\tLoadSave: 'ダウンロード',\n\tSaves: '保存',\n\tSettings: '設定',\n\tSumbit: '確認',\n\tGoBack: '「戻る」',\n\tDoSave: '保存',\n\tAuto: 'オート',\n\tStop: '止まれ',\n\tExit: '出口',\n\tAutomatic: '自動',\n\tManual: 'マニュアル',\n\tRemove: '削除',\n\tLoadASaveFrom: 'ロードセーブから',\n\tDeleteASaveFrom: 'から保存を削除',\n\tTextSpeed: 'テキストスピード',\n\tTextSpeedSlow: '「遅い」',\n\tTextSpeedMedium: 'ミディアム',\n\tTextSpeedFast: '「速い」',\n\tTextSpeedAuto: '自動',\n\tCompleteText: 'テキストを完成させる',\n\tGoForward: '先に行く',\n\tExitDialogWarning: '本当に終了しますか?進行状況は保存されます',\n\tExitDialogExit: '終了',\n\tExitDialogBack: 'ゲームに戻る',\n\tOpenMenu: 'メニューを開く',\n\tCloseMenu: 'メニューを閉じる',\n\tMusicVolume: '音楽のボリューム',\n\tSoundVolume: '音量',\n\tVoiceVolume: 'スピーチの量'\n};\n\nexport { RU, EN, KK, JP };\nexport type { BaseTranslationStrings };\n"],"mappings":"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","names":["str","str","getLanguage","state","stack","save","characters","action","push","next","unwrap","data","str","prev"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@novely/core",
3
3
  "description": "Novely - powerful visual novel engine for creating interactive stories and games with branching narratives and rich multimedia content.",
4
- "version": "0.19.2",
4
+ "version": "0.19.3",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "publishConfig": {