@powerhousedao/reactor-api 1.26.1 → 1.27.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/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +3 -5
- package/dist/src/subgraphs/auth/utils/helpers.d.ts.map +1 -1
- package/dist/src/subgraphs/auth/utils/session.d.ts.map +1 -1
- package/dist/src/subgraphs/auth/utils/user.d.ts.map +1 -1
- package/dist/src/subgraphs/drive/index.d.ts.map +1 -1
- package/dist/src/subgraphs/drive/index.js +3 -3
- package/dist/src/sync/utils.d.ts.map +1 -1
- package/dist/src/sync/utils.js +6 -2
- package/dist/src/types.d.ts +0 -21
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/src/processors/analytics-processor.d.ts +0 -9
- package/dist/src/processors/analytics-processor.d.ts.map +0 -1
- package/dist/src/processors/analytics-processor.js +0 -9
- package/dist/src/processors/index.d.ts +0 -5
- package/dist/src/processors/index.d.ts.map +0 -1
- package/dist/src/processors/index.js +0 -4
- package/dist/src/processors/manager.d.ts +0 -14
- package/dist/src/processors/manager.d.ts.map +0 -1
- package/dist/src/processors/manager.js +0 -40
- package/dist/src/processors/operational-processor.d.ts +0 -8
- package/dist/src/processors/operational-processor.d.ts.map +0 -1
- package/dist/src/processors/operational-processor.js +0 -12
- package/dist/src/processors/processor.d.ts +0 -20
- package/dist/src/processors/processor.d.ts.map +0 -1
- package/dist/src/processors/processor.js +0 -45
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
export * from "@powerhousedao/analytics-engine-core";
|
|
1
2
|
export * from "./src/server.js";
|
|
3
|
+
export * from "./src/subgraphs/index.js";
|
|
2
4
|
export * from "./src/subgraphs/manager.js";
|
|
3
|
-
export * from "./src/utils/index.js";
|
|
4
|
-
export * from "./src/processors/index.js";
|
|
5
5
|
export * from "./src/types.js";
|
|
6
|
-
export * from "./src/
|
|
7
|
-
export * from "@powerhousedao/analytics-engine-core";
|
|
6
|
+
export * from "./src/utils/index.js";
|
|
8
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
+
export * from "@powerhousedao/analytics-engine-core";
|
|
1
2
|
export * from "./src/server.js";
|
|
3
|
+
export * from "./src/subgraphs/index.js";
|
|
2
4
|
export * from "./src/subgraphs/manager.js";
|
|
3
|
-
export * from "./src/utils/index.js";
|
|
4
|
-
export * from "./src/processors/index.js";
|
|
5
5
|
export * from "./src/types.js";
|
|
6
|
-
export * from "./src/
|
|
7
|
-
export * from "@powerhousedao/analytics-engine-core";
|
|
6
|
+
export * from "./src/utils/index.js";
|
package/dist/src/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAO9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAK3C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAGjC,KAAK,OAAO,GAAG;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,IAAI,GAAG,SAAS,CAAC;IAC1C,KAAK,CAAC,EACF;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACD,OAAO,GACP,SAAS,CAAC;CACf,CAAC;AAIF,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,GAAG,CAAC,CAiDd"}
|
package/dist/src/server.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { SubgraphManager } from "#subgraphs/manager.js";
|
|
1
2
|
import { KnexAnalyticsStore, KnexQueryExecutor, } from "@powerhousedao/analytics-engine-knex";
|
|
2
3
|
import devcert from "devcert";
|
|
3
4
|
import express from "express";
|
|
4
5
|
import fs from "node:fs";
|
|
5
6
|
import https from "node:https";
|
|
6
7
|
import path from "node:path";
|
|
7
|
-
import { ProcessorManager } from "#processors/index.js";
|
|
8
|
-
import { SubgraphManager } from "#subgraphs/manager.js";
|
|
9
8
|
import { getDbClient } from "./utils/db.js";
|
|
10
9
|
const DEFAULT_PORT = 4000;
|
|
11
10
|
export async function startAPI(reactor, options) {
|
|
@@ -15,10 +14,9 @@ export async function startAPI(reactor, options) {
|
|
|
15
14
|
const analyticsStore = new KnexAnalyticsStore({
|
|
16
15
|
executor: new KnexQueryExecutor(),
|
|
17
16
|
knex: db,
|
|
18
|
-
});
|
|
17
|
+
});
|
|
19
18
|
const subgraphManager = new SubgraphManager("/", app, reactor, db, analyticsStore);
|
|
20
19
|
await subgraphManager.init();
|
|
21
|
-
const processorManager = new ProcessorManager(reactor, db, analyticsStore);
|
|
22
20
|
if (options.https) {
|
|
23
21
|
const currentDir = process.cwd();
|
|
24
22
|
let server;
|
|
@@ -47,5 +45,5 @@ export async function startAPI(reactor, options) {
|
|
|
47
45
|
else {
|
|
48
46
|
app.listen(port);
|
|
49
47
|
}
|
|
50
|
-
return { app, subgraphManager
|
|
48
|
+
return { app, subgraphManager };
|
|
51
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAW,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAW,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,eAAO,MAAM,WAAW,UAAW,MAAM,WACI,CAAC;AA4B9C,eAAO,MAAM,WAAW,UACf,MAAM,KACZ;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAiB1B,CAAC;AAkBF,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,QAmBxB;AAED,eAAO,MAAM,uBAAuB,OAC9B,EAAE,WACG,YAAY,UACb,MAAM,iBACC,OAAO;;;EAwBvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAO/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,eAAO,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAO/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,eAAO,MAAM,2BAA2B,OAClC,EAAE,UACE,MAAM;;;EAef,CAAC;AAEF,eAAO,MAAM,mBAAmB,OAC1B,EAAE,UACE,MAAM,WACL;IACP,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;;;EAIF,CAAC;AAEF,eAAO,MAAM,YAAY,OAAc,EAAE,UAAU,MAAM,uBAExD,CAAC;AAEF,eAAO,MAAM,MAAM,OAAc,EAAE,aAAa,MAAM,UAAU,MAAM,kBAwBrE,CAAC;AAEF,eAAO,MAAM,YAAY,YAAmB,OAAO,qBAYlD,CAAC;AAEF,eAAO,MAAM,iBAAiB,OACxB,EAAE,WACG,MAAM,UACP,MAAM,qBAoCf,CAAC;AAEF,eAAO,MAAM,eAAe,kBACX,WAAW,aACf,MAAM,yCAWlB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,UAAU,IAAI;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../src/subgraphs/auth/utils/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,UAAU,IAAI;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,eAAO,MAAM,UAAU,OAAc,EAAE,QAAQ,IAAI,kBAwBlD,CAAC;AAEF,eAAO,MAAM,OAAO,OAAc,EAAE,WAAW,MAAM,kBAGpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAO5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAqBxF,qBAAa,aAAc,SAAQ,QAAQ;IACzC,OAAO,CAAC,MAAM,CAGX;gBAES,IAAI,EAAE,YAAY;IAM9B,IAAI,SAAc;IAClB,QAAQ,iCAqJN;IAEF,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/subgraphs/drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAO5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAqBxF,qBAAa,aAAc,SAAQ,QAAQ;IACzC,OAAO,CAAC,MAAM,CAGX;gBAES,IAAI,EAAE,YAAY;IAM9B,IAAI,SAAc;IAClB,QAAQ,iCAqJN;IAEF,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAgPpC;CACH"}
|
|
@@ -242,7 +242,7 @@ export class DriveSubgraph extends Subgraph {
|
|
|
242
242
|
if (!ctx.driveId) {
|
|
243
243
|
throw new Error("Drive ID is required");
|
|
244
244
|
}
|
|
245
|
-
// Create the
|
|
245
|
+
// Create the listener and transmitter
|
|
246
246
|
const uuid = generateUUID();
|
|
247
247
|
const listener = {
|
|
248
248
|
driveId: ctx.driveId,
|
|
@@ -259,9 +259,9 @@ export class DriveSubgraph extends Subgraph {
|
|
|
259
259
|
};
|
|
260
260
|
// TODO: circular reference
|
|
261
261
|
// TODO: once we have DI, remove this and pass around
|
|
262
|
-
const listenerManager = this.reactor.
|
|
262
|
+
const listenerManager = this.reactor.listeners;
|
|
263
263
|
listener.transmitter = new PullResponderTransmitter(listener, listenerManager);
|
|
264
|
-
//
|
|
264
|
+
// set the listener on the manager directly (bypassing operations)
|
|
265
265
|
try {
|
|
266
266
|
await listenerManager.setListener(ctx.driveId, listener);
|
|
267
267
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EACpB,gBAAgB,EAEhB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EACpB,gBAAgB,EAEhB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,iBAAiB,YACnB,oBAAoB,UACrB,oBAAoB,KAC3B,OAAO,CAAC,gBAAgB,CAkC1B,CAAC;AAGF,eAAO,MAAM,kBAAkB,YACpB,oBAAoB,WACpB,MAAM,cACH,MAAM,aACP,gBAAgB,EAAE,KAC5B,OAAO,CAAC,OAAO,CAKjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,YACnB,oBAAoB,WACpB,MAAM,cACH,MAAM,SACX,MAAM,GAAG,SAAS,KACxB,OAAO,CAAC,YAAY,EAAE,CAKxB,CAAC"}
|
package/dist/src/sync/utils.js
CHANGED
|
@@ -27,11 +27,15 @@ export const processPushUpdate = async (reactor, strand) => {
|
|
|
27
27
|
};
|
|
28
28
|
// processes an acknowledge request and returns a boolean
|
|
29
29
|
export const processAcknowledge = async (reactor, driveId, listenerId, revisions) => {
|
|
30
|
-
|
|
30
|
+
// todo: use listener manager
|
|
31
|
+
const listener = reactor.listeners.getListenerState(driveId, listenerId);
|
|
32
|
+
const transmitter = listener.listener.transmitter;
|
|
31
33
|
return transmitter.processAcknowledge(driveId, listenerId, revisions);
|
|
32
34
|
};
|
|
33
35
|
// processes a get strands request and returns a list of strand updates
|
|
34
36
|
export const processGetStrands = async (reactor, driveId, listenerId, since) => {
|
|
35
|
-
|
|
37
|
+
// todo: use listener manager
|
|
38
|
+
const listener = reactor.listeners.getListenerState(driveId, listenerId);
|
|
39
|
+
const transmitter = listener.listener.transmitter;
|
|
36
40
|
return transmitter.getStrands({ since });
|
|
37
41
|
};
|
package/dist/src/types.d.ts
CHANGED
|
@@ -1,29 +1,8 @@
|
|
|
1
|
-
import { IDocumentDriveServer, IReceiver, Listener } from "document-drive";
|
|
2
1
|
import { Express } from "express";
|
|
3
|
-
import { IAnalyticsStore } from "./processors/analytics-processor.js";
|
|
4
|
-
import { ProcessorClass } from "./processors/processor.js";
|
|
5
2
|
import { SubgraphManager } from "./subgraphs/manager.js";
|
|
6
|
-
import { Db } from "./utils/db.js";
|
|
7
3
|
export type { Db } from "./utils/db.js";
|
|
8
|
-
export type IProcessorManager = {
|
|
9
|
-
registerProcessor(module: IProcessor | ProcessorClass): Promise<IProcessor>;
|
|
10
|
-
};
|
|
11
4
|
export type API = {
|
|
12
5
|
app: Express;
|
|
13
6
|
subgraphManager: SubgraphManager;
|
|
14
|
-
processorManager: IProcessorManager;
|
|
15
|
-
};
|
|
16
|
-
export type ProcessorType = "analytics" | "operational";
|
|
17
|
-
export type ProcessorSetupArgs = {
|
|
18
|
-
reactor: IDocumentDriveServer;
|
|
19
|
-
operationalStore: Db;
|
|
20
|
-
analyticsStore: IAnalyticsStore;
|
|
21
|
-
};
|
|
22
|
-
export type IProcessor = IReceiver & {
|
|
23
|
-
onSetup?: (args: ProcessorSetupArgs) => void;
|
|
24
|
-
getOptions: () => ProcessorOptions;
|
|
25
|
-
};
|
|
26
|
-
export type ProcessorOptions = Omit<Listener, "driveId" | "callInfo"> & {
|
|
27
|
-
label: string;
|
|
28
7
|
};
|
|
29
8
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,YAAY,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,GAAG,GAAG;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-schema.d.ts","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAGxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"create-schema.d.ts","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAGxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,eAAO,MAAM,YAAY,wBACF,oBAAoB,aAC9B,kBAAkB,CAAC,OAAO,CAAC,YAC5B,YAAY,oCAOpB,CAAC;AAEL,eAAO,MAAM,wBAAwB,wBACd,oBAAoB,YAC/B,YAAY,iBAwIvB,CAAC"}
|