@happyvertical/smrt-ui 0.42.2 → 0.42.4
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/README.md +121 -0
- package/dist/components/data/DataTable.svelte +391 -105
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/components/data/DataTableController.d.ts +195 -0
- package/dist/components/data/DataTableController.d.ts.map +1 -0
- package/dist/components/data/DataTableController.js +650 -0
- package/dist/components/data/DataTableIdentity.d.ts +21 -0
- package/dist/components/data/DataTableIdentity.d.ts.map +1 -0
- package/dist/components/data/DataTableIdentity.js +28 -0
- package/dist/components/data/__tests__/DataTable.test.js +257 -19
- package/dist/components/data/__tests__/DataTableController.test.js +214 -0
- package/dist/components/data/__tests__/DataTableIdentity.test.js +29 -0
- package/dist/components/data/index.d.ts +2 -0
- package/dist/components/data/index.d.ts.map +1 -1
- package/dist/components/data/index.js +2 -0
- package/dist/components/data/types.d.ts +27 -1
- package/dist/components/data/types.d.ts.map +1 -1
- package/dist/i18n/strings.d.ts +1 -0
- package/dist/i18n/strings.d.ts.map +1 -1
- package/dist/i18n/strings.js +1 -0
- package/dist/svelte/playground/DataTablePreview.svelte +34 -13
- package/dist/svelte/playground/DataTablePreview.svelte.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless, transport-neutral state for DataTable.
|
|
3
|
+
*
|
|
4
|
+
* The controller intentionally stores only view preferences. It never stores
|
|
5
|
+
* rows, callbacks, query objects, principals, or persistence adapters.
|
|
6
|
+
*/
|
|
7
|
+
export type DataTableRowId = string | number;
|
|
8
|
+
/** A caller-owned binding for an all-matching server-side selection. */
|
|
9
|
+
export interface DataTableQueryRevision {
|
|
10
|
+
queryFingerprint: string;
|
|
11
|
+
queryRevision: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Selection is deliberately a tagged union. `allMatching` never serializes
|
|
15
|
+
* loaded IDs: the receiving action must verify its query binding before use.
|
|
16
|
+
*/
|
|
17
|
+
export type DataTableSelection = {
|
|
18
|
+
scope: 'page';
|
|
19
|
+
rowIds: DataTableRowId[];
|
|
20
|
+
} | {
|
|
21
|
+
scope: 'explicit';
|
|
22
|
+
rowIds: DataTableRowId[];
|
|
23
|
+
} | ({
|
|
24
|
+
scope: 'allMatching';
|
|
25
|
+
expectedCount: number;
|
|
26
|
+
} & DataTableQueryRevision);
|
|
27
|
+
export type DataTableJsonPrimitive = string | number | boolean | null;
|
|
28
|
+
export type DataTableJsonValue = DataTableJsonPrimitive | DataTableJsonValue[] | {
|
|
29
|
+
[key: string]: DataTableJsonValue;
|
|
30
|
+
};
|
|
31
|
+
export type DataTableOperationMode = 'local' | 'manual';
|
|
32
|
+
/** Which layer owns each transformation. `manual` means the caller supplied it. */
|
|
33
|
+
export interface DataTableModes {
|
|
34
|
+
filtering: DataTableOperationMode;
|
|
35
|
+
sorting: DataTableOperationMode;
|
|
36
|
+
pagination: DataTableOperationMode;
|
|
37
|
+
}
|
|
38
|
+
export interface DataTableSortRule {
|
|
39
|
+
columnId: string;
|
|
40
|
+
direction: 'asc' | 'desc';
|
|
41
|
+
}
|
|
42
|
+
export type DataTableFilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'in' | 'notIn' | 'gt' | 'gte' | 'lt' | 'lte' | 'isNull' | 'isNotNull';
|
|
43
|
+
/** A serializable, declarative filter. Filters are combined with AND semantics. */
|
|
44
|
+
export interface DataTableFilter {
|
|
45
|
+
columnId: string;
|
|
46
|
+
operator: DataTableFilterOperator;
|
|
47
|
+
value?: DataTableJsonValue;
|
|
48
|
+
}
|
|
49
|
+
/** A column visibility entry. The array form keeps snapshots JSON-safe. */
|
|
50
|
+
export interface DataTableColumnVisibility {
|
|
51
|
+
columnId: string;
|
|
52
|
+
visible: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The JSON-safe, persistable portion of a table view. Selection and expansion
|
|
56
|
+
* are serialized as canonical arrays rather than Sets.
|
|
57
|
+
*/
|
|
58
|
+
export interface DataTableViewState {
|
|
59
|
+
search: string;
|
|
60
|
+
filters: DataTableFilter[];
|
|
61
|
+
sorting: DataTableSortRule[];
|
|
62
|
+
page: number;
|
|
63
|
+
pageSize: number | null;
|
|
64
|
+
columnOrder: string[];
|
|
65
|
+
columnVisibility: DataTableColumnVisibility[];
|
|
66
|
+
selection: DataTableSelection;
|
|
67
|
+
/**
|
|
68
|
+
* Legacy shorthand for row-ID selections. It is always derived from
|
|
69
|
+
* `selection`, and is empty for `allMatching` selections.
|
|
70
|
+
*/
|
|
71
|
+
selectedRowIds: DataTableRowId[];
|
|
72
|
+
expandedRowIds: DataTableRowId[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Accepts a version-1 controlled state while the controller always emits the
|
|
76
|
+
* normalized version-2 `DataTableViewState` with an explicit selection.
|
|
77
|
+
*/
|
|
78
|
+
export type DataTableViewStateInput = Omit<DataTableViewState, 'selection'> & {
|
|
79
|
+
selection?: DataTableSelection;
|
|
80
|
+
};
|
|
81
|
+
/** The stable envelope intended for URL and saved-view adapters. */
|
|
82
|
+
export interface DataTableSnapshot {
|
|
83
|
+
version: 2;
|
|
84
|
+
modes: DataTableModes;
|
|
85
|
+
state: DataTableViewState;
|
|
86
|
+
}
|
|
87
|
+
/** Every mutable table interaction has a plain-data command representation. */
|
|
88
|
+
export type DataTableCommand = {
|
|
89
|
+
type: 'setSearch';
|
|
90
|
+
search: string;
|
|
91
|
+
} | {
|
|
92
|
+
type: 'setFilters';
|
|
93
|
+
filters: DataTableFilter[];
|
|
94
|
+
} | {
|
|
95
|
+
type: 'setSorting';
|
|
96
|
+
sorting: DataTableSortRule[];
|
|
97
|
+
} | {
|
|
98
|
+
type: 'toggleSorting';
|
|
99
|
+
columnId: string;
|
|
100
|
+
multi?: boolean;
|
|
101
|
+
} | {
|
|
102
|
+
type: 'setPage';
|
|
103
|
+
page: number;
|
|
104
|
+
} | {
|
|
105
|
+
type: 'setPageSize';
|
|
106
|
+
pageSize: number | null;
|
|
107
|
+
} | {
|
|
108
|
+
type: 'setColumnOrder';
|
|
109
|
+
columnIds: string[];
|
|
110
|
+
} | {
|
|
111
|
+
type: 'setColumnVisibility';
|
|
112
|
+
columns: DataTableColumnVisibility[];
|
|
113
|
+
} | {
|
|
114
|
+
type: 'setSelection';
|
|
115
|
+
selection: DataTableSelection;
|
|
116
|
+
} | {
|
|
117
|
+
type: 'setPageSelection';
|
|
118
|
+
rowIds: DataTableRowId[];
|
|
119
|
+
} | ({
|
|
120
|
+
type: 'selectAllMatching';
|
|
121
|
+
expectedCount: number;
|
|
122
|
+
} & DataTableQueryRevision) | {
|
|
123
|
+
type: 'setSelectedRows';
|
|
124
|
+
rowIds: DataTableRowId[];
|
|
125
|
+
} | {
|
|
126
|
+
type: 'toggleRowSelection';
|
|
127
|
+
rowId: DataTableRowId;
|
|
128
|
+
} | {
|
|
129
|
+
type: 'setExpandedRows';
|
|
130
|
+
rowIds: DataTableRowId[];
|
|
131
|
+
} | {
|
|
132
|
+
type: 'toggleRowExpansion';
|
|
133
|
+
rowId: DataTableRowId;
|
|
134
|
+
} | {
|
|
135
|
+
type: 'reset';
|
|
136
|
+
};
|
|
137
|
+
export interface DataTableTransition {
|
|
138
|
+
command: DataTableCommand | null;
|
|
139
|
+
previous: DataTableSnapshot;
|
|
140
|
+
next: DataTableSnapshot;
|
|
141
|
+
changed: boolean;
|
|
142
|
+
}
|
|
143
|
+
export interface DataTableControllerOptions {
|
|
144
|
+
/** Used by uncontrolled controllers. */
|
|
145
|
+
initialState?: Partial<DataTableViewState>;
|
|
146
|
+
/** Makes transitions proposals until `replaceState` supplies the next value. */
|
|
147
|
+
state?: DataTableViewStateInput;
|
|
148
|
+
modes?: Partial<DataTableModes>;
|
|
149
|
+
/** Optional known columns let the controller ignore stale saved-view fields. */
|
|
150
|
+
columnIds?: readonly string[];
|
|
151
|
+
onStateChange?: (state: DataTableViewState, command: DataTableCommand) => void;
|
|
152
|
+
}
|
|
153
|
+
export type DataTableStateListener = (transition: DataTableTransition) => void;
|
|
154
|
+
export declare function assertDataTableRowId(value: unknown): DataTableRowId;
|
|
155
|
+
export declare function compareDataTableRowIds(left: DataTableRowId, right: DataTableRowId): number;
|
|
156
|
+
export declare function dataTableRowIdKey(value: DataTableRowId): string;
|
|
157
|
+
/**
|
|
158
|
+
* Refuse an all-matching selection when the action's query has changed since
|
|
159
|
+
* selection. Domain actions must call this before a destructive operation.
|
|
160
|
+
*/
|
|
161
|
+
export declare function assertDataTableSelectionCurrent(selection: DataTableSelection, currentQuery: DataTableQueryRevision): void;
|
|
162
|
+
/** Apply one command without mutating the supplied state. */
|
|
163
|
+
export declare function transitionDataTableState(state: DataTableViewState, command: DataTableCommand): DataTableViewState;
|
|
164
|
+
/** Parse persisted state defensively before an external adapter restores it. */
|
|
165
|
+
export declare function hydrateDataTableSnapshot(value: unknown): DataTableSnapshot;
|
|
166
|
+
/** A headless state owner used by both rendered controls and programmatic commands. */
|
|
167
|
+
export declare class DataTableController {
|
|
168
|
+
private state;
|
|
169
|
+
private modes;
|
|
170
|
+
private columnIds?;
|
|
171
|
+
private controlled;
|
|
172
|
+
private readonly listeners;
|
|
173
|
+
private readonly onStateChange?;
|
|
174
|
+
private pendingControlledState?;
|
|
175
|
+
constructor(options?: DataTableControllerOptions);
|
|
176
|
+
getState(): DataTableViewState;
|
|
177
|
+
getModes(): DataTableModes;
|
|
178
|
+
snapshot(): DataTableSnapshot;
|
|
179
|
+
subscribe(listener: DataTableStateListener): () => void;
|
|
180
|
+
/** Dispatches a serializable command. Controlled controllers emit a proposal only. */
|
|
181
|
+
dispatch(command: DataTableCommand): DataTableTransition;
|
|
182
|
+
/** Supplies state from a controlled host or an external persistence adapter. */
|
|
183
|
+
replaceState(state: DataTableViewStateInput): DataTableTransition;
|
|
184
|
+
/** Changes ownership without treating it as a user command. */
|
|
185
|
+
setControlled(controlled: boolean): void;
|
|
186
|
+
/** Configures transformation ownership; this remains outside persisted state. */
|
|
187
|
+
setModes(modes: Partial<DataTableModes>): DataTableTransition;
|
|
188
|
+
/** Reconciles stale saved-view column IDs with the renderer's current columns. */
|
|
189
|
+
setColumnIds(columnIds: readonly string[]): DataTableTransition;
|
|
190
|
+
/** Clamp against a reliable total. A missing total intentionally does not guess. */
|
|
191
|
+
clampPage(totalRows: number | null | undefined): DataTableTransition;
|
|
192
|
+
private emit;
|
|
193
|
+
}
|
|
194
|
+
export declare function createDataTableController(options?: DataTableControllerOptions): DataTableController;
|
|
195
|
+
//# sourceMappingURL=DataTableController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTableController.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTableController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GAC3C;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GAC/C,CAAC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,sBAAsB,CAAC,CAAC;AAE/E,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACtE,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,kBAAkB,EAAE,GACpB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,sBAAsB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;IAChC,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,uBAAuB,GAC/B,QAAQ,GACR,WAAW,GACX,UAAU,GACV,aAAa,GACb,YAAY,GACZ,UAAU,GACV,IAAI,GACJ,OAAO,GACP,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,QAAQ,GACR,WAAW,CAAC;AAEhB,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,yBAAyB,EAAE,CAAC;IAC9C,SAAS,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,cAAc,EAAE,cAAc,EAAE,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG;IAC5E,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC,CAAC;AAEF,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,yBAAyB,EAAE,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GACtD,CAAC;IACC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,sBAAsB,CAAC,GAC3B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C,gFAAgF;IAChF,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAChC,gFAAgF;IAChF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,KACtB,IAAI,CAAC;CACX;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;AA6C/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAOnE;AAiFD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,cAAc,GACpB,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAE/D;AAmHD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,kBAAkB,EAC7B,YAAY,EAAE,sBAAsB,GACnC,IAAI,CAWN;AA+KD,6DAA6D;AAC7D,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,GACxB,kBAAkB,CAgJpB;AAED,gFAAgF;AAChF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAgB1E;AAED,uFAAuF;AACvF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA8C;IAC7E,OAAO,CAAC,sBAAsB,CAAC,CAAS;gBAE5B,OAAO,GAAE,0BAA+B;IAapD,QAAQ,IAAI,kBAAkB;IAI9B,QAAQ,IAAI,cAAc;IAI1B,QAAQ,IAAI,iBAAiB;IAI7B,SAAS,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAKvD,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,mBAAmB;IAmCxD,gFAAgF;IAChF,YAAY,CAAC,KAAK,EAAE,uBAAuB,GAAG,mBAAmB;IAqBjE,+DAA+D;IAC/D,aAAa,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAKxC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,mBAAmB;IAU7D,kFAAkF;IAClF,YAAY,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB;IAW/D,oFAAoF;IACpF,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,mBAAmB;IAgCpE,OAAO,CAAC,IAAI;CAIb;AAaD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAErB"}
|