@edv4h/usketch-plugin-croupier 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,505 @@
1
+ /**
2
+ * Table operations as plain functions over a {@link BoardStore}. The HUD actions,
3
+ * the default renderer and the host-facing service all call these.
4
+ *
5
+ * Sync model: a board shape is synced as one value (last writer wins), so each
6
+ * kind of write is owned by one party —
7
+ * - the table (`croupier-table`): the host in the lobby / on reset, and the player
8
+ * whose turn it is while playing (only one writer at a time);
9
+ * - a seat (`croupier-seat`): the seated player (joining, leaving, the result note).
10
+ * Joining therefore adds a shape instead of editing a shared list, so two players
11
+ * joining at the same moment never drop each other.
12
+ *
13
+ * Game state is the engine's own snapshot (`CroupierCore#toSnapshot`). An action
14
+ * restores the engine from the table, dispatches, and writes the new snapshot back.
15
+ * Every client can read the snapshot (hidden information is only hidden by
16
+ * `getPlayerView`), which is the accepted trade-off of a serverless board.
17
+ */
18
+ import { CroupierCore, } from "@edv4h/croupier-core";
19
+ import { boundGameState, readGameState, writeGameState } from "./game-state.js";
20
+ import { CROUPIER_SEAT_TYPE, CROUPIER_TABLE_TYPE, } from "./types.js";
21
+ export const DEFAULT_TABLE_SIZE = { width: 720, height: 480 };
22
+ export const SEAT_SIZE = { width: 128, height: 56 };
23
+ const SEAT_GAP = 8;
24
+ const SEAT_PADDING = 12;
25
+ const DEFAULT_MIN_PLAYERS = 2;
26
+ const DEFAULT_MAX_PLAYERS = 8;
27
+ /** Log entries kept in the snapshot (the table is rewritten every action, so keep it small). */
28
+ export const SNAPSHOT_LOG_LIMIT = 30;
29
+ /** Upper bound of bot actions in one takeover (one turn). */
30
+ const MAX_BOT_STEPS = 10;
31
+ const ok = { ok: true };
32
+ const fail = (error) => ({ ok: false, error });
33
+ // ── Readers ──
34
+ export function isTable(shape) {
35
+ return (shape?.type === CROUPIER_TABLE_TYPE && typeof shape.meta === "object" && shape.meta !== null);
36
+ }
37
+ export function isSeat(shape) {
38
+ return (shape?.type === CROUPIER_SEAT_TYPE &&
39
+ typeof shape.meta === "object" &&
40
+ shape.meta !== null &&
41
+ typeof shape.parentId === "string");
42
+ }
43
+ export function getTable(store, tableId) {
44
+ const shape = store.getShape(tableId);
45
+ return isTable(shape) ? shape : undefined;
46
+ }
47
+ /** Seats of a table in join order (= turn order). */
48
+ export function listSeats(store, tableId) {
49
+ return [...store.getShapes().values()]
50
+ .filter((s) => isSeat(s) && s.parentId === tableId)
51
+ .sort((a, b) => a.meta.joinedAt - b.meta.joinedAt || a.id.localeCompare(b.id));
52
+ }
53
+ export function listTables(store) {
54
+ return [...store.getShapes().values()].filter(isTable);
55
+ }
56
+ /** Deterministic, so two tabs of the same user joining at once write the same seat. */
57
+ export function seatIdFor(tableId, userId) {
58
+ return `${tableId}-seat-${userId}`;
59
+ }
60
+ function limits(def) {
61
+ return {
62
+ min: def?.minPlayers ?? DEFAULT_MIN_PLAYERS,
63
+ max: def?.maxPlayers ?? DEFAULT_MAX_PLAYERS,
64
+ };
65
+ }
66
+ // ── Engine ──
67
+ // Restored engines for read-only views, keyed by the snapshot object (a store
68
+ // update replaces it, so a stale entry is never reused).
69
+ const viewEngines = new WeakMap();
70
+ function restore(def, meta, snapshot) {
71
+ if (!snapshot)
72
+ return null;
73
+ try {
74
+ return CroupierCore.fromSnapshot(def.createConfig(meta.options), snapshot);
75
+ }
76
+ catch {
77
+ // A snapshot from an incompatible game version: show the table, refuse actions.
78
+ return null;
79
+ }
80
+ }
81
+ function viewEngine(def, meta, snapshot) {
82
+ if (!snapshot)
83
+ return null;
84
+ const cached = viewEngines.get(snapshot);
85
+ if (cached)
86
+ return cached;
87
+ const engine = restore(def, meta, snapshot);
88
+ if (engine)
89
+ viewEngines.set(snapshot, engine);
90
+ return engine;
91
+ }
92
+ function currentPlayersOf(engine) {
93
+ const current = engine.getEngineState().currentPlayers;
94
+ return Array.isArray(current) ? current : [current];
95
+ }
96
+ function allowedActionsOf(engine) {
97
+ const { phase, stage } = engine.getEngineState();
98
+ const phaseConfig = engine.getConfig().phases[phase];
99
+ if (!phaseConfig)
100
+ return [];
101
+ const stageActions = stage ? phaseConfig.stages?.[stage]?.allowedActions : undefined;
102
+ return stageActions ?? phaseConfig.allowedActions ?? [];
103
+ }
104
+ function snapshotOf(store, table) {
105
+ return readGameState(store, table)?.snapshot;
106
+ }
107
+ function writeSnapshot(store, table, engine, now) {
108
+ const prev = readGameState(store, table);
109
+ const snapshot = engine.toSnapshot({ logLimit: SNAPSHOT_LOG_LIMIT });
110
+ const before = prev ? currentKey(prev.snapshot) : "";
111
+ const turnChanged = currentKey(snapshot) !== before;
112
+ const fields = writeGameState(store, table, {
113
+ snapshot,
114
+ turnStartedAt: turnChanged ? now : (prev?.turnStartedAt ?? now),
115
+ });
116
+ writeTableMeta(store, table, { ...fields, phase: snapshot.finished ? "finished" : "playing" });
117
+ }
118
+ /** Write table meta only when something changed (a table write rewrites the whole shape). */
119
+ function writeTableMeta(store, table, patch) {
120
+ const changed = Object.keys(patch).some((key) => table.meta[key] !== patch[key]);
121
+ if (!changed)
122
+ return;
123
+ store.updateShape(table.id, { meta: { ...table.meta, ...patch } });
124
+ }
125
+ /** Identifies a turn: who is to act, in which phase (stages within a turn do not count). */
126
+ function currentKey(snapshot) {
127
+ return `${snapshot.currentPlayers.join(",")}|${snapshot.phase}`;
128
+ }
129
+ export function makeTableShape(registry, params) {
130
+ const size = params.size ?? DEFAULT_TABLE_SIZE;
131
+ const def = registry.get(params.game);
132
+ const meta = {
133
+ tableId: params.id,
134
+ game: params.game,
135
+ options: { ...(def?.defaultOptions ?? {}), ...(params.options ?? {}) },
136
+ hostUserId: params.host.userId,
137
+ phase: "lobby",
138
+ snapshot: null,
139
+ turnStartedAt: null,
140
+ };
141
+ return {
142
+ id: params.id,
143
+ type: CROUPIER_TABLE_TYPE,
144
+ x: params.x,
145
+ y: params.y,
146
+ width: size.width,
147
+ height: size.height,
148
+ style: { fill: "#ffffff", stroke: "#1e1e1e", strokeWidth: 1, opacity: 1 },
149
+ meta,
150
+ };
151
+ }
152
+ /**
153
+ * Place seats in a row along the inside bottom edge of the table. Only seats whose
154
+ * geometry actually changes get a patch: every write is a sync, and the container
155
+ * arrange step applies these patches on every table update (e.g. each action).
156
+ */
157
+ export function layoutSeats(table, seats) {
158
+ const step = SEAT_SIZE.width + SEAT_GAP;
159
+ const rowWidth = seats.length * step - SEAT_GAP;
160
+ const left = table.x + Math.max(SEAT_PADDING, (table.width - rowWidth) / 2);
161
+ const y = table.y + table.height - SEAT_SIZE.height - SEAT_PADDING;
162
+ const sorted = [...seats].sort((a, b) => (a.meta?.joinedAt ?? 0) -
163
+ (b.meta?.joinedAt ?? 0) || a.id.localeCompare(b.id));
164
+ return sorted
165
+ .map((seat, i) => ({
166
+ seat,
167
+ patch: { x: left + i * step, y, width: SEAT_SIZE.width, height: SEAT_SIZE.height },
168
+ }))
169
+ .filter(({ seat, patch }) => seat.x !== patch.x ||
170
+ seat.y !== patch.y ||
171
+ seat.width !== patch.width ||
172
+ seat.height !== patch.height)
173
+ .map(({ seat, patch }) => ({ id: seat.id, patch }));
174
+ }
175
+ function relayout(store, table, onlyId) {
176
+ for (const { id, patch } of layoutSeats(table, listSeats(store, table.id))) {
177
+ if (onlyId && id !== onlyId)
178
+ continue;
179
+ store.updateShape(id, patch);
180
+ }
181
+ }
182
+ export function joinTable(store, registry, tableId, player, now) {
183
+ const table = getTable(store, tableId);
184
+ if (!table)
185
+ return fail("Table not found");
186
+ if (table.meta.phase !== "lobby")
187
+ return fail("The game has already started");
188
+ const seats = listSeats(store, tableId);
189
+ if (seats.some((s) => s.meta.userId === player.userId))
190
+ return ok;
191
+ if (seats.length >= limits(registry.get(table.meta.game)).max)
192
+ return fail("The table is full");
193
+ const meta = {
194
+ userId: player.userId,
195
+ name: player.name,
196
+ avatarUrl: player.avatarUrl,
197
+ joinedAt: now,
198
+ };
199
+ const id = seatIdFor(tableId, player.userId);
200
+ store.addShape({
201
+ id,
202
+ type: CROUPIER_SEAT_TYPE,
203
+ parentId: tableId,
204
+ x: table.x,
205
+ y: table.y,
206
+ width: SEAT_SIZE.width,
207
+ height: SEAT_SIZE.height,
208
+ style: { fill: "#ffffff", stroke: "#1e1e1e", strokeWidth: 1, opacity: 1 },
209
+ meta,
210
+ });
211
+ // Position only the new seat: other seats belong to other players.
212
+ relayout(store, table, id);
213
+ return ok;
214
+ }
215
+ /** Leave the lobby (removes the seat). While playing the seat stays so the game can go on. */
216
+ export function leaveTable(store, tableId, userId) {
217
+ const table = getTable(store, tableId);
218
+ if (!table)
219
+ return fail("Table not found");
220
+ const seat = listSeats(store, tableId).find((s) => s.meta.userId === userId);
221
+ if (!seat)
222
+ return ok;
223
+ if (table.meta.phase !== "lobby")
224
+ return fail("Players cannot leave a game in progress");
225
+ store.deleteShape(seat.id);
226
+ if (table.meta.hostUserId === userId) {
227
+ const next = listSeats(store, tableId)[0];
228
+ if (next) {
229
+ store.updateShape(tableId, {
230
+ meta: { ...table.meta, hostUserId: next.meta.userId },
231
+ });
232
+ }
233
+ }
234
+ return ok;
235
+ }
236
+ export function setTableOptions(store, tableId, actorId, options) {
237
+ const table = getTable(store, tableId);
238
+ if (!table)
239
+ return fail("Table not found");
240
+ if (table.meta.hostUserId !== actorId)
241
+ return fail("Only the host can change the options");
242
+ if (table.meta.phase !== "lobby")
243
+ return fail("The game has already started");
244
+ store.updateShape(tableId, {
245
+ meta: { ...table.meta, options: { ...table.meta.options, ...options } },
246
+ });
247
+ return ok;
248
+ }
249
+ /** Remove a player (host only, lobby only). */
250
+ export function kickFromTable(store, tableId, actorId, userId) {
251
+ const table = getTable(store, tableId);
252
+ if (!table)
253
+ return fail("Table not found");
254
+ if (table.meta.hostUserId !== actorId)
255
+ return fail("Only the host can remove players");
256
+ if (userId === actorId)
257
+ return fail("The host cannot remove themselves");
258
+ return leaveTable(store, tableId, userId);
259
+ }
260
+ /**
261
+ * Take over as host. Allowed for a seated player when the host has no seat, or
262
+ * when `hostAway` is set (the caller decided the host is gone, e.g. from presence).
263
+ */
264
+ export function claimHost(store, tableId, actorId, hostAway = false) {
265
+ const table = getTable(store, tableId);
266
+ if (!table)
267
+ return fail("Table not found");
268
+ if (table.meta.hostUserId === actorId)
269
+ return ok;
270
+ const seats = listSeats(store, tableId);
271
+ if (!seats.some((s) => s.meta.userId === actorId))
272
+ return fail("Join the table first");
273
+ const hostSeated = seats.some((s) => s.meta.userId === table.meta.hostUserId);
274
+ if (hostSeated && !hostAway)
275
+ return fail("The host is still here");
276
+ store.updateShape(tableId, {
277
+ meta: { ...table.meta, hostUserId: actorId },
278
+ });
279
+ return ok;
280
+ }
281
+ // ── Game ──
282
+ export function startGame(store, registry, tableId, actorId, now, seed) {
283
+ const table = getTable(store, tableId);
284
+ if (!table)
285
+ return fail("Table not found");
286
+ if (table.meta.hostUserId !== actorId)
287
+ return fail("Only the host can start the game");
288
+ if (table.meta.phase !== "lobby")
289
+ return fail("The game has already started");
290
+ const def = registry.get(table.meta.game);
291
+ if (!def)
292
+ return fail(`Unknown game "${table.meta.game}"`);
293
+ const players = listSeats(store, tableId).map((s) => s.meta.userId);
294
+ const { min, max } = limits(def);
295
+ if (players.length < min)
296
+ return fail(`At least ${min} players are needed`);
297
+ if (players.length > max)
298
+ return fail(`At most ${max} players can play`);
299
+ const engine = new CroupierCore(def.createConfig(table.meta.options), players, { seed });
300
+ writeSnapshot(store, table, engine, now);
301
+ return ok;
302
+ }
303
+ export function dispatchAction(store, registry, tableId, actorId, action, payload, now) {
304
+ const table = getTable(store, tableId);
305
+ if (!table)
306
+ return fail("Table not found");
307
+ if (table.meta.phase !== "playing")
308
+ return fail("The game is not in progress");
309
+ const def = registry.get(table.meta.game);
310
+ if (!def)
311
+ return fail(`Unknown game "${table.meta.game}"`);
312
+ // Always restore a fresh engine: dispatch mutates it.
313
+ const engine = restore(def, table.meta, snapshotOf(store, table));
314
+ if (!engine)
315
+ return fail("The game state cannot be read");
316
+ const result = engine.dispatch(actorId, action, payload);
317
+ if (!result.ok)
318
+ return fail(result.error ?? "Action rejected");
319
+ writeSnapshot(store, table, engine, now);
320
+ return ok;
321
+ }
322
+ /**
323
+ * Play the current turn with the game's bot strategy (host only). `players`
324
+ * limits it to those players (e.g. the absent ones in a game where several act
325
+ * at once); by default it plays for everyone whose turn it is.
326
+ */
327
+ export async function takeOverTurn(store, registry, tableId, actorId, now, players) {
328
+ const table = getTable(store, tableId);
329
+ if (!table)
330
+ return fail("Table not found");
331
+ if (table.meta.hostUserId !== actorId)
332
+ return fail("Only the host can play for others");
333
+ if (table.meta.phase !== "playing")
334
+ return fail("The game is not in progress");
335
+ const def = registry.get(table.meta.game);
336
+ if (!def)
337
+ return fail(`Unknown game "${table.meta.game}"`);
338
+ const engine = restore(def, table.meta, snapshotOf(store, table));
339
+ if (!engine)
340
+ return fail("The game state cannot be read");
341
+ const strategy = def.bot ?? engine.getConfig().bot;
342
+ if (!strategy)
343
+ return fail("This game has no bot strategy");
344
+ const revision = engine.getRevision();
345
+ const targets = new Set(players ?? currentPlayersOf(engine));
346
+ // A turn can take several actions (e.g. draw, then discard): keep going while
347
+ // a target player is still due and the bot makes progress.
348
+ let acted = false;
349
+ for (let step = 0; step < MAX_BOT_STEPS && !engine.getEngineState().finished; step++) {
350
+ const due = currentPlayersOf(engine).filter((p) => targets.has(p));
351
+ let progressed = false;
352
+ for (const playerId of due) {
353
+ const view = engine.getPlayerView(playerId);
354
+ const state = engine.getEngineState();
355
+ let decision;
356
+ try {
357
+ decision = await strategy.decide(playerId, view, state);
358
+ }
359
+ catch {
360
+ decision = strategy.fallback?.(playerId, view, state) ?? null;
361
+ }
362
+ if (decision && engine.dispatch(playerId, decision.action, decision.payload).ok) {
363
+ progressed = true;
364
+ }
365
+ }
366
+ if (!progressed)
367
+ break;
368
+ acted = true;
369
+ }
370
+ if (!acted)
371
+ return fail("The bot found nothing to do");
372
+ // The bot may be async: drop the result if someone moved meanwhile.
373
+ const latest = getTable(store, tableId);
374
+ if (!latest || snapshotOf(store, latest)?.revision !== revision)
375
+ return fail("The game moved on");
376
+ writeSnapshot(store, latest, engine, now());
377
+ return ok;
378
+ }
379
+ /** End the game now with the game's own result (host only). */
380
+ export function endGame(store, registry, tableId, actorId, now) {
381
+ const table = getTable(store, tableId);
382
+ if (!table)
383
+ return fail("Table not found");
384
+ if (table.meta.hostUserId !== actorId)
385
+ return fail("Only the host can end the game");
386
+ if (table.meta.phase !== "playing")
387
+ return fail("The game is not in progress");
388
+ const def = registry.get(table.meta.game);
389
+ if (!def)
390
+ return fail(`Unknown game "${table.meta.game}"`);
391
+ const engine = restore(def, table.meta, snapshotOf(store, table));
392
+ if (!engine)
393
+ return fail("The game state cannot be read");
394
+ engine.endSession();
395
+ writeSnapshot(store, table, engine, now);
396
+ return ok;
397
+ }
398
+ /** Back to the lobby with the same seats (host only). */
399
+ export function resetTable(store, tableId, actorId) {
400
+ const table = getTable(store, tableId);
401
+ if (!table)
402
+ return fail("Table not found");
403
+ if (table.meta.hostUserId !== actorId)
404
+ return fail("Only the host can reset the table");
405
+ writeTableMeta(store, table, { ...writeGameState(store, table, null), phase: "lobby" });
406
+ return ok;
407
+ }
408
+ /** Attach a note to the viewer's own seat (e.g. a reason shown with the result). */
409
+ export function setSeatNote(store, tableId, userId, note) {
410
+ const seat = listSeats(store, tableId).find((s) => s.meta.userId === userId);
411
+ if (!seat)
412
+ return fail("Join the table first");
413
+ store.updateShape(seat.id, { meta: { ...seat.meta, note } });
414
+ return ok;
415
+ }
416
+ // ── Housekeeping ──
417
+ /**
418
+ * Repair what copy/paste and deletion leave behind. Every client may run it on
419
+ * each store change: it only writes values that every client computes alike.
420
+ * - A copied table (its id differs from `meta.tableId`) becomes a fresh lobby
421
+ * with the same host, and seats copied along with it are removed.
422
+ * - Seats of the tables in `removedTables` are removed. Pass only tables this
423
+ * client has seen and then lost: a seat that merely arrived before its table
424
+ * (board still loading, out-of-order sync) must not be taken for an orphan.
425
+ * - A bare seat (no table or no meta, e.g. from the shape's `createDefault`) is removed.
426
+ */
427
+ export function repairTables(store, removedTables = new Set()) {
428
+ const shapes = store.getShapes();
429
+ const copied = new Set();
430
+ for (const shape of shapes.values()) {
431
+ if (isTable(shape) && shape.meta.tableId !== shape.id)
432
+ copied.add(shape.id);
433
+ }
434
+ for (const id of copied) {
435
+ const table = shapes.get(id);
436
+ store.updateShape(id, {
437
+ meta: { ...table.meta, tableId: id, phase: "lobby", snapshot: null, turnStartedAt: null },
438
+ });
439
+ }
440
+ // Games of deleted tables (kept outside the shapes).
441
+ const gameState = boundGameState(store);
442
+ if (gameState) {
443
+ for (const id of removedTables) {
444
+ if (!shapes.has(id) && gameState.get(id))
445
+ gameState.set(id, null);
446
+ }
447
+ }
448
+ for (const shape of [...shapes.values()]) {
449
+ if (shape.type !== CROUPIER_SEAT_TYPE)
450
+ continue;
451
+ // A bare seat (e.g. from the shape's createDefault) belongs to no table.
452
+ if (!isSeat(shape)) {
453
+ store.deleteShape(shape.id);
454
+ continue;
455
+ }
456
+ const parentId = shape.parentId;
457
+ const removed = removedTables.has(parentId) && !shapes.has(parentId);
458
+ const copiedSeat = copied.has(parentId);
459
+ // Under an existing table, a seat whose id is not the deterministic one was
460
+ // produced by a copy (even when the table itself was repaired earlier).
461
+ const foreign = isTable(shapes.get(parentId)) &&
462
+ isSeat(shape) &&
463
+ shape.id !== seatIdFor(parentId, shape.meta.userId);
464
+ if (removed || copiedSeat || foreign)
465
+ store.deleteShape(shape.id);
466
+ }
467
+ }
468
+ // ── View ──
469
+ export function getTableView(store, registry, tableId, viewerId) {
470
+ const table = getTable(store, tableId);
471
+ if (!table)
472
+ return undefined;
473
+ const def = registry.get(table.meta.game);
474
+ const seats = listSeats(store, tableId);
475
+ const mySeat = seats.find((s) => s.meta.userId === viewerId);
476
+ const isHost = table.meta.hostUserId === viewerId;
477
+ const { min, max } = limits(def);
478
+ const engine = def ? viewEngine(def, table.meta, snapshotOf(store, table)) : null;
479
+ const currentPlayers = engine && !engine.getEngineState().finished ? currentPlayersOf(engine) : [];
480
+ const isMyTurn = currentPlayers.includes(viewerId);
481
+ return {
482
+ table,
483
+ definition: def,
484
+ phase: table.meta.phase,
485
+ seats,
486
+ mySeat,
487
+ isHost,
488
+ canJoin: table.meta.phase === "lobby" && !mySeat && seats.length < max,
489
+ canStart: isHost &&
490
+ table.meta.phase === "lobby" &&
491
+ def !== undefined &&
492
+ seats.length >= min &&
493
+ seats.length <= max,
494
+ gameView: engine ? engine.getPlayerView(viewerId) : null,
495
+ currentPlayers,
496
+ isMyTurn,
497
+ stage: engine?.getEngineState().stage,
498
+ allowedActions: engine && isMyTurn ? allowedActionsOf(engine) : [],
499
+ // Only the final result: a live result may reveal hidden information.
500
+ result: engine?.getEngineState().finished ? engine.getResult() : null,
501
+ log: engine ? engine.getPlayerLog(viewerId) : [],
502
+ revision: engine?.getRevision() ?? 0,
503
+ };
504
+ }
505
+ //# sourceMappingURL=table-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-ops.js","sourceRoot":"","sources":["../src/table-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAEN,YAAY,GAGZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACN,kBAAkB,EAClB,mBAAmB,GAUnB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpD,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,gGAAgG;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,6DAA6D;AAC7D,MAAM,aAAa,GAAG,EAAE,CAAC;AAIzB,MAAM,EAAE,GAAa,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAY,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEjE,gBAAgB;AAEhB,MAAM,UAAU,OAAO,CAAC,KAA4B;IACnD,OAAO,CACN,KAAK,EAAE,IAAI,KAAK,mBAAmB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAC5F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAA4B;IAClD,OAAO,CACN,KAAK,EAAE,IAAI,KAAK,kBAAkB;QAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,KAAK,CAAC,IAAI,KAAK,IAAI;QACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAiB,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3C,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,OAAe;IAC3D,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;SAClE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC3C,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,MAAc;IACxD,OAAO,GAAG,OAAO,SAAS,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,GAAuC;IACtD,OAAO;QACN,GAAG,EAAE,GAAG,EAAE,UAAU,IAAI,mBAAmB;QAC3C,GAAG,EAAE,GAAG,EAAE,UAAU,IAAI,mBAAmB;KAC3C,CAAC;AACH,CAAC;AAED,eAAe;AAEf,8EAA8E;AAC9E,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,OAAO,EAAkC,CAAC;AAElE,SAAS,OAAO,CACf,GAA2B,EAC3B,IAAe,EACf,QAAsC;IAEtC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACJ,OAAO,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACR,gFAAgF;QAChF,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAClB,GAA2B,EAC3B,IAAe,EACf,QAAsC;IAEtC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoB;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoB;IAC7C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,OAAO,YAAY,IAAI,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB,EAAE,KAAiB;IACvD,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB,EAAE,KAAiB,EAAE,MAAoB,EAAE,GAAW;IAC7F,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAqB,CAAC;IACzF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE;QAC3C,QAAQ;QACR,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,IAAI,GAAG,CAAC;KAC/D,CAAC,CAAC;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,6FAA6F;AAC7F,SAAS,cAAc,CAAC,KAAiB,EAAE,KAAiB,EAAE,KAAyB;IACtF,MAAM,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAyB,CAAC,IAAI,CAC/D,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CACvC,CAAC;IACF,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,EAAwB,CAAC,CAAC;AAC1F,CAAC;AAED,4FAA4F;AAC5F,SAAS,UAAU,CAAC,QAA0B;IAC7C,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;AACjE,CAAC;AAeD,MAAM,UAAU,cAAc,CAAC,QAAsB,EAAE,MAAyB;IAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAc;QACvB,OAAO,EAAE,MAAM,CAAC,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;QACtE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC9B,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;KACnB,CAAC;IACF,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,mBAAmB;QACzB,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QACzE,IAAI;KACU,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAC1B,KAAgB,EAChB,KAA2B;IAE3B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC;IACnE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAE,CAAC,CAAC,IAA0B,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC7C,CAAE,CAAC,CAAC,IAA0B,EAAE,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5E,CAAC;IACF,OAAO,MAAM;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,IAAI;QACJ,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;KAClF,CAAC,CAAC;SACF,MAAM,CACN,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACnB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAC1B,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAC7B;SACA,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiB,EAAE,KAAiB,EAAE,MAAe;IACtE,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,MAAM,IAAI,EAAE,KAAK,MAAM;YAAE,SAAS;QACtC,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,MAAsB,EACtB,GAAW;IAEX,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChG,MAAM,IAAI,GAAa;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,GAAG;KACb,CAAC;IACF,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,QAAQ,CAAC;QACd,EAAE;QACF,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,OAAO;QACjB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QACzE,IAAI;KACS,CAAC,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC;AACX,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,OAAe,EAAE,MAAc;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7E,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzF,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;gBAC1B,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;aAC/B,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,KAAiB,EACjB,OAAe,EACf,OAAe,EACf,OAAoB;IAEpB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAC3F,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9E,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;QAC1B,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE;KACjD,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC;AACX,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAC5B,KAAiB,EACjB,OAAe,EACf,OAAe,EACf,MAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACvF,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACzE,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACxB,KAAiB,EACjB,OAAe,EACf,OAAe,EACf,QAAQ,GAAG,KAAK;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9E,IAAI,UAAU,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACnE,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;QAC1B,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;KACtB,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC;AACX,CAAC;AAED,aAAa;AAEb,MAAM,UAAU,SAAS,CACxB,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,OAAe,EACf,GAAW,EACX,IAAa;IAEb,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACvF,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC,YAAY,GAAG,qBAAqB,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,OAAe,EACf,MAAc,EACd,OAAgB,EAChB,GAAW;IAEX,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3D,sDAAsD;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;IAC/D,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,OAAe,EACf,GAAiB,EACjB,OAA6B;IAE7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,8EAA8E;IAC9E,2DAA2D;IAC3D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,aAAa,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QACtF,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,QAA4B,CAAC;YACjC,IAAI,CAAC;gBACJ,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACR,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;YAC/D,CAAC;YACD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;gBACjF,UAAU,GAAG,IAAI,CAAC;YACnB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,UAAU;YAAE,MAAM;QACvB,KAAK,GAAG,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACvD,oEAAoE;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC;AACX,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,OAAO,CACtB,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,OAAe,EACf,GAAW;IAEX,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,CAAC;IACpB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACX,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,OAAe,EAAE,OAAe;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACxF,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACxF,OAAO,EAAE,CAAC;AACX,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,WAAW,CAC1B,KAAiB,EACjB,OAAe,EACf,MAAc,EACd,IAAY;IAEZ,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC/C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAwB,CAAC,CAAC;IACnF,OAAO,EAAE,CAAC;AACX,CAAC;AAED,qBAAqB;AAErB;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC3B,KAAiB,EACjB,aAAa,GAAwB,IAAI,GAAG,EAAE;IAE9C,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAe,CAAC;QAC3C,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;SACnE,CAAC,CAAC;IAC1B,CAAC;IACD,qDAAqD;IACrD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;YAAE,SAAS;QAChD,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,SAAS;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,OAAO,GACZ,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC;YACb,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO;YAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;AACF,CAAC;AAED,aAAa;AAEb,MAAM,UAAU,YAAY,CAC3B,KAAiB,EACjB,QAAsB,EACtB,OAAe,EACf,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC;IAClD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,MAAM,cAAc,GACnB,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO;QACN,KAAK;QACL,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;QACvB,KAAK;QACL,MAAM;QACN,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QACtE,QAAQ,EACP,MAAM;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO;YAC5B,GAAG,KAAK,SAAS;YACjB,KAAK,CAAC,MAAM,IAAI,GAAG;YACnB,KAAK,CAAC,MAAM,IAAI,GAAG;QACpB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,cAAc;QACd,QAAQ;QACR,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,KAAK;QACrC,cAAc,EAAE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAClE,sEAAsE;QACtE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;QACrE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QAChD,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC;KACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { ShapeDefinition } from "@edv4h/usketch-shared";
2
+ import { type ReactElement } from "react";
3
+ import type { CroupierApi } from "./croupier-service.js";
4
+ import { type SeatShape, type TableShape, type TableView } from "./types.js";
5
+ /** What a table renderer receives. `view` is always the local player's view. */
6
+ export interface TableRenderContext {
7
+ shape: TableShape;
8
+ view: TableView;
9
+ api: CroupierApi;
10
+ }
11
+ /** What a seat renderer receives. */
12
+ export interface SeatRenderContext {
13
+ seat: SeatShape;
14
+ /** View of the seat's table (local player's point of view). */
15
+ view: TableView;
16
+ api: CroupierApi;
17
+ isCurrent: boolean;
18
+ isOnline: boolean;
19
+ }
20
+ export type TableRenderer = (ctx: TableRenderContext) => ReactElement;
21
+ export type SeatRenderer = (ctx: SeatRenderContext) => ReactElement;
22
+ export declare const TABLE_MIN_SIZE: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ /**
27
+ * Stops the canvas tools from treating a click on an in-shape control as a drag/select.
28
+ * The table is a container, whose wrapper has `pointer-events: none` (so seats get
29
+ * their clicks): give in-shape controls `pointerEvents: "auto"` as well.
30
+ */
31
+ export declare const stopCanvas: {
32
+ onPointerDown: (e: {
33
+ stopPropagation(): void;
34
+ }) => void;
35
+ onDoubleClick: (e: {
36
+ stopPropagation(): void;
37
+ }) => void;
38
+ };
39
+ /** Built-in table look: lobby controls, the current turn and the raw view. */
40
+ export declare const defaultRenderTable: TableRenderer;
41
+ /** Built-in seat look: name, turn marker and connection state. */
42
+ export declare const defaultRenderSeat: SeatRenderer;
43
+ export interface TableShapeOptions {
44
+ api: CroupierApi;
45
+ renderTable?: TableRenderer;
46
+ tableSize: {
47
+ width: number;
48
+ height: number;
49
+ };
50
+ /** Default game of a table created by `createDefault` (shape registry / tools). */
51
+ defaultGame: () => string | undefined;
52
+ }
53
+ export declare function tableShapeDefinition(opts: TableShapeOptions): ShapeDefinition;
54
+ export interface SeatShapeOptions {
55
+ api: CroupierApi;
56
+ renderSeat?: SeatRenderer;
57
+ }
58
+ export declare function seatShapeDefinition(opts: SeatShapeOptions): ShapeDefinition;
59
+ //# sourceMappingURL=table-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-shape.d.ts","sourceRoot":"","sources":["../src/table-shape.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKX,eAAe,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEN,KAAK,YAAY,EAIjB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjG,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,WAAW,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,kBAAkB,KAAK,YAAY,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,YAAY,CAAC;AAEpE,eAAO,MAAM,cAAc;IAAK,KAAK;IAAO,MAAM;CAAO,CAAC;AAO1D;;;;GAIG;AACH,eAAO,MAAM,UAAU;IACtB,aAAa,MAAM;QAAE,eAAe,IAAI,IAAI,CAAA;KAAE;IAC9C,aAAa,MAAM;QAAE,eAAe,IAAI,IAAI,CAAA;KAAE;CAC9C,CAAC;AAoFF,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,EAAE,aA0DhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,EAAE,YAsB/B,CAAC;AAkCF,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,mFAAmF;IACnF,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,CA2B7E;AAED,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,WAAW,CAAC;IACjB,UAAU,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAuB3E"}