@adatechnology/game-floorplan 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/geometry.ts","../src/queries.ts","../src/grid.ts","../src/registry.ts","../src/rng.ts","../src/fill.ts","../src/legacy-seeds.ts","../src/context.ts","../src/locale.ts","../src/zoning.ts","../src/plan.ts","../src/palette.ts","../src/slots.ts","../src/generate.ts","../src/ground-items.ts","../src/slot-kit.ts","../src/locales/en.json","../src/locales/pt-BR.json","../src/index.ts"],"sourcesContent":["/** Structural wall thickness in metres. */\nexport const WALL_THICKNESS = 0.15\n/** Half a wall: the gap between a room rectangle and its usable interior. */\nexport const MARGIN = WALL_THICKNESS / 2\nexport const EPS = 1e-6\nexport const TOL = 1e-3\n/** Clear zone in front of doors and gates, in metres. */\nexport const DOOR_CLEARANCE = 0.9\n","import { EPS, MARGIN, TOL, WALL_THICKNESS } from './constants'\nimport type { PlacedItem, Rect, Room, RoomDef, Vec2 } from './types'\n\nexport const r2 = (x: number): number => Math.round(x * 100) / 100\nexport const clamp = (x: number, a: number, b: number): number => Math.max(a, Math.min(b, x))\nexport const overlaps = (a: Rect, b: Rect, e = EPS): boolean => a[0] < b[2] - e && a[2] > b[0] + e && a[1] < b[3] - e && a[3] > b[1] + e\nexport const inner = (p: Rect): Rect => [p[0] + MARGIN, p[1] + MARGIN, p[2] - MARGIN, p[3] - MARGIN]\nexport const eq = (a: number, b: number): boolean => Math.abs(a - b) < TOL\nexport const inflate = (r: Rect, e: number): Rect => [r[0] - e, r[1] - e, r[2] + e, r[3] + e]\nexport const areaOf = (r: Rect): number => (r[2] - r[0]) * (r[3] - r[1])\nexport const topOf = (m: PlacedItem): number => (m.y || 0) + m.h\n\n/** Footprint of an item of `size` facing `f` (cardinal). */\nexport const extent = (size: Vec2, f: Vec2): Vec2 => (Math.abs(f[1]) === 1 ? [size[0], size[1]] : [size[1], size[0]])\nexport const cardinal = (dx: number, dz: number): Vec2 => (Math.abs(dx) > Math.abs(dz) ? [Math.sign(dx), 0] : [0, Math.sign(dz) || 1])\n\nexport function clearRect(r: Rect, f: Vec2, clearance: number): Rect {\n return f[1] === 1 ? [r[0], r[3], r[2], r[3] + clearance] : f[1] === -1 ? [r[0], r[1] - clearance, r[2], r[1]] : f[0] === 1 ? [r[2], r[1], r[2] + clearance, r[3]] : [r[0] - clearance, r[1], r[0], r[3]]\n}\n\nexport function insideUnion(r: Rect, inners: Rect[]): boolean {\n const e = 1e-4\n const points: Vec2[] = [\n [r[0] + e, r[1] + e],\n [r[2] - e, r[1] + e],\n [r[0] + e, r[3] - e],\n [r[2] - e, r[3] - e],\n [(r[0] + r[2]) / 2, (r[1] + r[3]) / 2],\n ]\n return points.every((p) => inners.some((q) => p[0] >= q[0] - 1e-6 && p[0] <= q[2] + 1e-6 && p[1] >= q[1] - 1e-6 && p[1] <= q[3] + 1e-6))\n}\n\nexport function cutIntervals(intervals: [number, number][], a: number, b: number): [number, number][] {\n const out: [number, number][] = []\n for (const [x, y] of intervals) {\n if (b <= x || a >= y) {\n out.push([x, y])\n continue\n }\n if (a > x) out.push([x, a])\n if (b < y) out.push([b, y])\n }\n return out\n}\n\nexport interface Edge {\n axis: 'u' | 'v'\n pos: number\n a0: number\n a1: number\n}\n\nexport function exteriorEdge(room: Room, side: string, w: number, d: number, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const p of room.parts) {\n if (side === 'front' && eq(p[1], 0)) cand.push({ axis: 'u', pos: 0, a0: p[0], a1: p[2] })\n else if (side === 'back' && eq(p[3], d)) cand.push({ axis: 'u', pos: d, a0: p[0], a1: p[2] })\n else if (side === 'left' && eq(p[0], 0)) cand.push({ axis: 'v', pos: 0, a0: p[1], a1: p[3] })\n else if (side === 'right' && eq(p[2], w)) cand.push({ axis: 'v', pos: w, a0: p[1], a1: p[3] })\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function sharedEdge(A: Room, B: Room, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const pa of A.parts)\n for (const pb of B.parts) {\n let o: [number, number]\n if (eq(pa[2], pb[0]) || eq(pa[0], pb[2])) {\n o = [Math.max(pa[1], pb[1]), Math.min(pa[3], pb[3])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'v', pos: eq(pa[2], pb[0]) ? pa[2] : pa[0], a0: o[0], a1: o[1] })\n }\n if (eq(pa[3], pb[1]) || eq(pa[1], pb[3])) {\n o = [Math.max(pa[0], pb[0]), Math.min(pa[2], pb[2])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'u', pos: eq(pa[3], pb[1]) ? pa[3] : pa[1], a0: o[0], a1: o[1] })\n }\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function openingZones(u: number, v: number, axis: 'u' | 'v', width: number, depth: number): Rect[] {\n const h = width / 2\n return axis === 'u' ? [[u - h, v - depth, u + h, v], [u - h, v, u + h, v + depth]] : [[u - depth, v - h, u, v + h], [u, v - h, u + depth, v + h]]\n}\nexport const openingDepth = (width: number, leaf: number): number => Math.max(0.9, leaf) + MARGIN\n\n/** Points 0.55 m on each side of an opening. */\nexport function entryPoints(ab: { axis: 'u' | 'v'; u: number; v: number }): Vec2[] {\n return ab.axis === 'u' ? [[ab.u, ab.v - 0.55], [ab.u, ab.v + 0.55]] : [[ab.u - 0.55, ab.v], [ab.u + 0.55, ab.v]]\n}\n\nexport function normalizeRoom(c: Partial<RoomDef> & { id: string; type: string; rect: number[] }, floorIndex: number): Room {\n const parts = [c.rect as number[]].concat(c.parts || []).map((p) => p.map(r2) as Rect)\n return {\n id: c.id,\n type: c.type,\n label: c.label,\n floor: floorIndex,\n parts,\n library: c.library || null,\n without: c.without || [],\n overrides: c.overrides || {},\n extras: c.extras || [],\n slots: c.slots || null,\n link: c.link || null,\n outdoor: !!c.outdoor,\n ceiling: c.ceiling || null,\n seedKey: c.seedKey,\n }\n}\n\n/** Usable parts: inset only on sides with a real wall (sides open to another part of the same room are not inset). */\nexport function usableParts(room: Room, extra?: number): Rect[] {\n return room.parts.map((p) => {\n const isOpen = (k: number) =>\n room.parts.some(\n (q) =>\n q !== p &&\n (k === 0\n ? eq(q[2], p[0]) && Math.min(q[3], p[3]) - Math.max(q[1], p[1]) > 0.3\n : k === 2\n ? eq(q[0], p[2]) && Math.min(q[3], p[3]) - Math.max(q[1], p[1]) > 0.3\n : k === 1\n ? eq(q[3], p[1]) && Math.min(q[2], p[2]) - Math.max(q[0], p[0]) > 0.3\n : eq(q[1], p[3]) && Math.min(q[2], p[2]) - Math.max(q[0], p[0]) > 0.3),\n )\n const m = MARGIN + (extra || 0)\n return [p[0] + (isOpen(0) ? 0 : m), p[1] + (isOpen(1) ? 0 : m), p[2] - (isOpen(2) ? 0 : m), p[3] - (isOpen(3) ? 0 : m)] as Rect\n })\n}\n\nexport const inRect = (room: Room, u: number, v: number): boolean => room.parts.some((p) => u > p[0] + EPS && u < p[2] - EPS && v > p[1] + EPS && v < p[3] - EPS)\n\nexport interface WallBuildDoor {\n axis: 'u' | 'v'\n pos: number\n at: number\n width: number\n}\n\n/** Walls of one storey, split where rooms meet and cut where doors open. */\nexport function buildWalls(rooms: Room[], doors: WallBuildDoor[], openPairs: [string, string][], floorIndex: number) {\n const groups: Record<string, { axis: 'u' | 'v'; pos: number; es: { a: number; b: number; id: string; side: number }[] }> = {}\n const add = (axis: 'u' | 'v', pos: number, a: number, b: number, id: string, side: number) => {\n const k = axis + '|' + pos.toFixed(2)\n ;(groups[k] = groups[k] || { axis, pos, es: [] }).es.push({ a, b, id, side })\n }\n for (const c of rooms)\n for (const p of c.parts) {\n add('u', p[1], p[0], p[2], c.id, 1)\n add('u', p[3], p[0], p[2], c.id, -1)\n add('v', p[0], p[1], p[3], c.id, 1)\n add('v', p[2], p[1], p[3], c.id, -1)\n }\n const par = (x: string, y: string) => openPairs.some((o) => (o[0] === x && o[1] === y) || (o[0] === y && o[1] === x))\n const typeOf: Record<string, string> = {}\n for (const c of rooms) typeOf[c.id] = c.type\n const out: Record<string, unknown>[] = []\n for (const g of Object.values(groups)) {\n const breaks = [...new Set(g.es.flatMap((e) => [r2(e.a), r2(e.b)]))].sort((x, y) => x - y)\n const segs: { A: string; B: string; p: number; q: number }[] = []\n for (let i = 0; i < breaks.length - 1; i++) {\n const p = breaks[i]\n const q = breaks[i + 1]\n const m = (p + q) / 2\n const after = g.es.find((e) => e.side === 1 && m > e.a && m < e.b)\n const before = g.es.find((e) => e.side === -1 && m > e.a && m < e.b)\n if (!after && !before) continue\n const A = before ? before.id : 'outside'\n const B = after ? after.id : 'outside'\n if (A === B || (A !== 'outside' && B !== 'outside' && par(A, B))) continue\n const last = segs[segs.length - 1]\n if (last && last.A === A && last.B === B && eq(last.q, p)) last.q = q\n else segs.push({ A, B, p, q })\n }\n for (const s of segs) {\n let pieces: [number, number][] = [[s.p, s.q]]\n for (const pt of doors) {\n if (pt.axis !== g.axis || !eq(pt.pos, g.pos)) continue\n const c0 = pt.at - pt.width / 2\n const c1 = pt.at + pt.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (c1 <= x + TOL || c0 >= y - TOL) {\n n.push([x, y])\n continue\n }\n if (c0 > x + TOL) n.push([x, c0])\n if (c1 < y - TOL) n.push([c1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) {\n const isOpen = (t: string) => t === 'balcony' || t === 'terrace'\n const isVoid = typeOf[s.A] === 'void' || typeOf[s.B] === 'void'\n if (isVoid && (s.A === 'outside' || s.B === 'outside')) continue\n const railing = isVoid || (isOpen(typeOf[s.A]) && s.B === 'outside') || (isOpen(typeOf[s.B]) && s.A === 'outside')\n out.push({\n floor: floorIndex,\n axis: g.axis,\n u0: g.axis === 'u' ? x : g.pos,\n v0: g.axis === 'u' ? g.pos : x,\n u1: g.axis === 'u' ? y : g.pos,\n v1: g.axis === 'u' ? g.pos : y,\n thickness: WALL_THICKNESS,\n sides: [s.A, s.B],\n exterior: s.A === 'outside' || s.B === 'outside',\n type: railing ? 'railing' : 'wall',\n h: railing ? 1.1 : 0,\n })\n }\n }\n }\n return out\n}\n","import { EPS, MARGIN } from './constants'\nimport { eq, inRect } from './geometry'\nimport type { ItemDef, Json, Plan, Rect, Room } from './types'\n\n/** Door and path zones of a storey (storey -1 is the lot). */\nexport function zonesOfFloor(plan: Plan, floorIndex: number): Rect[] {\n const out: Rect[] = []\n if (floorIndex >= 0) {\n for (const p of plan.doors) if (p.floor === floorIndex) out.push(...p.zones)\n } else {\n for (const p of plan.doors) if (p.floor === 0 && p.exterior) out.push(...p.zones)\n for (const g of plan.gates) out.push(...g.zones)\n for (const c of plan.paths) out.push(...c.rects)\n }\n return out\n}\n\nexport function openingsOfFloor(plan: Plan, floorIndex: number): Json[] {\n if (floorIndex >= 0) return plan.doors.filter((p) => p.floor === floorIndex)\n return plan.doors.filter((p) => p.floor === 0 && p.exterior).concat(plan.gates)\n}\n\n/** Keep-out zone of a window (inside, or outside for the lot). */\nexport function windowZone(j: Json, outside?: boolean): Rect {\n const h = j.width / 2 + 0.1\n const depth = 0.5\n let n: [number, number]\n if (j.side === 'front') n = [0, 1]\n else if (j.side === 'back') n = [0, -1]\n else if (j.side === 'left') n = [1, 0]\n else n = [-1, 0]\n if (outside) n = [-n[0], -n[1]]\n const u = j.u\n const v = j.v\n if (j.axis === 'u') return n[1] > 0 ? [u - h, v - MARGIN, u + h, v + depth] : [u - h, v - depth, u + h, v + MARGIN]\n return n[0] > 0 ? [u - MARGIN, v - h, u + depth, v + h] : [u - depth, v - h, u + MARGIN, v + h]\n}\n\nexport const blocksWindow = (it: Pick<ItemDef, 'window'> & { h: number }, win: Json): boolean => !it.window || it.h > 1.0 + EPS || it.h > win.y0 - 0.05\n\nexport function windowsOfRoom(plan: Plan, room: Room): Json[] {\n if (!room.outdoor) return plan.windows.filter((j) => j.room === room.id)\n return plan.windows.filter(\n (j) =>\n j.floor === 0 &&\n room.parts.some((p) => {\n if (j.side === 'front') return eq(p[3], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'back') return eq(p[1], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'left') return eq(p[2], j.pos) && j.v >= p[1] && j.v <= p[3]\n return eq(p[0], j.pos) && j.v >= p[1] && j.v <= p[3]\n }),\n )\n}\n\nexport function roomAt(plan: Plan, u: number, v: number, floorIndex: number): Room | null {\n const list = floorIndex < 0 ? plan.zones : plan.rooms\n return list.find((c) => c.floor === floorIndex && inRect(c, u, v)) || null\n}\n\nexport function isOpenSide(plan: Plan, room: Room, pu: number, pv: number): boolean {\n const o = roomAt(plan, pu, pv, room.floor)\n if (!o) return false\n if (o.id === room.id) return true\n if (room.outdoor) return true\n return (plan.openPairs[room.floor] || []).some((x) => (x[0] === room.id && x[1] === o.id) || (x[1] === room.id && x[0] === o.id))\n}\n","import { entryPoints, inRect, inner, usableParts } from './geometry'\nimport { openingsOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room } from './types'\n\nexport interface Grid {\n gs: number\n u0: number\n v0: number\n nx: number\n nz: number\n inside: Uint8Array\n entries: [number, number][]\n center: [number, number]\n}\n\n/** Coarse walkability grid of a room. `ignored` lists opening ids to leave out of the entries. */\nexport function createGrid(plan: Plan, room: Room, ignored?: Set<string> | null): Grid {\n const gs = room.outdoor ? 0.3 : 0.2\n let u0 = 1e9\n let v0 = 1e9\n let u1 = -1e9\n let v1 = -1e9\n for (const p of room.parts) {\n u0 = Math.min(u0, p[0])\n v0 = Math.min(v0, p[1])\n u1 = Math.max(u1, p[2])\n v1 = Math.max(v1, p[3])\n }\n const nx = Math.ceil((u1 - u0) / gs)\n const nz = Math.ceil((v1 - v0) / gs)\n const insideCells = new Uint8Array(nx * nz)\n const insets = usableParts(room, 0.08)\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (insets.some((r) => u >= r[0] && u <= r[2] && v >= r[1] && v <= r[3])) insideCells[j * nx + i] = 1\n }\n const entries: [number, number][] = []\n for (const ab of openingsOfFloor(plan, room.floor) as Json[])\n if (!(ignored && ignored.has(ab.id)))\n for (const pt of entryPoints(ab)) {\n if (!inRect(room, pt[0], pt[1])) continue\n const i = Math.floor((pt[0] - u0) / gs)\n const j = Math.floor((pt[1] - v0) / gs)\n if (i >= 0 && j >= 0 && i < nx && j < nz && insideCells[j * nx + i]) entries.push([i, j])\n }\n const R = inner(room.parts[0])\n return { gs, u0, v0, nx, nz, inside: insideCells, entries, center: [(R[0] + R[2]) / 2, (R[1] + R[3]) / 2] }\n}\n\n/** True when the room centre and every entry stay connected once `solids` (inflated) are blocked. */\nexport function reachable(g: Grid, solids: Rect[], inflation: number): boolean {\n const { gs, u0, v0, nx, nz, inside } = g\n const blocked = new Uint8Array(nx * nz)\n for (const r of solids) {\n const i0 = Math.max(0, Math.floor((r[0] - inflation - u0) / gs))\n const i1 = Math.min(nx - 1, Math.floor((r[2] + inflation - u0) / gs))\n const j0 = Math.max(0, Math.floor((r[1] - inflation - v0) / gs))\n const j1 = Math.min(nz - 1, Math.floor((r[3] + inflation - v0) / gs))\n for (let j = j0; j <= j1; j++)\n for (let i = i0; i <= i1; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (u > r[0] - inflation && u < r[2] + inflation && v > r[1] - inflation && v < r[3] + inflation) blocked[j * nx + i] = 1\n }\n }\n let best = -1\n let bestDist = 1e9\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const k = j * nx + i\n if (!inside[k] || blocked[k]) continue\n const dist = Math.hypot(u0 + (i + 0.5) * gs - g.center[0], v0 + (j + 0.5) * gs - g.center[1])\n if (dist < bestDist) {\n bestDist = dist\n best = k\n }\n }\n if (best < 0) return false\n if (!g.entries.length) return true\n for (const [i, j] of g.entries) if (blocked[j * nx + i]) return false\n const visited = new Uint8Array(nx * nz)\n const queue = new Int32Array(nx * nz)\n let h = 0\n let t = 0\n const s = g.entries[0][1] * nx + g.entries[0][0]\n visited[s] = 1\n queue[t++] = s\n while (h < t) {\n const k = queue[h++]\n const i = k % nx\n const j = (k - i) / nx\n for (const [di, dj] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {\n const a = i + di\n const b = j + dj\n if (a < 0 || b < 0 || a >= nx || b >= nz) continue\n const q = b * nx + a\n if (visited[q] || !inside[q] || blocked[q]) continue\n visited[q] = 1\n queue[t++] = q\n }\n }\n if (!visited[best]) return false\n for (const [i, j] of g.entries) if (!visited[j * nx + i]) return false\n return true\n}\n","import type {\n DecorPass,\n GroundOverlayRule,\n ItemDef,\n ItemInput,\n Json,\n RoomColorDef,\n SlotLibrary,\n StateContext,\n StatePlugin,\n StyleDef,\n TemplateDef,\n} from './types'\nimport type { PaletteStyleDef } from './palette'\n\n/** All content registries of the engine. Content packs fill them through the `register*` functions. */\nexport const CATALOG: Record<string, ItemDef> = {}\nexport const LIBRARIES: Record<string, SlotLibrary> = {}\nexport const LIBRARY_ALIAS: Record<string, string> = {}\nexport const TEMPLATES: Record<string, TemplateDef> = {}\nexport const STYLES: Record<string, StyleDef> = {}\nexport const STYLE_ALIAS: Record<string, string> = {}\nexport const PALETTE_STYLES: Record<string, PaletteStyleDef> = {}\nexport const ROOM_COLORS: RoomColorDef[] = []\nexport const PASSES: { name: string; run: DecorPass }[] = []\nexport const DECOR_PROFILES: Record<string, Json> = {}\nexport const GROUND_OVERLAYS: GroundOverlayRule[] = []\nexport const STATE_PLUGINS: Record<string, StatePlugin> = { normal: { apply: () => [] } }\nexport const WALL_TOP_HEIGHTS: Record<string, number> = { none: 0 }\nexport const SEED_KEYS: { rooms: Record<string, string>; items: Record<string, string> } = { rooms: {}, items: {} }\nexport const stateDistribution: { weights: Record<string, number> | null; seedKey: string } = { weights: null, seedKey: 'state' }\n\nexport function registerItem(def: ItemInput): ItemDef {\n const h = def.h\n const item: ItemDef = Object.assign({ front: '+z', window: h <= 0.95, low: h <= 0.5, flat: false, deck: false, rim: 0 }, def) as ItemDef\n CATALOG[def.type] = item\n return item\n}\nexport function registerItems(list: ItemInput[]): void {\n for (const d of list) registerItem(d)\n}\n\nexport function registerLibrary(id: string, library: SlotLibrary): void {\n LIBRARIES[id] = library\n}\nexport function registerLibraryAlias(alias: string, id: string): void {\n LIBRARY_ALIAS[alias] = id\n}\n\nexport function registerTemplate<T extends TemplateDef>(t: T): T {\n TEMPLATES[t.id] = t\n return t\n}\n\nexport function registerStyle(style: StyleDef): void {\n STYLES[style.id] = style\n for (const a of style.aliases || []) STYLE_ALIAS[a] = style.id\n}\nexport function registerPaletteStyle(id: string, def: PaletteStyleDef): void {\n PALETTE_STYLES[id] = def\n}\nexport function registerRoomColors(list: RoomColorDef[]): void {\n for (const d of list) {\n const i = ROOM_COLORS.findIndex((x) => x.type === d.type)\n if (i >= 0) ROOM_COLORS.splice(i, 1)\n ROOM_COLORS.push(d)\n }\n ROOM_COLORS.sort((a, b) => a.order - b.order)\n}\n\nexport function registerDecorProfile(styleId: string, profile: Json): void {\n DECOR_PROFILES[styleId] = profile\n}\nexport function registerPass(name: string, run: DecorPass): void {\n const i = PASSES.findIndex((p) => p.name === name)\n if (i >= 0) PASSES[i] = { name, run }\n else PASSES.push({ name, run })\n}\nexport function registerGroundOverlay(rule: GroundOverlayRule): void {\n GROUND_OVERLAYS.push(rule)\n}\nexport function registerWallTop(id: string, height: number): void {\n WALL_TOP_HEIGHTS[id] = height\n}\n/** Legacy RNG stream names for rooms and items, so seeds recorded before the English ids still reproduce. */\nexport function registerSeedKeys(keys: { rooms?: Record<string, string>; items?: Record<string, string> }): void {\n Object.assign(SEED_KEYS.rooms, keys.rooms)\n Object.assign(SEED_KEYS.items, keys.items)\n}\n\n/** Registers a house state. The engine only ships `normal`. */\nexport function registerState(name: string, plugin: StatePlugin): void {\n STATE_PLUGINS[name] = plugin\n}\n/** Default state draw when `options.state` is absent: `{ state: weight }` on its own seeded stream. */\nexport function setStateDistribution(weights: Record<string, number> | null, seedKey = 'state'): void {\n stateDistribution.weights = weights\n stateDistribution.seedKey = seedKey\n}\nexport const listStates = (): string[] => Object.keys(STATE_PLUGINS)\n\nexport function resolveStyleId(id: string | undefined): string {\n const s = id ?? ''\n return STYLE_ALIAS[s] ?? s\n}\nexport function styleOf(id: string): StyleDef {\n return STYLES[id] || STYLES.budget || Object.values(STYLES)[0]\n}\n\nexport type { StateContext }\n","/** Seeded random helpers. Same seed and key always produce the same stream. */\n\nexport type Rng = () => number\n\nexport function mulberry32(a: number): Rng {\n return function () {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport function hashString(input: string | number): number {\n const s = String(input)\n let h = 1779033703 ^ s.length\n for (let i = 0; i < s.length; i++) {\n h = Math.imul(h ^ s.charCodeAt(i), 3432918353)\n h = (h << 13) | (h >>> 19)\n }\n h = Math.imul(h ^ (h >>> 16), 2246822507)\n h = Math.imul(h ^ (h >>> 13), 3266489909)\n return (h ^ (h >>> 16)) >>> 0\n}\n\n/** Independent stream for a `(seed, key)` pair. */\nexport const createRng = (seed: string | number, key: string): Rng => mulberry32(hashString(seed + '|' + key))\n\n/** Picks a key of `{ key: weight }`. */\nexport function pickWeighted(rng: Rng, weights: Record<string, number>): string {\n const keys = Object.keys(weights)\n let total = 0\n for (const k of keys) total += weights[k]\n let x = rng() * total\n for (const k of keys) {\n x -= weights[k]\n if (x < 0) return k\n }\n return keys[keys.length - 1]\n}\n\n/** Weighted draw without replacement. */\nexport function weightedOrder<T extends { weight: number }>(candidates: T[], rng: Rng): T[] {\n const arr = candidates.slice()\n const out: T[] = []\n while (arr.length) {\n let total = 0\n for (const c of arr) total += c.weight\n let x = rng() * total\n let i = 0\n for (; i < arr.length - 1; i++) {\n x -= arr[i].weight\n if (x < 0) break\n }\n out.push(arr.splice(i, 1)[0])\n }\n return out\n}\n\nexport function shuffle<T>(arr: T[], rng: Rng): T[] {\n const a = arr.slice()\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1))\n ;[a[i], a[j]] = [a[j], a[i]]\n }\n return a\n}\n","import { EPS } from './constants'\nimport { clearRect, extent, insideUnion, overlaps, r2, usableParts } from './geometry'\nimport { createGrid, reachable } from './grid'\nimport { blocksWindow, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { CATALOG, SEED_KEYS } from './registry'\nimport { weightedOrder } from './rng'\nimport type { Rng } from './rng'\nimport type { ItemDef, Json, PlacedItem, Plan, Rect, Room, Slot, Vec2, Weights } from './types'\n\nfunction candidatesOf(cats: Weights): { it: ItemDef; weight: number }[] {\n const out: { it: ItemDef; weight: number }[] = []\n for (const [cat, weight] of Object.entries(cats)) {\n const exact = cat[0] === '='\n const its = Object.values(CATALOG).filter((i) => !i.decor && (exact ? i.type === cat.slice(1) : i.category === cat || i.type === cat))\n for (const it of its) out.push({ it, weight: weight / its.length })\n }\n return out\n}\n\nfunction itemRect(slot: Slot, it: ItemDef, shift: number): Rect {\n const c = slot._cell\n const f: Vec2 = c.f\n const [extentU, extentV] = extent([it.w, it.d], f)\n const R: Rect = c.R\n // centre without rounding\n let u0 = (c.rect ? (c.rect[0] + c.rect[2]) / 2 : slot.x) - extentU / 2\n let v0 = (c.rect ? (c.rect[1] + c.rect[3]) / 2 : slot.z) - extentV / 2\n if (shift) {\n if (slot.side === 'left' || slot.side === 'right') v0 += shift\n else u0 += shift\n }\n for (const s of c.enclosed) {\n if (s === 'left') u0 = R[0]\n else if (s === 'right') u0 = R[2] - extentU\n else if (s === 'front') v0 = R[1]\n else if (s === 'back') v0 = R[3] - extentV\n }\n return [u0, v0, u0 + extentU, v0 + extentV]\n}\n\nconst MESH_FRONT: Record<string, Vec2> = { '+z': [0, 1], '-z': [0, -1], '+x': [1, 0], '-x': [-1, 0] }\n\n/** Rotation that makes a mesh whose front is `front` face `f`. */\nexport function rotationFor(f: Vec2, front: string): number {\n const meshFront = MESH_FRONT[front] || [0, 1]\n let ry = Math.atan2(f[0], f[1]) - Math.atan2(meshFront[0], meshFront[1])\n if (ry > Math.PI + EPS) ry -= 2 * Math.PI\n if (ry < -Math.PI - EPS) ry += 2 * Math.PI\n return r2(ry)\n}\n\n/** Fills the slots of one room with catalogue items, honouring clearances, doors, windows and reachability. */\nexport function fillRoom(plan: Plan, room: Room, slots: Slot[], rng: Rng): { items: PlacedItem[]; missing: { room: string; slot: string }[] } {\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n const state: Record<string, PlacedItem> = {}\n const solids: Rect[] = []\n const reserves: Rect[] = []\n const rims: Rect[] = []\n const inners = usableParts(room, 0)\n const grid = createGrid(plan, room)\n const zones = zonesOfFloor(plan, room.floor)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n const inflation = room.outdoor ? 0.15 : 0.12\n interface Unit {\n group: string | null\n members: Slot[]\n required?: boolean\n }\n const units: Unit[] = []\n const seen: Record<string, Unit> = {}\n for (const s of slots) {\n if (s.group) {\n if (seen[s.group]) {\n seen[s.group].members.push(s)\n continue\n }\n const u: Unit = { group: s.group, members: [s] }\n seen[s.group] = u\n units.push(u)\n } else units.push({ group: null, members: [s] })\n }\n for (const u of units) u.required = u.members.some((m) => m.required)\n const queue = units.filter((u) => u.required).concat(units.filter((u) => !u.required))\n const dependencies = (u: Unit) =>\n u.members\n .flatMap((m) => [m.requires, m.on])\n .filter(Boolean)\n .filter((id) => slots.some((s) => s.id === id && !u.members.includes(s)))\n const done = new Set<string>()\n const ready = (u: Unit) => dependencies(u).every((id) => done.has(id as string))\n const make = (s: Slot, it: ItemDef, r: Rect, parent: PlacedItem | null) => {\n const f: Vec2 = [s.frontU, s.frontV]\n const id = room.id + '.' + s.id\n const m: Json = {\n id,\n type: it.type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: rotationFor(f, it.front),\n w: it.w,\n d: it.d,\n h: it.h,\n y: parent ? r2((parent.y || 0) + parent.h) : 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: s.id,\n on: parent ? s.on : null,\n mode: parent ? (s.anchor === 'inside' ? 'inside' : 'on') : null,\n clearance: s.clearance,\n flat: it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n _seedId: SEED_KEYS.items[id] ?? id,\n }\n if (parent && s.anchor === 'inside') m.y = r2(parent.y || 0)\n if (room.link) m.link = { from: room.link[0], to: room.link[1] }\n state[s.id] = m\n items.push(m as PlacedItem)\n return m as PlacedItem\n }\n const tryFit = (s: Slot, relax: boolean): PlacedItem | null => {\n const cands = weightedOrder(candidatesOf(s.cats), rng)\n if (s.anchor === 'on' || s.anchor === 'inside') {\n const parent = state[s.on as string]\n if (!parent) return null\n for (const { it } of cands) {\n if (it.w > parent.w + EPS || it.d > parent.d + EPS) continue\n const f: Vec2 = [parent.frontU, parent.frontV]\n const r: Rect = parent.aabb\n const [extentU, extentV] = extent([it.w, it.d], f)\n const cu = (r[0] + r[2]) / 2 - f[0] * (parent.d / 2 - it.d / 2)\n const cv = (r[1] + r[3]) / 2 - f[1] * (parent.d / 2 - it.d / 2)\n return make(s, it, [cu - extentU / 2, cv - extentV / 2, cu + extentU / 2, cv + extentV / 2], parent)\n }\n return null\n }\n for (const { it } of cands) {\n if (it.w > s.w + EPS || it.d > s.d + EPS) continue\n const f: Vec2 = [s.frontU, s.frontV]\n const slide = s.anchor === 'wall' ? (s.slide == null ? 2.0 : s.slide) : 0\n const shifts = [0]\n for (let k = 1; k * 0.1 <= slide + 1e-9; k++) shifts.push(k * 0.1, -k * 0.1)\n let found: { rect: Rect; cl?: Rect | null; rimRect?: Rect | null } | null = null\n for (const shift of shifts) {\n const r = itemRect(s, it, shift)\n if (!insideUnion(r, inners)) continue\n if (it.flat) {\n found = { rect: r }\n break\n }\n if (zones.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j) && overlaps(r, z))) continue\n if (solids.some((o) => overlaps(r, o))) continue\n if (!it.deck && rims.some((a) => overlaps(r, a))) continue\n let cl: Rect | null = null\n if (!relax && s.clearance > 0 && !it.low) {\n cl = clearRect(r, f, s.clearance)\n if (!insideUnion(cl, inners)) continue\n if (items.some((m) => !m.low && !m.flat && !m.on && overlaps(cl as Rect, m._r))) continue\n }\n if (!it.low && reserves.some((q) => overlaps(r, q))) continue\n let rimRect: Rect | null = null\n if (it.rim) {\n rimRect = [r[0] - it.rim, r[1] - it.rim, r[2] + it.rim, r[3] + it.rim]\n if (!insideUnion(rimRect, inners) || solids.some((o) => overlaps(rimRect as Rect, o)) || zones.some((z) => overlaps(rimRect as Rect, z))) continue\n }\n if (!reachable(grid, solids.concat([r]), inflation)) continue\n found = { rect: r, cl, rimRect }\n break\n }\n if (!found) continue\n const { rect: r, cl, rimRect } = found\n if (it.flat) return make(s, it, r, null)\n const m = make(s, it, r, null)\n if (cl) reserves.push(cl)\n if (rimRect) rims.push(rimRect)\n solids.push(r)\n return m\n }\n return null\n }\n const process = (u: Unit) => {\n const pr = u.members[0].chance as number\n const x = rng()\n const arr = u.members.slice()\n const members: Slot[] = []\n while (arr.length) members.push(arr.splice(arr.length > 1 ? Math.floor(rng() * arr.length) : 0, 1)[0])\n const applicable = members.filter((m) => m.valid && (!m.requires || state[m.requires]) && (!m.on || state[m.on]))\n if (!u.required && x >= pr) return\n let ok = false\n for (const m of applicable) {\n if (tryFit(m, false)) {\n ok = true\n break\n }\n }\n if (!ok && u.required)\n for (const m of applicable) {\n if (tryFit(m, true)) {\n ok = true\n break\n }\n }\n if (!ok && u.required && (applicable.length || !u.members.some((m) => m.requires))) missing.push({ room: room.id, slot: u.group || u.members[0].id })\n }\n const pending = queue.slice()\n while (pending.length) {\n let i = pending.findIndex(ready)\n if (i < 0) i = 0\n const u = pending.splice(i, 1)[0]\n process(u)\n for (const m of u.members) done.add(m.id)\n }\n return { items, missing }\n}\n","/**\n * Names of the seeded random streams.\n *\n * These strings come from the Portuguese-language SDK this engine replaces. They are kept\n * verbatim on purpose: a stream is `hash(seed + '|' + name)`, so renaming one would change every\n * plan generated from an existing seed. They never appear in the output.\n */\nexport const STREAM = {\n facade: 'fachada',\n lot: 'lote',\n decor: 'decor',\n roomPrefix: 'c:',\n palettePrefix: 'paleta:',\n} as const\n","import { MARGIN, EPS } from './constants'\nimport {\n areaOf,\n clamp,\n clearRect,\n cutIntervals,\n extent,\n inflate,\n inner,\n insideUnion,\n overlaps,\n r2,\n topOf,\n usableParts,\n} from './geometry'\nimport { rotationFor } from './fill'\nimport { createGrid, reachable } from './grid'\nimport { STREAM } from './legacy-seeds'\nimport { blocksWindow, roomAt, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { CATALOG, DECOR_PROFILES, GROUND_OVERLAYS, PASSES } from './registry'\nimport { createRng, pickWeighted, shuffle } from './rng'\nimport type { Rng } from './rng'\nimport type { Json, PlacedItem, Plan, PlacementContext, PlacementKit, Rect, Room, Vec2 } from './types'\n\n/** Geometry and grid helpers shared with decor passes and state plugins. */\nexport const placementKit: PlacementKit = {\n MARGIN,\n EPS,\n r2,\n clamp,\n overlaps,\n inner,\n inflate,\n areaOf,\n topOf,\n extent,\n insideUnion,\n usableParts,\n zonesOfFloor,\n windowsOfRoom,\n windowZone,\n roomAt,\n reachable: reachable as PlacementKit['reachable'],\n createGrid: createGrid as PlacementKit['createGrid'],\n clearRect,\n pickWeighted,\n shuffle,\n facingRotation: (f: Vec2, type: string) => rotationFor(f, CATALOG[type].front),\n cutIntervals,\n blocksWindow,\n}\n\n/** Builds the shared placement context over the items already placed by the slot fill. */\nexport function createPlacementContext(plan: Plan, items: PlacedItem[]): PlacementContext {\n const added: PlacedItem[] = []\n const counters: Record<string, number> = {}\n const make = (room: Room, type: string, r: Rect, f: Vec2, o?: Json): PlacedItem => {\n const it = CATALOG[type]\n const n = (counters[room.id + type] = (counters[room.id + type] || 0) + 1)\n return Object.assign(\n {\n id: room.id + '.dec_' + type + n,\n type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: r2(Math.atan2(f[0], f[1])),\n w: it.w,\n d: it.d,\n h: it.h,\n y: 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: 'dec_' + type + n,\n on: null,\n mode: null,\n clearance: 0,\n flat: !!it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n decor: true,\n mount: it.mount,\n },\n o || {},\n ) as PlacedItem\n }\n const add = (m: PlacedItem) => {\n added.push(m)\n items.push(m)\n return m\n }\n const itemsOfRoom = (c: Room) => items.filter((m) => m.room === c.id && m.floor === c.floor)\n const extraSolids: Record<string, Rect[]> = {}\n const solidsOfRoom = (c: Room): Rect[] =>\n itemsOfRoom(c)\n .filter((m) => !m.flat && !m.on && (!m.decor || m.mount === 'floor'))\n .map((m) => m._r as Rect)\n .concat(extraSolids[c.id] || [])\n const gridCache: Record<string, ReturnType<typeof createGrid>> = {}\n let ignored: Set<string> | null = null\n const gridOf = (c: Room) => gridCache[c.id] || (gridCache[c.id] = createGrid(plan, c, ignored))\n\n /** Places a floor item at a corner or along a wall; respects doors, windows, clearances and walkability. */\n function placeOnFloor(room: Room, type: string, rng2: Rng, optsIn?: Json): Rect | null {\n const opts = Object.assign({}, optsIn || {})\n const it0 = CATALOG[type]\n if (it0.flat) opts.flat = true\n const it = CATALOG[type]\n const inners = usableParts(room, 0)\n const solidList = solidsOfRoom(room)\n const zones = zonesOfFloor(plan, room.floor)\n const occupied = itemsOfRoom(room)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n const cand: Rect[] = opts.cands ? opts.cands.slice() : []\n if (!opts.cands)\n for (const p of inners) {\n const extentU = opts.dim ? opts.dim[0] : it.w\n const extentV = opts.dim ? opts.dim[1] : it.d\n for (const [x, z] of [[p[0], p[1]], [p[2] - extentU, p[1]], [p[0], p[3] - extentV], [p[2] - extentU, p[3] - extentV]]) cand.push([x, z, x + extentU, z + extentV])\n for (let k = 0; k < 6; k++) {\n const t = rng2()\n const side = Math.floor(rng2() * 4)\n const x = side < 2 ? p[0] + t * Math.max(0, p[2] - p[0] - extentU) : side === 2 ? p[0] : p[2] - extentU\n const z = side >= 2 ? p[1] + t * Math.max(0, p[3] - p[1] - extentV) : side === 0 ? p[1] : p[3] - extentV\n cand.push([x, z, x + extentU, z + extentV])\n }\n }\n for (const r of shuffle(cand, rng2)) {\n if (!insideUnion(r, inners)) continue\n if (zones.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j) && overlaps(r, z))) continue\n if (solidList.some((o) => overlaps(r, o))) continue\n if (opts.flat) {\n if (!(opts.without && opts.without(r))) return r\n continue\n }\n if (occupied.some((m) => !m.low && !m.flat && !m.on && !m.decor && m.clearance > 0 && overlaps(r, clearRect(m._r as Rect, [m.frontU, m.frontV], m.clearance)))) continue\n if (opts.without && opts.without(r)) continue\n if (!reachable(opts.railing || gridOf(room), solidList.concat([r]), 0.16)) continue\n return r\n }\n return null\n }\n const roomById = (id: string) => plan.rooms.find((c) => c.id === id) || plan.zones.find((c) => c.id === id)\n return {\n make,\n add,\n placeOnFloor,\n itemsOfRoom,\n solidsOfRoom,\n gridOf,\n extraSolids,\n roomById,\n setIgnored: (s) => {\n ignored = s\n for (const k of Object.keys(gridCache)) delete gridCache[k]\n },\n added,\n }\n}\n\n/** Ground cover per lot zone: one piece per zone part, plus overlays registered by content packs (decks around pools...). */\nfunction groundCover(plan: Plan, items: PlacedItem[], ctx: PlacementContext) {\n if (!plan.lot) return\n const polygonOf = (r: Rect) => [[r[0], r[1]], [r[2], r[1]], [r[2], r[3]], [r[0], r[3]]].map((p) => [r2(p[0]), r2(p[1])])\n const groundPiece = (z: Room, type: string, r: Rect, layer: number, i: number) => {\n const m = ctx.make(z, type, r, [0, 1], {\n id: z.id + '.ground' + (layer ? '_overlay' : '') + i,\n slot: 'ground' + (layer ? '_overlay' : '') + i,\n w: r2(r[2] - r[0]),\n d: r2(r[3] - r[1]),\n h: 0,\n polygon: polygonOf(r),\n layer,\n zone: z.id,\n outdoor: true,\n floor: -1,\n })\n return ctx.add(m)\n }\n for (const z of plan.zones) {\n z.parts.forEach((p, i) => groundPiece(z, z.ground as string, p, 0, i))\n let k = 0\n const clip = (r: Rect): Rect | undefined =>\n z.parts\n .map((p) => [Math.max(r[0], p[0]), Math.max(r[1], p[1]), Math.min(r[2], p[2]), Math.min(r[3], p[3])] as Rect)\n .filter((q) => q[2] - q[0] > 0.3 && q[3] - q[1] > 0.3)\n .sort((a, b) => areaOf(b) - areaOf(a))[0]\n for (const rule of GROUND_OVERLAYS) {\n const triggers = items.filter((m) => m.room === z.id && m.category === rule.category)\n if (rule.merge) {\n if (triggers.length && z.ground !== rule.unlessGround) {\n const u = triggers.reduce((a, m) => [Math.min(a[0], (m._r as Rect)[0]), Math.min(a[1], (m._r as Rect)[1]), Math.max(a[2], (m._r as Rect)[2]), Math.max(a[3], (m._r as Rect)[3])], [1e9, 1e9, -1e9, -1e9])\n const q = clip(inflate(u as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n } else {\n for (const m of triggers) {\n const q = clip(inflate(m._r as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n }\n }\n }\n}\n\n/** Runs the registered decor passes and the ground cover; returns the context for the state step. */\nexport function runPostProcess(plan: Plan, items: PlacedItem[], seed: number | string): PlacementContext {\n const ctx = createPlacementContext(plan, items)\n const rng = createRng(seed, STREAM.decor)\n for (const pass of PASSES) pass.run({ plan, items, seed, rng, ctx, kit: placementKit, catalog: CATALOG, profiles: DECOR_PROFILES })\n groundCover(plan, items, ctx)\n return ctx\n}\n","import type { FloorplanLocale } from './types'\n\ntype Namespace = keyof FloorplanLocale\n\nconst locales: Record<string, FloorplanLocale> = {}\n\n/** Registers (or extends) the strings of a language. Packs call this with their JSON files. */\nexport function registerLocale(code: string, table: FloorplanLocale): void {\n const cur = (locales[code] = locales[code] || {})\n for (const ns of Object.keys(table) as Namespace[]) cur[ns] = Object.assign(cur[ns] || {}, table[ns])\n}\n\nexport const listLocales = (): string[] => Object.keys(locales)\n\n/** Looks a key up in a namespace. Falls back to English, then to the key itself. `{n}`-style variables are replaced. */\nexport function translate(ns: Namespace, key: string, locale = 'en', vars?: Record<string, string | number>): string {\n const raw = locales[locale]?.[ns]?.[key] ?? locales.en?.[ns]?.[key] ?? key\n return vars ? raw.replace(/\\{(\\w+)\\}/g, (m, k) => (k in vars ? String(vars[k]) : m)) : raw\n}\n","import { r2 } from './geometry'\nimport type { FloorplanOptions, Json, Plan, TemplateDef, ZoneAdjustment, ZoneDef, ZoneViolation } from './types'\n\nconst ZONES: Record<string, ZoneDef> = {}\nconst PERMEABLE_GROUNDS = new Set<string>()\n\n/** Registers an urban zone (zoning rules). Returns the stored definition. */\nexport function defineZone(zone: ZoneDef): ZoneDef {\n if (!zone || !zone.id) throw new Error('defineZone: id is required')\n ZONES[zone.id] = zone\n return zone\n}\nexport const getZone = (id: string): ZoneDef | undefined => ZONES[id]\nexport const listZones = (): ZoneDef[] => Object.values(ZONES)\n\n/** Marks ground types (e.g. `lawn`, `dirt`) that count towards the permeable area of a lot. */\nexport function registerPermeableGround(...types: string[]): void {\n for (const t of types) PERMEABLE_GROUNDS.add(t)\n}\n\nexport function resolveZone(z: string | ZoneDef | undefined): ZoneDef | null {\n if (!z) return null\n if (typeof z === 'string') {\n const found = ZONES[z]\n if (!found) throw new Error('Unknown zone: ' + z)\n return found\n }\n return z\n}\n\nexport const floorsOfTemplate = (tpl: TemplateDef, op: FloorplanOptions): number => (tpl.floorsFn ? tpl.floorsFn(op) : tpl.floors || []).length\n\n/** Declared use of a template; templates without one are treated as `residential_single`. */\nexport const useOf = (tpl: TemplateDef): string => tpl.use || 'residential_single'\n\n/** Totals used by the checks: storeys, height, areas. Works on a generated result or an internal plan. */\nfunction measure(plan: Json) {\n const floors: { index: number; y0: number; ceiling: number }[] = plan.floors\n const top = floors.reduce((m, f) => Math.max(m, f.y0 + f.ceiling), 0)\n const number = plan.floorNumber != null ? plan.floorNumber : floors.length\n const rooms: { floor: number; parts: number[][] }[] = (plan.rooms || []).filter((r: Json) => r.floor >= 0)\n const area = (r: Json) => r.parts.reduce((s: number, p: number[]) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n const footprint = plan.w * plan.d\n const built = rooms.reduce((s, r) => s + area(r), 0)\n return { storeys: number, height: r2(top), footprint, built }\n}\n\n/**\n * Checks a generated lot against a zone and returns the violations (empty when compliant).\n * `lot` is `result.lot` (may be null for apartments), `plan` is the result of `generate`.\n */\nexport function checkLot(zoneIn: string | ZoneDef, lot: Json, plan: Json): ZoneViolation[] {\n const zone = resolveZone(zoneIn) as ZoneDef\n const out: ZoneViolation[] = []\n const m = measure(plan)\n const use = plan.use || 'residential_single'\n if (!zone.allowedUses.includes(use)) out.push({ rule: 'use', actual: use, limit: zone.allowedUses.join(',') })\n if (m.storeys > zone.maxFloors) out.push({ rule: 'floors', actual: m.storeys, limit: zone.maxFloors })\n if (m.height > zone.maxHeight + 1e-9) out.push({ rule: 'height', actual: m.height, limit: zone.maxHeight })\n if (!lot) return out\n const [u0, v0, u1, v1] = lot.rect as number[]\n const width = r2(u1 - u0)\n const depth = r2(v1 - v0)\n const area = width * depth\n const party: string[] = plan.partyWalls || []\n const sides = [party.includes('left') ? Infinity : lot.sideYard.left, party.includes('right') ? Infinity : lot.sideYard.right]\n const left = sides[0]\n const right = sides[1]\n if (lot.setback < zone.setbacks.front - 1e-9) out.push({ rule: 'setback_front', actual: lot.setback, limit: zone.setbacks.front })\n if (Math.min(left, right) < zone.setbacks.side - 1e-9) out.push({ rule: 'setback_side', actual: Math.min(left, right), limit: zone.setbacks.side })\n if (lot.backyard < zone.setbacks.back - 1e-9) out.push({ rule: 'setback_back', actual: lot.backyard, limit: zone.setbacks.back })\n if (area < zone.minLot - 1e-9) out.push({ rule: 'min_lot', actual: r2(area), limit: zone.minLot })\n if (width < zone.minFrontage - 1e-9) out.push({ rule: 'min_frontage', actual: width, limit: zone.minFrontage })\n const ground = m.footprint\n const coverage = ground / area\n if (coverage > zone.maxCoverage + 1e-9) out.push({ rule: 'coverage', actual: r2(coverage), limit: zone.maxCoverage })\n const far = m.built / area\n if (far > zone.maxFar + 1e-9) out.push({ rule: 'far', actual: r2(far), limit: zone.maxFar })\n let permeable = 0\n for (const z of lot.zones as Json[]) if (PERMEABLE_GROUNDS.has(z.ground)) for (const p of z.parts as number[][]) permeable += (p[2] - p[0]) * (p[3] - p[1])\n const permeability = permeable / area\n if (permeability < zone.permeableMin - 1e-9) out.push({ rule: 'permeable', actual: r2(permeability), limit: zone.permeableMin })\n return out\n}\n\n/** Clamps adjustable options (`floors`) to the zone before the plan is built. */\nexport function clampOptionsToZone(tpl: TemplateDef, op: FloorplanOptions, zone: ZoneDef, adjustments: ZoneAdjustment[]): FloorplanOptions {\n if (tpl.singleFloor) {\n // an apartment unit: the storey it sits on must exist in a building the zone allows\n const ceiling = (tpl.floors || tpl.floorsFn?.(op) || [])[0]?.ceiling ?? 2.8\n const current = op.floor || 3\n const limit = Math.max(1, Math.min(zone.maxFloors, Math.floor(zone.maxHeight / ceiling + 1e-9)))\n if (current <= limit) return op\n adjustments.push({ field: 'floor', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floor: limit })\n }\n if (!tpl.floorRange || !tpl.floorsFn) return op\n const current = floorsOfTemplate(tpl, op)\n const floors = tpl.floorsFn(op)\n const ceiling = floors.reduce((m, f) => Math.max(m, f.ceiling), 0) || 2.8\n const byHeight = Math.max(1, Math.floor(zone.maxHeight / ceiling + 1e-9))\n const limit = Math.max(tpl.floorRange[0], Math.min(zone.maxFloors, byHeight, tpl.floorRange[1]))\n if (current <= limit) return op\n adjustments.push({ field: 'floors', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floors: limit })\n}\n\n/** Raises lot setbacks to the zone minimums. */\nexport function clampLotToZone(cfg: Json, zone: ZoneDef, adjustments: ZoneAdjustment[], partyWalls: string[] = []): void {\n const raise = (field: string, key: string, min: number, reason: string) => {\n if (cfg[key] < min) {\n adjustments.push({ field, from: cfg[key], to: min, reason })\n cfg[key] = min\n }\n }\n raise('frontSetback', 'frontSetback', zone.setbacks.front, 'setback_front')\n if (!partyWalls.includes('left')) raise('marginLeft', 'marginLeft', zone.setbacks.side, 'setback_side')\n if (!partyWalls.includes('right')) raise('marginRight', 'marginRight', zone.setbacks.side, 'setback_side')\n raise('backyardDepth', 'backyardDepth', zone.setbacks.back, 'setback_back')\n}\n\nexport type { Plan }\n\n/** Lot zone types whose ground can be switched to a permeable one to meet the permeability rate. */\nconst ADJUSTABLE_ZONES = new Set(['garden', 'backyard', 'side_yard'])\n\n/**\n * Raises the permeable area of a lot to the zone's `permeableMin` by turning paved garden, yard\n * and side zones (largest first) into the first registered permeable ground. Reports each change.\n */\nexport function enforcePermeability(lot: Json, zones: Json[], zone: ZoneDef, adjustments: ZoneAdjustment[]): void {\n const target = [...PERMEABLE_GROUNDS][0]\n if (!target) return\n const [u0, v0, u1, v1] = lot.rect as number[]\n const area = (u1 - u0) * (v1 - v0)\n const areaOfZone = (z: Json) => (z.parts as number[][]).reduce((s, p) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n let permeable = zones.filter((z) => PERMEABLE_GROUNDS.has(z.ground)).reduce((s, z) => s + areaOfZone(z), 0)\n if (permeable / area >= zone.permeableMin) return\n const candidates = zones.filter((z) => ADJUSTABLE_ZONES.has(z.type) && !PERMEABLE_GROUNDS.has(z.ground)).sort((a, b) => areaOfZone(b) - areaOfZone(a))\n for (const z of candidates) {\n if (permeable / area >= zone.permeableMin) break\n adjustments.push({ field: 'ground:' + z.id, from: z.ground, to: target, reason: 'permeable_min' })\n z.ground = target\n permeable += areaOfZone(z)\n }\n}\n","import { MARGIN, TOL, WALL_THICKNESS } from './constants'\nimport { buildWalls, clamp, eq, exteriorEdge, inRect, normalizeRoom, openingDepth, openingZones, r2, sharedEdge } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { createRng, pickWeighted } from './rng'\nimport { STYLES, WALL_TOP_HEIGHTS, resolveStyleId, styleOf } from './registry'\nimport { clampLotToZone, enforcePermeability } from './zoning'\nimport type { FloorDef, FloorplanOptions, Json, LotConfig, Plan, Rect, Room, StyleDef, TemplateDef, ZoneAdjustment, ZoneDef } from './types'\n\nexport const floorsOf = (tpl: TemplateDef, op?: FloorplanOptions): FloorDef[] => (tpl.floorsFn ? tpl.floorsFn(op || {}) : (tpl.floors as FloorDef[]))\n\nexport function clampSize(tpl: TemplateDef, w: number | undefined, d: number | undefined, op?: FloorplanOptions) {\n const L = tpl.limitsFn ? tpl.limitsFn(op || {}) : tpl.limits\n const P0 = tpl.defaultsFn ? tpl.defaultsFn(op || {}) : tpl.defaults\n const ww = w == null ? P0.w : clamp(w, L.w[0], L.w[1])\n const dd = d == null ? P0.d : clamp(d, L.d[0], L.d[1])\n return { w: r2(ww), d: r2(dd) }\n}\n\nexport interface BuildContext {\n zone?: ZoneDef | null\n adjustments?: ZoneAdjustment[]\n}\n\nexport function buildPlan(tpl: TemplateDef, wIn: number | undefined, dIn: number | undefined, opIn?: FloorplanOptions, bc: BuildContext = {}): Plan {\n const op = opIn || {}\n const { w, d } = clampSize(tpl, wIn, dIn, op)\n const styleId = resolveStyleId(op.style || (typeof tpl.style === 'function' ? tpl.style(op) : tpl.style) || 'budget')\n const FLOOR_DEFS = floorsOf(tpl, op)\n const style = styleOf(styleId)\n const plan: Plan = { w, d, tpl, floorDefs: FLOOR_DEFS, style: styleId, floors: [], rooms: [], zones: [], doors: [], windows: [], walls: [], gates: [], paths: [], lot: null, openPairs: {} }\n FLOOR_DEFS.forEach((A, floorIndex) => {\n const floorNumber = tpl.singleFloor ? op.floor || 3 : floorIndex + 1\n plan.floors.push({\n index: floorIndex,\n name: tpl.singleFloor ? 'floor_n' : A.label,\n number: tpl.singleFloor ? floorNumber : undefined,\n y0: tpl.singleFloor ? (floorNumber - 1) * A.ceiling : floorIndex * A.ceiling,\n ceiling: A.ceiling,\n })\n plan.openPairs[floorIndex] = A.openPairs || []\n const list = A.rooms(w, d, op).map((c) => normalizeRoom(c, floorIndex))\n for (const c of list) {\n if (plan.rooms.some((x) => x.id === c.id)) throw new Error('Duplicate room: ' + c.id)\n plan.rooms.push(c)\n }\n const byId: Record<string, Room> = {}\n for (const c of list) byId[c.id] = c\n const floorDoors: Json[] = []\n ;(A.doors(w, d, op) || []).forEach((sp, i) => {\n const a = byId[sp.a]\n if (!a) throw new Error('Door references a missing room: ' + sp.a)\n let edge\n if (sp.b === 'outside') edge = exteriorEdge(a, sp.side as string, w, d, sp.at)\n else {\n const b = byId[sp.b]\n if (!b) throw new Error('Door references a missing room: ' + sp.b)\n edge = sharedEdge(a, b, sp.at)\n }\n if (!edge) throw new Error('Door without a wall: ' + sp.a + ' / ' + sp.b)\n const width = sp.width\n const margin = width / 2 + 0.12\n if (edge.a1 - edge.a0 < width + 0.24) throw new Error('Wall too short for the door: ' + sp.a + ' / ' + sp.b)\n const c = clamp(sp.at != null ? sp.at : (edge.a0 + edge.a1) / 2, edge.a0 + margin, edge.a1 - margin)\n const exterior = sp.b === 'outside'\n const leaf = exterior && sp.steel ? 0 : width > 1.1 ? width / 2 : width\n const u = edge.axis === 'u' ? c : edge.pos\n const v = edge.axis === 'u' ? edge.pos : c\n floorDoors.push({\n id: 'd' + floorIndex + '_' + i,\n floor: floorIndex,\n u: r2(u),\n v: r2(v),\n axis: edge.axis,\n pos: edge.pos,\n at: r2(c),\n width,\n a: sp.a,\n b: sp.b,\n opensTo: sp.opensTo || sp.a,\n exterior,\n side: sp.side || null,\n leaves: exterior && sp.steel ? 0 : width > 1.1 ? 2 : 1,\n model: sp.steel ? 'steel' : width > 1.1 ? 'double' : 'single',\n hinge: 'start',\n zones: openingZones(u, v, edge.axis, width, openingDepth(width, leaf)),\n })\n })\n plan.doors.push(...floorDoors)\n const windowsOut: Json[] = []\n ;(A.windows(w, d, op) || []).forEach((windowDef) => {\n const a = byId[windowDef.room]\n if (!a) throw new Error('Window references a missing room: ' + windowDef.room)\n const edge = exteriorEdge(a, windowDef.side, w, d, windowDef.at)\n if (!edge) return\n const width = windowDef.width\n const m0 = edge.a0 + width / 2 + 0.3\n const m1 = edge.a1 - width / 2 - 0.3\n if (m1 < m0 - TOL) return\n const centers = windowDef.n ? Array.from({ length: windowDef.n }, (_, i) => edge.a0 + ((edge.a1 - edge.a0) * (i + 1)) / (windowDef.n! + 1)) : [windowDef.at as number]\n for (const c0 of centers) {\n const c = clamp(c0, m0, m1)\n const u = edge.axis === 'u' ? c : edge.pos\n const v = edge.axis === 'u' ? edge.pos : c\n if (floorDoors.some((p) => p.axis === edge.axis && eq(p.pos, edge.pos) && Math.abs(p.at - c) < (p.width + width) / 2 + 0.15)) continue\n if (windowsOut.some((j) => j.axis === edge.axis && eq(j.pos, edge.pos) && Math.abs(j.at - c) < (j.width + width) / 2 + 0.2)) continue\n windowsOut.push({\n id: 'w' + floorIndex + '_' + windowsOut.length,\n floor: floorIndex,\n u: r2(u),\n v: r2(v),\n axis: edge.axis,\n pos: edge.pos,\n at: r2(c),\n width,\n y0: windowDef.y0 || 1.0,\n y1: windowDef.y1 || 2.15,\n room: windowDef.room,\n side: windowDef.side,\n })\n }\n })\n plan.windows.push(...windowsOut)\n plan.walls.push(...buildWalls(list, floorDoors, A.openPairs || [], floorIndex).map((p) => Object.assign(p, { h: p.h || A.ceiling })))\n })\n buildLot(plan, tpl, w, d, op, style, styleId, bc)\n return plan\n}\n\n/** Facade and lot: zones, gates, paths and perimeter. */\nfunction buildLot(plan: Plan, tpl: TemplateDef, w: number, d: number, op: FloorplanOptions, style: StyleDef, styleId: string, bc: BuildContext) {\n const seed = op.seed == null ? 1 : op.seed\n const rFacade = createRng(seed, STREAM.facade)\n const facadeStyle = style.facade\n const palette = style.swatches\n const color = palette[Math.floor(rFacade() * palette.length)]\n const extra = tpl.facade || {}\n plan.facade = {\n style: styleId,\n color: { name: color[0], hex: color[1] },\n finish: pickWeighted(rFacade, facadeStyle.finish),\n grilles: rFacade() < facadeStyle.grilles,\n roof: pickWeighted(rFacade, facadeStyle.roof),\n balcony: !!extra.balcony,\n veranda: !!extra.veranda,\n steelDoor: !!extra.steelDoor,\n floors: plan.floorDefs.length,\n }\n if (tpl.facadeExtra) tpl.facadeExtra(plan.facade, rFacade, w, d, op)\n if (plan.floorDefs.length > 1 && plan.facade.roof === 'fiber_cement') plan.facade.roof = 'colonial'\n if (!tpl.lot) return\n const cfg: LotConfig = tpl.lot(w, d, style, op)\n if (bc.zone) clampLotToZone(cfg, bc.zone, bc.adjustments || [], tpl.partyWalls)\n const rLot = createRng(seed, STREAM.lot)\n const setback = cfg.frontSetback\n const marginL = cfg.marginLeft\n const marginR = cfg.marginRight\n const backDepth = cfg.backyardDepth\n const lot: Json = {\n rect: [-marginL, -setback, w + marginR, d + backDepth],\n setback,\n sideYard: { left: marginL, right: marginR },\n backyard: backDepth,\n style: styleId,\n zones: [],\n perimeter: [],\n gates: [],\n paths: [],\n pool: !!cfg.pool,\n }\n const ZONES: Room[] = []\n const libs = Object.assign({ garden: 'garden', backyard: 'backyard', parking: 'parking', sideYard: 'side_yard' }, cfg.libraries || {})\n const addZone = (id: string, type: string, label: string, parts: Rect[], library?: string) =>\n ZONES.push(Object.assign(normalizeRoom({ id, type, label, rect: parts[0], parts: parts.slice(1), library, outdoor: true }, -1), { floor: -1, outdoor: true }))\n if (setback > 0) {\n let parts: Rect[] = [[-marginL, -setback, w + marginR, 0]]\n if (cfg.parking) {\n const garageU = (cfg.garage as Json).u\n const vw = cfg.parking.width\n const x0 = Math.max(-marginL, garageU - vw / 2)\n const x1 = Math.min(w + marginR, garageU + vw / 2)\n parts = []\n if (x0 + marginL > 0.8) parts.push([-marginL, -setback, x0, 0])\n if (w + marginR - x1 > 0.8) parts.push([x1, -setback, w + marginR, 0])\n addZone('parking', 'parking', 'parking', [[x0, -setback, x1, 0]], libs.parking)\n if (!parts.length) parts = [[x1, -setback, w + marginR, 0]]\n }\n parts.sort((a, b) => b[2] - b[0] - (a[2] - a[0]))\n addZone('garden', 'garden', 'garden', parts, libs.garden)\n }\n if (backDepth > 0 && cfg.yardZones) {\n for (const q of cfg.yardZones) addZone(q.id, q.type, q.label || q.id, [[-marginL, d + q.v0, w + marginR, d + Math.min(backDepth, q.v1)]], q.library)\n } else if (backDepth > 0) addZone('backyard', 'backyard', 'backyard', [[-marginL, d, w + marginR, d + backDepth]], libs.backyard)\n if (marginL > 0.5) addZone('side_left', 'side_yard', 'side_left', [[-marginL, 0, 0, d]], libs.sideYard)\n if (marginR > 0.5) addZone('side_right', 'side_yard', 'side_right', [[w, 0, w + marginR, d]], libs.sideYard)\n const gates: Json[] = []\n const addGate = (type: string, model: string, u: number, v: number, width: number, side: string, toTarget?: string | null) => {\n const g: Json = {\n id: 'g' + gates.length,\n type,\n model,\n u: r2(u),\n v: r2(v),\n axis: 'u',\n width,\n height: type === 'pedestrian' ? style.height : Math.min(style.height, 2.2),\n side,\n to: toTarget || null,\n material: 'iron',\n }\n g.zones = openingZones(u, v, 'u', width, openingDepth(width, type === 'pedestrian' ? width : 0))\n gates.push(g)\n return g\n }\n if (cfg.pedestrian && setback > 0) addGate('pedestrian', 'pedestrian', cfg.pedestrian.u, -setback, 1.0, 'front', 'door')\n if (cfg.garage && setback > 0) addGate('garage', pickWeighted(rLot, style.gate.garage), cfg.garage.u, -setback, cfg.garage.width, 'front', cfg.garage.to)\n if (cfg.cargo) addGate('cargo', 'sliding', cfg.cargo.u, d + backDepth, cfg.cargo.width, 'back', 'stockroom')\n plan.gates = gates\n lot.gates = gates\n const paths: Json[] = []\n const target = (a: string, side: string) => plan.doors.find((p) => p.exterior && p.a === a && p.side === side)\n for (const g of gates) {\n if (g.type === 'pedestrian' && cfg.doorTarget) {\n const pt = target(cfg.doorTarget.a, cfg.doorTarget.side)\n if (!pt) continue\n const gateU = g.u\n const dx = pt.u\n const ym = -setback / 2\n const L = 1.0\n const h = L / 2\n const rs: Rect[] = []\n if (Math.abs(gateU - dx) < 0.05) rs.push([dx - h, -setback, dx + h, 0])\n else {\n rs.push([gateU - h, -setback, gateU + h, ym + h])\n rs.push([Math.min(gateU, dx) - h, ym - h, Math.max(gateU, dx) + h, ym + h])\n rs.push([dx - h, ym - h, dx + h, 0])\n }\n paths.push({ id: 'pedestrian_path', type: 'pedestrian', from: g.id, to: pt.id, width: L, rects: rs.map((r) => r.map(r2)), points: [[gateU, -setback], [gateU, ym], [dx, ym], [dx, 0]] })\n } else if (g.type === 'garage' && g.to === 'inner_garage') {\n const pt = plan.doors.find((p) => p.exterior && p.side === 'front' && Math.abs(p.u - g.u) < 0.6 && p.width >= 2.5)\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'garage_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, -setback, g.u + hw, 0].map(r2)], points: [[g.u, -setback], [g.u, 0]] })\n } else if (g.type === 'cargo') {\n const pt = target('stockroom', 'back')\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'cargo_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, d, g.u + hw, d + backDepth].map(r2)], points: [[g.u, d + backDepth], [g.u, d]] })\n }\n }\n plan.paths = paths\n lot.paths = paths\n const boundary = (rule: { type: Record<string, number>; top: Record<string, number> }) => {\n const type = pickWeighted(rLot, rule.type)\n const top = type === 'railing' ? 'none' : pickWeighted(rLot, rule.top)\n const wallHeight = type === 'railing' ? 1.2 : type === 'fence' ? 2.0 : style.height\n return { type, material: type === 'wall' ? 'block' : type === 'fence' ? 'wire_mesh' : 'iron', height: wallHeight, top, totalHeight: r2(wallHeight + WALL_TOP_HEIGHTS[top]), thickness: WALL_THICKNESS }\n }\n const A: Record<string, Json> = { front: boundary(style.front), left: boundary(style.sideYard), right: boundary(style.sideYard), back: boundary(style.back) }\n const seg = (side: string, u0: number, v0: number, u1: number, v1: number) => {\n if (Math.abs(u1 - u0) + Math.abs(v1 - v0) < 0.05) return\n lot.perimeter.push(Object.assign({ id: 'm' + lot.perimeter.length, side, u0: r2(u0), v0: r2(v0), u1: r2(u1), v1: r2(v1) }, A[side]))\n }\n const cutRun = (side: string, de: number, to: number, vfix: number, gs: Json[]) => {\n let pieces: [number, number][] = [[de, to]]\n for (const g of gs) {\n const g0 = g.u - g.width / 2\n const g1 = g.u + g.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (g1 <= x || g0 >= y) {\n n.push([x, y])\n continue\n }\n if (g0 > x) n.push([x, g0])\n if (g1 < y) n.push([g1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) seg(side, x, vfix, y, vfix)\n }\n if (setback > 0)\n cutRun('front', -marginL, w + marginR, -setback, gates.filter((g) => g.side === 'front'))\n cutRun('back', -marginL, w + marginR, d + backDepth, gates.filter((g) => g.side === 'back'))\n const vi = setback > 0 ? -setback : 0\n if (marginL > 0.5) seg('left', -marginL, vi, -marginL, d + backDepth)\n else if (backDepth > 0) seg('left', 0, d, 0, d + backDepth)\n if (marginR > 0.5) seg('right', w + marginR, vi, w + marginR, d + backDepth)\n else if (backDepth > 0) seg('right', w, d, w, d + backDepth)\n for (const z of ZONES) z.ground = (cfg.grounds || {})[z.id] || (cfg.grounds || {})[z.type] || pickWeighted(rLot, style.grounds[z.type] || { concrete: 1 })\n if (bc.zone) enforcePermeability(lot, ZONES, bc.zone, bc.adjustments || [])\n plan.zones = ZONES\n lot.zones = ZONES\n plan.lot = lot\n}\n\nexport { inRect, MARGIN, STYLES }\n","import { clamp } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { PALETTE_STYLES, ROOM_COLORS, STATE_PLUGINS, resolveStyleId } from './registry'\nimport { createRng } from './rng'\nimport type { Rng } from './rng'\nimport type { Hsl } from './types'\n\nexport const HIGH_SATURATION = 0.4\nexport const MIN_WALL_FLOOR_CONTRAST = 20\nexport const MIN_FABRIC_FLOOR_CONTRAST = 15\n\nconst SCHEMES = ['analogous', 'complementary', 'split_complementary', 'triad'] as const\nconst HARMONY_OFFSETS: Record<string, [number, number]> = { analogous: [-30, 30], complementary: [180, 165], split_complementary: [150, 210], triad: [120, 240] }\n\n/** Roles the contrast rules rely on. A palette recipe must produce them. */\nexport const ROLE_FABRIC_MAIN = 'fabric_main'\nexport const ROLE_FABRIC_ACCENT = 'fabric_accent'\nexport const ROLE_FLOOR_REFERENCE = 'floor_living'\n\n/** Tools handed to a style recipe. `jit` and `rng` draw from the style's seeded stream: draw order is part of the contract. */\nexport interface PaletteDraw {\n rng: Rng\n base: [string, number, number, number]\n H0: number\n H1: number\n H2: number\n jit(v: number, a: number): number\n hsl(h: number, s: number, l: number): Hsl\n}\nexport interface PaletteEarly {\n /** Accent mode: true saturates walls, false puts accents on objects. */\n wallMode: boolean\n /** Maximum wall saturation. */\n sMax: number\n /** Facade, wall, gate, roof, ceiling... in insertion order. */\n roles: Record<string, Hsl>\n /** General floor `[h, s, l]` for room types that do not define their own. */\n generalFloor: [number, number, number]\n}\nexport interface PaletteStyleDef {\n /** Legacy stream suffix; defaults to the style id. */\n seedKey?: string\n /** Facade colour table `[labelKey, h, s, l]`. */\n facadeColors: [string, number, number, number][]\n /** Draws up to the room colours (before the room loop). */\n early(d: PaletteDraw): PaletteEarly\n /** Draws the object roles (wood, fabrics, metal, ground colours) after the room loop. */\n late(d: PaletteDraw, e: PaletteEarly): Record<string, Hsl>\n}\n\nexport interface PaletteContext extends PaletteDraw {\n style: string\n sMax: number\n wallMode: boolean\n generalFloor: [number, number, number]\n}\n\nexport const hslToInt = (h: number, s: number, l: number): number => {\n h = ((h % 360) + 360) % 360\n s = clamp(s, 0, 1)\n l = clamp(l, 0, 1)\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1))\n }\n return (Math.round(f(0) * 255) << 16) | (Math.round(f(8) * 255) << 8) | Math.round(f(4) * 255)\n}\nexport const intToHsl = (n: number): Hsl => {\n const r = ((n >> 16) & 255) / 255\n const g = ((n >> 8) & 255) / 255\n const b = (n & 255) / 255\n const mx = Math.max(r, g, b)\n const mn = Math.min(r, g, b)\n const l = (mx + mn) / 2\n const d = mx - mn\n let h = 0\n let s = 0\n if (d > 1e-9) {\n s = d / (1 - Math.abs(2 * l - 1))\n h = mx === r ? (g - b) / d + (g < b ? 6 : 0) : mx === g ? (b - r) / d + 2 : (r - g) / d + 4\n h *= 60\n }\n return { h, s, l }\n}\n/** CIE L* lightness of a packed RGB colour. */\nexport const lstar = (n: number): number => {\n const linear = (c: number) => ((c /= 255) <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4))\n const Y = 0.2126 * linear((n >> 16) & 255) + 0.7152 * linear((n >> 8) & 255) + 0.0722 * linear(n & 255)\n return Y > 216 / 24389 ? 116 * Math.cbrt(Y) - 16 : (Y * 24389) / 27\n}\nexport const hexString = (n: number): string => '#' + (n >>> 0).toString(16).padStart(6, '0')\n\nexport interface PaletteOptions {\n seed?: number | string\n style?: string\n state?: string\n}\nexport type Palette = { meta: { seed: number | string; style: string; state: string; scheme: string; base: string; accentMode: 'wall' | 'object' } } & Record<string, number | object>\n\n/** Seeded colour-harmony palette: a facade base colour, a harmony scheme, role colours and contrast rules. */\nexport function palette(o?: PaletteOptions): Palette {\n const opt = o || {}\n let style = resolveStyleId(opt.style || 'budget')\n if (!PALETTE_STYLES[style]) style = PALETTE_STYLES.mid ? 'mid' : Object.keys(PALETTE_STYLES)[0]\n const def = PALETTE_STYLES[style]\n const state = opt.state || 'normal'\n const seed = opt.seed == null ? 1 : opt.seed\n const rng = createRng(seed, STREAM.palettePrefix + (def.seedKey ?? style))\n const table = def.facadeColors\n const base = table[Math.floor(rng() * table.length)]\n const scheme = SCHEMES[Math.floor(rng() * 4)]\n const offsets = HARMONY_OFFSETS[scheme]\n const jit = (v: number, a: number) => v + (rng() - 0.5) * a\n const hsl = (h: number, s: number, l: number): Hsl => ({ h: ((h % 360) + 360) % 360, s: clamp(s, 0, 1), l: clamp(l, 0, 1) })\n const H0 = base[1]\n const H1 = H0 + offsets[0]\n const H2 = H0 + offsets[1]\n const draw: PaletteDraw = { rng, base, H0, H1, H2, jit, hsl }\n const early = def.early(draw)\n const { wallMode, sMax } = early\n const R: Record<string, Hsl> = Object.assign({}, early.roles)\n const ctx: PaletteContext = Object.assign({ style, sMax, wallMode, generalFloor: early.generalFloor }, draw)\n for (const c of ROOM_COLORS) {\n const [wh, wl] = c.wall(ctx)\n R['wall_' + c.type] = hsl(wh, c.neutral ? Math.min(0.16, sMax) : clamp(jit(sMax * 0.75, sMax * 0.5), 0.03, sMax), jit(wl, 0.03))\n const pi = c.floor || early.generalFloor\n R['floor_' + c.type] = hsl(pi[0], Math.min(pi[1], wallMode ? 0.18 : 0.3), jit(pi[2], 0.04))\n }\n Object.assign(R, def.late(draw, early))\n // state hook (e.g. dirt: desaturate and darken)\n STATE_PLUGINS[state]?.adjustPalette?.(R)\n // anti-clash rules: floor never saturated if the wall is; minimum lightness separation\n const adjust = (color: Hsl, ref: Hsl, min: number, preferredDir?: number) => {\n for (let i = 0; i < 60; i++) {\n if (Math.abs(lstar(hslToInt(color.h, color.s, color.l)) - lstar(hslToInt(ref.h, ref.s, ref.l))) >= min) return\n const refL = lstar(hslToInt(ref.h, ref.s, ref.l))\n let dir = preferredDir || (refL > 50 ? -1 : 1)\n if ((dir < 0 && color.l <= 0.06) || (dir > 0 && color.l >= 0.94)) dir = -dir\n color.l = clamp(color.l + dir * 0.015, 0.04, 0.96)\n }\n }\n const types = ROOM_COLORS.map((c) => c.type)\n for (const c of types) {\n const w = R['wall_' + c]\n const p = R['floor_' + c]\n if (w.s > 0.3) p.s = Math.min(p.s, 0.2)\n if (p.s > HIGH_SATURATION) p.s = HIGH_SATURATION - 0.05\n adjust(p, w, MIN_WALL_FLOOR_CONTRAST + 2, lstar(hslToInt(w.h, w.s, w.l)) > 50 ? -1 : 1)\n }\n const floorRef = R[ROLE_FLOOR_REFERENCE] || R['floor_' + types[0]]\n const fabric = R[ROLE_FABRIC_MAIN]\n adjust(fabric, floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n adjust(R[ROLE_FABRIC_ACCENT], floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n for (const c of types) {\n const p = R['floor_' + c]\n if (Math.abs(lstar(hslToInt(fabric.h, fabric.s, fabric.l)) - lstar(hslToInt(p.h, p.s, p.l))) < MIN_FABRIC_FLOOR_CONTRAST)\n adjust(p, fabric, MIN_FABRIC_FLOOR_CONTRAST + 2, lstar(hslToInt(fabric.h, fabric.s, fabric.l)) > 50 ? -1 : 1)\n }\n const out: Record<string, unknown> = { meta: { seed, style, state, scheme, base: base[0], accentMode: wallMode ? 'wall' : 'object' } }\n for (const k of Object.keys(R)) out[k] = hslToInt(R[k].h, R[k].s, R[k].l)\n // final contrast after rounding: fabric against every floor; search lightness for floor (then wall) satisfying both rules\n const num = (k: string) => out[k] as number\n const pairOk = (w: number, p: number) => Math.abs(lstar(w) - lstar(p)) >= MIN_WALL_FLOOR_CONTRAST + 1 && Math.abs(lstar(num(ROLE_FABRIC_MAIN)) - lstar(p)) >= MIN_FABRIC_FLOOR_CONTRAST + 1\n const search = (color: number, ok: (n: number) => boolean) => {\n const h = intToHsl(color)\n let bestValue: number | null = null\n let md = 9\n for (let l = 0.02; l <= 0.98; l += 0.005) {\n const n = hslToInt(h.h, h.s, l)\n if (ok(n) && Math.abs(l - h.l) < md) {\n md = Math.abs(l - h.l)\n bestValue = n\n }\n }\n return bestValue\n }\n for (const c of types) {\n if (pairOk(num('wall_' + c), num('floor_' + c))) continue\n const n = search(num('floor_' + c), (p) => pairOk(num('wall_' + c), p))\n if (n != null) {\n out['floor_' + c] = n\n continue\n }\n // no solution with the floor alone: move the wall\n const w = search(num('wall_' + c), (w2) => pairOk(w2, num('floor_' + c)))\n if (w != null) out['wall_' + c] = w\n }\n return out as Palette\n}\n","import { EPS, MARGIN, TOL } from './constants'\nimport { cardinal, clamp, eq, extent, inner, overlaps, r2 } from './geometry'\nimport { LIBRARIES, LIBRARY_ALIAS } from './registry'\nimport { isOpenSide, openingsOfFloor, windowsOfRoom, zonesOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room, Slot, SlotDef, Vec2 } from './types'\n\nconst SIDE_NORMAL: Record<string, Vec2> = { left: [1, 0], right: [-1, 0], front: [0, 1], back: [0, -1] }\nconst FIXED_FACING: Record<string, Vec2> = { 'u+': [1, 0], 'u-': [-1, 0], 'v+': [0, 1], 'v-': [0, -1] }\nconst SIDE_OPPOSITE: Record<string, string> = { front: 'back', back: 'front', left: 'right', right: 'left' }\nconst WINDOW_SIDE: Record<string, string> = { front: 'front', back: 'back', left: 'left', right: 'right' }\n\n/** Slot definitions of a room after `without`, `overrides`, `extras` and `any`/window expansion. */\nexport function slotDefsOf(plan: Plan, room: Room): SlotDef[] {\n const name = room.library || room.type\n const key = LIBRARY_ALIAS[name] || name\n const library = room.slots ? room.slots : LIBRARIES[key]\n if (!library) return []\n const R = inner(room.parts[0])\n let defs = typeof library === 'function' ? library({ w: R[2] - R[0], d: R[3] - R[1] }) : library.slice()\n defs = defs.map((x) => Object.assign({}, x))\n for (const id of room.without || []) defs = defs.filter((x) => x.id !== id)\n for (const [id, aj] of Object.entries(room.overrides || {})) {\n const i = defs.findIndex((x) => x.id === id)\n if (i < 0) continue\n if (aj === null) defs.splice(i, 1)\n else defs[i] = Object.assign(defs[i], aj)\n }\n defs.push(...(room.extras || []).map((x) => Object.assign({}, x)))\n const out: SlotDef[] = []\n for (const def of defs) {\n def.parent = def.on\n if (def.anchor === 'wall' && def.side === 'any') for (const l of ['left', 'right', 'front', 'back']) out.push(Object.assign({}, def, { id: def.id + '@' + l, side: l as SlotDef['side'], group: def.group || def.id }))\n else if (def.anchor === 'corner' && def.corner === 'any') for (const l of ['front-left', 'front-right', 'back-left', 'back-right']) out.push(Object.assign({}, def, { id: def.id + '@' + l, corner: l, group: def.group || def.id }))\n else if (def.anchor === 'window' && def.n == null) {\n const windowList = windowsOfRoom(plan, room)\n windowList.forEach((_j, i) => out.push(Object.assign({}, def, { id: def.id + '@w' + i, n: i, group: def.group || def.id })))\n } else out.push(def)\n }\n return out\n}\n\nexport function resolveSlots(plan: Plan): Slot[] {\n const all: Slot[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const defs = slotDefsOf(plan, room)\n const byId: Record<string, Slot> = {}\n // stairs: a door on any storey applies\n const zones = room.type === 'stairs' ? plan.floors.flatMap((_, floorIndex) => zonesOfFloor(plan, floorIndex)) : zonesOfFloor(plan, room.floor)\n for (const def of defs) {\n const s = resolveSlot(plan, room, def, byId, zones)\n byId[def.id] = s\n all.push(s)\n }\n }\n return all\n}\n\nexport function resolveSlot(plan: Plan, room: Room, def: SlotDef, byId: Record<string, Slot>, zones: Rect[]): Slot {\n const base: Json = {\n id: def.id,\n room: room.id,\n floor: room.floor,\n outdoor: room.outdoor,\n anchor: def.anchor,\n side: def.side || def.corner || null,\n cats: def.cats,\n slide: def.slide,\n required: !!def.required,\n chance: def.required ? 1 : def.chance == null ? 1 : def.chance,\n clearance: def.clearance == null ? 0.5 : def.clearance,\n front: def.facing || 'center',\n group: def.group || null,\n requires: def.requires || null,\n on: def.parent || null,\n target: def.target || null,\n valid: true,\n reason: null,\n }\n const invalid = (m: string): Slot => Object.assign(base, { valid: false, reason: m, x: 0, z: 0, ry: 0, w: 0, d: 0, frontU: 0, frontV: 1, aabb: [0, 0, 0, 0], _cell: null }) as Slot\n if (def.anchor === 'on' || def.anchor === 'inside') {\n const parent = byId[def.parent]\n if (!parent || !parent.valid) return invalid('invalid_parent')\n return Object.assign(base, { x: parent.x, z: parent.z, ry: parent.ry, w: parent.w, d: parent.d, frontU: parent.frontU, frontV: parent.frontV, aabb: parent.aabb, _cell: parent._cell }) as Slot\n }\n const size = def.size as Vec2\n const roomCenter = ((): Vec2 => {\n const R0 = inner(room.parts[0])\n return [(R0[0] + R0[2]) / 2, (R0[1] + R0[3]) / 2]\n })()\n const openings = openingsOfFloor(plan, room.floor)\n let point: Vec2 = [0, 0]\n const targetPoint = (rule: string): Vec2 => {\n if (rule === 'door') {\n let best: Json = null\n let bestDist = 1e9\n for (const ab of openings) {\n const dist = Math.hypot(ab.u - point[0], ab.v - point[1])\n if (dist < bestDist) {\n bestDist = dist\n best = ab\n }\n }\n return best ? [best.u, best.v] : roomCenter\n }\n if (rule === 'target') {\n const t = byId[def.target as string]\n return t && t.valid ? [t.x, t.z] : roomCenter\n }\n return roomCenter\n }\n const free = (rect: Rect) => !zones.some((z) => overlaps(rect, z, room.type === 'stairs' ? -0.011 : EPS))\n const rule: string = def.facing || 'center'\n let R = inner(room.parts[Math.min(def.part || 0, room.parts.length - 1)])\n if (def.anchor === 'wall' || def.anchor === 'window') {\n let side = def.side as string\n let a: number | null = null\n let win: Json = null\n if (def.anchor === 'window') {\n const windowList = windowsOfRoom(plan, room)\n win = windowList[def.n as number]\n if (!win) return invalid('no_window')\n side = room.outdoor ? SIDE_OPPOSITE[win.side] : WINDOW_SIDE[win.side]\n const cand = room.parts\n .map(inner)\n .find(\n (r) =>\n (win.axis === 'u' ? win.u >= r[0] - TOL && win.u <= r[2] + TOL : win.v >= r[1] - TOL && win.v <= r[3] + TOL) &&\n ((side === 'left' && eq(r[0], win.pos + MARGIN)) || (side === 'right' && eq(r[2], win.pos - MARGIN)) || (side === 'front' && eq(r[1], win.pos + MARGIN)) || (side === 'back' && eq(r[3], win.pos - MARGIN))),\n )\n if (!cand) return invalid('window_outside_room')\n R = cand\n a = win.axis === 'u' ? win.u : win.v\n }\n const n = SIDE_NORMAL[side]\n if (!n) return invalid('invalid_side')\n const horizontal = side === 'front' || side === 'back'\n const a0 = horizontal ? R[0] : R[1]\n const a1 = horizontal ? R[2] : R[3]\n const len = a1 - a0\n const depth = size[1]\n if (depth > (horizontal ? R[3] - R[1] : R[2] - R[0]) + EPS) return invalid('larger_than_room')\n const hw = Math.min(size[0], len) / 2\n const cell = (ac: number): Rect =>\n side === 'left' ? [R[0], ac - hw, R[0] + depth, ac + hw] : side === 'right' ? [R[2] - depth, ac - hw, R[2], ac + hw] : side === 'front' ? [ac - hw, R[1], ac + hw, R[1] + depth] : [ac - hw, R[3] - depth, ac + hw, R[3]]\n const nominal = a != null ? a : a0 + hw + (def.pos == null ? 0.5 : def.pos) * Math.max(0, len - 2 * hw) + (def.shift || 0)\n const wp = side === 'left' ? R[0] - MARGIN : side === 'right' ? R[2] + MARGIN : side === 'front' ? R[1] - MARGIN : R[3] + MARGIN\n const pa = clamp(nominal, a0 + hw, a1 - hw)\n let found: number | null = null\n const steps = [0]\n if (def.anchor !== 'window') for (let k = 1; k <= 60; k++) steps.push(k, -k)\n for (const k of steps) {\n const ac = pa + k * 0.05\n if (ac - hw < a0 - EPS || ac + hw > a1 + EPS) continue\n if (free(cell(ac))) {\n found = ac\n break\n }\n }\n if (found == null) return invalid('blocked_by_door')\n const sp: Vec2 = horizontal ? [found, wp - n[1] * 0.1] : [wp - n[0] * 0.1, found]\n if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n const rect = cell(found)\n return Object.assign(base, { side, x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: n[0], frontV: n[1], ry: r2(Math.atan2(n[0], n[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f: n, enclosed: [side], R, size } }) as Slot\n }\n if (def.anchor === 'corner') {\n const [cornerV, cornerU] = (def.corner as string).split('-')\n const normalV = SIDE_NORMAL[cornerV]\n const normalU = SIDE_NORMAL[cornerU]\n if (!normalV || !normalU) return invalid('invalid_corner')\n const kx = cornerU === 'left' ? R[0] : R[2]\n const kz = cornerV === 'front' ? R[1] : R[3]\n point = [kx, kz]\n let f: Vec2\n if (FIXED_FACING[rule]) {\n f = FIXED_FACING[rule]\n if (!((f[0] === normalU[0] && f[1] === normalU[1]) || (f[0] === normalV[0] && f[1] === normalV[1]))) f = normalU\n } else {\n const t = targetPoint(rule)\n f = Math.abs(t[0] - kx) >= Math.abs(t[1] - kz) ? normalU : normalV\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n const rect: Rect = [cornerU === 'left' ? R[0] : R[2] - extentU, cornerV === 'front' ? R[1] : R[3] - extentV, cornerU === 'left' ? R[0] + extentU : R[2], cornerV === 'front' ? R[1] + extentV : R[3]]\n if (!free(rect)) return invalid('blocked_by_door')\n for (const sp of [[kx - normalU[0] * (MARGIN + 0.1), (rect[1] + rect[3]) / 2], [(rect[0] + rect[2]) / 2, kz - normalV[1] * (MARGIN + 0.1)]]) if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n return Object.assign(base, { x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [cornerU, cornerV], R, size } }) as Slot\n }\n if (def.anchor === 'center') {\n let cx = R[0] + (def.fx == null ? 0.5 : def.fx) * (R[2] - R[0]) + (def.dx || 0)\n let cz = R[1] + (def.fz == null ? 0.5 : def.fz) * (R[3] - R[1]) + (def.dz || 0)\n point = [cx, cz]\n let f: Vec2\n if (FIXED_FACING[rule]) f = FIXED_FACING[rule]\n else {\n const t = targetPoint(rule)\n const dx = t[0] - cx\n const dz = t[1] - cz\n f = Math.hypot(dx, dz) < 0.05 ? [0, 1] : cardinal(dx, dz)\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n cx = clamp(cx, R[0] + extentU / 2, R[2] - extentU / 2)\n cz = clamp(cz, R[1] + extentV / 2, R[3] - extentV / 2)\n const rect: Rect = [cx - extentU / 2, cz - extentV / 2, cx + extentU / 2, cz + extentV / 2]\n if (!free(rect)) return invalid('blocked_by_door')\n return Object.assign(base, { x: r2(cx), z: r2(cz), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [], R, size } }) as Slot\n }\n return invalid('unknown_anchor')\n}\n","import { DOOR_CLEARANCE } from './constants'\nimport { createPlacementContext, placementKit, runPostProcess } from './context'\nimport { fillRoom } from './fill'\nimport { overlaps, openingZones, r2 } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { translate } from './locale'\nimport { buildPlan, floorsOf } from './plan'\nimport { hexString, palette } from './palette'\nimport { CATALOG, DECOR_PROFILES, SEED_KEYS, STATE_PLUGINS, TEMPLATES, WALL_TOP_HEIGHTS, stateDistribution } from './registry'\nimport { createRng, hashString } from './rng'\nimport { resolveSlots } from './slots'\nimport { checkLot, clampOptionsToZone, resolveZone, useOf } from './zoning'\nimport type { FloorplanOptions, ItemColor, Json, PlacedItem, Plan, Slot, TemplateDef, ZoneAdjustment } from './types'\nimport type { StateContext } from './types'\n\nexport function templateOf(t: string | TemplateDef): TemplateDef {\n if (typeof t === 'string') {\n if (!TEMPLATES[t]) throw new Error('Unknown template: ' + t)\n return TEMPLATES[t]\n }\n return t\n}\n\nconst cleanSlot = (s: Slot) => {\n const o: Json = {}\n for (const k of Object.keys(s)) if (k[0] !== '_') o[k] = s[k]\n o.cats = Object.keys(s.cats || {})\n return o\n}\n\n/** Recorded slots (resolved positions) of every storey and of the lot. */\nexport function slots(template: string | TemplateDef, options?: FloorplanOptions): Json[] {\n const tpl = templateOf(template)\n const o = options || {}\n const plan = buildPlan(tpl, o.w, o.d, o)\n const locale = o.locale || 'en'\n return resolveSlots(plan)\n .map(cleanSlot)\n .map((s) => (s.reason ? Object.assign(s, { reason: translate('reasons', s.reason, locale) }) : s))\n}\n\n/** Picks the house state: the requested one, else a seeded draw over the registered distribution, else `normal`. */\nexport function pickState(requested: string | undefined, seed: number | string): string {\n if (requested && STATE_PLUGINS[requested]) return requested\n const dist = stateDistribution.weights\n if (!dist) return 'normal'\n const x = createRng(seed, stateDistribution.seedKey)()\n let acc = 0\n const keys = Object.keys(dist)\n for (const k of keys) {\n acc += dist[k]\n if (x < acc) return k\n }\n return keys[keys.length - 1]\n}\n\nfunction colorOf(m: Json, seed: number | string): number | string {\n const spec: ItemColor = m.colorSpec || CATALOG[m.type]?.color || { role: 'wood' }\n if ('role' in spec) return spec.role\n if ('hex' in spec) return spec.hex\n return spec.pick[hashString(seed + '|' + (m._seedId ?? m.id)) % spec.pick.length]\n}\n\nfunction applyState(plan: Plan, items: PlacedItem[], ctx: ReturnType<typeof createPlacementContext>, seed: number | string, state: string): PlacedItem[] {\n const plugin = STATE_PLUGINS[state]\n if (!plugin || state === 'normal') return []\n const c: StateContext = {\n plan,\n items,\n seed,\n state,\n rng: createRng(seed, plugin.seedKey ?? 'state:' + state),\n ctx,\n kit: placementKit,\n catalog: CATALOG,\n wallTopHeights: WALL_TOP_HEIGHTS,\n }\n return plugin.apply(c)\n}\n\nconst loc = (key: string | undefined, locale: string, ns: 'labels' | 'facadeColors' = 'labels', vars?: Record<string, string | number>) => (key ? translate(ns, key, locale, vars) : key)\n\n/** Generates a plan: building, lot, seeded item fill, decor, house state and palette. */\nexport function generate(template: string | TemplateDef, options?: FloorplanOptions): Json {\n const tpl = templateOf(template)\n const o = options || {}\n const seed = o.seed == null ? 1 : o.seed\n const locale = o.locale || 'en'\n let op: FloorplanOptions = Object.assign({}, o, { seed })\n const zone = resolveZone(o.zone)\n const adjustments: ZoneAdjustment[] = []\n if (zone) op = clampOptionsToZone(tpl, op, zone, adjustments)\n const plan = buildPlan(tpl, op.w, op.d, op, { zone, adjustments })\n const all = resolveSlots(plan)\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const sl = all.filter((s) => s.room === room.id && s.floor === room.floor)\n const r = fillRoom(plan, room, sl, createRng(seed, STREAM.roomPrefix + (room.seedKey ?? SEED_KEYS.rooms[room.id] ?? room.id)))\n items.push(...r.items)\n missing.push(...r.missing)\n }\n const ctx = runPostProcess(plan, items, seed)\n const state = pickState(o.state, seed)\n const stateItemsAll = applyState(plan, items, ctx, seed, state)\n const colors = palette({ seed, style: plan.style, state })\n const strip = (m: Json) => {\n const x: Json = {}\n for (const k of Object.keys(m)) if (k[0] !== '_' && k !== 'colorSpec') x[k] = m[k]\n return x\n }\n const L = plan.lot\n const lot = L\n ? {\n rect: L.rect.map(r2),\n setback: r2(L.setback),\n backyard: r2(L.backyard),\n sideYard: L.sideYard,\n style: L.style,\n pool: L.pool,\n zones: plan.zones.map((z) => ({ id: z.id, type: z.type, label: z.label, name: loc(z.label, locale), parts: z.parts, ground: z.ground })),\n perimeter: L.perimeter.map((s: Json) => Object.assign({ color: 'wall' }, s)),\n gates: plan.gates.map((g) => ({ id: g.id, type: g.type, model: g.model, u: g.u, v: g.v, axis: g.axis, width: g.width, height: g.height, side: g.side, to: g.to, material: g.material, open: !!g.open, color: 'gate' })),\n paths: plan.paths.map((c) => ({ id: c.id, type: c.type, from: c.from, to: c.to, width: c.width, rects: c.rects, points: c.points })),\n }\n : null\n const facade = Object.assign({}, plan.facade, {\n color: { name: loc(colors.meta.base, locale, 'facadeColors'), key: colors.meta.base, hex: hexString(colors.facade as number) },\n roles: { facade: 'facade', detail: 'facade_detail', roof: 'roof', wall: 'wall', gate: 'gate' },\n })\n const itemsOut = items.map((m) => {\n const out = strip(m)\n out.color = colorOf(m, seed)\n return out\n })\n const stateItemsOut = stateItemsAll.map((m) => {\n const out = strip(m)\n if (m.category) out.color = colorOf(m, seed)\n return out\n })\n const result: Json = {\n template: tpl.id,\n name: translate('templates', tpl.id, locale),\n use: useOf(tpl),\n seed,\n style: plan.style,\n state,\n w: plan.w,\n d: plan.d,\n floors: plan.floors.map((f) => ({ index: f.index, label: f.name, name: f.number != null ? translate('labels', 'floor_n', locale, { n: f.number }) : loc(f.name, locale), number: f.number, y0: f.y0, ceiling: f.ceiling })),\n rooms: plan.rooms.map((c) => ({\n id: c.id,\n type: c.type,\n label: c.label,\n name: loc(c.label, locale),\n floor: c.floor,\n u0: c.parts[0][0],\n v0: c.parts[0][1],\n u1: c.parts[0][2],\n v1: c.parts[0][3],\n parts: c.parts,\n link: c.link,\n ceiling: c.ceiling || plan.floors[c.floor].ceiling,\n color: { wall: 'wall_' + c.type, floor: 'floor_' + c.type },\n })),\n walls: plan.walls,\n doors: plan.doors,\n windows: plan.windows,\n openPairs: ([] as Json[]).concat(...Object.values(plan.openPairs)),\n facade,\n lot,\n items: itemsOut,\n stateItems: stateItemsOut,\n colors,\n building: tpl.building ? tpl.building(plan.w, plan.d, op) : null,\n missing,\n }\n if (tpl.singleFloor) result.floorNumber = op.floor || 3\n result.partyWalls = tpl.partyWalls || []\n if (zone) {\n const report = { zone: zone.id, adjustments, violations: checkLot(zone, lot, Object.assign({}, result, { rooms: plan.rooms })) }\n result.zoning = report\n }\n return result\n}\n\nconst isSolid = (m: Json) => !m.flat && !m.on && (!m.decor || m.mount === 'floor')\n\n/** Validates a result of `generate`; returns a list of messages (empty when valid). */\nexport function validate(result: Json, options?: { locale?: string }): string[] {\n const locale = options?.locale || result.locale || 'en'\n const t = (key: string, vars: Record<string, string | number>) => translate('messages', key, locale, vars)\n const errors: string[] = []\n const solids: Json[] = result.items.filter(isSolid)\n for (let i = 0; i < solids.length; i++)\n for (let j = i + 1; j < solids.length; j++)\n if (solids[i].floor === solids[j].floor && !solids[i].barricade && !solids[j].barricade && overlaps(solids[i].aabb, solids[j].aabb, 0.011)) errors.push(t('overlap', { a: solids[i].id, b: solids[j].id }))\n for (const m of solids) {\n if (m.barricade) continue\n for (const p of result.doors) if (p.floor === (m.outdoor ? 0 : m.floor) && p.zones.some((z: Json) => overlaps(m.aabb, z, 0.011))) errors.push(t('door_blocked', { id: m.id }))\n if (result.lot) for (const g of result.lot.gates) if (m.outdoor && openingZones(g.u, g.v, 'u', g.width, DOOR_CLEARANCE).some((z) => overlaps(m.aabb, z, 0.011))) errors.push(t('gate_blocked', { id: m.id }))\n }\n for (const f of result.missing) errors.push(t('missing_required', { room: f.room, slot: f.slot }))\n if (result.zoning) for (const v of result.zoning.violations) errors.push(t('zone_violation', { zone: result.zoning.zone, rule: v.rule, actual: v.actual, limit: v.limit }))\n return errors\n}\n\n/** Size limits and default size of a template (they can depend on options such as `tier`). */\nexport function limitsOf(template: string | TemplateDef, options?: FloorplanOptions) {\n const tpl = templateOf(template)\n const op = options || {}\n return { limits: tpl.limitsFn ? tpl.limitsFn(op) : tpl.limits, defaults: tpl.defaultsFn ? tpl.defaultsFn(op) : tpl.defaults }\n}\n\nexport function listTemplates(locale = 'en') {\n return Object.values(TEMPLATES).map((t) => {\n const a = floorsOf(t, {})\n return {\n id: t.id,\n name: translate('templates', t.id, locale),\n use: useOf(t),\n style: typeof t.style === 'function' ? t.style({}) : t.style,\n limits: t.limits,\n defaults: t.defaults,\n floors: a.length,\n floorRange: t.floorRange || null,\n lot: !!t.lot,\n options: t.options || {},\n }\n })\n}\n\nexport { DECOR_PROFILES }\n","import { registerItems } from './registry'\n\n/** Ground cover types the lot builder can draw. Colours come from the palette roles of the same purpose. */\nexport function registerGroundItems(): void {\n const flat = { category: 'ground_cover', w: 1, d: 1, h: 0, decor: true, mount: 'ground', flat: true } as const\n registerItems([\n { type: 'lawn', ...flat, color: { role: 'lawn' } },\n { type: 'tile_floor', ...flat, color: { role: 'exterior_floor' } },\n { type: 'concrete', ...flat, color: { role: 'exterior_floor' } },\n { type: 'deck_floor', ...flat, color: { role: 'deck_floor' } },\n { type: 'dirt', ...flat, color: { role: 'dirt' } },\n ])\n}\n","import type { SlotDef, SlotKit } from './types'\n\n/** Builders for the slot definitions of a room library. */\nexport const slotKit: SlotKit = {\n wall: (id, side, pos, size, cats, o) => Object.assign({ id, anchor: 'wall', side, pos, size, cats }, o) as SlotDef,\n corner: (id, corner, size, cats, o) => Object.assign({ id, anchor: 'corner', corner, size, cats }, o) as SlotDef,\n center: (id, fx, fz, size, cats, o) => Object.assign({ id, anchor: 'center', fx, fz, size, cats }, o) as SlotDef,\n windowSlot: (id, size, cats, o) => Object.assign({ id, anchor: 'window', size, cats }, o) as SlotDef,\n on: (id, parent, cats, o) => Object.assign({ id, anchor: 'on', on: parent, cats }, o) as SlotDef,\n inside: (id, parent, cats, o) => Object.assign({ id, anchor: 'inside', on: parent, cats }, o) as SlotDef,\n}\n","{\n \"labels\": {\n \"floor_n\": \"Floor {n}\",\n \"parking\": \"Parking\",\n \"garden\": \"Garden\",\n \"backyard\": \"Backyard\",\n \"side_left\": \"Left side\",\n \"side_right\": \"Right side\"\n },\n \"reasons\": {\n \"invalid_parent\": \"invalid parent\",\n \"invalid_side\": \"invalid side\",\n \"blocked_by_door\": \"blocked by a door\",\n \"open_wall\": \"open wall\",\n \"invalid_corner\": \"invalid corner\",\n \"no_window\": \"no window\",\n \"window_outside_room\": \"window outside the room\",\n \"larger_than_room\": \"slot larger than the room\",\n \"unknown_anchor\": \"unknown anchor\"\n },\n \"messages\": {\n \"overlap\": \"Overlap: {a} and {b}\",\n \"door_blocked\": \"Door blocked by {id}\",\n \"gate_blocked\": \"Gate blocked by {id}\",\n \"missing_required\": \"Required item missing: {room}/{slot}\",\n \"zone_violation\": \"Zone {zone}: {rule} is {actual}, limit {limit}\"\n },\n \"ui\": {\n \"title\": \"Floor plan viewer\",\n \"template\": \"Template\",\n \"seed\": \"Seed\",\n \"random_seed\": \"Random\",\n \"state\": \"State\",\n \"style\": \"Style\",\n \"zone\": \"Zone\",\n \"no_zone\": \"No zone (unrestricted)\",\n \"floor\": \"Floor\",\n \"outside\": \"Whole lot\",\n \"language\": \"Language\",\n \"width\": \"Width (m)\",\n \"depth\": \"Depth (m)\",\n \"auto_size\": \"Template default size\",\n \"options\": \"Options\",\n \"opt_floors\": \"Floors\",\n \"opt_elevator\": \"Elevator\",\n \"opt_tier\": \"Tier\",\n \"yes\": \"Yes\",\n \"no\": \"No\",\n \"default\": \"Default\",\n \"show_labels\": \"Labels\",\n \"show_items\": \"Items\",\n \"show_state\": \"State items\",\n \"show_lot\": \"Lot\",\n \"show_grid\": \"Grid\",\n \"legend\": \"Legend\",\n \"summary\": \"Summary\",\n \"rooms\": \"Rooms\",\n \"items\": \"Items\",\n \"state_items\": \"State items\",\n \"missing\": \"Missing required items\",\n \"none\": \"None\",\n \"validation\": \"Validation\",\n \"valid\": \"Valid plan\",\n \"zoning\": \"Zoning\",\n \"adjustments\": \"Adjustments\",\n \"violations\": \"Violations\",\n \"compliant\": \"Compliant with the zone\",\n \"hover\": \"Hover an item for details\",\n \"meters\": \"m\",\n \"use_label\": \"Use\",\n \"unit_floor\": \"Unit floor\",\n \"legend_wall\": \"Wall\",\n \"legend_door\": \"Door\",\n \"legend_window\": \"Window\",\n \"legend_gate\": \"Gate\",\n \"legend_path\": \"Path\",\n \"legend_item\": \"Furniture\",\n \"legend_state\": \"State item (outlined)\",\n \"rule_use\": \"Use not allowed\",\n \"rule_floors\": \"Too many floors\",\n \"rule_height\": \"Too tall\",\n \"rule_setback_front\": \"Front setback too small\",\n \"rule_setback_side\": \"Side setback too small\",\n \"rule_setback_back\": \"Back setback too small\",\n \"rule_min_lot\": \"Lot too small\",\n \"rule_min_frontage\": \"Frontage too narrow\",\n \"rule_coverage\": \"Coverage too high\",\n \"rule_far\": \"Floor area ratio too high\",\n \"rule_permeable\": \"Permeable area too small\",\n \"reason_max_floors\": \"Zone floor limit\",\n \"reason_max_height\": \"Zone height limit\",\n \"reason_setback_front\": \"Zone front setback\",\n \"reason_setback_side\": \"Zone side setback\",\n \"reason_setback_back\": \"Zone back setback\",\n \"reason_permeable_min\": \"Zone permeable area\"\n }\n}\n","{\n \"labels\": {\n \"floor_n\": \"Andar {n}\",\n \"parking\": \"Vaga\",\n \"garden\": \"Jardim\",\n \"backyard\": \"Quintal\",\n \"side_left\": \"Lateral esquerda\",\n \"side_right\": \"Lateral direita\"\n },\n \"reasons\": {\n \"invalid_parent\": \"pai inválido\",\n \"invalid_side\": \"lado inválido\",\n \"blocked_by_door\": \"bloqueado por porta\",\n \"open_wall\": \"parede aberta\",\n \"invalid_corner\": \"canto inválido\",\n \"no_window\": \"sem janela\",\n \"window_outside_room\": \"janela fora do cômodo\",\n \"larger_than_room\": \"slot maior que o cômodo\",\n \"unknown_anchor\": \"âncora desconhecida\"\n },\n \"messages\": {\n \"overlap\": \"Sobreposição: {a} e {b}\",\n \"door_blocked\": \"Porta bloqueada por {id}\",\n \"gate_blocked\": \"Portão bloqueado por {id}\",\n \"missing_required\": \"Item obrigatório ausente: {room}/{slot}\",\n \"zone_violation\": \"Zona {zone}: {rule} é {actual}, limite {limit}\"\n },\n \"ui\": {\n \"title\": \"Visualizador de plantas\",\n \"template\": \"Modelo\",\n \"seed\": \"Semente\",\n \"random_seed\": \"Aleatória\",\n \"state\": \"Estado\",\n \"style\": \"Estilo\",\n \"zone\": \"Zona\",\n \"no_zone\": \"Sem zona (livre)\",\n \"floor\": \"Andar\",\n \"outside\": \"Lote inteiro\",\n \"language\": \"Idioma\",\n \"width\": \"Largura (m)\",\n \"depth\": \"Profundidade (m)\",\n \"auto_size\": \"Tamanho padrão do modelo\",\n \"options\": \"Opções\",\n \"opt_floors\": \"Andares\",\n \"opt_elevator\": \"Elevador\",\n \"opt_tier\": \"Padrão\",\n \"yes\": \"Sim\",\n \"no\": \"Não\",\n \"default\": \"Padrão\",\n \"show_labels\": \"Rótulos\",\n \"show_items\": \"Móveis\",\n \"show_state\": \"Itens de estado\",\n \"show_lot\": \"Lote\",\n \"show_grid\": \"Grade\",\n \"legend\": \"Legenda\",\n \"summary\": \"Resumo\",\n \"rooms\": \"Cômodos\",\n \"items\": \"Móveis\",\n \"state_items\": \"Itens de estado\",\n \"missing\": \"Itens obrigatórios ausentes\",\n \"none\": \"Nenhum\",\n \"validation\": \"Validação\",\n \"valid\": \"Planta válida\",\n \"zoning\": \"Zoneamento\",\n \"adjustments\": \"Ajustes\",\n \"violations\": \"Violações\",\n \"compliant\": \"Em conformidade com a zona\",\n \"hover\": \"Passe o mouse sobre um item para ver detalhes\",\n \"meters\": \"m\",\n \"use_label\": \"Uso\",\n \"unit_floor\": \"Andar da unidade\",\n \"legend_wall\": \"Parede\",\n \"legend_door\": \"Porta\",\n \"legend_window\": \"Janela\",\n \"legend_gate\": \"Portão\",\n \"legend_path\": \"Caminho\",\n \"legend_item\": \"Móvel\",\n \"legend_state\": \"Item de estado (contorno)\",\n \"rule_use\": \"Uso não permitido\",\n \"rule_floors\": \"Andares demais\",\n \"rule_height\": \"Altura excedida\",\n \"rule_setback_front\": \"Recuo frontal insuficiente\",\n \"rule_setback_side\": \"Recuo lateral insuficiente\",\n \"rule_setback_back\": \"Recuo de fundos insuficiente\",\n \"rule_min_lot\": \"Lote pequeno demais\",\n \"rule_min_frontage\": \"Testada estreita demais\",\n \"rule_coverage\": \"Taxa de ocupação excedida\",\n \"rule_far\": \"Coeficiente de aproveitamento excedido\",\n \"rule_permeable\": \"Área permeável insuficiente\",\n \"reason_max_floors\": \"Limite de andares da zona\",\n \"reason_max_height\": \"Limite de altura da zona\",\n \"reason_setback_front\": \"Recuo frontal da zona\",\n \"reason_setback_side\": \"Recuo lateral da zona\",\n \"reason_setback_back\": \"Recuo de fundos da zona\",\n \"reason_permeable_min\": \"Área permeável da zona\"\n }\n}\n","import { DOOR_CLEARANCE, WALL_THICKNESS } from './constants'\nimport { generate, limitsOf, listTemplates, slots, validate } from './generate'\nimport { registerGroundItems } from './ground-items'\nimport { listLocales, registerLocale, translate } from './locale'\nimport { HIGH_SATURATION, MIN_FABRIC_FLOOR_CONTRAST, MIN_WALL_FLOOR_CONTRAST, hexString, intToHsl, lstar, palette } from './palette'\nimport {\n CATALOG,\n LIBRARIES,\n STYLES,\n TEMPLATES,\n listStates,\n registerDecorProfile,\n registerGroundOverlay,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerPass,\n registerPaletteStyle,\n registerRoomColors,\n registerSeedKeys,\n registerState,\n registerStyle,\n registerTemplate,\n registerWallTop,\n setStateDistribution,\n} from './registry'\nimport { createRng, hashString, mulberry32 } from './rng'\nimport { slotKit } from './slot-kit'\nimport { checkLot, defineZone, getZone, listZones, registerPermeableGround } from './zoning'\nimport { overlaps, openingZones } from './geometry'\nimport { windowZone } from './queries'\n\nimport enLocale from './locales/en.json'\nimport ptBrLocale from './locales/pt-BR.json'\n\nregisterGroundItems()\nregisterPermeableGround('lawn', 'dirt')\nregisterLocale('en', enLocale)\nregisterLocale('pt-BR', ptBrLocale)\n\nexport const version = '0.1.0'\n\n/**\n * The engine as a single object. Content packs take it as an argument (`register(engine)`), so that\n * several bundles (ESM or IIFE) always fill the same registries.\n */\nexport const engine = {\n version,\n generate,\n slots,\n validate,\n palette,\n limitsOf,\n listTemplates,\n listStates,\n // content registration\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerTemplate,\n registerStyle,\n registerPaletteStyle,\n registerRoomColors,\n registerDecorProfile,\n registerPass,\n registerGroundOverlay,\n registerWallTop,\n registerSeedKeys,\n registerState,\n setStateDistribution,\n registerLocale,\n // zoning\n defineZone,\n getZone,\n listZones,\n checkLot,\n registerPermeableGround,\n // kits and data\n slotKit,\n translate,\n listLocales,\n templates: TEMPLATES,\n catalog: CATALOG,\n libraries: LIBRARIES,\n styles: STYLES,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n color: { lstar, hex: hexString, hsl: intToHsl, HIGH_SATURATION, MIN_WALL_FLOOR_CONTRAST, MIN_FABRIC_FLOOR_CONTRAST },\n constants: { WALL_THICKNESS, DOOR_CLEARANCE },\n}\nexport type FloorplanEngine = typeof engine\n\nexport {\n generate,\n slots,\n validate,\n palette,\n limitsOf,\n listTemplates,\n listStates,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerTemplate,\n registerStyle,\n registerPaletteStyle,\n registerRoomColors,\n registerDecorProfile,\n registerPass,\n registerGroundOverlay,\n registerWallTop,\n registerSeedKeys,\n registerState,\n setStateDistribution,\n registerLocale,\n translate,\n listLocales,\n defineZone,\n getZone,\n listZones,\n checkLot,\n registerPermeableGround,\n slotKit,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n}\nexport type * from './types'\nexport type { PaletteDraw, PaletteEarly, PaletteStyleDef } from './palette'\n"],"mappings":";AACO,IAAM,iBAAiB;AAEvB,IAAM,SAAS,iBAAiB;AAChC,IAAM,MAAM;AACZ,IAAM,MAAM;AAEZ,IAAM,iBAAiB;;;ACJvB,IAAM,KAAK,CAAC,MAAsB,KAAK,MAAM,IAAI,GAAG,IAAI;AACxD,IAAM,QAAQ,CAAC,GAAW,GAAW,MAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACrF,IAAM,WAAW,CAAC,GAAS,GAAS,IAAI,QAAiB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AAChI,IAAM,QAAQ,CAAC,MAAkB,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,IAAI,MAAM;AAC5F,IAAM,KAAK,CAAC,GAAW,MAAuB,KAAK,IAAI,IAAI,CAAC,IAAI;AAChE,IAAM,UAAU,CAAC,GAAS,MAAoB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AACrF,IAAM,SAAS,CAAC,OAAqB,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/D,IAAM,QAAQ,CAAC,OAA2B,EAAE,KAAK,KAAK,EAAE;AAGxD,IAAM,SAAS,CAAC,MAAY,MAAmB,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC5G,IAAM,WAAW,CAAC,IAAY,OAAsB,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK,CAAC;AAE7H,SAAS,UAAU,GAAS,GAAS,WAAyB;AACnE,SAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACzM;AAEO,SAAS,YAAY,GAAS,QAAyB;AAC5D,QAAM,IAAI;AACV,QAAM,SAAiB;AAAA,IACrB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,IACnB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,IACnB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,IACnB,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,IACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,EACvC;AACA,SAAO,OAAO,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACzI;AAEO,SAAS,aAAa,WAA+B,GAAW,GAA+B;AACpG,QAAM,MAA0B,CAAC;AACjC,aAAW,CAAC,GAAG,CAAC,KAAK,WAAW;AAC9B,QAAI,KAAK,KAAK,KAAK,GAAG;AACpB,UAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AACf;AAAA,IACF;AACA,QAAI,IAAI,EAAG,KAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1B,QAAI,IAAI,EAAG,KAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,EAC5B;AACA,SAAO;AACT;AASO,SAAS,aAAa,MAAY,MAAc,GAAW,GAAW,GAAgC;AAC3G,QAAM,OAAe,CAAC;AACtB,aAAW,KAAK,KAAK,OAAO;AAC1B,QAAI,SAAS,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAG,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,aAC/E,SAAS,UAAU,GAAG,EAAE,CAAC,GAAG,CAAC,EAAG,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,aACnF,SAAS,UAAU,GAAG,EAAE,CAAC,GAAG,CAAC,EAAG,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,aACnF,SAAS,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,EAAG,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,EAC/F;AACA,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,EAAE,KAAK,OAAO,KAAK,EAAE,KAAK,GAAG;AAC7D,QAAI,EAAG,QAAO;AAAA,EAChB;AACA,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3D;AAEO,SAAS,WAAW,GAAS,GAAS,GAAgC;AAC3E,QAAM,OAAe,CAAC;AACtB,aAAW,MAAM,EAAE;AACjB,eAAW,MAAM,EAAE,OAAO;AACxB,UAAI;AACJ,UAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AACxC,YAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnD,YAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAK,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,MAC3G;AACA,UAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AACxC,YAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACnD,YAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAK,MAAK,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AAAA,MAC3G;AAAA,IACF;AACF,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,EAAE,KAAK,OAAO,KAAK,EAAE,KAAK,GAAG;AAC7D,QAAI,EAAG,QAAO;AAAA,EAChB;AACA,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC3D;AAEO,SAAS,aAAa,GAAW,GAAW,MAAiB,OAAe,OAAuB;AACxG,QAAM,IAAI,QAAQ;AAClB,SAAO,SAAS,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,CAAC;AAClJ;AACO,IAAM,eAAe,CAAC,OAAe,SAAyB,KAAK,IAAI,KAAK,IAAI,IAAI;AAGpF,SAAS,YAAY,IAAuD;AACjF,SAAO,GAAG,SAAS,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC;AACjH;AAEO,SAAS,cAAc,GAAoE,YAA0B;AAC1H,QAAM,QAAQ,CAAC,EAAE,IAAgB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAS;AACrF,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA,IACR,OAAO,EAAE;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA,SAAS,EAAE,WAAW;AAAA,IACtB,SAAS,EAAE,WAAW,CAAC;AAAA,IACvB,WAAW,EAAE,aAAa,CAAC;AAAA,IAC3B,QAAQ,EAAE,UAAU,CAAC;AAAA,IACrB,OAAO,EAAE,SAAS;AAAA,IAClB,MAAM,EAAE,QAAQ;AAAA,IAChB,SAAS,CAAC,CAAC,EAAE;AAAA,IACb,SAAS,EAAE,WAAW;AAAA,IACtB,SAAS,EAAE;AAAA,EACb;AACF;AAGO,SAAS,YAAY,MAAY,OAAwB;AAC9D,SAAO,KAAK,MAAM,IAAI,CAAC,MAAM;AAC3B,UAAM,SAAS,CAAC,MACd,KAAK,MAAM;AAAA,MACT,CAAC,MACC,MAAM,MACL,MAAM,IACH,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAChE,MAAM,IACJ,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAChE,MAAM,IACJ,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,MAChE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI;AAAA,IAC5E;AACF,UAAM,IAAI,UAAU,SAAS;AAC7B,WAAO,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,EAAE;AAAA,EACxH,CAAC;AACH;AAEO,IAAM,SAAS,CAAC,MAAY,GAAW,MAAuB,KAAK,MAAM,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,GAAG;AAUzJ,SAAS,WAAW,OAAe,OAAwB,WAA+B,YAAoB;AACnH,QAAM,SAAqH,CAAC;AAC5H,QAAM,MAAM,CAAC,MAAiB,KAAa,GAAW,GAAW,IAAY,SAAiB;AAC5F,UAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,CAAC;AACnC,KAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC;AAAA,EAC9E;AACA,aAAW,KAAK;AACd,eAAW,KAAK,EAAE,OAAO;AACvB,UAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AAClC,UAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE;AACnC,UAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AAClC,UAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE;AAAA,IACrC;AACF,QAAM,MAAM,CAAC,GAAW,MAAc,UAAU,KAAK,CAAC,MAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,KAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAE;AACpH,QAAM,SAAiC,CAAC;AACxC,aAAW,KAAK,MAAO,QAAO,EAAE,EAAE,IAAI,EAAE;AACxC,QAAM,MAAiC,CAAC;AACxC,aAAW,KAAK,OAAO,OAAO,MAAM,GAAG;AACrC,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACzF,UAAM,OAAyD,CAAC;AAChE,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,YAAM,IAAI,OAAO,CAAC;AAClB,YAAM,IAAI,OAAO,IAAI,CAAC;AACtB,YAAM,KAAK,IAAI,KAAK;AACpB,YAAM,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;AACjE,YAAM,SAAS,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;AACnE,UAAI,CAAC,SAAS,CAAC,OAAQ;AACvB,YAAM,IAAI,SAAS,OAAO,KAAK;AAC/B,YAAM,IAAI,QAAQ,MAAM,KAAK;AAC7B,UAAI,MAAM,KAAM,MAAM,aAAa,MAAM,aAAa,IAAI,GAAG,CAAC,EAAI;AAClE,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,EAAG,MAAK,IAAI;AAAA,UAC/D,MAAK,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAAA,IAC/B;AACA,eAAW,KAAK,MAAM;AACpB,UAAI,SAA6B,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAC5C,iBAAW,MAAM,OAAO;AACtB,YAAI,GAAG,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,EAAG;AAC9C,cAAM,KAAK,GAAG,KAAK,GAAG,QAAQ;AAC9B,cAAM,KAAK,GAAG,KAAK,GAAG,QAAQ;AAC9B,cAAM,IAAwB,CAAC;AAC/B,mBAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,cAAI,MAAM,IAAI,OAAO,MAAM,IAAI,KAAK;AAClC,cAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACb;AAAA,UACF;AACA,cAAI,KAAK,IAAI,IAAK,GAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AAChC,cAAI,KAAK,IAAI,IAAK,GAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAAA,QAClC;AACA,iBAAS;AAAA,MACX;AACA,iBAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,cAAM,SAAS,CAAC,MAAc,MAAM,aAAa,MAAM;AACvD,cAAM,SAAS,OAAO,EAAE,CAAC,MAAM,UAAU,OAAO,EAAE,CAAC,MAAM;AACzD,YAAI,WAAW,EAAE,MAAM,aAAa,EAAE,MAAM,WAAY;AACxD,cAAM,UAAU,UAAW,OAAO,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,aAAe,OAAO,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM;AACxG,YAAI,KAAK;AAAA,UACP,OAAO;AAAA,UACP,MAAM,EAAE;AAAA,UACR,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE;AAAA,UAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,MAAM;AAAA,UAC7B,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE;AAAA,UAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,MAAM;AAAA,UAC7B,WAAW;AAAA,UACX,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAAA,UAChB,UAAU,EAAE,MAAM,aAAa,EAAE,MAAM;AAAA,UACvC,MAAM,UAAU,YAAY;AAAA,UAC5B,GAAG,UAAU,MAAM;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC3NO,SAAS,aAAa,MAAY,YAA4B;AACnE,QAAM,MAAc,CAAC;AACrB,MAAI,cAAc,GAAG;AACnB,eAAW,KAAK,KAAK,MAAO,KAAI,EAAE,UAAU,WAAY,KAAI,KAAK,GAAG,EAAE,KAAK;AAAA,EAC7E,OAAO;AACL,eAAW,KAAK,KAAK,MAAO,KAAI,EAAE,UAAU,KAAK,EAAE,SAAU,KAAI,KAAK,GAAG,EAAE,KAAK;AAChF,eAAW,KAAK,KAAK,MAAO,KAAI,KAAK,GAAG,EAAE,KAAK;AAC/C,eAAW,KAAK,KAAK,MAAO,KAAI,KAAK,GAAG,EAAE,KAAK;AAAA,EACjD;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAY,YAA4B;AACtE,MAAI,cAAc,EAAG,QAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,UAAU;AAC3E,SAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK;AAChF;AAGO,SAAS,WAAW,GAAS,SAAyB;AAC3D,QAAM,IAAI,EAAE,QAAQ,IAAI;AACxB,QAAM,QAAQ;AACd,MAAI;AACJ,MAAI,EAAE,SAAS,QAAS,KAAI,CAAC,GAAG,CAAC;AAAA,WACxB,EAAE,SAAS,OAAQ,KAAI,CAAC,GAAG,EAAE;AAAA,WAC7B,EAAE,SAAS,OAAQ,KAAI,CAAC,GAAG,CAAC;AAAA,MAChC,KAAI,CAAC,IAAI,CAAC;AACf,MAAI,QAAS,KAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9B,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AACZ,MAAI,EAAE,SAAS,IAAK,QAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,IAAI,MAAM;AAClH,SAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,QAAQ,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI,QAAQ,IAAI,CAAC;AAChG;AAEO,IAAM,eAAe,CAAC,IAA6C,QAAuB,CAAC,GAAG,UAAU,GAAG,IAAI,IAAM,OAAO,GAAG,IAAI,IAAI,KAAK;AAE5I,SAAS,cAAc,MAAY,MAAoB;AAC5D,MAAI,CAAC,KAAK,QAAS,QAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE;AACvE,SAAO,KAAK,QAAQ;AAAA,IAClB,CAAC,MACC,EAAE,UAAU,KACZ,KAAK,MAAM,KAAK,CAAC,MAAM;AACrB,UAAI,EAAE,SAAS,QAAS,QAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3E,UAAI,EAAE,SAAS,OAAQ,QAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1E,UAAI,EAAE,SAAS,OAAQ,QAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1E,aAAO,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,IACrD,CAAC;AAAA,EACL;AACF;AAEO,SAAS,OAAO,MAAY,GAAW,GAAW,YAAiC;AACxF,QAAM,OAAO,aAAa,IAAI,KAAK,QAAQ,KAAK;AAChD,SAAO,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,cAAc,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK;AACxE;AAEO,SAAS,WAAW,MAAY,MAAY,IAAY,IAAqB;AAClF,QAAM,IAAI,OAAO,MAAM,IAAI,IAAI,KAAK,KAAK;AACzC,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,OAAO,KAAK,GAAI,QAAO;AAC7B,MAAI,KAAK,QAAS,QAAO;AACzB,UAAQ,KAAK,UAAU,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,MAAO,EAAE,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,MAAM,EAAE,MAAQ,EAAE,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,MAAM,EAAE,EAAG;AAClI;;;ACjDO,SAAS,WAAW,MAAY,MAAY,SAAoC;AACrF,QAAM,KAAK,KAAK,UAAU,MAAM;AAChC,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,aAAW,KAAK,KAAK,OAAO;AAC1B,SAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACtB,SAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACtB,SAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACtB,SAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAAA,EACxB;AACA,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,EAAE;AACnC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,EAAE;AACnC,QAAM,cAAc,IAAI,WAAW,KAAK,EAAE;AAC1C,QAAM,SAAS,YAAY,MAAM,IAAI;AACrC,WAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,IAAI,MAAM,IAAI,OAAO;AAC3B,YAAM,IAAI,MAAM,IAAI,OAAO;AAC3B,UAAI,OAAO,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,EAAG,aAAY,IAAI,KAAK,CAAC,IAAI;AAAA,IACtG;AACF,QAAM,UAA8B,CAAC;AACrC,aAAW,MAAM,gBAAgB,MAAM,KAAK,KAAK;AAC/C,QAAI,EAAE,WAAW,QAAQ,IAAI,GAAG,EAAE;AAChC,iBAAW,MAAM,YAAY,EAAE,GAAG;AAChC,YAAI,CAAC,OAAO,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG;AACjC,cAAM,IAAI,KAAK,OAAO,GAAG,CAAC,IAAI,MAAM,EAAE;AACtC,cAAM,IAAI,KAAK,OAAO,GAAG,CAAC,IAAI,MAAM,EAAE;AACtC,YAAI,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,YAAY,IAAI,KAAK,CAAC,EAAG,SAAQ,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,MAC1F;AACJ,QAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAC7B,SAAO,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,QAAQ,aAAa,SAAS,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE;AAC5G;AAGO,SAAS,UAAU,GAAS,QAAgB,WAA4B;AAC7E,QAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI;AACvC,QAAM,UAAU,IAAI,WAAW,KAAK,EAAE;AACtC,aAAW,KAAK,QAAQ;AACtB,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;AAC/D,UAAM,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;AACpE,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;AAC/D,UAAM,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;AACpE,aAAS,IAAI,IAAI,KAAK,IAAI;AACxB,eAAS,IAAI,IAAI,KAAK,IAAI,KAAK;AAC7B,cAAM,IAAI,MAAM,IAAI,OAAO;AAC3B,cAAM,IAAI,MAAM,IAAI,OAAO;AAC3B,YAAI,IAAI,EAAE,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC,IAAI,UAAW,SAAQ,IAAI,KAAK,CAAC,IAAI;AAAA,MAC1H;AAAA,EACJ;AACA,MAAI,OAAO;AACX,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,IAAI,IAAI,KAAK;AACnB,UAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAG;AAC9B,YAAM,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,OAAO,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5F,UAAI,OAAO,UAAU;AACnB,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF;AACF,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,CAAC,EAAE,QAAQ,OAAQ,QAAO;AAC9B,aAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAS,KAAI,QAAQ,IAAI,KAAK,CAAC,EAAG,QAAO;AAChE,QAAM,UAAU,IAAI,WAAW,KAAK,EAAE;AACtC,QAAM,QAAQ,IAAI,WAAW,KAAK,EAAE;AACpC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,QAAM,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;AAC/C,UAAQ,CAAC,IAAI;AACb,QAAM,GAAG,IAAI;AACb,SAAO,IAAI,GAAG;AACZ,UAAM,IAAI,MAAM,GAAG;AACnB,UAAM,IAAI,IAAI;AACd,UAAM,KAAK,IAAI,KAAK;AACpB,eAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG;AACzD,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI;AACd,UAAI,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,GAAI;AAC1C,YAAM,IAAI,IAAI,KAAK;AACnB,UAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAG;AAC5C,cAAQ,CAAC,IAAI;AACb,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,IAAI,EAAG,QAAO;AAC3B,aAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAS,KAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAG,QAAO;AACjE,SAAO;AACT;;;AC1FO,IAAM,UAAmC,CAAC;AAC1C,IAAM,YAAyC,CAAC;AAChD,IAAM,gBAAwC,CAAC;AAC/C,IAAM,YAAyC,CAAC;AAChD,IAAM,SAAmC,CAAC;AAC1C,IAAM,cAAsC,CAAC;AAC7C,IAAM,iBAAkD,CAAC;AACzD,IAAM,cAA8B,CAAC;AACrC,IAAM,SAA6C,CAAC;AACpD,IAAM,iBAAuC,CAAC;AAC9C,IAAM,kBAAuC,CAAC;AAC9C,IAAM,gBAA6C,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC,EAAE,EAAE;AACjF,IAAM,mBAA2C,EAAE,MAAM,EAAE;AAC3D,IAAM,YAA8E,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE;AAC3G,IAAM,oBAAiF,EAAE,SAAS,MAAM,SAAS,QAAQ;AAEzH,SAAS,aAAa,KAAyB;AACpD,QAAM,IAAI,IAAI;AACd,QAAM,OAAgB,OAAO,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,EAAE,GAAG,GAAG;AAC5H,UAAQ,IAAI,IAAI,IAAI;AACpB,SAAO;AACT;AACO,SAAS,cAAc,MAAyB;AACrD,aAAW,KAAK,KAAM,cAAa,CAAC;AACtC;AAEO,SAAS,gBAAgB,IAAY,SAA4B;AACtE,YAAU,EAAE,IAAI;AAClB;AACO,SAAS,qBAAqB,OAAe,IAAkB;AACpE,gBAAc,KAAK,IAAI;AACzB;AAEO,SAAS,iBAAwC,GAAS;AAC/D,YAAU,EAAE,EAAE,IAAI;AAClB,SAAO;AACT;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,MAAM,EAAE,IAAI;AACnB,aAAW,KAAK,MAAM,WAAW,CAAC,EAAG,aAAY,CAAC,IAAI,MAAM;AAC9D;AACO,SAAS,qBAAqB,IAAY,KAA4B;AAC3E,iBAAe,EAAE,IAAI;AACvB;AACO,SAAS,mBAAmB,MAA4B;AAC7D,aAAW,KAAK,MAAM;AACpB,UAAM,IAAI,YAAY,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AACxD,QAAI,KAAK,EAAG,aAAY,OAAO,GAAG,CAAC;AACnC,gBAAY,KAAK,CAAC;AAAA,EACpB;AACA,cAAY,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC9C;AAEO,SAAS,qBAAqB,SAAiB,SAAqB;AACzE,iBAAe,OAAO,IAAI;AAC5B;AACO,SAAS,aAAa,MAAc,KAAsB;AAC/D,QAAM,IAAI,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,MAAI,KAAK,EAAG,QAAO,CAAC,IAAI,EAAE,MAAM,IAAI;AAAA,MAC/B,QAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAChC;AACO,SAAS,sBAAsB,MAA+B;AACnE,kBAAgB,KAAK,IAAI;AAC3B;AACO,SAAS,gBAAgB,IAAY,QAAsB;AAChE,mBAAiB,EAAE,IAAI;AACzB;AAEO,SAAS,iBAAiB,MAAgF;AAC/G,SAAO,OAAO,UAAU,OAAO,KAAK,KAAK;AACzC,SAAO,OAAO,UAAU,OAAO,KAAK,KAAK;AAC3C;AAGO,SAAS,cAAc,MAAc,QAA2B;AACrE,gBAAc,IAAI,IAAI;AACxB;AAEO,SAAS,qBAAqB,SAAwC,UAAU,SAAe;AACpG,oBAAkB,UAAU;AAC5B,oBAAkB,UAAU;AAC9B;AACO,IAAM,aAAa,MAAgB,OAAO,KAAK,aAAa;AAE5D,SAAS,eAAe,IAAgC;AAC7D,QAAM,IAAI,MAAM;AAChB,SAAO,YAAY,CAAC,KAAK;AAC3B;AACO,SAAS,QAAQ,IAAsB;AAC5C,SAAO,OAAO,EAAE,KAAK,OAAO,UAAU,OAAO,OAAO,MAAM,EAAE,CAAC;AAC/D;;;ACvGO,SAAS,WAAW,GAAgB;AACzC,SAAO,WAAY;AACjB,SAAK;AACL,QAAK,IAAI,aAAc;AACvB,QAAI,IAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC;AACvC,QAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,KAAK,CAAC,IAAK;AAC7C,aAAS,IAAK,MAAM,QAAS,KAAK;AAAA,EACpC;AACF;AAEO,SAAS,WAAW,OAAgC;AACzD,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,IAAI,aAAa,EAAE;AACvB,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,QAAI,KAAK,KAAK,IAAI,EAAE,WAAW,CAAC,GAAG,UAAU;AAC7C,QAAK,KAAK,KAAO,MAAM;AAAA,EACzB;AACA,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,UAAQ,IAAK,MAAM,QAAS;AAC9B;AAGO,IAAM,YAAY,CAAC,MAAuB,QAAqB,WAAW,WAAW,OAAO,MAAM,GAAG,CAAC;AAGtG,SAAS,aAAa,KAAU,SAAyC;AAC9E,QAAM,OAAO,OAAO,KAAK,OAAO;AAChC,MAAI,QAAQ;AACZ,aAAW,KAAK,KAAM,UAAS,QAAQ,CAAC;AACxC,MAAI,IAAI,IAAI,IAAI;AAChB,aAAW,KAAK,MAAM;AACpB,SAAK,QAAQ,CAAC;AACd,QAAI,IAAI,EAAG,QAAO;AAAA,EACpB;AACA,SAAO,KAAK,KAAK,SAAS,CAAC;AAC7B;AAGO,SAAS,cAA4C,YAAiB,KAAe;AAC1F,QAAM,MAAM,WAAW,MAAM;AAC7B,QAAM,MAAW,CAAC;AAClB,SAAO,IAAI,QAAQ;AACjB,QAAI,QAAQ;AACZ,eAAW,KAAK,IAAK,UAAS,EAAE;AAChC,QAAI,IAAI,IAAI,IAAI;AAChB,QAAI,IAAI;AACR,WAAO,IAAI,IAAI,SAAS,GAAG,KAAK;AAC9B,WAAK,IAAI,CAAC,EAAE;AACZ,UAAI,IAAI,EAAG;AAAA,IACb;AACA,QAAI,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,QAAW,KAAU,KAAe;AAClD,QAAM,IAAI,IAAI,MAAM;AACpB,WAAS,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,KAAK;AACrC,UAAM,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,EAAE;AACnC,KAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;;;AC1DA,SAAS,aAAa,MAAkD;AACtE,QAAM,MAAyC,CAAC;AAChD,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,UAAM,QAAQ,IAAI,CAAC,MAAM;AACzB,UAAM,MAAM,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,aAAa,OAAO,EAAE,SAAS,IAAI;AACrI,eAAW,MAAM,IAAK,KAAI,KAAK,EAAE,IAAI,QAAQ,SAAS,IAAI,OAAO,CAAC;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAY,IAAa,OAAqB;AAC9D,QAAM,IAAI,KAAK;AACf,QAAM,IAAU,EAAE;AAClB,QAAM,CAAC,SAAS,OAAO,IAAI,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AACjD,QAAM,IAAU,EAAE;AAElB,MAAI,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU;AACrE,MAAI,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU;AACrE,MAAI,OAAO;AACT,QAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QAAS,OAAM;AAAA,QACpD,OAAM;AAAA,EACb;AACA,aAAW,KAAK,EAAE,UAAU;AAC1B,QAAI,MAAM,OAAQ,MAAK,EAAE,CAAC;AAAA,aACjB,MAAM,QAAS,MAAK,EAAE,CAAC,IAAI;AAAA,aAC3B,MAAM,QAAS,MAAK,EAAE,CAAC;AAAA,aACvB,MAAM,OAAQ,MAAK,EAAE,CAAC,IAAI;AAAA,EACrC;AACA,SAAO,CAAC,IAAI,IAAI,KAAK,SAAS,KAAK,OAAO;AAC5C;AAEA,IAAM,aAAmC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE;AAG7F,SAAS,YAAY,GAAS,OAAuB;AAC1D,QAAM,YAAY,WAAW,KAAK,KAAK,CAAC,GAAG,CAAC;AAC5C,MAAI,KAAK,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AACvE,MAAI,KAAK,KAAK,KAAK,IAAK,OAAM,IAAI,KAAK;AACvC,MAAI,KAAK,CAAC,KAAK,KAAK,IAAK,OAAM,IAAI,KAAK;AACxC,SAAO,GAAG,EAAE;AACd;AAGO,SAAS,SAAS,MAAY,MAAYA,QAAe,KAA8E;AAC5I,QAAM,QAAsB,CAAC;AAC7B,QAAM,UAA4C,CAAC;AACnD,QAAM,QAAoC,CAAC;AAC3C,QAAM,SAAiB,CAAC;AACxB,QAAM,WAAmB,CAAC;AAC1B,QAAM,OAAe,CAAC;AACtB,QAAM,SAAS,YAAY,MAAM,CAAC;AAClC,QAAM,OAAO,WAAW,MAAM,IAAI;AAClC,QAAM,QAAQ,aAAa,MAAM,KAAK,KAAK;AAC3C,QAAM,cAAc,cAAc,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,GAAG,KAAK,OAAO,GAAG,EAAE,EAAE;AAChG,QAAM,YAAY,KAAK,UAAU,OAAO;AAMxC,QAAM,QAAgB,CAAC;AACvB,QAAM,OAA6B,CAAC;AACpC,aAAW,KAAKA,QAAO;AACrB,QAAI,EAAE,OAAO;AACX,UAAI,KAAK,EAAE,KAAK,GAAG;AACjB,aAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,CAAC;AAC5B;AAAA,MACF;AACA,YAAM,IAAU,EAAE,OAAO,EAAE,OAAO,SAAS,CAAC,CAAC,EAAE;AAC/C,WAAK,EAAE,KAAK,IAAI;AAChB,YAAM,KAAK,CAAC;AAAA,IACd,MAAO,OAAM,KAAK,EAAE,OAAO,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC;AAAA,EACjD;AACA,aAAW,KAAK,MAAO,GAAE,WAAW,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ;AACpE,QAAM,QAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AACrF,QAAM,eAAe,CAAC,MACpB,EAAE,QACC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EACjC,OAAO,OAAO,EACd,OAAO,CAAC,OAAOA,OAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC;AAC5E,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAQ,CAAC,MAAY,aAAa,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAAY,CAAC;AAC/E,QAAM,OAAO,CAAC,GAAS,IAAa,GAAS,WAA8B;AACzE,UAAM,IAAU,CAAC,EAAE,QAAQ,EAAE,MAAM;AACnC,UAAM,KAAK,KAAK,KAAK,MAAM,EAAE;AAC7B,UAAM,IAAU;AAAA,MACd;AAAA,MACA,MAAM,GAAG;AAAA,MACT,UAAU,GAAG;AAAA,MACb,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,MACvB,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,MACvB,IAAI,YAAY,GAAG,GAAG,KAAK;AAAA,MAC3B,GAAG,GAAG;AAAA,MACN,GAAG,GAAG;AAAA,MACN,GAAG,GAAG;AAAA,MACN,GAAG,SAAS,IAAI,OAAO,KAAK,KAAK,OAAO,CAAC,IAAI;AAAA,MAC7C,QAAQ,EAAE,CAAC;AAAA,MACX,QAAQ,EAAE,CAAC;AAAA,MACX,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,SAAS,CAAC,CAAC,KAAK;AAAA,MAChB,MAAM,EAAE;AAAA,MACR,IAAI,SAAS,EAAE,KAAK;AAAA,MACpB,MAAM,SAAU,EAAE,WAAW,WAAW,WAAW,OAAQ;AAAA,MAC3D,WAAW,EAAE;AAAA,MACb,MAAM,GAAG;AAAA,MACT,KAAK,GAAG;AAAA,MACR,MAAM,EAAE,IAAI,EAAE;AAAA,MACd,IAAI;AAAA,MACJ,SAAS,UAAU,MAAM,EAAE,KAAK;AAAA,IAClC;AACA,QAAI,UAAU,EAAE,WAAW,SAAU,GAAE,IAAI,GAAG,OAAO,KAAK,CAAC;AAC3D,QAAI,KAAK,KAAM,GAAE,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE;AAC/D,UAAM,EAAE,EAAE,IAAI;AACd,UAAM,KAAK,CAAe;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,GAAS,UAAsC;AAC7D,UAAM,QAAQ,cAAc,aAAa,EAAE,IAAI,GAAG,GAAG;AACrD,QAAI,EAAE,WAAW,QAAQ,EAAE,WAAW,UAAU;AAC9C,YAAM,SAAS,MAAM,EAAE,EAAY;AACnC,UAAI,CAAC,OAAQ,QAAO;AACpB,iBAAW,EAAE,GAAG,KAAK,OAAO;AAC1B,YAAI,GAAG,IAAI,OAAO,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,IAAK;AACpD,cAAM,IAAU,CAAC,OAAO,QAAQ,OAAO,MAAM;AAC7C,cAAM,IAAU,OAAO;AACvB,cAAM,CAAC,SAAS,OAAO,IAAI,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AACjD,cAAM,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,OAAO,IAAI,IAAI,GAAG,IAAI;AAC7D,cAAM,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,OAAO,IAAI,IAAI,GAAG,IAAI;AAC7D,eAAO,KAAK,GAAG,IAAI,CAAC,KAAK,UAAU,GAAG,KAAK,UAAU,GAAG,KAAK,UAAU,GAAG,KAAK,UAAU,CAAC,GAAG,MAAM;AAAA,MACrG;AACA,aAAO;AAAA,IACT;AACA,eAAW,EAAE,GAAG,KAAK,OAAO;AAC1B,UAAI,GAAG,IAAI,EAAE,IAAI,OAAO,GAAG,IAAI,EAAE,IAAI,IAAK;AAC1C,YAAM,IAAU,CAAC,EAAE,QAAQ,EAAE,MAAM;AACnC,YAAM,QAAQ,EAAE,WAAW,SAAU,EAAE,SAAS,OAAO,IAAM,EAAE,QAAS;AACxE,YAAM,SAAS,CAAC,CAAC;AACjB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,MAAM,IAAK,QAAO,KAAK,IAAI,KAAK,CAAC,IAAI,GAAG;AAC3E,UAAI,QAAwE;AAC5E,iBAAW,SAAS,QAAQ;AAC1B,cAAMC,KAAI,SAAS,GAAG,IAAI,KAAK;AAC/B,YAAI,CAAC,YAAYA,IAAG,MAAM,EAAG;AAC7B,YAAI,GAAG,MAAM;AACX,kBAAQ,EAAE,MAAMA,GAAE;AAClB;AAAA,QACF;AACA,YAAI,MAAM,KAAK,CAAC,MAAM,SAASA,IAAG,CAAC,CAAC,EAAG;AACvC,YAAI,YAAY,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,aAAa,IAAI,CAAC,KAAK,SAASA,IAAG,CAAC,CAAC,EAAG;AAC3E,YAAI,OAAO,KAAK,CAAC,MAAM,SAASA,IAAG,CAAC,CAAC,EAAG;AACxC,YAAI,CAAC,GAAG,QAAQ,KAAK,KAAK,CAAC,MAAM,SAASA,IAAG,CAAC,CAAC,EAAG;AAClD,YAAIC,MAAkB;AACtB,YAAI,CAAC,SAAS,EAAE,YAAY,KAAK,CAAC,GAAG,KAAK;AACxC,UAAAA,MAAK,UAAUD,IAAG,GAAG,EAAE,SAAS;AAChC,cAAI,CAAC,YAAYC,KAAI,MAAM,EAAG;AAC9B,cAAI,MAAM,KAAK,CAACC,OAAM,CAACA,GAAE,OAAO,CAACA,GAAE,QAAQ,CAACA,GAAE,MAAM,SAASD,KAAYC,GAAE,EAAE,CAAC,EAAG;AAAA,QACnF;AACA,YAAI,CAAC,GAAG,OAAO,SAAS,KAAK,CAAC,MAAM,SAASF,IAAG,CAAC,CAAC,EAAG;AACrD,YAAIG,WAAuB;AAC3B,YAAI,GAAG,KAAK;AACV,UAAAA,WAAU,CAACH,GAAE,CAAC,IAAI,GAAG,KAAKA,GAAE,CAAC,IAAI,GAAG,KAAKA,GAAE,CAAC,IAAI,GAAG,KAAKA,GAAE,CAAC,IAAI,GAAG,GAAG;AACrE,cAAI,CAAC,YAAYG,UAAS,MAAM,KAAK,OAAO,KAAK,CAAC,MAAM,SAASA,UAAiB,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,SAASA,UAAiB,CAAC,CAAC,EAAG;AAAA,QAC5I;AACA,YAAI,CAAC,UAAU,MAAM,OAAO,OAAO,CAACH,EAAC,CAAC,GAAG,SAAS,EAAG;AACrD,gBAAQ,EAAE,MAAMA,IAAG,IAAAC,KAAI,SAAAE,SAAQ;AAC/B;AAAA,MACF;AACA,UAAI,CAAC,MAAO;AACZ,YAAM,EAAE,MAAM,GAAG,IAAI,QAAQ,IAAI;AACjC,UAAI,GAAG,KAAM,QAAO,KAAK,GAAG,IAAI,GAAG,IAAI;AACvC,YAAM,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;AAC7B,UAAI,GAAI,UAAS,KAAK,EAAE;AACxB,UAAI,QAAS,MAAK,KAAK,OAAO;AAC9B,aAAO,KAAK,CAAC;AACb,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,CAAC,MAAY;AAC3B,UAAM,KAAK,EAAE,QAAQ,CAAC,EAAE;AACxB,UAAM,IAAI,IAAI;AACd,UAAM,MAAM,EAAE,QAAQ,MAAM;AAC5B,UAAM,UAAkB,CAAC;AACzB,WAAO,IAAI,OAAQ,SAAQ,KAAK,IAAI,OAAO,IAAI,SAAS,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;AACrG,UAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,YAAY,MAAM,EAAE,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM,EAAE,EAAE,EAAE;AAChH,QAAI,CAAC,EAAE,YAAY,KAAK,GAAI;AAC5B,QAAI,KAAK;AACT,eAAW,KAAK,YAAY;AAC1B,UAAI,OAAO,GAAG,KAAK,GAAG;AACpB,aAAK;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,EAAE;AACX,iBAAW,KAAK,YAAY;AAC1B,YAAI,OAAO,GAAG,IAAI,GAAG;AACnB,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACF,QAAI,CAAC,MAAM,EAAE,aAAa,WAAW,UAAU,CAAC,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAI,SAAQ,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC;AAAA,EACtJ;AACA,QAAM,UAAU,MAAM,MAAM;AAC5B,SAAO,QAAQ,QAAQ;AACrB,QAAI,IAAI,QAAQ,UAAU,KAAK;AAC/B,QAAI,IAAI,EAAG,KAAI;AACf,UAAM,IAAI,QAAQ,OAAO,GAAG,CAAC,EAAE,CAAC;AAChC,YAAQ,CAAC;AACT,eAAW,KAAK,EAAE,QAAS,MAAK,IAAI,EAAE,EAAE;AAAA,EAC1C;AACA,SAAO,EAAE,OAAO,QAAQ;AAC1B;;;ACrNO,IAAM,SAAS;AAAA,EACpB,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AACjB;;;ACYO,IAAM,eAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,CAAC,GAAS,SAAiB,YAAY,GAAG,QAAQ,IAAI,EAAE,KAAK;AAAA,EAC7E;AAAA,EACA;AACF;AAGO,SAAS,uBAAuB,MAAY,OAAuC;AACxF,QAAM,QAAsB,CAAC;AAC7B,QAAM,WAAmC,CAAC;AAC1C,QAAM,OAAO,CAAC,MAAY,MAAc,GAAS,GAAS,MAAyB;AACjF,UAAM,KAAK,QAAQ,IAAI;AACvB,UAAM,IAAK,SAAS,KAAK,KAAK,IAAI,KAAK,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACxE,WAAO,OAAO;AAAA,MACZ;AAAA,QACE,IAAI,KAAK,KAAK,UAAU,OAAO;AAAA,QAC/B;AAAA,QACA,UAAU,GAAG;AAAA,QACb,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,QACvB,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,QACvB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,QAC7B,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,GAAG;AAAA,QACH,QAAQ,EAAE,CAAC;AAAA,QACX,QAAQ,EAAE,CAAC;AAAA,QACX,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,SAAS,CAAC,CAAC,KAAK;AAAA,QAChB,MAAM,SAAS,OAAO;AAAA,QACtB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,MAAM,CAAC,CAAC,GAAG;AAAA,QACX,KAAK,GAAG;AAAA,QACR,MAAM,EAAE,IAAI,EAAE;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,GAAG;AAAA,MACZ;AAAA,MACA,KAAK,CAAC;AAAA,IACR;AAAA,EACF;AACA,QAAM,MAAM,CAAC,MAAkB;AAC7B,UAAM,KAAK,CAAC;AACZ,UAAM,KAAK,CAAC;AACZ,WAAO;AAAA,EACT;AACA,QAAM,cAAc,CAAC,MAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK;AAC3F,QAAM,cAAsC,CAAC;AAC7C,QAAM,eAAe,CAAC,MACpB,YAAY,CAAC,EACV,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU,QAAQ,EACnE,IAAI,CAAC,MAAM,EAAE,EAAU,EACvB,OAAO,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;AACnC,QAAM,YAA2D,CAAC;AAClE,MAAI,UAA8B;AAClC,QAAM,SAAS,CAAC,MAAY,UAAU,EAAE,EAAE,MAAM,UAAU,EAAE,EAAE,IAAI,WAAW,MAAM,GAAG,OAAO;AAG7F,WAAS,aAAa,MAAY,MAAc,MAAW,QAA4B;AACrF,UAAM,OAAO,OAAO,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AAC3C,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,IAAI,KAAM,MAAK,OAAO;AAC1B,UAAM,KAAK,QAAQ,IAAI;AACvB,UAAM,SAAS,YAAY,MAAM,CAAC;AAClC,UAAM,YAAY,aAAa,IAAI;AACnC,UAAM,QAAQ,aAAa,MAAM,KAAK,KAAK;AAC3C,UAAM,WAAW,YAAY,IAAI;AACjC,UAAM,cAAc,cAAc,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,GAAG,KAAK,OAAO,GAAG,EAAE,EAAE;AAChG,UAAM,OAAe,KAAK,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AACxD,QAAI,CAAC,KAAK;AACR,iBAAW,KAAK,QAAQ;AACtB,cAAM,UAAU,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,GAAG;AAC5C,cAAM,UAAU,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,GAAG;AAC5C,mBAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,IAAI,OAAO,CAAC,EAAG,MAAK,KAAK,CAAC,GAAG,GAAG,IAAI,SAAS,IAAI,OAAO,CAAC;AACjK,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,gBAAM,IAAI,KAAK;AACf,gBAAM,OAAO,KAAK,MAAM,KAAK,IAAI,CAAC;AAClC,gBAAM,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AAChG,gBAAM,IAAI,QAAQ,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI;AACjG,eAAK,KAAK,CAAC,GAAG,GAAG,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QAC5C;AAAA,MACF;AACF,eAAW,KAAK,QAAQ,MAAM,IAAI,GAAG;AACnC,UAAI,CAAC,YAAY,GAAG,MAAM,EAAG;AAC7B,UAAI,MAAM,KAAK,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAG;AACvC,UAAI,YAAY,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,aAAa,IAAI,CAAC,KAAK,SAAS,GAAG,CAAC,CAAC,EAAG;AAC3E,UAAI,UAAU,KAAK,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAG;AAC3C,UAAI,KAAK,MAAM;AACb,YAAI,EAAE,KAAK,WAAW,KAAK,QAAQ,CAAC,GAAI,QAAO;AAC/C;AAAA,MACF;AACA,UAAI,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,YAAY,KAAK,SAAS,GAAG,UAAU,EAAE,IAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,SAAS,CAAC,CAAC,EAAG;AAChK,UAAI,KAAK,WAAW,KAAK,QAAQ,CAAC,EAAG;AACrC,UAAI,CAAC,UAAU,KAAK,WAAW,OAAO,IAAI,GAAG,UAAU,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAAG;AAC3E,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,CAAC,OAAe,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1G,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAC,MAAM;AACjB,gBAAU;AACV,iBAAW,KAAK,OAAO,KAAK,SAAS,EAAG,QAAO,UAAU,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,YAAY,MAAY,OAAqB,KAAuB;AAC3E,MAAI,CAAC,KAAK,IAAK;AACf,QAAM,YAAY,CAAC,MAAY,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACvH,QAAM,cAAc,CAAC,GAAS,MAAc,GAAS,OAAe,MAAc;AAChF,UAAM,IAAI,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG;AAAA,MACrC,IAAI,EAAE,KAAK,aAAa,QAAQ,aAAa,MAAM;AAAA,MACnD,MAAM,YAAY,QAAQ,aAAa,MAAM;AAAA,MAC7C,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,MACjB,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,MACjB,GAAG;AAAA,MACH,SAAS,UAAU,CAAC;AAAA,MACpB;AAAA,MACA,MAAM,EAAE;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AACD,WAAO,IAAI,IAAI,CAAC;AAAA,EAClB;AACA,aAAW,KAAK,KAAK,OAAO;AAC1B,MAAE,MAAM,QAAQ,CAAC,GAAG,MAAM,YAAY,GAAG,EAAE,QAAkB,GAAG,GAAG,CAAC,CAAC;AACrE,QAAI,IAAI;AACR,UAAM,OAAO,CAAC,MACZ,EAAE,MACC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAS,EAC3G,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,EACpD,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;AAC5C,eAAW,QAAQ,iBAAiB;AAClC,YAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,KAAK,QAAQ;AACpF,UAAI,KAAK,OAAO;AACd,YAAI,SAAS,UAAU,EAAE,WAAW,KAAK,cAAc;AACrD,gBAAM,IAAI,SAAS,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,GAAI,EAAE,GAAY,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAI,EAAE,GAAY,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAI,EAAE,GAAY,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAI,EAAE,GAAY,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC;AACxM,gBAAM,IAAI,KAAK,QAAQ,GAAW,KAAK,OAAO,CAAC;AAC/C,cAAI,EAAG,aAAY,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG;AAAA,QAC9C;AAAA,MACF,OAAO;AACL,mBAAW,KAAK,UAAU;AACxB,gBAAM,IAAI,KAAK,QAAQ,EAAE,IAAY,KAAK,OAAO,CAAC;AAClD,cAAI,EAAG,aAAY,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,eAAe,MAAY,OAAqB,MAAyC;AACvG,QAAM,MAAM,uBAAuB,MAAM,KAAK;AAC9C,QAAM,MAAM,UAAU,MAAM,OAAO,KAAK;AACxC,aAAW,QAAQ,OAAQ,MAAK,IAAI,EAAE,MAAM,OAAO,MAAM,KAAK,KAAK,KAAK,cAAc,SAAS,SAAS,UAAU,eAAe,CAAC;AAClI,cAAY,MAAM,OAAO,GAAG;AAC5B,SAAO;AACT;;;ACrNA,IAAM,UAA2C,CAAC;AAG3C,SAAS,eAAe,MAAc,OAA8B;AACzE,QAAM,MAAO,QAAQ,IAAI,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC/C,aAAW,MAAM,OAAO,KAAK,KAAK,EAAkB,KAAI,EAAE,IAAI,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC;AACtG;AAEO,IAAM,cAAc,MAAgB,OAAO,KAAK,OAAO;AAGvD,SAAS,UAAU,IAAe,KAAa,SAAS,MAAM,MAAgD;AACnH,QAAM,MAAM,QAAQ,MAAM,IAAI,EAAE,IAAI,GAAG,KAAK,QAAQ,KAAK,EAAE,IAAI,GAAG,KAAK;AACvE,SAAO,OAAO,IAAI,QAAQ,cAAc,CAAC,GAAG,MAAO,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,IAAI,CAAE,IAAI;AACzF;;;ACfA,IAAM,QAAiC,CAAC;AACxC,IAAM,oBAAoB,oBAAI,IAAY;AAGnC,SAAS,WAAW,MAAwB;AACjD,MAAI,CAAC,QAAQ,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,4BAA4B;AACnE,QAAM,KAAK,EAAE,IAAI;AACjB,SAAO;AACT;AACO,IAAM,UAAU,CAAC,OAAoC,MAAM,EAAE;AAC7D,IAAM,YAAY,MAAiB,OAAO,OAAO,KAAK;AAGtD,SAAS,2BAA2B,OAAuB;AAChE,aAAW,KAAK,MAAO,mBAAkB,IAAI,CAAC;AAChD;AAEO,SAAS,YAAY,GAAiD;AAC3E,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,mBAAmB,CAAC;AAChD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAAC,KAAkB,QAAkC,IAAI,WAAW,IAAI,SAAS,EAAE,IAAI,IAAI,UAAU,CAAC,GAAG;AAGlI,IAAM,QAAQ,CAAC,QAA6B,IAAI,OAAO;AAG9D,SAAS,QAAQ,MAAY;AAC3B,QAAM,SAA2D,KAAK;AACtE,QAAM,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC;AACpE,QAAM,SAAS,KAAK,eAAe,OAAO,KAAK,cAAc,OAAO;AACpE,QAAM,SAAiD,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,MAAY,EAAE,SAAS,CAAC;AACzG,QAAM,OAAO,CAAC,MAAY,EAAE,MAAM,OAAO,CAAC,GAAW,MAAgB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;AACzG,QAAM,YAAY,KAAK,IAAI,KAAK;AAChC,QAAM,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC;AACnD,SAAO,EAAE,SAAS,QAAQ,QAAQ,GAAG,GAAG,GAAG,WAAW,MAAM;AAC9D;AAMO,SAAS,SAAS,QAA0B,KAAW,MAA6B;AACzF,QAAM,OAAO,YAAY,MAAM;AAC/B,QAAM,MAAuB,CAAC;AAC9B,QAAM,IAAI,QAAQ,IAAI;AACtB,QAAM,MAAM,KAAK,OAAO;AACxB,MAAI,CAAC,KAAK,YAAY,SAAS,GAAG,EAAG,KAAI,KAAK,EAAE,MAAM,OAAO,QAAQ,KAAK,OAAO,KAAK,YAAY,KAAK,GAAG,EAAE,CAAC;AAC7G,MAAI,EAAE,UAAU,KAAK,UAAW,KAAI,KAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,SAAS,OAAO,KAAK,UAAU,CAAC;AACrG,MAAI,EAAE,SAAS,KAAK,YAAY,KAAM,KAAI,KAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,QAAQ,OAAO,KAAK,UAAU,CAAC;AAC1G,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AAC7B,QAAM,QAAQ,GAAG,KAAK,EAAE;AACxB,QAAM,QAAQ,GAAG,KAAK,EAAE;AACxB,QAAM,OAAO,QAAQ;AACrB,QAAM,QAAkB,KAAK,cAAc,CAAC;AAC5C,QAAM,QAAQ,CAAC,MAAM,SAAS,MAAM,IAAI,WAAW,IAAI,SAAS,MAAM,MAAM,SAAS,OAAO,IAAI,WAAW,IAAI,SAAS,KAAK;AAC7H,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,QAAQ,MAAM,CAAC;AACrB,MAAI,IAAI,UAAU,KAAK,SAAS,QAAQ,KAAM,KAAI,KAAK,EAAE,MAAM,iBAAiB,QAAQ,IAAI,SAAS,OAAO,KAAK,SAAS,MAAM,CAAC;AACjI,MAAI,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,SAAS,OAAO,KAAM,KAAI,KAAK,EAAE,MAAM,gBAAgB,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,KAAK,CAAC;AAClJ,MAAI,IAAI,WAAW,KAAK,SAAS,OAAO,KAAM,KAAI,KAAK,EAAE,MAAM,gBAAgB,QAAQ,IAAI,UAAU,OAAO,KAAK,SAAS,KAAK,CAAC;AAChI,MAAI,OAAO,KAAK,SAAS,KAAM,KAAI,KAAK,EAAE,MAAM,WAAW,QAAQ,GAAG,IAAI,GAAG,OAAO,KAAK,OAAO,CAAC;AACjG,MAAI,QAAQ,KAAK,cAAc,KAAM,KAAI,KAAK,EAAE,MAAM,gBAAgB,QAAQ,OAAO,OAAO,KAAK,YAAY,CAAC;AAC9G,QAAM,SAAS,EAAE;AACjB,QAAM,WAAW,SAAS;AAC1B,MAAI,WAAW,KAAK,cAAc,KAAM,KAAI,KAAK,EAAE,MAAM,YAAY,QAAQ,GAAG,QAAQ,GAAG,OAAO,KAAK,YAAY,CAAC;AACpH,QAAM,MAAM,EAAE,QAAQ;AACtB,MAAI,MAAM,KAAK,SAAS,KAAM,KAAI,KAAK,EAAE,MAAM,OAAO,QAAQ,GAAG,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC;AAC3F,MAAI,YAAY;AAChB,aAAW,KAAK,IAAI,MAAiB,KAAI,kBAAkB,IAAI,EAAE,MAAM,EAAG,YAAW,KAAK,EAAE,MAAqB,eAAc,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AACzJ,QAAM,eAAe,YAAY;AACjC,MAAI,eAAe,KAAK,eAAe,KAAM,KAAI,KAAK,EAAE,MAAM,aAAa,QAAQ,GAAG,YAAY,GAAG,OAAO,KAAK,aAAa,CAAC;AAC/H,SAAO;AACT;AAGO,SAAS,mBAAmB,KAAkB,IAAsB,MAAe,aAAiD;AACzI,MAAI,IAAI,aAAa;AAEnB,UAAMC,YAAW,IAAI,UAAU,IAAI,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW;AACxE,UAAMC,WAAU,GAAG,SAAS;AAC5B,UAAMC,SAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,KAAK,MAAM,KAAK,YAAYF,WAAU,IAAI,CAAC,CAAC;AAC/F,QAAIC,YAAWC,OAAO,QAAO;AAC7B,gBAAY,KAAK,EAAE,OAAO,SAAS,MAAMD,UAAS,IAAIC,QAAO,QAAQD,WAAU,KAAK,YAAY,eAAe,aAAa,CAAC;AAC7H,WAAO,OAAO,OAAO,CAAC,GAAG,IAAI,EAAE,OAAOC,OAAM,CAAC;AAAA,EAC/C;AACA,MAAI,CAAC,IAAI,cAAc,CAAC,IAAI,SAAU,QAAO;AAC7C,QAAM,UAAU,iBAAiB,KAAK,EAAE;AACxC,QAAM,SAAS,IAAI,SAAS,EAAE;AAC9B,QAAM,UAAU,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,OAAO,GAAG,CAAC,KAAK;AACtE,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,YAAY,UAAU,IAAI,CAAC;AACxE,QAAM,QAAQ,KAAK,IAAI,IAAI,WAAW,CAAC,GAAG,KAAK,IAAI,KAAK,WAAW,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;AAC/F,MAAI,WAAW,MAAO,QAAO;AAC7B,cAAY,KAAK,EAAE,OAAO,UAAU,MAAM,SAAS,IAAI,OAAO,QAAQ,UAAU,KAAK,YAAY,eAAe,aAAa,CAAC;AAC9H,SAAO,OAAO,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,MAAM,CAAC;AAChD;AAGO,SAAS,eAAe,KAAW,MAAe,aAA+B,aAAuB,CAAC,GAAS;AACvH,QAAM,QAAQ,CAAC,OAAe,KAAa,KAAa,WAAmB;AACzE,QAAI,IAAI,GAAG,IAAI,KAAK;AAClB,kBAAY,KAAK,EAAE,OAAO,MAAM,IAAI,GAAG,GAAG,IAAI,KAAK,OAAO,CAAC;AAC3D,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EACF;AACA,QAAM,gBAAgB,gBAAgB,KAAK,SAAS,OAAO,eAAe;AAC1E,MAAI,CAAC,WAAW,SAAS,MAAM,EAAG,OAAM,cAAc,cAAc,KAAK,SAAS,MAAM,cAAc;AACtG,MAAI,CAAC,WAAW,SAAS,OAAO,EAAG,OAAM,eAAe,eAAe,KAAK,SAAS,MAAM,cAAc;AACzG,QAAM,iBAAiB,iBAAiB,KAAK,SAAS,MAAM,cAAc;AAC5E;AAKA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,YAAY,WAAW,CAAC;AAM7D,SAAS,oBAAoB,KAAW,OAAe,MAAe,aAAqC;AAChH,QAAM,SAAS,CAAC,GAAG,iBAAiB,EAAE,CAAC;AACvC,MAAI,CAAC,OAAQ;AACb,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AAC7B,QAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,QAAM,aAAa,CAAC,MAAa,EAAE,MAAqB,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;AAC7G,MAAI,YAAY,MAAM,OAAO,CAAC,MAAM,kBAAkB,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC;AAC1G,MAAI,YAAY,QAAQ,KAAK,aAAc;AAC3C,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,iBAAiB,IAAI,EAAE,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;AACrJ,aAAW,KAAK,YAAY;AAC1B,QAAI,YAAY,QAAQ,KAAK,aAAc;AAC3C,gBAAY,KAAK,EAAE,OAAO,YAAY,EAAE,IAAI,MAAM,EAAE,QAAQ,IAAI,QAAQ,QAAQ,gBAAgB,CAAC;AACjG,MAAE,SAAS;AACX,iBAAa,WAAW,CAAC;AAAA,EAC3B;AACF;;;ACzIO,IAAM,WAAW,CAAC,KAAkB,OAAuC,IAAI,WAAW,IAAI,SAAS,MAAM,CAAC,CAAC,IAAK,IAAI;AAExH,SAAS,UAAU,KAAkB,GAAuB,GAAuB,IAAuB;AAC/G,QAAM,IAAI,IAAI,WAAW,IAAI,SAAS,MAAM,CAAC,CAAC,IAAI,IAAI;AACtD,QAAM,KAAK,IAAI,aAAa,IAAI,WAAW,MAAM,CAAC,CAAC,IAAI,IAAI;AAC3D,QAAM,KAAK,KAAK,OAAO,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrD,QAAM,KAAK,KAAK,OAAO,GAAG,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrD,SAAO,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AAChC;AAOO,SAAS,UAAU,KAAkB,KAAyB,KAAyB,MAAyB,KAAmB,CAAC,GAAS;AAClJ,QAAM,KAAK,QAAQ,CAAC;AACpB,QAAM,EAAE,GAAG,EAAE,IAAI,UAAU,KAAK,KAAK,KAAK,EAAE;AAC5C,QAAM,UAAU,eAAe,GAAG,UAAU,OAAO,IAAI,UAAU,aAAa,IAAI,MAAM,EAAE,IAAI,IAAI,UAAU,QAAQ;AACpH,QAAM,aAAa,SAAS,KAAK,EAAE;AACnC,QAAM,QAAQ,QAAQ,OAAO;AAC7B,QAAM,OAAa,EAAE,GAAG,GAAG,KAAK,WAAW,YAAY,OAAO,SAAS,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,MAAM,WAAW,CAAC,EAAE;AAC3L,aAAW,QAAQ,CAAC,GAAG,eAAe;AACpC,UAAM,cAAc,IAAI,cAAc,GAAG,SAAS,IAAI,aAAa;AACnE,SAAK,OAAO,KAAK;AAAA,MACf,OAAO;AAAA,MACP,MAAM,IAAI,cAAc,YAAY,EAAE;AAAA,MACtC,QAAQ,IAAI,cAAc,cAAc;AAAA,MACxC,IAAI,IAAI,eAAe,cAAc,KAAK,EAAE,UAAU,aAAa,EAAE;AAAA,MACrE,SAAS,EAAE;AAAA,IACb,CAAC;AACD,SAAK,UAAU,UAAU,IAAI,EAAE,aAAa,CAAC;AAC7C,UAAM,OAAO,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AACtE,eAAW,KAAK,MAAM;AACpB,UAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAG,OAAM,IAAI,MAAM,qBAAqB,EAAE,EAAE;AACpF,WAAK,MAAM,KAAK,CAAC;AAAA,IACnB;AACA,UAAM,OAA6B,CAAC;AACpC,eAAW,KAAK,KAAM,MAAK,EAAE,EAAE,IAAI;AACnC,UAAM,aAAqB,CAAC;AAC3B,KAAC,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,MAAM;AAC5C,YAAM,IAAI,KAAK,GAAG,CAAC;AACnB,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,qCAAqC,GAAG,CAAC;AACjE,UAAI;AACJ,UAAI,GAAG,MAAM,UAAW,QAAO,aAAa,GAAG,GAAG,MAAgB,GAAG,GAAG,GAAG,EAAE;AAAA,WACxE;AACH,cAAM,IAAI,KAAK,GAAG,CAAC;AACnB,YAAI,CAAC,EAAG,OAAM,IAAI,MAAM,qCAAqC,GAAG,CAAC;AACjE,eAAO,WAAW,GAAG,GAAG,GAAG,EAAE;AAAA,MAC/B;AACA,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,0BAA0B,GAAG,IAAI,QAAQ,GAAG,CAAC;AACxE,YAAM,QAAQ,GAAG;AACjB,YAAM,SAAS,QAAQ,IAAI;AAC3B,UAAI,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAM,OAAM,IAAI,MAAM,kCAAkC,GAAG,IAAI,QAAQ,GAAG,CAAC;AAC3G,YAAM,IAAI,MAAM,GAAG,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM;AACnG,YAAM,WAAW,GAAG,MAAM;AAC1B,YAAM,OAAO,YAAY,GAAG,QAAQ,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAClE,YAAM,IAAI,KAAK,SAAS,MAAM,IAAI,KAAK;AACvC,YAAM,IAAI,KAAK,SAAS,MAAM,KAAK,MAAM;AACzC,iBAAW,KAAK;AAAA,QACd,IAAI,MAAM,aAAa,MAAM;AAAA,QAC7B,OAAO;AAAA,QACP,GAAG,GAAG,CAAC;AAAA,QACP,GAAG,GAAG,CAAC;AAAA,QACP,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,IAAI,GAAG,CAAC;AAAA,QACR;AAAA,QACA,GAAG,GAAG;AAAA,QACN,GAAG,GAAG;AAAA,QACN,SAAS,GAAG,WAAW,GAAG;AAAA,QAC1B;AAAA,QACA,MAAM,GAAG,QAAQ;AAAA,QACjB,QAAQ,YAAY,GAAG,QAAQ,IAAI,QAAQ,MAAM,IAAI;AAAA,QACrD,OAAO,GAAG,QAAQ,UAAU,QAAQ,MAAM,WAAW;AAAA,QACrD,OAAO;AAAA,QACP,OAAO,aAAa,GAAG,GAAG,KAAK,MAAM,OAAO,aAAa,OAAO,IAAI,CAAC;AAAA,MACvE,CAAC;AAAA,IACH,CAAC;AACD,SAAK,MAAM,KAAK,GAAG,UAAU;AAC7B,UAAM,aAAqB,CAAC;AAC3B,KAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,cAAc;AAClD,YAAM,IAAI,KAAK,UAAU,IAAI;AAC7B,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,uCAAuC,UAAU,IAAI;AAC7E,YAAM,OAAO,aAAa,GAAG,UAAU,MAAM,GAAG,GAAG,UAAU,EAAE;AAC/D,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,UAAU;AACxB,YAAM,KAAK,KAAK,KAAK,QAAQ,IAAI;AACjC,YAAM,KAAK,KAAK,KAAK,QAAQ,IAAI;AACjC,UAAI,KAAK,KAAK,IAAK;AACnB,YAAM,UAAU,UAAU,IAAI,MAAM,KAAK,EAAE,QAAQ,UAAU,EAAE,GAAG,CAAC,GAAG,MAAM,KAAK,MAAO,KAAK,KAAK,KAAK,OAAO,IAAI,MAAO,UAAU,IAAK,EAAE,IAAI,CAAC,UAAU,EAAY;AACrK,iBAAW,MAAM,SAAS;AACxB,cAAM,IAAI,MAAM,IAAI,IAAI,EAAE;AAC1B,cAAM,IAAI,KAAK,SAAS,MAAM,IAAI,KAAK;AACvC,cAAM,IAAI,KAAK,SAAS,MAAM,KAAK,MAAM;AACzC,YAAI,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,GAAG,EAAE,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,SAAS,IAAI,IAAI,EAAG;AAC9H,YAAI,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,GAAG,EAAE,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,SAAS,IAAI,GAAG,EAAG;AAC7H,mBAAW,KAAK;AAAA,UACd,IAAI,MAAM,aAAa,MAAM,WAAW;AAAA,UACxC,OAAO;AAAA,UACP,GAAG,GAAG,CAAC;AAAA,UACP,GAAG,GAAG,CAAC;AAAA,UACP,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,IAAI,GAAG,CAAC;AAAA,UACR;AAAA,UACA,IAAI,UAAU,MAAM;AAAA,UACpB,IAAI,UAAU,MAAM;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,SAAK,QAAQ,KAAK,GAAG,UAAU;AAC/B,SAAK,MAAM,KAAK,GAAG,WAAW,MAAM,YAAY,EAAE,aAAa,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,EACtI,CAAC;AACD,WAAS,MAAM,KAAK,GAAG,GAAG,IAAI,OAAO,SAAS,EAAE;AAChD,SAAO;AACT;AAGA,SAAS,SAAS,MAAY,KAAkB,GAAW,GAAW,IAAsB,OAAiB,SAAiB,IAAkB;AAC9I,QAAM,OAAO,GAAG,QAAQ,OAAO,IAAI,GAAG;AACtC,QAAM,UAAU,UAAU,MAAM,OAAO,MAAM;AAC7C,QAAM,cAAc,MAAM;AAC1B,QAAMC,WAAU,MAAM;AACtB,QAAM,QAAQA,SAAQ,KAAK,MAAM,QAAQ,IAAIA,SAAQ,MAAM,CAAC;AAC5D,QAAM,QAAQ,IAAI,UAAU,CAAC;AAC7B,OAAK,SAAS;AAAA,IACZ,OAAO;AAAA,IACP,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,EAAE;AAAA,IACvC,QAAQ,aAAa,SAAS,YAAY,MAAM;AAAA,IAChD,SAAS,QAAQ,IAAI,YAAY;AAAA,IACjC,MAAM,aAAa,SAAS,YAAY,IAAI;AAAA,IAC5C,SAAS,CAAC,CAAC,MAAM;AAAA,IACjB,SAAS,CAAC,CAAC,MAAM;AAAA,IACjB,WAAW,CAAC,CAAC,MAAM;AAAA,IACnB,QAAQ,KAAK,UAAU;AAAA,EACzB;AACA,MAAI,IAAI,YAAa,KAAI,YAAY,KAAK,QAAQ,SAAS,GAAG,GAAG,EAAE;AACnE,MAAI,KAAK,UAAU,SAAS,KAAK,KAAK,OAAO,SAAS,eAAgB,MAAK,OAAO,OAAO;AACzF,MAAI,CAAC,IAAI,IAAK;AACd,QAAM,MAAiB,IAAI,IAAI,GAAG,GAAG,OAAO,EAAE;AAC9C,MAAI,GAAG,KAAM,gBAAe,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,GAAG,IAAI,UAAU;AAC9E,QAAM,OAAO,UAAU,MAAM,OAAO,GAAG;AACvC,QAAM,UAAU,IAAI;AACpB,QAAM,UAAU,IAAI;AACpB,QAAM,UAAU,IAAI;AACpB,QAAM,YAAY,IAAI;AACtB,QAAM,MAAY;AAAA,IAChB,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,IAAI,SAAS;AAAA,IACrD;AAAA,IACA,UAAU,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IAC1C,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO,CAAC;AAAA,IACR,WAAW,CAAC;AAAA,IACZ,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,MAAM,CAAC,CAAC,IAAI;AAAA,EACd;AACA,QAAMC,SAAgB,CAAC;AACvB,QAAM,OAAO,OAAO,OAAO,EAAE,QAAQ,UAAU,UAAU,YAAY,SAAS,WAAW,UAAU,YAAY,GAAG,IAAI,aAAa,CAAC,CAAC;AACrI,QAAM,UAAU,CAAC,IAAY,MAAc,OAAe,OAAe,YACvEA,OAAM,KAAK,OAAO,OAAO,cAAc,EAAE,IAAI,MAAM,OAAO,MAAM,MAAM,CAAC,GAAG,OAAO,MAAM,MAAM,CAAC,GAAG,SAAS,SAAS,KAAK,GAAG,EAAE,GAAG,EAAE,OAAO,IAAI,SAAS,KAAK,CAAC,CAAC;AAC/J,MAAI,UAAU,GAAG;AACf,QAAI,QAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;AACzD,QAAI,IAAI,SAAS;AACf,YAAM,UAAW,IAAI,OAAgB;AACrC,YAAM,KAAK,IAAI,QAAQ;AACvB,YAAM,KAAK,KAAK,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC;AAC9C,YAAM,KAAK,KAAK,IAAI,IAAI,SAAS,UAAU,KAAK,CAAC;AACjD,cAAQ,CAAC;AACT,UAAI,KAAK,UAAU,IAAK,OAAM,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC;AAC9D,UAAI,IAAI,UAAU,KAAK,IAAK,OAAM,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;AACrE,cAAQ,WAAW,WAAW,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;AAC9E,UAAI,CAAC,MAAM,OAAQ,SAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;AAAA,IAC5D;AACA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE;AAChD,YAAQ,UAAU,UAAU,UAAU,OAAO,KAAK,MAAM;AAAA,EAC1D;AACA,MAAI,YAAY,KAAK,IAAI,WAAW;AAClC,eAAW,KAAK,IAAI,UAAW,SAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,WAAW,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO;AAAA,EACrJ,WAAW,YAAY,EAAG,SAAQ,YAAY,YAAY,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,SAAS,IAAI,SAAS,CAAC,GAAG,KAAK,QAAQ;AAChI,MAAI,UAAU,IAAK,SAAQ,aAAa,aAAa,aAAa,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ;AACtG,MAAI,UAAU,IAAK,SAAQ,cAAc,aAAa,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,GAAG,KAAK,QAAQ;AAC3G,QAAM,QAAgB,CAAC;AACvB,QAAM,UAAU,CAAC,MAAc,OAAe,GAAW,GAAW,OAAe,MAAc,aAA6B;AAC5H,UAAM,IAAU;AAAA,MACd,IAAI,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,GAAG,GAAG,CAAC;AAAA,MACP,GAAG,GAAG,CAAC;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,SAAS,eAAe,MAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,GAAG;AAAA,MACzE;AAAA,MACA,IAAI,YAAY;AAAA,MAChB,UAAU;AAAA,IACZ;AACA,MAAE,QAAQ,aAAa,GAAG,GAAG,KAAK,OAAO,aAAa,OAAO,SAAS,eAAe,QAAQ,CAAC,CAAC;AAC/F,UAAM,KAAK,CAAC;AACZ,WAAO;AAAA,EACT;AACA,MAAI,IAAI,cAAc,UAAU,EAAG,SAAQ,cAAc,cAAc,IAAI,WAAW,GAAG,CAAC,SAAS,GAAK,SAAS,MAAM;AACvH,MAAI,IAAI,UAAU,UAAU,EAAG,SAAQ,UAAU,aAAa,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,IAAI,OAAO,OAAO,SAAS,IAAI,OAAO,EAAE;AACxJ,MAAI,IAAI,MAAO,SAAQ,SAAS,WAAW,IAAI,MAAM,GAAG,IAAI,WAAW,IAAI,MAAM,OAAO,QAAQ,WAAW;AAC3G,OAAK,QAAQ;AACb,MAAI,QAAQ;AACZ,QAAM,QAAgB,CAAC;AACvB,QAAM,SAAS,CAAC,GAAW,SAAiB,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,EAAE,SAAS,IAAI;AAC7G,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,gBAAgB,IAAI,YAAY;AAC7C,YAAM,KAAK,OAAO,IAAI,WAAW,GAAG,IAAI,WAAW,IAAI;AACvD,UAAI,CAAC,GAAI;AACT,YAAM,QAAQ,EAAE;AAChB,YAAM,KAAK,GAAG;AACd,YAAM,KAAK,CAAC,UAAU;AACtB,YAAM,IAAI;AACV,YAAM,IAAI,IAAI;AACd,YAAM,KAAa,CAAC;AACpB,UAAI,KAAK,IAAI,QAAQ,EAAE,IAAI,KAAM,IAAG,KAAK,CAAC,KAAK,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC;AAAA,WACjE;AACH,WAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,SAAS,QAAQ,GAAG,KAAK,CAAC,CAAC;AAChD,WAAG,KAAK,CAAC,KAAK,IAAI,OAAO,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;AAC1E,WAAG,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAAA,MACrC;AACA,YAAM,KAAK,EAAE,IAAI,mBAAmB,MAAM,cAAc,MAAM,EAAE,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAAA,IACzL,WAAW,EAAE,SAAS,YAAY,EAAE,OAAO,gBAAgB;AACzD,YAAM,KAAK,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,SAAS,GAAG;AACjH,UAAI,CAAC,GAAI;AACT,YAAM,KAAK,KAAK,IAAI,EAAE,OAAO,GAAG,KAAK,IAAI;AACzC,YAAM,KAAK,EAAE,IAAI,eAAe,MAAM,WAAW,MAAM,EAAE,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,IAClL,WAAW,EAAE,SAAS,SAAS;AAC7B,YAAM,KAAK,OAAO,aAAa,MAAM;AACrC,UAAI,CAAC,GAAI;AACT,YAAM,KAAK,KAAK,IAAI,EAAE,OAAO,GAAG,KAAK,IAAI;AACzC,YAAM,KAAK,EAAE,IAAI,cAAc,MAAM,WAAW,MAAM,EAAE,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,IAAI,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,IAC3L;AAAA,EACF;AACA,OAAK,QAAQ;AACb,MAAI,QAAQ;AACZ,QAAM,WAAW,CAAC,SAAwE;AACxF,UAAM,OAAO,aAAa,MAAM,KAAK,IAAI;AACzC,UAAM,MAAM,SAAS,YAAY,SAAS,aAAa,MAAM,KAAK,GAAG;AACrE,UAAM,aAAa,SAAS,YAAY,MAAM,SAAS,UAAU,IAAM,MAAM;AAC7E,WAAO,EAAE,MAAM,UAAU,SAAS,SAAS,UAAU,SAAS,UAAU,cAAc,QAAQ,QAAQ,YAAY,KAAK,aAAa,GAAG,aAAa,iBAAiB,GAAG,CAAC,GAAG,WAAW,eAAe;AAAA,EACxM;AACA,QAAM,IAA0B,EAAE,OAAO,SAAS,MAAM,KAAK,GAAG,MAAM,SAAS,MAAM,QAAQ,GAAG,OAAO,SAAS,MAAM,QAAQ,GAAG,MAAM,SAAS,MAAM,IAAI,EAAE;AAC5J,QAAM,MAAM,CAAC,MAAc,IAAY,IAAY,IAAY,OAAe;AAC5E,QAAI,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,KAAM;AAClD,QAAI,UAAU,KAAK,OAAO,OAAO,EAAE,IAAI,MAAM,IAAI,UAAU,QAAQ,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,EACrI;AACA,QAAM,SAAS,CAAC,MAAc,IAAY,IAAY,MAAc,OAAe;AACjF,QAAI,SAA6B,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,eAAW,KAAK,IAAI;AAClB,YAAM,KAAK,EAAE,IAAI,EAAE,QAAQ;AAC3B,YAAM,KAAK,EAAE,IAAI,EAAE,QAAQ;AAC3B,YAAM,IAAwB,CAAC;AAC/B,iBAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,YAAI,MAAM,KAAK,MAAM,GAAG;AACtB,YAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACb;AAAA,QACF;AACA,YAAI,KAAK,EAAG,GAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AAC1B,YAAI,KAAK,EAAG,GAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAAA,MAC5B;AACA,eAAS;AAAA,IACX;AACA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAQ,KAAI,MAAM,GAAG,MAAM,GAAG,IAAI;AAAA,EACzD;AACA,MAAI,UAAU;AACZ,WAAO,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AAC1F,SAAO,QAAQ,CAAC,SAAS,IAAI,SAAS,IAAI,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAC3F,QAAM,KAAK,UAAU,IAAI,CAAC,UAAU;AACpC,MAAI,UAAU,IAAK,KAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,SAAS;AAAA,WAC3D,YAAY,EAAG,KAAI,QAAQ,GAAG,GAAG,GAAG,IAAI,SAAS;AAC1D,MAAI,UAAU,IAAK,KAAI,SAAS,IAAI,SAAS,IAAI,IAAI,SAAS,IAAI,SAAS;AAAA,WAClE,YAAY,EAAG,KAAI,SAAS,GAAG,GAAG,GAAG,IAAI,SAAS;AAC3D,aAAW,KAAKA,OAAO,GAAE,UAAU,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,KAAK,aAAa,MAAM,MAAM,QAAQ,EAAE,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;AACzJ,MAAI,GAAG,KAAM,qBAAoB,KAAKA,QAAO,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC;AAC1E,OAAK,QAAQA;AACb,MAAI,QAAQA;AACZ,OAAK,MAAM;AACb;;;AC9RO,IAAM,kBAAkB;AACxB,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAEzC,IAAM,UAAU,CAAC,aAAa,iBAAiB,uBAAuB,OAAO;AAC7E,IAAM,kBAAoD,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,eAAe,CAAC,KAAK,GAAG,GAAG,qBAAqB,CAAC,KAAK,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,EAAE;AAGzJ,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAwC7B,IAAM,WAAW,CAAC,GAAW,GAAW,MAAsB;AACnE,OAAM,IAAI,MAAO,OAAO;AACxB,MAAI,MAAM,GAAG,GAAG,CAAC;AACjB,MAAI,MAAM,GAAG,GAAG,CAAC;AACjB,QAAM,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;AAC/B,QAAM,IAAI,CAAC,MAAc;AACvB,UAAM,KAAK,IAAI,IAAI,MAAM;AACzB,WAAO,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;AAAA,EACvD;AACA,SAAQ,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG,KAAK,KAAO,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG,KAAK,IAAK,KAAK,MAAM,EAAE,CAAC,IAAI,GAAG;AAC/F;AACO,IAAM,WAAW,CAAC,MAAmB;AAC1C,QAAM,KAAM,KAAK,KAAM,OAAO;AAC9B,QAAM,KAAM,KAAK,IAAK,OAAO;AAC7B,QAAM,KAAK,IAAI,OAAO;AACtB,QAAM,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC;AAC3B,QAAM,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC;AAC3B,QAAM,KAAK,KAAK,MAAM;AACtB,QAAM,IAAI,KAAK;AACf,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,MAAM;AACZ,QAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC;AAC/B,QAAI,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAC1F,SAAK;AAAA,EACP;AACA,SAAO,EAAE,GAAG,GAAG,EAAE;AACnB;AAEO,IAAM,QAAQ,CAAC,MAAsB;AAC1C,QAAM,SAAS,CAAC,OAAgB,KAAK,QAAQ,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AACpG,QAAM,IAAI,SAAS,OAAQ,KAAK,KAAM,GAAG,IAAI,SAAS,OAAQ,KAAK,IAAK,GAAG,IAAI,SAAS,OAAO,IAAI,GAAG;AACtG,SAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC,IAAI,KAAM,IAAI,QAAS;AACnE;AACO,IAAM,YAAY,CAAC,MAAsB,OAAO,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAUrF,SAAS,QAAQ,GAA6B;AACnD,QAAM,MAAM,KAAK,CAAC;AAClB,MAAI,QAAQ,eAAe,IAAI,SAAS,QAAQ;AAChD,MAAI,CAAC,eAAe,KAAK,EAAG,SAAQ,eAAe,MAAM,QAAQ,OAAO,KAAK,cAAc,EAAE,CAAC;AAC9F,QAAM,MAAM,eAAe,KAAK;AAChC,QAAM,QAAQ,IAAI,SAAS;AAC3B,QAAM,OAAO,IAAI,QAAQ,OAAO,IAAI,IAAI;AACxC,QAAM,MAAM,UAAU,MAAM,OAAO,iBAAiB,IAAI,WAAW,MAAM;AACzE,QAAM,QAAQ,IAAI;AAClB,QAAM,OAAO,MAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC;AACnD,QAAM,SAAS,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAC5C,QAAM,UAAU,gBAAgB,MAAM;AACtC,QAAM,MAAM,CAAC,GAAW,MAAc,KAAK,IAAI,IAAI,OAAO;AAC1D,QAAM,MAAM,CAAC,GAAW,GAAW,OAAoB,EAAE,IAAK,IAAI,MAAO,OAAO,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE;AAC1H,QAAM,KAAK,KAAK,CAAC;AACjB,QAAM,KAAK,KAAK,QAAQ,CAAC;AACzB,QAAM,KAAK,KAAK,QAAQ,CAAC;AACzB,QAAM,OAAoB,EAAE,KAAK,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI;AAC5D,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,QAAM,IAAyB,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK;AAC5D,QAAM,MAAsB,OAAO,OAAO,EAAE,OAAO,MAAM,UAAU,cAAc,MAAM,aAAa,GAAG,IAAI;AAC3G,aAAW,KAAK,aAAa;AAC3B,UAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG;AAC3B,MAAE,UAAU,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,UAAU,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;AAC/H,UAAM,KAAK,EAAE,SAAS,MAAM;AAC5B,MAAE,WAAW,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,WAAW,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;AAAA,EAC5F;AACA,SAAO,OAAO,GAAG,IAAI,KAAK,MAAM,KAAK,CAAC;AAEtC,gBAAc,KAAK,GAAG,gBAAgB,CAAC;AAEvC,QAAM,SAAS,CAAC,OAAY,KAAU,KAAa,iBAA0B;AAC3E,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAI,KAAK,IAAI,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAK;AACxG,YAAM,OAAO,MAAM,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAChD,UAAI,MAAM,iBAAiB,OAAO,KAAK,KAAK;AAC5C,UAAK,MAAM,KAAK,MAAM,KAAK,QAAU,MAAM,KAAK,MAAM,KAAK,KAAO,OAAM,CAAC;AACzE,YAAM,IAAI,MAAM,MAAM,IAAI,MAAM,OAAO,MAAM,IAAI;AAAA,IACnD;AAAA,EACF;AACA,QAAM,QAAQ,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI;AAC3C,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE,UAAU,CAAC;AACvB,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,QAAI,EAAE,IAAI,IAAK,GAAE,IAAI,KAAK,IAAI,EAAE,GAAG,GAAG;AACtC,QAAI,EAAE,IAAI,gBAAiB,GAAE,IAAI,kBAAkB;AACnD,WAAO,GAAG,GAAG,0BAA0B,GAAG,MAAM,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,EACxF;AACA,QAAM,WAAW,EAAE,oBAAoB,KAAK,EAAE,WAAW,MAAM,CAAC,CAAC;AACjE,QAAM,SAAS,EAAE,gBAAgB;AACjC,SAAO,QAAQ,UAAU,4BAA4B,CAAC;AACtD,SAAO,EAAE,kBAAkB,GAAG,UAAU,4BAA4B,CAAC;AACrE,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE,WAAW,CAAC;AACxB,QAAI,KAAK,IAAI,MAAM,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,MAAM,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;AAC7F,aAAO,GAAG,QAAQ,4BAA4B,GAAG,MAAM,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,EAChH;AACA,QAAM,MAA+B,EAAE,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,MAAM,KAAK,CAAC,GAAG,YAAY,WAAW,SAAS,SAAS,EAAE;AACrI,aAAW,KAAK,OAAO,KAAK,CAAC,EAAG,KAAI,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAExE,QAAM,MAAM,CAAC,MAAc,IAAI,CAAC;AAChC,QAAM,SAAS,CAAC,GAAW,MAAc,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,0BAA0B,KAAK,KAAK,IAAI,MAAM,IAAI,gBAAgB,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,4BAA4B;AAC1L,QAAM,SAAS,CAAC,OAAe,OAA+B;AAC5D,UAAM,IAAI,SAAS,KAAK;AACxB,QAAI,YAA2B;AAC/B,QAAI,KAAK;AACT,aAAS,IAAI,MAAM,KAAK,MAAM,KAAK,MAAO;AACxC,YAAM,IAAI,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC;AAC9B,UAAI,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI;AACnC,aAAK,KAAK,IAAI,IAAI,EAAE,CAAC;AACrB,oBAAY;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,aAAW,KAAK,OAAO;AACrB,QAAI,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,EAAG;AACjD,UAAM,IAAI,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AACtE,QAAI,KAAK,MAAM;AACb,UAAI,WAAW,CAAC,IAAI;AACpB;AAAA,IACF;AAEA,UAAM,IAAI,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,OAAO,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC;AACxE,QAAI,KAAK,KAAM,KAAI,UAAU,CAAC,IAAI;AAAA,EACpC;AACA,SAAO;AACT;;;ACvLA,IAAM,cAAoC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE;AACvG,IAAM,eAAqC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE;AACtG,IAAM,gBAAwC,EAAE,OAAO,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAC3G,IAAM,cAAsC,EAAE,OAAO,SAAS,MAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAGlG,SAAS,WAAW,MAAY,MAAuB;AAC5D,QAAM,OAAO,KAAK,WAAW,KAAK;AAClC,QAAM,MAAM,cAAc,IAAI,KAAK;AACnC,QAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ,UAAU,GAAG;AACvD,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAC7B,MAAI,OAAO,OAAO,YAAY,aAAa,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,QAAQ,MAAM;AACvG,SAAO,KAAK,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3C,aAAW,MAAM,KAAK,WAAW,CAAC,EAAG,QAAO,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1E,aAAW,CAAC,IAAI,EAAE,KAAK,OAAO,QAAQ,KAAK,aAAa,CAAC,CAAC,GAAG;AAC3D,UAAM,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3C,QAAI,IAAI,EAAG;AACX,QAAI,OAAO,KAAM,MAAK,OAAO,GAAG,CAAC;AAAA,QAC5B,MAAK,CAAC,IAAI,OAAO,OAAO,KAAK,CAAC,GAAG,EAAE;AAAA,EAC1C;AACA,OAAK,KAAK,IAAI,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,QAAM,MAAiB,CAAC;AACxB,aAAW,OAAO,MAAM;AACtB,QAAI,SAAS,IAAI;AACjB,QAAI,IAAI,WAAW,UAAU,IAAI,SAAS,MAAO,YAAW,KAAK,CAAC,QAAQ,SAAS,SAAS,MAAM,EAAG,KAAI,KAAK,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,MAAM,GAAG,MAAM,GAAsB,OAAO,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,aAC7M,IAAI,WAAW,YAAY,IAAI,WAAW,MAAO,YAAW,KAAK,CAAC,cAAc,eAAe,aAAa,YAAY,EAAG,KAAI,KAAK,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,OAAO,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,aAC3N,IAAI,WAAW,YAAY,IAAI,KAAK,MAAM;AACjD,YAAM,aAAa,cAAc,MAAM,IAAI;AAC3C,iBAAW,QAAQ,CAAC,IAAI,MAAM,IAAI,KAAK,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,KAAK,OAAO,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,IAC7H,MAAO,KAAI,KAAK,GAAG;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAoB;AAC/C,QAAM,MAAc,CAAC;AACrB,aAAW,QAAQ,KAAK,MAAM,OAAO,KAAK,KAAK,GAAG;AAChD,UAAM,OAAO,WAAW,MAAM,IAAI;AAClC,UAAM,OAA6B,CAAC;AAEpC,UAAM,QAAQ,KAAK,SAAS,WAAW,KAAK,OAAO,QAAQ,CAAC,GAAG,eAAe,aAAa,MAAM,UAAU,CAAC,IAAI,aAAa,MAAM,KAAK,KAAK;AAC7I,eAAW,OAAO,MAAM;AACtB,YAAM,IAAI,YAAY,MAAM,MAAM,KAAK,MAAM,KAAK;AAClD,WAAK,IAAI,EAAE,IAAI;AACf,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,MAAY,MAAY,KAAc,MAA4B,OAAqB;AACjH,QAAM,OAAa;AAAA,IACjB,IAAI,IAAI;AAAA,IACR,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,QAAQ,IAAI;AAAA,IACZ,MAAM,IAAI,QAAQ,IAAI,UAAU;AAAA,IAChC,MAAM,IAAI;AAAA,IACV,OAAO,IAAI;AAAA,IACX,UAAU,CAAC,CAAC,IAAI;AAAA,IAChB,QAAQ,IAAI,WAAW,IAAI,IAAI,UAAU,OAAO,IAAI,IAAI;AAAA,IACxD,WAAW,IAAI,aAAa,OAAO,MAAM,IAAI;AAAA,IAC7C,OAAO,IAAI,UAAU;AAAA,IACrB,OAAO,IAAI,SAAS;AAAA,IACpB,UAAU,IAAI,YAAY;AAAA,IAC1B,IAAI,IAAI,UAAU;AAAA,IAClB,QAAQ,IAAI,UAAU;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,UAAU,CAAC,MAAoB,OAAO,OAAO,MAAM,EAAE,OAAO,OAAO,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,OAAO,KAAK,CAAC;AAC1K,MAAI,IAAI,WAAW,QAAQ,IAAI,WAAW,UAAU;AAClD,UAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,QAAI,CAAC,UAAU,CAAC,OAAO,MAAO,QAAO,QAAQ,gBAAgB;AAC7D,WAAO,OAAO,OAAO,MAAM,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,IAAI,OAAO,IAAI,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,EACxL;AACA,QAAM,OAAO,IAAI;AACjB,QAAM,cAAc,MAAY;AAC9B,UAAM,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC;AAC9B,WAAO,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;AAAA,EAClD,GAAG;AACH,QAAM,WAAW,gBAAgB,MAAM,KAAK,KAAK;AACjD,MAAI,QAAc,CAAC,GAAG,CAAC;AACvB,QAAM,cAAc,CAACC,UAAuB;AAC1C,QAAIA,UAAS,QAAQ;AACnB,UAAI,OAAa;AACjB,UAAI,WAAW;AACf,iBAAW,MAAM,UAAU;AACzB,cAAM,OAAO,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC;AACxD,YAAI,OAAO,UAAU;AACnB,qBAAW;AACX,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI;AAAA,IACnC;AACA,QAAIA,UAAS,UAAU;AACrB,YAAM,IAAI,KAAK,IAAI,MAAgB;AACnC,aAAO,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,CAAC,SAAe,CAAC,MAAM,KAAK,CAAC,MAAM,SAAS,MAAM,GAAG,KAAK,SAAS,WAAW,SAAS,GAAG,CAAC;AACxG,QAAM,OAAe,IAAI,UAAU;AACnC,MAAI,IAAI,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC,CAAC;AACxE,MAAI,IAAI,WAAW,UAAU,IAAI,WAAW,UAAU;AACpD,QAAI,OAAO,IAAI;AACf,QAAI,IAAmB;AACvB,QAAI,MAAY;AAChB,QAAI,IAAI,WAAW,UAAU;AAC3B,YAAM,aAAa,cAAc,MAAM,IAAI;AAC3C,YAAM,WAAW,IAAI,CAAW;AAChC,UAAI,CAAC,IAAK,QAAO,QAAQ,WAAW;AACpC,aAAO,KAAK,UAAU,cAAc,IAAI,IAAI,IAAI,YAAY,IAAI,IAAI;AACpE,YAAM,OAAO,KAAK,MACf,IAAI,KAAK,EACT;AAAA,QACC,CAAC,OACE,IAAI,SAAS,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC,IAAI,SACtG,SAAS,UAAU,GAAG,EAAE,CAAC,GAAG,IAAI,MAAM,MAAM,KAAO,SAAS,WAAW,GAAG,EAAE,CAAC,GAAG,IAAI,MAAM,MAAM,KAAO,SAAS,WAAW,GAAG,EAAE,CAAC,GAAG,IAAI,MAAM,MAAM,KAAO,SAAS,UAAU,GAAG,EAAE,CAAC,GAAG,IAAI,MAAM,MAAM;AAAA,MAC7M;AACF,UAAI,CAAC,KAAM,QAAO,QAAQ,qBAAqB;AAC/C,UAAI;AACJ,UAAI,IAAI,SAAS,MAAM,IAAI,IAAI,IAAI;AAAA,IACrC;AACA,UAAM,IAAI,YAAY,IAAI;AAC1B,QAAI,CAAC,EAAG,QAAO,QAAQ,cAAc;AACrC,UAAM,aAAa,SAAS,WAAW,SAAS;AAChD,UAAM,KAAK,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;AAClC,UAAM,KAAK,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;AAClC,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,SAAS,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAK,QAAO,QAAQ,kBAAkB;AAC7F,UAAM,KAAK,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI;AACpC,UAAM,OAAO,CAAC,OACZ,SAAS,SAAS,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,OAAO,KAAK,EAAE,IAAI,SAAS,UAAU,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,SAAS,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;AAC1N,UAAM,UAAU,KAAK,OAAO,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,EAAE,KAAK,IAAI,SAAS;AACxH,UAAM,KAAK,SAAS,SAAS,EAAE,CAAC,IAAI,SAAS,SAAS,UAAU,EAAE,CAAC,IAAI,SAAS,SAAS,UAAU,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,IAAI;AAC1H,UAAM,KAAK,MAAM,SAAS,KAAK,IAAI,KAAK,EAAE;AAC1C,QAAI,QAAuB;AAC3B,UAAM,QAAQ,CAAC,CAAC;AAChB,QAAI,IAAI,WAAW,SAAU,UAAS,IAAI,GAAG,KAAK,IAAI,IAAK,OAAM,KAAK,GAAG,CAAC,CAAC;AAC3E,eAAW,KAAK,OAAO;AACrB,YAAM,KAAK,KAAK,IAAI;AACpB,UAAI,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,IAAK;AAC9C,UAAI,KAAK,KAAK,EAAE,CAAC,GAAG;AAClB,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,KAAM,QAAO,QAAQ,iBAAiB;AACnD,UAAM,KAAW,aAAa,CAAC,OAAO,KAAK,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,KAAK;AAChF,QAAI,WAAW,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,QAAO,QAAQ,WAAW;AACpE,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO,OAAO,OAAO,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;AAAA,EAC/P;AACA,MAAI,IAAI,WAAW,UAAU;AAC3B,UAAM,CAAC,SAAS,OAAO,IAAK,IAAI,OAAkB,MAAM,GAAG;AAC3D,UAAM,UAAU,YAAY,OAAO;AACnC,UAAM,UAAU,YAAY,OAAO;AACnC,QAAI,CAAC,WAAW,CAAC,QAAS,QAAO,QAAQ,gBAAgB;AACzD,UAAM,KAAK,YAAY,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;AAC1C,UAAM,KAAK,YAAY,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;AAC3C,YAAQ,CAAC,IAAI,EAAE;AACf,QAAI;AACJ,QAAI,aAAa,IAAI,GAAG;AACtB,UAAI,aAAa,IAAI;AACrB,UAAI,EAAG,EAAE,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,QAAQ,CAAC,KAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,QAAQ,CAAC,GAAK,KAAI;AAAA,IAC3G,OAAO;AACL,YAAM,IAAI,YAAY,IAAI;AAC1B,UAAI,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,UAAU;AAAA,IAC7D;AACA,UAAM,CAAC,SAAS,OAAO,IAAI,OAAO,MAAM,CAAC;AACzC,QAAI,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAK,QAAO,QAAQ,kBAAkB;AACjG,UAAM,OAAa,CAAC,YAAY,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,YAAY,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,YAAY,SAAS,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,GAAG,YAAY,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;AACpM,QAAI,CAAC,KAAK,IAAI,EAAG,QAAO,QAAQ,iBAAiB;AACjD,eAAW,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAS,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,QAAQ,CAAC,KAAK,SAAS,IAAI,CAAC,EAAG,KAAI,WAAW,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,QAAO,QAAQ,WAAW;AACjN,WAAO,OAAO,OAAO,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,SAAS,OAAO,GAAG,GAAG,KAAK,EAAE,CAAC;AAAA,EAClQ;AACA,MAAI,IAAI,WAAW,UAAU;AAC3B,QAAI,KAAK,EAAE,CAAC,KAAK,IAAI,MAAM,OAAO,MAAM,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,MAAM;AAC7E,QAAI,KAAK,EAAE,CAAC,KAAK,IAAI,MAAM,OAAO,MAAM,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,MAAM;AAC7E,YAAQ,CAAC,IAAI,EAAE;AACf,QAAI;AACJ,QAAI,aAAa,IAAI,EAAG,KAAI,aAAa,IAAI;AAAA,SACxC;AACH,YAAM,IAAI,YAAY,IAAI;AAC1B,YAAM,KAAK,EAAE,CAAC,IAAI;AAClB,YAAM,KAAK,EAAE,CAAC,IAAI;AAClB,UAAI,KAAK,MAAM,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,EAAE;AAAA,IAC1D;AACA,UAAM,CAAC,SAAS,OAAO,IAAI,OAAO,MAAM,CAAC;AACzC,QAAI,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,OAAO,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAK,QAAO,QAAQ,kBAAkB;AACjG,SAAK,MAAM,IAAI,EAAE,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC;AACrD,SAAK,MAAM,IAAI,EAAE,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC;AACrD,UAAM,OAAa,CAAC,KAAK,UAAU,GAAG,KAAK,UAAU,GAAG,KAAK,UAAU,GAAG,KAAK,UAAU,CAAC;AAC1F,QAAI,CAAC,KAAK,IAAI,EAAG,QAAO,QAAQ,iBAAiB;AACjD,WAAO,OAAO,OAAO,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;AAAA,EACxM;AACA,SAAO,QAAQ,gBAAgB;AACjC;;;ACjMO,SAAS,WAAW,GAAsC;AAC/D,MAAI,OAAO,MAAM,UAAU;AACzB,QAAI,CAAC,UAAU,CAAC,EAAG,OAAM,IAAI,MAAM,uBAAuB,CAAC;AAC3D,WAAO,UAAU,CAAC;AAAA,EACpB;AACA,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,MAAY;AAC7B,QAAM,IAAU,CAAC;AACjB,aAAW,KAAK,OAAO,KAAK,CAAC,EAAG,KAAI,EAAE,CAAC,MAAM,IAAK,GAAE,CAAC,IAAI,EAAE,CAAC;AAC5D,IAAE,OAAO,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjC,SAAO;AACT;AAGO,SAAS,MAAM,UAAgC,SAAoC;AACxF,QAAM,MAAM,WAAW,QAAQ;AAC/B,QAAM,IAAI,WAAW,CAAC;AACtB,QAAM,OAAO,UAAU,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;AACvC,QAAM,SAAS,EAAE,UAAU;AAC3B,SAAO,aAAa,IAAI,EACrB,IAAI,SAAS,EACb,IAAI,CAAC,MAAO,EAAE,SAAS,OAAO,OAAO,GAAG,EAAE,QAAQ,UAAU,WAAW,EAAE,QAAQ,MAAM,EAAE,CAAC,IAAI,CAAE;AACrG;AAGO,SAAS,UAAU,WAA+B,MAA+B;AACtF,MAAI,aAAa,cAAc,SAAS,EAAG,QAAO;AAClD,QAAM,OAAO,kBAAkB;AAC/B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,IAAI,UAAU,MAAM,kBAAkB,OAAO,EAAE;AACrD,MAAI,MAAM;AACV,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,aAAW,KAAK,MAAM;AACpB,WAAO,KAAK,CAAC;AACb,QAAI,IAAI,IAAK,QAAO;AAAA,EACtB;AACA,SAAO,KAAK,KAAK,SAAS,CAAC;AAC7B;AAEA,SAAS,QAAQ,GAAS,MAAwC;AAChE,QAAM,OAAkB,EAAE,aAAa,QAAQ,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,OAAO;AAChF,MAAI,UAAU,KAAM,QAAO,KAAK;AAChC,MAAI,SAAS,KAAM,QAAO,KAAK;AAC/B,SAAO,KAAK,KAAK,WAAW,OAAO,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,KAAK,KAAK,MAAM;AAClF;AAEA,SAAS,WAAW,MAAY,OAAqB,KAAgD,MAAuB,OAA6B;AACvJ,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,CAAC,UAAU,UAAU,SAAU,QAAO,CAAC;AAC3C,QAAM,IAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,MAAM,OAAO,WAAW,WAAW,KAAK;AAAA,IACvD;AAAA,IACA,KAAK;AAAA,IACL,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB;AACA,SAAO,OAAO,MAAM,CAAC;AACvB;AAEA,IAAM,MAAM,CAAC,KAAyB,QAAgB,KAAgC,UAAU,SAA4C,MAAM,UAAU,IAAI,KAAK,QAAQ,IAAI,IAAI;AAG9K,SAAS,SAAS,UAAgC,SAAkC;AACzF,QAAM,MAAM,WAAW,QAAQ;AAC/B,QAAM,IAAI,WAAW,CAAC;AACtB,QAAM,OAAO,EAAE,QAAQ,OAAO,IAAI,EAAE;AACpC,QAAM,SAAS,EAAE,UAAU;AAC3B,MAAI,KAAuB,OAAO,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC;AACxD,QAAM,OAAO,YAAY,EAAE,IAAI;AAC/B,QAAM,cAAgC,CAAC;AACvC,MAAI,KAAM,MAAK,mBAAmB,KAAK,IAAI,MAAM,WAAW;AAC5D,QAAM,OAAO,UAAU,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,MAAM,YAAY,CAAC;AACjE,QAAM,MAAM,aAAa,IAAI;AAC7B,QAAM,QAAsB,CAAC;AAC7B,QAAM,UAA4C,CAAC;AACnD,aAAW,QAAQ,KAAK,MAAM,OAAO,KAAK,KAAK,GAAG;AAChD,UAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,EAAE,UAAU,KAAK,KAAK;AACzE,UAAM,IAAI,SAAS,MAAM,MAAM,IAAI,UAAU,MAAM,OAAO,cAAc,KAAK,WAAW,UAAU,MAAM,KAAK,EAAE,KAAK,KAAK,GAAG,CAAC;AAC7H,UAAM,KAAK,GAAG,EAAE,KAAK;AACrB,YAAQ,KAAK,GAAG,EAAE,OAAO;AAAA,EAC3B;AACA,QAAM,MAAM,eAAe,MAAM,OAAO,IAAI;AAC5C,QAAM,QAAQ,UAAU,EAAE,OAAO,IAAI;AACrC,QAAM,gBAAgB,WAAW,MAAM,OAAO,KAAK,MAAM,KAAK;AAC9D,QAAM,SAAS,QAAQ,EAAE,MAAM,OAAO,KAAK,OAAO,MAAM,CAAC;AACzD,QAAM,QAAQ,CAAC,MAAY;AACzB,UAAM,IAAU,CAAC;AACjB,eAAW,KAAK,OAAO,KAAK,CAAC,EAAG,KAAI,EAAE,CAAC,MAAM,OAAO,MAAM,YAAa,GAAE,CAAC,IAAI,EAAE,CAAC;AACjF,WAAO;AAAA,EACT;AACA,QAAM,IAAI,KAAK;AACf,QAAM,MAAM,IACR;AAAA,IACE,MAAM,EAAE,KAAK,IAAI,EAAE;AAAA,IACnB,SAAS,GAAG,EAAE,OAAO;AAAA,IACrB,UAAU,GAAG,EAAE,QAAQ;AAAA,IACvB,UAAU,EAAE;AAAA,IACZ,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,MAAM,IAAI,EAAE,OAAO,MAAM,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE;AAAA,IACvI,WAAW,EAAE,UAAU,IAAI,CAAC,MAAY,OAAO,OAAO,EAAE,OAAO,OAAO,GAAG,CAAC,CAAC;AAAA,IAC3E,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,UAAU,EAAE,UAAU,MAAM,CAAC,CAAC,EAAE,MAAM,OAAO,OAAO,EAAE;AAAA,IACtN,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE;AAAA,EACrI,IACA;AACJ,QAAM,SAAS,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,IAC5C,OAAO,EAAE,MAAM,IAAI,OAAO,KAAK,MAAM,QAAQ,cAAc,GAAG,KAAK,OAAO,KAAK,MAAM,KAAK,UAAU,OAAO,MAAgB,EAAE;AAAA,IAC7H,OAAO,EAAE,QAAQ,UAAU,QAAQ,iBAAiB,MAAM,QAAQ,MAAM,QAAQ,MAAM,OAAO;AAAA,EAC/F,CAAC;AACD,QAAM,WAAW,MAAM,IAAI,CAAC,MAAM;AAChC,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,QAAQ,QAAQ,GAAG,IAAI;AAC3B,WAAO;AAAA,EACT,CAAC;AACD,QAAM,gBAAgB,cAAc,IAAI,CAAC,MAAM;AAC7C,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,EAAE,SAAU,KAAI,QAAQ,QAAQ,GAAG,IAAI;AAC3C,WAAO;AAAA,EACT,CAAC;AACD,QAAM,SAAe;AAAA,IACnB,UAAU,IAAI;AAAA,IACd,MAAM,UAAU,aAAa,IAAI,IAAI,MAAM;AAAA,IAC3C,KAAK,MAAM,GAAG;AAAA,IACd;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,IACR,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,MAAM,EAAE,UAAU,OAAO,UAAU,UAAU,WAAW,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,MAAM,MAAM,GAAG,QAAQ,EAAE,QAAQ,IAAI,EAAE,IAAI,SAAS,EAAE,QAAQ,EAAE;AAAA,IAC1N,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;AAAA,MAC5B,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,MAAM,IAAI,EAAE,OAAO,MAAM;AAAA,MACzB,OAAO,EAAE;AAAA,MACT,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAAA,MAChB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAAA,MAChB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAAA,MAChB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;AAAA,MAChB,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,SAAS,EAAE,WAAW,KAAK,OAAO,EAAE,KAAK,EAAE;AAAA,MAC3C,OAAO,EAAE,MAAM,UAAU,EAAE,MAAM,OAAO,WAAW,EAAE,KAAK;AAAA,IAC5D,EAAE;AAAA,IACF,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,WAAY,CAAC,EAAa,OAAO,GAAG,OAAO,OAAO,KAAK,SAAS,CAAC;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,YAAY;AAAA,IACZ;AAAA,IACA,UAAU,IAAI,WAAW,IAAI,SAAS,KAAK,GAAG,KAAK,GAAG,EAAE,IAAI;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,IAAI,YAAa,QAAO,cAAc,GAAG,SAAS;AACtD,SAAO,aAAa,IAAI,cAAc,CAAC;AACvC,MAAI,MAAM;AACR,UAAM,SAAS,EAAE,MAAM,KAAK,IAAI,aAAa,YAAY,SAAS,MAAM,KAAK,OAAO,OAAO,CAAC,GAAG,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE;AAC/H,WAAO,SAAS;AAAA,EAClB;AACA,SAAO;AACT;AAEA,IAAM,UAAU,CAAC,MAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU;AAGnE,SAAS,SAAS,QAAc,SAAyC;AAC9E,QAAM,SAAS,SAAS,UAAU,OAAO,UAAU;AACnD,QAAM,IAAI,CAAC,KAAa,SAA0C,UAAU,YAAY,KAAK,QAAQ,IAAI;AACzG,QAAM,SAAmB,CAAC;AAC1B,QAAM,SAAiB,OAAO,MAAM,OAAO,OAAO;AAClD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ;AACjC,aAAS,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ;AACrC,UAAI,OAAO,CAAC,EAAE,UAAU,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,SAAS,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,KAAK,EAAG,QAAO,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9M,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,UAAW;AACjB,eAAW,KAAK,OAAO,MAAO,KAAI,EAAE,WAAW,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC,MAAY,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,EAAG,QAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAC7K,QAAI,OAAO;AAAK,iBAAW,KAAK,OAAO,IAAI,MAAO,KAAI,EAAE,WAAW,aAAa,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,cAAc,EAAE,KAAK,CAAC,MAAM,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,EAAG,QAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAAA;AAAA,EAC9M;AACA,aAAW,KAAK,OAAO,QAAS,QAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC,CAAC;AACjG,MAAI,OAAO,OAAQ,YAAW,KAAK,OAAO,OAAO,WAAY,QAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,OAAO,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAM,CAAC,CAAC;AAC1K,SAAO;AACT;AAGO,SAAS,SAAS,UAAgC,SAA4B;AACnF,QAAM,MAAM,WAAW,QAAQ;AAC/B,QAAM,KAAK,WAAW,CAAC;AACvB,SAAO,EAAE,QAAQ,IAAI,WAAW,IAAI,SAAS,EAAE,IAAI,IAAI,QAAQ,UAAU,IAAI,aAAa,IAAI,WAAW,EAAE,IAAI,IAAI,SAAS;AAC9H;AAEO,SAAS,cAAc,SAAS,MAAM;AAC3C,SAAO,OAAO,OAAO,SAAS,EAAE,IAAI,CAAC,MAAM;AACzC,UAAM,IAAI,SAAS,GAAG,CAAC,CAAC;AACxB,WAAO;AAAA,MACL,IAAI,EAAE;AAAA,MACN,MAAM,UAAU,aAAa,EAAE,IAAI,MAAM;AAAA,MACzC,KAAK,MAAM,CAAC;AAAA,MACZ,OAAO,OAAO,EAAE,UAAU,aAAa,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE;AAAA,MACvD,QAAQ,EAAE;AAAA,MACV,UAAU,EAAE;AAAA,MACZ,QAAQ,EAAE;AAAA,MACV,YAAY,EAAE,cAAc;AAAA,MAC5B,KAAK,CAAC,CAAC,EAAE;AAAA,MACT,SAAS,EAAE,WAAW,CAAC;AAAA,IACzB;AAAA,EACF,CAAC;AACH;;;ACnOO,SAAS,sBAA4B;AAC1C,QAAM,OAAO,EAAE,UAAU,gBAAgB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,MAAM,OAAO,UAAU,MAAM,KAAK;AACpG,gBAAc;AAAA,IACZ,EAAE,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,MAAM,OAAO,EAAE;AAAA,IACjD,EAAE,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,MAAM,iBAAiB,EAAE;AAAA,IACjE,EAAE,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,MAAM,iBAAiB,EAAE;AAAA,IAC/D,EAAE,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,MAAM,aAAa,EAAE;AAAA,IAC7D,EAAE,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,MAAM,OAAO,EAAE;AAAA,EACnD,CAAC;AACH;;;ACTO,IAAM,UAAmB;AAAA,EAC9B,MAAM,CAAC,IAAI,MAAM,KAAK,MAAM,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,QAAQ,MAAM,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,EACtG,QAAQ,CAAC,IAAI,QAAQ,MAAM,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,UAAU,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,EACpG,QAAQ,CAAC,IAAI,IAAI,IAAI,MAAM,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,UAAU,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EACpG,YAAY,CAAC,IAAI,MAAM,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,UAAU,MAAM,KAAK,GAAG,CAAC;AAAA,EACxF,IAAI,CAAC,IAAI,QAAQ,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,MAAM,IAAI,QAAQ,KAAK,GAAG,CAAC;AAAA,EACpF,QAAQ,CAAC,IAAI,QAAQ,MAAM,MAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,UAAU,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9F;;;ACVA;AAAA,EACE,QAAU;AAAA,IACR,SAAW;AAAA,IACX,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,YAAc;AAAA,EAChB;AAAA,EACA,SAAW;AAAA,IACT,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,gBAAkB;AAAA,IAClB,WAAa;AAAA,IACb,qBAAuB;AAAA,IACvB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,EACpB;AAAA,EACA,IAAM;AAAA,IACJ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,OAAS;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,IAAM;AAAA,IACN,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,QAAU;AAAA,IACV,SAAW;AAAA,IACX,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,QAAU;AAAA,IACV,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,qBAAuB;AAAA,IACvB,qBAAuB;AAAA,IACvB,sBAAwB;AAAA,EAC1B;AACF;;;AChGA;AAAA,EACE,QAAU;AAAA,IACR,SAAW;AAAA,IACX,SAAW;AAAA,IACX,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,YAAc;AAAA,EAChB;AAAA,EACA,SAAW;AAAA,IACT,gBAAkB;AAAA,IAClB,cAAgB;AAAA,IAChB,iBAAmB;AAAA,IACnB,WAAa;AAAA,IACb,gBAAkB;AAAA,IAClB,WAAa;AAAA,IACb,qBAAuB;AAAA,IACvB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV,SAAW;AAAA,IACX,cAAgB;AAAA,IAChB,cAAgB;AAAA,IAChB,kBAAoB;AAAA,IACpB,gBAAkB;AAAA,EACpB;AAAA,EACA,IAAM;AAAA,IACJ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,aAAe;AAAA,IACf,OAAS;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,SAAW;AAAA,IACX,YAAc;AAAA,IACd,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,IAAM;AAAA,IACN,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,QAAU;AAAA,IACV,SAAW;AAAA,IACX,OAAS;AAAA,IACT,OAAS;AAAA,IACT,aAAe;AAAA,IACf,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,OAAS;AAAA,IACT,QAAU;AAAA,IACV,aAAe;AAAA,IACf,YAAc;AAAA,IACd,WAAa;AAAA,IACb,OAAS;AAAA,IACT,QAAU;AAAA,IACV,WAAa;AAAA,IACb,YAAc;AAAA,IACd,aAAe;AAAA,IACf,aAAe;AAAA,IACf,eAAiB;AAAA,IACjB,aAAe;AAAA,IACf,aAAe;AAAA,IACf,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,UAAY;AAAA,IACZ,aAAe;AAAA,IACf,aAAe;AAAA,IACf,oBAAsB;AAAA,IACtB,mBAAqB;AAAA,IACrB,mBAAqB;AAAA,IACrB,cAAgB;AAAA,IAChB,mBAAqB;AAAA,IACrB,eAAiB;AAAA,IACjB,UAAY;AAAA,IACZ,gBAAkB;AAAA,IAClB,mBAAqB;AAAA,IACrB,mBAAqB;AAAA,IACrB,sBAAwB;AAAA,IACxB,qBAAuB;AAAA,IACvB,qBAAuB;AAAA,IACvB,sBAAwB;AAAA,EAC1B;AACF;;;AC5DA,oBAAoB;AACpB,wBAAwB,QAAQ,MAAM;AACtC,eAAe,MAAM,UAAQ;AAC7B,eAAe,SAAS,aAAU;AAE3B,IAAM,UAAU;AAMhB,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,EAAE,OAAO,KAAK,WAAW,KAAK,UAAU,iBAAiB,yBAAyB,0BAA0B;AAAA,EACnH,WAAW,EAAE,gBAAgB,eAAe;AAC9C;","names":["slots","r","cl","m","rimRect","ceiling","current","limit","palette","ZONES","rule"]}
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "@adatechnology/game-floorplan",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "description": "Procedural floor plans and lots engine: rooms, walls, doors, windows, recorded slots, seeded item fill, placement rules, perimeter, gates, paths, ground cover, multi-floor stairs and a colour-harmony palette. Knows nothing about any particular furniture or game.",
6
+ "keywords": [
7
+ "game",
8
+ "floorplan",
9
+ "procedural",
10
+ "house",
11
+ "layout",
12
+ "seeded",
13
+ "engine"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/Andersonfrfilho/adatechnology-game-kit.git",
18
+ "directory": "packages/game-floorplan"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "type": "module",
24
+ "main": "dist/index.js",
25
+ "module": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "unpkg": "dist/index.global.js",
28
+ "jsdelivr": "dist/index.global.js",
29
+ "sideEffects": false,
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js"
34
+ },
35
+ "./global": "./dist/index.global.js"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "MIGRATION.md"
40
+ ],
41
+ "devDependencies": {
42
+ "@types/node": "^22.10.7",
43
+ "tsup": "^8.5.1",
44
+ "typescript": "^5.7.3",
45
+ "vitest": "^3.2.4"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup",
49
+ "typecheck": "tsc -p tsconfig.json --noEmit",
50
+ "test": "vitest run",
51
+ "viewer:build": "node viewer/build-viewer.mjs"
52
+ }
6
53
  }