isaacscript-common 21.4.0 → 21.5.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 (72) hide show
  1. package/dist/index.d.ts +186 -3766
  2. package/dist/isaacscript-common.lua +1055 -973
  3. package/dist/src/classes/ModFeature.d.ts +2 -2
  4. package/dist/src/classes/ModFeature.d.ts.map +1 -1
  5. package/dist/src/classes/{ModUpgradedBase.d.ts → ModUpgraded.d.ts} +20 -32
  6. package/dist/src/classes/ModUpgraded.d.ts.map +1 -0
  7. package/dist/src/classes/{ModUpgradedBase.lua → ModUpgraded.lua} +30 -29
  8. package/dist/src/classes/features/other/DebugDisplay.lua +2 -2
  9. package/dist/src/classes/features/other/ExtraConsoleCommands.lua +2 -2
  10. package/dist/src/classes/features/other/extraConsoleCommands/commands.d.ts.map +1 -1
  11. package/dist/src/classes/features/other/extraConsoleCommands/commands.lua +2 -1
  12. package/dist/src/classes/private/CustomCallback.d.ts +3 -1
  13. package/dist/src/classes/private/CustomCallback.d.ts.map +1 -1
  14. package/dist/src/classes/private/CustomCallback.lua +12 -4
  15. package/dist/src/core/upgradeMod.d.ts +0 -42
  16. package/dist/src/core/upgradeMod.d.ts.map +1 -1
  17. package/dist/src/core/upgradeMod.lua +46 -21
  18. package/dist/src/features.lua +2 -2
  19. package/dist/src/functions/console.d.ts +8 -0
  20. package/dist/src/functions/console.d.ts.map +1 -0
  21. package/dist/src/functions/console.lua +14 -0
  22. package/dist/src/functions/deepCopy.d.ts.map +1 -1
  23. package/dist/src/functions/deepCopy.lua +3 -2
  24. package/dist/src/functions/enums.d.ts +28 -0
  25. package/dist/src/functions/enums.d.ts.map +1 -1
  26. package/dist/src/functions/enums.lua +27 -0
  27. package/dist/src/functions/globals.lua +3 -3
  28. package/dist/src/functions/log.d.ts +5 -0
  29. package/dist/src/functions/log.d.ts.map +1 -1
  30. package/dist/src/functions/log.lua +6 -0
  31. package/dist/src/functions/mergeTests.lua +2 -2
  32. package/dist/src/functions/modFeatures.d.ts +1 -1
  33. package/dist/src/functions/modFeatures.d.ts.map +1 -1
  34. package/dist/src/functions/sort.d.ts +38 -0
  35. package/dist/src/functions/sort.d.ts.map +1 -0
  36. package/dist/src/functions/sort.lua +95 -0
  37. package/dist/src/functions/utils.d.ts +0 -54
  38. package/dist/src/functions/utils.d.ts.map +1 -1
  39. package/dist/src/functions/utils.lua +0 -91
  40. package/dist/src/index.d.ts +3 -2
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.lua +17 -1
  43. package/dist/src/interfaces/private/AddCallbackParametersCustom.lua +2 -2
  44. package/dist/src/interfaces/private/ModUpgradedInterface.d.ts +4 -2
  45. package/dist/src/interfaces/private/ModUpgradedInterface.d.ts.map +1 -1
  46. package/dist/src/types/{ModUpgraded.d.ts → private/ModUpgradedWithFeatures.d.ts} +13 -9
  47. package/dist/src/types/private/ModUpgradedWithFeatures.d.ts.map +1 -0
  48. package/dist/src/types/{ModUpgraded.lua → private/ModUpgradedWithFeatures.lua} +0 -0
  49. package/package.json +1 -1
  50. package/src/classes/ModFeature.ts +5 -5
  51. package/src/classes/{ModUpgradedBase.ts → ModUpgraded.ts} +33 -37
  52. package/src/classes/features/other/DebugDisplay.ts +1 -1
  53. package/src/classes/features/other/ExtraConsoleCommands.ts +1 -1
  54. package/src/classes/features/other/extraConsoleCommands/commands.ts +2 -1
  55. package/src/classes/private/CustomCallback.ts +17 -7
  56. package/src/core/upgradeMod.ts +55 -29
  57. package/src/features.ts +1 -1
  58. package/src/functions/console.ts +15 -0
  59. package/src/functions/deepCopy.ts +3 -2
  60. package/src/functions/enums.ts +33 -0
  61. package/src/functions/globals.ts +2 -2
  62. package/src/functions/log.ts +9 -0
  63. package/src/functions/mergeTests.ts +1 -1
  64. package/src/functions/modFeatures.ts +1 -1
  65. package/src/functions/sort.ts +128 -0
  66. package/src/functions/utils.ts +0 -124
  67. package/src/index.ts +3 -2
  68. package/src/interfaces/private/AddCallbackParametersCustom.ts +1 -1
  69. package/src/interfaces/private/ModUpgradedInterface.ts +4 -2
  70. package/src/types/{ModUpgraded.ts → private/ModUpgradedWithFeatures.ts} +13 -9
  71. package/dist/src/classes/ModUpgradedBase.d.ts.map +0 -1
  72. package/dist/src/types/ModUpgraded.d.ts.map +0 -1
@@ -0,0 +1,128 @@
1
+ import { isNumber, isString, isTable } from "./types";
2
+
3
+ function sortNormal(a: unknown, b: unknown): -1 | 0 | 1 {
4
+ if (!isNumber(a) && !isString(a)) {
5
+ error(`Failed to sort since the first value was not a number or string.`);
6
+ }
7
+
8
+ if (!isNumber(b) && !isString(b)) {
9
+ error(`Failed to sort since the second value was not a number or string.`);
10
+ }
11
+
12
+ if (a < b) {
13
+ return -1;
14
+ }
15
+
16
+ if (a > b) {
17
+ return 1;
18
+ }
19
+
20
+ return 0;
21
+ }
22
+
23
+ /**
24
+ * Helper function to sort an array of objects by one of the object keys.
25
+ *
26
+ * For example:
27
+ *
28
+ * ```ts
29
+ * const myArray = [
30
+ * {
31
+ * name: "alice",
32
+ * age: 30,
33
+ * },
34
+ * {
35
+ * name: "bob",
36
+ * age: 20,
37
+ * },
38
+ * ];
39
+ * myArray.sort(sortObjectArrayByKey("age"));
40
+ * ```
41
+ */
42
+ export function sortObjectArrayByKey(key: string) {
43
+ return (a: unknown, b: unknown): -1 | 0 | 1 => {
44
+ if (!isTable(a)) {
45
+ error(
46
+ `Failed to sort an object by the key of "${key}" since the first element was not a table.`,
47
+ );
48
+ }
49
+
50
+ if (!isTable(b)) {
51
+ error(
52
+ `Failed to sort an object by the key of "${key}" since the second element was not a table.`,
53
+ );
54
+ }
55
+
56
+ const aValue = a.get(key);
57
+ const bValue = b.get(key);
58
+
59
+ return sortNormal(aValue, bValue);
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Helper function to sort a two-dimensional array by the first element.
65
+ *
66
+ * For example:
67
+ *
68
+ * ```ts
69
+ * const myArray = [[1, 2], [2, 3], [3, 4]];
70
+ * myArray.sort(twoDimensionalSort);
71
+ * ```
72
+ *
73
+ * This function also properly handles when the array elements are strings or numbers (instead of
74
+ * another array).
75
+ *
76
+ * From:
77
+ * https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value
78
+ */
79
+ export function sortTwoDimensionalArray<T>(a: T[], b: T[]): -1 | 0 | 1 {
80
+ const aType = type(a);
81
+ const bType = type(b);
82
+ if (aType !== bType) {
83
+ error(
84
+ `Failed to two-dimensional sort since the two elements were disparate types: ${a} & ${b} (${aType} & ${bType})`,
85
+ );
86
+ }
87
+
88
+ if (aType === "string" || aType === "number") {
89
+ return sortNormal(a, b);
90
+ }
91
+
92
+ if (aType !== "table") {
93
+ error(
94
+ "Failed to two-dimensional sort since the first element was not a string, number, or table.",
95
+ );
96
+ }
97
+
98
+ if (bType !== "table") {
99
+ error(
100
+ "Failed to two-dimensional sort since the second element was not a string, number, or table.",
101
+ );
102
+ }
103
+
104
+ const firstElement1 = a[0];
105
+ const firstElement2 = b[0];
106
+
107
+ if (firstElement1 === undefined || firstElement1 === null) {
108
+ error(
109
+ "Failed to two-dimensional sort since the first element of the first array was undefined.",
110
+ );
111
+ }
112
+
113
+ if (firstElement2 === undefined || firstElement2 === null) {
114
+ error(
115
+ "Failed to two-dimensional sort since the first element of the second array was undefined.",
116
+ );
117
+ }
118
+
119
+ const elementType1 = type(firstElement1);
120
+ const elementType2 = type(firstElement2);
121
+ if (elementType1 !== elementType2) {
122
+ error(
123
+ `Failed to two-dimensional sort since the first element of each array were disparate types: ${firstElement1} & ${firstElement2} (${elementType1} & ${elementType2})`,
124
+ );
125
+ }
126
+
127
+ return sortNormal(firstElement1, firstElement2);
128
+ }
@@ -1,7 +1,5 @@
1
1
  import { RenderMode } from "isaac-typescript-definitions";
2
2
  import { game } from "../core/cachedClasses";
3
- import { CONSOLE_COMMANDS_SET } from "../sets/consoleCommandsSet";
4
- import { log } from "./log";
5
3
 
6
4
  /**
7
5
  * Helper function to return an array of integers with the specified range, inclusive on the lower
@@ -95,29 +93,6 @@ export function isReflectionRender(): boolean {
95
93
  return renderMode === RenderMode.WATER_REFLECT;
96
94
  }
97
95
 
98
- /**
99
- * Helper function to see if a particular command is a vanilla console command. This is useful
100
- * because the `EXECUTE_CMD` callback will not fire for any vanilla commands.
101
- */
102
- export function isVanillaConsoleCommand(commandName: string): boolean {
103
- return CONSOLE_COMMANDS_SET.has(commandName);
104
- }
105
-
106
- /**
107
- * Helper function to log a message to the "log.txt" file and to print it to the screen at the same
108
- * time.
109
- */
110
- export function logAndPrint(msg: string): void {
111
- log(msg);
112
- print(msg);
113
- }
114
-
115
- /** Helper function to print whether something was enabled or disabled to the in-game console. */
116
- export function printEnabled(enabled: boolean, description: string): void {
117
- const enabledText = enabled ? "Enabled" : "Disabled";
118
- print(`${enabledText} ${description}.`);
119
- }
120
-
121
96
  /**
122
97
  * Helper function to repeat code N times. This is faster to type and cleaner than using a for loop.
123
98
  *
@@ -159,102 +134,3 @@ export function repeat(n: int, func: (i: int) => void): void {
159
134
  */
160
135
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
161
136
  export function todo(...args: unknown[]): void {}
162
-
163
- /**
164
- * Helper function to sort a two-dimensional array by the first element.
165
- *
166
- * For example:
167
- *
168
- * ```ts
169
- * const myArray = [[1, 2], [2, 3], [3, 4]];
170
- * myArray.sort(twoDimensionalSort);
171
- * ```
172
- *
173
- * From:
174
- * https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value
175
- */
176
- export function twoDimensionalSort<T>(array1: T[], array2: T[]): -1 | 0 | 1 {
177
- const type1 = type(array1);
178
- const type2 = type(array2);
179
- if (type1 !== type2) {
180
- error(
181
- `Failed to two-dimensional sort since the two elements were disparate types: ${array1} & ${array2} (${type1} & ${type2})`,
182
- );
183
- }
184
-
185
- if (type1 === "string" || type1 === "number") {
186
- if (array1 === array2) {
187
- return 0;
188
- }
189
-
190
- return array1 < array2 ? -1 : 1;
191
- }
192
-
193
- if (type1 !== "table") {
194
- error(
195
- "Failed to two-dimensional sort since the elements were not a string, number, or table.",
196
- );
197
- }
198
-
199
- const firstElement1 = array1[0];
200
- const firstElement2 = array2[0];
201
-
202
- if (firstElement1 === undefined || firstElement1 === null) {
203
- error(
204
- "Failed to two-dimensional sort since the first element of the first array was undefined.",
205
- );
206
- }
207
-
208
- if (firstElement2 === undefined || firstElement2 === null) {
209
- error(
210
- "Failed to two-dimensional sort since the first element of the second array was undefined.",
211
- );
212
- }
213
-
214
- const elementType1 = type(firstElement1);
215
- const elementType2 = type(firstElement2);
216
- if (elementType1 !== elementType2) {
217
- error(
218
- `Failed to two-dimensional sort since the first element of each array were disparate types: ${firstElement1} & ${firstElement2} (${elementType1} & ${elementType2})`,
219
- );
220
- }
221
-
222
- if (firstElement1 === firstElement2) {
223
- return 0;
224
- }
225
-
226
- return firstElement1 < firstElement2 ? -1 : 1;
227
- }
228
-
229
- /**
230
- * Helper function to validate that an interface contains all of the keys of an enum. You must
231
- * specify both generic parameters in order for this to work properly (i.e. the interface and then
232
- * the enum).
233
- *
234
- * For example:
235
- *
236
- * ```ts
237
- * enum MyEnum {
238
- * Value1,
239
- * Value2,
240
- * Value3,
241
- * }
242
- *
243
- * interface MyEnumToType {
244
- * [MyEnum.Value1]: boolean;
245
- * [MyEnum.Value2]: number;
246
- * [MyEnum.Value3]: string;
247
- * }
248
- *
249
- * validateInterfaceMatchesEnum<MyEnumToType, MyEnum>();
250
- * ```
251
- *
252
- * This function is only meant to be used with interfaces (i.e. types that will not exist at
253
- * run-time). If you are generating an object that will contain all of the keys of an enum, use the
254
- * `satisfies` operator with the `Record` type instead.
255
- */
256
- export function validateInterfaceMatchesEnum<
257
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
258
- T extends Record<Enum, unknown>,
259
- Enum extends string | number,
260
- >(): void {}
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from "./classes/DefaultMap";
2
2
  export * from "./classes/ModFeature";
3
- export * from "./classes/ModUpgradedBase";
3
+ export * from "./classes/ModUpgraded";
4
4
  export * from "./core/cachedClasses";
5
5
  export * from "./core/constants";
6
6
  export * from "./core/constantsFirstLast";
@@ -35,6 +35,7 @@ export * from "./functions/chargeBar";
35
35
  export * from "./functions/collectibles";
36
36
  export * from "./functions/collectibleTag";
37
37
  export * from "./functions/color";
38
+ export * from "./functions/console";
38
39
  export * from "./functions/curses";
39
40
  export * from "./functions/debugFunctions";
40
41
  export * from "./functions/decorators";
@@ -106,6 +107,7 @@ export * from "./functions/seeds";
106
107
  export * from "./functions/serialization";
107
108
  export * from "./functions/set";
108
109
  export * from "./functions/slots";
110
+ export * from "./functions/sort";
109
111
  export * from "./functions/sound";
110
112
  export * from "./functions/spawnCollectible";
111
113
  export * from "./functions/sprites";
@@ -156,7 +158,6 @@ export * from "./types/GridEntityID";
156
158
  export * from "./types/HasFunction";
157
159
  export * from "./types/Immutable";
158
160
  export * from "./types/LowercaseKeys";
159
- export * from "./types/ModUpgraded";
160
161
  export * from "./types/PickingUpItem";
161
162
  export * from "./types/PickupIndex";
162
163
  export * from "./types/PlayerIndex";
@@ -33,7 +33,7 @@ import { HealthType } from "../../enums/HealthType";
33
33
  import { ModCallbackCustom } from "../../enums/ModCallbackCustom";
34
34
  import { SlotDestructionType } from "../../enums/SlotDestructionType";
35
35
  import { StatType } from "../../enums/StatType";
36
- import { validateInterfaceMatchesEnum } from "../../functions/utils";
36
+ import { validateInterfaceMatchesEnum } from "../../functions/enums";
37
37
  import {
38
38
  PickingUpItem,
39
39
  PickingUpItemCollectible,
@@ -1,9 +1,11 @@
1
1
  import { Feature } from "../../classes/private/Feature";
2
2
 
3
3
  /**
4
- * An interface that represents the `ModUpgradedBase` class.
4
+ * An interface that represents the `ModUpgraded` class.
5
5
  *
6
- * These methods are private on the real `ModUpgradedBase` class, so the instantiated class must be
6
+ * This is used to prevent circular dependencies.
7
+ *
8
+ * These methods are private on the real `ModUpgraded` class, so the instantiated class must be
7
9
  * unsafely type-asserted.
8
10
  */
9
11
  export interface ModUpgradedInterface extends Mod {
@@ -1,10 +1,10 @@
1
- import { ModUpgradedBase } from "../classes/ModUpgradedBase";
2
- import { Feature } from "../classes/private/Feature";
3
- import { ISCFeature } from "../enums/ISCFeature";
4
- import { ISCFeatureToClass } from "../features";
5
- import { PublicInterface } from "./PublicInterface";
6
- import { TupleToIntersection } from "./TupleToIntersection";
7
- import { Writeable } from "./Writable";
1
+ import { ModUpgraded } from "../../classes/ModUpgraded";
2
+ import { Feature } from "../../classes/private/Feature";
3
+ import { ISCFeature } from "../../enums/ISCFeature";
4
+ import { ISCFeatureToClass } from "../../features";
5
+ import { PublicInterface } from "../PublicInterface";
6
+ import { TupleToIntersection } from "../TupleToIntersection";
7
+ import { Writeable } from "../Writable";
8
8
 
9
9
  /**
10
10
  * `isaacscript-common` has many custom callbacks that you can use in your mods. Instead of
@@ -15,9 +15,13 @@ import { Writeable } from "./Writable";
15
15
  *
16
16
  * By specifying one or more optional features, end-users will get a version of `ModUpgraded` that
17
17
  * has extra methods corresponding to the features that were specified.
18
+ *
19
+ * This type is in the private directory because if it was exported, it would cause all of the
20
+ * internal feature classes to populate the auto-complete of end-user mods (which should never be
21
+ * directly imported by end-users).
18
22
  */
19
- export type ModUpgraded<T extends readonly ISCFeature[] = []> =
20
- ModUpgradedBase & ISCFeaturesToKeys<T>;
23
+ export type ModUpgradedWithFeatures<T extends readonly ISCFeature[] = []> =
24
+ ModUpgraded & ISCFeaturesToKeys<T>;
21
25
 
22
26
  /**
23
27
  * We want to only extract the class public methods, so we omit the keys of the `Feature` base
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModUpgradedBase.d.ts","sourceRoot":"","sources":["../../../src/classes/ModUpgradedBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAIhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAMhG;;;;;;;;;GASG;AACH,qBAAa,eAAgB,YAAW,GAAG;IAKlC,IAAI,EAAE,MAAM,CAAC;IAMpB,4FAA4F;IAC5F,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,aAAa,CAAoB;IAEzC,OAAO,CAAC,SAAS,CAAC;IAGlB,OAAO,CAAC,QAAQ,CAAC;gBAML,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,KAAK;IAgB3D;;;;OAIG;IACI,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,MAAM,EAC/C,WAAW,EAAE,CAAC,EACd,GAAG,IAAI,EAAE,CAAC,SAAS,WAAW,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,GACpE,IAAI;IAIA,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,MAAM,EACvD,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,gBAAgB,GAAG,GAAG,EAChC,GAAG,IAAI,EAAE,CAAC,SAAS,WAAW,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,GACpE,IAAI;IAwDP,0FAA0F;IACnF,OAAO,IAAI,OAAO;IAIzB;;;OAGG;IACI,QAAQ,IAAI,MAAM;IAIzB;;;;;OAKG;IACI,cAAc,CAAC,CAAC,SAAS,WAAW,EACzC,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACpC,IAAI;IAIP,6EAA6E;IACtE,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC;;;;OAIG;IACI,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,EAClD,iBAAiB,EAAE,CAAC,EACpB,GAAG,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACtC,IAAI;IAOP;;;;;OAKG;IACI,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EACrD,iBAAiB,EAAE,CAAC,EACpB,QAAQ,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC1C,IAAI;IAOP;;;OAGG;IACI,eAAe,IAAI,IAAI;IA0C9B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA+DnB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAsDrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAIhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModUpgraded.d.ts","sourceRoot":"","sources":["../../../src/types/ModUpgraded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,UAAU,EAAE,GAAG,EAAE,IAC1D,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAEzC;;;GAGG;AACH,KAAK,iBAAiB,CAAC,CAAC,SAAS,SAAS,UAAU,EAAE,IAAI,IAAI,CAC5D,mBAAmB,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9D,MAAM,OAAO,CACd,CAAC;AAEF;;;GAGG;AACH,KAAK,2BAA2B,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI;KACxD,GAAG,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7D,CAAC"}