@gamepark/rules-api 7.6.2 → 7.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,548 @@
1
+ import { isEqual, maxBy, minBy, sumBy } from 'es-toolkit';
2
+ import { orderBy } from 'es-toolkit/compat';
3
+ import { isSameLocationArea } from '../location';
4
+ import { ItemMoveType, MoveKind } from '../moves';
5
+ /**
6
+ * Abstract base class shared by {@link Material}, {@link MaterialDeck} and {@link MaterialMoney}.
7
+ * It carries all the common logic (filtering + move creation) so that the factory methods that
8
+ * build a {@link MaterialDeck} or a {@link MaterialMoney} can live in {@link Material} alone,
9
+ * without creating a circular dependency between {@link Material} and its specialised subclasses.
10
+ *
11
+ * @typeparam P - identifier of a player. Either a number or a numeric enum (eg: PlayerColor)
12
+ * @typeparam M - Numeric enum of the types of material manipulated in the game
13
+ * @typeparam L - Numeric enum of the types of location in the game where the material can be located
14
+ */
15
+ export class MaterialBase {
16
+ type;
17
+ items;
18
+ processMove;
19
+ entries;
20
+ /**
21
+ * Construct a new Material helper instance
22
+ * @param {number} type Type of items this instance will work on
23
+ * @param {MaterialItem[]} items The complete list of items of this type in current game state.
24
+ * @param {function} processMove if provided, this function will be executed on every move created with this instance
25
+ * @param {ItemEntry[]} entries The list of items to work on. Each entry consists of an array with the index of the item, and the item
26
+ */
27
+ constructor(type, items = [], processMove, entries = Array.from(items.entries()).filter(entry => entry[1].quantity !== 0)) {
28
+ this.type = type;
29
+ this.items = items;
30
+ this.processMove = processMove;
31
+ this.entries = entries;
32
+ }
33
+ /**
34
+ * Helper function to return a new instance of the same class (works also for children class)
35
+ * @param {ItemEntry[]} entries Filtered entries for the new class
36
+ * @returns {this} the new Material instance
37
+ * @protected
38
+ */
39
+ new(entries) {
40
+ const Class = this.constructor;
41
+ return new Class(this.type, this.items, this.processMove, entries);
42
+ }
43
+ /**
44
+ * Use this function to collect all the items in the current Material instance.
45
+ * For example, you can filter then collect the matching items: this.material(type).location(locationType).getItems()
46
+ *
47
+ * @typeparam Id - Identifier of the items (item.id)
48
+ * @param {function} predicate If provided, only the items matching the predicate will be returned
49
+ * @returns {MaterialItem[]} the items in this Material instance
50
+ */
51
+ getItems(predicate) {
52
+ const items = this.entries.map(entry => entry[1]);
53
+ return predicate ? items.filter(predicate) : items;
54
+ }
55
+ /**
56
+ * Use this function to collect this first item in the current Material instance.
57
+ * You can use {@link sort} to sort the items first.
58
+ *
59
+ * @param {number | function} arg Index of the item, or predicate function
60
+ * @returns {MaterialItem | undefined} the item, or undefined if none match
61
+ */
62
+ getItem(arg) {
63
+ if (typeof arg === 'number') {
64
+ const entry = this.entries.find(entry => entry[0] === arg);
65
+ if (!entry)
66
+ throw new Error(`Could not find any item with index ${arg} for type ${this.type}`);
67
+ return entry[1];
68
+ }
69
+ else if (typeof arg === 'function') {
70
+ const entries = this.entries.filter(([, item]) => arg(item));
71
+ return entries.length ? entries[0][1] : undefined;
72
+ }
73
+ else {
74
+ return this.entries.length ? this.entries[0][1] : undefined;
75
+ }
76
+ }
77
+ /**
78
+ * @returns {number} index of the first item
79
+ */
80
+ getIndex() {
81
+ return this.entries[0]?.[0] ?? -1;
82
+ }
83
+ /**
84
+ * @returns {number[]} indexes of the items
85
+ */
86
+ getIndexes() {
87
+ return this.entries.map(entry => entry[0]);
88
+ }
89
+ /**
90
+ * Filter and return a new instance with only the items that match a specific index, or a specific index predicate
91
+ * @param {number | function} arg The index to keep, or the predicate matching the indexes to keep
92
+ */
93
+ index(arg) {
94
+ switch (typeof arg) {
95
+ case 'function':
96
+ return this.filter((_, index) => arg(index));
97
+ case 'number':
98
+ const item = this.entries.find(([index]) => index === arg);
99
+ return this.new(item ? [item] : []);
100
+ case 'undefined':
101
+ return this.new([]);
102
+ default:
103
+ const items = this.entries.filter(([i]) => arg.includes(i));
104
+ return this.new(items);
105
+ }
106
+ }
107
+ /**
108
+ * @deprecated Use {@link index} instead
109
+ */
110
+ indexes(indexes) {
111
+ const items = this.entries.filter(([i]) => indexes.includes(i));
112
+ return this.new(items);
113
+ }
114
+ /**
115
+ * @returns {number} number of items
116
+ */
117
+ get length() {
118
+ return this.entries.length;
119
+ }
120
+ /**
121
+ * @returns {boolean} true if there is at least one item
122
+ */
123
+ get exists() {
124
+ return this.entries.length > 0;
125
+ }
126
+ /**
127
+ * @returns {number} Sum of the quantity of all items
128
+ */
129
+ getQuantity() {
130
+ return sumBy(this.entries, ([, item]) => item.quantity ?? 1);
131
+ }
132
+ /**
133
+ * This function filter the items and returns a new instance with only the filtered items.
134
+ * This function is the top level filtering function, but other function can be used to simplify the code:
135
+ * {@link player}, {@link location}, {@link rotation}, {@link id}, {@link locationId}...
136
+ *
137
+ * @param {function} predicate The predicate function. Takes every item and index, and keep the item if it returns true
138
+ * @returns {this} New instance with only the items that match the predicate
139
+ */
140
+ filter(predicate) {
141
+ return this.new(this.entries.filter(([index, item]) => predicate(item, index)));
142
+ }
143
+ /**
144
+ * Filters the items based on their ids.
145
+ *
146
+ * @param {function | string | number | Record} arg Id to keep, or predicate function to match the ids of the items to keep
147
+ * @returns {this} New instance with only the items which ids match the argument
148
+ */
149
+ id(arg) {
150
+ return this.filter(({ id }) => typeof arg === 'function' ? arg(id) : isEqual(id, arg));
151
+ }
152
+ /**
153
+ * Filters the items based on their location type, or their location.
154
+ *
155
+ * @param {function | number} arg Location type to keep, or predicate function to match the location of the items to keep
156
+ * @returns {this} New instance with only the items which locations match the argument
157
+ */
158
+ location(arg) {
159
+ return this.filter(({ location }) => typeof arg === 'function' ? arg(location) : location.type === arg);
160
+ }
161
+ /**
162
+ * Filters the items based on their rotation (item.location.rotation)
163
+ *
164
+ * @param {function | string | number | boolean | Record} arg rotation to keep, or predicate function to match the rotations of the items to keep
165
+ * @returns {this} New instance with only the items which rotation match the argument
166
+ */
167
+ rotation(arg) {
168
+ return this.location(({ rotation }) => typeof arg === 'function' ? arg(rotation) : isEqual(rotation, arg));
169
+ }
170
+ /**
171
+ * Filters the items based on their owner (item.location.player)
172
+ *
173
+ * @param {function | number} arg player id to keep, or predicate function to match the owner player of the items to keep
174
+ * @returns {this} New instance with only the items which owner match the argument
175
+ */
176
+ player(arg) {
177
+ return this.location(({ player }) => typeof arg === 'function' ? arg(player) : player === arg);
178
+ }
179
+ /**
180
+ * Filters the items based on their location's id (item.location.id)
181
+ *
182
+ * @param {function | number} arg location id to keep, or predicate function to match the location id of the items to keep
183
+ * @returns {this} New instance with only the items which location id match the argument
184
+ */
185
+ locationId(arg) {
186
+ return this.location(({ id }) => typeof arg === 'function' ? arg(id) : isEqual(id, arg));
187
+ }
188
+ /**
189
+ * Filters the items based on their location's parent (item.location.parent).
190
+ *
191
+ * @param {function | number} arg location parent to keep, or predicate function to match the location parent of the items to keep
192
+ * @returns {this} New instance with only the items which location parent match the argument
193
+ */
194
+ parent(arg) {
195
+ return this.location(({ parent }) => typeof arg === 'function' ? arg(parent) : isEqual(parent, arg));
196
+ }
197
+ /**
198
+ * Filters the items that are selected (item.selected).
199
+ *
200
+ * @param {number | boolean} selected The selected value to compare (default is true)
201
+ * @returns {this} New instance with only the items which are selected
202
+ */
203
+ selected(selected = true) {
204
+ return this.filter(item => (item.selected ?? false) === selected);
205
+ }
206
+ /**
207
+ * Keep only the item that has the minimum value returned by the selector argument.
208
+ * See {@link minBy} from Lodash
209
+ *
210
+ * @param {function} selector The function that evaluate the item's value
211
+ * @returns {this} New instance with only the item which has the minimum value
212
+ */
213
+ minBy(selector) {
214
+ const min = minBy(this.entries, entry => selector(entry[1]));
215
+ return this.new(min ? [min] : []);
216
+ }
217
+ /**
218
+ * Keep only the item that has the maximum value returned by the selector argument.
219
+ * See {@link maxBy} from Lodash
220
+ *
221
+ * @param {function} selector The function that evaluate the item's value
222
+ * @returns {this} New instance with only the item which has the maximum value
223
+ */
224
+ maxBy(selector) {
225
+ const max = maxBy(this.entries, entry => selector(entry[1]));
226
+ return this.new(max ? [max] : []);
227
+ }
228
+ /**
229
+ * Return a new material instance which items are ordered based on provided selector functions.
230
+ * See {@link orderBy} from Lodash
231
+ *
232
+ * @param {...function} selectors The function or functions that evaluate each item's value
233
+ * @returns {this} New instance with items ordered by the selector functions
234
+ */
235
+ sort(...selectors) {
236
+ let orderedItems = orderBy(this.entries, selectors.map((s) => (entry) => s(entry[1])));
237
+ return this.new(orderedItems);
238
+ }
239
+ /**
240
+ * Return a new material instance with only the first N items.
241
+ * You have to use {@link sort} first as the items are ordered initially by index, which is not relevant.
242
+ * Example: material.sort(item => !item.location.x!).limit(10)
243
+ *
244
+ * @param count Number of items to keep
245
+ * @returns {this} New instance with only the first "count" items
246
+ */
247
+ limit(count) {
248
+ return this.new(this.entries.slice(0, count));
249
+ }
250
+ process(moves) {
251
+ if (this.processMove) {
252
+ for (const move of moves) {
253
+ this.processMove(move);
254
+ }
255
+ }
256
+ return moves;
257
+ }
258
+ /**
259
+ * Prepare a move that will create a new item
260
+ * @param {MaterialItem} item The item to create
261
+ * @returns {CreateItem} the move that creates an item when executed
262
+ */
263
+ createItem(item) {
264
+ return this.createItems([item])[0];
265
+ }
266
+ /**
267
+ * Prepare a list of moves to create new items
268
+ * @param {MaterialItem[]} items The items to create
269
+ * @returns {CreateItem[]} the moves that creates the new items when executed
270
+ */
271
+ createItems(items) {
272
+ return this.process(items.map(item => ({
273
+ kind: MoveKind.ItemMove,
274
+ type: ItemMoveType.Create,
275
+ itemType: this.type,
276
+ item
277
+ })));
278
+ }
279
+ /**
280
+ * Prepare one move to create new items
281
+ * @param {MaterialItem[]} items The items to create
282
+ * @returns {CreateItemsAtOnce} the move that creates the new items when executed
283
+ */
284
+ createItemsAtOnce(items) {
285
+ const move = { kind: MoveKind.ItemMove, type: ItemMoveType.CreateAtOnce, itemType: this.type, items };
286
+ return this.process([move])[0];
287
+ }
288
+ /**
289
+ * Prepare a move that will delete current first item in this material instance
290
+ *
291
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to remove. If undefined, the item is completely removed
292
+ * @returns {DeleteItem} the move that delete the item, or a part of its quantity, when executed
293
+ */
294
+ deleteItem(quantity) {
295
+ switch (this.length) {
296
+ case 0:
297
+ throw new Error('You are trying to delete an item that does not exists');
298
+ case 1:
299
+ return this.deleteItems(quantity)[0];
300
+ default:
301
+ return this.limit(1).deleteItems(quantity)[0];
302
+ }
303
+ }
304
+ /**
305
+ * Prepare moves that will delete all the items in this material instance
306
+ *
307
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to remove. If undefined, the items are completely removed
308
+ * @returns {DeleteItem[]} the moves that delete the items, or a part of their quantity, when executed
309
+ */
310
+ deleteItems(quantity) {
311
+ return this.process(this.entries.map(entry => {
312
+ const move = {
313
+ kind: MoveKind.ItemMove,
314
+ type: ItemMoveType.Delete,
315
+ itemType: this.type,
316
+ itemIndex: entry[0]
317
+ };
318
+ if (quantity)
319
+ move.quantity = quantity;
320
+ return move;
321
+ }));
322
+ }
323
+ /**
324
+ * Prepare one move that will delete all the items in this material instance
325
+ *
326
+ * @returns {DeleteItemsAtOnce} the move that delete the items when executed
327
+ */
328
+ deleteItemsAtOnce() {
329
+ const moves = { kind: MoveKind.ItemMove, type: ItemMoveType.DeleteAtOnce, itemType: this.type, indexes: this.getIndexes() };
330
+ return this.process([moves])[0];
331
+ }
332
+ /**
333
+ * Prepare a move that will change the location of the current first item in this material instance
334
+ *
335
+ * @param {Location | function} location The new location of the item. It can be a function to process the location based on the item current state.
336
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to move. If undefined, the item is completely moved.
337
+ * @returns {MoveItem} the move that will change the location of the item (or a part of its quantity) when executed
338
+ */
339
+ moveItem(location, quantity) {
340
+ switch (this.length) {
341
+ case 0:
342
+ throw new Error('You are trying to move an item that does not exists');
343
+ case 1:
344
+ return this.moveItems(location, quantity)[0];
345
+ default:
346
+ return this.limit(1).moveItems(location, quantity)[0];
347
+ }
348
+ }
349
+ /**
350
+ * Prepare moves that will change the location of all the items in this material instance
351
+ *
352
+ * @param {Location | function} location The new location of the items. It can be a function to process the location based on each item current state.
353
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to move. If undefined, the items are completely moved.
354
+ * @returns {MoveItem[]} the moves that will change the location of the items (or a part of their quantity) when executed
355
+ */
356
+ moveItems(location, quantity) {
357
+ const getLocation = typeof location === 'function' ? location : () => location;
358
+ return this.process(this.entries.map(entry => {
359
+ const location = getLocation(entry[1], entry[0]);
360
+ const move = {
361
+ kind: MoveKind.ItemMove,
362
+ type: ItemMoveType.Move,
363
+ itemType: this.type,
364
+ itemIndex: entry[0],
365
+ location
366
+ };
367
+ if (quantity)
368
+ move.quantity = quantity;
369
+ return move;
370
+ }));
371
+ }
372
+ /**
373
+ * Prepare one move that will change the location of all the items in this material instance
374
+ *
375
+ * @param {Location} location The new location of the items. It can only be the same location for every item.
376
+ * @returns {MoveItemsAtOnce} the move that will change the location of the items when executed
377
+ */
378
+ moveItemsAtOnce(location) {
379
+ const move = {
380
+ kind: MoveKind.ItemMove,
381
+ type: ItemMoveType.MoveAtOnce,
382
+ itemType: this.type,
383
+ indexes: this.entries.map(([index]) => index),
384
+ location
385
+ };
386
+ return this.process([move])[0];
387
+ }
388
+ /**
389
+ * Prepare a move that will select current first item in this material instance
390
+ *
391
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to select. If undefined, the item is completely selected.
392
+ * @returns {SelectItem} the move that will select the item (or a part of its quantity) when executed
393
+ */
394
+ selectItem(quantity) {
395
+ switch (this.length) {
396
+ case 0:
397
+ throw new Error('You are trying to select an item that does not exists');
398
+ case 1:
399
+ return this.selectItems(quantity)[0];
400
+ default:
401
+ return this.limit(1).selectItems(quantity)[0];
402
+ }
403
+ }
404
+ /**
405
+ * Prepare a move that will select all the items in this material instance
406
+ *
407
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to select. If undefined, the items are completely selected.
408
+ * @returns {SelectItem[]} the moves that will select the items (or a part of their quantity) when executed
409
+ */
410
+ selectItems(quantity) {
411
+ return this.process(this.entries.map(entry => {
412
+ const move = {
413
+ kind: MoveKind.ItemMove,
414
+ type: ItemMoveType.Select,
415
+ itemType: this.type,
416
+ itemIndex: entry[0]
417
+ };
418
+ if (quantity)
419
+ move.quantity = quantity;
420
+ return move;
421
+ }));
422
+ }
423
+ /**
424
+ * Prepare a move that will unselect current first item in this material instance
425
+ *
426
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to unselect. If undefined, the item is completely unselected.
427
+ * @returns {SelectItem} the move that will unselect the item (or a part of its quantity) when executed
428
+ */
429
+ unselectItem(quantity) {
430
+ switch (this.length) {
431
+ case 0:
432
+ throw new Error('You are trying to select an item that does not exists');
433
+ case 1:
434
+ return this.unselectItems(quantity)[0];
435
+ default:
436
+ return this.limit(1).unselectItems(quantity)[0];
437
+ }
438
+ }
439
+ /**
440
+ * Prepare a move that will unselect all the items in this material instance
441
+ *
442
+ * @param {number | undefined} quantity Optional: for items with a quantity, the number of items to unselect. If undefined, the items are completely unselected.
443
+ * @returns {SelectItem[]} the moves that will unselect the items (or a part of their quantity) when executed
444
+ */
445
+ unselectItems(quantity) {
446
+ return this.process(this.entries.map(entry => {
447
+ const move = {
448
+ kind: MoveKind.ItemMove,
449
+ type: ItemMoveType.Select,
450
+ itemType: this.type,
451
+ itemIndex: entry[0],
452
+ selected: false
453
+ };
454
+ if (quantity)
455
+ move.quantity = quantity;
456
+ return move;
457
+ }));
458
+ }
459
+ /**
460
+ * Prepare a move that will rotate current first item in this material instance.
461
+ * This function creates a {@link MoveItem} but copies the existing location values, only replacing the rotation property.
462
+ *
463
+ * @param {string | number | boolean | Record | function | undefined} arg Value of the rotation to give to the item.
464
+ * In case of a function, process the value based on the item state.
465
+ * @returns {MoveItem} the move that will rotate the item when executed
466
+ */
467
+ rotateItem(arg) {
468
+ switch (this.length) {
469
+ case 0:
470
+ throw new Error('You are trying to rotate an item that does not exists');
471
+ case 1:
472
+ return this.rotateItems(arg)[0];
473
+ default:
474
+ return this.limit(1).rotateItems(arg)[0];
475
+ }
476
+ }
477
+ /**
478
+ * Prepare a move that will rotate all the items in this material instance.
479
+ * This function creates an array of {@link MoveItem} but copies the existing locations values, only replacing the rotation property.
480
+ *
481
+ * @param {string | number | boolean | Record | function | undefined} arg Value of the rotation to give to the item.
482
+ * In case of a function, process the value based on the item state.
483
+ * @returns {MoveItem[]} the moves that will rotate the item when executed
484
+ */
485
+ rotateItems(arg) {
486
+ return this.moveItems(item => {
487
+ const rotation = typeof arg === 'function' ? arg(item) : arg;
488
+ const { rotation: oldRotation, ...location } = item.location;
489
+ return rotation !== undefined ? ({ ...location, rotation }) : location;
490
+ });
491
+ }
492
+ /**
493
+ * Prepare a move that will shuffle all the items in the current material instance
494
+ * @returns {Shuffle} the move that shuffle the items when executed
495
+ */
496
+ shuffle() {
497
+ if (process.env.NODE_ENV === 'development') {
498
+ if (this.entries.length <= 1) {
499
+ console.warn(`Calling shuffle on ${this.entries.length} item(s) has no effect.`);
500
+ }
501
+ else if (this.entries.some(e => !isSameLocationArea(e[1].location, this.entries[0][1].location))) {
502
+ console.warn('Calling shuffle on items with different location areas might be a mistake.');
503
+ }
504
+ }
505
+ return this.process([{
506
+ kind: MoveKind.ItemMove,
507
+ type: ItemMoveType.Shuffle,
508
+ itemType: this.type,
509
+ indexes: this.entries.map(entry => entry[0])
510
+ }])[0];
511
+ }
512
+ /**
513
+ * Prepare a move that will roll the current first item in this material instance. See {@link RollItem}.
514
+ *
515
+ * @param {Location | function} location The new location of the item. It can be a function to process the location based on the item current state.
516
+ * @returns {RollItem} the move that rolls the item when executed
517
+ */
518
+ rollItem(location) {
519
+ switch (this.length) {
520
+ case 0:
521
+ throw new Error('You are trying to roll an item that does not exists');
522
+ case 1:
523
+ return this.rollItems(location)[0];
524
+ default:
525
+ return this.limit(1).rollItems(location)[0];
526
+ }
527
+ }
528
+ /**
529
+ * Prepare a move that will roll all the items in this material instance. See {@link RollItem}.
530
+ *
531
+ * @param {Location | function} location The new location of the items. It can be a function to process the location based on each item current state.
532
+ * @returns {RollItem[]} the moves that rolls the items when executed
533
+ */
534
+ rollItems(location = (item) => item.location) {
535
+ const getLocation = typeof location === 'function' ? location : () => location;
536
+ return this.process(this.entries.map(entry => {
537
+ const location = getLocation(entry[1]);
538
+ return ({
539
+ kind: MoveKind.ItemMove,
540
+ type: ItemMoveType.Roll,
541
+ itemType: this.type,
542
+ itemIndex: entry[0],
543
+ location
544
+ });
545
+ }));
546
+ }
547
+ }
548
+ //# sourceMappingURL=MaterialBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaterialBase.js","sourceRoot":"","sources":["../../../src/material/items/MaterialBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAY,MAAM,aAAa,CAAA;AAC1D,OAAO,EAML,YAAY,EAGZ,QAAQ,EAIT,MAAM,UAAU,CAAA;AAKjB;;;;;;;;;GASG;AACH,MAAM,OAAgB,YAAY;IAUrB;IACC;IACS;IACZ;IAXT;;;;;;OAMG;IACH,YACW,IAAO,EACN,QAA8B,EAAE,EACvB,WAA+C,EAC3D,UAA6B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAH/F,SAAI,GAAJ,IAAI,CAAG;QACN,UAAK,GAAL,KAAK,CAA2B;QACvB,gBAAW,GAAX,WAAW,CAAoC;QAC3D,YAAO,GAAP,OAAO,CAA0F;IAC1G,CAAC;IAED;;;;;OAKG;IACO,GAAG,CAAC,OAA0B;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAA+I,CAAA;QAClK,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACpE,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAW,SAAqD;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAA6B,CAAA;QAC7E,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACpD,CAAC;IAmBD;;;;;;OAMG;IACH,OAAO,CAAW,GAA0D;QAC1E,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;YAC1D,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAC9F,OAAO,KAAK,CAAC,CAAC,CAA2B,CAAA;QAC3C,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAA8B,CAAC,CAAC,CAAA;YACtF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAA2B,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAA2B,CAAC,CAAC,CAAC,SAAS,CAAA;QACvF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAsD;QAC1D,QAAQ,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAC9C,KAAK,QAAQ;gBACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAA;gBAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACrC,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrB;gBACE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAiB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAA+D,SAAmE;QACtI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAA8B,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3G,CAAC;IAED;;;;;OAKG;IACH,EAAE,CAA+D,GAAgC;QAC/F,OAAO,IAAI,CAAC,MAAM,CAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAA2B,GAA8D;QAC/F,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;IACzG,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAwE,GAAoC;QAClH,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5G,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAAmC;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;IAChG,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAyE,GAA+B;QAChH,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1F,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAA6C;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IACtG,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,WAA6B,IAAI;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAA;IACnE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAA8C;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAA8C;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,GAAG,SAAmD;QACzD,IAAI,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACtF,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAC/B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAa;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;IAC/C,CAAC;IAEO,OAAO,CAA8B,KAAU;QACrD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,IAAwB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAA2B;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,QAAQ,CAAC,QAAQ;YACvB,IAAI,EAAE,YAAY,CAAC,MAAM;YACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI;SACL,CAAC,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,KAA2B;QAC3C,MAAM,IAAI,GAA+B,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;QACjI,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,QAAiB;QAC1B,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACtC;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,QAAiB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,IAAI,GAAkB;gBAC1B,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,MAAM;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;aACpB,CAAA;YACD,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACtC,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACf,MAAM,KAAK,GAAyB,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAA;QACjJ,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CACN,QAAmH,EACnH,QAAiB;QAEjB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;YACxE,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9C;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CACP,QAAoJ,EACpJ,QAAiB;QAEjB,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAA;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAA+B,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9E,MAAM,IAAI,GAAsB;gBAC9B,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnB,QAAQ;aACT,CAAA;YACD,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACtC,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAA2B,QAA+C;QACvF,MAAM,IAAI,GAA6B;YACrC,IAAI,EAAE,QAAQ,CAAC,QAAQ;YACvB,IAAI,EAAE,YAAY,CAAC,UAAU;YAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;YAC7C,QAAQ;SACT,CAAA;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,QAAiB;QAC1B,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACtC;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,QAAiB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,IAAI,GAAkB;gBAC1B,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,MAAM;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;aACpB,CAAA;YACD,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACtC,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,QAAiB;QAC5B,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,QAAiB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,IAAI,GAAkB;gBAC1B,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,MAAM;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnB,QAAQ,EAAE,KAAK;aAChB,CAAA;YACD,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACtC,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CACR,GAA2C;QAE3C,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;YAC1E,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACjC;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CACT,GAAuD;QAEvD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAC3B,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YAC5D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAA;YAC5D,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACxE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,OAAO,CAAC,MAAM,yBAAyB,CAAC,CAAA;YAClF,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACnG,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;YAC5F,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnB,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,OAAO;gBAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACR,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,QAA0E;QACjF,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;YACxE,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACpC;gBACE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,WAA4E,CAAC,IAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ;QAC/H,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAA;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACtC,OAAO,CAAC;gBACN,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnB,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;CACF"}
@@ -1,9 +1,9 @@
1
1
  import { Location } from '../location';
2
2
  import { MoveItem } from '../moves';
3
- import { Material } from './index';
3
+ import { MaterialBase } from './MaterialBase';
4
4
  import { MaterialItem } from './MaterialItem';
5
5
  /**
6
- * This subclass of {@link Material} is design to solve one major issue: when creating moves, the material items remains unchanged (Material is immutable),
6
+ * This subclass of {@link MaterialBase} is design to solve one major issue: when creating moves, the material items remains unchanged (Material is immutable),
7
7
  * so you cannot easily deal cards to multiple players at once: you will deal the first X cards all the time if you try to move items multiple time one
8
8
  * the same Material instance.
9
9
  *
@@ -22,7 +22,7 @@ import { MaterialItem } from './MaterialItem';
22
22
  * ]
23
23
  * ```
24
24
  */
25
- export declare class MaterialDeck<P extends number = number, M extends number = number, L extends number = number> extends Material<P, M, L> {
25
+ export declare class MaterialDeck<P extends number = number, M extends number = number, L extends number = number> extends MaterialBase<P, M, L> {
26
26
  /**
27
27
  * Prepare moves that will change the location of the first X items AND mutate this MaterialDeck instance to remove the items that will move.
28
28
  *
@@ -1,6 +1,6 @@
1
- import { Material } from './index';
1
+ import { MaterialBase } from './MaterialBase';
2
2
  /**
3
- * This subclass of {@link Material} is design to solve one major issue: when creating moves, the material items remains unchanged (Material is immutable),
3
+ * This subclass of {@link MaterialBase} is design to solve one major issue: when creating moves, the material items remains unchanged (Material is immutable),
4
4
  * so you cannot easily deal cards to multiple players at once: you will deal the first X cards all the time if you try to move items multiple time one
5
5
  * the same Material instance.
6
6
  *
@@ -19,7 +19,7 @@ import { Material } from './index';
19
19
  * ]
20
20
  * ```
21
21
  */
22
- export class MaterialDeck extends Material {
22
+ export class MaterialDeck extends MaterialBase {
23
23
  /**
24
24
  * Prepare moves that will change the location of the first X items AND mutate this MaterialDeck instance to remove the items that will move.
25
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"MaterialDeck.js","sourceRoot":"","sources":["../../../src/material/items/MaterialDeck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGlC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,YAA8F,SAAQ,QAAiB;IAClI;;;;;;OAMG;IACH,IAAI,CAAC,GAAoE,EAAE,WAAmB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAClE,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAoE;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,UAAU,CAAC,GAAmB,EAAE,WAAmB,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACxE,CAAC;CACF"}
1
+ {"version":3,"file":"MaterialDeck.js","sourceRoot":"","sources":["../../../src/material/items/MaterialDeck.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,YAA8F,SAAQ,YAAqB;IACtI;;;;;;OAMG;IACH,IAAI,CAAC,GAAoE,EAAE,WAAmB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAClE,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAoE;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,UAAU,CAAC,GAAmB,EAAE,WAAmB,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACxE,CAAC;CACF"}
@@ -1,13 +1,13 @@
1
1
  import { Location } from '../location';
2
2
  import { ItemMove } from '../moves';
3
- import { ItemEntry, Material } from './index';
3
+ import { ItemEntry, MaterialBase } from './MaterialBase';
4
4
  import { MaterialItem } from './MaterialItem';
5
5
  /**
6
- * This subclass of {@link Material} is design to handle counting and moving Money with different units: coins of 5 and 1 for instance.
6
+ * This subclass of {@link MaterialBase} is design to handle counting and moving Money with different units: coins of 5 and 1 for instance.
7
7
  * It also keeps track of how much money is left after spending moves are create so that it is easy to spend money multiple time at once,
8
8
  * without risking spending the same coins twice because the moves are no immediately executed.
9
9
  */
10
- export declare class MaterialMoney<P extends number = number, M extends number = number, L extends number = number, Unit extends number = number> extends Material<P, M, L> {
10
+ export declare class MaterialMoney<P extends number = number, M extends number = number, L extends number = number, Unit extends number = number> extends MaterialBase<P, M, L> {
11
11
  readonly type: M;
12
12
  units: Unit[];
13
13
  protected items: MaterialItem<P, L>[];
@@ -1,13 +1,13 @@
1
1
  import { cloneDeep, isEqual, mapValues, sumBy } from 'es-toolkit';
2
2
  import { keyBy } from 'es-toolkit/compat';
3
- import { Material } from './index';
3
+ import { MaterialBase } from './MaterialBase';
4
4
  import { MaterialMutator } from './MaterialMutator';
5
5
  /**
6
- * This subclass of {@link Material} is design to handle counting and moving Money with different units: coins of 5 and 1 for instance.
6
+ * This subclass of {@link MaterialBase} is design to handle counting and moving Money with different units: coins of 5 and 1 for instance.
7
7
  * It also keeps track of how much money is left after spending moves are create so that it is easy to spend money multiple time at once,
8
8
  * without risking spending the same coins twice because the moves are no immediately executed.
9
9
  */
10
- export class MaterialMoney extends Material {
10
+ export class MaterialMoney extends MaterialBase {
11
11
  type;
12
12
  units;
13
13
  items;