@mkven/samples-generation 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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +484 -0
  3. package/dist/generator/base-generator.d.ts +39 -0
  4. package/dist/generator/base-generator.d.ts.map +1 -0
  5. package/dist/generator/base-generator.js +72 -0
  6. package/dist/generator/base-generator.js.map +1 -0
  7. package/dist/generator/clickhouse-generator.d.ts +44 -0
  8. package/dist/generator/clickhouse-generator.d.ts.map +1 -0
  9. package/dist/generator/clickhouse-generator.js +452 -0
  10. package/dist/generator/clickhouse-generator.js.map +1 -0
  11. package/dist/generator/escape.d.ts +18 -0
  12. package/dist/generator/escape.d.ts.map +1 -0
  13. package/dist/generator/escape.js +25 -0
  14. package/dist/generator/escape.js.map +1 -0
  15. package/dist/generator/index.d.ts +9 -0
  16. package/dist/generator/index.d.ts.map +1 -0
  17. package/dist/generator/index.js +8 -0
  18. package/dist/generator/index.js.map +1 -0
  19. package/dist/generator/postgres-generator.d.ts +33 -0
  20. package/dist/generator/postgres-generator.d.ts.map +1 -0
  21. package/dist/generator/postgres-generator.js +317 -0
  22. package/dist/generator/postgres-generator.js.map +1 -0
  23. package/dist/generator/sqlite-generator.d.ts +30 -0
  24. package/dist/generator/sqlite-generator.d.ts.map +1 -0
  25. package/dist/generator/sqlite-generator.js +334 -0
  26. package/dist/generator/sqlite-generator.js.map +1 -0
  27. package/dist/generator/trino-generator.d.ts +38 -0
  28. package/dist/generator/trino-generator.d.ts.map +1 -0
  29. package/dist/generator/trino-generator.js +408 -0
  30. package/dist/generator/trino-generator.js.map +1 -0
  31. package/dist/generator/types.d.ts +230 -0
  32. package/dist/generator/types.d.ts.map +1 -0
  33. package/dist/generator/types.js +2 -0
  34. package/dist/generator/types.js.map +1 -0
  35. package/dist/generator/utils.d.ts +14 -0
  36. package/dist/generator/utils.d.ts.map +1 -0
  37. package/dist/generator/utils.js +48 -0
  38. package/dist/generator/utils.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -0
  43. package/package.json +75 -0
@@ -0,0 +1,334 @@
1
+ import Database from "better-sqlite3";
2
+ import { BaseDataGenerator } from "./base-generator.js";
3
+ import { getLookupTableName } from "./utils.js";
4
+ function columnTypeToSqlite(column) {
5
+ switch (column.type) {
6
+ case "integer":
7
+ case "bigint":
8
+ return "INTEGER";
9
+ case "float":
10
+ return "REAL";
11
+ case "string":
12
+ return "TEXT";
13
+ case "boolean":
14
+ return "INTEGER";
15
+ case "datetime":
16
+ case "date":
17
+ return "TEXT";
18
+ }
19
+ }
20
+ /**
21
+ * Wrap an expression to return NULL with given probability (SQLite)
22
+ */
23
+ function wrapWithNullCheck(expr, nullProbability) {
24
+ if (nullProbability <= 0)
25
+ return expr;
26
+ if (nullProbability >= 1)
27
+ return "NULL";
28
+ // abs(random()) / 9223372036854775807.0 gives 0 to 1
29
+ return `CASE WHEN abs(random()) / 9223372036854775807.0 < ${String(nullProbability)} THEN NULL ELSE ${expr} END`;
30
+ }
31
+ /**
32
+ * Convert a generator config to a SQLite SQL expression
33
+ * SQLite uses 'n' as the row number from the recursive CTE (1-based)
34
+ */
35
+ export function generatorToSqliteExpr(gen, seqExpr) {
36
+ switch (gen.kind) {
37
+ case "sequence": {
38
+ const start = gen.start ?? 1;
39
+ const step = gen.step ?? 1;
40
+ return `(${String(start)} - 1 + ${seqExpr} * ${String(step)})`;
41
+ }
42
+ case "randomInt":
43
+ // abs(random()) gives 0 to 2^63-1, % range gives 0 to range-1
44
+ return `(${String(gen.min)} + abs(random()) % (${String(gen.max - gen.min + 1)}))`;
45
+ case "randomFloat": {
46
+ const precision = gen.precision ?? 2;
47
+ // random() / 9223372036854775807.0 gives -1 to 1, use abs and scale
48
+ return `round(${String(gen.min)} + (abs(random()) / 9223372036854775807.0) * ${String(gen.max - gen.min)}, ${String(precision)})`;
49
+ }
50
+ case "randomString": {
51
+ const len = gen.length;
52
+ // SQLite doesn't have md5, use hex(randomblob) and substr
53
+ return `substr(hex(randomblob(${String(Math.ceil(len / 2))})), 1, ${String(len)})`;
54
+ }
55
+ case "choice": {
56
+ const values = gen.values;
57
+ // Build a CASE expression based on random index
58
+ const count = values.length;
59
+ const cases = values
60
+ .map((v, i) => {
61
+ const val = typeof v === "string" ? `'${v}'` : String(v);
62
+ return `WHEN ${String(i)} THEN ${val}`;
63
+ })
64
+ .join(" ");
65
+ return `CASE (abs(random()) % ${String(count)}) ${cases} END`;
66
+ }
67
+ case "choiceByLookup": {
68
+ // SQLite: use json_extract from the CTE json array
69
+ const cteName = getLookupTableName(gen.values);
70
+ const count = gen.values.length;
71
+ return `json_extract(${cteName}.arr, '$[' || (abs(random()) % ${String(count)}) || ']')`;
72
+ }
73
+ case "constant": {
74
+ const val = gen.value;
75
+ return typeof val === "string" ? `'${val}'` : String(val);
76
+ }
77
+ case "datetime": {
78
+ const from = gen.from ?? new Date("2020-01-01");
79
+ const to = gen.to ?? new Date();
80
+ const fromTs = Math.floor(from.getTime() / 1000);
81
+ const toTs = Math.floor(to.getTime() / 1000);
82
+ // SQLite stores datetime as ISO string
83
+ return `datetime(${String(fromTs)} + abs(random()) % ${String(toTs - fromTs)}, 'unixepoch')`;
84
+ }
85
+ case "uuid":
86
+ // SQLite doesn't have native UUID, generate a pseudo-UUID from random bytes
87
+ return `lower(hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-4' || substr(hex(randomblob(2)),2) || '-' || substr('89ab', abs(random()) % 4 + 1, 1) || substr(hex(randomblob(2)),2) || '-' || hex(randomblob(6)))`;
88
+ }
89
+ }
90
+ export class SQLiteDataGenerator extends BaseDataGenerator {
91
+ config;
92
+ name = "sqlite";
93
+ db = null;
94
+ constructor(config) {
95
+ super();
96
+ this.config = config;
97
+ }
98
+ connect() {
99
+ this.db = new Database(this.config.path);
100
+ return Promise.resolve();
101
+ }
102
+ disconnect() {
103
+ if (this.db) {
104
+ this.db.close();
105
+ this.db = null;
106
+ }
107
+ return Promise.resolve();
108
+ }
109
+ getDb() {
110
+ if (!this.db) {
111
+ throw new Error("Not connected to SQLite");
112
+ }
113
+ return this.db;
114
+ }
115
+ createTable(table) {
116
+ const db = this.getDb();
117
+ const columns = table.columns
118
+ .map((col) => `${col.name} ${columnTypeToSqlite(col)}${col.nullable ? "" : " NOT NULL"}`)
119
+ .join(", ");
120
+ db.exec(`CREATE TABLE IF NOT EXISTS ${table.name} (${columns})`);
121
+ return Promise.resolve();
122
+ }
123
+ truncateTable(tableName) {
124
+ const db = this.getDb();
125
+ db.exec(`DELETE FROM ${tableName}`);
126
+ return Promise.resolve();
127
+ }
128
+ dropTable(tableName) {
129
+ const db = this.getDb();
130
+ db.exec(`DROP TABLE IF EXISTS ${tableName}`);
131
+ return Promise.resolve();
132
+ }
133
+ generateNative(table, rowCount, startSequence) {
134
+ const db = this.getDb();
135
+ // Collect choiceByLookup generators for additional CTEs
136
+ const lookupCtes = [];
137
+ for (const col of table.columns) {
138
+ if (col.generator.kind === "choiceByLookup") {
139
+ const gen = col.generator;
140
+ const cteName = getLookupTableName(gen.values);
141
+ // Store as JSON array
142
+ const jsonArray = JSON.stringify(gen.values);
143
+ lookupCtes.push(`${cteName}(arr) AS (SELECT '${jsonArray.replace(/'/g, "''")}')`);
144
+ }
145
+ }
146
+ // Build column list and expressions
147
+ const columns = table.columns.map((c) => c.name);
148
+ const seqExpr = "n";
149
+ const expressions = table.columns.map((col) => {
150
+ let expr = generatorToSqliteExpr(col.generator, seqExpr);
151
+ // Apply null probability if specified
152
+ if (col.nullable && col.nullProbability && col.nullProbability > 0) {
153
+ expr = wrapWithNullCheck(expr, col.nullProbability);
154
+ }
155
+ return expr;
156
+ });
157
+ // Cross join with lookup CTEs
158
+ const lookupJoins = lookupCtes.length > 0
159
+ ? ", " +
160
+ [
161
+ ...new Set(table.columns
162
+ .filter((c) => c.generator.kind === "choiceByLookup")
163
+ .map((c) => getLookupTableName(c.generator.values))),
164
+ ].join(", ")
165
+ : "";
166
+ // Combine all CTEs
167
+ const allCtes = [
168
+ `seq(n) AS (
169
+ SELECT ${String(startSequence)}
170
+ UNION ALL
171
+ SELECT n + 1 FROM seq WHERE n < ${String(startSequence + rowCount - 1)}
172
+ )`,
173
+ ...lookupCtes,
174
+ ];
175
+ // Use recursive CTE to generate sequence
176
+ const insertSql = `
177
+ WITH RECURSIVE ${allCtes.join(", ")}
178
+ INSERT INTO ${table.name} (${columns.join(", ")})
179
+ SELECT ${expressions.join(", ")}
180
+ FROM seq${lookupJoins}
181
+ `;
182
+ db.exec(insertSql);
183
+ return Promise.resolve();
184
+ }
185
+ queryRows(tableName, limit = 100) {
186
+ const db = this.getDb();
187
+ const result = db
188
+ .prepare(`SELECT * FROM ${tableName} LIMIT ?`)
189
+ .all(limit);
190
+ return Promise.resolve(result);
191
+ }
192
+ countRows(tableName) {
193
+ const db = this.getDb();
194
+ const result = db
195
+ .prepare(`SELECT COUNT(*) as count FROM ${tableName}`)
196
+ .get();
197
+ return Promise.resolve(result.count);
198
+ }
199
+ getMaxValue(tableName, columnName) {
200
+ const db = this.getDb();
201
+ const result = db
202
+ .prepare(`SELECT MAX(${columnName}) as max_val FROM ${tableName}`)
203
+ .get();
204
+ return Promise.resolve(result.max_val);
205
+ }
206
+ getTableSize(tableName) {
207
+ const db = this.getDb();
208
+ // Use dbstat virtual table to get table + index size
209
+ try {
210
+ const result = db
211
+ .prepare(`SELECT SUM(pgsize) as size FROM dbstat WHERE name = ? OR name IN (SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = ?)`)
212
+ .get(tableName, tableName);
213
+ return Promise.resolve(result.size);
214
+ }
215
+ catch {
216
+ // dbstat may not be available, fall back to page-based estimate
217
+ const pageCount = db.prepare(`PRAGMA page_count`).get();
218
+ const pageSize = db.prepare(`PRAGMA page_size`).get();
219
+ return Promise.resolve(pageCount.page_count * pageSize.page_size);
220
+ }
221
+ }
222
+ optimize(_tableName) {
223
+ const db = this.getDb();
224
+ // VACUUM rebuilds the database file to reclaim space
225
+ db.exec(`VACUUM`);
226
+ // ANALYZE gathers statistics for the query planner
227
+ db.exec(`ANALYZE`);
228
+ return Promise.resolve();
229
+ }
230
+ applyTransformations(tableName, transformations) {
231
+ if (transformations.length === 0)
232
+ return Promise.resolve();
233
+ const db = this.getDb();
234
+ // SQLite identifier escaping with double quotes
235
+ const escapeId = (name) => `"${name.replace(/"/g, '""')}"`;
236
+ const escapedTable = escapeId(tableName);
237
+ const setClauses = [];
238
+ for (const t of transformations) {
239
+ switch (t.kind) {
240
+ case "template": {
241
+ const escapedCol = escapeId(t.column);
242
+ // Replace {column_name} with column references
243
+ let expr = `'${t.template.replace(/'/g, "''")}'`;
244
+ const refs = t.template.match(/\{([^}]+)\}/g) ?? [];
245
+ for (const ref of refs) {
246
+ const colName = ref.slice(1, -1);
247
+ const colRef = escapeId(colName);
248
+ // Replace {col} with concatenation
249
+ expr = expr.replace(`'{${colName}}'`, `' || ${colRef} || '`);
250
+ expr = expr.replace(`{${colName}}`, `' || ${colRef} || '`);
251
+ }
252
+ // Clean up empty string concatenations
253
+ expr = expr.replace(/^'' \|\| /, "").replace(/ \|\| ''$/, "");
254
+ expr = expr.replace(/' \|\| '' \|\| '/g, "' || '");
255
+ if (t.lowercase) {
256
+ expr = `lower(${expr})`;
257
+ }
258
+ setClauses.push(`${escapedCol} = ${expr}`);
259
+ break;
260
+ }
261
+ case "mutate": {
262
+ const escapedCol = escapeId(t.column);
263
+ // Random string mutation using SQLite functions
264
+ const { probability, operations } = t;
265
+ // SQLite random() returns int64, abs+modulo to get position
266
+ const randomPos = `(abs(random()) % max(length(${escapedCol}), 1)) + 1`;
267
+ // Build mutation expressions for each operation
268
+ const mutationExprs = {
269
+ replace: `substr(${escapedCol}, 1, ${randomPos} - 1) || 'X' || substr(${escapedCol}, ${randomPos} + 1)`,
270
+ delete: `substr(${escapedCol}, 1, ${randomPos} - 1) || substr(${escapedCol}, ${randomPos} + 1)`,
271
+ insert: `substr(${escapedCol}, 1, ${randomPos}) || 'X' || substr(${escapedCol}, ${randomPos} + 1)`,
272
+ };
273
+ // Build expression that randomly picks from available operations
274
+ let mutateExpr;
275
+ if (operations.length === 1) {
276
+ // We know operations[0] exists since length === 1
277
+ mutateExpr = mutationExprs[operations[0]]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
278
+ }
279
+ else {
280
+ // Use modulo to pick operation index, then CASE to select expression
281
+ const opIndex = `(abs(random()) % ${String(operations.length)})`;
282
+ const cases = operations.map((op, i) => {
283
+ if (i === operations.length - 1) {
284
+ return `ELSE ${mutationExprs[op]}`;
285
+ }
286
+ return `WHEN ${opIndex} = ${String(i)} THEN ${mutationExprs[op]}`;
287
+ });
288
+ mutateExpr = `(CASE ${cases.join(" ")} END)`;
289
+ }
290
+ // Use <= for probability to handle edge case where probability = 1.0
291
+ setClauses.push(`${escapedCol} = CASE WHEN abs(random()) / 9223372036854775807.0 <= ${String(probability)} THEN ${mutateExpr} ELSE ${escapedCol} END`);
292
+ break;
293
+ }
294
+ case "lookup": {
295
+ const escapedCol = escapeId(t.column);
296
+ // Lookup value from another table via join
297
+ // SQLite uses correlated subquery
298
+ const fromTable = escapeId(t.fromTable);
299
+ const fromCol = escapeId(t.fromColumn);
300
+ const targetJoinCol = escapeId(t.joinOn.targetColumn);
301
+ const lookupJoinCol = escapeId(t.joinOn.lookupColumn);
302
+ setClauses.push(`${escapedCol} = (SELECT ${fromCol} FROM ${fromTable} WHERE ${lookupJoinCol} = ${escapedTable}.${targetJoinCol})`);
303
+ break;
304
+ }
305
+ case "swap": {
306
+ // Swap handled separately - needs both columns in one UPDATE
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ // Handle swap transformations separately (need atomic swap with same random)
312
+ const swapTransformations = transformations.filter((t) => t.kind === "swap");
313
+ for (const swap of swapTransformations) {
314
+ const col1 = escapeId(swap.column1);
315
+ const col2 = escapeId(swap.column2);
316
+ const prob = String(swap.probability);
317
+ // SQLite: random() returns int64, divide by max int64 for 0-1 range
318
+ // SET a = b, b = a works atomically in SQLite (uses old values on right side)
319
+ const swapSql = `
320
+ UPDATE ${escapedTable} SET
321
+ ${col1} = ${col2},
322
+ ${col2} = ${col1}
323
+ WHERE abs(random()) / 9223372036854775807.0 < ${prob}
324
+ `;
325
+ db.exec(swapSql);
326
+ }
327
+ if (setClauses.length === 0)
328
+ return Promise.resolve();
329
+ const updateSql = `UPDATE ${escapedTable} SET ${setClauses.join(", ")}`;
330
+ db.exec(updateSql);
331
+ return Promise.resolve();
332
+ }
333
+ }
334
+ //# sourceMappingURL=sqlite-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-generator.js","sourceRoot":"","sources":["../../src/generator/sqlite-generator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAWtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMhD,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,eAAuB;IAC9D,IAAI,eAAe,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,eAAe,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,qDAAqD;IACrD,OAAO,qDAAqD,MAAM,CAAC,eAAe,CAAC,mBAAmB,IAAI,MAAM,CAAC;AACnH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAoB,EACpB,OAAe;IAEf,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACjE,CAAC;QACD,KAAK,WAAW;YACd,8DAA8D;YAC9D,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;QACrF,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;YACrC,oEAAoE;YACpE,OAAO,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gDAAgD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QACpI,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;YACvB,0DAA0D;YAC1D,OAAO,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACrF,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,gDAAgD;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM;iBACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACZ,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;YACzC,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,OAAO,yBAAyB,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC;QAChE,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,mDAAmD;YACnD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,OAAO,gBAAgB,OAAO,kCAAkC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAC3F,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;YACtB,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,uCAAuC;YACvC,OAAO,YAAY,MAAM,CAAC,MAAM,CAAC,sBAAsB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAC/F,CAAC;QACD,KAAK,MAAM;YACT,4EAA4E;YAC5E,OAAO,gNAAgN,CAAC;IAC5N,CAAC;AACH,CAAC;AAED,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IAIpC;IAHX,IAAI,GAAG,QAAQ,CAAC;IACjB,EAAE,GAA6B,IAAI,CAAC;IAE5C,YAAoB,MAAoB;QACtC,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAc;IAExC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,KAAkB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;aAC1B,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,GAAG,CAAC,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAC7E;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,EAAE,CAAC,IAAI,CAAC,8BAA8B,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;QACjE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,EAAE,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,EAAE,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,cAAc,CACtB,KAAkB,EAClB,QAAgB,EAChB,aAAqB;QAErB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAExB,wDAAwD;QACxD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;gBAC1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,sBAAsB;gBACtB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,UAAU,CAAC,IAAI,CACb,GAAG,OAAO,qBAAqB,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,GAAG,CAAC;QACpB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,IAAI,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,sCAAsC;YACtC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;gBACnE,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI;gBACJ;oBACE,GAAG,IAAI,GAAG,CACR,KAAK,CAAC,OAAO;yBACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC;yBACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,kBAAkB,CACf,CAAC,CAAC,SAAqC,CAAC,MAAM,CAChD,CACF,CACJ;iBACF,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;QAET,mBAAmB;QACnB,MAAM,OAAO,GAAG;YACd;iBACW,MAAM,CAAC,aAAa,CAAC;;0CAEI,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,CAAC,CAAC;QACtE;YACF,GAAG,UAAU;SACd,CAAC;QAEF,yCAAyC;QACzC,MAAM,SAAS,GAAG;uBACC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;oBACrB,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;eACtC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrB,WAAW;KACtB,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,iBAAiB,SAAS,UAAU,CAAC;aAC7C,GAAG,CAAC,KAAK,CAAmB,CAAC;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,iCAAiC,SAAS,EAAE,CAAC;aACrD,GAAG,EAAuB,CAAC;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,UAAkB;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,cAAc,UAAU,qBAAqB,SAAS,EAAE,CAAC;aACjE,GAAG,EAAgC,CAAC;QACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,qDAAqD;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE;iBACd,OAAO,CACN,yIAAyI,CAC1I;iBACA,GAAG,CAAC,SAAS,EAAE,SAAS,CAA4B,CAAC;YACxD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,EAEpD,CAAC;YACF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAElD,CAAC;YACF,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,UAAkB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,qDAAqD;QACrD,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClB,mDAAmD;QACnD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAES,oBAAoB,CAC5B,SAAiB,EACjB,eAAiC;QAEjC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAE3D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC3E,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACtC,+CAA+C;oBAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;oBACjD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;oBACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;wBACjC,mCAAmC;wBACnC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,OAAO,IAAI,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;wBAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;oBAC7D,CAAC;oBACD,uCAAuC;oBACvC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;oBAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;oBACnD,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAChB,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC;oBAC1B,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,IAAI,EAAE,CAAC,CAAC;oBAC3C,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACtC,gDAAgD;oBAChD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;oBACtC,4DAA4D;oBAC5D,MAAM,SAAS,GAAG,+BAA+B,UAAU,YAAY,CAAC;oBAExE,gDAAgD;oBAChD,MAAM,aAAa,GAAsC;wBACvD,OAAO,EAAE,UAAU,UAAU,QAAQ,SAAS,0BAA0B,UAAU,KAAK,SAAS,OAAO;wBACvG,MAAM,EAAE,UAAU,UAAU,QAAQ,SAAS,mBAAmB,UAAU,KAAK,SAAS,OAAO;wBAC/F,MAAM,EAAE,UAAU,UAAU,QAAQ,SAAS,sBAAsB,UAAU,KAAK,SAAS,OAAO;qBACnG,CAAC;oBAEF,iEAAiE;oBACjE,IAAI,UAAkB,CAAC;oBACvB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC5B,kDAAkD;wBAClD,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,+DAA+D;oBAC7G,CAAC;yBAAM,CAAC;wBACN,qEAAqE;wBACrE,MAAM,OAAO,GAAG,oBAAoB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;wBACjE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;4BACrC,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAChC,OAAO,QAAQ,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;4BACrC,CAAC;4BACD,OAAO,QAAQ,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;wBACpE,CAAC,CAAC,CAAC;wBACH,UAAU,GAAG,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;oBAC/C,CAAC;oBAED,qEAAqE;oBACrE,UAAU,CAAC,IAAI,CACb,GAAG,UAAU,yDAAyD,MAAM,CAAC,WAAW,CAAC,SAAS,UAAU,SAAS,UAAU,MAAM,CACtI,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACtC,2CAA2C;oBAC3C,kCAAkC;oBAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;oBACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACtD,MAAM,aAAa,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAEtD,UAAU,CAAC,IAAI,CACb,GAAG,UAAU,cAAc,OAAO,SAAS,SAAS,UAAU,aAAa,MAAM,YAAY,IAAI,aAAa,GAAG,CAClH,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,6DAA6D;oBAC7D,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,6EAA6E;QAC7E,MAAM,mBAAmB,GAAG,eAAe,CAAC,MAAM,CAChD,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAClD,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEtC,oEAAoE;YACpE,8EAA8E;YAC9E,MAAM,OAAO,GAAG;iBACL,YAAY;YACjB,IAAI,MAAM,IAAI;YACd,IAAI,MAAM,IAAI;wDAC8B,IAAI;OACrD,CAAC;YACF,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAEtD,MAAM,SAAS,GAAG,UAAU,YAAY,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { TableConfig, GeneratedRow, GeneratorConfig, Transformation } from "./types.js";
2
+ import { BaseDataGenerator } from "./base-generator.js";
3
+ export interface TrinoConfig {
4
+ host: string;
5
+ port: number;
6
+ catalog: string;
7
+ schema: string;
8
+ user: string;
9
+ }
10
+ /**
11
+ * Convert a generator config to a Trino SQL expression
12
+ * Trino uses 'n' as the row number from UNNEST(sequence(...))
13
+ */
14
+ export declare function generatorToTrinoExpr(gen: GeneratorConfig, seqExpr: string): string;
15
+ export declare class TrinoDataGenerator extends BaseDataGenerator {
16
+ private config;
17
+ readonly name = "trino";
18
+ private trino;
19
+ private escapedCatalog;
20
+ private escapedSchema;
21
+ constructor(config: TrinoConfig);
22
+ private get fullSchemaPath();
23
+ connect(): Promise<void>;
24
+ disconnect(): Promise<void>;
25
+ private getTrino;
26
+ private fullTableName;
27
+ createTable(table: TableConfig): Promise<void>;
28
+ truncateTable(tableName: string): Promise<void>;
29
+ dropTable(tableName: string): Promise<void>;
30
+ protected generateNative(table: TableConfig, rowCount: number, startSequence: number): Promise<void>;
31
+ queryRows(tableName: string, limit?: number): Promise<GeneratedRow[]>;
32
+ countRows(tableName: string): Promise<number>;
33
+ getMaxValue(tableName: string, columnName: string): Promise<number | null>;
34
+ getTableSize(tableName: string): Promise<number | null>;
35
+ optimize(tableName: string): Promise<void>;
36
+ protected applyTransformations(tableName: string, transformations: Transformation[]): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=trino-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trino-generator.d.ts","sourceRoot":"","sources":["../../src/generator/trino-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,eAAe,EAEf,cAAc,EAGf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AA8BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CA+CR;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IAM3C,OAAO,CAAC,MAAM;IAL1B,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAEV,MAAM,EAAE,WAAW;IAMvC,OAAO,KAAK,cAAc,GAEzB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,aAAa;IAIf,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAcjC,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IA8EV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBlE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB7C,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBnB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBvD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cA8BhC,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,cAAc,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;CAgIjB"}