peta-orm 0.2.3 → 0.2.5

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 (46) hide show
  1. package/README.md +3 -0
  2. package/dist/builder/eager-loader.d.ts.map +1 -1
  3. package/dist/builder/index.d.ts +0 -2
  4. package/dist/builder/index.d.ts.map +1 -1
  5. package/dist/builder/query-builder.d.ts +4 -12
  6. package/dist/builder/query-builder.d.ts.map +1 -1
  7. package/dist/collection/collection.d.ts.map +1 -1
  8. package/dist/columns/arktype-config.d.ts +0 -4
  9. package/dist/columns/arktype-config.d.ts.map +1 -1
  10. package/dist/errors/errors.d.ts +4 -2
  11. package/dist/errors/errors.d.ts.map +1 -1
  12. package/dist/index-fm51cegm.js +681 -0
  13. package/dist/{index-zth6eamb.js → index-qb301480.js} +20 -3
  14. package/dist/{index-qwps5bne.js → index-sm1xx8gs.js} +296 -2
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +8858 -646
  18. package/dist/migrations/cli.js +2 -2
  19. package/dist/migrations/generator.d.ts.map +1 -1
  20. package/dist/migrations/index.js +2 -2
  21. package/dist/model/model-delete.d.ts +7 -0
  22. package/dist/model/model-delete.d.ts.map +1 -0
  23. package/dist/model/model-hooks.d.ts +10 -0
  24. package/dist/model/model-hooks.d.ts.map +1 -0
  25. package/dist/model/model-relation.d.ts +7 -0
  26. package/dist/model/model-relation.d.ts.map +1 -0
  27. package/dist/model/model-save.d.ts +6 -0
  28. package/dist/model/model-save.d.ts.map +1 -0
  29. package/dist/model/model-scope.d.ts +6 -0
  30. package/dist/model/model-scope.d.ts.map +1 -0
  31. package/dist/model/model-serialize.d.ts +3 -0
  32. package/dist/model/model-serialize.d.ts.map +1 -0
  33. package/dist/model/model-state.d.ts +27 -0
  34. package/dist/model/model-state.d.ts.map +1 -0
  35. package/dist/model/model.d.ts +17 -12
  36. package/dist/model/model.d.ts.map +1 -1
  37. package/dist/{paginator-xrvkmdyk.js → paginator-1amtn90p.js} +1 -1
  38. package/dist/peta.d.ts.map +1 -1
  39. package/dist/relations/morph.d.ts +1 -0
  40. package/dist/relations/morph.d.ts.map +1 -1
  41. package/dist/relations/relation.d.ts +1 -0
  42. package/dist/relations/relation.d.ts.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/builder/insert-builder.d.ts +0 -9
  45. package/dist/builder/insert-builder.d.ts.map +0 -1
  46. package/dist/index-676a0j9y.js +0 -9062
@@ -5,6 +5,7 @@ import {
5
5
  CreateViewNode,
6
6
  IdentifierNode,
7
7
  InsertQueryNode,
8
+ ManyToMany,
8
9
  MergeQueryNode,
9
10
  NOOP_QUERY_EXECUTOR,
10
11
  OperatorNode,
@@ -30,7 +31,7 @@ import {
30
31
  parseTable,
31
32
  parseValueExpression,
32
33
  preventAwait
33
- } from "./index-qwps5bne.js";
34
+ } from "./index-sm1xx8gs.js";
34
35
  import {
35
36
  __require
36
37
  } from "./index-k18nf2r7.js";
@@ -2091,6 +2092,8 @@ class MigrationGenerator {
2091
2092
  const timestamp = new Date().toISOString().replace(/[-:T.Z]/g, "").slice(0, 14);
2092
2093
  const parts = [];
2093
2094
  const indexParts = [];
2095
+ const warnings = [];
2096
+ const registeredTables = new Set([...models.values()].map((m) => m.table).filter(Boolean));
2094
2097
  for (const [, modelClass] of models) {
2095
2098
  const table = modelClass.table;
2096
2099
  if (!table)
@@ -2102,16 +2105,30 @@ class MigrationGenerator {
2102
2105
  indexParts.push(this.#generateCreateIndex(table, colName));
2103
2106
  }
2104
2107
  }
2108
+ for (const [relName, rel] of Object.entries(modelClass.relations ?? {})) {
2109
+ if (rel instanceof ManyToMany) {
2110
+ const through = rel.throughTable;
2111
+ if (!registeredTables.has(through)) {
2112
+ warnings.push(`// \u26A0 Detected ManyToMany "${modelClass.name}.${relName}" references table "${through}" ` + `but no model is registered for it.
2113
+ ` + `// Add a model class with static override table = "${through}" to include the pivot ` + `table in the generated migration.`);
2114
+ }
2115
+ }
2116
+ }
2105
2117
  }
2106
2118
  const upBody = [...parts, ...indexParts].join(`
2107
2119
 
2108
2120
  `);
2109
2121
  const downTables = [...models.values()].filter((m) => m.table).map((m) => ` await db.schema.dropTable("${m.table}").ifExists().execute()`);
2122
+ const warningBlock = warnings.length > 0 ? ` // Warnings:
2123
+ ${warnings.join(`
2124
+ `)}
2125
+
2126
+ ` : "";
2110
2127
  return `import type { Kysely } from "kysely"
2111
2128
  import { sql } from "kysely"
2112
2129
 
2113
2130
  export async function up(db: Kysely<any>): Promise<void> {
2114
- ${upBody}
2131
+ ${warningBlock}${upBody}
2115
2132
  }
2116
2133
 
2117
2134
  export async function down(db: Kysely<any>): Promise<void> {
@@ -2122,7 +2139,7 @@ ${downTables.join(`
2122
2139
  }
2123
2140
  #generateCreateTable(table, columns) {
2124
2141
  const lines = [];
2125
- lines.push(` await db.schema.createTable("${table}")`);
2142
+ lines.push(` await db.schema.createTable("${table}").ifNotExists()`);
2126
2143
  for (const [name, col] of Object.entries(columns)) {
2127
2144
  const typeSql = this.#mapType(col);
2128
2145
  const cb = this.#columnCallback(col);
@@ -7473,7 +7473,8 @@ function validateTransactionSettings(settings) {
7473
7473
  // src/peta.ts
7474
7474
  import { resolve } from "path";
7475
7475
  function isModelClass(value) {
7476
- return typeof value === "function" && typeof value.table === "string" && value.table.length > 0 && typeof value.columns === "object" && value.columns !== null;
7476
+ const v = value;
7477
+ return typeof value === "function" && typeof v.table === "string" && v.table.length > 0 && typeof v.columns === "object" && v.columns !== null;
7477
7478
  }
7478
7479
 
7479
7480
  class Peta {
@@ -7531,4 +7532,297 @@ class Peta {
7531
7532
  }
7532
7533
  }
7533
7534
 
7534
- export { isString, isNumber, isBoolean, isNull, isDate, isBigInt, getLast, freeze, IdentifierNode, CreateTableNode, AliasNode, isOperationNodeSource, OperatorNode, RawNode, parseStringReference, ValueNode, parseValueExpression, ParensNode, preventAwait, InsertQueryNode, MergeQueryNode, QueryNode, createQueryId, WithSchemaPlugin, NOOP_QUERY_EXECUTOR, SetOperationNode, parseTable, CreateViewNode, isModelClass, Peta };
7535
+ // src/relations/relation.ts
7536
+ var thunkCache = new WeakMap;
7537
+ function resolve2(thunk) {
7538
+ let cls = thunkCache.get(thunk);
7539
+ if (!cls) {
7540
+ cls = thunk();
7541
+ thunkCache.set(thunk, cls);
7542
+ }
7543
+ return cls;
7544
+ }
7545
+ function guessForeignKey(modelClass) {
7546
+ const table = modelClass.table;
7547
+ const singular = table.endsWith("s") ? table.slice(0, -1) : table;
7548
+ return `${singular}Id`;
7549
+ }
7550
+ function groupByArray(items, key) {
7551
+ const result = {};
7552
+ for (const item of items) {
7553
+ const v = item.get(key);
7554
+ if (v == null)
7555
+ continue;
7556
+ const k = String(v);
7557
+ if (!result[k])
7558
+ result[k] = [];
7559
+ result[k].push(item);
7560
+ }
7561
+ return result;
7562
+ }
7563
+
7564
+ class Relation {
7565
+ type;
7566
+ #relatedThunk;
7567
+ constructor(type, relatedThunk) {
7568
+ this.type = type;
7569
+ this.#relatedThunk = relatedThunk;
7570
+ }
7571
+ get relatedModelClass() {
7572
+ return resolve2(this.#relatedThunk);
7573
+ }
7574
+ async loadEager(models, relationName, constraints) {
7575
+ const qb = this.relatedModelClass.query();
7576
+ this.addEagerConstraints(qb, models);
7577
+ if (constraints)
7578
+ constraints(qb);
7579
+ const results = await qb.execute();
7580
+ this.match(models, results, relationName);
7581
+ }
7582
+ }
7583
+
7584
+ class HasMany extends Relation {
7585
+ #options;
7586
+ constructor(relatedThunk, options = {}) {
7587
+ super("hasMany", relatedThunk);
7588
+ this.#options = options;
7589
+ }
7590
+ get foreignKey() {
7591
+ return this.#options.foreignKey ?? guessForeignKey(this.relatedModelClass);
7592
+ }
7593
+ get localKey() {
7594
+ return this.#options.localKey ?? "id";
7595
+ }
7596
+ query(parent) {
7597
+ return this.relatedModelClass.query().where(this.foreignKey, "=", parent.get(this.localKey));
7598
+ }
7599
+ addEagerConstraints(query, models) {
7600
+ const keys = models.map((m) => m.get(this.localKey)).filter((k) => k != null);
7601
+ if (keys.length > 0) {
7602
+ query.whereIn(this.foreignKey, keys);
7603
+ }
7604
+ }
7605
+ match(models, results, relationName) {
7606
+ const grouped = groupByArray(results, this.foreignKey);
7607
+ for (const model of models) {
7608
+ const key = String(model.get(this.localKey));
7609
+ model.$setRelation(relationName, grouped[key] ?? []);
7610
+ }
7611
+ }
7612
+ async getResults(parent) {
7613
+ return await this.query(parent).execute();
7614
+ }
7615
+ }
7616
+
7617
+ class BelongsTo extends Relation {
7618
+ #options;
7619
+ constructor(relatedThunk, options = {}) {
7620
+ super("belongsTo", relatedThunk);
7621
+ this.#options = options;
7622
+ }
7623
+ get foreignKey() {
7624
+ return this.#options.foreignKey ?? guessForeignKey(this.relatedModelClass);
7625
+ }
7626
+ get localKey() {
7627
+ return this.#options.localKey ?? "id";
7628
+ }
7629
+ query(parent) {
7630
+ return this.relatedModelClass.query().where(this.localKey, "=", parent.get(this.foreignKey));
7631
+ }
7632
+ addEagerConstraints(query, models) {
7633
+ const keys = models.map((m) => m.get(this.foreignKey)).filter((k) => k != null);
7634
+ if (keys.length > 0) {
7635
+ query.whereIn(this.localKey, keys);
7636
+ }
7637
+ }
7638
+ match(models, results, relationName) {
7639
+ const grouped = groupByArray(results, this.localKey);
7640
+ for (const model of models) {
7641
+ const key = String(model.get(this.foreignKey));
7642
+ model.$setRelation(relationName, grouped[key]?.[0] ?? null);
7643
+ }
7644
+ }
7645
+ async getResults(parent) {
7646
+ return await this.query(parent).executeTakeFirst() ?? null;
7647
+ }
7648
+ }
7649
+
7650
+ class HasOne extends Relation {
7651
+ #options;
7652
+ constructor(relatedThunk, options = {}) {
7653
+ super("hasOne", relatedThunk);
7654
+ this.#options = options;
7655
+ }
7656
+ get foreignKey() {
7657
+ return this.#options.foreignKey ?? guessForeignKey(this.relatedModelClass);
7658
+ }
7659
+ get localKey() {
7660
+ return this.#options.localKey ?? "id";
7661
+ }
7662
+ query(parent) {
7663
+ return this.relatedModelClass.query().where(this.foreignKey, "=", parent.get(this.localKey));
7664
+ }
7665
+ addEagerConstraints(query, models) {
7666
+ const keys = models.map((m) => m.get(this.localKey)).filter((k) => k != null);
7667
+ if (keys.length > 0) {
7668
+ query.whereIn(this.foreignKey, keys);
7669
+ }
7670
+ }
7671
+ match(models, results, relationName) {
7672
+ const grouped = groupByArray(results, this.foreignKey);
7673
+ for (const model of models) {
7674
+ const key = String(model.get(this.localKey));
7675
+ model.$setRelation(relationName, grouped[key]?.[0] ?? null);
7676
+ }
7677
+ }
7678
+ async getResults(parent) {
7679
+ return await this.query(parent).executeTakeFirst() ?? null;
7680
+ }
7681
+ }
7682
+
7683
+ class ManyToMany extends Relation {
7684
+ #options;
7685
+ #pivotExtras;
7686
+ constructor(relatedThunk, options) {
7687
+ super("manyToMany", relatedThunk);
7688
+ this.#options = options;
7689
+ this.#pivotExtras = options.pivotExtras ?? [];
7690
+ }
7691
+ get foreignKey() {
7692
+ return this.#options.foreignKey ?? guessForeignKey(this.relatedModelClass);
7693
+ }
7694
+ get localKey() {
7695
+ return this.#options.localKey ?? "id";
7696
+ }
7697
+ get throughTable() {
7698
+ return this.#options.through;
7699
+ }
7700
+ get foreignPivotKey() {
7701
+ return this.#options.foreignPivotKey ?? snakeCase(this.foreignKey);
7702
+ }
7703
+ get relatedPivotKey() {
7704
+ return this.#options.relatedPivotKey ?? snakeCase(guessForeignKey(this.relatedModelClass));
7705
+ }
7706
+ #hasExtras() {
7707
+ return this.#pivotExtras.length > 0;
7708
+ }
7709
+ query(parent) {
7710
+ const parentKey = parent.get(this.localKey);
7711
+ const peta = this.relatedModelClass.peta;
7712
+ if (!peta)
7713
+ return this.relatedModelClass.query();
7714
+ if (this.#hasExtras()) {
7715
+ const _relatedTable = this.relatedModelClass.table;
7716
+ const peta2 = this.relatedModelClass.peta;
7717
+ if (!peta2)
7718
+ return this.relatedModelClass.query();
7719
+ const subQb = peta2.kysely.selectFrom(this.throughTable).select(this.relatedPivotKey).where(this.foreignPivotKey, "=", parentKey);
7720
+ return this.relatedModelClass.query().whereIn("id", subQb);
7721
+ }
7722
+ const subquery = peta.kysely.selectFrom(this.throughTable).select(this.relatedPivotKey).where(this.foreignPivotKey, "=", parentKey);
7723
+ return this.relatedModelClass.query().whereIn("id", subquery);
7724
+ }
7725
+ addEagerConstraints(query, models) {
7726
+ const keys = models.map((m) => m.get(this.localKey)).filter((k) => k != null);
7727
+ if (keys.length === 0) {
7728
+ query.whereIn("id", []);
7729
+ return;
7730
+ }
7731
+ const relatedTable = this.relatedModelClass.table;
7732
+ query.innerJoin(this.throughTable, `${this.throughTable}.${this.relatedPivotKey}`, `${relatedTable}.${this.localKey}`);
7733
+ query.whereIn(`${this.throughTable}.${this.foreignPivotKey}`, keys);
7734
+ }
7735
+ match(models, results, relationName) {
7736
+ const grouped = groupByArray(results, `_pivot_${this.foreignPivotKey}`);
7737
+ for (const model of models) {
7738
+ const key = String(model.get(this.localKey));
7739
+ const items = grouped[key] ?? [];
7740
+ for (const item of items) {
7741
+ const pivotData = {};
7742
+ for (const ek of Object.keys(item.attributes ?? {})) {
7743
+ if (ek.startsWith("_pivot_")) {
7744
+ pivotData[ek.slice(7)] = item.get(ek);
7745
+ }
7746
+ }
7747
+ if (Object.keys(pivotData).length > 0) {
7748
+ item.$setRelation("_pivot", pivotData);
7749
+ }
7750
+ }
7751
+ model.$setRelation(relationName, items);
7752
+ }
7753
+ }
7754
+ async getResults(parent) {
7755
+ return await this.query(parent).execute();
7756
+ }
7757
+ }
7758
+
7759
+ class HasManyThrough extends Relation {
7760
+ #options;
7761
+ #throughThunk;
7762
+ constructor(relatedThunk, throughThunk, options = {}) {
7763
+ super("hasManyThrough", relatedThunk);
7764
+ this.#throughThunk = throughThunk;
7765
+ this.#options = options;
7766
+ }
7767
+ get foreignKey() {
7768
+ return this.#options.foreignKey ?? guessForeignKey(resolve2(this.#throughThunk));
7769
+ }
7770
+ get localKey() {
7771
+ return this.#options.localKey ?? "id";
7772
+ }
7773
+ get throughModelClass() {
7774
+ return resolve2(this.#throughThunk);
7775
+ }
7776
+ get throughForeignKey() {
7777
+ return this.#options.throughForeignKey ?? guessForeignKey(this.relatedModelClass);
7778
+ }
7779
+ get throughLocalKey() {
7780
+ return this.#options.throughLocalKey ?? guessForeignKey(this.throughModelClass);
7781
+ }
7782
+ query(parent) {
7783
+ const parentKey = parent.get(this.localKey);
7784
+ const peta = this.relatedModelClass.peta;
7785
+ if (!peta)
7786
+ return this.relatedModelClass.query();
7787
+ const throughTable = this.throughModelClass.table;
7788
+ const _relatedTable = this.relatedModelClass.table;
7789
+ const subquery = peta.kysely.selectFrom(throughTable).select(this.throughForeignKey).where(this.foreignKey, "=", parentKey);
7790
+ return this.relatedModelClass.query().whereIn("id", subquery);
7791
+ }
7792
+ addEagerConstraints(query, models) {
7793
+ const keys = models.map((m) => m.get(this.localKey)).filter((k) => k != null);
7794
+ if (keys.length === 0) {
7795
+ query.whereIn("id", []);
7796
+ return;
7797
+ }
7798
+ const throughTable = this.throughModelClass.table;
7799
+ const relatedTable = this.relatedModelClass.table;
7800
+ query.innerJoin(throughTable, `${throughTable}.${this.throughForeignKey}`, `${relatedTable}.${this.localKey}`);
7801
+ query.whereIn(`${throughTable}.${this.foreignKey}`, keys);
7802
+ }
7803
+ match(models, results, relationName) {
7804
+ const _throughTable = this.throughModelClass.table;
7805
+ const grouped = groupByArray(results, `_through_${this.foreignKey}`);
7806
+ for (const model of models) {
7807
+ const key = String(model.get(this.localKey));
7808
+ model.$setRelation(relationName, grouped[key] ?? []);
7809
+ }
7810
+ }
7811
+ async getResults(parent) {
7812
+ const parentKey = parent.get(this.localKey);
7813
+ const peta = this.relatedModelClass.peta;
7814
+ if (!peta)
7815
+ return [];
7816
+ const throughTable = this.throughModelClass.table;
7817
+ const rows = await peta.kysely.selectFrom(throughTable).select(this.throughForeignKey).where(this.foreignKey, "=", parentKey).execute();
7818
+ const ids = rows.map((r) => r[this.throughForeignKey]).filter(Boolean);
7819
+ if (ids.length === 0)
7820
+ return [];
7821
+ return await this.relatedModelClass.query().whereIn("id", ids).execute();
7822
+ }
7823
+ }
7824
+ function snakeCase(str) {
7825
+ return str.charAt(0).toLowerCase() + str.slice(1).replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
7826
+ }
7827
+
7828
+ export { isString, isNumber, isBoolean, isNull, isDate, isBigInt, getLast, freeze, IdentifierNode, CreateTableNode, AliasNode, isOperationNodeSource, OperatorNode, RawNode, parseStringReference, ValueNode, parseValueExpression, ParensNode, preventAwait, InsertQueryNode, MergeQueryNode, QueryNode, createQueryId, WithSchemaPlugin, NOOP_QUERY_EXECUTOR, SetOperationNode, parseTable, CreateViewNode, isModelClass, Peta, HasMany, BelongsTo, HasOne, ManyToMany, HasManyThrough };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { WithArg } from "./builder";
2
- export { DeleteBuilder, EagerLoader, InsertBuilder, ModelQueryBuilder, UpdateBuilder } from "./builder";
2
+ export { DeleteBuilder, EagerLoader, ModelQueryBuilder, UpdateBuilder } from "./builder";
3
3
  export { Collection } from "./collection/collection";
4
4
  export { ArkTypeSchemaConfig } from "./columns/arktype-config";
5
5
  export type { ColumnShape, ColumnValue } from "./columns/column";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACvG,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAC3C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC3G,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7F,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAC3C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC3G,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7F,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA"}