@vibeorm/adapter-bun 2.4.0 → 3.0.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.
- package/LICENSE +21 -0
- package/README.md +44 -25
- package/dist/bun-version.d.ts +11 -0
- package/dist/config.d.ts +12 -0
- package/dist/connection-url.d.ts +18 -3
- package/dist/driver.d.ts +6 -2
- package/dist/index.d.ts +32 -10
- package/dist/index.js +430 -219
- package/dist/index.js.map +12 -11
- package/dist/params.d.ts +36 -22
- package/dist/template-cache.d.ts +2 -0
- package/dist/transaction-sql.d.ts +28 -1
- package/package.json +8 -6
- package/dist/config.d.ts.map +0 -1
- package/dist/connection-url.d.ts.map +0 -1
- package/dist/driver.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/params.d.ts.map +0 -1
- package/dist/template-cache.d.ts.map +0 -1
- package/dist/transaction-sql.d.ts.map +0 -1
package/dist/params.d.ts
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Parameter serialization for bun:sql.
|
|
2
|
+
* Parameter serialization for bun:sql: the values node-postgres would send.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* JSON *string* (`jsonb_typeof` = `"string"`), so the ORM path must not touch it;
|
|
4
|
+
* Live-verified on Bun 1.4.1 and 1.4.3 (`tests/node-postgres-parity.live.test.ts`):
|
|
5
|
+
* - bun:sql types a JS number itself (int32 → `int4`, anything else →
|
|
6
|
+
* `float8`) and lets the SERVER cast from that type, so numbers, bigints and
|
|
7
|
+
* booleans go out as text and the server reads them as the slot's own type;
|
|
9
8
|
* - a plain JS array bound to a scalar-list column (`text[]`, `int[]`) is NOT
|
|
10
9
|
* turned into a PostgreSQL array literal by bun:sql — it arrives as `a,b` and
|
|
11
10
|
* the server rejects it with `malformed array literal`. Scalar lists therefore
|
|
12
11
|
* have to be pre-rendered with {@link toPgArrayLiteral}, which is exactly what
|
|
13
|
-
* the adapter's `formatArrayParam` returns
|
|
12
|
+
* the adapter's `formatArrayParam` returns;
|
|
13
|
+
* - with NAMED statements (`preparedStatements: true`) bun:sql learns each
|
|
14
|
+
* slot's type first and JSON-encodes whatever is bound to a `json`/`jsonb`
|
|
15
|
+
* slot, a string included; with unnamed statements (the default) a string is
|
|
16
|
+
* sent as text and the server parses it, like node-postgres.
|
|
14
17
|
*
|
|
15
|
-
* Hence the split (LEARNINGS.md): the ORM path
|
|
16
|
-
* lists already arrived as literal strings
|
|
17
|
-
*
|
|
18
|
-
* matches rows.
|
|
18
|
+
* Hence the split (LEARNINGS.md): the ORM path only respells scalars (scalar
|
|
19
|
+
* lists already arrived as literal strings, Json values as JSON text bound
|
|
20
|
+
* through `::text::jsonb`), while the raw path renders plain JS arrays as array
|
|
21
|
+
* literals so `db.$queryRawUnsafe('… = ANY($1)', [1, 2, 3])` matches rows.
|
|
19
22
|
*/
|
|
20
23
|
/**
|
|
21
24
|
* Render a JS array as a PostgreSQL array literal string.
|
|
@@ -29,9 +32,10 @@
|
|
|
29
32
|
* - any other object, **including a nested array** → quoted `JSON.stringify`,
|
|
30
33
|
* which is what a `Json[]` scalar list needs (PostgreSQL scalar lists are
|
|
31
34
|
* one-dimensional, so a nested array is a JSON value, not a matrix)
|
|
32
|
-
* -
|
|
35
|
+
* - `Uint8Array` (including `Buffer`) → quoted PostgreSQL bytea hex
|
|
36
|
+
* - other binary views / `ArrayBuffer` → unsupported, throws
|
|
33
37
|
*
|
|
34
|
-
* @throws VibeError `VIBE_VALIDATION` for binary elements.
|
|
38
|
+
* @throws VibeError `VIBE_VALIDATION` for unsupported binary elements.
|
|
35
39
|
*/
|
|
36
40
|
export declare function toPgArrayLiteral(values: readonly unknown[]): string;
|
|
37
41
|
/**
|
|
@@ -52,26 +56,36 @@ export declare function serializeDate(params: {
|
|
|
52
56
|
value: Date;
|
|
53
57
|
}): unknown;
|
|
54
58
|
/**
|
|
55
|
-
* ORM hot path
|
|
56
|
-
* ({@link
|
|
59
|
+
* ORM hot path, node-postgres's rules (`@vibeorm/adapter-pg` `serializeParams`):
|
|
60
|
+
* scalars as text ({@link serializeScalar}), `Date` as UTC ISO text
|
|
61
|
+
* ({@link serializeDate}), any other object or array as `JSON.stringify` text,
|
|
62
|
+
* binary untouched.
|
|
57
63
|
*
|
|
58
|
-
*
|
|
59
|
-
* `formatArrayParam`,
|
|
60
|
-
*
|
|
61
|
-
*
|
|
64
|
+
* The runtime itself binds no objects here — scalar lists arrive as
|
|
65
|
+
* array-literal strings from `formatArrayParam`, Json values as JSON text bound
|
|
66
|
+
* through `::text::jsonb`, Bytes as `Uint8Array` — but a direct
|
|
67
|
+
* `adapter.execute` caller binding a document gets the same result as on
|
|
68
|
+
* adapter-pg. With `namedStatements` (the adapter's `preparedStatements: true`)
|
|
69
|
+
* objects stay objects: bun:sql JSON-encodes them for a `json`/`jsonb` slot
|
|
70
|
+
* itself, and would encode pre-stringified text a second time.
|
|
62
71
|
*/
|
|
63
72
|
export declare function serializeParams(params: {
|
|
64
73
|
values: readonly unknown[];
|
|
74
|
+
namedStatements?: boolean;
|
|
65
75
|
}): unknown[];
|
|
66
76
|
/**
|
|
67
|
-
* Raw path:
|
|
68
|
-
*
|
|
69
|
-
*
|
|
77
|
+
* Raw path: the node-postgres rules (`prepareValue`), so a raw statement binds
|
|
78
|
+
* the same text on both postgres adapters — plain JS arrays as PostgreSQL
|
|
79
|
+
* array literals (`db.$queryRawUnsafe('… WHERE "id" = ANY($1)', [1, 2, 3])`
|
|
80
|
+
* matches rows), any other object except binary as `JSON.stringify` text,
|
|
81
|
+
* scalars as text ({@link serializeScalar}). `namedStatements` keeps objects as
|
|
82
|
+
* objects, for the reason given at {@link serializeParams}.
|
|
70
83
|
*
|
|
71
84
|
* Trade-off (v1 lesson): binding a JS array **into** a `jsonb` column from a raw
|
|
72
85
|
* query means calling `JSON.stringify` yourself.
|
|
73
86
|
*/
|
|
74
87
|
export declare function serializeParamsRaw(params: {
|
|
75
88
|
values: readonly unknown[];
|
|
89
|
+
namedStatements?: boolean;
|
|
76
90
|
}): unknown[];
|
|
77
91
|
//# sourceMappingURL=params.d.ts.map
|
package/dist/template-cache.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export type PreparedTemplate = {
|
|
|
27
27
|
readonly template: TemplateStringsArray;
|
|
28
28
|
/** 1-based `$n` for each gap, in TEXT order (`SELECT $2, $1` → `[2, 1]`). */
|
|
29
29
|
readonly indices: readonly number[];
|
|
30
|
+
/** Every gap is $1, $2, ... exactly once, with no reordering. */
|
|
31
|
+
readonly identityOrder: boolean;
|
|
30
32
|
};
|
|
31
33
|
/** LRU map from SQL text to the synthetic template used to execute it. */
|
|
32
34
|
export type TemplateCache = {
|
|
@@ -8,10 +8,37 @@
|
|
|
8
8
|
import type { IsolationLevel } from "@vibeorm/runtime";
|
|
9
9
|
/** VibeORM isolation level → PostgreSQL isolation level keyword. */
|
|
10
10
|
export declare const ISOLATION_LEVEL_SQL: Readonly<Record<IsolationLevel, string>>;
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* `BEGIN`, with an `ISOLATION LEVEL` clause and/or `READ ONLY` when the caller
|
|
13
|
+
* asked for them (`BEGIN ISOLATION LEVEL SERIALIZABLE, READ ONLY`).
|
|
14
|
+
*/
|
|
12
15
|
export declare function beginStatement(params: {
|
|
13
16
|
isolationLevel?: IsolationLevel;
|
|
17
|
+
readOnly?: boolean;
|
|
14
18
|
}): string;
|
|
19
|
+
/**
|
|
20
|
+
* The whole opening of a reserved-path transaction as ONE simple-protocol
|
|
21
|
+
* message (round-trip EPIC 3, A-05): `BEGIN …` alone, or `BEGIN …; SET LOCAL
|
|
22
|
+
* statement_timeout = N` when a timeout is requested — one wait instead of
|
|
23
|
+
* two. Parameterless text from validated values; PostgreSQL stops at the first
|
|
24
|
+
* failing statement and the driver rejects with that error, so the caller sees
|
|
25
|
+
* BEGIN's or the SET's own error exactly as when they were two messages.
|
|
26
|
+
*
|
|
27
|
+
* @throws VibeError `VIBE_VALIDATION` for an invalid timeout (before anything
|
|
28
|
+
* is sent).
|
|
29
|
+
*/
|
|
30
|
+
export declare function openTransactionStatement(params: {
|
|
31
|
+
isolationLevel?: IsolationLevel;
|
|
32
|
+
readOnly?: boolean;
|
|
33
|
+
timeout?: number;
|
|
34
|
+
}): string;
|
|
35
|
+
/**
|
|
36
|
+
* The cancel deadline's per-statement bound (round-trip EPIC 6): a CONSTANT
|
|
37
|
+
* extended-protocol text, with the milliseconds bound as a string `$1`, so
|
|
38
|
+
* bun:sql keeps it prepared and pipelines it with the statement it bounds.
|
|
39
|
+
* `is_local = true` makes it transaction-scoped, like `SET LOCAL`.
|
|
40
|
+
*/
|
|
41
|
+
export declare const STATEMENT_BOUND_TEXT: string;
|
|
15
42
|
/**
|
|
16
43
|
* `SET LOCAL statement_timeout = <ms>` — transaction-scoped, so PostgreSQL
|
|
17
44
|
* cancels an over-long statement with SQLSTATE 57014 (mapped to
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeorm/adapter-bun",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "bun:sql (Postgres) adapter for VibeORM v2",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"orm",
|
|
@@ -35,15 +35,17 @@
|
|
|
35
35
|
},
|
|
36
36
|
"files": [
|
|
37
37
|
"dist",
|
|
38
|
-
"
|
|
38
|
+
"!dist/**/*.d.ts.map",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE"
|
|
39
41
|
],
|
|
40
42
|
"engines": {
|
|
41
|
-
"bun": ">=1.
|
|
43
|
+
"bun": ">=1.4.1"
|
|
42
44
|
},
|
|
43
45
|
"dependencies": {
|
|
44
|
-
"@vibeorm/runtime": "
|
|
45
|
-
"@vibeorm/schema": "
|
|
46
|
-
"@vibeorm/sql": "
|
|
46
|
+
"@vibeorm/runtime": "3.0.0",
|
|
47
|
+
"@vibeorm/schema": "3.0.0",
|
|
48
|
+
"@vibeorm/sql": "3.0.0"
|
|
47
49
|
},
|
|
48
50
|
"publishConfig": {
|
|
49
51
|
"access": "public"
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAKlF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection-url.d.ts","sourceRoot":"","sources":["../src/connection-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,GAAG,SAAS,CAerB;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAS3F"}
|
package/dist/driver.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,MAAM,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,GAAG,CAE5F"}
|
package/dist/errors.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAyC3E,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMhE,CAAC;AAYH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAS/E;AAID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CA8BvE;AAED,wEAAwE;AACxE,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMnE"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAEV,eAAe,EAMhB,MAAM,kBAAkB,CAAC;AAsB1B,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAyEnG,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oGAAoG;IACpG,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,uFAAuF;IACvF,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;CACxC,CAAC;AA8CF;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAwiBvE;AAgCD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACzF,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/params.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAmBnE;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAM9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GAAG,OAAO,EAAE,CAEjF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GAAG,OAAO,EAAE,CAMpF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-cache.d.ts","sourceRoot":"","sources":["../src/template-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG;IAC1B,4EAA4E;IAC5E,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,CAAC;IACxD,8DAA8D;IAC9D,IAAI,IAAI,MAAM,CAAC;CAChB,CAAC;AA0EF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CA4C3E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAEjE;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5B,GAAG,OAAO,EAAE,CAYZ;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CA2B1E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-sql.d.ts","sourceRoot":"","sources":["../src/transaction-sql.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAIvE,CAAC;AAEH,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE;IAAE,cAAc,CAAC,EAAE,cAAc,CAAA;CAAE,GAAG,MAAM,CAKlF;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAU7E;AAID,+EAA+E;AAC/E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAK5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,qBAAqB,CAI7F;AAMD,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC"}
|