@react-shimeji/core 0.2.1 → 0.2.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/loader.ts","../src/behavior.ts","../src/physics.ts","../src/action.ts","../src/mascot.ts","../src/platform.ts","../src/sprite.ts","../src/engine.ts"],"sourcesContent":["/** Framework-agnostic Shimeji engine. */\nexport { ShimejiEngine } from \"./engine\";\n/** Character loading and legacy XML parsing utilities. */\nexport { loadCharacter, normalizeCharacterSpec, parseActionsXml, parseBehaviorsXml } from \"./loader\";\n/** Behavior selection and safe expression utilities. */\nexport { BehaviorController, conditionsMatch, evaluateExpression, selectWeighted } from \"./behavior\";\n/** Low-level action-tree executor. */\nexport { ActionExecutor } from \"./action\";\n/** Geometry and physics helpers. */\nexport { applyGravity, clamp, isOnBorder, isOnBottom, isOnLeft, isOnRight, isOnTop, moveToward } from \"./physics\";\n/** DOM platform geometry utilities. */\nexport { readPlatformRectangles, resolvePlatformElements } from \"./platform\";\nexport type { PlatformRectangle } from \"./platform\";\n/** Sprite resource manager. */\nexport { SpriteManager, isIndividualSprite } from \"./sprite\";\nexport type * from \"./types\";\nexport type { ActionExecutorCallbacks, ActionExecutorOptions } from \"./action\";\nexport type { MascotCallbacks } from \"./mascot\";\nexport type { MascotDomHandle } from \"./dom\";\nexport type { ResolvedSprite, SpriteLease } from \"./sprite\";\n","import { SpriteManager, type SpriteLease } from \"./sprite\";\nimport type { CharacterSpec, MascotState, Rectangle } from \"./types\";\n\n/** DOM nodes and resources owned by one mascot. */\nexport interface MascotDomHandle {\n /** Pointer-interactive mascot wrapper. */\n element: HTMLDivElement;\n /** Child element on which sprite images are painted. */\n spriteElement: HTMLDivElement;\n /** Per-mascot spritesheet URL lease. */\n spriteLease: SpriteLease;\n}\n\n/** Creates and updates all DOM owned by an engine instance. */\nexport class DomManager {\n /** Generated element that contains all mascots. */\n public readonly workArea: HTMLDivElement;\n\n /** Creates an isolated work area inside the supplied host element. */\n public constructor(\n private readonly container: HTMLElement,\n private readonly sprites: SpriteManager,\n workAreaClassName?: string,\n ) {\n const workArea = document.createElement(\"div\");\n workArea.dataset.reactShimejiWorkArea = \"true\";\n if (workAreaClassName) workArea.className = workAreaClassName;\n Object.assign(workArea.style, {\n position: \"absolute\", inset: \"0\", width: \"100%\", height: \"100%\",\n overflow: \"hidden\", pointerEvents: \"none\", zIndex: \"2147483643\",\n });\n this.workArea = workArea;\n this.ensureMounted();\n }\n\n /** Reattaches the work area if application code temporarily removed it. */\n public ensureMounted(): void {\n if (this.workArea.parentElement !== this.container) this.container.appendChild(this.workArea);\n }\n\n /** Returns the current local work-area rectangle. */\n public getBounds(): Rectangle {\n return this.getBoundsFromClientRectangle(this.workArea.getBoundingClientRect());\n }\n\n /** Converts a previously-read work-area client rectangle into local bounds. */\n public getBoundsFromClientRectangle(rectangle: Pick<DOMRect, \"width\" | \"height\">): Rectangle {\n const width = rectangle.width || this.container.clientWidth || window.innerWidth;\n const height = rectangle.height || this.container.clientHeight || window.innerHeight;\n return { x: 0, y: 0, width, height };\n }\n\n /** Creates a mascot node and acquires its spritesheet resource. */\n public createMascot(spec: CharacterSpec, mascotId: string, mascotClassName?: string): MascotDomHandle {\n const spriteLease = this.sprites.acquire(spec.spritesheet);\n const element = document.createElement(\"div\");\n element.dataset.shimejiId = mascotId;\n if (mascotClassName) element.className = mascotClassName;\n Object.assign(element.style, { position: \"absolute\", left: \"0\", top: \"0\", width: \"0\", height: \"0\", pointerEvents: \"auto\", touchAction: \"none\", userSelect: \"none\", willChange: \"transform\" });\n const spriteElement = document.createElement(\"div\");\n Object.assign(spriteElement.style, { position: \"absolute\", left: \"0\", top: \"0\", backgroundRepeat: \"no-repeat\", transformOrigin: \"center center\", pointerEvents: \"none\" });\n element.appendChild(spriteElement);\n this.workArea.appendChild(element);\n return { element, spriteElement, spriteLease };\n }\n\n /** Paints one mascot state into its existing DOM nodes. */\n public render(handle: MascotDomHandle, spec: CharacterSpec, state: MascotState): void {\n const sprite = this.sprites.resolve(spec, handle.spriteLease, state.sprite);\n handle.element.style.transform = `translate3d(${state.x - state.anchorX}px, ${state.y - state.anchorY}px, 0)`;\n handle.spriteElement.style.left = \"0\";\n handle.spriteElement.style.top = \"0\";\n handle.spriteElement.style.transform = `scaleX(${state.lookRight ? -1 : 1})`;\n if (!sprite) return;\n handle.spriteElement.style.backgroundImage = `url(\"${sprite.url.replaceAll('\"', '\\\\\"')}\")`;\n if (sprite.rectangle) {\n handle.spriteElement.style.width = `${sprite.rectangle.width}px`;\n handle.spriteElement.style.height = `${sprite.rectangle.height}px`;\n handle.element.style.width = `${sprite.rectangle.width}px`;\n handle.element.style.height = `${sprite.rectangle.height}px`;\n handle.spriteElement.style.backgroundPosition = `${-sprite.rectangle.x}px ${-sprite.rectangle.y}px`;\n handle.spriteElement.style.backgroundSize = \"auto\";\n } else {\n handle.spriteElement.style.backgroundPosition = \"0 0\";\n handle.spriteElement.style.backgroundSize = \"contain\";\n handle.spriteElement.style.width = \"128px\";\n handle.spriteElement.style.height = \"128px\";\n const definition = Object.values(spec.sprites).find((candidate) => typeof candidate === \"object\" && \"url\" in candidate && candidate.url === sprite.url);\n if (typeof definition === \"object\" && \"width\" in definition && definition.width !== undefined) handle.spriteElement.style.width = `${definition.width}px`;\n if (typeof definition === \"object\" && \"height\" in definition && definition.height !== undefined) handle.spriteElement.style.height = `${definition.height}px`;\n handle.element.style.width = handle.spriteElement.style.width;\n handle.element.style.height = handle.spriteElement.style.height;\n }\n }\n\n /** Removes one mascot node and releases its temporary image URL. */\n public removeMascot(handle: MascotDomHandle): void {\n handle.element.remove();\n handle.spriteLease.release();\n }\n\n /** Removes the work area owned by this manager. */\n public destroy(): void { this.workArea.remove(); }\n}\n","import type {\n ActionDefinition,\n ActionType,\n AnimationDefinition,\n BehaviorDefinition,\n BorderType,\n CharacterSource,\n CharacterSpec,\n LegacyCharacterPack,\n Point,\n Pose,\n SpriteMap,\n} from \"./types\";\n\nconst actionTypeNames: Record<string, ActionType> = {\n Sequence: \"Sequence\", Select: \"Select\", Reference: \"Reference\", Stay: \"Stay\", Animate: \"Animate\", Move: \"Move\", Embedded: \"Embedded\",\n 複合: \"Sequence\", 選択: \"Select\", 参照: \"Reference\", 静止: \"Stay\", 固定: \"Animate\", 移動: \"Move\", 組み込み: \"Embedded\",\n};\nconst borderTypeNames: Record<string, BorderType> = { Floor: \"Floor\", Wall: \"Wall\", Ceiling: \"Ceiling\", 地面: \"Floor\", 壁: \"Wall\", 天井: \"Ceiling\" };\n\nfunction parseJson<T>(value: T | string, label: string): T {\n if (typeof value !== \"string\") return value;\n try { return JSON.parse(value) as T; } catch (error) { throw new TypeError(`Invalid ${label}: ${error instanceof Error ? error.message : String(error)}`); }\n}\n\nfunction attribute(element: Element, ...names: string[]): string | undefined {\n for (const name of names) { const value = element.getAttribute(name); if (value !== null) return value; }\n return undefined;\n}\n\nfunction directChildren(element: Element, ...names: string[]): Element[] {\n const accepted = new Set(names);\n return Array.from(element.children).filter((child) => accepted.has(child.localName) || accepted.has(child.tagName));\n}\n\nfunction parsePoint(value: string | undefined, fallback: Point = { x: 0, y: 0 }): Point {\n if (!value) return fallback;\n const [x = fallback.x, y = fallback.y] = value.split(\",\").map(Number);\n return { x: Number.isFinite(x) ? x : fallback.x, y: Number.isFinite(y) ? y : fallback.y };\n}\n\nfunction requireDomParser(): DOMParser {\n if (typeof DOMParser === \"undefined\") throw new Error(\"XML character packs require the browser DOMParser API; use pre-parsed JSON in non-browser environments\");\n return new DOMParser();\n}\n\nfunction parseDocument(xml: string, label: string): Document {\n const document = requireDomParser().parseFromString(xml.replace(/^\\uFEFF/, \"\"), \"application/xml\");\n const error = document.querySelector(\"parsererror\");\n if (error) throw new TypeError(`Invalid ${label}: ${error.textContent?.trim() ?? \"XML parse error\"}`);\n return document;\n}\n\nfunction actionProperty(element: Element, ...names: string[]): string | undefined { return attribute(element, ...names); }\n\nfunction parseAnimation(element: Element): AnimationDefinition {\n const poses = directChildren(element, \"Pose\", \"ポーズ\").map((pose): Pose => ({\n sprite: attribute(pose, \"Image\", \"画像\") ?? \"/shime1.png\",\n anchor: parsePoint(attribute(pose, \"Anchor\", \"基準座標\"), { x: 64, y: 128 }),\n velocity: parsePoint(attribute(pose, \"Velocity\", \"移動速度\")),\n duration: Number(attribute(pose, \"Duration\", \"長さ\") ?? 1),\n }));\n const condition = attribute(element, \"Condition\", \"条件\");\n return { poses, ...(condition !== undefined && { condition }) };\n}\n\nfunction parseActionElement(element: Element): ActionDefinition {\n const isReference = element.localName === \"ActionReference\" || element.localName === \"動作参照\";\n const rawType = isReference ? \"Reference\" : attribute(element, \"Type\", \"種類\") ?? (directChildren(element, \"Action\", \"動作\", \"ActionReference\", \"動作参照\").length ? \"Sequence\" : \"Animate\");\n const className = attribute(element, \"Class\", \"クラス\");\n const embedType = className?.split(\".\").at(-1);\n const type = actionTypeNames[rawType] ?? (embedType ? \"Embedded\" : \"Animate\");\n const name = attribute(element, \"Name\", \"名前\");\n const condition = actionProperty(element, \"Condition\", \"条件\");\n const borderRaw = actionProperty(element, \"BorderType\", \"Border\", \"枠\");\n const actions = directChildren(element, \"Action\", \"動作\", \"ActionReference\", \"動作参照\").map(parseActionElement);\n const animations = directChildren(element, \"Animation\", \"アニメーション\").map(parseAnimation);\n const result: ActionDefinition = {\n type,\n ...(name !== undefined && { name }),\n ...(embedType !== undefined && { embedType }),\n ...(condition !== undefined && { condition }),\n ...(borderRaw !== undefined && borderTypeNames[borderRaw] !== undefined && { borderType: borderTypeNames[borderRaw] }),\n ...(actions.length > 0 && { actions }),\n ...(animations.length > 0 && { animations }),\n };\n const properties: Array<[keyof ActionDefinition, string | undefined]> = [\n [\"duration\", actionProperty(element, \"Duration\", \"長さ\")], [\"gap\", actionProperty(element, \"Gap\", \"間隔\")], [\"targetX\", actionProperty(element, \"TargetX\", \"目的地X\")],\n [\"targetY\", actionProperty(element, \"TargetY\", \"目的地Y\")], [\"velocity\", actionProperty(element, \"Velocity\", \"速度\")],\n [\"x\", actionProperty(element, \"X\", \"変位X\")], [\"y\", actionProperty(element, \"Y\", \"変位Y\")],\n [\"initialVx\", actionProperty(element, \"InitialVX\", \"InitialVx\", \"初速X\")], [\"initialVy\", actionProperty(element, \"InitialVY\", \"InitialVy\", \"初速Y\")],\n [\"resistanceX\", actionProperty(element, \"ResistanceX\", \"空気抵抗X\")], [\"resistanceY\", actionProperty(element, \"ResistanceY\", \"空気抵抗Y\")],\n [\"gravity\", actionProperty(element, \"Gravity\", \"重力\")], [\"bornX\", actionProperty(element, \"BornX\", \"誕生X\")],\n [\"bornY\", actionProperty(element, \"BornY\", \"誕生Y\")], [\"bornBehavior\", actionProperty(element, \"BornBehavior\", \"誕生時の行動\")],\n [\"ieOffsetX\", actionProperty(element, \"IEOffsetX\", \"IEの端X\")], [\"ieOffsetY\", actionProperty(element, \"IEOffsetY\", \"IEの端Y\")],\n [\"lookRight\", actionProperty(element, \"LookRight\", \"右向き\")],\n ];\n for (const [key, value] of properties) if (value !== undefined) (result as unknown as Record<string, unknown>)[key] = value;\n const loop = actionProperty(element, \"Loop\", \"繰り返し\");\n if (loop !== undefined) result.loop = loop.toLowerCase() === \"true\";\n return result;\n}\n\n/** Parses a legacy `actions.xml` document into normalized action definitions. */\nexport function parseActionsXml(xml: string): ActionDefinition[] {\n const document = parseDocument(xml, \"actions.xml\");\n const lists = Array.from(document.getElementsByTagNameNS(\"*\", \"ActionList\")).concat(Array.from(document.getElementsByTagNameNS(\"*\", \"動作リスト\")));\n const roots = lists.length ? lists : [document.documentElement];\n return roots.flatMap((list) => directChildren(list, \"Action\", \"動作\").map(parseActionElement));\n}\n\nfunction parseBehaviorElement(element: Element, inheritedConditions: readonly string[], groupIndex: number): BehaviorDefinition {\n const condition = attribute(element, \"Condition\", \"条件\");\n const conditions = [...inheritedConditions, ...(condition ? [condition] : [])];\n const nextList = directChildren(element, \"NextBehaviorList\", \"NextBehavior\", \"次の行動リスト\")[0];\n const nextBehaviors = nextList\n ? directChildren(nextList, \"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\").map((child) => parseBehaviorElement(child, conditions, 0))\n : [];\n const reference = element.localName === \"BehaviorReference\" || element.localName === \"BehaviorReferance\" || element.localName === \"行動参照\";\n return {\n type: reference ? \"Reference\" : \"Behavior\",\n name: attribute(element, \"Name\", \"名前\") ?? \"\",\n frequency: Number(attribute(element, \"Frequency\", \"頻度\") ?? 0),\n conditions,\n nextBehaviors,\n groupIndex,\n hidden: (attribute(element, \"Hidden\", \"非表示\") ?? \"false\").toLowerCase() === \"true\",\n };\n}\n\n/** Parses a legacy `behaviors.xml` document into normalized behavior definitions. */\nexport function parseBehaviorsXml(xml: string): BehaviorDefinition[] {\n const document = parseDocument(xml, \"behaviors.xml\");\n const lists = Array.from(document.getElementsByTagNameNS(\"*\", \"BehaviorList\")).concat(Array.from(document.getElementsByTagNameNS(\"*\", \"行動リスト\")));\n const root = lists[0] ?? document.documentElement;\n const behaviors: BehaviorDefinition[] = [];\n let groupIndex = 0;\n for (const child of Array.from(root.children)) {\n if (child.localName === \"Condition\" || child.localName === \"条件\") {\n groupIndex += 1;\n const condition = attribute(child, \"Condition\", \"条件\");\n const inherited = condition ? [condition] : [];\n behaviors.push(...directChildren(child, \"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\").map((element) => parseBehaviorElement(element, inherited, groupIndex)));\n } else if ([\"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\"].includes(child.localName)) {\n behaviors.push(parseBehaviorElement(child, [], 0));\n }\n }\n return behaviors;\n}\n\nfunction isCharacterSpec(value: unknown): value is CharacterSpec {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<CharacterSpec>;\n return typeof candidate.id === \"string\" && Array.isArray(candidate.actions) && Array.isArray(candidate.behaviors) && typeof candidate.sprites === \"object\" && candidate.sprites !== null && (typeof candidate.spritesheet === \"string\" || (typeof Blob !== \"undefined\" && candidate.spritesheet instanceof Blob));\n}\n\n/** Converts a pre-parsed definition or raw XML/JSON legacy bundle to a character specification. */\nexport function normalizeCharacterSpec(input: CharacterSpec | LegacyCharacterPack | unknown): CharacterSpec {\n let candidate: unknown = input;\n if (typeof candidate === \"string\") candidate = parseJson<unknown>(candidate, \"character JSON\");\n if (!candidate || typeof candidate !== \"object\") throw new TypeError(\"Character data must be an object\");\n const record = candidate as Record<string, unknown>;\n if (record.configuration) {\n const configuration = typeof record.configuration === \"string\"\n ? parseJson<Record<string, unknown>>(record.configuration, \"configuration\")\n : record.configuration;\n if (typeof configuration === \"object\") candidate = { ...(configuration as object), ...record };\n }\n const pack = candidate as Partial<LegacyCharacterPack> & Record<string, unknown>;\n const id = typeof pack.id === \"string\" ? pack.id : typeof pack.metadata?.shimeji === \"string\" ? pack.metadata.shimeji : undefined;\n if (!id) throw new TypeError(\"Character specification requires an id\");\n if (pack.actions === undefined || pack.behaviors === undefined || pack.sprites === undefined || pack.spritesheet === undefined) throw new TypeError(`Character '${id}' is missing actions, behaviors, sprites, or spritesheet`);\n const actions = typeof pack.actions === \"string\" && pack.actions.trimStart().startsWith(\"<\") ? parseActionsXml(pack.actions) : parseJson<ActionDefinition[]>(pack.actions, \"actions\");\n const behaviors = typeof pack.behaviors === \"string\" && pack.behaviors.trimStart().startsWith(\"<\") ? parseBehaviorsXml(pack.behaviors) : parseJson<BehaviorDefinition[]>(pack.behaviors, \"behaviors\");\n const sprites = parseJson<SpriteMap>(pack.sprites, \"sprites\");\n const spec: CharacterSpec = {\n id,\n spritesheet: pack.spritesheet,\n sprites,\n actions,\n behaviors,\n ...(typeof pack.name === \"string\" && { name: pack.name }),\n ...(pack.metadata !== undefined && { metadata: pack.metadata }),\n };\n if (!isCharacterSpec(spec)) throw new TypeError(`Character '${id}' could not be normalized`);\n return spec;\n}\n\n/** Loads character JSON from a URL or normalizes an already available character bundle. */\nexport async function loadCharacter(source: CharacterSource): Promise<CharacterSpec> {\n if (typeof source !== \"string\" && !(source instanceof URL)) return normalizeCharacterSpec(source);\n const url = source instanceof URL ? source : new URL(source, typeof document === \"undefined\" ? \"http://localhost/\" : document.baseURI);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Unable to load character '${url}': ${response.status} ${response.statusText}`);\n const spec = normalizeCharacterSpec(await response.json() as unknown);\n if (typeof spec.spritesheet === \"string\" && !/^(?:data:|blob:)/.test(spec.spritesheet)) {\n spec.spritesheet = new URL(spec.spritesheet, url).toString();\n }\n return spec;\n}\n","import type { BehaviorDefinition, CharacterSpec, MascotEnvironment } from \"./types\";\n\ntype TokenKind = \"number\" | \"identifier\" | \"operator\" | \"punctuation\" | \"eof\";\ninterface Token { kind: TokenKind; value: string }\ntype AstNode =\n | { kind: \"literal\"; value: number | boolean }\n | { kind: \"identifier\"; name: string }\n | { kind: \"member\"; object: AstNode; property: string }\n | { kind: \"call\"; callee: AstNode; args: AstNode[] }\n | { kind: \"unary\"; operator: string; argument: AstNode }\n | { kind: \"binary\"; operator: string; left: AstNode; right: AstNode }\n | { kind: \"conditional\"; test: AstNode; consequent: AstNode; alternate: AstNode };\n\nconst forbiddenProperties = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst functions: Record<string, (...args: number[]) => number> = {\n abs: Math.abs, acos: Math.acos, acosh: Math.acosh, asin: Math.asin, asinh: Math.asinh,\n atan: Math.atan, atan2: Math.atan2, atanh: Math.atanh, cbrt: Math.cbrt, ceil: Math.ceil,\n cos: Math.cos, cosh: Math.cosh, exp: Math.exp, expm1: Math.expm1, floor: Math.floor,\n hypot: Math.hypot, log: Math.log, log1p: Math.log1p, log2: Math.log2, log10: Math.log10,\n max: Math.max, min: Math.min, pow: Math.pow, random: (maximum = 1) => Math.random() * maximum,\n round: Math.round, sign: Math.sign, sin: Math.sin, sinh: Math.sinh, sqrt: Math.sqrt,\n tan: Math.tan, tanh: Math.tanh, trunc: Math.trunc,\n};\nconst constants: Record<string, number> = { E: Math.E, PI: Math.PI };\n\nfunction normalizeExpression(source: string): string {\n return source\n .trim()\n .replace(/^(?:#|\\$)\\{/, \"\")\n .replace(/\\}$/, \"\")\n .replace(/Math\\.(random|min|max|abs|floor|ceil|round|sqrt|pow|sin|cos|tan|asin|acos|atan|sinh|cosh|tanh|asinh|acosh|atanh|cbrt|log|log2|log10|exp|expm1|log1p|trunc|sign|hypot|atan2)/g, \"$1\")\n .replace(/Math\\.(PI|E)\\b/g, \"$1\")\n .replace(/Mascot\\./gi, \"mascot.\")\n .replace(/TargetX|目的地X/gi, \"targetX\")\n .replace(/TargetY|目的地Y/gi, \"targetY\")\n .replace(/FootX|足X/gi, \"footX\")\n .replace(/FootY|足Y/gi, \"footY\")\n .replace(/MaxCount/gi, \"maxCount\")\n .replace(/Gap/gi, \"gap\")\n .replace(/\\band\\b/gi, \"&&\")\n .replace(/\\bor\\b/gi, \"||\")\n .replace(/\\bnot\\b/gi, \"!\");\n}\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < source.length) {\n const rest = source.slice(index);\n const whitespace = /^\\s+/.exec(rest);\n if (whitespace) { index += whitespace[0].length; continue; }\n const number = /^(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/i.exec(rest);\n if (number) { tokens.push({ kind: \"number\", value: number[0] }); index += number[0].length; continue; }\n const identifier = /^[A-Za-z_$\\u0080-\\uFFFF][\\w$\\u0080-\\uFFFF]*/u.exec(rest);\n if (identifier) { tokens.push({ kind: \"identifier\", value: identifier[0] }); index += identifier[0].length; continue; }\n const operator = /^(?:===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%^<>!?:.,()])/.exec(rest);\n if (!operator) throw new SyntaxError(`Unexpected token at ${index}`);\n const value = operator[0];\n tokens.push({ kind: value === \"(\" || value === \")\" || value === \",\" || value === \".\" ? \"punctuation\" : \"operator\", value });\n index += value.length;\n }\n tokens.push({ kind: \"eof\", value: \"\" });\n return tokens;\n}\n\nclass Parser {\n private index = 0;\n public constructor(private readonly tokens: Token[]) {}\n public parse(): AstNode {\n const node = this.parseConditional();\n if (this.peek().kind !== \"eof\") throw new SyntaxError(`Unexpected '${this.peek().value}'`);\n return node;\n }\n private peek(): Token { return this.tokens[this.index] ?? { kind: \"eof\", value: \"\" }; }\n private take(value?: string): Token {\n const token = this.peek();\n if (value !== undefined && token.value !== value) throw new SyntaxError(`Expected '${value}'`);\n this.index += 1;\n return token;\n }\n private match(...values: string[]): boolean {\n if (!values.includes(this.peek().value)) return false;\n this.index += 1;\n return true;\n }\n private parseConditional(): AstNode {\n const test = this.parseOr();\n if (!this.match(\"?\")) return test;\n const consequent = this.parseConditional();\n this.take(\":\");\n return { kind: \"conditional\", test, consequent, alternate: this.parseConditional() };\n }\n private parseOr(): AstNode { return this.binary(() => this.parseAnd(), [\"||\"]); }\n private parseAnd(): AstNode { return this.binary(() => this.parseEquality(), [\"&&\"]); }\n private parseEquality(): AstNode { return this.binary(() => this.parseComparison(), [\"==\", \"===\", \"!=\", \"!==\"]); }\n private parseComparison(): AstNode { return this.binary(() => this.parseAdditive(), [\"<\", \"<=\", \">\", \">=\"]); }\n private parseAdditive(): AstNode { return this.binary(() => this.parseMultiplicative(), [\"+\", \"-\"]); }\n private parseMultiplicative(): AstNode { return this.binary(() => this.parsePower(), [\"*\", \"/\", \"%\"]); }\n private parsePower(): AstNode { return this.binary(() => this.parseUnary(), [\"^\"]); }\n private binary(next: () => AstNode, operators: string[]): AstNode {\n let left = next();\n while (operators.includes(this.peek().value)) {\n const operator = this.take().value;\n left = { kind: \"binary\", operator, left, right: next() };\n }\n return left;\n }\n private parseUnary(): AstNode {\n if ([\"!\", \"+\", \"-\"].includes(this.peek().value)) {\n return { kind: \"unary\", operator: this.take().value, argument: this.parseUnary() };\n }\n return this.parsePostfix();\n }\n private parsePostfix(): AstNode {\n let node = this.parsePrimary();\n for (;;) {\n if (this.match(\".\")) {\n const property = this.take();\n if (property.kind !== \"identifier\" || forbiddenProperties.has(property.value)) throw new SyntaxError(\"Unsafe member access\");\n node = { kind: \"member\", object: node, property: property.value };\n } else if (this.match(\"(\")) {\n const args: AstNode[] = [];\n if (!this.match(\")\")) {\n do { args.push(this.parseConditional()); } while (this.match(\",\"));\n this.take(\")\");\n }\n node = { kind: \"call\", callee: node, args };\n } else return node;\n }\n }\n private parsePrimary(): AstNode {\n const token = this.take();\n if (token.kind === \"number\") return { kind: \"literal\", value: Number(token.value) };\n if (token.kind === \"identifier\") {\n if (token.value === \"true\" || token.value === \"false\") return { kind: \"literal\", value: token.value === \"true\" };\n return { kind: \"identifier\", name: token.value };\n }\n if (token.value === \"(\") {\n const node = this.parseConditional();\n this.take(\")\");\n return node;\n }\n throw new SyntaxError(`Unexpected '${token.value}'`);\n }\n}\n\nfunction resolveMember(node: Extract<AstNode, { kind: \"member\" }>, scope: Record<string, unknown>): { owner: unknown; value: unknown } {\n const owner = evaluateNode(node.object, scope);\n if ((typeof owner !== \"object\" && typeof owner !== \"function\") || owner === null) return { owner, value: undefined };\n if (forbiddenProperties.has(node.property)) return { owner, value: undefined };\n return { owner, value: (owner as Record<string, unknown>)[node.property] };\n}\n\nfunction evaluateNode(node: AstNode, scope: Record<string, unknown>): unknown {\n switch (node.kind) {\n case \"literal\": return node.value;\n case \"identifier\": return Object.hasOwn(scope, node.name) ? scope[node.name] : functions[node.name] ?? constants[node.name];\n case \"member\": return resolveMember(node, scope).value;\n case \"call\": {\n const member = node.callee.kind === \"member\" ? resolveMember(node.callee, scope) : undefined;\n const callable = member?.value ?? evaluateNode(node.callee, scope);\n if (typeof callable !== \"function\") throw new TypeError(\"Expression value is not callable\");\n return callable.apply(member?.owner, node.args.map((argument) => evaluateNode(argument, scope)));\n }\n case \"unary\": {\n const value = evaluateNode(node.argument, scope);\n if (node.operator === \"!\") return !value;\n if (node.operator === \"+\") return Number(value);\n return -Number(value);\n }\n case \"conditional\": return evaluateNode(node.test, scope) ? evaluateNode(node.consequent, scope) : evaluateNode(node.alternate, scope);\n case \"binary\": {\n if (node.operator === \"&&\") return Boolean(evaluateNode(node.left, scope)) && Boolean(evaluateNode(node.right, scope));\n if (node.operator === \"||\") return Boolean(evaluateNode(node.left, scope)) || Boolean(evaluateNode(node.right, scope));\n const left = evaluateNode(node.left, scope);\n const right = evaluateNode(node.right, scope);\n switch (node.operator) {\n case \"+\": return Number(left) + Number(right);\n case \"-\": return Number(left) - Number(right);\n case \"*\": return Number(left) * Number(right);\n case \"/\": return Number(left) / Number(right);\n case \"%\": return Number(left) % Number(right);\n case \"^\": return Math.pow(Number(left), Number(right));\n case \"==\": case \"===\": return left === right;\n case \"!=\": case \"!==\": return left !== right;\n case \"<\": return Number(left) < Number(right);\n case \"<=\": return Number(left) <= Number(right);\n case \">\": return Number(left) > Number(right);\n case \">=\": return Number(left) >= Number(right);\n default: return false;\n }\n }\n }\n}\n\nconst expressionCache = new Map<string, AstNode>();\n\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: number): number;\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: boolean): boolean;\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: number | boolean): number | boolean {\n if (expression === undefined) return fallback;\n if (typeof expression !== \"string\") return expression;\n try {\n const normalized = normalizeExpression(expression);\n let ast = expressionCache.get(normalized);\n if (!ast) { ast = new Parser(tokenize(normalized)).parse(); expressionCache.set(normalized, ast); }\n const result = evaluateNode(ast, environment as unknown as Record<string, unknown>);\n if (typeof fallback === \"boolean\") return Boolean(result);\n const numericResult = Number(result);\n return Number.isNaN(numericResult) ? fallback : numericResult;\n } catch { return fallback; }\n}\n\n/** Returns true when every condition in a behavior or action is satisfied. */\nexport function conditionsMatch(conditions: readonly string[], environment: MascotEnvironment): boolean {\n return conditions.every((condition) => evaluateExpression(condition, environment, false));\n}\n\n/** Chooses one item with probability proportional to its non-negative weight. */\nexport function selectWeighted<T>(items: readonly T[], weight: (item: T) => number, random: () => number = Math.random): T | undefined {\n const weighted = items.map((item) => ({ item, weight: Math.max(0, weight(item)) }));\n const total = weighted.reduce((sum, entry) => sum + entry.weight, 0);\n if (total <= 0) return undefined;\n let cursor = random() * total;\n for (const entry of weighted) { cursor -= entry.weight; if (cursor < 0) return entry.item; }\n return weighted.at(-1)?.item;\n}\n\n/** Selects applicable behaviors and resolves legacy behavior references. */\nexport class BehaviorController {\n private previous: BehaviorDefinition | undefined;\n\n /** Creates a behavior selector for a normalized character specification. */\n public constructor(private readonly spec: CharacterSpec, private readonly random: () => number = Math.random) {}\n\n /** Selects an initial behavior, honoring an explicit requested name when possible. */\n public selectInitial(environment: MascotEnvironment, requestedName?: string): BehaviorDefinition | undefined {\n if (requestedName) {\n const requested = this.spec.behaviors.find((behavior) => behavior.name === requestedName);\n if (requested && conditionsMatch(requested.conditions, environment)) return (this.previous = this.resolve(requested));\n }\n const fall = this.findFallBehavior();\n if (fall && !this.isOnAnyBoundary(environment)) return (this.previous = fall);\n return (this.previous = this.choose(this.spec.behaviors, environment));\n }\n\n /** Selects the weighted transition following the current behavior. */\n public selectNext(environment: MascotEnvironment): BehaviorDefinition | undefined {\n const pool = this.previous?.nextBehaviors.length ? this.previous.nextBehaviors : this.spec.behaviors;\n return (this.previous = this.choose(pool, environment) ?? this.findFallBehavior());\n }\n\n /** Replaces selection history so an external interaction can force a behavior. */\n public force(name: string): BehaviorDefinition | undefined {\n const behavior = this.spec.behaviors.find((candidate) => candidate.name === name);\n return (this.previous = behavior ? this.resolve(behavior) : undefined);\n }\n\n private choose(pool: readonly BehaviorDefinition[], environment: MascotEnvironment): BehaviorDefinition | undefined {\n const applicable = pool.filter((behavior) => conditionsMatch(behavior.conditions, environment));\n const chosen = selectWeighted(applicable, (behavior) => behavior.frequency, this.random);\n return chosen ? this.resolve(chosen) : undefined;\n }\n\n private resolve(behavior: BehaviorDefinition): BehaviorDefinition {\n if (behavior.type !== \"Reference\") return behavior;\n const target = this.spec.behaviors.find((candidate) => candidate.type === \"Behavior\" && candidate.name === behavior.name);\n return target ? { ...target, ...behavior, type: \"Behavior\", nextBehaviors: target.nextBehaviors } : { ...behavior, type: \"Behavior\" };\n }\n\n private findFallBehavior(): BehaviorDefinition | undefined {\n return this.spec.behaviors.find((behavior) => behavior.name === \"Fall\" || behavior.name === \"落下する\");\n }\n\n private isOnAnyBoundary(environment: MascotEnvironment): boolean {\n const anchor = environment.mascot.anchor;\n const area = environment.mascot.environment.workArea;\n const activeIE = environment.mascot.environment.activeIE;\n return area.topBorder.isOn(anchor)\n || area.leftBorder.isOn(anchor)\n || area.rightBorder.isOn(anchor)\n || area.bottomBorder.isOn(anchor)\n || (activeIE.visible && (\n activeIE.topBorder.isOn(anchor)\n || activeIE.leftBorder.isOn(anchor)\n || activeIE.rightBorder.isOn(anchor)\n || activeIE.bottomBorder.isOn(anchor)\n ));\n }\n}\n","import type { MascotState, Point, Rectangle } from \"./types\";\n\n/** Clamps a number to an inclusive range. */\nexport function clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(Math.max(value, minimum), maximum);\n}\n\n/** Returns whether a point lies on the top edge of a rectangle. */\nexport function isOnTop(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.x >= rectangle.x - tolerance && point.x <= rectangle.x + rectangle.width + tolerance && Math.abs(point.y - rectangle.y) <= tolerance;\n}\n\n/** Returns whether a point lies on the bottom edge of a rectangle. */\nexport function isOnBottom(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.x >= rectangle.x - tolerance && point.x <= rectangle.x + rectangle.width + tolerance && Math.abs(point.y - rectangle.y - rectangle.height) <= tolerance;\n}\n\n/** Returns whether a point lies on the left edge of a rectangle. */\nexport function isOnLeft(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.y >= rectangle.y - tolerance && point.y <= rectangle.y + rectangle.height + tolerance && Math.abs(point.x - rectangle.x) <= tolerance;\n}\n\n/** Returns whether a point lies on the right edge of a rectangle. */\nexport function isOnRight(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.y >= rectangle.y - tolerance && point.y <= rectangle.y + rectangle.height + tolerance && Math.abs(point.x - rectangle.x - rectangle.width) <= tolerance;\n}\n\n/** Returns whether an anchor satisfies an action's boundary requirement. */\nexport function isOnBorder(\n state: MascotState,\n bounds: Rectangle,\n border: \"Floor\" | \"Wall\" | \"Ceiling\" | undefined,\n platform?: Rectangle,\n): boolean {\n if (!border) return true;\n if (border === \"Floor\") return isOnBottom(state, bounds) || (platform !== undefined && isOnTop(state, platform));\n if (border === \"Ceiling\") return isOnTop(state, bounds) || (platform !== undefined && isOnBottom(state, platform));\n return isOnLeft(state, bounds)\n || isOnRight(state, bounds)\n || (platform !== undefined && (isOnLeft(state, platform) || isOnRight(state, platform)));\n}\n\n/** Advances ballistic motion and clamps the mascot to the work-area boundaries. */\nexport function applyGravity(\n state: MascotState,\n bounds: Rectangle,\n frameScale: number,\n gravity: number,\n resistanceX = 0.05,\n resistanceY = 0.01,\n platform?: Rectangle,\n): boolean {\n const previousY = state.y;\n const nextX = clamp(state.x + state.vx * frameScale, bounds.x, bounds.x + bounds.width);\n const nextY = clamp(state.y + state.vy * frameScale, bounds.y, bounds.y + bounds.height);\n state.x = nextX;\n state.y = nextY;\n state.vx *= Math.max(0, 1 - resistanceX * frameScale);\n state.vy = state.vy * Math.max(0, 1 - resistanceY * frameScale) + gravity * frameScale;\n if (\n platform\n && nextY >= previousY\n && previousY <= platform.y\n && nextY >= platform.y\n && nextX >= platform.x\n && nextX <= platform.x + platform.width\n ) {\n state.y = platform.y;\n state.vy = 0;\n return true;\n }\n if (state.y >= bounds.y + bounds.height) { state.y = bounds.y + bounds.height; state.vy = 0; return true; }\n if (state.x <= bounds.x || state.x >= bounds.x + bounds.width) { state.vx = 0; return true; }\n return false;\n}\n\n/** Moves a mascot toward a target without overshooting it. */\nexport function moveToward(state: MascotState, target: Point, speed: number, frameScale: number): boolean {\n const dx = target.x - state.x;\n const dy = target.y - state.y;\n const distance = Math.hypot(dx, dy);\n if (distance <= Math.max(0.001, speed * frameScale)) {\n state.x = target.x;\n state.y = target.y;\n return true;\n }\n state.x += (dx / distance) * speed * frameScale;\n state.y += (dy / distance) * speed * frameScale;\n return false;\n}\n","import { evaluateExpression } from \"./behavior\";\nimport { applyGravity, clamp, isOnBorder, moveToward } from \"./physics\";\nimport type { ActionDefinition, AnimationDefinition, CharacterSpec, MascotEnvironment, MascotState, Pose, Rectangle } from \"./types\";\n\n/** Callbacks through which embedded actions request engine-level operations. */\nexport interface ActionExecutorCallbacks {\n /** Spawns another mascot from the same character. */\n spawn(position: { x: number; y: number; behaviorName?: string }): void;\n /** Removes the mascot owning this executor. */\n remove(): void;\n}\n\n/** Settings used while interpreting actions. */\nexport interface ActionExecutorOptions {\n /** Duration of one legacy animation unit in milliseconds. */\n frameDuration: number;\n /** Gravity used when a Fall action does not define one. */\n gravity: number;\n}\n\ninterface Runtime {\n tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean;\n}\n\ninterface EvaluatedAction {\n definition: ActionDefinition;\n duration?: number | undefined;\n targetX?: number | undefined;\n targetY?: number | undefined;\n velocity?: number | undefined;\n x?: number | undefined;\n y?: number | undefined;\n initialVx?: number | undefined;\n initialVy?: number | undefined;\n resistanceX?: number | undefined;\n resistanceY?: number | undefined;\n gravity?: number | undefined;\n bornX?: number | undefined;\n bornY?: number | undefined;\n lookRight: boolean;\n}\n\nfunction numeric(value: string | number | undefined, environment: MascotEnvironment): number | undefined {\n return value === undefined ? undefined : evaluateExpression(value, environment, 0);\n}\n\nfunction evaluateAction(definition: ActionDefinition, environment: MascotEnvironment): EvaluatedAction {\n const gap = numeric(definition.gap, environment) ?? 0;\n const scopedEnvironment = { ...environment, gap };\n const targetX = numeric(definition.targetX, scopedEnvironment);\n const initialVx = numeric(definition.initialVx, scopedEnvironment);\n let lookRight = environment.mascot.lookRight;\n if (definition.borderType === \"Wall\") {\n const { activeIE, workArea } = environment.mascot.environment;\n lookRight = workArea.rightBorder.isOn(environment.mascot.anchor)\n || (activeIE.visible && activeIE.leftBorder.isOn(environment.mascot.anchor));\n } else if (definition.type === \"Move\" || definition.embedType === \"Jump\" || definition.embedType === \"WalkWithIE\") {\n if (targetX !== undefined) lookRight = targetX > environment.mascot.anchor.x;\n } else if (definition.embedType === \"Fall\" || definition.embedType === \"FallWithIE\") {\n if (initialVx !== undefined && initialVx !== 0) lookRight = initialVx > 0;\n } else if (definition.embedType === \"Look\") {\n lookRight = definition.lookRight === undefined\n ? !environment.mascot.lookRight\n : typeof definition.lookRight === \"boolean\"\n ? definition.lookRight\n : evaluateExpression(definition.lookRight, scopedEnvironment, environment.mascot.lookRight);\n }\n const duration = numeric(definition.duration, scopedEnvironment);\n const targetY = numeric(definition.targetY, scopedEnvironment);\n const velocity = numeric(definition.velocity, scopedEnvironment);\n const x = numeric(definition.x, scopedEnvironment);\n const y = numeric(definition.y, scopedEnvironment);\n const initialVy = numeric(definition.initialVy, scopedEnvironment);\n const resistanceX = numeric(definition.resistanceX, scopedEnvironment);\n const resistanceY = numeric(definition.resistanceY, scopedEnvironment);\n const gravity = numeric(definition.gravity, scopedEnvironment);\n const bornX = numeric(definition.bornX, scopedEnvironment);\n const bornY = numeric(definition.bornY, scopedEnvironment);\n return {\n definition,\n lookRight,\n ...(duration !== undefined && { duration }),\n ...(targetX !== undefined && { targetX }),\n ...(targetY !== undefined && { targetY }),\n ...(velocity !== undefined && { velocity }),\n ...(x !== undefined && { x }),\n ...(y !== undefined && { y }),\n ...(initialVx !== undefined && { initialVx }),\n ...(initialVy !== undefined && { initialVy }),\n ...(resistanceX !== undefined && { resistanceX }),\n ...(resistanceY !== undefined && { resistanceY }),\n ...(gravity !== undefined && { gravity }),\n ...(bornX !== undefined && { bornX }),\n ...(bornY !== undefined && { bornY }),\n };\n}\n\nclass SequenceRuntime implements Runtime {\n private index = 0;\n private child: Runtime | undefined;\n public constructor(private readonly definitions: readonly ActionDefinition[], private readonly factory: (definition: ActionDefinition, environment: MascotEnvironment) => Runtime, private readonly loop: boolean) {}\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n for (let guard = 0; guard < 32; guard += 1) {\n const definition = this.definitions[this.index];\n if (!definition) {\n if (!this.loop || this.definitions.length === 0) return true;\n this.index = 0;\n continue;\n }\n this.child ??= this.factory(definition, environment);\n if (!this.child.tick(deltaMs, environment, bounds)) return false;\n this.child = undefined;\n this.index += 1;\n deltaMs = 0;\n }\n return false;\n }\n}\n\nclass CompleteRuntime implements Runtime {\n public tick(): boolean { return true; }\n}\n\nclass LeafRuntime implements Runtime {\n private elapsedMs = 0;\n private started = false;\n private spawned = false;\n private readonly animation: AnimationDefinition | undefined;\n private readonly poseDuration: number;\n\n public constructor(\n private readonly action: EvaluatedAction,\n private readonly state: MascotState,\n private readonly options: ActionExecutorOptions,\n private readonly callbacks: ActionExecutorCallbacks,\n environment: MascotEnvironment,\n ) {\n const animationEnvironment = { ...environment, ...(action.targetX !== undefined && { targetX: action.targetX }), ...(action.targetY !== undefined && { targetY: action.targetY }) };\n this.animation = action.definition.animations?.find((animation) => !animation.condition || evaluateExpression(animation.condition, animationEnvironment, false))\n ?? action.definition.animations?.find((animation) => !animation.condition)\n ?? action.definition.animations?.[0];\n this.poseDuration = this.animation?.poses.reduce((sum, pose) => sum + Math.max(0, pose.duration), 0) ?? 0;\n }\n\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n const frameScale = deltaMs / this.options.frameDuration;\n if (!this.started) { this.started = true; this.state.lookRight = this.action.lookRight; this.initialize(); }\n this.elapsedMs += deltaMs;\n const pose = this.currentPose();\n if (pose) this.applyPose(pose, frameScale, bounds);\n\n const { definition } = this.action;\n if (definition.type === \"Embedded\") return this.tickEmbedded(frameScale, environment, bounds);\n if (definition.type === \"Move\" && (this.action.targetX !== undefined || this.action.targetY !== undefined)) {\n const reachedX = this.action.targetX === undefined || Math.abs(this.state.x - this.action.targetX) < 0.5;\n const reachedY = this.action.targetY === undefined || Math.abs(this.state.y - this.action.targetY) < 0.5;\n return reachedX && reachedY;\n }\n return this.elapsedMs >= this.durationMs();\n }\n\n private initialize(): void {\n const type = this.action.definition.embedType;\n if (type === \"Fall\" || type === \"FallWithIE\") {\n this.state.vx = this.action.initialVx ?? this.state.vx;\n this.state.vy = this.action.initialVy ?? this.state.vy;\n }\n if (type === \"Offset\") {\n this.state.x += this.action.x ?? 0;\n this.state.y += this.action.y ?? 0;\n }\n if (type === \"Reboot\") { this.state.vx = 0; this.state.vy = 0; }\n }\n\n private tickEmbedded(frameScale: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n switch (this.action.definition.embedType) {\n case \"Fall\": case \"FallWithIE\": case \"Thrown\":\n return applyGravity(\n this.state,\n bounds,\n frameScale,\n this.action.gravity ?? this.options.gravity,\n this.action.resistanceX,\n this.action.resistanceY,\n environment.mascot.environment.activeIE.visible ? environment.mascot.environment.activeIE : undefined,\n );\n case \"Jump\": {\n const target = { x: this.action.targetX ?? this.state.x, y: this.action.targetY ?? this.state.y };\n return moveToward(this.state, target, this.action.velocity ?? 20, frameScale);\n }\n case \"Breed\":\n if (!this.spawned && this.elapsedMs >= this.durationMs()) {\n this.spawned = true;\n const child = { x: this.state.x + (this.action.bornX ?? 0), y: this.state.y + (this.action.bornY ?? 0) };\n this.callbacks.spawn(this.action.definition.bornBehavior ? { ...child, behaviorName: this.action.definition.bornBehavior } : child);\n return true;\n }\n return false;\n case \"Exit\": this.callbacks.remove(); return true;\n case \"Reboot\":\n this.state.x = bounds.x + 128 + Math.max(0, bounds.width - 256) * Math.random();\n this.state.y = bounds.y + 128 + Math.max(0, bounds.height - 256) * Math.random();\n return true;\n case \"Offset\": case \"Look\": return true;\n case \"Dragged\": return false;\n default: return this.elapsedMs >= this.durationMs();\n }\n }\n\n private currentPose(): Pose | undefined {\n if (!this.animation?.poses.length || this.poseDuration <= 0) return undefined;\n let cursor = (this.elapsedMs / this.options.frameDuration) % this.poseDuration;\n for (const pose of this.animation.poses) { cursor -= pose.duration; if (cursor < 0) return pose; }\n return this.animation.poses.at(-1);\n }\n\n private applyPose(pose: Pose, frameScale: number, bounds: Rectangle): void {\n this.state.sprite = pose.sprite;\n this.state.anchorX = pose.anchor.x;\n this.state.anchorY = pose.anchor.y;\n const direction = this.state.lookRight ? -1 : 1;\n this.state.x = clamp(this.state.x + pose.velocity.x * direction * frameScale, bounds.x, bounds.x + bounds.width);\n this.state.y = clamp(this.state.y + pose.velocity.y * frameScale, bounds.y, bounds.y + bounds.height);\n }\n\n private durationMs(): number {\n const frames = this.action.duration ?? this.poseDuration;\n return Math.max(this.options.frameDuration, frames * this.options.frameDuration);\n }\n}\n\n/** Executes normalized action trees independently from DOM rendering. */\nexport class ActionExecutor {\n private runtime: Runtime | undefined;\n\n /** Creates an executor bound to one mascot's mutable internal state. */\n public constructor(\n private readonly spec: CharacterSpec,\n private readonly state: MascotState,\n private readonly options: ActionExecutorOptions,\n private readonly callbacks: ActionExecutorCallbacks,\n ) {}\n\n /** Starts the action whose name matches a selected behavior. */\n public start(actionName: string, environment: MascotEnvironment): boolean {\n const definition = this.spec.actions.find((action) => action.name === actionName);\n this.runtime = definition ? this.createRuntime(definition, environment, new Set()) : undefined;\n return this.runtime !== undefined;\n }\n\n /** Advances the current action and returns true when it has completed. */\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n return this.runtime?.tick(deltaMs, environment, bounds) ?? true;\n }\n\n /** Cancels the current action tree. */\n public cancel(): void { this.runtime = undefined; }\n\n private createRuntime(definition: ActionDefinition, environment: MascotEnvironment, references: Set<string>): Runtime {\n if (definition.condition && !evaluateExpression(definition.condition, environment, false)) return new CompleteRuntime();\n const bounds = environment.mascot.environment.workArea;\n const activeIE = environment.mascot.environment.activeIE;\n if (!isOnBorder(this.state, bounds, definition.borderType, activeIE.visible ? activeIE : undefined)) return new CompleteRuntime();\n if (definition.type === \"Reference\") {\n if (!definition.name || references.has(definition.name)) return new CompleteRuntime();\n const referenced = this.spec.actions.find((action) => action.name === definition.name);\n if (!referenced) return new CompleteRuntime();\n const nextReferences = new Set(references).add(definition.name);\n return this.createRuntime({ ...referenced, ...definition, type: referenced.type }, environment, nextReferences);\n }\n if (definition.type === \"Sequence\") {\n return new SequenceRuntime(definition.actions ?? [], (child, nextEnvironment) => this.createRuntime(child, nextEnvironment, new Set(references)), definition.loop === true);\n }\n if (definition.type === \"Select\") {\n const child = definition.actions?.find((candidate) => !candidate.condition || evaluateExpression(candidate.condition, environment, false));\n return child ? this.createRuntime(child, environment, new Set(references)) : new CompleteRuntime();\n }\n return new LeafRuntime(evaluateAction(definition, environment), this.state, this.options, this.callbacks, environment);\n }\n}\n","import { ActionExecutor } from \"./action\";\nimport { BehaviorController } from \"./behavior\";\nimport type { DomManager, MascotDomHandle } from \"./dom\";\nimport { isOnBottom, isOnLeft, isOnRight, isOnTop } from \"./physics\";\nimport type { PlatformRectangle } from \"./platform\";\nimport type { BehaviorDefinition, CharacterSpec, EnvironmentEdge, EnvironmentRectangle, MascotEnvironment, MascotState, Point, Rectangle, ShimejiEngineOptions, SpawnOptions } from \"./types\";\n\n/** Callbacks through which a mascot communicates with its owning engine. */\nexport interface MascotCallbacks {\n /** Returns the latest pointer position and velocity in work-area coordinates. */\n pointer(): Point & { dx: number; dy: number };\n /** Returns the current number of live mascots. */\n count(): number;\n /** Requests a sibling mascot. */\n spawn(characterId: string, options: SpawnOptions): void;\n /** Requests removal of this mascot. */\n remove(id: string): void;\n /** Reports a click without a drag gesture. */\n click(state: MascotState): void;\n /** Reports a recoverable runtime failure. */\n error(error: Error): void;\n}\n\nfunction edge(predicate: (point: Point) => boolean): EnvironmentEdge { return { isOn: predicate }; }\n\nfunction environmentRectangle(bounds: Rectangle): EnvironmentRectangle {\n const left = bounds.x;\n const right = bounds.x + bounds.width;\n const top = bounds.y;\n const bottom = bounds.y + bounds.height;\n return {\n x: bounds.x, y: bounds.y, width: bounds.width, height: bounds.height,\n left, right, top, bottom,\n topBorder: edge((point) => isOnTop(point, bounds)),\n leftBorder: edge((point) => isOnLeft(point, bounds)),\n rightBorder: edge((point) => isOnRight(point, bounds)),\n bottomBorder: edge((point) => isOnBottom(point, bounds)),\n };\n}\n\nconst PLATFORM_NEARBY_DISTANCE = 400;\nconst PLATFORM_EDGE_TOLERANCE = 16;\n\nfunction distanceToRectangle(point: Point, rectangle: Rectangle): number {\n const dx = Math.max(rectangle.x - point.x, 0, point.x - rectangle.x - rectangle.width);\n const dy = Math.max(rectangle.y - point.y, 0, point.y - rectangle.y - rectangle.height);\n return Math.hypot(dx, dy);\n}\n\n/** Owns one mascot's state machine, interaction listeners, and DOM resource. */\nexport class Mascot {\n /** Mutable internal state; callers should consume snapshots from the engine. */\n public readonly state: MascotState;\n private readonly domHandle: MascotDomHandle;\n private readonly behavior: BehaviorController;\n private readonly actions: ActionExecutor;\n private readonly disposers: Array<() => void> = [];\n private currentBehavior: BehaviorDefinition | undefined;\n private destroyed = false;\n private dragOffset: Point = { x: 0, y: 0 };\n private pointerId: number | undefined;\n private pointerDown: Point | undefined;\n private lastPointer: Point | undefined;\n private activePlatformElement: HTMLElement | undefined;\n private platforms: readonly PlatformRectangle[] = [];\n\n /** Creates a mascot and immediately installs its pointer handlers. */\n public constructor(\n public readonly id: string,\n public readonly spec: CharacterSpec,\n private readonly dom: DomManager,\n options: Required<Pick<ShimejiEngineOptions, \"frameDuration\" | \"gravity\" | \"mascotClassName\">> & { random: (() => number) | undefined },\n spawnOptions: SpawnOptions,\n private readonly callbacks: MascotCallbacks,\n ) {\n const initialPose = spec.actions.flatMap((action) => action.animations ?? []).flatMap((animation) => animation.poses)[0];\n this.state = {\n id,\n characterId: spec.id,\n x: spawnOptions.x ?? 0,\n y: spawnOptions.y ?? 0,\n vx: spawnOptions.vx ?? 0,\n vy: spawnOptions.vy ?? 0,\n sprite: initialPose?.sprite ?? Object.keys(spec.sprites)[0] ?? \"\",\n anchorX: initialPose?.anchor.x ?? 64,\n anchorY: initialPose?.anchor.y ?? 128,\n lookRight: spawnOptions.lookRight ?? false,\n behaviorName: spawnOptions.behaviorName ?? \"Fall\",\n dragging: false,\n };\n this.domHandle = dom.createMascot(spec, id, options.mascotClassName || undefined);\n this.behavior = new BehaviorController(spec, options.random);\n this.actions = new ActionExecutor(spec, this.state, options, {\n spawn: (position) => this.callbacks.spawn(this.spec.id, position),\n remove: () => this.callbacks.remove(this.id),\n });\n this.installPointerHandlers();\n }\n\n /** Advances behavior, animation, physics, and rendering by one clock tick. */\n public tick(deltaMs: number, bounds: Rectangle, platforms: readonly PlatformRectangle[] = []): void {\n if (this.destroyed) return;\n this.platforms = platforms;\n const environment = this.createEnvironment(bounds, platforms);\n if (this.state.dragging) { this.dom.render(this.domHandle, this.spec, this.state); return; }\n try {\n for (let guard = 0; guard < 8; guard += 1) {\n if (!this.currentBehavior) {\n this.currentBehavior = this.behavior.selectInitial(environment, this.state.behaviorName);\n let started = this.startBehavior(environment);\n if (!started) {\n this.currentBehavior = this.findFallBehavior();\n started = this.startBehavior(environment);\n }\n if (!started) break;\n }\n const activeIE = environment.mascot.environment.activeIE;\n const wasOnPlatformTop = activeIE.visible && activeIE.topBorder.isOn(this.state);\n const completed = this.actions.tick(deltaMs, environment, bounds);\n const remainedNearPlatform = this.state.x >= activeIE.left - PLATFORM_EDGE_TOLERANCE\n && this.state.x <= activeIE.right + PLATFORM_EDGE_TOLERANCE;\n if (wasOnPlatformTop\n && !remainedNearPlatform\n && !platforms.some((platform) => isOnTop(this.state, platform))) {\n this.actions.cancel();\n this.currentBehavior = this.findFallBehavior();\n if (this.currentBehavior) this.startBehavior(this.createEnvironment(bounds, platforms));\n break;\n }\n if (!completed) break;\n if (this.destroyed) return;\n this.currentBehavior = this.behavior.selectNext(this.createEnvironment(bounds, platforms));\n if (!this.currentBehavior || !this.startBehavior(this.createEnvironment(bounds, platforms))) {\n this.currentBehavior = this.findFallBehavior();\n if (!this.currentBehavior || !this.startBehavior(this.createEnvironment(bounds, platforms))) break;\n }\n deltaMs = 0;\n }\n } catch (error) {\n this.callbacks.error(error instanceof Error ? error : new Error(String(error)));\n this.currentBehavior = undefined;\n this.actions.cancel();\n }\n this.dom.render(this.domHandle, this.spec, this.state);\n }\n\n /** Returns a detached snapshot safe for application code to retain. */\n public snapshot(): MascotState { return { ...this.state }; }\n\n /** Removes listeners, DOM nodes, and object URLs owned by this mascot. */\n public destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.actions.cancel();\n for (const dispose of this.disposers.splice(0)) dispose();\n this.dom.removeMascot(this.domHandle);\n }\n\n private startBehavior(environment: MascotEnvironment): boolean {\n if (!this.currentBehavior) return false;\n this.state.behaviorName = this.currentBehavior.name;\n return this.actions.start(this.currentBehavior.name, environment);\n }\n\n private findFallBehavior(): BehaviorDefinition | undefined {\n return this.behavior.force(\"Fall\") ?? this.behavior.force(\"落下する\");\n }\n\n private createEnvironment(bounds: Rectangle, platforms: readonly PlatformRectangle[] = this.platforms): MascotEnvironment {\n const workArea = environmentRectangle(bounds);\n const inactive = environmentRectangle({ x: -100, y: -100, width: 0, height: 0 });\n const platform = this.selectActivePlatform(platforms);\n const activeIE = platform\n ? { ...environmentRectangle(platform), visible: true }\n : { ...inactive, visible: false };\n return {\n gap: 0,\n maxCount: 999,\n mascot: {\n totalCount: this.callbacks.count(),\n anchor: { x: this.state.x, y: this.state.y },\n lookRight: this.state.lookRight,\n environment: {\n cursor: this.callbacks.pointer(),\n screen: { width: window.innerWidth, height: window.innerHeight },\n workArea,\n floor: workArea.bottomBorder,\n ceiling: workArea.topBorder,\n activeIE,\n },\n },\n };\n }\n\n private selectActivePlatform(platforms: readonly PlatformRectangle[]): PlatformRectangle | undefined {\n if (platforms.length === 0) {\n this.activePlatformElement = undefined;\n return undefined;\n }\n const anchor = this.state;\n const current = platforms.find((platform) => platform.element === this.activePlatformElement);\n if (current && (\n isOnTop(anchor, current, 2)\n || isOnBottom(anchor, current, 2)\n || isOnLeft(anchor, current, 2)\n || isOnRight(anchor, current, 2)\n )) return current;\n\n if (this.state.vy >= 0) {\n const landingPlatform = platforms\n .filter((platform) => anchor.x >= platform.x && anchor.x <= platform.x + platform.width && platform.y >= anchor.y - 1)\n .sort((left, right) => left.y - right.y)[0];\n if (landingPlatform) {\n this.activePlatformElement = landingPlatform.element;\n return landingPlatform;\n }\n }\n\n const nearby = [...platforms]\n .map((platform) => ({ platform, distance: distanceToRectangle(anchor, platform) }))\n .filter(({ distance }) => distance <= PLATFORM_NEARBY_DISTANCE)\n .sort((left, right) => left.distance - right.distance)[0]?.platform;\n this.activePlatformElement = nearby?.element;\n return nearby;\n }\n\n private installPointerHandlers(): void {\n const element = this.domHandle.element;\n const listen = <K extends keyof HTMLElementEventMap>(target: EventTarget, type: K, listener: (event: HTMLElementEventMap[K]) => void): void => {\n target.addEventListener(type, listener as EventListener);\n this.disposers.push(() => target.removeEventListener(type, listener as EventListener));\n };\n listen(element, \"pointerdown\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (pointerEvent.button !== 0) return;\n event.preventDefault();\n const bounds = this.dom.workArea.getBoundingClientRect();\n const point = { x: pointerEvent.clientX - bounds.left, y: pointerEvent.clientY - bounds.top };\n this.pointerId = pointerEvent.pointerId;\n this.pointerDown = point;\n this.lastPointer = point;\n this.dragOffset = { x: this.state.x - point.x, y: this.state.y - point.y };\n this.state.dragging = true;\n this.actions.cancel();\n this.currentBehavior = this.behavior.force(\"Dragged\") ?? this.behavior.force(\"ドラッグされる\");\n if (this.currentBehavior) this.state.behaviorName = this.currentBehavior.name;\n element.setPointerCapture?.(pointerEvent.pointerId);\n });\n listen(document, \"pointermove\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (!this.state.dragging || pointerEvent.pointerId !== this.pointerId) return;\n const bounds = this.dom.workArea.getBoundingClientRect();\n const point = { x: pointerEvent.clientX - bounds.left, y: pointerEvent.clientY - bounds.top };\n const previous = this.lastPointer ?? point;\n this.state.vx = (point.x - previous.x) * 0.8;\n this.state.vy = (point.y - previous.y) * 0.8;\n this.state.x = point.x + this.dragOffset.x;\n this.state.y = point.y + this.dragOffset.y;\n this.lastPointer = point;\n });\n listen(document, \"pointerup\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (!this.state.dragging || pointerEvent.pointerId !== this.pointerId) return;\n this.state.dragging = false;\n const moved = this.pointerDown ? Math.hypot(this.lastPointer!.x - this.pointerDown.x, this.lastPointer!.y - this.pointerDown.y) : 0;\n this.pointerId = undefined;\n this.currentBehavior = this.behavior.force(\"Thrown\") ?? this.behavior.force(\"投げられる\") ?? this.findFallBehavior();\n if (this.currentBehavior) {\n this.state.behaviorName = this.currentBehavior.name;\n this.actions.start(this.currentBehavior.name, this.createEnvironment(this.dom.getBounds()));\n }\n if (moved < 4) this.callbacks.click(this.snapshot());\n });\n }\n}\n","import type { Rectangle } from \"./types\";\n\n/** A platform rectangle paired with the DOM element that produced it. */\nexport interface PlatformRectangle extends Rectangle {\n element: HTMLElement;\n}\n\n/** Resolves a platform option into DOM elements, excluding engine-owned nodes. */\nexport function resolvePlatformElements(\n source: string | readonly HTMLElement[],\n document: Document,\n excludedRoot?: HTMLElement,\n): HTMLElement[] {\n let elements: readonly Element[];\n if (typeof source === \"string\") {\n try {\n elements = [...document.querySelectorAll(source)];\n } catch {\n return [];\n }\n } else {\n elements = source;\n }\n const HTMLElementConstructor = document.defaultView?.HTMLElement;\n if (!HTMLElementConstructor) return [];\n return [...new Set(elements)].filter((element): element is HTMLElement =>\n element instanceof HTMLElementConstructor && element.isConnected && (!excludedRoot || !excludedRoot.contains(element)),\n );\n}\n\n/** Reads platform bounds once and converts viewport coordinates to work-area coordinates. */\nexport function readPlatformRectangles(\n elements: readonly HTMLElement[],\n workAreaRectangle: Pick<DOMRect, \"left\" | \"top\">,\n): PlatformRectangle[] {\n const rectangles: PlatformRectangle[] = [];\n for (const element of elements) {\n const rectangle = element.getBoundingClientRect();\n if (rectangle.width <= 0 || rectangle.height <= 0) continue;\n rectangles.push({\n element,\n x: rectangle.left - workAreaRectangle.left,\n y: rectangle.top - workAreaRectangle.top,\n width: rectangle.width,\n height: rectangle.height,\n });\n }\n return rectangles;\n}\n","import type { CharacterSpec, IndividualSprite, SpriteRectangle } from \"./types\";\n\n/** A resolved image and optional atlas crop for one sprite frame. */\nexport interface ResolvedSprite {\n /** Browser-loadable image URL. */\n url: string;\n /** Optional atlas crop. */\n rectangle?: SpriteRectangle;\n}\n\n/** A per-mascot spritesheet resource whose temporary URL can be released. */\nexport interface SpriteLease {\n /** URL used to render atlas-backed frames. */\n url: string;\n /** Releases any object URL owned by this lease. */\n release(): void;\n}\n\nfunction dataUriToBlob(source: string): Blob {\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(source);\n if (!match) throw new TypeError(\"Invalid image data URI\");\n const mimeType = match[1] ?? \"application/octet-stream\";\n const encoded = match[3] ?? \"\";\n const binary = match[2] ? atob(encoded) : decodeURIComponent(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: mimeType });\n}\n\n/** Owns temporary sprite URLs and resolves atlas or individual image frames. */\nexport class SpriteManager {\n private readonly leases = new Set<SpriteLease>();\n\n /** Creates a separately releasable spritesheet lease for a mascot. */\n public acquire(source: string | Blob): SpriteLease {\n let url = typeof source === \"string\" ? source : \"\";\n let owned = false;\n if (typeof URL.createObjectURL === \"function\" && (typeof source !== \"string\" || source.startsWith(\"data:image\"))) {\n try {\n url = URL.createObjectURL(typeof source === \"string\" ? dataUriToBlob(source) : source);\n owned = true;\n } catch {\n if (typeof source !== \"string\") throw new Error(\"The current environment cannot create a URL for the spritesheet Blob\");\n }\n }\n let released = false;\n const lease: SpriteLease = {\n url,\n release: () => {\n if (released) return;\n released = true;\n this.leases.delete(lease);\n if (owned) URL.revokeObjectURL(url);\n },\n };\n this.leases.add(lease);\n return lease;\n }\n\n /** Resolves a sprite key using a lease and the character's sprite map. */\n public resolve(spec: CharacterSpec, lease: SpriteLease, spriteName: string): ResolvedSprite | undefined {\n const key = Object.keys(spec.sprites).find((candidate) => candidate.toLowerCase() === spriteName.toLowerCase());\n const sprite = key ? spec.sprites[key] : undefined;\n if (typeof sprite === \"string\") return { url: sprite };\n if (sprite && \"url\" in sprite && typeof sprite.url === \"string\" && !(\"x\" in sprite)) return { url: sprite.url };\n if (sprite && \"x\" in sprite) return { url: sprite.url ?? lease.url, rectangle: sprite };\n if (/^(?:data:|blob:|https?:|\\/)/.test(spriteName)) return { url: spriteName };\n return undefined;\n }\n\n /** Revokes every object URL that has not already been released. */\n public destroy(): void {\n for (const lease of [...this.leases]) lease.release();\n }\n}\n\n/** Returns whether a sprite definition is a standalone image object. */\nexport function isIndividualSprite(sprite: SpriteRectangle | IndividualSprite | string): sprite is IndividualSprite {\n return typeof sprite === \"object\" && \"url\" in sprite && !(\"x\" in sprite);\n}\n","import { DomManager } from \"./dom\";\nimport { normalizeCharacterSpec } from \"./loader\";\nimport { Mascot } from \"./mascot\";\nimport { readPlatformRectangles, resolvePlatformElements, type PlatformRectangle } from \"./platform\";\nimport { SpriteManager } from \"./sprite\";\nimport type { CharacterSpec, MascotState, ShimejiEngineEventMap, ShimejiEngineOptions, ShimejiEventListener, SpawnOptions } from \"./types\";\n\nclass EventEmitter<Events extends object> {\n private readonly listeners = new Map<keyof Events, Set<(payload: never) => void>>();\n public on<K extends keyof Events>(event: K, listener: (payload: Events[K]) => void): () => void {\n const listeners = this.listeners.get(event) ?? new Set();\n listeners.add(listener as (payload: never) => void);\n this.listeners.set(event, listeners);\n return () => { listeners.delete(listener as (payload: never) => void); };\n }\n public emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n for (const listener of [...(this.listeners.get(event) ?? [])]) listener(payload as never);\n }\n public clear(): void { this.listeners.clear(); }\n}\n\nconst defaults = {\n frameDuration: 40,\n gravity: 2,\n maxDeltaTime: 100,\n workAreaClassName: \"\",\n mascotClassName: \"\",\n platforms: [] as readonly HTMLElement[],\n} as const;\n\ntype ResolvedEngineOptions = Required<Omit<ShimejiEngineOptions, \"random\">> & { random: (() => number) | undefined };\n\n/** Framework-agnostic manager for character registration and live Shimeji mascots. */\nexport class ShimejiEngine {\n private readonly specs = new Map<string, CharacterSpec>();\n private readonly mascots = new Map<string, Mascot>();\n private readonly sprites = new SpriteManager();\n private readonly dom: DomManager;\n private readonly events = new EventEmitter<ShimejiEngineEventMap>();\n private readonly disposers: Array<() => void> = [];\n private readonly intervals = new Set<number>();\n private readonly options: ResolvedEngineOptions;\n private readonly originalContainerPosition: string;\n private readonly adjustedContainerPosition: boolean;\n private pointer = { x: 0, y: 0, dx: 0, dy: 0 };\n private animationFrame: number | undefined;\n private lastFrameTime: number | undefined;\n private nextMascotId = 1;\n private destroyed = false;\n private initialized = false;\n private platformSource: string | readonly HTMLElement[];\n\n /** Creates and initializes an engine inside a host DOM element. */\n public constructor(private readonly container: HTMLElement, options: ShimejiEngineOptions = {}) {\n if (!container) throw new TypeError(\"ShimejiEngine requires a container element\");\n this.options = { ...defaults, ...options, random: options.random };\n this.platformSource = this.options.platforms;\n this.originalContainerPosition = container.style.position;\n this.adjustedContainerPosition = getComputedStyle(container).position === \"static\";\n if (this.adjustedContainerPosition) container.style.position = \"relative\";\n this.dom = new DomManager(container, this.sprites, this.options.workAreaClassName || undefined);\n this.initialize();\n }\n\n /** Starts the clock and global listeners. Calling this method more than once is harmless. */\n public initialize(): void {\n this.assertAlive();\n if (this.initialized) return;\n this.initialized = true;\n this.listen(document, \"pointermove\", (event) => {\n const pointerEvent = event as PointerEvent;\n const rectangle = this.dom.workArea.getBoundingClientRect();\n const x = pointerEvent.clientX - rectangle.left;\n const y = pointerEvent.clientY - rectangle.top;\n this.pointer = { x, y, dx: x - this.pointer.x, dy: y - this.pointer.y };\n });\n this.listen(window, \"resize\", () => this.renderAll());\n const maintenance = window.setInterval(() => this.dom.ensureMounted(), 2_000);\n this.intervals.add(maintenance);\n this.animationFrame = requestAnimationFrame(this.onAnimationFrame);\n }\n\n /** Registers or replaces a parsed or legacy character specification. */\n public registerCharacter(spec: CharacterSpec | unknown): string {\n this.assertAlive();\n const normalized = normalizeCharacterSpec(spec);\n this.specs.set(normalized.id, normalized);\n return normalized.id;\n }\n\n /** Unregisters a character and optionally removes all of its live mascots. */\n public unregisterCharacter(characterId: string, removeMascots = true): boolean {\n this.assertAlive();\n if (removeMascots) {\n for (const state of this.getState()) if (state.characterId === characterId) this.remove(state.id);\n }\n return this.specs.delete(characterId);\n }\n\n /** Returns identifiers for all currently registered characters. */\n public getCharacterIds(): string[] { return [...this.specs.keys()]; }\n\n /** Creates a mascot from a registered character and returns its instance id. */\n public spawn(characterId: string, position: SpawnOptions = {}): string {\n this.assertAlive();\n const spec = this.specs.get(characterId);\n if (!spec) throw new Error(`Character '${characterId}' is not registered`);\n const { bounds, platforms } = this.readFrameGeometry();\n const random = this.options.random ?? Math.random;\n const spawnOptions: SpawnOptions = {\n ...position,\n x: position.x ?? bounds.x + random() * bounds.width,\n y: position.y ?? bounds.y,\n };\n const id = `shimeji-${this.nextMascotId++}`;\n const mascot = new Mascot(id, spec, this.dom, this.options, spawnOptions, {\n pointer: () => ({ ...this.pointer }),\n count: () => this.mascots.size,\n spawn: (nextCharacterId, nextPosition) => { if (!this.destroyed) this.spawn(nextCharacterId, nextPosition); },\n remove: (mascotId) => { if (!this.destroyed) this.remove(mascotId); },\n click: (state) => this.events.emit(\"click\", state),\n error: (error) => this.events.emit(\"error\", error),\n });\n this.mascots.set(id, mascot);\n mascot.tick(0, bounds, platforms);\n const state = mascot.snapshot();\n this.events.emit(\"spawn\", state);\n this.emitState();\n return id;\n }\n\n /** Removes one mascot and all resources associated with it. */\n public remove(mascotId: string): boolean {\n this.assertAlive();\n const mascot = this.mascots.get(mascotId);\n if (!mascot) return false;\n const state = mascot.snapshot();\n this.mascots.delete(mascotId);\n mascot.destroy();\n this.events.emit(\"remove\", state);\n this.emitState();\n return true;\n }\n\n /** Removes every live mascot while leaving registered character specs available. */\n public removeAll(): void {\n this.assertAlive();\n for (const id of [...this.mascots.keys()]) this.remove(id);\n }\n\n /** Returns detached snapshots of every live mascot. */\n public getState(): MascotState[] { return [...this.mascots.values()].map((mascot) => mascot.snapshot()); }\n\n /** Subscribes to a typed engine event and returns an unsubscribe function. */\n public on<K extends keyof ShimejiEngineEventMap>(event: K, listener: ShimejiEventListener<K>): () => void {\n this.assertAlive();\n return this.events.on(event, listener);\n }\n\n /** Replaces the DOM elements (or selector) exposed to mascots as platforms. */\n public setPlatforms(platforms: string | readonly HTMLElement[]): void {\n this.assertAlive();\n this.platformSource = platforms;\n }\n\n /** Stops animation and timers, removes listeners and DOM, and revokes all object URLs. */\n public destroy(): void {\n if (this.destroyed) return;\n for (const mascot of this.mascots.values()) mascot.destroy();\n this.mascots.clear();\n if (this.animationFrame !== undefined) cancelAnimationFrame(this.animationFrame);\n this.animationFrame = undefined;\n for (const interval of this.intervals) window.clearInterval(interval);\n this.intervals.clear();\n for (const dispose of this.disposers.splice(0)) dispose();\n this.dom.destroy();\n this.sprites.destroy();\n this.specs.clear();\n this.events.clear();\n if (this.adjustedContainerPosition && this.container.style.position === \"relative\") this.container.style.position = this.originalContainerPosition;\n this.destroyed = true;\n this.initialized = false;\n }\n\n /** Returns whether this engine has completed permanent teardown. */\n public isDestroyed(): boolean { return this.destroyed; }\n\n private readonly onAnimationFrame = (timestamp: number): void => {\n if (this.destroyed) return;\n const rawDelta = this.lastFrameTime === undefined ? this.options.frameDuration : timestamp - this.lastFrameTime;\n this.lastFrameTime = timestamp;\n const delta = Math.max(0, Math.min(rawDelta, this.options.maxDeltaTime));\n const { bounds, platforms } = this.readFrameGeometry();\n for (const mascot of [...this.mascots.values()]) mascot.tick(delta, bounds, platforms);\n this.emitState();\n this.animationFrame = requestAnimationFrame(this.onAnimationFrame);\n };\n\n private renderAll(): void {\n const { bounds, platforms } = this.readFrameGeometry();\n for (const mascot of this.mascots.values()) mascot.tick(0, bounds, platforms);\n }\n\n private readFrameGeometry(): { bounds: ReturnType<DomManager[\"getBounds\"]>; platforms: PlatformRectangle[] } {\n const workAreaRectangle = this.dom.workArea.getBoundingClientRect();\n const bounds = this.dom.getBoundsFromClientRectangle(workAreaRectangle);\n const elements = resolvePlatformElements(this.platformSource, this.container.ownerDocument, this.dom.workArea);\n return { bounds, platforms: readPlatformRectangles(elements, workAreaRectangle) };\n }\n\n private emitState(): void { this.events.emit(\"statechange\", this.getState()); }\n\n private listen(target: EventTarget, type: string, listener: EventListener): void {\n target.addEventListener(type, listener);\n this.disposers.push(() => target.removeEventListener(type, listener));\n }\n\n private assertAlive(): void {\n if (this.destroyed) throw new Error(\"ShimejiEngine has been destroyed\");\n }\n}\n"],"mappings":"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","names":["document","document","state"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/loader.ts","../src/behavior.ts","../src/physics.ts","../src/action.ts","../src/mascot.ts","../src/platform.ts","../src/sprite.ts","../src/engine.ts"],"sourcesContent":["/** Framework-agnostic Shimeji engine. */\nexport { ShimejiEngine } from \"./engine\";\n/** Character loading and legacy XML parsing utilities. */\nexport { loadCharacter, normalizeCharacterSpec, parseActionsXml, parseBehaviorsXml } from \"./loader\";\n/** Behavior selection and safe expression utilities. */\nexport { BehaviorController, conditionsMatch, evaluateExpression, selectWeighted } from \"./behavior\";\n/** Low-level action-tree executor. */\nexport { ActionExecutor } from \"./action\";\n/** Geometry and physics helpers. */\nexport { applyGravity, clamp, isOnBorder, isOnBottom, isOnLeft, isOnRight, isOnTop, moveToward } from \"./physics\";\n/** DOM platform geometry utilities. */\nexport { readPlatformRectangles, resolvePlatformElements } from \"./platform\";\nexport type { PlatformRectangle } from \"./platform\";\n/** Sprite resource manager. */\nexport { SpriteManager, isIndividualSprite } from \"./sprite\";\nexport type * from \"./types\";\nexport type { ActionExecutorCallbacks, ActionExecutorOptions } from \"./action\";\nexport type { MascotCallbacks } from \"./mascot\";\nexport type { MascotDomHandle } from \"./dom\";\nexport type { ResolvedSprite, SpriteLease } from \"./sprite\";\n","import { SpriteManager, type SpriteLease } from \"./sprite\";\nimport type { CharacterSpec, MascotState, Rectangle } from \"./types\";\n\n/** DOM nodes and resources owned by one mascot. */\nexport interface MascotDomHandle {\n /** Fixed, pointer-transparent mascot wrapper. */\n element: HTMLDivElement;\n /** Pointer-interactive child element on which sprite images are painted. */\n spriteElement: HTMLDivElement;\n /** Per-mascot spritesheet URL lease. */\n spriteLease: SpriteLease;\n}\n\n/** Creates and updates all DOM owned by an engine instance. */\nexport class DomManager {\n private readonly handles = new Set<MascotDomHandle>();\n\n /** Uses the supplied element only as a mount point for independent mascots. */\n public constructor(\n private readonly container: HTMLElement,\n private readonly sprites: SpriteManager,\n ) {}\n\n /** Reattaches mascot elements if application code temporarily removed them. */\n public ensureMounted(): void {\n for (const handle of this.handles) {\n if (handle.element.parentElement !== this.container) this.container.appendChild(handle.element);\n }\n }\n\n /** Returns viewport bounds because fixed mascots use viewport coordinates. */\n public getBounds(): Rectangle {\n const view = this.container.ownerDocument.defaultView ?? window;\n return { x: 0, y: 0, width: view.innerWidth, height: view.innerHeight };\n }\n\n /** Creates a mascot node and acquires its spritesheet resource. */\n public createMascot(spec: CharacterSpec, mascotId: string, mascotClassName?: string): MascotDomHandle {\n const spriteLease = this.sprites.acquire(spec.spritesheet);\n const element = document.createElement(\"div\");\n element.dataset.shimejiId = mascotId;\n if (mascotClassName) element.className = mascotClassName;\n Object.assign(element.style, { position: \"fixed\", left: \"0\", top: \"0\", width: \"0\", height: \"0\", pointerEvents: \"none\", zIndex: \"9999\", userSelect: \"none\", willChange: \"transform\" });\n const spriteElement = document.createElement(\"div\");\n Object.assign(spriteElement.style, { position: \"absolute\", left: \"0\", top: \"0\", backgroundRepeat: \"no-repeat\", transformOrigin: \"center center\", pointerEvents: \"auto\", touchAction: \"none\", userSelect: \"none\" });\n element.appendChild(spriteElement);\n const handle = { element, spriteElement, spriteLease };\n this.handles.add(handle);\n this.container.appendChild(element);\n return handle;\n }\n\n /** Paints one mascot state into its existing DOM nodes. */\n public render(handle: MascotDomHandle, spec: CharacterSpec, state: MascotState): void {\n const sprite = this.sprites.resolve(spec, handle.spriteLease, state.sprite);\n handle.element.style.transform = `translate3d(${state.x - state.anchorX}px, ${state.y - state.anchorY}px, 0)`;\n handle.spriteElement.style.left = \"0\";\n handle.spriteElement.style.top = \"0\";\n handle.spriteElement.style.transform = `scaleX(${state.lookRight ? -1 : 1})`;\n if (!sprite) return;\n handle.spriteElement.style.backgroundImage = `url(\"${sprite.url.replaceAll('\"', '\\\\\"')}\")`;\n if (sprite.rectangle) {\n handle.spriteElement.style.width = `${sprite.rectangle.width}px`;\n handle.spriteElement.style.height = `${sprite.rectangle.height}px`;\n handle.element.style.width = `${sprite.rectangle.width}px`;\n handle.element.style.height = `${sprite.rectangle.height}px`;\n handle.spriteElement.style.backgroundPosition = `${-sprite.rectangle.x}px ${-sprite.rectangle.y}px`;\n handle.spriteElement.style.backgroundSize = \"auto\";\n } else {\n handle.spriteElement.style.backgroundPosition = \"0 0\";\n handle.spriteElement.style.backgroundSize = \"contain\";\n handle.spriteElement.style.width = \"128px\";\n handle.spriteElement.style.height = \"128px\";\n const definition = Object.values(spec.sprites).find((candidate) => typeof candidate === \"object\" && \"url\" in candidate && candidate.url === sprite.url);\n if (typeof definition === \"object\" && \"width\" in definition && definition.width !== undefined) handle.spriteElement.style.width = `${definition.width}px`;\n if (typeof definition === \"object\" && \"height\" in definition && definition.height !== undefined) handle.spriteElement.style.height = `${definition.height}px`;\n handle.element.style.width = handle.spriteElement.style.width;\n handle.element.style.height = handle.spriteElement.style.height;\n }\n }\n\n /** Removes one mascot node and releases its temporary image URL. */\n public removeMascot(handle: MascotDomHandle): void {\n if (!this.handles.delete(handle)) return;\n handle.element.remove();\n handle.spriteLease.release();\n }\n\n /** Returns whether an element belongs to one of this manager's mascots. */\n public owns(element: HTMLElement): boolean {\n for (const handle of this.handles) if (handle.element === element || handle.element.contains(element)) return true;\n return false;\n }\n\n /** Removes every mascot element and releases its temporary image URL. */\n public destroy(): void {\n for (const handle of [...this.handles]) this.removeMascot(handle);\n }\n}\n","import type {\n ActionDefinition,\n ActionType,\n AnimationDefinition,\n BehaviorDefinition,\n BorderType,\n CharacterSource,\n CharacterSpec,\n LegacyCharacterPack,\n Point,\n Pose,\n SpriteMap,\n} from \"./types\";\n\nconst actionTypeNames: Record<string, ActionType> = {\n Sequence: \"Sequence\", Select: \"Select\", Reference: \"Reference\", Stay: \"Stay\", Animate: \"Animate\", Move: \"Move\", Embedded: \"Embedded\",\n 複合: \"Sequence\", 選択: \"Select\", 参照: \"Reference\", 静止: \"Stay\", 固定: \"Animate\", 移動: \"Move\", 組み込み: \"Embedded\",\n};\nconst borderTypeNames: Record<string, BorderType> = { Floor: \"Floor\", Wall: \"Wall\", Ceiling: \"Ceiling\", 地面: \"Floor\", 壁: \"Wall\", 天井: \"Ceiling\" };\n\nfunction parseJson<T>(value: T | string, label: string): T {\n if (typeof value !== \"string\") return value;\n try { return JSON.parse(value) as T; } catch (error) { throw new TypeError(`Invalid ${label}: ${error instanceof Error ? error.message : String(error)}`); }\n}\n\nfunction attribute(element: Element, ...names: string[]): string | undefined {\n for (const name of names) { const value = element.getAttribute(name); if (value !== null) return value; }\n return undefined;\n}\n\nfunction directChildren(element: Element, ...names: string[]): Element[] {\n const accepted = new Set(names);\n return Array.from(element.children).filter((child) => accepted.has(child.localName) || accepted.has(child.tagName));\n}\n\nfunction parsePoint(value: string | undefined, fallback: Point = { x: 0, y: 0 }): Point {\n if (!value) return fallback;\n const [x = fallback.x, y = fallback.y] = value.split(\",\").map(Number);\n return { x: Number.isFinite(x) ? x : fallback.x, y: Number.isFinite(y) ? y : fallback.y };\n}\n\nfunction requireDomParser(): DOMParser {\n if (typeof DOMParser === \"undefined\") throw new Error(\"XML character packs require the browser DOMParser API; use pre-parsed JSON in non-browser environments\");\n return new DOMParser();\n}\n\nfunction parseDocument(xml: string, label: string): Document {\n const document = requireDomParser().parseFromString(xml.replace(/^\\uFEFF/, \"\"), \"application/xml\");\n const error = document.querySelector(\"parsererror\");\n if (error) throw new TypeError(`Invalid ${label}: ${error.textContent?.trim() ?? \"XML parse error\"}`);\n return document;\n}\n\nfunction actionProperty(element: Element, ...names: string[]): string | undefined { return attribute(element, ...names); }\n\nfunction parseAnimation(element: Element): AnimationDefinition {\n const poses = directChildren(element, \"Pose\", \"ポーズ\").map((pose): Pose => ({\n sprite: attribute(pose, \"Image\", \"画像\") ?? \"/shime1.png\",\n anchor: parsePoint(attribute(pose, \"Anchor\", \"基準座標\"), { x: 64, y: 128 }),\n velocity: parsePoint(attribute(pose, \"Velocity\", \"移動速度\")),\n duration: Number(attribute(pose, \"Duration\", \"長さ\") ?? 1),\n }));\n const condition = attribute(element, \"Condition\", \"条件\");\n return { poses, ...(condition !== undefined && { condition }) };\n}\n\nfunction parseActionElement(element: Element): ActionDefinition {\n const isReference = element.localName === \"ActionReference\" || element.localName === \"動作参照\";\n const rawType = isReference ? \"Reference\" : attribute(element, \"Type\", \"種類\") ?? (directChildren(element, \"Action\", \"動作\", \"ActionReference\", \"動作参照\").length ? \"Sequence\" : \"Animate\");\n const className = attribute(element, \"Class\", \"クラス\");\n const embedType = className?.split(\".\").at(-1);\n const type = actionTypeNames[rawType] ?? (embedType ? \"Embedded\" : \"Animate\");\n const name = attribute(element, \"Name\", \"名前\");\n const condition = actionProperty(element, \"Condition\", \"条件\");\n const borderRaw = actionProperty(element, \"BorderType\", \"Border\", \"枠\");\n const actions = directChildren(element, \"Action\", \"動作\", \"ActionReference\", \"動作参照\").map(parseActionElement);\n const animations = directChildren(element, \"Animation\", \"アニメーション\").map(parseAnimation);\n const result: ActionDefinition = {\n type,\n ...(name !== undefined && { name }),\n ...(embedType !== undefined && { embedType }),\n ...(condition !== undefined && { condition }),\n ...(borderRaw !== undefined && borderTypeNames[borderRaw] !== undefined && { borderType: borderTypeNames[borderRaw] }),\n ...(actions.length > 0 && { actions }),\n ...(animations.length > 0 && { animations }),\n };\n const properties: Array<[keyof ActionDefinition, string | undefined]> = [\n [\"duration\", actionProperty(element, \"Duration\", \"長さ\")], [\"gap\", actionProperty(element, \"Gap\", \"間隔\")], [\"targetX\", actionProperty(element, \"TargetX\", \"目的地X\")],\n [\"targetY\", actionProperty(element, \"TargetY\", \"目的地Y\")], [\"velocity\", actionProperty(element, \"Velocity\", \"速度\")],\n [\"x\", actionProperty(element, \"X\", \"変位X\")], [\"y\", actionProperty(element, \"Y\", \"変位Y\")],\n [\"initialVx\", actionProperty(element, \"InitialVX\", \"InitialVx\", \"初速X\")], [\"initialVy\", actionProperty(element, \"InitialVY\", \"InitialVy\", \"初速Y\")],\n [\"resistanceX\", actionProperty(element, \"ResistanceX\", \"空気抵抗X\")], [\"resistanceY\", actionProperty(element, \"ResistanceY\", \"空気抵抗Y\")],\n [\"gravity\", actionProperty(element, \"Gravity\", \"重力\")], [\"bornX\", actionProperty(element, \"BornX\", \"誕生X\")],\n [\"bornY\", actionProperty(element, \"BornY\", \"誕生Y\")], [\"bornBehavior\", actionProperty(element, \"BornBehavior\", \"誕生時の行動\")],\n [\"ieOffsetX\", actionProperty(element, \"IEOffsetX\", \"IEの端X\")], [\"ieOffsetY\", actionProperty(element, \"IEOffsetY\", \"IEの端Y\")],\n [\"lookRight\", actionProperty(element, \"LookRight\", \"右向き\")],\n ];\n for (const [key, value] of properties) if (value !== undefined) (result as unknown as Record<string, unknown>)[key] = value;\n const loop = actionProperty(element, \"Loop\", \"繰り返し\");\n if (loop !== undefined) result.loop = loop.toLowerCase() === \"true\";\n return result;\n}\n\n/** Parses a legacy `actions.xml` document into normalized action definitions. */\nexport function parseActionsXml(xml: string): ActionDefinition[] {\n const document = parseDocument(xml, \"actions.xml\");\n const lists = Array.from(document.getElementsByTagNameNS(\"*\", \"ActionList\")).concat(Array.from(document.getElementsByTagNameNS(\"*\", \"動作リスト\")));\n const roots = lists.length ? lists : [document.documentElement];\n return roots.flatMap((list) => directChildren(list, \"Action\", \"動作\").map(parseActionElement));\n}\n\nfunction parseBehaviorElement(element: Element, inheritedConditions: readonly string[], groupIndex: number): BehaviorDefinition {\n const condition = attribute(element, \"Condition\", \"条件\");\n const conditions = [...inheritedConditions, ...(condition ? [condition] : [])];\n const nextList = directChildren(element, \"NextBehaviorList\", \"NextBehavior\", \"次の行動リスト\")[0];\n const nextBehaviors = nextList\n ? directChildren(nextList, \"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\").map((child) => parseBehaviorElement(child, conditions, 0))\n : [];\n const reference = element.localName === \"BehaviorReference\" || element.localName === \"BehaviorReferance\" || element.localName === \"行動参照\";\n return {\n type: reference ? \"Reference\" : \"Behavior\",\n name: attribute(element, \"Name\", \"名前\") ?? \"\",\n frequency: Number(attribute(element, \"Frequency\", \"頻度\") ?? 0),\n conditions,\n nextBehaviors,\n groupIndex,\n hidden: (attribute(element, \"Hidden\", \"非表示\") ?? \"false\").toLowerCase() === \"true\",\n };\n}\n\n/** Parses a legacy `behaviors.xml` document into normalized behavior definitions. */\nexport function parseBehaviorsXml(xml: string): BehaviorDefinition[] {\n const document = parseDocument(xml, \"behaviors.xml\");\n const lists = Array.from(document.getElementsByTagNameNS(\"*\", \"BehaviorList\")).concat(Array.from(document.getElementsByTagNameNS(\"*\", \"行動リスト\")));\n const root = lists[0] ?? document.documentElement;\n const behaviors: BehaviorDefinition[] = [];\n let groupIndex = 0;\n for (const child of Array.from(root.children)) {\n if (child.localName === \"Condition\" || child.localName === \"条件\") {\n groupIndex += 1;\n const condition = attribute(child, \"Condition\", \"条件\");\n const inherited = condition ? [condition] : [];\n behaviors.push(...directChildren(child, \"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\").map((element) => parseBehaviorElement(element, inherited, groupIndex)));\n } else if ([\"Behavior\", \"行動\", \"BehaviorReference\", \"BehaviorReferance\", \"行動参照\"].includes(child.localName)) {\n behaviors.push(parseBehaviorElement(child, [], 0));\n }\n }\n return behaviors;\n}\n\nfunction isCharacterSpec(value: unknown): value is CharacterSpec {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<CharacterSpec>;\n return typeof candidate.id === \"string\" && Array.isArray(candidate.actions) && Array.isArray(candidate.behaviors) && typeof candidate.sprites === \"object\" && candidate.sprites !== null && (typeof candidate.spritesheet === \"string\" || (typeof Blob !== \"undefined\" && candidate.spritesheet instanceof Blob));\n}\n\n/** Converts a pre-parsed definition or raw XML/JSON legacy bundle to a character specification. */\nexport function normalizeCharacterSpec(input: CharacterSpec | LegacyCharacterPack | unknown): CharacterSpec {\n let candidate: unknown = input;\n if (typeof candidate === \"string\") candidate = parseJson<unknown>(candidate, \"character JSON\");\n if (!candidate || typeof candidate !== \"object\") throw new TypeError(\"Character data must be an object\");\n const record = candidate as Record<string, unknown>;\n if (record.configuration) {\n const configuration = typeof record.configuration === \"string\"\n ? parseJson<Record<string, unknown>>(record.configuration, \"configuration\")\n : record.configuration;\n if (typeof configuration === \"object\") candidate = { ...(configuration as object), ...record };\n }\n const pack = candidate as Partial<LegacyCharacterPack> & Record<string, unknown>;\n const id = typeof pack.id === \"string\" ? pack.id : typeof pack.metadata?.shimeji === \"string\" ? pack.metadata.shimeji : undefined;\n if (!id) throw new TypeError(\"Character specification requires an id\");\n if (pack.actions === undefined || pack.behaviors === undefined || pack.sprites === undefined || pack.spritesheet === undefined) throw new TypeError(`Character '${id}' is missing actions, behaviors, sprites, or spritesheet`);\n const actions = typeof pack.actions === \"string\" && pack.actions.trimStart().startsWith(\"<\") ? parseActionsXml(pack.actions) : parseJson<ActionDefinition[]>(pack.actions, \"actions\");\n const behaviors = typeof pack.behaviors === \"string\" && pack.behaviors.trimStart().startsWith(\"<\") ? parseBehaviorsXml(pack.behaviors) : parseJson<BehaviorDefinition[]>(pack.behaviors, \"behaviors\");\n const sprites = parseJson<SpriteMap>(pack.sprites, \"sprites\");\n const spec: CharacterSpec = {\n id,\n spritesheet: pack.spritesheet,\n sprites,\n actions,\n behaviors,\n ...(typeof pack.name === \"string\" && { name: pack.name }),\n ...(pack.metadata !== undefined && { metadata: pack.metadata }),\n };\n if (!isCharacterSpec(spec)) throw new TypeError(`Character '${id}' could not be normalized`);\n return spec;\n}\n\n/** Loads character JSON from a URL or normalizes an already available character bundle. */\nexport async function loadCharacter(source: CharacterSource): Promise<CharacterSpec> {\n if (typeof source !== \"string\" && !(source instanceof URL)) return normalizeCharacterSpec(source);\n const url = source instanceof URL ? source : new URL(source, typeof document === \"undefined\" ? \"http://localhost/\" : document.baseURI);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Unable to load character '${url}': ${response.status} ${response.statusText}`);\n const spec = normalizeCharacterSpec(await response.json() as unknown);\n if (typeof spec.spritesheet === \"string\" && !/^(?:data:|blob:)/.test(spec.spritesheet)) {\n spec.spritesheet = new URL(spec.spritesheet, url).toString();\n }\n return spec;\n}\n","import type { BehaviorDefinition, CharacterSpec, MascotEnvironment } from \"./types\";\n\ntype TokenKind = \"number\" | \"identifier\" | \"operator\" | \"punctuation\" | \"eof\";\ninterface Token { kind: TokenKind; value: string }\ntype AstNode =\n | { kind: \"literal\"; value: number | boolean }\n | { kind: \"identifier\"; name: string }\n | { kind: \"member\"; object: AstNode; property: string }\n | { kind: \"call\"; callee: AstNode; args: AstNode[] }\n | { kind: \"unary\"; operator: string; argument: AstNode }\n | { kind: \"binary\"; operator: string; left: AstNode; right: AstNode }\n | { kind: \"conditional\"; test: AstNode; consequent: AstNode; alternate: AstNode };\n\nconst forbiddenProperties = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\nconst functions: Record<string, (...args: number[]) => number> = {\n abs: Math.abs, acos: Math.acos, acosh: Math.acosh, asin: Math.asin, asinh: Math.asinh,\n atan: Math.atan, atan2: Math.atan2, atanh: Math.atanh, cbrt: Math.cbrt, ceil: Math.ceil,\n cos: Math.cos, cosh: Math.cosh, exp: Math.exp, expm1: Math.expm1, floor: Math.floor,\n hypot: Math.hypot, log: Math.log, log1p: Math.log1p, log2: Math.log2, log10: Math.log10,\n max: Math.max, min: Math.min, pow: Math.pow, random: (maximum = 1) => Math.random() * maximum,\n round: Math.round, sign: Math.sign, sin: Math.sin, sinh: Math.sinh, sqrt: Math.sqrt,\n tan: Math.tan, tanh: Math.tanh, trunc: Math.trunc,\n};\nconst constants: Record<string, number> = { E: Math.E, PI: Math.PI };\n\nfunction normalizeExpression(source: string): string {\n return source\n .trim()\n .replace(/^(?:#|\\$)\\{/, \"\")\n .replace(/\\}$/, \"\")\n .replace(/Math\\.(random|min|max|abs|floor|ceil|round|sqrt|pow|sin|cos|tan|asin|acos|atan|sinh|cosh|tanh|asinh|acosh|atanh|cbrt|log|log2|log10|exp|expm1|log1p|trunc|sign|hypot|atan2)/g, \"$1\")\n .replace(/Math\\.(PI|E)\\b/g, \"$1\")\n .replace(/Mascot\\./gi, \"mascot.\")\n .replace(/TargetX|目的地X/gi, \"targetX\")\n .replace(/TargetY|目的地Y/gi, \"targetY\")\n .replace(/FootX|足X/gi, \"footX\")\n .replace(/FootY|足Y/gi, \"footY\")\n .replace(/MaxCount/gi, \"maxCount\")\n .replace(/Gap/gi, \"gap\")\n .replace(/\\band\\b/gi, \"&&\")\n .replace(/\\bor\\b/gi, \"||\")\n .replace(/\\bnot\\b/gi, \"!\");\n}\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < source.length) {\n const rest = source.slice(index);\n const whitespace = /^\\s+/.exec(rest);\n if (whitespace) { index += whitespace[0].length; continue; }\n const number = /^(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/i.exec(rest);\n if (number) { tokens.push({ kind: \"number\", value: number[0] }); index += number[0].length; continue; }\n const identifier = /^[A-Za-z_$\\u0080-\\uFFFF][\\w$\\u0080-\\uFFFF]*/u.exec(rest);\n if (identifier) { tokens.push({ kind: \"identifier\", value: identifier[0] }); index += identifier[0].length; continue; }\n const operator = /^(?:===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%^<>!?:.,()])/.exec(rest);\n if (!operator) throw new SyntaxError(`Unexpected token at ${index}`);\n const value = operator[0];\n tokens.push({ kind: value === \"(\" || value === \")\" || value === \",\" || value === \".\" ? \"punctuation\" : \"operator\", value });\n index += value.length;\n }\n tokens.push({ kind: \"eof\", value: \"\" });\n return tokens;\n}\n\nclass Parser {\n private index = 0;\n public constructor(private readonly tokens: Token[]) {}\n public parse(): AstNode {\n const node = this.parseConditional();\n if (this.peek().kind !== \"eof\") throw new SyntaxError(`Unexpected '${this.peek().value}'`);\n return node;\n }\n private peek(): Token { return this.tokens[this.index] ?? { kind: \"eof\", value: \"\" }; }\n private take(value?: string): Token {\n const token = this.peek();\n if (value !== undefined && token.value !== value) throw new SyntaxError(`Expected '${value}'`);\n this.index += 1;\n return token;\n }\n private match(...values: string[]): boolean {\n if (!values.includes(this.peek().value)) return false;\n this.index += 1;\n return true;\n }\n private parseConditional(): AstNode {\n const test = this.parseOr();\n if (!this.match(\"?\")) return test;\n const consequent = this.parseConditional();\n this.take(\":\");\n return { kind: \"conditional\", test, consequent, alternate: this.parseConditional() };\n }\n private parseOr(): AstNode { return this.binary(() => this.parseAnd(), [\"||\"]); }\n private parseAnd(): AstNode { return this.binary(() => this.parseEquality(), [\"&&\"]); }\n private parseEquality(): AstNode { return this.binary(() => this.parseComparison(), [\"==\", \"===\", \"!=\", \"!==\"]); }\n private parseComparison(): AstNode { return this.binary(() => this.parseAdditive(), [\"<\", \"<=\", \">\", \">=\"]); }\n private parseAdditive(): AstNode { return this.binary(() => this.parseMultiplicative(), [\"+\", \"-\"]); }\n private parseMultiplicative(): AstNode { return this.binary(() => this.parsePower(), [\"*\", \"/\", \"%\"]); }\n private parsePower(): AstNode { return this.binary(() => this.parseUnary(), [\"^\"]); }\n private binary(next: () => AstNode, operators: string[]): AstNode {\n let left = next();\n while (operators.includes(this.peek().value)) {\n const operator = this.take().value;\n left = { kind: \"binary\", operator, left, right: next() };\n }\n return left;\n }\n private parseUnary(): AstNode {\n if ([\"!\", \"+\", \"-\"].includes(this.peek().value)) {\n return { kind: \"unary\", operator: this.take().value, argument: this.parseUnary() };\n }\n return this.parsePostfix();\n }\n private parsePostfix(): AstNode {\n let node = this.parsePrimary();\n for (;;) {\n if (this.match(\".\")) {\n const property = this.take();\n if (property.kind !== \"identifier\" || forbiddenProperties.has(property.value)) throw new SyntaxError(\"Unsafe member access\");\n node = { kind: \"member\", object: node, property: property.value };\n } else if (this.match(\"(\")) {\n const args: AstNode[] = [];\n if (!this.match(\")\")) {\n do { args.push(this.parseConditional()); } while (this.match(\",\"));\n this.take(\")\");\n }\n node = { kind: \"call\", callee: node, args };\n } else return node;\n }\n }\n private parsePrimary(): AstNode {\n const token = this.take();\n if (token.kind === \"number\") return { kind: \"literal\", value: Number(token.value) };\n if (token.kind === \"identifier\") {\n if (token.value === \"true\" || token.value === \"false\") return { kind: \"literal\", value: token.value === \"true\" };\n return { kind: \"identifier\", name: token.value };\n }\n if (token.value === \"(\") {\n const node = this.parseConditional();\n this.take(\")\");\n return node;\n }\n throw new SyntaxError(`Unexpected '${token.value}'`);\n }\n}\n\nfunction resolveMember(node: Extract<AstNode, { kind: \"member\" }>, scope: Record<string, unknown>): { owner: unknown; value: unknown } {\n const owner = evaluateNode(node.object, scope);\n if ((typeof owner !== \"object\" && typeof owner !== \"function\") || owner === null) return { owner, value: undefined };\n if (forbiddenProperties.has(node.property)) return { owner, value: undefined };\n return { owner, value: (owner as Record<string, unknown>)[node.property] };\n}\n\nfunction evaluateNode(node: AstNode, scope: Record<string, unknown>): unknown {\n switch (node.kind) {\n case \"literal\": return node.value;\n case \"identifier\": return Object.hasOwn(scope, node.name) ? scope[node.name] : functions[node.name] ?? constants[node.name];\n case \"member\": return resolveMember(node, scope).value;\n case \"call\": {\n const member = node.callee.kind === \"member\" ? resolveMember(node.callee, scope) : undefined;\n const callable = member?.value ?? evaluateNode(node.callee, scope);\n if (typeof callable !== \"function\") throw new TypeError(\"Expression value is not callable\");\n return callable.apply(member?.owner, node.args.map((argument) => evaluateNode(argument, scope)));\n }\n case \"unary\": {\n const value = evaluateNode(node.argument, scope);\n if (node.operator === \"!\") return !value;\n if (node.operator === \"+\") return Number(value);\n return -Number(value);\n }\n case \"conditional\": return evaluateNode(node.test, scope) ? evaluateNode(node.consequent, scope) : evaluateNode(node.alternate, scope);\n case \"binary\": {\n if (node.operator === \"&&\") return Boolean(evaluateNode(node.left, scope)) && Boolean(evaluateNode(node.right, scope));\n if (node.operator === \"||\") return Boolean(evaluateNode(node.left, scope)) || Boolean(evaluateNode(node.right, scope));\n const left = evaluateNode(node.left, scope);\n const right = evaluateNode(node.right, scope);\n switch (node.operator) {\n case \"+\": return Number(left) + Number(right);\n case \"-\": return Number(left) - Number(right);\n case \"*\": return Number(left) * Number(right);\n case \"/\": return Number(left) / Number(right);\n case \"%\": return Number(left) % Number(right);\n case \"^\": return Math.pow(Number(left), Number(right));\n case \"==\": case \"===\": return left === right;\n case \"!=\": case \"!==\": return left !== right;\n case \"<\": return Number(left) < Number(right);\n case \"<=\": return Number(left) <= Number(right);\n case \">\": return Number(left) > Number(right);\n case \">=\": return Number(left) >= Number(right);\n default: return false;\n }\n }\n }\n}\n\nconst expressionCache = new Map<string, AstNode>();\n\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: number): number;\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: boolean): boolean;\n/** Safely evaluates a legacy Shimeji expression without using `eval` or `Function`. */\nexport function evaluateExpression(expression: string | number | boolean | undefined, environment: MascotEnvironment, fallback: number | boolean): number | boolean {\n if (expression === undefined) return fallback;\n if (typeof expression !== \"string\") return expression;\n try {\n const normalized = normalizeExpression(expression);\n let ast = expressionCache.get(normalized);\n if (!ast) { ast = new Parser(tokenize(normalized)).parse(); expressionCache.set(normalized, ast); }\n const result = evaluateNode(ast, environment as unknown as Record<string, unknown>);\n if (typeof fallback === \"boolean\") return Boolean(result);\n const numericResult = Number(result);\n return Number.isNaN(numericResult) ? fallback : numericResult;\n } catch { return fallback; }\n}\n\n/** Returns true when every condition in a behavior or action is satisfied. */\nexport function conditionsMatch(conditions: readonly string[], environment: MascotEnvironment): boolean {\n return conditions.every((condition) => evaluateExpression(condition, environment, false));\n}\n\n/** Chooses one item with probability proportional to its non-negative weight. */\nexport function selectWeighted<T>(items: readonly T[], weight: (item: T) => number, random: () => number = Math.random): T | undefined {\n const weighted = items.map((item) => ({ item, weight: Math.max(0, weight(item)) }));\n const total = weighted.reduce((sum, entry) => sum + entry.weight, 0);\n if (total <= 0) return undefined;\n let cursor = random() * total;\n for (const entry of weighted) { cursor -= entry.weight; if (cursor < 0) return entry.item; }\n return weighted.at(-1)?.item;\n}\n\n/** Selects applicable behaviors and resolves legacy behavior references. */\nexport class BehaviorController {\n private previous: BehaviorDefinition | undefined;\n\n /** Creates a behavior selector for a normalized character specification. */\n public constructor(private readonly spec: CharacterSpec, private readonly random: () => number = Math.random) {}\n\n /** Selects an initial behavior, honoring an explicit requested name when possible. */\n public selectInitial(environment: MascotEnvironment, requestedName?: string): BehaviorDefinition | undefined {\n if (requestedName) {\n const requested = this.spec.behaviors.find((behavior) => behavior.name === requestedName);\n if (requested && conditionsMatch(requested.conditions, environment)) return (this.previous = this.resolve(requested));\n }\n const fall = this.findFallBehavior();\n if (fall && !this.isOnAnyBoundary(environment)) return (this.previous = fall);\n return (this.previous = this.choose(this.spec.behaviors, environment));\n }\n\n /** Selects the weighted transition following the current behavior. */\n public selectNext(environment: MascotEnvironment): BehaviorDefinition | undefined {\n const pool = this.previous?.nextBehaviors.length ? this.previous.nextBehaviors : this.spec.behaviors;\n return (this.previous = this.choose(pool, environment) ?? this.findFallBehavior());\n }\n\n /** Replaces selection history so an external interaction can force a behavior. */\n public force(name: string): BehaviorDefinition | undefined {\n const behavior = this.spec.behaviors.find((candidate) => candidate.name === name);\n return (this.previous = behavior ? this.resolve(behavior) : undefined);\n }\n\n private choose(pool: readonly BehaviorDefinition[], environment: MascotEnvironment): BehaviorDefinition | undefined {\n const applicable = pool.filter((behavior) => conditionsMatch(behavior.conditions, environment));\n const chosen = selectWeighted(applicable, (behavior) => behavior.frequency, this.random);\n return chosen ? this.resolve(chosen) : undefined;\n }\n\n private resolve(behavior: BehaviorDefinition): BehaviorDefinition {\n if (behavior.type !== \"Reference\") return behavior;\n const target = this.spec.behaviors.find((candidate) => candidate.type === \"Behavior\" && candidate.name === behavior.name);\n return target ? { ...target, ...behavior, type: \"Behavior\", nextBehaviors: target.nextBehaviors } : { ...behavior, type: \"Behavior\" };\n }\n\n private findFallBehavior(): BehaviorDefinition | undefined {\n return this.spec.behaviors.find((behavior) => behavior.name === \"Fall\" || behavior.name === \"落下する\");\n }\n\n private isOnAnyBoundary(environment: MascotEnvironment): boolean {\n const anchor = environment.mascot.anchor;\n const area = environment.mascot.environment.workArea;\n const activeIE = environment.mascot.environment.activeIE;\n return area.topBorder.isOn(anchor)\n || area.leftBorder.isOn(anchor)\n || area.rightBorder.isOn(anchor)\n || area.bottomBorder.isOn(anchor)\n || (activeIE.visible && (\n activeIE.topBorder.isOn(anchor)\n || activeIE.leftBorder.isOn(anchor)\n || activeIE.rightBorder.isOn(anchor)\n || activeIE.bottomBorder.isOn(anchor)\n ));\n }\n}\n","import type { MascotState, Point, Rectangle } from \"./types\";\n\n/** Clamps a number to an inclusive range. */\nexport function clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(Math.max(value, minimum), maximum);\n}\n\n/** Returns whether a point lies on the top edge of a rectangle. */\nexport function isOnTop(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.x >= rectangle.x - tolerance && point.x <= rectangle.x + rectangle.width + tolerance && Math.abs(point.y - rectangle.y) <= tolerance;\n}\n\n/** Returns whether a point lies on the bottom edge of a rectangle. */\nexport function isOnBottom(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.x >= rectangle.x - tolerance && point.x <= rectangle.x + rectangle.width + tolerance && Math.abs(point.y - rectangle.y - rectangle.height) <= tolerance;\n}\n\n/** Returns whether a point lies on the left edge of a rectangle. */\nexport function isOnLeft(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.y >= rectangle.y - tolerance && point.y <= rectangle.y + rectangle.height + tolerance && Math.abs(point.x - rectangle.x) <= tolerance;\n}\n\n/** Returns whether a point lies on the right edge of a rectangle. */\nexport function isOnRight(point: Point, rectangle: Rectangle, tolerance = 1): boolean {\n return point.y >= rectangle.y - tolerance && point.y <= rectangle.y + rectangle.height + tolerance && Math.abs(point.x - rectangle.x - rectangle.width) <= tolerance;\n}\n\n/** Returns whether an anchor satisfies an action's boundary requirement. */\nexport function isOnBorder(\n state: MascotState,\n bounds: Rectangle,\n border: \"Floor\" | \"Wall\" | \"Ceiling\" | undefined,\n platform?: Rectangle,\n): boolean {\n if (!border) return true;\n if (border === \"Floor\") return isOnBottom(state, bounds) || (platform !== undefined && isOnTop(state, platform));\n if (border === \"Ceiling\") return isOnTop(state, bounds) || (platform !== undefined && isOnBottom(state, platform));\n return isOnLeft(state, bounds)\n || isOnRight(state, bounds)\n || (platform !== undefined && (isOnLeft(state, platform) || isOnRight(state, platform)));\n}\n\n/** Advances ballistic motion and clamps the mascot to the work-area boundaries. */\nexport function applyGravity(\n state: MascotState,\n bounds: Rectangle,\n frameScale: number,\n gravity: number,\n resistanceX = 0.05,\n resistanceY = 0.01,\n platform?: Rectangle,\n): boolean {\n const previousY = state.y;\n const nextX = clamp(state.x + state.vx * frameScale, bounds.x, bounds.x + bounds.width);\n const nextY = clamp(state.y + state.vy * frameScale, bounds.y, bounds.y + bounds.height);\n state.x = nextX;\n state.y = nextY;\n state.vx *= Math.max(0, 1 - resistanceX * frameScale);\n state.vy = state.vy * Math.max(0, 1 - resistanceY * frameScale) + gravity * frameScale;\n if (\n platform\n && nextY >= previousY\n && previousY <= platform.y\n && nextY >= platform.y\n && nextX >= platform.x\n && nextX <= platform.x + platform.width\n ) {\n state.y = platform.y;\n state.vy = 0;\n return true;\n }\n if (state.y >= bounds.y + bounds.height) { state.y = bounds.y + bounds.height; state.vy = 0; return true; }\n if (state.x <= bounds.x || state.x >= bounds.x + bounds.width) { state.vx = 0; return true; }\n return false;\n}\n\n/** Moves a mascot toward a target without overshooting it. */\nexport function moveToward(state: MascotState, target: Point, speed: number, frameScale: number): boolean {\n const dx = target.x - state.x;\n const dy = target.y - state.y;\n const distance = Math.hypot(dx, dy);\n if (distance <= Math.max(0.001, speed * frameScale)) {\n state.x = target.x;\n state.y = target.y;\n return true;\n }\n state.x += (dx / distance) * speed * frameScale;\n state.y += (dy / distance) * speed * frameScale;\n return false;\n}\n","import { evaluateExpression } from \"./behavior\";\nimport { applyGravity, clamp, isOnBorder, moveToward } from \"./physics\";\nimport type { ActionDefinition, AnimationDefinition, CharacterSpec, MascotEnvironment, MascotState, Pose, Rectangle } from \"./types\";\n\n/** Callbacks through which embedded actions request engine-level operations. */\nexport interface ActionExecutorCallbacks {\n /** Spawns another mascot from the same character. */\n spawn(position: { x: number; y: number; behaviorName?: string }): void;\n /** Removes the mascot owning this executor. */\n remove(): void;\n}\n\n/** Settings used while interpreting actions. */\nexport interface ActionExecutorOptions {\n /** Duration of one legacy animation unit in milliseconds. */\n frameDuration: number;\n /** Gravity used when a Fall action does not define one. */\n gravity: number;\n}\n\ninterface Runtime {\n tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean;\n}\n\ninterface EvaluatedAction {\n definition: ActionDefinition;\n duration?: number | undefined;\n targetX?: number | undefined;\n targetY?: number | undefined;\n velocity?: number | undefined;\n x?: number | undefined;\n y?: number | undefined;\n initialVx?: number | undefined;\n initialVy?: number | undefined;\n resistanceX?: number | undefined;\n resistanceY?: number | undefined;\n gravity?: number | undefined;\n bornX?: number | undefined;\n bornY?: number | undefined;\n lookRight: boolean;\n}\n\nfunction numeric(value: string | number | undefined, environment: MascotEnvironment): number | undefined {\n return value === undefined ? undefined : evaluateExpression(value, environment, 0);\n}\n\nfunction evaluateAction(definition: ActionDefinition, environment: MascotEnvironment): EvaluatedAction {\n const gap = numeric(definition.gap, environment) ?? 0;\n const scopedEnvironment = { ...environment, gap };\n const targetX = numeric(definition.targetX, scopedEnvironment);\n const initialVx = numeric(definition.initialVx, scopedEnvironment);\n let lookRight = environment.mascot.lookRight;\n if (definition.borderType === \"Wall\") {\n const { activeIE, workArea } = environment.mascot.environment;\n lookRight = workArea.rightBorder.isOn(environment.mascot.anchor)\n || (activeIE.visible && activeIE.leftBorder.isOn(environment.mascot.anchor));\n } else if (definition.type === \"Move\" || definition.embedType === \"Jump\" || definition.embedType === \"WalkWithIE\") {\n if (targetX !== undefined) lookRight = targetX > environment.mascot.anchor.x;\n } else if (definition.embedType === \"Fall\" || definition.embedType === \"FallWithIE\") {\n if (initialVx !== undefined && initialVx !== 0) lookRight = initialVx > 0;\n } else if (definition.embedType === \"Look\") {\n lookRight = definition.lookRight === undefined\n ? !environment.mascot.lookRight\n : typeof definition.lookRight === \"boolean\"\n ? definition.lookRight\n : evaluateExpression(definition.lookRight, scopedEnvironment, environment.mascot.lookRight);\n }\n const duration = numeric(definition.duration, scopedEnvironment);\n const targetY = numeric(definition.targetY, scopedEnvironment);\n const velocity = numeric(definition.velocity, scopedEnvironment);\n const x = numeric(definition.x, scopedEnvironment);\n const y = numeric(definition.y, scopedEnvironment);\n const initialVy = numeric(definition.initialVy, scopedEnvironment);\n const resistanceX = numeric(definition.resistanceX, scopedEnvironment);\n const resistanceY = numeric(definition.resistanceY, scopedEnvironment);\n const gravity = numeric(definition.gravity, scopedEnvironment);\n const bornX = numeric(definition.bornX, scopedEnvironment);\n const bornY = numeric(definition.bornY, scopedEnvironment);\n return {\n definition,\n lookRight,\n ...(duration !== undefined && { duration }),\n ...(targetX !== undefined && { targetX }),\n ...(targetY !== undefined && { targetY }),\n ...(velocity !== undefined && { velocity }),\n ...(x !== undefined && { x }),\n ...(y !== undefined && { y }),\n ...(initialVx !== undefined && { initialVx }),\n ...(initialVy !== undefined && { initialVy }),\n ...(resistanceX !== undefined && { resistanceX }),\n ...(resistanceY !== undefined && { resistanceY }),\n ...(gravity !== undefined && { gravity }),\n ...(bornX !== undefined && { bornX }),\n ...(bornY !== undefined && { bornY }),\n };\n}\n\nclass SequenceRuntime implements Runtime {\n private index = 0;\n private child: Runtime | undefined;\n public constructor(private readonly definitions: readonly ActionDefinition[], private readonly factory: (definition: ActionDefinition, environment: MascotEnvironment) => Runtime, private readonly loop: boolean) {}\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n for (let guard = 0; guard < 32; guard += 1) {\n const definition = this.definitions[this.index];\n if (!definition) {\n if (!this.loop || this.definitions.length === 0) return true;\n this.index = 0;\n continue;\n }\n this.child ??= this.factory(definition, environment);\n if (!this.child.tick(deltaMs, environment, bounds)) return false;\n this.child = undefined;\n this.index += 1;\n deltaMs = 0;\n }\n return false;\n }\n}\n\nclass CompleteRuntime implements Runtime {\n public tick(): boolean { return true; }\n}\n\nclass LeafRuntime implements Runtime {\n private elapsedMs = 0;\n private started = false;\n private spawned = false;\n private readonly animation: AnimationDefinition | undefined;\n private readonly poseDuration: number;\n\n public constructor(\n private readonly action: EvaluatedAction,\n private readonly state: MascotState,\n private readonly options: ActionExecutorOptions,\n private readonly callbacks: ActionExecutorCallbacks,\n environment: MascotEnvironment,\n ) {\n const animationEnvironment = { ...environment, ...(action.targetX !== undefined && { targetX: action.targetX }), ...(action.targetY !== undefined && { targetY: action.targetY }) };\n this.animation = action.definition.animations?.find((animation) => !animation.condition || evaluateExpression(animation.condition, animationEnvironment, false))\n ?? action.definition.animations?.find((animation) => !animation.condition)\n ?? action.definition.animations?.[0];\n this.poseDuration = this.animation?.poses.reduce((sum, pose) => sum + Math.max(0, pose.duration), 0) ?? 0;\n }\n\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n const frameScale = deltaMs / this.options.frameDuration;\n if (!this.started) { this.started = true; this.state.lookRight = this.action.lookRight; this.initialize(); }\n this.elapsedMs += deltaMs;\n const pose = this.currentPose();\n if (pose) this.applyPose(pose, frameScale, bounds);\n\n const { definition } = this.action;\n if (definition.type === \"Embedded\") return this.tickEmbedded(frameScale, environment, bounds);\n if (definition.type === \"Move\" && (this.action.targetX !== undefined || this.action.targetY !== undefined)) {\n const reachedX = this.action.targetX === undefined || Math.abs(this.state.x - this.action.targetX) < 0.5;\n const reachedY = this.action.targetY === undefined || Math.abs(this.state.y - this.action.targetY) < 0.5;\n return reachedX && reachedY;\n }\n return this.elapsedMs >= this.durationMs();\n }\n\n private initialize(): void {\n const type = this.action.definition.embedType;\n if (type === \"Fall\" || type === \"FallWithIE\") {\n this.state.vx = this.action.initialVx ?? this.state.vx;\n this.state.vy = this.action.initialVy ?? this.state.vy;\n }\n if (type === \"Offset\") {\n this.state.x += this.action.x ?? 0;\n this.state.y += this.action.y ?? 0;\n }\n if (type === \"Reboot\") { this.state.vx = 0; this.state.vy = 0; }\n }\n\n private tickEmbedded(frameScale: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n switch (this.action.definition.embedType) {\n case \"Fall\": case \"FallWithIE\": case \"Thrown\":\n return applyGravity(\n this.state,\n bounds,\n frameScale,\n this.action.gravity ?? this.options.gravity,\n this.action.resistanceX,\n this.action.resistanceY,\n environment.mascot.environment.activeIE.visible ? environment.mascot.environment.activeIE : undefined,\n );\n case \"Jump\": {\n const target = { x: this.action.targetX ?? this.state.x, y: this.action.targetY ?? this.state.y };\n return moveToward(this.state, target, this.action.velocity ?? 20, frameScale);\n }\n case \"Breed\":\n if (!this.spawned && this.elapsedMs >= this.durationMs()) {\n this.spawned = true;\n const child = { x: this.state.x + (this.action.bornX ?? 0), y: this.state.y + (this.action.bornY ?? 0) };\n this.callbacks.spawn(this.action.definition.bornBehavior ? { ...child, behaviorName: this.action.definition.bornBehavior } : child);\n return true;\n }\n return false;\n case \"Exit\": this.callbacks.remove(); return true;\n case \"Reboot\":\n this.state.x = bounds.x + 128 + Math.max(0, bounds.width - 256) * Math.random();\n this.state.y = bounds.y + 128 + Math.max(0, bounds.height - 256) * Math.random();\n return true;\n case \"Offset\": case \"Look\": return true;\n case \"Dragged\": return false;\n default: return this.elapsedMs >= this.durationMs();\n }\n }\n\n private currentPose(): Pose | undefined {\n if (!this.animation?.poses.length || this.poseDuration <= 0) return undefined;\n let cursor = (this.elapsedMs / this.options.frameDuration) % this.poseDuration;\n for (const pose of this.animation.poses) { cursor -= pose.duration; if (cursor < 0) return pose; }\n return this.animation.poses.at(-1);\n }\n\n private applyPose(pose: Pose, frameScale: number, bounds: Rectangle): void {\n this.state.sprite = pose.sprite;\n this.state.anchorX = pose.anchor.x;\n this.state.anchorY = pose.anchor.y;\n const direction = this.state.lookRight ? -1 : 1;\n this.state.x = clamp(this.state.x + pose.velocity.x * direction * frameScale, bounds.x, bounds.x + bounds.width);\n this.state.y = clamp(this.state.y + pose.velocity.y * frameScale, bounds.y, bounds.y + bounds.height);\n }\n\n private durationMs(): number {\n const frames = this.action.duration ?? this.poseDuration;\n return Math.max(this.options.frameDuration, frames * this.options.frameDuration);\n }\n}\n\n/** Executes normalized action trees independently from DOM rendering. */\nexport class ActionExecutor {\n private runtime: Runtime | undefined;\n\n /** Creates an executor bound to one mascot's mutable internal state. */\n public constructor(\n private readonly spec: CharacterSpec,\n private readonly state: MascotState,\n private readonly options: ActionExecutorOptions,\n private readonly callbacks: ActionExecutorCallbacks,\n ) {}\n\n /** Starts the action whose name matches a selected behavior. */\n public start(actionName: string, environment: MascotEnvironment): boolean {\n const definition = this.spec.actions.find((action) => action.name === actionName);\n this.runtime = definition ? this.createRuntime(definition, environment, new Set()) : undefined;\n return this.runtime !== undefined;\n }\n\n /** Advances the current action and returns true when it has completed. */\n public tick(deltaMs: number, environment: MascotEnvironment, bounds: Rectangle): boolean {\n return this.runtime?.tick(deltaMs, environment, bounds) ?? true;\n }\n\n /** Cancels the current action tree. */\n public cancel(): void { this.runtime = undefined; }\n\n private createRuntime(definition: ActionDefinition, environment: MascotEnvironment, references: Set<string>): Runtime {\n if (definition.condition && !evaluateExpression(definition.condition, environment, false)) return new CompleteRuntime();\n const bounds = environment.mascot.environment.workArea;\n const activeIE = environment.mascot.environment.activeIE;\n if (!isOnBorder(this.state, bounds, definition.borderType, activeIE.visible ? activeIE : undefined)) return new CompleteRuntime();\n if (definition.type === \"Reference\") {\n if (!definition.name || references.has(definition.name)) return new CompleteRuntime();\n const referenced = this.spec.actions.find((action) => action.name === definition.name);\n if (!referenced) return new CompleteRuntime();\n const nextReferences = new Set(references).add(definition.name);\n return this.createRuntime({ ...referenced, ...definition, type: referenced.type }, environment, nextReferences);\n }\n if (definition.type === \"Sequence\") {\n return new SequenceRuntime(definition.actions ?? [], (child, nextEnvironment) => this.createRuntime(child, nextEnvironment, new Set(references)), definition.loop === true);\n }\n if (definition.type === \"Select\") {\n const child = definition.actions?.find((candidate) => !candidate.condition || evaluateExpression(candidate.condition, environment, false));\n return child ? this.createRuntime(child, environment, new Set(references)) : new CompleteRuntime();\n }\n return new LeafRuntime(evaluateAction(definition, environment), this.state, this.options, this.callbacks, environment);\n }\n}\n","import { ActionExecutor } from \"./action\";\nimport { BehaviorController } from \"./behavior\";\nimport type { DomManager, MascotDomHandle } from \"./dom\";\nimport { isOnBottom, isOnLeft, isOnRight, isOnTop } from \"./physics\";\nimport type { PlatformRectangle } from \"./platform\";\nimport type { BehaviorDefinition, CharacterSpec, EnvironmentEdge, EnvironmentRectangle, MascotEnvironment, MascotState, Point, Rectangle, ShimejiEngineOptions, SpawnOptions } from \"./types\";\n\n/** Callbacks through which a mascot communicates with its owning engine. */\nexport interface MascotCallbacks {\n /** Returns the latest pointer position and velocity in work-area coordinates. */\n pointer(): Point & { dx: number; dy: number };\n /** Returns the current number of live mascots. */\n count(): number;\n /** Requests a sibling mascot. */\n spawn(characterId: string, options: SpawnOptions): void;\n /** Requests removal of this mascot. */\n remove(id: string): void;\n /** Reports a click without a drag gesture. */\n click(state: MascotState): void;\n /** Reports a recoverable runtime failure. */\n error(error: Error): void;\n}\n\nfunction edge(predicate: (point: Point) => boolean): EnvironmentEdge { return { isOn: predicate }; }\n\nfunction environmentRectangle(bounds: Rectangle): EnvironmentRectangle {\n const left = bounds.x;\n const right = bounds.x + bounds.width;\n const top = bounds.y;\n const bottom = bounds.y + bounds.height;\n return {\n x: bounds.x, y: bounds.y, width: bounds.width, height: bounds.height,\n left, right, top, bottom,\n topBorder: edge((point) => isOnTop(point, bounds)),\n leftBorder: edge((point) => isOnLeft(point, bounds)),\n rightBorder: edge((point) => isOnRight(point, bounds)),\n bottomBorder: edge((point) => isOnBottom(point, bounds)),\n };\n}\n\nconst PLATFORM_NEARBY_DISTANCE = 400;\nconst PLATFORM_EDGE_TOLERANCE = 16;\n\nfunction distanceToRectangle(point: Point, rectangle: Rectangle): number {\n const dx = Math.max(rectangle.x - point.x, 0, point.x - rectangle.x - rectangle.width);\n const dy = Math.max(rectangle.y - point.y, 0, point.y - rectangle.y - rectangle.height);\n return Math.hypot(dx, dy);\n}\n\n/** Owns one mascot's state machine, interaction listeners, and DOM resource. */\nexport class Mascot {\n /** Mutable internal state; callers should consume snapshots from the engine. */\n public readonly state: MascotState;\n private readonly domHandle: MascotDomHandle;\n private readonly behavior: BehaviorController;\n private readonly actions: ActionExecutor;\n private readonly disposers: Array<() => void> = [];\n private currentBehavior: BehaviorDefinition | undefined;\n private destroyed = false;\n private dragOffset: Point = { x: 0, y: 0 };\n private pointerId: number | undefined;\n private pointerDown: Point | undefined;\n private lastPointer: Point | undefined;\n private activePlatformElement: HTMLElement | undefined;\n private platforms: readonly PlatformRectangle[] = [];\n\n /** Creates a mascot and immediately installs its pointer handlers. */\n public constructor(\n public readonly id: string,\n public readonly spec: CharacterSpec,\n private readonly dom: DomManager,\n options: Required<Pick<ShimejiEngineOptions, \"frameDuration\" | \"gravity\" | \"mascotClassName\">> & { random: (() => number) | undefined },\n spawnOptions: SpawnOptions,\n private readonly callbacks: MascotCallbacks,\n ) {\n const initialPose = spec.actions.flatMap((action) => action.animations ?? []).flatMap((animation) => animation.poses)[0];\n this.state = {\n id,\n characterId: spec.id,\n x: spawnOptions.x ?? 0,\n y: spawnOptions.y ?? 0,\n vx: spawnOptions.vx ?? 0,\n vy: spawnOptions.vy ?? 0,\n sprite: initialPose?.sprite ?? Object.keys(spec.sprites)[0] ?? \"\",\n anchorX: initialPose?.anchor.x ?? 64,\n anchorY: initialPose?.anchor.y ?? 128,\n lookRight: spawnOptions.lookRight ?? false,\n behaviorName: spawnOptions.behaviorName ?? \"Fall\",\n dragging: false,\n };\n this.domHandle = dom.createMascot(spec, id, options.mascotClassName || undefined);\n this.behavior = new BehaviorController(spec, options.random);\n this.actions = new ActionExecutor(spec, this.state, options, {\n spawn: (position) => this.callbacks.spawn(this.spec.id, position),\n remove: () => this.callbacks.remove(this.id),\n });\n this.installPointerHandlers();\n }\n\n /** Advances behavior, animation, physics, and rendering by one clock tick. */\n public tick(deltaMs: number, bounds: Rectangle, platforms: readonly PlatformRectangle[] = []): void {\n if (this.destroyed) return;\n this.platforms = platforms;\n const environment = this.createEnvironment(bounds, platforms);\n if (this.state.dragging) { this.dom.render(this.domHandle, this.spec, this.state); return; }\n try {\n for (let guard = 0; guard < 8; guard += 1) {\n if (!this.currentBehavior) {\n this.currentBehavior = this.behavior.selectInitial(environment, this.state.behaviorName);\n let started = this.startBehavior(environment);\n if (!started) {\n this.currentBehavior = this.findFallBehavior();\n started = this.startBehavior(environment);\n }\n if (!started) break;\n }\n const activeIE = environment.mascot.environment.activeIE;\n const wasOnPlatformTop = activeIE.visible && activeIE.topBorder.isOn(this.state);\n const completed = this.actions.tick(deltaMs, environment, bounds);\n const remainedNearPlatform = this.state.x >= activeIE.left - PLATFORM_EDGE_TOLERANCE\n && this.state.x <= activeIE.right + PLATFORM_EDGE_TOLERANCE;\n if (wasOnPlatformTop\n && !remainedNearPlatform\n && !platforms.some((platform) => isOnTop(this.state, platform))) {\n this.actions.cancel();\n this.currentBehavior = this.findFallBehavior();\n if (this.currentBehavior) this.startBehavior(this.createEnvironment(bounds, platforms));\n break;\n }\n if (!completed) break;\n if (this.destroyed) return;\n this.currentBehavior = this.behavior.selectNext(this.createEnvironment(bounds, platforms));\n if (!this.currentBehavior || !this.startBehavior(this.createEnvironment(bounds, platforms))) {\n this.currentBehavior = this.findFallBehavior();\n if (!this.currentBehavior || !this.startBehavior(this.createEnvironment(bounds, platforms))) break;\n }\n deltaMs = 0;\n }\n } catch (error) {\n this.callbacks.error(error instanceof Error ? error : new Error(String(error)));\n this.currentBehavior = undefined;\n this.actions.cancel();\n }\n this.dom.render(this.domHandle, this.spec, this.state);\n }\n\n /** Returns a detached snapshot safe for application code to retain. */\n public snapshot(): MascotState { return { ...this.state }; }\n\n /** Removes listeners, DOM nodes, and object URLs owned by this mascot. */\n public destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.actions.cancel();\n for (const dispose of this.disposers.splice(0)) dispose();\n this.dom.removeMascot(this.domHandle);\n }\n\n private startBehavior(environment: MascotEnvironment): boolean {\n if (!this.currentBehavior) return false;\n this.state.behaviorName = this.currentBehavior.name;\n return this.actions.start(this.currentBehavior.name, environment);\n }\n\n private findFallBehavior(): BehaviorDefinition | undefined {\n return this.behavior.force(\"Fall\") ?? this.behavior.force(\"落下する\");\n }\n\n private createEnvironment(bounds: Rectangle, platforms: readonly PlatformRectangle[] = this.platforms): MascotEnvironment {\n const workArea = environmentRectangle(bounds);\n const inactive = environmentRectangle({ x: -100, y: -100, width: 0, height: 0 });\n const platform = this.selectActivePlatform(platforms);\n const activeIE = platform\n ? { ...environmentRectangle(platform), visible: true }\n : { ...inactive, visible: false };\n return {\n gap: 0,\n maxCount: 999,\n mascot: {\n totalCount: this.callbacks.count(),\n anchor: { x: this.state.x, y: this.state.y },\n lookRight: this.state.lookRight,\n environment: {\n cursor: this.callbacks.pointer(),\n screen: { width: window.innerWidth, height: window.innerHeight },\n workArea,\n floor: workArea.bottomBorder,\n ceiling: workArea.topBorder,\n activeIE,\n },\n },\n };\n }\n\n private selectActivePlatform(platforms: readonly PlatformRectangle[]): PlatformRectangle | undefined {\n if (platforms.length === 0) {\n this.activePlatformElement = undefined;\n return undefined;\n }\n const anchor = this.state;\n const current = platforms.find((platform) => platform.element === this.activePlatformElement);\n if (current && (\n isOnTop(anchor, current, 2)\n || isOnBottom(anchor, current, 2)\n || isOnLeft(anchor, current, 2)\n || isOnRight(anchor, current, 2)\n )) return current;\n\n if (this.state.vy >= 0) {\n const landingPlatform = platforms\n .filter((platform) => anchor.x >= platform.x && anchor.x <= platform.x + platform.width && platform.y >= anchor.y - 1)\n .sort((left, right) => left.y - right.y)[0];\n if (landingPlatform) {\n this.activePlatformElement = landingPlatform.element;\n return landingPlatform;\n }\n }\n\n const nearby = [...platforms]\n .map((platform) => ({ platform, distance: distanceToRectangle(anchor, platform) }))\n .filter(({ distance }) => distance <= PLATFORM_NEARBY_DISTANCE)\n .sort((left, right) => left.distance - right.distance)[0]?.platform;\n this.activePlatformElement = nearby?.element;\n return nearby;\n }\n\n private installPointerHandlers(): void {\n const element = this.domHandle.spriteElement;\n const listen = <K extends keyof HTMLElementEventMap>(target: EventTarget, type: K, listener: (event: HTMLElementEventMap[K]) => void): void => {\n target.addEventListener(type, listener as EventListener);\n this.disposers.push(() => target.removeEventListener(type, listener as EventListener));\n };\n listen(element, \"pointerdown\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (pointerEvent.button !== 0) return;\n event.preventDefault();\n const point = { x: pointerEvent.clientX, y: pointerEvent.clientY };\n this.pointerId = pointerEvent.pointerId;\n this.pointerDown = point;\n this.lastPointer = point;\n this.dragOffset = { x: this.state.x - point.x, y: this.state.y - point.y };\n this.state.dragging = true;\n this.actions.cancel();\n this.currentBehavior = this.behavior.force(\"Dragged\") ?? this.behavior.force(\"ドラッグされる\");\n if (this.currentBehavior) this.state.behaviorName = this.currentBehavior.name;\n element.setPointerCapture?.(pointerEvent.pointerId);\n });\n listen(document, \"pointermove\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (!this.state.dragging || pointerEvent.pointerId !== this.pointerId) return;\n const point = { x: pointerEvent.clientX, y: pointerEvent.clientY };\n const previous = this.lastPointer ?? point;\n this.state.vx = (point.x - previous.x) * 0.8;\n this.state.vy = (point.y - previous.y) * 0.8;\n this.state.x = point.x + this.dragOffset.x;\n this.state.y = point.y + this.dragOffset.y;\n this.lastPointer = point;\n });\n listen(document, \"pointerup\", (event) => {\n const pointerEvent = event as PointerEvent;\n if (!this.state.dragging || pointerEvent.pointerId !== this.pointerId) return;\n this.state.dragging = false;\n const moved = this.pointerDown ? Math.hypot(this.lastPointer!.x - this.pointerDown.x, this.lastPointer!.y - this.pointerDown.y) : 0;\n this.pointerId = undefined;\n this.currentBehavior = this.behavior.force(\"Thrown\") ?? this.behavior.force(\"投げられる\") ?? this.findFallBehavior();\n if (this.currentBehavior) {\n this.state.behaviorName = this.currentBehavior.name;\n this.actions.start(this.currentBehavior.name, this.createEnvironment(this.dom.getBounds()));\n }\n if (moved < 4) this.callbacks.click(this.snapshot());\n });\n }\n}\n","import type { Rectangle } from \"./types\";\n\n/** A platform rectangle paired with the DOM element that produced it. */\nexport interface PlatformRectangle extends Rectangle {\n element: HTMLElement;\n}\n\n/** Resolves a platform option into DOM elements, excluding engine-owned nodes. */\nexport function resolvePlatformElements(\n source: string | readonly HTMLElement[],\n document: Document,\n excludedRoot?: HTMLElement,\n): HTMLElement[] {\n let elements: readonly Element[];\n if (typeof source === \"string\") {\n try {\n elements = [...document.querySelectorAll(source)];\n } catch {\n return [];\n }\n } else {\n elements = source;\n }\n const HTMLElementConstructor = document.defaultView?.HTMLElement;\n if (!HTMLElementConstructor) return [];\n return [...new Set(elements)].filter((element): element is HTMLElement =>\n element instanceof HTMLElementConstructor && element.isConnected && (!excludedRoot || !excludedRoot.contains(element)),\n );\n}\n\n/** Reads platform bounds once and converts viewport coordinates to the supplied origin. */\nexport function readPlatformRectangles(\n elements: readonly HTMLElement[],\n workAreaRectangle: Pick<DOMRect, \"left\" | \"top\">,\n): PlatformRectangle[] {\n const rectangles: PlatformRectangle[] = [];\n for (const element of elements) {\n const rectangle = element.getBoundingClientRect();\n if (rectangle.width <= 0 || rectangle.height <= 0) continue;\n rectangles.push({\n element,\n x: rectangle.left - workAreaRectangle.left,\n y: rectangle.top - workAreaRectangle.top,\n width: rectangle.width,\n height: rectangle.height,\n });\n }\n return rectangles;\n}\n","import type { CharacterSpec, IndividualSprite, SpriteRectangle } from \"./types\";\n\n/** A resolved image and optional atlas crop for one sprite frame. */\nexport interface ResolvedSprite {\n /** Browser-loadable image URL. */\n url: string;\n /** Optional atlas crop. */\n rectangle?: SpriteRectangle;\n}\n\n/** A per-mascot spritesheet resource whose temporary URL can be released. */\nexport interface SpriteLease {\n /** URL used to render atlas-backed frames. */\n url: string;\n /** Releases any object URL owned by this lease. */\n release(): void;\n}\n\nfunction dataUriToBlob(source: string): Blob {\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(source);\n if (!match) throw new TypeError(\"Invalid image data URI\");\n const mimeType = match[1] ?? \"application/octet-stream\";\n const encoded = match[3] ?? \"\";\n const binary = match[2] ? atob(encoded) : decodeURIComponent(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: mimeType });\n}\n\n/** Owns temporary sprite URLs and resolves atlas or individual image frames. */\nexport class SpriteManager {\n private readonly leases = new Set<SpriteLease>();\n\n /** Creates a separately releasable spritesheet lease for a mascot. */\n public acquire(source: string | Blob): SpriteLease {\n let url = typeof source === \"string\" ? source : \"\";\n let owned = false;\n if (typeof URL.createObjectURL === \"function\" && (typeof source !== \"string\" || source.startsWith(\"data:image\"))) {\n try {\n url = URL.createObjectURL(typeof source === \"string\" ? dataUriToBlob(source) : source);\n owned = true;\n } catch {\n if (typeof source !== \"string\") throw new Error(\"The current environment cannot create a URL for the spritesheet Blob\");\n }\n }\n let released = false;\n const lease: SpriteLease = {\n url,\n release: () => {\n if (released) return;\n released = true;\n this.leases.delete(lease);\n if (owned) URL.revokeObjectURL(url);\n },\n };\n this.leases.add(lease);\n return lease;\n }\n\n /** Resolves a sprite key using a lease and the character's sprite map. */\n public resolve(spec: CharacterSpec, lease: SpriteLease, spriteName: string): ResolvedSprite | undefined {\n const key = Object.keys(spec.sprites).find((candidate) => candidate.toLowerCase() === spriteName.toLowerCase());\n const sprite = key ? spec.sprites[key] : undefined;\n if (typeof sprite === \"string\") return { url: sprite };\n if (sprite && \"url\" in sprite && typeof sprite.url === \"string\" && !(\"x\" in sprite)) return { url: sprite.url };\n if (sprite && \"x\" in sprite) return { url: sprite.url ?? lease.url, rectangle: sprite };\n if (/^(?:data:|blob:|https?:|\\/)/.test(spriteName)) return { url: spriteName };\n return undefined;\n }\n\n /** Revokes every object URL that has not already been released. */\n public destroy(): void {\n for (const lease of [...this.leases]) lease.release();\n }\n}\n\n/** Returns whether a sprite definition is a standalone image object. */\nexport function isIndividualSprite(sprite: SpriteRectangle | IndividualSprite | string): sprite is IndividualSprite {\n return typeof sprite === \"object\" && \"url\" in sprite && !(\"x\" in sprite);\n}\n","import { DomManager } from \"./dom\";\nimport { normalizeCharacterSpec } from \"./loader\";\nimport { Mascot } from \"./mascot\";\nimport { readPlatformRectangles, resolvePlatformElements, type PlatformRectangle } from \"./platform\";\nimport { SpriteManager } from \"./sprite\";\nimport type { CharacterSpec, MascotState, ShimejiEngineEventMap, ShimejiEngineOptions, ShimejiEventListener, SpawnOptions } from \"./types\";\n\nclass EventEmitter<Events extends object> {\n private readonly listeners = new Map<keyof Events, Set<(payload: never) => void>>();\n public on<K extends keyof Events>(event: K, listener: (payload: Events[K]) => void): () => void {\n const listeners = this.listeners.get(event) ?? new Set();\n listeners.add(listener as (payload: never) => void);\n this.listeners.set(event, listeners);\n return () => { listeners.delete(listener as (payload: never) => void); };\n }\n public emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n for (const listener of [...(this.listeners.get(event) ?? [])]) listener(payload as never);\n }\n public clear(): void { this.listeners.clear(); }\n}\n\nconst defaults = {\n frameDuration: 40,\n gravity: 2,\n maxDeltaTime: 100,\n workAreaClassName: \"\",\n mascotClassName: \"\",\n platforms: [] as readonly HTMLElement[],\n} as const;\n\ntype ResolvedEngineOptions = Required<Omit<ShimejiEngineOptions, \"random\">> & { random: (() => number) | undefined };\n\n/** Framework-agnostic manager for character registration and live Shimeji mascots. */\nexport class ShimejiEngine {\n private readonly specs = new Map<string, CharacterSpec>();\n private readonly mascots = new Map<string, Mascot>();\n private readonly sprites = new SpriteManager();\n private readonly dom: DomManager;\n private readonly events = new EventEmitter<ShimejiEngineEventMap>();\n private readonly disposers: Array<() => void> = [];\n private readonly intervals = new Set<number>();\n private readonly options: ResolvedEngineOptions;\n private pointer = { x: 0, y: 0, dx: 0, dy: 0 };\n private animationFrame: number | undefined;\n private lastFrameTime: number | undefined;\n private nextMascotId = 1;\n private destroyed = false;\n private initialized = false;\n private platformSource: string | readonly HTMLElement[];\n\n /** Creates and initializes an engine inside a host DOM element. */\n public constructor(private readonly container: HTMLElement, options: ShimejiEngineOptions = {}) {\n if (!container) throw new TypeError(\"ShimejiEngine requires a container element\");\n this.options = { ...defaults, ...options, random: options.random };\n this.platformSource = this.options.platforms;\n this.dom = new DomManager(container, this.sprites);\n this.initialize();\n }\n\n /** Starts the clock and global listeners. Calling this method more than once is harmless. */\n public initialize(): void {\n this.assertAlive();\n if (this.initialized) return;\n this.initialized = true;\n this.listen(document, \"pointermove\", (event) => {\n const pointerEvent = event as PointerEvent;\n const x = pointerEvent.clientX;\n const y = pointerEvent.clientY;\n this.pointer = { x, y, dx: x - this.pointer.x, dy: y - this.pointer.y };\n });\n this.listen(window, \"resize\", () => this.renderAll());\n const maintenance = window.setInterval(() => this.dom.ensureMounted(), 2_000);\n this.intervals.add(maintenance);\n this.animationFrame = requestAnimationFrame(this.onAnimationFrame);\n }\n\n /** Registers or replaces a parsed or legacy character specification. */\n public registerCharacter(spec: CharacterSpec | unknown): string {\n this.assertAlive();\n const normalized = normalizeCharacterSpec(spec);\n this.specs.set(normalized.id, normalized);\n return normalized.id;\n }\n\n /** Unregisters a character and optionally removes all of its live mascots. */\n public unregisterCharacter(characterId: string, removeMascots = true): boolean {\n this.assertAlive();\n if (removeMascots) {\n for (const state of this.getState()) if (state.characterId === characterId) this.remove(state.id);\n }\n return this.specs.delete(characterId);\n }\n\n /** Returns identifiers for all currently registered characters. */\n public getCharacterIds(): string[] { return [...this.specs.keys()]; }\n\n /** Creates a mascot from a registered character and returns its instance id. */\n public spawn(characterId: string, position: SpawnOptions = {}): string {\n this.assertAlive();\n const spec = this.specs.get(characterId);\n if (!spec) throw new Error(`Character '${characterId}' is not registered`);\n const { bounds, platforms } = this.readFrameGeometry();\n const random = this.options.random ?? Math.random;\n const spawnOptions: SpawnOptions = {\n ...position,\n x: position.x ?? bounds.x + random() * bounds.width,\n y: position.y ?? bounds.y,\n };\n const id = `shimeji-${this.nextMascotId++}`;\n const mascot = new Mascot(id, spec, this.dom, this.options, spawnOptions, {\n pointer: () => ({ ...this.pointer }),\n count: () => this.mascots.size,\n spawn: (nextCharacterId, nextPosition) => { if (!this.destroyed) this.spawn(nextCharacterId, nextPosition); },\n remove: (mascotId) => { if (!this.destroyed) this.remove(mascotId); },\n click: (state) => this.events.emit(\"click\", state),\n error: (error) => this.events.emit(\"error\", error),\n });\n this.mascots.set(id, mascot);\n mascot.tick(0, bounds, platforms);\n const state = mascot.snapshot();\n this.events.emit(\"spawn\", state);\n this.emitState();\n return id;\n }\n\n /** Removes one mascot and all resources associated with it. */\n public remove(mascotId: string): boolean {\n this.assertAlive();\n const mascot = this.mascots.get(mascotId);\n if (!mascot) return false;\n const state = mascot.snapshot();\n this.mascots.delete(mascotId);\n mascot.destroy();\n this.events.emit(\"remove\", state);\n this.emitState();\n return true;\n }\n\n /** Removes every live mascot while leaving registered character specs available. */\n public removeAll(): void {\n this.assertAlive();\n for (const id of [...this.mascots.keys()]) this.remove(id);\n }\n\n /** Returns detached snapshots of every live mascot. */\n public getState(): MascotState[] { return [...this.mascots.values()].map((mascot) => mascot.snapshot()); }\n\n /** Subscribes to a typed engine event and returns an unsubscribe function. */\n public on<K extends keyof ShimejiEngineEventMap>(event: K, listener: ShimejiEventListener<K>): () => void {\n this.assertAlive();\n return this.events.on(event, listener);\n }\n\n /** Replaces the DOM elements (or selector) exposed to mascots as platforms. */\n public setPlatforms(platforms: string | readonly HTMLElement[]): void {\n this.assertAlive();\n this.platformSource = platforms;\n }\n\n /** Stops animation and timers, removes listeners and DOM, and revokes all object URLs. */\n public destroy(): void {\n if (this.destroyed) return;\n for (const mascot of this.mascots.values()) mascot.destroy();\n this.mascots.clear();\n if (this.animationFrame !== undefined) cancelAnimationFrame(this.animationFrame);\n this.animationFrame = undefined;\n for (const interval of this.intervals) window.clearInterval(interval);\n this.intervals.clear();\n for (const dispose of this.disposers.splice(0)) dispose();\n this.dom.destroy();\n this.sprites.destroy();\n this.specs.clear();\n this.events.clear();\n this.destroyed = true;\n this.initialized = false;\n }\n\n /** Returns whether this engine has completed permanent teardown. */\n public isDestroyed(): boolean { return this.destroyed; }\n\n private readonly onAnimationFrame = (timestamp: number): void => {\n if (this.destroyed) return;\n const rawDelta = this.lastFrameTime === undefined ? this.options.frameDuration : timestamp - this.lastFrameTime;\n this.lastFrameTime = timestamp;\n const delta = Math.max(0, Math.min(rawDelta, this.options.maxDeltaTime));\n const { bounds, platforms } = this.readFrameGeometry();\n for (const mascot of [...this.mascots.values()]) mascot.tick(delta, bounds, platforms);\n this.emitState();\n this.animationFrame = requestAnimationFrame(this.onAnimationFrame);\n };\n\n private renderAll(): void {\n const { bounds, platforms } = this.readFrameGeometry();\n for (const mascot of this.mascots.values()) mascot.tick(0, bounds, platforms);\n }\n\n private readFrameGeometry(): { bounds: ReturnType<DomManager[\"getBounds\"]>; platforms: PlatformRectangle[] } {\n const bounds = this.dom.getBounds();\n const elements = resolvePlatformElements(this.platformSource, this.container.ownerDocument)\n .filter((element) => !this.dom.owns(element));\n return { bounds, platforms: readPlatformRectangles(elements, { left: 0, top: 0 }) };\n }\n\n private emitState(): void { this.events.emit(\"statechange\", this.getState()); }\n\n private listen(target: EventTarget, type: string, listener: EventListener): void {\n target.addEventListener(type, listener);\n this.disposers.push(() => target.removeEventListener(type, listener));\n }\n\n private assertAlive(): void {\n if (this.destroyed) throw new Error(\"ShimejiEngine has been destroyed\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACcO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAIf,YACY,WACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EALF,UAAU,oBAAI,IAAqB;AAAA;AAAA,EAS7C,gBAAsB;AAC3B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI,OAAO,QAAQ,kBAAkB,KAAK,UAAW,MAAK,UAAU,YAAY,OAAO,OAAO;AAAA,IAChG;AAAA,EACF;AAAA;AAAA,EAGO,YAAuB;AAC5B,UAAM,OAAO,KAAK,UAAU,cAAc,eAAe;AACzD,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,EACxE;AAAA;AAAA,EAGO,aAAa,MAAqB,UAAkB,iBAA2C;AACpG,UAAM,cAAc,KAAK,QAAQ,QAAQ,KAAK,WAAW;AACzD,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,QAAQ,YAAY;AAC5B,QAAI,gBAAiB,SAAQ,YAAY;AACzC,WAAO,OAAO,QAAQ,OAAO,EAAE,UAAU,SAAS,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ,KAAK,eAAe,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,YAAY,YAAY,CAAC;AACpL,UAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,WAAO,OAAO,cAAc,OAAO,EAAE,UAAU,YAAY,MAAM,KAAK,KAAK,KAAK,kBAAkB,aAAa,iBAAiB,iBAAiB,eAAe,QAAQ,aAAa,QAAQ,YAAY,OAAO,CAAC;AACjN,YAAQ,YAAY,aAAa;AACjC,UAAM,SAAS,EAAE,SAAS,eAAe,YAAY;AACrD,SAAK,QAAQ,IAAI,MAAM;AACvB,SAAK,UAAU,YAAY,OAAO;AAClC,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,OAAO,QAAyB,MAAqB,OAA0B;AACpF,UAAM,SAAS,KAAK,QAAQ,QAAQ,MAAM,OAAO,aAAa,MAAM,MAAM;AAC1E,WAAO,QAAQ,MAAM,YAAY,eAAe,MAAM,IAAI,MAAM,OAAO,OAAO,MAAM,IAAI,MAAM,OAAO;AACrG,WAAO,cAAc,MAAM,OAAO;AAClC,WAAO,cAAc,MAAM,MAAM;AACjC,WAAO,cAAc,MAAM,YAAY,UAAU,MAAM,YAAY,KAAK,CAAC;AACzE,QAAI,CAAC,OAAQ;AACb,WAAO,cAAc,MAAM,kBAAkB,QAAQ,OAAO,IAAI,WAAW,KAAK,KAAK,CAAC;AACtF,QAAI,OAAO,WAAW;AACpB,aAAO,cAAc,MAAM,QAAQ,GAAG,OAAO,UAAU,KAAK;AAC5D,aAAO,cAAc,MAAM,SAAS,GAAG,OAAO,UAAU,MAAM;AAC9D,aAAO,QAAQ,MAAM,QAAQ,GAAG,OAAO,UAAU,KAAK;AACtD,aAAO,QAAQ,MAAM,SAAS,GAAG,OAAO,UAAU,MAAM;AACxD,aAAO,cAAc,MAAM,qBAAqB,GAAG,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC;AAC/F,aAAO,cAAc,MAAM,iBAAiB;AAAA,IAC9C,OAAO;AACL,aAAO,cAAc,MAAM,qBAAqB;AAChD,aAAO,cAAc,MAAM,iBAAiB;AAC5C,aAAO,cAAc,MAAM,QAAQ;AACnC,aAAO,cAAc,MAAM,SAAS;AACpC,YAAM,aAAa,OAAO,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,cAAc,OAAO,cAAc,YAAY,SAAS,aAAa,UAAU,QAAQ,OAAO,GAAG;AACtJ,UAAI,OAAO,eAAe,YAAY,WAAW,cAAc,WAAW,UAAU,OAAW,QAAO,cAAc,MAAM,QAAQ,GAAG,WAAW,KAAK;AACrJ,UAAI,OAAO,eAAe,YAAY,YAAY,cAAc,WAAW,WAAW,OAAW,QAAO,cAAc,MAAM,SAAS,GAAG,WAAW,MAAM;AACzJ,aAAO,QAAQ,MAAM,QAAQ,OAAO,cAAc,MAAM;AACxD,aAAO,QAAQ,MAAM,SAAS,OAAO,cAAc,MAAM;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAGO,aAAa,QAA+B;AACjD,QAAI,CAAC,KAAK,QAAQ,OAAO,MAAM,EAAG;AAClC,WAAO,QAAQ,OAAO;AACtB,WAAO,YAAY,QAAQ;AAAA,EAC7B;AAAA;AAAA,EAGO,KAAK,SAA+B;AACzC,eAAW,UAAU,KAAK,QAAS,KAAI,OAAO,YAAY,WAAW,OAAO,QAAQ,SAAS,OAAO,EAAG,QAAO;AAC9G,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,UAAgB;AACrB,eAAW,UAAU,CAAC,GAAG,KAAK,OAAO,EAAG,MAAK,aAAa,MAAM;AAAA,EAClE;AACF;;;ACpFA,IAAM,kBAA8C;AAAA,EAClD,UAAU;AAAA,EAAY,QAAQ;AAAA,EAAU,WAAW;AAAA,EAAa,MAAM;AAAA,EAAQ,SAAS;AAAA,EAAW,MAAM;AAAA,EAAQ,UAAU;AAAA,EAC1H,cAAI;AAAA,EAAY,cAAI;AAAA,EAAU,cAAI;AAAA,EAAa,cAAI;AAAA,EAAQ,cAAI;AAAA,EAAW,cAAI;AAAA,EAAQ,0BAAM;AAC9F;AACA,IAAM,kBAA8C,EAAE,OAAO,SAAS,MAAM,QAAQ,SAAS,WAAW,cAAI,SAAS,QAAG,QAAQ,cAAI,UAAU;AAE9I,SAAS,UAAa,OAAmB,OAAkB;AACzD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AAAE,WAAO,KAAK,MAAM,KAAK;AAAA,EAAQ,SAAS,OAAO;AAAE,UAAM,IAAI,UAAU,WAAW,KAAK,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAAG;AAC7J;AAEA,SAAS,UAAU,YAAqB,OAAqC;AAC3E,aAAW,QAAQ,OAAO;AAAE,UAAM,QAAQ,QAAQ,aAAa,IAAI;AAAG,QAAI,UAAU,KAAM,QAAO;AAAA,EAAO;AACxG,SAAO;AACT;AAEA,SAAS,eAAe,YAAqB,OAA4B;AACvE,QAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,SAAO,MAAM,KAAK,QAAQ,QAAQ,EAAE,OAAO,CAAC,UAAU,SAAS,IAAI,MAAM,SAAS,KAAK,SAAS,IAAI,MAAM,OAAO,CAAC;AACpH;AAEA,SAAS,WAAW,OAA2B,WAAkB,EAAE,GAAG,GAAG,GAAG,EAAE,GAAU;AACtF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,IAAI,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AACpE,SAAO,EAAE,GAAG,OAAO,SAAS,CAAC,IAAI,IAAI,SAAS,GAAG,GAAG,OAAO,SAAS,CAAC,IAAI,IAAI,SAAS,EAAE;AAC1F;AAEA,SAAS,mBAA8B;AACrC,MAAI,OAAO,cAAc,YAAa,OAAM,IAAI,MAAM,wGAAwG;AAC9J,SAAO,IAAI,UAAU;AACvB;AAEA,SAAS,cAAc,KAAa,OAAyB;AAC3D,QAAMA,YAAW,iBAAiB,EAAE,gBAAgB,IAAI,QAAQ,WAAW,EAAE,GAAG,iBAAiB;AACjG,QAAM,QAAQA,UAAS,cAAc,aAAa;AAClD,MAAI,MAAO,OAAM,IAAI,UAAU,WAAW,KAAK,KAAK,MAAM,aAAa,KAAK,KAAK,iBAAiB,EAAE;AACpG,SAAOA;AACT;AAEA,SAAS,eAAe,YAAqB,OAAqC;AAAE,SAAO,UAAU,SAAS,GAAG,KAAK;AAAG;AAEzH,SAAS,eAAe,SAAuC;AAC7D,QAAM,QAAQ,eAAe,SAAS,QAAQ,oBAAK,EAAE,IAAI,CAAC,UAAgB;AAAA,IACxE,QAAQ,UAAU,MAAM,SAAS,cAAI,KAAK;AAAA,IAC1C,QAAQ,WAAW,UAAU,MAAM,UAAU,0BAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,IACvE,UAAU,WAAW,UAAU,MAAM,YAAY,0BAAM,CAAC;AAAA,IACxD,UAAU,OAAO,UAAU,MAAM,YAAY,cAAI,KAAK,CAAC;AAAA,EACzD,EAAE;AACF,QAAM,YAAY,UAAU,SAAS,aAAa,cAAI;AACtD,SAAO,EAAE,OAAO,GAAI,cAAc,UAAa,EAAE,UAAU,EAAG;AAChE;AAEA,SAAS,mBAAmB,SAAoC;AAC9D,QAAM,cAAc,QAAQ,cAAc,qBAAqB,QAAQ,cAAc;AACrF,QAAM,UAAU,cAAc,cAAc,UAAU,SAAS,QAAQ,cAAI,MAAM,eAAe,SAAS,UAAU,gBAAM,mBAAmB,0BAAM,EAAE,SAAS,aAAa;AAC1K,QAAM,YAAY,UAAU,SAAS,SAAS,oBAAK;AACnD,QAAM,YAAY,WAAW,MAAM,GAAG,EAAE,GAAG,EAAE;AAC7C,QAAM,OAAO,gBAAgB,OAAO,MAAM,YAAY,aAAa;AACnE,QAAM,OAAO,UAAU,SAAS,QAAQ,cAAI;AAC5C,QAAM,YAAY,eAAe,SAAS,aAAa,cAAI;AAC3D,QAAM,YAAY,eAAe,SAAS,cAAc,UAAU,QAAG;AACrE,QAAM,UAAU,eAAe,SAAS,UAAU,gBAAM,mBAAmB,0BAAM,EAAE,IAAI,kBAAkB;AACzG,QAAM,aAAa,eAAe,SAAS,aAAa,4CAAS,EAAE,IAAI,cAAc;AACrF,QAAM,SAA2B;AAAA,IAC/B;AAAA,IACA,GAAI,SAAS,UAAa,EAAE,KAAK;AAAA,IACjC,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,IAC3C,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,IAC3C,GAAI,cAAc,UAAa,gBAAgB,SAAS,MAAM,UAAa,EAAE,YAAY,gBAAgB,SAAS,EAAE;AAAA,IACpH,GAAI,QAAQ,SAAS,KAAK,EAAE,QAAQ;AAAA,IACpC,GAAI,WAAW,SAAS,KAAK,EAAE,WAAW;AAAA,EAC5C;AACA,QAAM,aAAkE;AAAA,IACtE,CAAC,YAAY,eAAe,SAAS,YAAY,cAAI,CAAC;AAAA,IAAG,CAAC,OAAO,eAAe,SAAS,OAAO,cAAI,CAAC;AAAA,IAAG,CAAC,WAAW,eAAe,SAAS,WAAW,qBAAM,CAAC;AAAA,IAC9J,CAAC,WAAW,eAAe,SAAS,WAAW,qBAAM,CAAC;AAAA,IAAG,CAAC,YAAY,eAAe,SAAS,YAAY,cAAI,CAAC;AAAA,IAC/G,CAAC,KAAK,eAAe,SAAS,KAAK,eAAK,CAAC;AAAA,IAAG,CAAC,KAAK,eAAe,SAAS,KAAK,eAAK,CAAC;AAAA,IACrF,CAAC,aAAa,eAAe,SAAS,aAAa,aAAa,eAAK,CAAC;AAAA,IAAG,CAAC,aAAa,eAAe,SAAS,aAAa,aAAa,eAAK,CAAC;AAAA,IAC/I,CAAC,eAAe,eAAe,SAAS,eAAe,2BAAO,CAAC;AAAA,IAAG,CAAC,eAAe,eAAe,SAAS,eAAe,2BAAO,CAAC;AAAA,IACjI,CAAC,WAAW,eAAe,SAAS,WAAW,cAAI,CAAC;AAAA,IAAG,CAAC,SAAS,eAAe,SAAS,SAAS,eAAK,CAAC;AAAA,IACxG,CAAC,SAAS,eAAe,SAAS,SAAS,eAAK,CAAC;AAAA,IAAG,CAAC,gBAAgB,eAAe,SAAS,gBAAgB,sCAAQ,CAAC;AAAA,IACtH,CAAC,aAAa,eAAe,SAAS,aAAa,iBAAO,CAAC;AAAA,IAAG,CAAC,aAAa,eAAe,SAAS,aAAa,iBAAO,CAAC;AAAA,IACzH,CAAC,aAAa,eAAe,SAAS,aAAa,oBAAK,CAAC;AAAA,EAC3D;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,WAAY,KAAI,UAAU,OAAW,CAAC,OAA8C,GAAG,IAAI;AACtH,QAAM,OAAO,eAAe,SAAS,QAAQ,0BAAM;AACnD,MAAI,SAAS,OAAW,QAAO,OAAO,KAAK,YAAY,MAAM;AAC7D,SAAO;AACT;AAGO,SAAS,gBAAgB,KAAiC;AAC/D,QAAMA,YAAW,cAAc,KAAK,aAAa;AACjD,QAAM,QAAQ,MAAM,KAAKA,UAAS,uBAAuB,KAAK,YAAY,CAAC,EAAE,OAAO,MAAM,KAAKA,UAAS,uBAAuB,KAAK,gCAAO,CAAC,CAAC;AAC7I,QAAM,QAAQ,MAAM,SAAS,QAAQ,CAACA,UAAS,eAAe;AAC9D,SAAO,MAAM,QAAQ,CAAC,SAAS,eAAe,MAAM,UAAU,cAAI,EAAE,IAAI,kBAAkB,CAAC;AAC7F;AAEA,SAAS,qBAAqB,SAAkB,qBAAwC,YAAwC;AAC9H,QAAM,YAAY,UAAU,SAAS,aAAa,cAAI;AACtD,QAAM,aAAa,CAAC,GAAG,qBAAqB,GAAI,YAAY,CAAC,SAAS,IAAI,CAAC,CAAE;AAC7E,QAAM,WAAW,eAAe,SAAS,oBAAoB,gBAAgB,4CAAS,EAAE,CAAC;AACzF,QAAM,gBAAgB,WAClB,eAAe,UAAU,YAAY,gBAAM,qBAAqB,qBAAqB,0BAAM,EAAE,IAAI,CAAC,UAAU,qBAAqB,OAAO,YAAY,CAAC,CAAC,IACtJ,CAAC;AACL,QAAM,YAAY,QAAQ,cAAc,uBAAuB,QAAQ,cAAc,uBAAuB,QAAQ,cAAc;AAClI,SAAO;AAAA,IACL,MAAM,YAAY,cAAc;AAAA,IAChC,MAAM,UAAU,SAAS,QAAQ,cAAI,KAAK;AAAA,IAC1C,WAAW,OAAO,UAAU,SAAS,aAAa,cAAI,KAAK,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,UAAU,SAAS,UAAU,oBAAK,KAAK,SAAS,YAAY,MAAM;AAAA,EAC7E;AACF;AAGO,SAAS,kBAAkB,KAAmC;AACnE,QAAMA,YAAW,cAAc,KAAK,eAAe;AACnD,QAAM,QAAQ,MAAM,KAAKA,UAAS,uBAAuB,KAAK,cAAc,CAAC,EAAE,OAAO,MAAM,KAAKA,UAAS,uBAAuB,KAAK,gCAAO,CAAC,CAAC;AAC/I,QAAM,OAAO,MAAM,CAAC,KAAKA,UAAS;AAClC,QAAM,YAAkC,CAAC;AACzC,MAAI,aAAa;AACjB,aAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7C,QAAI,MAAM,cAAc,eAAe,MAAM,cAAc,gBAAM;AAC/D,oBAAc;AACd,YAAM,YAAY,UAAU,OAAO,aAAa,cAAI;AACpD,YAAM,YAAY,YAAY,CAAC,SAAS,IAAI,CAAC;AAC7C,gBAAU,KAAK,GAAG,eAAe,OAAO,YAAY,gBAAM,qBAAqB,qBAAqB,0BAAM,EAAE,IAAI,CAAC,YAAY,qBAAqB,SAAS,WAAW,UAAU,CAAC,CAAC;AAAA,IACpL,WAAW,CAAC,YAAY,gBAAM,qBAAqB,qBAAqB,0BAAM,EAAE,SAAS,MAAM,SAAS,GAAG;AACzG,gBAAU,KAAK,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,OAAO,YAAY,MAAM,QAAQ,UAAU,OAAO,KAAK,MAAM,QAAQ,UAAU,SAAS,KAAK,OAAO,UAAU,YAAY,YAAY,UAAU,YAAY,SAAS,OAAO,UAAU,gBAAgB,YAAa,OAAO,SAAS,eAAe,UAAU,uBAAuB;AAC7S;AAGO,SAAS,uBAAuB,OAAqE;AAC1G,MAAI,YAAqB;AACzB,MAAI,OAAO,cAAc,SAAU,aAAY,UAAmB,WAAW,gBAAgB;AAC7F,MAAI,CAAC,aAAa,OAAO,cAAc,SAAU,OAAM,IAAI,UAAU,kCAAkC;AACvG,QAAM,SAAS;AACf,MAAI,OAAO,eAAe;AACxB,UAAM,gBAAgB,OAAO,OAAO,kBAAkB,WAClD,UAAmC,OAAO,eAAe,eAAe,IACxE,OAAO;AACX,QAAI,OAAO,kBAAkB,SAAU,aAAY,EAAE,GAAI,eAA0B,GAAG,OAAO;AAAA,EAC/F;AACA,QAAM,OAAO;AACb,QAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,KAAK,UAAU,YAAY,WAAW,KAAK,SAAS,UAAU;AACxH,MAAI,CAAC,GAAI,OAAM,IAAI,UAAU,wCAAwC;AACrE,MAAI,KAAK,YAAY,UAAa,KAAK,cAAc,UAAa,KAAK,YAAY,UAAa,KAAK,gBAAgB,OAAW,OAAM,IAAI,UAAU,cAAc,EAAE,0DAA0D;AAC9N,QAAM,UAAU,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,UAAU,EAAE,WAAW,GAAG,IAAI,gBAAgB,KAAK,OAAO,IAAI,UAA8B,KAAK,SAAS,SAAS;AACpL,QAAM,YAAY,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,UAAU,EAAE,WAAW,GAAG,IAAI,kBAAkB,KAAK,SAAS,IAAI,UAAgC,KAAK,WAAW,WAAW;AACpM,QAAM,UAAU,UAAqB,KAAK,SAAS,SAAS;AAC5D,QAAM,OAAsB;AAAA,IAC1B;AAAA,IACA,aAAa,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,OAAO,KAAK,SAAS,YAAY,EAAE,MAAM,KAAK,KAAK;AAAA,IACvD,GAAI,KAAK,aAAa,UAAa,EAAE,UAAU,KAAK,SAAS;AAAA,EAC/D;AACA,MAAI,CAAC,gBAAgB,IAAI,EAAG,OAAM,IAAI,UAAU,cAAc,EAAE,2BAA2B;AAC3F,SAAO;AACT;AAGA,eAAsB,cAAc,QAAiD;AACnF,MAAI,OAAO,WAAW,YAAY,EAAE,kBAAkB,KAAM,QAAO,uBAAuB,MAAM;AAChG,QAAM,MAAM,kBAAkB,MAAM,SAAS,IAAI,IAAI,QAAQ,OAAO,aAAa,cAAc,sBAAsB,SAAS,OAAO;AACrI,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,6BAA6B,GAAG,MAAM,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAChH,QAAM,OAAO,uBAAuB,MAAM,SAAS,KAAK,CAAY;AACpE,MAAI,OAAO,KAAK,gBAAgB,YAAY,CAAC,mBAAmB,KAAK,KAAK,WAAW,GAAG;AACtF,SAAK,cAAc,IAAI,IAAI,KAAK,aAAa,GAAG,EAAE,SAAS;AAAA,EAC7D;AACA,SAAO;AACT;;;AC1LA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,aAAa,aAAa,aAAa,CAAC;AAC7E,IAAM,YAA2D;AAAA,EAC/D,KAAK,KAAK;AAAA,EAAK,MAAM,KAAK;AAAA,EAAM,OAAO,KAAK;AAAA,EAAO,MAAM,KAAK;AAAA,EAAM,OAAO,KAAK;AAAA,EAChF,MAAM,KAAK;AAAA,EAAM,OAAO,KAAK;AAAA,EAAO,OAAO,KAAK;AAAA,EAAO,MAAM,KAAK;AAAA,EAAM,MAAM,KAAK;AAAA,EACnF,KAAK,KAAK;AAAA,EAAK,MAAM,KAAK;AAAA,EAAM,KAAK,KAAK;AAAA,EAAK,OAAO,KAAK;AAAA,EAAO,OAAO,KAAK;AAAA,EAC9E,OAAO,KAAK;AAAA,EAAO,KAAK,KAAK;AAAA,EAAK,OAAO,KAAK;AAAA,EAAO,MAAM,KAAK;AAAA,EAAM,OAAO,KAAK;AAAA,EAClF,KAAK,KAAK;AAAA,EAAK,KAAK,KAAK;AAAA,EAAK,KAAK,KAAK;AAAA,EAAK,QAAQ,CAAC,UAAU,MAAM,KAAK,OAAO,IAAI;AAAA,EACtF,OAAO,KAAK;AAAA,EAAO,MAAM,KAAK;AAAA,EAAM,KAAK,KAAK;AAAA,EAAK,MAAM,KAAK;AAAA,EAAM,MAAM,KAAK;AAAA,EAC/E,KAAK,KAAK;AAAA,EAAK,MAAM,KAAK;AAAA,EAAM,OAAO,KAAK;AAC9C;AACA,IAAM,YAAoC,EAAE,GAAG,KAAK,GAAG,IAAI,KAAK,GAAG;AAEnE,SAAS,oBAAoB,QAAwB;AACnD,SAAO,OACJ,KAAK,EACL,QAAQ,eAAe,EAAE,EACzB,QAAQ,OAAO,EAAE,EACjB,QAAQ,gLAAgL,IAAI,EAC5L,QAAQ,mBAAmB,IAAI,EAC/B,QAAQ,cAAc,SAAS,EAC/B,QAAQ,kBAAkB,SAAS,EACnC,QAAQ,kBAAkB,SAAS,EACnC,QAAQ,cAAc,OAAO,EAC7B,QAAQ,cAAc,OAAO,EAC7B,QAAQ,cAAc,UAAU,EAChC,QAAQ,SAAS,KAAK,EACtB,QAAQ,aAAa,IAAI,EACzB,QAAQ,YAAY,IAAI,EACxB,QAAQ,aAAa,GAAG;AAC7B;AAEA,SAAS,SAAS,QAAyB;AACzC,QAAM,SAAkB,CAAC;AACzB,MAAI,QAAQ;AACZ,SAAO,QAAQ,OAAO,QAAQ;AAC5B,UAAM,OAAO,OAAO,MAAM,KAAK;AAC/B,UAAM,aAAa,OAAO,KAAK,IAAI;AACnC,QAAI,YAAY;AAAE,eAAS,WAAW,CAAC,EAAE;AAAQ;AAAA,IAAU;AAC3D,UAAM,SAAS,sCAAsC,KAAK,IAAI;AAC9D,QAAI,QAAQ;AAAE,aAAO,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO,CAAC,EAAE,CAAC;AAAG,eAAS,OAAO,CAAC,EAAE;AAAQ;AAAA,IAAU;AACtG,UAAM,aAAa,+CAA+C,KAAK,IAAI;AAC3E,QAAI,YAAY;AAAE,aAAO,KAAK,EAAE,MAAM,cAAc,OAAO,WAAW,CAAC,EAAE,CAAC;AAAG,eAAS,WAAW,CAAC,EAAE;AAAQ;AAAA,IAAU;AACtH,UAAM,WAAW,sDAAsD,KAAK,IAAI;AAChF,QAAI,CAAC,SAAU,OAAM,IAAI,YAAY,uBAAuB,KAAK,EAAE;AACnE,UAAM,QAAQ,SAAS,CAAC;AACxB,WAAO,KAAK,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,UAAU,OAAO,UAAU,MAAM,gBAAgB,YAAY,MAAM,CAAC;AAC1H,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,KAAK,EAAE,MAAM,OAAO,OAAO,GAAG,CAAC;AACtC,SAAO;AACT;AAEA,IAAM,SAAN,MAAa;AAAA,EAEJ,YAA6B,QAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAD5B,QAAQ;AAAA,EAET,QAAiB;AACtB,UAAM,OAAO,KAAK,iBAAiB;AACnC,QAAI,KAAK,KAAK,EAAE,SAAS,MAAO,OAAM,IAAI,YAAY,eAAe,KAAK,KAAK,EAAE,KAAK,GAAG;AACzF,WAAO;AAAA,EACT;AAAA,EACQ,OAAc;AAAE,WAAO,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE,MAAM,OAAO,OAAO,GAAG;AAAA,EAAG;AAAA,EAC9E,KAAK,OAAuB;AAClC,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,UAAa,MAAM,UAAU,MAAO,OAAM,IAAI,YAAY,aAAa,KAAK,GAAG;AAC7F,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EACQ,SAAS,QAA2B;AAC1C,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,EAAE,KAAK,EAAG,QAAO;AAChD,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EACQ,mBAA4B;AAClC,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,CAAC,KAAK,MAAM,GAAG,EAAG,QAAO;AAC7B,UAAM,aAAa,KAAK,iBAAiB;AACzC,SAAK,KAAK,GAAG;AACb,WAAO,EAAE,MAAM,eAAe,MAAM,YAAY,WAAW,KAAK,iBAAiB,EAAE;AAAA,EACrF;AAAA,EACQ,UAAmB;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,SAAS,GAAG,CAAC,IAAI,CAAC;AAAA,EAAG;AAAA,EACxE,WAAoB;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,cAAc,GAAG,CAAC,IAAI,CAAC;AAAA,EAAG;AAAA,EAC9E,gBAAyB;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,gBAAgB,GAAG,CAAC,MAAM,OAAO,MAAM,KAAK,CAAC;AAAA,EAAG;AAAA,EACzG,kBAA2B;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,cAAc,GAAG,CAAC,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,EAAG;AAAA,EACrG,gBAAyB;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,oBAAoB,GAAG,CAAC,KAAK,GAAG,CAAC;AAAA,EAAG;AAAA,EAC7F,sBAA+B;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC;AAAA,EAAG;AAAA,EAC/F,aAAsB;AAAE,WAAO,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC;AAAA,EAAG;AAAA,EAC5E,OAAO,MAAqB,WAA8B;AAChE,QAAI,OAAO,KAAK;AAChB,WAAO,UAAU,SAAS,KAAK,KAAK,EAAE,KAAK,GAAG;AAC5C,YAAM,WAAW,KAAK,KAAK,EAAE;AAC7B,aAAO,EAAE,MAAM,UAAU,UAAU,MAAM,OAAO,KAAK,EAAE;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EACQ,aAAsB;AAC5B,QAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,KAAK,KAAK,EAAE,KAAK,GAAG;AAC/C,aAAO,EAAE,MAAM,SAAS,UAAU,KAAK,KAAK,EAAE,OAAO,UAAU,KAAK,WAAW,EAAE;AAAA,IACnF;AACA,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EACQ,eAAwB;AAC9B,QAAI,OAAO,KAAK,aAAa;AAC7B,eAAS;AACP,UAAI,KAAK,MAAM,GAAG,GAAG;AACnB,cAAM,WAAW,KAAK,KAAK;AAC3B,YAAI,SAAS,SAAS,gBAAgB,oBAAoB,IAAI,SAAS,KAAK,EAAG,OAAM,IAAI,YAAY,sBAAsB;AAC3H,eAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,UAAU,SAAS,MAAM;AAAA,MAClE,WAAW,KAAK,MAAM,GAAG,GAAG;AAC1B,cAAM,OAAkB,CAAC;AACzB,YAAI,CAAC,KAAK,MAAM,GAAG,GAAG;AACpB,aAAG;AAAE,iBAAK,KAAK,KAAK,iBAAiB,CAAC;AAAA,UAAG,SAAS,KAAK,MAAM,GAAG;AAChE,eAAK,KAAK,GAAG;AAAA,QACf;AACA,eAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM,KAAK;AAAA,MAC5C,MAAO,QAAO;AAAA,IAChB;AAAA,EACF;AAAA,EACQ,eAAwB;AAC9B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,MAAM,SAAS,SAAU,QAAO,EAAE,MAAM,WAAW,OAAO,OAAO,MAAM,KAAK,EAAE;AAClF,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,MAAM,UAAU,UAAU,MAAM,UAAU,QAAS,QAAO,EAAE,MAAM,WAAW,OAAO,MAAM,UAAU,OAAO;AAC/G,aAAO,EAAE,MAAM,cAAc,MAAM,MAAM,MAAM;AAAA,IACjD;AACA,QAAI,MAAM,UAAU,KAAK;AACvB,YAAM,OAAO,KAAK,iBAAiB;AACnC,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT;AACA,UAAM,IAAI,YAAY,eAAe,MAAM,KAAK,GAAG;AAAA,EACrD;AACF;AAEA,SAAS,cAAc,MAA4C,OAAoE;AACrI,QAAM,QAAQ,aAAa,KAAK,QAAQ,KAAK;AAC7C,MAAK,OAAO,UAAU,YAAY,OAAO,UAAU,cAAe,UAAU,KAAM,QAAO,EAAE,OAAO,OAAO,OAAU;AACnH,MAAI,oBAAoB,IAAI,KAAK,QAAQ,EAAG,QAAO,EAAE,OAAO,OAAO,OAAU;AAC7E,SAAO,EAAE,OAAO,OAAQ,MAAkC,KAAK,QAAQ,EAAE;AAC3E;AAEA,SAAS,aAAa,MAAe,OAAyC;AAC5E,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAW,aAAO,KAAK;AAAA,IAC5B,KAAK;AAAc,aAAO,OAAO,OAAO,OAAO,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI;AAAA,IAC1H,KAAK;AAAU,aAAO,cAAc,MAAM,KAAK,EAAE;AAAA,IACjD,KAAK,QAAQ;AACX,YAAM,SAAS,KAAK,OAAO,SAAS,WAAW,cAAc,KAAK,QAAQ,KAAK,IAAI;AACnF,YAAM,WAAW,QAAQ,SAAS,aAAa,KAAK,QAAQ,KAAK;AACjE,UAAI,OAAO,aAAa,WAAY,OAAM,IAAI,UAAU,kCAAkC;AAC1F,aAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC,aAAa,aAAa,UAAU,KAAK,CAAC,CAAC;AAAA,IACjG;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,QAAQ,aAAa,KAAK,UAAU,KAAK;AAC/C,UAAI,KAAK,aAAa,IAAK,QAAO,CAAC;AACnC,UAAI,KAAK,aAAa,IAAK,QAAO,OAAO,KAAK;AAC9C,aAAO,CAAC,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,KAAK;AAAe,aAAO,aAAa,KAAK,MAAM,KAAK,IAAI,aAAa,KAAK,YAAY,KAAK,IAAI,aAAa,KAAK,WAAW,KAAK;AAAA,IACrI,KAAK,UAAU;AACb,UAAI,KAAK,aAAa,KAAM,QAAO,QAAQ,aAAa,KAAK,MAAM,KAAK,CAAC,KAAK,QAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AACrH,UAAI,KAAK,aAAa,KAAM,QAAO,QAAQ,aAAa,KAAK,MAAM,KAAK,CAAC,KAAK,QAAQ,aAAa,KAAK,OAAO,KAAK,CAAC;AACrH,YAAM,OAAO,aAAa,KAAK,MAAM,KAAK;AAC1C,YAAM,QAAQ,aAAa,KAAK,OAAO,KAAK;AAC5C,cAAQ,KAAK,UAAU;AAAA,QACrB,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAK,iBAAO,KAAK,IAAI,OAAO,IAAI,GAAG,OAAO,KAAK,CAAC;AAAA,QACrD,KAAK;AAAA,QAAM,KAAK;AAAO,iBAAO,SAAS;AAAA,QACvC,KAAK;AAAA,QAAM,KAAK;AAAO,iBAAO,SAAS;AAAA,QACvC,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAM,iBAAO,OAAO,IAAI,KAAK,OAAO,KAAK;AAAA,QAC9C,KAAK;AAAK,iBAAO,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC5C,KAAK;AAAM,iBAAO,OAAO,IAAI,KAAK,OAAO,KAAK;AAAA,QAC9C;AAAS,iBAAO;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,kBAAkB,oBAAI,IAAqB;AAO1C,SAAS,mBAAmB,YAAmD,aAAgC,UAA8C;AAClK,MAAI,eAAe,OAAW,QAAO;AACrC,MAAI,OAAO,eAAe,SAAU,QAAO;AAC3C,MAAI;AACF,UAAM,aAAa,oBAAoB,UAAU;AACjD,QAAI,MAAM,gBAAgB,IAAI,UAAU;AACxC,QAAI,CAAC,KAAK;AAAE,YAAM,IAAI,OAAO,SAAS,UAAU,CAAC,EAAE,MAAM;AAAG,sBAAgB,IAAI,YAAY,GAAG;AAAA,IAAG;AAClG,UAAM,SAAS,aAAa,KAAK,WAAiD;AAClF,QAAI,OAAO,aAAa,UAAW,QAAO,QAAQ,MAAM;AACxD,UAAM,gBAAgB,OAAO,MAAM;AACnC,WAAO,OAAO,MAAM,aAAa,IAAI,WAAW;AAAA,EAClD,QAAQ;AAAE,WAAO;AAAA,EAAU;AAC7B;AAGO,SAAS,gBAAgB,YAA+B,aAAyC;AACtG,SAAO,WAAW,MAAM,CAAC,cAAc,mBAAmB,WAAW,aAAa,KAAK,CAAC;AAC1F;AAGO,SAAS,eAAkB,OAAqB,QAA6B,SAAuB,KAAK,QAAuB;AACrI,QAAM,WAAW,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,EAAE,EAAE;AAClF,QAAM,QAAQ,SAAS,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,QAAQ,CAAC;AACnE,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,OAAO,IAAI;AACxB,aAAW,SAAS,UAAU;AAAE,cAAU,MAAM;AAAQ,QAAI,SAAS,EAAG,QAAO,MAAM;AAAA,EAAM;AAC3F,SAAO,SAAS,GAAG,EAAE,GAAG;AAC1B;AAGO,IAAM,qBAAN,MAAyB;AAAA;AAAA,EAIvB,YAA6B,MAAsC,SAAuB,KAAK,QAAQ;AAA1E;AAAsC;AAAA,EAAqC;AAAA,EAA3E;AAAA,EAAsC;AAAA,EAHlE;AAAA;AAAA,EAMD,cAAc,aAAgC,eAAwD;AAC3G,QAAI,eAAe;AACjB,YAAM,YAAY,KAAK,KAAK,UAAU,KAAK,CAAC,aAAa,SAAS,SAAS,aAAa;AACxF,UAAI,aAAa,gBAAgB,UAAU,YAAY,WAAW,EAAG,QAAQ,KAAK,WAAW,KAAK,QAAQ,SAAS;AAAA,IACrH;AACA,UAAM,OAAO,KAAK,iBAAiB;AACnC,QAAI,QAAQ,CAAC,KAAK,gBAAgB,WAAW,EAAG,QAAQ,KAAK,WAAW;AACxE,WAAQ,KAAK,WAAW,KAAK,OAAO,KAAK,KAAK,WAAW,WAAW;AAAA,EACtE;AAAA;AAAA,EAGO,WAAW,aAAgE;AAChF,UAAM,OAAO,KAAK,UAAU,cAAc,SAAS,KAAK,SAAS,gBAAgB,KAAK,KAAK;AAC3F,WAAQ,KAAK,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,KAAK,iBAAiB;AAAA,EAClF;AAAA;AAAA,EAGO,MAAM,MAA8C;AACzD,UAAM,WAAW,KAAK,KAAK,UAAU,KAAK,CAAC,cAAc,UAAU,SAAS,IAAI;AAChF,WAAQ,KAAK,WAAW,WAAW,KAAK,QAAQ,QAAQ,IAAI;AAAA,EAC9D;AAAA,EAEQ,OAAO,MAAqC,aAAgE;AAClH,UAAM,aAAa,KAAK,OAAO,CAAC,aAAa,gBAAgB,SAAS,YAAY,WAAW,CAAC;AAC9F,UAAM,SAAS,eAAe,YAAY,CAAC,aAAa,SAAS,WAAW,KAAK,MAAM;AACvF,WAAO,SAAS,KAAK,QAAQ,MAAM,IAAI;AAAA,EACzC;AAAA,EAEQ,QAAQ,UAAkD;AAChE,QAAI,SAAS,SAAS,YAAa,QAAO;AAC1C,UAAM,SAAS,KAAK,KAAK,UAAU,KAAK,CAAC,cAAc,UAAU,SAAS,cAAc,UAAU,SAAS,SAAS,IAAI;AACxH,WAAO,SAAS,EAAE,GAAG,QAAQ,GAAG,UAAU,MAAM,YAAY,eAAe,OAAO,cAAc,IAAI,EAAE,GAAG,UAAU,MAAM,WAAW;AAAA,EACtI;AAAA,EAEQ,mBAAmD;AACzD,WAAO,KAAK,KAAK,UAAU,KAAK,CAAC,aAAa,SAAS,SAAS,UAAU,SAAS,SAAS,0BAAM;AAAA,EACpG;AAAA,EAEQ,gBAAgB,aAAyC;AAC/D,UAAM,SAAS,YAAY,OAAO;AAClC,UAAM,OAAO,YAAY,OAAO,YAAY;AAC5C,UAAM,WAAW,YAAY,OAAO,YAAY;AAChD,WAAO,KAAK,UAAU,KAAK,MAAM,KAC5B,KAAK,WAAW,KAAK,MAAM,KAC3B,KAAK,YAAY,KAAK,MAAM,KAC5B,KAAK,aAAa,KAAK,MAAM,KAC5B,SAAS,YACX,SAAS,UAAU,KAAK,MAAM,KAC3B,SAAS,WAAW,KAAK,MAAM,KAC/B,SAAS,YAAY,KAAK,MAAM,KAChC,SAAS,aAAa,KAAK,MAAM;AAAA,EAE1C;AACF;;;ACjSO,SAAS,MAAM,OAAe,SAAiB,SAAyB;AAC7E,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,GAAG,OAAO;AACnD;AAGO,SAAS,QAAQ,OAAc,WAAsB,YAAY,GAAY;AAClF,SAAO,MAAM,KAAK,UAAU,IAAI,aAAa,MAAM,KAAK,UAAU,IAAI,UAAU,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC,KAAK;AAC1I;AAGO,SAAS,WAAW,OAAc,WAAsB,YAAY,GAAY;AACrF,SAAO,MAAM,KAAK,UAAU,IAAI,aAAa,MAAM,KAAK,UAAU,IAAI,UAAU,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,UAAU,IAAI,UAAU,MAAM,KAAK;AAC7J;AAGO,SAAS,SAAS,OAAc,WAAsB,YAAY,GAAY;AACnF,SAAO,MAAM,KAAK,UAAU,IAAI,aAAa,MAAM,KAAK,UAAU,IAAI,UAAU,SAAS,aAAa,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC,KAAK;AAC3I;AAGO,SAAS,UAAU,OAAc,WAAsB,YAAY,GAAY;AACpF,SAAO,MAAM,KAAK,UAAU,IAAI,aAAa,MAAM,KAAK,UAAU,IAAI,UAAU,SAAS,aAAa,KAAK,IAAI,MAAM,IAAI,UAAU,IAAI,UAAU,KAAK,KAAK;AAC7J;AAGO,SAAS,WACd,OACA,QACA,QACA,UACS;AACT,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,WAAW,QAAS,QAAO,WAAW,OAAO,MAAM,KAAM,aAAa,UAAa,QAAQ,OAAO,QAAQ;AAC9G,MAAI,WAAW,UAAW,QAAO,QAAQ,OAAO,MAAM,KAAM,aAAa,UAAa,WAAW,OAAO,QAAQ;AAChH,SAAO,SAAS,OAAO,MAAM,KACxB,UAAU,OAAO,MAAM,KACtB,aAAa,WAAc,SAAS,OAAO,QAAQ,KAAK,UAAU,OAAO,QAAQ;AACzF;AAGO,SAAS,aACd,OACA,QACA,YACA,SACA,cAAc,MACd,cAAc,MACd,UACS;AACT,QAAM,YAAY,MAAM;AACxB,QAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,KAAK,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,KAAK;AACtF,QAAM,QAAQ,MAAM,MAAM,IAAI,MAAM,KAAK,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,MAAM;AACvF,QAAM,IAAI;AACV,QAAM,IAAI;AACV,QAAM,MAAM,KAAK,IAAI,GAAG,IAAI,cAAc,UAAU;AACpD,QAAM,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,cAAc,UAAU,IAAI,UAAU;AAC5E,MACE,YACG,SAAS,aACT,aAAa,SAAS,KACtB,SAAS,SAAS,KAClB,SAAS,SAAS,KAClB,SAAS,SAAS,IAAI,SAAS,OAClC;AACA,UAAM,IAAI,SAAS;AACnB,UAAM,KAAK;AACX,WAAO;AAAA,EACT;AACA,MAAI,MAAM,KAAK,OAAO,IAAI,OAAO,QAAQ;AAAE,UAAM,IAAI,OAAO,IAAI,OAAO;AAAQ,UAAM,KAAK;AAAG,WAAO;AAAA,EAAM;AAC1G,MAAI,MAAM,KAAK,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,OAAO;AAAE,UAAM,KAAK;AAAG,WAAO;AAAA,EAAM;AAC5F,SAAO;AACT;AAGO,SAAS,WAAW,OAAoB,QAAe,OAAe,YAA6B;AACxG,QAAM,KAAK,OAAO,IAAI,MAAM;AAC5B,QAAM,KAAK,OAAO,IAAI,MAAM;AAC5B,QAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,MAAI,YAAY,KAAK,IAAI,MAAO,QAAQ,UAAU,GAAG;AACnD,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AACjB,WAAO;AAAA,EACT;AACA,QAAM,KAAM,KAAK,WAAY,QAAQ;AACrC,QAAM,KAAM,KAAK,WAAY,QAAQ;AACrC,SAAO;AACT;;;AC/CA,SAAS,QAAQ,OAAoC,aAAoD;AACvG,SAAO,UAAU,SAAY,SAAY,mBAAmB,OAAO,aAAa,CAAC;AACnF;AAEA,SAAS,eAAe,YAA8B,aAAiD;AACrG,QAAM,MAAM,QAAQ,WAAW,KAAK,WAAW,KAAK;AACpD,QAAM,oBAAoB,EAAE,GAAG,aAAa,IAAI;AAChD,QAAM,UAAU,QAAQ,WAAW,SAAS,iBAAiB;AAC7D,QAAM,YAAY,QAAQ,WAAW,WAAW,iBAAiB;AACjE,MAAI,YAAY,YAAY,OAAO;AACnC,MAAI,WAAW,eAAe,QAAQ;AACpC,UAAM,EAAE,UAAU,SAAS,IAAI,YAAY,OAAO;AAClD,gBAAY,SAAS,YAAY,KAAK,YAAY,OAAO,MAAM,KACzD,SAAS,WAAW,SAAS,WAAW,KAAK,YAAY,OAAO,MAAM;AAAA,EAC9E,WAAW,WAAW,SAAS,UAAU,WAAW,cAAc,UAAU,WAAW,cAAc,cAAc;AACjH,QAAI,YAAY,OAAW,aAAY,UAAU,YAAY,OAAO,OAAO;AAAA,EAC7E,WAAW,WAAW,cAAc,UAAU,WAAW,cAAc,cAAc;AACnF,QAAI,cAAc,UAAa,cAAc,EAAG,aAAY,YAAY;AAAA,EAC1E,WAAW,WAAW,cAAc,QAAQ;AAC1C,gBAAY,WAAW,cAAc,SACjC,CAAC,YAAY,OAAO,YACpB,OAAO,WAAW,cAAc,YAC9B,WAAW,YACX,mBAAmB,WAAW,WAAW,mBAAmB,YAAY,OAAO,SAAS;AAAA,EAChG;AACA,QAAM,WAAW,QAAQ,WAAW,UAAU,iBAAiB;AAC/D,QAAM,UAAU,QAAQ,WAAW,SAAS,iBAAiB;AAC7D,QAAM,WAAW,QAAQ,WAAW,UAAU,iBAAiB;AAC/D,QAAM,IAAI,QAAQ,WAAW,GAAG,iBAAiB;AACjD,QAAM,IAAI,QAAQ,WAAW,GAAG,iBAAiB;AACjD,QAAM,YAAY,QAAQ,WAAW,WAAW,iBAAiB;AACjE,QAAM,cAAc,QAAQ,WAAW,aAAa,iBAAiB;AACrE,QAAM,cAAc,QAAQ,WAAW,aAAa,iBAAiB;AACrE,QAAM,UAAU,QAAQ,WAAW,SAAS,iBAAiB;AAC7D,QAAM,QAAQ,QAAQ,WAAW,OAAO,iBAAiB;AACzD,QAAM,QAAQ,QAAQ,WAAW,OAAO,iBAAiB;AACzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,aAAa,UAAa,EAAE,SAAS;AAAA,IACzC,GAAI,MAAM,UAAa,EAAE,EAAE;AAAA,IAC3B,GAAI,MAAM,UAAa,EAAE,EAAE;AAAA,IAC3B,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,IAC3C,GAAI,cAAc,UAAa,EAAE,UAAU;AAAA,IAC3C,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,gBAAgB,UAAa,EAAE,YAAY;AAAA,IAC/C,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,IACnC,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,EACrC;AACF;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAGhC,YAA6B,aAA2D,SAAqG,MAAe;AAA/K;AAA2D;AAAqG;AAAA,EAAgB;AAAA,EAAhL;AAAA,EAA2D;AAAA,EAAqG;AAAA,EAF5L,QAAQ;AAAA,EACR;AAAA,EAED,KAAK,SAAiB,aAAgC,QAA4B;AACvF,aAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS,GAAG;AAC1C,YAAM,aAAa,KAAK,YAAY,KAAK,KAAK;AAC9C,UAAI,CAAC,YAAY;AACf,YAAI,CAAC,KAAK,QAAQ,KAAK,YAAY,WAAW,EAAG,QAAO;AACxD,aAAK,QAAQ;AACb;AAAA,MACF;AACA,WAAK,UAAU,KAAK,QAAQ,YAAY,WAAW;AACnD,UAAI,CAAC,KAAK,MAAM,KAAK,SAAS,aAAa,MAAM,EAAG,QAAO;AAC3D,WAAK,QAAQ;AACb,WAAK,SAAS;AACd,gBAAU;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,kBAAN,MAAyC;AAAA,EAChC,OAAgB;AAAE,WAAO;AAAA,EAAM;AACxC;AAEA,IAAM,cAAN,MAAqC;AAAA,EAO5B,YACY,QACA,OACA,SACA,WACjB,aACA;AALiB;AACA;AACA;AACA;AAGjB,UAAM,uBAAuB,EAAE,GAAG,aAAa,GAAI,OAAO,YAAY,UAAa,EAAE,SAAS,OAAO,QAAQ,GAAI,GAAI,OAAO,YAAY,UAAa,EAAE,SAAS,OAAO,QAAQ,EAAG;AAClL,SAAK,YAAY,OAAO,WAAW,YAAY,KAAK,CAAC,cAAc,CAAC,UAAU,aAAa,mBAAmB,UAAU,WAAW,sBAAsB,KAAK,CAAC,KAC1J,OAAO,WAAW,YAAY,KAAK,CAAC,cAAc,CAAC,UAAU,SAAS,KACtE,OAAO,WAAW,aAAa,CAAC;AACrC,SAAK,eAAe,KAAK,WAAW,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,IAAI,GAAG,KAAK,QAAQ,GAAG,CAAC,KAAK;AAAA,EAC1G;AAAA,EAXmB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAVX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACD;AAAA,EACA;AAAA,EAgBV,KAAK,SAAiB,aAAgC,QAA4B;AACvF,UAAM,aAAa,UAAU,KAAK,QAAQ;AAC1C,QAAI,CAAC,KAAK,SAAS;AAAE,WAAK,UAAU;AAAM,WAAK,MAAM,YAAY,KAAK,OAAO;AAAW,WAAK,WAAW;AAAA,IAAG;AAC3G,SAAK,aAAa;AAClB,UAAM,OAAO,KAAK,YAAY;AAC9B,QAAI,KAAM,MAAK,UAAU,MAAM,YAAY,MAAM;AAEjD,UAAM,EAAE,WAAW,IAAI,KAAK;AAC5B,QAAI,WAAW,SAAS,WAAY,QAAO,KAAK,aAAa,YAAY,aAAa,MAAM;AAC5F,QAAI,WAAW,SAAS,WAAW,KAAK,OAAO,YAAY,UAAa,KAAK,OAAO,YAAY,SAAY;AAC1G,YAAM,WAAW,KAAK,OAAO,YAAY,UAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,OAAO,IAAI;AACrG,YAAM,WAAW,KAAK,OAAO,YAAY,UAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,OAAO,IAAI;AACrG,aAAO,YAAY;AAAA,IACrB;AACA,WAAO,KAAK,aAAa,KAAK,WAAW;AAAA,EAC3C;AAAA,EAEQ,aAAmB;AACzB,UAAM,OAAO,KAAK,OAAO,WAAW;AACpC,QAAI,SAAS,UAAU,SAAS,cAAc;AAC5C,WAAK,MAAM,KAAK,KAAK,OAAO,aAAa,KAAK,MAAM;AACpD,WAAK,MAAM,KAAK,KAAK,OAAO,aAAa,KAAK,MAAM;AAAA,IACtD;AACA,QAAI,SAAS,UAAU;AACrB,WAAK,MAAM,KAAK,KAAK,OAAO,KAAK;AACjC,WAAK,MAAM,KAAK,KAAK,OAAO,KAAK;AAAA,IACnC;AACA,QAAI,SAAS,UAAU;AAAE,WAAK,MAAM,KAAK;AAAG,WAAK,MAAM,KAAK;AAAA,IAAG;AAAA,EACjE;AAAA,EAEQ,aAAa,YAAoB,aAAgC,QAA4B;AACnG,YAAQ,KAAK,OAAO,WAAW,WAAW;AAAA,MACxC,KAAK;AAAA,MAAQ,KAAK;AAAA,MAAc,KAAK;AACnC,eAAO;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,KAAK,OAAO,WAAW,KAAK,QAAQ;AAAA,UACpC,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,YAAY,OAAO,YAAY,SAAS,UAAU,YAAY,OAAO,YAAY,WAAW;AAAA,QAC9F;AAAA,MACF,KAAK,QAAQ;AACX,cAAM,SAAS,EAAE,GAAG,KAAK,OAAO,WAAW,KAAK,MAAM,GAAG,GAAG,KAAK,OAAO,WAAW,KAAK,MAAM,EAAE;AAChG,eAAO,WAAW,KAAK,OAAO,QAAQ,KAAK,OAAO,YAAY,IAAI,UAAU;AAAA,MAC9E;AAAA,MACA,KAAK;AACH,YAAI,CAAC,KAAK,WAAW,KAAK,aAAa,KAAK,WAAW,GAAG;AACxD,eAAK,UAAU;AACf,gBAAM,QAAQ,EAAE,GAAG,KAAK,MAAM,KAAK,KAAK,OAAO,SAAS,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,OAAO,SAAS,GAAG;AACvG,eAAK,UAAU,MAAM,KAAK,OAAO,WAAW,eAAe,EAAE,GAAG,OAAO,cAAc,KAAK,OAAO,WAAW,aAAa,IAAI,KAAK;AAClI,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,KAAK;AAAQ,aAAK,UAAU,OAAO;AAAG,eAAO;AAAA,MAC7C,KAAK;AACH,aAAK,MAAM,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,GAAG,OAAO,QAAQ,GAAG,IAAI,KAAK,OAAO;AAC9E,aAAK,MAAM,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,GAAG,OAAO,SAAS,GAAG,IAAI,KAAK,OAAO;AAC/E,eAAO;AAAA,MACT,KAAK;AAAA,MAAU,KAAK;AAAQ,eAAO;AAAA,MACnC,KAAK;AAAW,eAAO;AAAA,MACvB;AAAS,eAAO,KAAK,aAAa,KAAK,WAAW;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,cAAgC;AACtC,QAAI,CAAC,KAAK,WAAW,MAAM,UAAU,KAAK,gBAAgB,EAAG,QAAO;AACpE,QAAI,SAAU,KAAK,YAAY,KAAK,QAAQ,gBAAiB,KAAK;AAClE,eAAW,QAAQ,KAAK,UAAU,OAAO;AAAE,gBAAU,KAAK;AAAU,UAAI,SAAS,EAAG,QAAO;AAAA,IAAM;AACjG,WAAO,KAAK,UAAU,MAAM,GAAG,EAAE;AAAA,EACnC;AAAA,EAEQ,UAAU,MAAY,YAAoB,QAAyB;AACzE,SAAK,MAAM,SAAS,KAAK;AACzB,SAAK,MAAM,UAAU,KAAK,OAAO;AACjC,SAAK,MAAM,UAAU,KAAK,OAAO;AACjC,UAAM,YAAY,KAAK,MAAM,YAAY,KAAK;AAC9C,SAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,SAAS,IAAI,YAAY,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,KAAK;AAC/G,SAAK,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,SAAS,IAAI,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,MAAM;AAAA,EACtG;AAAA,EAEQ,aAAqB;AAC3B,UAAM,SAAS,KAAK,OAAO,YAAY,KAAK;AAC5C,WAAO,KAAK,IAAI,KAAK,QAAQ,eAAe,SAAS,KAAK,QAAQ,aAAa;AAAA,EACjF;AACF;AAGO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAInB,YACY,MACA,OACA,SACA,WACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAPX;AAAA;AAAA,EAWD,MAAM,YAAoB,aAAyC;AACxE,UAAM,aAAa,KAAK,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU;AAChF,SAAK,UAAU,aAAa,KAAK,cAAc,YAAY,aAAa,oBAAI,IAAI,CAAC,IAAI;AACrF,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA,EAGO,KAAK,SAAiB,aAAgC,QAA4B;AACvF,WAAO,KAAK,SAAS,KAAK,SAAS,aAAa,MAAM,KAAK;AAAA,EAC7D;AAAA;AAAA,EAGO,SAAe;AAAE,SAAK,UAAU;AAAA,EAAW;AAAA,EAE1C,cAAc,YAA8B,aAAgC,YAAkC;AACpH,QAAI,WAAW,aAAa,CAAC,mBAAmB,WAAW,WAAW,aAAa,KAAK,EAAG,QAAO,IAAI,gBAAgB;AACtH,UAAM,SAAS,YAAY,OAAO,YAAY;AAC9C,UAAM,WAAW,YAAY,OAAO,YAAY;AAChD,QAAI,CAAC,WAAW,KAAK,OAAO,QAAQ,WAAW,YAAY,SAAS,UAAU,WAAW,MAAS,EAAG,QAAO,IAAI,gBAAgB;AAChI,QAAI,WAAW,SAAS,aAAa;AACnC,UAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,WAAW,IAAI,EAAG,QAAO,IAAI,gBAAgB;AACpF,YAAM,aAAa,KAAK,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,WAAW,IAAI;AACrF,UAAI,CAAC,WAAY,QAAO,IAAI,gBAAgB;AAC5C,YAAM,iBAAiB,IAAI,IAAI,UAAU,EAAE,IAAI,WAAW,IAAI;AAC9D,aAAO,KAAK,cAAc,EAAE,GAAG,YAAY,GAAG,YAAY,MAAM,WAAW,KAAK,GAAG,aAAa,cAAc;AAAA,IAChH;AACA,QAAI,WAAW,SAAS,YAAY;AAClC,aAAO,IAAI,gBAAgB,WAAW,WAAW,CAAC,GAAG,CAAC,OAAO,oBAAoB,KAAK,cAAc,OAAO,iBAAiB,IAAI,IAAI,UAAU,CAAC,GAAG,WAAW,SAAS,IAAI;AAAA,IAC5K;AACA,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,QAAQ,WAAW,SAAS,KAAK,CAAC,cAAc,CAAC,UAAU,aAAa,mBAAmB,UAAU,WAAW,aAAa,KAAK,CAAC;AACzI,aAAO,QAAQ,KAAK,cAAc,OAAO,aAAa,IAAI,IAAI,UAAU,CAAC,IAAI,IAAI,gBAAgB;AAAA,IACnG;AACA,WAAO,IAAI,YAAY,eAAe,YAAY,WAAW,GAAG,KAAK,OAAO,KAAK,SAAS,KAAK,WAAW,WAAW;AAAA,EACvH;AACF;;;AChQA,SAAS,KAAK,WAAuD;AAAE,SAAO,EAAE,MAAM,UAAU;AAAG;AAEnG,SAAS,qBAAqB,QAAyC;AACrE,QAAM,OAAO,OAAO;AACpB,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAM,MAAM,OAAO;AACnB,QAAM,SAAS,OAAO,IAAI,OAAO;AACjC,SAAO;AAAA,IACL,GAAG,OAAO;AAAA,IAAG,GAAG,OAAO;AAAA,IAAG,OAAO,OAAO;AAAA,IAAO,QAAQ,OAAO;AAAA,IAC9D;AAAA,IAAM;AAAA,IAAO;AAAA,IAAK;AAAA,IAClB,WAAW,KAAK,CAAC,UAAU,QAAQ,OAAO,MAAM,CAAC;AAAA,IACjD,YAAY,KAAK,CAAC,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,IACnD,aAAa,KAAK,CAAC,UAAU,UAAU,OAAO,MAAM,CAAC;AAAA,IACrD,cAAc,KAAK,CAAC,UAAU,WAAW,OAAO,MAAM,CAAC;AAAA,EACzD;AACF;AAEA,IAAM,2BAA2B;AACjC,IAAM,0BAA0B;AAEhC,SAAS,oBAAoB,OAAc,WAA8B;AACvE,QAAM,KAAK,KAAK,IAAI,UAAU,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,UAAU,IAAI,UAAU,KAAK;AACrF,QAAM,KAAK,KAAK,IAAI,UAAU,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,UAAU,IAAI,UAAU,MAAM;AACtF,SAAO,KAAK,MAAM,IAAI,EAAE;AAC1B;AAGO,IAAM,SAAN,MAAa;AAAA;AAAA,EAiBX,YACW,IACA,MACC,KACjB,SACA,cACiB,WACjB;AANgB;AACA;AACC;AAGA;AAEjB,UAAM,cAAc,KAAK,QAAQ,QAAQ,CAAC,WAAW,OAAO,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,UAAU,KAAK,EAAE,CAAC;AACvH,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,GAAG,aAAa,KAAK;AAAA,MACrB,GAAG,aAAa,KAAK;AAAA,MACrB,IAAI,aAAa,MAAM;AAAA,MACvB,IAAI,aAAa,MAAM;AAAA,MACvB,QAAQ,aAAa,UAAU,OAAO,KAAK,KAAK,OAAO,EAAE,CAAC,KAAK;AAAA,MAC/D,SAAS,aAAa,OAAO,KAAK;AAAA,MAClC,SAAS,aAAa,OAAO,KAAK;AAAA,MAClC,WAAW,aAAa,aAAa;AAAA,MACrC,cAAc,aAAa,gBAAgB;AAAA,MAC3C,UAAU;AAAA,IACZ;AACA,SAAK,YAAY,IAAI,aAAa,MAAM,IAAI,QAAQ,mBAAmB,MAAS;AAChF,SAAK,WAAW,IAAI,mBAAmB,MAAM,QAAQ,MAAM;AAC3D,SAAK,UAAU,IAAI,eAAe,MAAM,KAAK,OAAO,SAAS;AAAA,MAC3D,OAAO,CAAC,aAAa,KAAK,UAAU,MAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,MAChE,QAAQ,MAAM,KAAK,UAAU,OAAO,KAAK,EAAE;AAAA,IAC7C,CAAC;AACD,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EA7BkB;AAAA,EACA;AAAA,EACC;AAAA,EAGA;AAAA;AAAA,EArBH;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAA+B,CAAC;AAAA,EACzC;AAAA,EACA,YAAY;AAAA,EACZ,aAAoB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAA0C,CAAC;AAAA;AAAA,EAoC5C,KAAK,SAAiB,QAAmB,YAA0C,CAAC,GAAS;AAClG,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,UAAM,cAAc,KAAK,kBAAkB,QAAQ,SAAS;AAC5D,QAAI,KAAK,MAAM,UAAU;AAAE,WAAK,IAAI,OAAO,KAAK,WAAW,KAAK,MAAM,KAAK,KAAK;AAAG;AAAA,IAAQ;AAC3F,QAAI;AACF,eAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;AACzC,YAAI,CAAC,KAAK,iBAAiB;AACzB,eAAK,kBAAkB,KAAK,SAAS,cAAc,aAAa,KAAK,MAAM,YAAY;AACvF,cAAI,UAAU,KAAK,cAAc,WAAW;AAC5C,cAAI,CAAC,SAAS;AACZ,iBAAK,kBAAkB,KAAK,iBAAiB;AAC7C,sBAAU,KAAK,cAAc,WAAW;AAAA,UAC1C;AACA,cAAI,CAAC,QAAS;AAAA,QAChB;AACA,cAAM,WAAW,YAAY,OAAO,YAAY;AAChD,cAAM,mBAAmB,SAAS,WAAW,SAAS,UAAU,KAAK,KAAK,KAAK;AAC/E,cAAM,YAAY,KAAK,QAAQ,KAAK,SAAS,aAAa,MAAM;AAChE,cAAM,uBAAuB,KAAK,MAAM,KAAK,SAAS,OAAO,2BACxD,KAAK,MAAM,KAAK,SAAS,QAAQ;AACtC,YAAI,oBACC,CAAC,wBACD,CAAC,UAAU,KAAK,CAAC,aAAa,QAAQ,KAAK,OAAO,QAAQ,CAAC,GAAG;AACjE,eAAK,QAAQ,OAAO;AACpB,eAAK,kBAAkB,KAAK,iBAAiB;AAC7C,cAAI,KAAK,gBAAiB,MAAK,cAAc,KAAK,kBAAkB,QAAQ,SAAS,CAAC;AACtF;AAAA,QACF;AACA,YAAI,CAAC,UAAW;AAChB,YAAI,KAAK,UAAW;AACpB,aAAK,kBAAkB,KAAK,SAAS,WAAW,KAAK,kBAAkB,QAAQ,SAAS,CAAC;AACzF,YAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,cAAc,KAAK,kBAAkB,QAAQ,SAAS,CAAC,GAAG;AAC3F,eAAK,kBAAkB,KAAK,iBAAiB;AAC7C,cAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,cAAc,KAAK,kBAAkB,QAAQ,SAAS,CAAC,EAAG;AAAA,QAC/F;AACA,kBAAU;AAAA,MACZ;AAAA,IACF,SAAS,OAAO;AACd,WAAK,UAAU,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAC9E,WAAK,kBAAkB;AACvB,WAAK,QAAQ,OAAO;AAAA,IACtB;AACA,SAAK,IAAI,OAAO,KAAK,WAAW,KAAK,MAAM,KAAK,KAAK;AAAA,EACvD;AAAA;AAAA,EAGO,WAAwB;AAAE,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EAAG;AAAA;AAAA,EAGpD,UAAgB;AACrB,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,QAAQ,OAAO;AACpB,eAAW,WAAW,KAAK,UAAU,OAAO,CAAC,EAAG,SAAQ;AACxD,SAAK,IAAI,aAAa,KAAK,SAAS;AAAA,EACtC;AAAA,EAEQ,cAAc,aAAyC;AAC7D,QAAI,CAAC,KAAK,gBAAiB,QAAO;AAClC,SAAK,MAAM,eAAe,KAAK,gBAAgB;AAC/C,WAAO,KAAK,QAAQ,MAAM,KAAK,gBAAgB,MAAM,WAAW;AAAA,EAClE;AAAA,EAEQ,mBAAmD;AACzD,WAAO,KAAK,SAAS,MAAM,MAAM,KAAK,KAAK,SAAS,MAAM,0BAAM;AAAA,EAClE;AAAA,EAEQ,kBAAkB,QAAmB,YAA0C,KAAK,WAA8B;AACxH,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,WAAW,qBAAqB,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;AAC/E,UAAM,WAAW,KAAK,qBAAqB,SAAS;AACpD,UAAM,WAAW,WACb,EAAE,GAAG,qBAAqB,QAAQ,GAAG,SAAS,KAAK,IACnD,EAAE,GAAG,UAAU,SAAS,MAAM;AAClC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,YAAY,KAAK,UAAU,MAAM;AAAA,QACjC,QAAQ,EAAE,GAAG,KAAK,MAAM,GAAG,GAAG,KAAK,MAAM,EAAE;AAAA,QAC3C,WAAW,KAAK,MAAM;AAAA,QACtB,aAAa;AAAA,UACX,QAAQ,KAAK,UAAU,QAAQ;AAAA,UAC/B,QAAQ,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAY;AAAA,UAC/D;AAAA,UACA,OAAO,SAAS;AAAA,UAChB,SAAS,SAAS;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,WAAwE;AACnG,QAAI,UAAU,WAAW,GAAG;AAC1B,WAAK,wBAAwB;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,UAAU,KAAK,CAAC,aAAa,SAAS,YAAY,KAAK,qBAAqB;AAC5F,QAAI,YACF,QAAQ,QAAQ,SAAS,CAAC,KACvB,WAAW,QAAQ,SAAS,CAAC,KAC7B,SAAS,QAAQ,SAAS,CAAC,KAC3B,UAAU,QAAQ,SAAS,CAAC,GAC9B,QAAO;AAEV,QAAI,KAAK,MAAM,MAAM,GAAG;AACtB,YAAM,kBAAkB,UACrB,OAAO,CAAC,aAAa,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,SAAS,IAAI,SAAS,SAAS,SAAS,KAAK,OAAO,IAAI,CAAC,EACpH,KAAK,CAAC,MAAM,UAAU,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;AAC5C,UAAI,iBAAiB;AACnB,aAAK,wBAAwB,gBAAgB;AAC7C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,GAAG,SAAS,EACzB,IAAI,CAAC,cAAc,EAAE,UAAU,UAAU,oBAAoB,QAAQ,QAAQ,EAAE,EAAE,EACjF,OAAO,CAAC,EAAE,SAAS,MAAM,YAAY,wBAAwB,EAC7D,KAAK,CAAC,MAAM,UAAU,KAAK,WAAW,MAAM,QAAQ,EAAE,CAAC,GAAG;AAC7D,SAAK,wBAAwB,QAAQ;AACrC,WAAO;AAAA,EACT;AAAA,EAEQ,yBAA+B;AACrC,UAAM,UAAU,KAAK,UAAU;AAC/B,UAAM,SAAS,CAAsC,QAAqB,MAAS,aAA4D;AAC7I,aAAO,iBAAiB,MAAM,QAAyB;AACvD,WAAK,UAAU,KAAK,MAAM,OAAO,oBAAoB,MAAM,QAAyB,CAAC;AAAA,IACvF;AACA,WAAO,SAAS,eAAe,CAAC,UAAU;AACxC,YAAM,eAAe;AACrB,UAAI,aAAa,WAAW,EAAG;AAC/B,YAAM,eAAe;AACrB,YAAM,QAAQ,EAAE,GAAG,aAAa,SAAS,GAAG,aAAa,QAAQ;AACjE,WAAK,YAAY,aAAa;AAC9B,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,aAAa,EAAE,GAAG,KAAK,MAAM,IAAI,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,MAAM,EAAE;AACzE,WAAK,MAAM,WAAW;AACtB,WAAK,QAAQ,OAAO;AACpB,WAAK,kBAAkB,KAAK,SAAS,MAAM,SAAS,KAAK,KAAK,SAAS,MAAM,4CAAS;AACtF,UAAI,KAAK,gBAAiB,MAAK,MAAM,eAAe,KAAK,gBAAgB;AACzE,cAAQ,oBAAoB,aAAa,SAAS;AAAA,IACpD,CAAC;AACD,WAAO,UAAU,eAAe,CAAC,UAAU;AACzC,YAAM,eAAe;AACrB,UAAI,CAAC,KAAK,MAAM,YAAY,aAAa,cAAc,KAAK,UAAW;AACvE,YAAM,QAAQ,EAAE,GAAG,aAAa,SAAS,GAAG,aAAa,QAAQ;AACjE,YAAM,WAAW,KAAK,eAAe;AACrC,WAAK,MAAM,MAAM,MAAM,IAAI,SAAS,KAAK;AACzC,WAAK,MAAM,MAAM,MAAM,IAAI,SAAS,KAAK;AACzC,WAAK,MAAM,IAAI,MAAM,IAAI,KAAK,WAAW;AACzC,WAAK,MAAM,IAAI,MAAM,IAAI,KAAK,WAAW;AACzC,WAAK,cAAc;AAAA,IACrB,CAAC;AACD,WAAO,UAAU,aAAa,CAAC,UAAU;AACvC,YAAM,eAAe;AACrB,UAAI,CAAC,KAAK,MAAM,YAAY,aAAa,cAAc,KAAK,UAAW;AACvE,WAAK,MAAM,WAAW;AACtB,YAAM,QAAQ,KAAK,cAAc,KAAK,MAAM,KAAK,YAAa,IAAI,KAAK,YAAY,GAAG,KAAK,YAAa,IAAI,KAAK,YAAY,CAAC,IAAI;AAClI,WAAK,YAAY;AACjB,WAAK,kBAAkB,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,SAAS,MAAM,gCAAO,KAAK,KAAK,iBAAiB;AAC9G,UAAI,KAAK,iBAAiB;AACxB,aAAK,MAAM,eAAe,KAAK,gBAAgB;AAC/C,aAAK,QAAQ,MAAM,KAAK,gBAAgB,MAAM,KAAK,kBAAkB,KAAK,IAAI,UAAU,CAAC,CAAC;AAAA,MAC5F;AACA,UAAI,QAAQ,EAAG,MAAK,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACF;;;ACxQO,SAAS,wBACd,QACAC,WACA,cACe;AACf,MAAI;AACJ,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI;AACF,iBAAW,CAAC,GAAGA,UAAS,iBAAiB,MAAM,CAAC;AAAA,IAClD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF,OAAO;AACL,eAAW;AAAA,EACb;AACA,QAAM,yBAAyBA,UAAS,aAAa;AACrD,MAAI,CAAC,uBAAwB,QAAO,CAAC;AACrC,SAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE;AAAA,IAAO,CAAC,YACpC,mBAAmB,0BAA0B,QAAQ,gBAAgB,CAAC,gBAAgB,CAAC,aAAa,SAAS,OAAO;AAAA,EACtH;AACF;AAGO,SAAS,uBACd,UACA,mBACqB;AACrB,QAAM,aAAkC,CAAC;AACzC,aAAW,WAAW,UAAU;AAC9B,UAAM,YAAY,QAAQ,sBAAsB;AAChD,QAAI,UAAU,SAAS,KAAK,UAAU,UAAU,EAAG;AACnD,eAAW,KAAK;AAAA,MACd;AAAA,MACA,GAAG,UAAU,OAAO,kBAAkB;AAAA,MACtC,GAAG,UAAU,MAAM,kBAAkB;AAAA,MACrC,OAAO,UAAU;AAAA,MACjB,QAAQ,UAAU;AAAA,IACpB,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AC9BA,SAAS,cAAc,QAAsB;AAC3C,QAAM,QAAQ,mCAAmC,KAAK,MAAM;AAC5D,MAAI,CAAC,MAAO,OAAM,IAAI,UAAU,wBAAwB;AACxD,QAAM,WAAW,MAAM,CAAC,KAAK;AAC7B,QAAM,UAAU,MAAM,CAAC,KAAK;AAC5B,QAAM,SAAS,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,mBAAmB,OAAO;AACpE,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,EAAG,OAAM,KAAK,IAAI,OAAO,WAAW,KAAK;AAC7F,SAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAC7C;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACR,SAAS,oBAAI,IAAiB;AAAA;AAAA,EAGxC,QAAQ,QAAoC;AACjD,QAAI,MAAM,OAAO,WAAW,WAAW,SAAS;AAChD,QAAI,QAAQ;AACZ,QAAI,OAAO,IAAI,oBAAoB,eAAe,OAAO,WAAW,YAAY,OAAO,WAAW,YAAY,IAAI;AAChH,UAAI;AACF,cAAM,IAAI,gBAAgB,OAAO,WAAW,WAAW,cAAc,MAAM,IAAI,MAAM;AACrF,gBAAQ;AAAA,MACV,QAAQ;AACN,YAAI,OAAO,WAAW,SAAU,OAAM,IAAI,MAAM,sEAAsE;AAAA,MACxH;AAAA,IACF;AACA,QAAI,WAAW;AACf,UAAM,QAAqB;AAAA,MACzB;AAAA,MACA,SAAS,MAAM;AACb,YAAI,SAAU;AACd,mBAAW;AACX,aAAK,OAAO,OAAO,KAAK;AACxB,YAAI,MAAO,KAAI,gBAAgB,GAAG;AAAA,MACpC;AAAA,IACF;AACA,SAAK,OAAO,IAAI,KAAK;AACrB,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,QAAQ,MAAqB,OAAoB,YAAgD;AACtG,UAAM,MAAM,OAAO,KAAK,KAAK,OAAO,EAAE,KAAK,CAAC,cAAc,UAAU,YAAY,MAAM,WAAW,YAAY,CAAC;AAC9G,UAAM,SAAS,MAAM,KAAK,QAAQ,GAAG,IAAI;AACzC,QAAI,OAAO,WAAW,SAAU,QAAO,EAAE,KAAK,OAAO;AACrD,QAAI,UAAU,SAAS,UAAU,OAAO,OAAO,QAAQ,YAAY,EAAE,OAAO,QAAS,QAAO,EAAE,KAAK,OAAO,IAAI;AAC9G,QAAI,UAAU,OAAO,OAAQ,QAAO,EAAE,KAAK,OAAO,OAAO,MAAM,KAAK,WAAW,OAAO;AACtF,QAAI,8BAA8B,KAAK,UAAU,EAAG,QAAO,EAAE,KAAK,WAAW;AAC7E,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,UAAgB;AACrB,eAAW,SAAS,CAAC,GAAG,KAAK,MAAM,EAAG,OAAM,QAAQ;AAAA,EACtD;AACF;AAGO,SAAS,mBAAmB,QAAiF;AAClH,SAAO,OAAO,WAAW,YAAY,SAAS,UAAU,EAAE,OAAO;AACnE;;;ACxEA,IAAM,eAAN,MAA0C;AAAA,EACvB,YAAY,oBAAI,IAAiD;AAAA,EAC3E,GAA2B,OAAU,UAAoD;AAC9F,UAAM,YAAY,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAI;AACvD,cAAU,IAAI,QAAoC;AAClD,SAAK,UAAU,IAAI,OAAO,SAAS;AACnC,WAAO,MAAM;AAAE,gBAAU,OAAO,QAAoC;AAAA,IAAG;AAAA,EACzE;AAAA,EACO,KAA6B,OAAU,SAA0B;AACtE,eAAW,YAAY,CAAC,GAAI,KAAK,UAAU,IAAI,KAAK,KAAK,CAAC,CAAE,EAAG,UAAS,OAAgB;AAAA,EAC1F;AAAA,EACO,QAAc;AAAE,SAAK,UAAU,MAAM;AAAA,EAAG;AACjD;AAEA,IAAM,WAAW;AAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,WAAW,CAAC;AACd;AAKO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAkBlB,YAA6B,WAAwB,UAAgC,CAAC,GAAG;AAA5D;AAClC,QAAI,CAAC,UAAW,OAAM,IAAI,UAAU,4CAA4C;AAChF,SAAK,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,QAAQ,QAAQ,OAAO;AACjE,SAAK,iBAAiB,KAAK,QAAQ;AACnC,SAAK,MAAM,IAAI,WAAW,WAAW,KAAK,OAAO;AACjD,SAAK,WAAW;AAAA,EAClB;AAAA,EANoC;AAAA,EAjBnB,QAAQ,oBAAI,IAA2B;AAAA,EACvC,UAAU,oBAAI,IAAoB;AAAA,EAClC,UAAU,IAAI,cAAc;AAAA,EAC5B;AAAA,EACA,SAAS,IAAI,aAAoC;AAAA,EACjD,YAA+B,CAAC;AAAA,EAChC,YAAY,oBAAI,IAAY;AAAA,EAC5B;AAAA,EACT,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,EACrC;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA;AAAA,EAYD,aAAmB;AACxB,SAAK,YAAY;AACjB,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AACnB,SAAK,OAAO,UAAU,eAAe,CAAC,UAAU;AAC9C,YAAM,eAAe;AACrB,YAAM,IAAI,aAAa;AACvB,YAAM,IAAI,aAAa;AACvB,WAAK,UAAU,EAAE,GAAG,GAAG,IAAI,IAAI,KAAK,QAAQ,GAAG,IAAI,IAAI,KAAK,QAAQ,EAAE;AAAA,IACxE,CAAC;AACD,SAAK,OAAO,QAAQ,UAAU,MAAM,KAAK,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,YAAY,MAAM,KAAK,IAAI,cAAc,GAAG,GAAK;AAC5E,SAAK,UAAU,IAAI,WAAW;AAC9B,SAAK,iBAAiB,sBAAsB,KAAK,gBAAgB;AAAA,EACnE;AAAA;AAAA,EAGO,kBAAkB,MAAuC;AAC9D,SAAK,YAAY;AACjB,UAAM,aAAa,uBAAuB,IAAI;AAC9C,SAAK,MAAM,IAAI,WAAW,IAAI,UAAU;AACxC,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA,EAGO,oBAAoB,aAAqB,gBAAgB,MAAe;AAC7E,SAAK,YAAY;AACjB,QAAI,eAAe;AACjB,iBAAW,SAAS,KAAK,SAAS,EAAG,KAAI,MAAM,gBAAgB,YAAa,MAAK,OAAO,MAAM,EAAE;AAAA,IAClG;AACA,WAAO,KAAK,MAAM,OAAO,WAAW;AAAA,EACtC;AAAA;AAAA,EAGO,kBAA4B;AAAE,WAAO,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,EAAG;AAAA;AAAA,EAG7D,MAAM,aAAqB,WAAyB,CAAC,GAAW;AACrE,SAAK,YAAY;AACjB,UAAM,OAAO,KAAK,MAAM,IAAI,WAAW;AACvC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,cAAc,WAAW,qBAAqB;AACzE,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK,kBAAkB;AACrD,UAAM,SAAS,KAAK,QAAQ,UAAU,KAAK;AAC3C,UAAM,eAA6B;AAAA,MACjC,GAAG;AAAA,MACH,GAAG,SAAS,KAAK,OAAO,IAAI,OAAO,IAAI,OAAO;AAAA,MAC9C,GAAG,SAAS,KAAK,OAAO;AAAA,IAC1B;AACA,UAAM,KAAK,WAAW,KAAK,cAAc;AACzC,UAAM,SAAS,IAAI,OAAO,IAAI,MAAM,KAAK,KAAK,KAAK,SAAS,cAAc;AAAA,MACxE,SAAS,OAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,MAClC,OAAO,MAAM,KAAK,QAAQ;AAAA,MAC1B,OAAO,CAAC,iBAAiB,iBAAiB;AAAE,YAAI,CAAC,KAAK,UAAW,MAAK,MAAM,iBAAiB,YAAY;AAAA,MAAG;AAAA,MAC5G,QAAQ,CAAC,aAAa;AAAE,YAAI,CAAC,KAAK,UAAW,MAAK,OAAO,QAAQ;AAAA,MAAG;AAAA,MACpE,OAAO,CAACC,WAAU,KAAK,OAAO,KAAK,SAASA,MAAK;AAAA,MACjD,OAAO,CAAC,UAAU,KAAK,OAAO,KAAK,SAAS,KAAK;AAAA,IACnD,CAAC;AACD,SAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,WAAO,KAAK,GAAG,QAAQ,SAAS;AAChC,UAAM,QAAQ,OAAO,SAAS;AAC9B,SAAK,OAAO,KAAK,SAAS,KAAK;AAC/B,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,OAAO,UAA2B;AACvC,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,OAAO,SAAS;AAC9B,SAAK,QAAQ,OAAO,QAAQ;AAC5B,WAAO,QAAQ;AACf,SAAK,OAAO,KAAK,UAAU,KAAK;AAChC,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA,EAGO,YAAkB;AACvB,SAAK,YAAY;AACjB,eAAW,MAAM,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,EAAG,MAAK,OAAO,EAAE;AAAA,EAC3D;AAAA;AAAA,EAGO,WAA0B;AAAE,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,OAAO,SAAS,CAAC;AAAA,EAAG;AAAA;AAAA,EAGlG,GAA0C,OAAU,UAA+C;AACxG,SAAK,YAAY;AACjB,WAAO,KAAK,OAAO,GAAG,OAAO,QAAQ;AAAA,EACvC;AAAA;AAAA,EAGO,aAAa,WAAkD;AACpE,SAAK,YAAY;AACjB,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA,EAGO,UAAgB;AACrB,QAAI,KAAK,UAAW;AACpB,eAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,QAAO,QAAQ;AAC3D,SAAK,QAAQ,MAAM;AACnB,QAAI,KAAK,mBAAmB,OAAW,sBAAqB,KAAK,cAAc;AAC/E,SAAK,iBAAiB;AACtB,eAAW,YAAY,KAAK,UAAW,QAAO,cAAc,QAAQ;AACpE,SAAK,UAAU,MAAM;AACrB,eAAW,WAAW,KAAK,UAAU,OAAO,CAAC,EAAG,SAAQ;AACxD,SAAK,IAAI,QAAQ;AACjB,SAAK,QAAQ,QAAQ;AACrB,SAAK,MAAM,MAAM;AACjB,SAAK,OAAO,MAAM;AAClB,SAAK,YAAY;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA,EAGO,cAAuB;AAAE,WAAO,KAAK;AAAA,EAAW;AAAA,EAEtC,mBAAmB,CAAC,cAA4B;AAC/D,QAAI,KAAK,UAAW;AACpB,UAAM,WAAW,KAAK,kBAAkB,SAAY,KAAK,QAAQ,gBAAgB,YAAY,KAAK;AAClG,SAAK,gBAAgB;AACrB,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,KAAK,QAAQ,YAAY,CAAC;AACvE,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK,kBAAkB;AACrD,eAAW,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAG,QAAO,KAAK,OAAO,QAAQ,SAAS;AACrF,SAAK,UAAU;AACf,SAAK,iBAAiB,sBAAsB,KAAK,gBAAgB;AAAA,EACnE;AAAA,EAEQ,YAAkB;AACxB,UAAM,EAAE,QAAQ,UAAU,IAAI,KAAK,kBAAkB;AACrD,eAAW,UAAU,KAAK,QAAQ,OAAO,EAAG,QAAO,KAAK,GAAG,QAAQ,SAAS;AAAA,EAC9E;AAAA,EAEQ,oBAAqG;AAC3G,UAAM,SAAS,KAAK,IAAI,UAAU;AAClC,UAAM,WAAW,wBAAwB,KAAK,gBAAgB,KAAK,UAAU,aAAa,EACvF,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,KAAK,OAAO,CAAC;AAC9C,WAAO,EAAE,QAAQ,WAAW,uBAAuB,UAAU,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE;AAAA,EACpF;AAAA,EAEQ,YAAkB;AAAE,SAAK,OAAO,KAAK,eAAe,KAAK,SAAS,CAAC;AAAA,EAAG;AAAA,EAEtE,OAAO,QAAqB,MAAc,UAA+B;AAC/E,WAAO,iBAAiB,MAAM,QAAQ;AACtC,SAAK,UAAU,KAAK,MAAM,OAAO,oBAAoB,MAAM,QAAQ,CAAC;AAAA,EACtE;AAAA,EAEQ,cAAoB;AAC1B,QAAI,KAAK,UAAW,OAAM,IAAI,MAAM,kCAAkC;AAAA,EACxE;AACF;","names":["document","document","state"]}