like2d 2.8.0 → 2.9.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.
Files changed (77) hide show
  1. package/README.md +34 -35
  2. package/dist/core/audio.d.ts +12 -9
  3. package/dist/core/audio.d.ts.map +1 -1
  4. package/dist/core/audio.js +7 -4
  5. package/dist/core/canvas.d.ts +58 -0
  6. package/dist/core/canvas.d.ts.map +1 -0
  7. package/dist/core/canvas.js +209 -0
  8. package/dist/core/events.d.ts +91 -13
  9. package/dist/core/events.d.ts.map +1 -1
  10. package/dist/core/events.js +20 -0
  11. package/dist/core/gamepad-mapping.d.ts +57 -18
  12. package/dist/core/gamepad-mapping.d.ts.map +1 -1
  13. package/dist/core/gamepad-mapping.js +23 -223
  14. package/dist/core/gamepad.d.ts +34 -58
  15. package/dist/core/gamepad.d.ts.map +1 -1
  16. package/dist/core/gamepad.js +79 -213
  17. package/dist/core/graphics.d.ts +175 -65
  18. package/dist/core/graphics.d.ts.map +1 -1
  19. package/dist/core/graphics.js +294 -202
  20. package/dist/core/input-state.d.ts +2 -2
  21. package/dist/core/input-state.d.ts.map +1 -1
  22. package/dist/core/input.d.ts +22 -15
  23. package/dist/core/input.d.ts.map +1 -1
  24. package/dist/core/input.js +25 -37
  25. package/dist/core/keyboard.d.ts +6 -7
  26. package/dist/core/keyboard.d.ts.map +1 -1
  27. package/dist/core/keyboard.js +15 -35
  28. package/dist/core/like.d.ts +98 -44
  29. package/dist/core/like.d.ts.map +1 -1
  30. package/dist/core/like.js +8 -0
  31. package/dist/core/mouse.d.ts +31 -24
  32. package/dist/core/mouse.d.ts.map +1 -1
  33. package/dist/core/mouse.js +59 -99
  34. package/dist/core/timer.d.ts +2 -5
  35. package/dist/core/timer.d.ts.map +1 -1
  36. package/dist/core/timer.js +2 -14
  37. package/dist/engine.d.ts +61 -16
  38. package/dist/engine.d.ts.map +1 -1
  39. package/dist/engine.js +121 -160
  40. package/dist/index.d.ts +42 -21
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +35 -14
  43. package/dist/math/index.d.ts +2 -0
  44. package/dist/math/index.d.ts.map +1 -0
  45. package/dist/math/index.js +1 -0
  46. package/dist/math/rect.d.ts +71 -0
  47. package/dist/math/rect.d.ts.map +1 -0
  48. package/dist/{core → math}/rect.js +8 -0
  49. package/dist/math/vector2.d.ts +78 -0
  50. package/dist/math/vector2.d.ts.map +1 -0
  51. package/dist/{core → math}/vector2.js +24 -0
  52. package/dist/prefab-scenes/index.d.ts +7 -0
  53. package/dist/prefab-scenes/index.d.ts.map +1 -0
  54. package/dist/prefab-scenes/index.js +6 -0
  55. package/dist/prefab-scenes/startScreen.d.ts +59 -0
  56. package/dist/prefab-scenes/startScreen.d.ts.map +1 -0
  57. package/dist/{scenes/startup.js → prefab-scenes/startScreen.js} +48 -8
  58. package/dist/scene.d.ts +103 -5
  59. package/dist/scene.d.ts.map +1 -1
  60. package/dist/scene.js +28 -1
  61. package/package.json +18 -2
  62. package/dist/core/canvas-config.d.ts +0 -22
  63. package/dist/core/canvas-config.d.ts.map +0 -1
  64. package/dist/core/canvas-config.js +0 -14
  65. package/dist/core/canvas-manager.d.ts +0 -32
  66. package/dist/core/canvas-manager.d.ts.map +0 -1
  67. package/dist/core/canvas-manager.js +0 -179
  68. package/dist/core/gamepad-buttons.d.ts +0 -23
  69. package/dist/core/gamepad-buttons.d.ts.map +0 -1
  70. package/dist/core/gamepad-buttons.js +0 -36
  71. package/dist/core/rect.d.ts +0 -26
  72. package/dist/core/rect.d.ts.map +0 -1
  73. package/dist/core/vector2.d.ts +0 -26
  74. package/dist/core/vector2.d.ts.map +0 -1
  75. package/dist/gamecontrollerdb.txt +0 -2221
  76. package/dist/scenes/startup.d.ts +0 -18
  77. package/dist/scenes/startup.d.ts.map +0 -1
@@ -1,179 +0,0 @@
1
- import { Vec2 } from './vector2';
2
- function setCanvasSize(canvas, size) {
3
- canvas.width = size[0];
4
- canvas.height = size[1];
5
- }
6
- function setCanvasDisplaySize(canvas, size) {
7
- canvas.style.width = `${size[0]}px`;
8
- canvas.style.height = `${size[1]}px`;
9
- }
10
- function centerElement(el) {
11
- el.style.position = 'absolute';
12
- el.style.left = '50%';
13
- el.style.top = '50%';
14
- el.style.transform = 'translate(-50%, -50%)';
15
- }
16
- export class CanvasManager {
17
- constructor(canvas, container, ctx, config = { pixelResolution: null, fullscreen: false }) {
18
- Object.defineProperty(this, "canvas", {
19
- enumerable: true,
20
- configurable: true,
21
- writable: true,
22
- value: canvas
23
- });
24
- Object.defineProperty(this, "container", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: container
29
- });
30
- Object.defineProperty(this, "ctx", {
31
- enumerable: true,
32
- configurable: true,
33
- writable: true,
34
- value: ctx
35
- });
36
- Object.defineProperty(this, "config", {
37
- enumerable: true,
38
- configurable: true,
39
- writable: true,
40
- value: config
41
- });
42
- Object.defineProperty(this, "resizeObserver", {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: null
47
- });
48
- Object.defineProperty(this, "pixelCanvas", {
49
- enumerable: true,
50
- configurable: true,
51
- writable: true,
52
- value: null
53
- });
54
- Object.defineProperty(this, "pixelCtx", {
55
- enumerable: true,
56
- configurable: true,
57
- writable: true,
58
- value: null
59
- });
60
- Object.defineProperty(this, "onWindowResize", {
61
- enumerable: true,
62
- configurable: true,
63
- writable: true,
64
- value: () => this.applyConfig()
65
- });
66
- Object.defineProperty(this, "onResize", {
67
- enumerable: true,
68
- configurable: true,
69
- writable: true,
70
- value: null
71
- });
72
- this.resizeObserver = new ResizeObserver(() => this.applyConfig());
73
- this.resizeObserver.observe(this.container);
74
- window.addEventListener('resize', this.onWindowResize);
75
- this.listenForPixelRatioChanges();
76
- this.applyConfig();
77
- }
78
- listenForPixelRatioChanges() {
79
- const media = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);
80
- media.addEventListener('change', () => {
81
- this.applyConfig();
82
- this.listenForPixelRatioChanges();
83
- }, { once: true });
84
- }
85
- setMode(mode) {
86
- this.config = { ...this.config, ...mode };
87
- this.applyConfig();
88
- }
89
- getMode() {
90
- return { ...this.config };
91
- }
92
- applyConfig() {
93
- const containerSize = document.fullscreenElement
94
- ? [document.fullscreenElement.clientWidth, document.fullscreenElement.clientHeight]
95
- : [this.container.clientWidth, this.container.clientHeight];
96
- if (this.pixelCanvas) {
97
- this.pixelCanvas.remove();
98
- this.pixelCanvas = null;
99
- this.pixelCtx = null;
100
- }
101
- if (this.config.pixelResolution) {
102
- this.applyPixelMode(containerSize);
103
- }
104
- else {
105
- this.applyNativeMode(containerSize);
106
- }
107
- this.onResize?.(containerSize, [this.canvas.width, this.canvas.height], this.config.fullscreen);
108
- }
109
- applyPixelMode(csize) {
110
- const gameSize = this.config.pixelResolution;
111
- const pixelRatio = window.devicePixelRatio || 1;
112
- const scale = Math.min(csize[0] / gameSize[0], csize[1] / gameSize[1]);
113
- const physicalScale = scale * pixelRatio;
114
- const intScale = Math.max(1, Math.round(physicalScale));
115
- this.pixelCanvas = document.createElement('canvas');
116
- this.pixelCtx = this.pixelCanvas.getContext('2d');
117
- setCanvasSize(this.pixelCanvas, gameSize);
118
- setCanvasSize(this.canvas, Vec2.mul(gameSize, intScale));
119
- setCanvasDisplaySize(this.canvas, Vec2.mul(gameSize, scale));
120
- this.canvas.style.maxWidth = '100%';
121
- this.canvas.style.maxHeight = '100%';
122
- this.canvas.style.imageRendering = 'auto';
123
- centerElement(this.canvas);
124
- }
125
- applyNativeMode(csize) {
126
- const pixelRatio = window.devicePixelRatio || 1;
127
- const canvasSize = Vec2.mul(csize, pixelRatio);
128
- setCanvasSize(this.canvas, Vec2.floor(canvasSize));
129
- setCanvasDisplaySize(this.canvas, csize);
130
- this.canvas.style.position = 'absolute';
131
- this.canvas.style.left = '0';
132
- this.canvas.style.top = '0';
133
- this.canvas.style.transform = 'none';
134
- this.canvas.style.margin = '0';
135
- this.canvas.style.display = 'block';
136
- this.canvas.style.imageRendering = 'auto';
137
- this.ctx.setTransform(1, 0, 0, 1, 0, 0);
138
- }
139
- dispose() {
140
- this.resizeObserver?.disconnect();
141
- window.removeEventListener('resize', this.onWindowResize);
142
- this.pixelCanvas?.remove();
143
- this.pixelCanvas = null;
144
- this.pixelCtx = null;
145
- }
146
- present() {
147
- if (!this.pixelCtx || !this.pixelCanvas) {
148
- return;
149
- }
150
- this.ctx.imageSmoothingEnabled = false;
151
- this.ctx.drawImage(this.pixelCanvas, 0, 0, this.pixelCanvas.width, this.pixelCanvas.height, 0, 0, this.canvas.width, this.canvas.height);
152
- }
153
- getDisplayCanvas() {
154
- return this.canvas;
155
- }
156
- /** Canvas to render to. Pixel canvas in pixel mode, display canvas otherwise. */
157
- getRenderTarget() {
158
- if (this.pixelCanvas && this.pixelCtx) {
159
- return { canvas: this.pixelCanvas, ctx: this.pixelCtx };
160
- }
161
- return { canvas: this.canvas, ctx: this.ctx };
162
- }
163
- /** Render target size in pixels. Pixel resolution in pixel mode, scaled size otherwise. */
164
- getCanvasSize() {
165
- const target = this.getRenderTarget();
166
- return [target.canvas.width, target.canvas.height];
167
- }
168
- transformMousePosition(offsetX, offsetY) {
169
- if (this.config.pixelResolution) {
170
- const rect = this.canvas.getBoundingClientRect();
171
- return [
172
- offsetX * (this.config.pixelResolution[0] / rect.width),
173
- offsetY * (this.config.pixelResolution[1] / rect.height),
174
- ];
175
- }
176
- const pixelRatio = window.devicePixelRatio || 1;
177
- return [offsetX * pixelRatio, offsetY * pixelRatio];
178
- }
179
- }
@@ -1,23 +0,0 @@
1
- export declare namespace GP {
2
- const Bottom = 0;
3
- const Right = 1;
4
- const Left = 2;
5
- const Top = 3;
6
- const LB = 4;
7
- const RB = 5;
8
- const LT = 6;
9
- const RT = 7;
10
- const Back = 8;
11
- const Start = 9;
12
- const Guide = 10;
13
- const LS = 11;
14
- const RS = 12;
15
- const DUp = 13;
16
- const DDown = 14;
17
- const DLeft = 15;
18
- const DRight = 16;
19
- }
20
- export declare const GP_NAMES: Record<number, string>;
21
- export declare const GP_NAME_MAP: Record<string, number>;
22
- export declare function getGPName(buttonIndex: number): string;
23
- //# sourceMappingURL=gamepad-buttons.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gamepad-buttons.d.ts","sourceRoot":"","sources":["../../src/core/gamepad-buttons.ts"],"names":[],"mappings":"AAGA,yBAAiB,EAAE,CAAC;IAEX,MAAM,MAAM,IAAI,CAAC;IACjB,MAAM,KAAK,IAAI,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,GAAG,IAAI,CAAC;IAGd,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,IAAI,CAAC;IAGb,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,KAAK,IAAI,CAAC;IAChB,MAAM,KAAK,KAAK,CAAC;IAGjB,MAAM,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;IAGd,MAAM,GAAG,KAAK,CAAC;IACf,MAAM,KAAK,KAAK,CAAC;IACjB,MAAM,KAAK,KAAK,CAAC;IACjB,MAAM,MAAM,KAAK,CAAC;CAC1B;AAMD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE3C,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAkC,CAAC;AAElF,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -1,36 +0,0 @@
1
- // Gamepad button constants
2
- // Use these constants instead of magic numbers
3
- export var GP;
4
- (function (GP) {
5
- // Face buttons (physical positions)
6
- GP.Bottom = 0; // A on Xbox, X on PlayStation, B on Nintendo
7
- GP.Right = 1; // B on Xbox, O on PlayStation, A on Nintendo
8
- GP.Left = 2; // X on Xbox, □ on PlayStation, Y on Nintendo
9
- GP.Top = 3; // Y on Xbox, △ on PlayStation, X on Nintendo
10
- // Bumpers and triggers
11
- GP.LB = 4; // Left bumper (L1)
12
- GP.RB = 5; // Right bumper (R1)
13
- GP.LT = 6; // Left trigger (L2)
14
- GP.RT = 7; // Right trigger (R2)
15
- // Menu buttons
16
- GP.Back = 8; // Select/Back/Minus
17
- GP.Start = 9; // Start/Plus
18
- GP.Guide = 10; // Home/Guide button
19
- // Stick presses
20
- GP.LS = 11; // Left stick press (L3)
21
- GP.RS = 12; // Right stick press (R3)
22
- // D-Pad
23
- GP.DUp = 13;
24
- GP.DDown = 14;
25
- GP.DLeft = 15;
26
- GP.DRight = 16;
27
- })(GP || (GP = {}));
28
- // Build reverse mappings programmatically
29
- const GP_ENTRIES = Object.entries(GP);
30
- // Map button index to name (for debugging/display)
31
- export const GP_NAMES = Object.fromEntries(GP_ENTRIES.map(([name, index]) => [index, name]));
32
- // Map name to button index (for action system parsing)
33
- export const GP_NAME_MAP = Object.fromEntries(GP_ENTRIES);
34
- export function getGPName(buttonIndex) {
35
- return GP_NAMES[buttonIndex] ?? `Button${buttonIndex}`;
36
- }
@@ -1,26 +0,0 @@
1
- import type { Vector2 } from './vector2';
2
- export type Rect = [number, number, number, number];
3
- export declare namespace Rect {
4
- function fromPoints(a: Vector2, b: Vector2): Rect;
5
- function fromCenter(center: Vector2, size: Vector2): Rect;
6
- function position(r: Rect): Vector2;
7
- function size(r: Rect): Vector2;
8
- function center(r: Rect): Vector2;
9
- function topLeft(r: Rect): Vector2;
10
- function topRight(r: Rect): Vector2;
11
- function bottomLeft(r: Rect): Vector2;
12
- function bottomRight(r: Rect): Vector2;
13
- function area(r: Rect): number;
14
- function isEmpty(r: Rect): boolean;
15
- function containsPoint(r: Rect, point: Vector2): boolean;
16
- function containsRect(r: Rect, other: Rect): boolean;
17
- function intersects(r: Rect, other: Rect): boolean;
18
- function intersection(r: Rect, other: Rect): Rect;
19
- function union(r: Rect, other: Rect): Rect;
20
- function inflate(r: Rect, amount: number): Rect;
21
- function offset(r: Rect, delta: Vector2): Rect;
22
- function setPosition(r: Rect, pos: Vector2): Rect;
23
- function setSize(r: Rect, size: Vector2): Rect;
24
- function setCenter(r: Rect, center: Vector2): Rect;
25
- }
26
- //# sourceMappingURL=rect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../src/core/rect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,yBAAiB,IAAI,CAAC;IACpB,SAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAMvD;IAED,SAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAO/D;IAED,SAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAEzC;IAED,SAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAErC;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAEvC;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAExC;IAED,SAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAEzC;IAED,SAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAE3C;IAED,SAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAE5C;IAED,SAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEpC;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,CAExC;IAED,SAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAO9D;IAED,SAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAO1D;IAED,SAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAOxD;IAED,SAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAWvD;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAMhD;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOrD;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEpD;IAED,SAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAEvD;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAEpD;IAED,SAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAOxD;CACF"}
@@ -1,26 +0,0 @@
1
- export type Vector2 = [number, number];
2
- export declare namespace Vec2 {
3
- function add(a: Vector2, b: Vector2): Vector2;
4
- function sub(a: Vector2, b: Vector2): Vector2;
5
- function mul(v: Vector2, other: Vector2 | number): Vector2;
6
- function div(v: Vector2, other: Vector2 | number): Vector2;
7
- function dot(a: Vector2, b: Vector2): number;
8
- function cross(a: Vector2, b: Vector2): number;
9
- function lengthSq(v: Vector2): number;
10
- function length(v: Vector2): number;
11
- function normalize(v: Vector2): Vector2;
12
- function distance(a: Vector2, b: Vector2): number;
13
- function lerp(a: Vector2, b: Vector2, t: number): Vector2;
14
- function angle(v: Vector2): number;
15
- function rotate(v: Vector2, angle: number): Vector2;
16
- function negate(v: Vector2): Vector2;
17
- function floor(v: Vector2): Vector2;
18
- function ceil(v: Vector2): Vector2;
19
- function round(v: Vector2): Vector2;
20
- function min(a: Vector2, b: Vector2): Vector2;
21
- function max(a: Vector2, b: Vector2): Vector2;
22
- function clamp(v: Vector2, min: Vector2, max: Vector2): Vector2;
23
- function fromAngle(angle: number, len?: number): Vector2;
24
- function zero(): Vector2;
25
- }
26
- //# sourceMappingURL=vector2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vector2.d.ts","sourceRoot":"","sources":["../../src/core/vector2.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvC,yBAAiB,IAAI,CAAC;IACpB,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnD;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnD;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAKhE;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAKhE;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAElD;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAEpD;IAED,SAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE3C;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzC;IAED,SAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI7C;IAED,SAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAEvD;IAED,SAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAExC;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIzD;IAED,SAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAE1C;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAEzC;IAED,SAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAExC;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAEzC;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnD;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnD;IAED,SAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAKrE;IAED,SAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,CAEjE;IAED,SAAgB,IAAI,IAAI,OAAO,CAE9B;CACF"}