@dxos/messaging 0.9.1-staging.ee54ba693a → 0.11.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 (88) hide show
  1. package/dist/lib/chunk-memory-signal-manager.mjs +652 -0
  2. package/dist/lib/chunk-memory-signal-manager.mjs.map +1 -0
  3. package/dist/lib/index.mjs +377 -0
  4. package/dist/lib/index.mjs.map +1 -0
  5. package/dist/lib/testing.mjs +288 -0
  6. package/dist/lib/testing.mjs.map +1 -0
  7. package/dist/types/src/index.d.ts +0 -1
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
  10. package/dist/types/src/messenger.d.ts +1 -1
  11. package/dist/types/src/messenger.d.ts.map +1 -1
  12. package/dist/types/src/signal-manager/edge-signal-manager.d.ts +21 -4
  13. package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
  14. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts +2 -0
  15. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts.map +1 -0
  16. package/dist/types/src/signal-manager/index.d.ts +1 -2
  17. package/dist/types/src/signal-manager/index.d.ts.map +1 -1
  18. package/dist/types/src/signal-manager/memory-signal-manager.d.ts +12 -10
  19. package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
  20. package/dist/types/src/signal-manager/memory-signal-manager.test.d.ts +2 -0
  21. package/dist/types/src/signal-manager/memory-signal-manager.test.d.ts.map +1 -0
  22. package/dist/types/src/signal-manager/signal-manager.d.ts +5 -0
  23. package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
  24. package/dist/types/src/signal-manager/utils.d.ts +6 -4
  25. package/dist/types/src/signal-manager/utils.d.ts.map +1 -1
  26. package/dist/types/src/signal-methods.d.ts +33 -22
  27. package/dist/types/src/signal-methods.d.ts.map +1 -1
  28. package/dist/types/src/testing/index.d.ts +1 -0
  29. package/dist/types/src/testing/index.d.ts.map +1 -1
  30. package/dist/types/src/testing/test-edge-mesh.d.ts +61 -0
  31. package/dist/types/src/testing/test-edge-mesh.d.ts.map +1 -0
  32. package/dist/types/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +19 -19
  34. package/src/index.ts +0 -1
  35. package/src/messenger.blueprint-test.ts +0 -25
  36. package/src/messenger.node.test.ts +1 -1
  37. package/src/messenger.ts +42 -18
  38. package/src/signal-manager/edge-signal-manager.test.ts +193 -0
  39. package/src/signal-manager/edge-signal-manager.ts +145 -12
  40. package/src/signal-manager/index.ts +1 -2
  41. package/src/signal-manager/memory-signal-manager.test.ts +199 -0
  42. package/src/signal-manager/memory-signal-manager.ts +87 -47
  43. package/src/signal-manager/signal-manager.ts +7 -0
  44. package/src/signal-manager/utils.ts +30 -21
  45. package/src/signal-methods.ts +37 -26
  46. package/src/testing/index.ts +1 -0
  47. package/src/testing/test-edge-mesh.ts +196 -0
  48. package/src/testing/utils.ts +2 -2
  49. package/dist/lib/neutral/chunk-EC4H56J5.mjs +0 -497
  50. package/dist/lib/neutral/chunk-EC4H56J5.mjs.map +0 -7
  51. package/dist/lib/neutral/index.mjs +0 -1249
  52. package/dist/lib/neutral/index.mjs.map +0 -7
  53. package/dist/lib/neutral/meta.json +0 -1
  54. package/dist/lib/neutral/testing/index.mjs +0 -155
  55. package/dist/lib/neutral/testing/index.mjs.map +0 -7
  56. package/dist/types/src/signal-client/index.d.ts +0 -2
  57. package/dist/types/src/signal-client/index.d.ts.map +0 -1
  58. package/dist/types/src/signal-client/signal-client-monitor.d.ts +0 -30
  59. package/dist/types/src/signal-client/signal-client-monitor.d.ts.map +0 -1
  60. package/dist/types/src/signal-client/signal-client.d.ts +0 -59
  61. package/dist/types/src/signal-client/signal-client.d.ts.map +0 -1
  62. package/dist/types/src/signal-client/signal-client.node.test.d.ts +0 -2
  63. package/dist/types/src/signal-client/signal-client.node.test.d.ts.map +0 -1
  64. package/dist/types/src/signal-client/signal-local-state.d.ts +0 -38
  65. package/dist/types/src/signal-client/signal-local-state.d.ts.map +0 -1
  66. package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts +0 -6
  67. package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts.map +0 -1
  68. package/dist/types/src/signal-client/signal-rpc-client.d.ts +0 -47
  69. package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +0 -1
  70. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts +0 -2
  71. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts.map +0 -1
  72. package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts +0 -8
  73. package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts.map +0 -1
  74. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +0 -41
  75. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +0 -1
  76. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts +0 -2
  77. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts.map +0 -1
  78. package/src/signal-client/index.ts +0 -5
  79. package/src/signal-client/signal-client-monitor.ts +0 -111
  80. package/src/signal-client/signal-client.node.test.ts +0 -185
  81. package/src/signal-client/signal-client.ts +0 -339
  82. package/src/signal-client/signal-local-state.ts +0 -174
  83. package/src/signal-client/signal-rpc-client-monitor.ts +0 -15
  84. package/src/signal-client/signal-rpc-client.node.test.ts +0 -102
  85. package/src/signal-client/signal-rpc-client.ts +0 -227
  86. package/src/signal-manager/websocket-signal-manager-monitor.ts +0 -20
  87. package/src/signal-manager/websocket-signal-manager.node.test.ts +0 -112
  88. package/src/signal-manager/websocket-signal-manager.ts +0 -188
@@ -1,5 +1,5 @@
1
1
  import { type Event } from '@dxos/async';
2
- import { type Context, type Lifecycle } from '@dxos/context';
2
+ import { type Context } from '@dxos/context';
3
3
  import { type Peer, type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
4
4
  import { type JoinRequest, type LeaveRequest, type Message, type QueryRequest, type SwarmEvent } from '@dxos/protocols/proto/dxos/edge/signal';
5
5
  import { type SignalState } from '@dxos/protocols/proto/dxos/mesh/signal';
@@ -14,6 +14,29 @@ export type SignalStatus = {
14
14
  connectionStarted: Date;
15
15
  lastStateChange: Date;
16
16
  };
17
+ /**
18
+ * Parameters for {@link SignalMethods.subscribeMessages}.
19
+ */
20
+ export type SubscribeMessagesParams = {
21
+ /**
22
+ * The subscribing peer. Point-to-point messages addressed to this `peerKey` are delivered.
23
+ */
24
+ peer: PeerInfo;
25
+ /**
26
+ * OR-subscription tags (DX-1125). When provided, swarm broadcasts whose tags intersect this set are
27
+ * also delivered. Only meaningful for edge signaling; other transports ignore them.
28
+ */
29
+ tags?: string[];
30
+ /**
31
+ * Invoked for every message delivered to this subscription (point-to-point or matching broadcast).
32
+ */
33
+ onMessage: (message: Message) => void;
34
+ };
35
+ /**
36
+ * Tears down a subscription created by {@link SignalMethods.subscribeMessages} and releases its
37
+ * transport resources (edge tag registration / receive stream). The subscriber owns this lifecycle.
38
+ */
39
+ export type UnsubscribeCallback = () => Promise<void>;
17
40
  /**
18
41
  * Message routing interface.
19
42
  */
@@ -24,10 +47,6 @@ export interface SignalMethods {
24
47
  * TODO(mykola): Use swarmState in network-manager instead.
25
48
  */
26
49
  swarmEvent: Event<SwarmEvent>;
27
- /**
28
- * Emits when a message is received.
29
- */
30
- onMessage: Event<Message>;
31
50
  /**
32
51
  * Emits when the swarm state changes.
33
52
  */
@@ -45,26 +64,18 @@ export interface SignalMethods {
45
64
  */
46
65
  query: (ctx: Context, params: QueryRequest) => Promise<SwarmResponse>;
47
66
  /**
48
- * Send message to peer.
67
+ * Send a message. Point-to-point when `recipient` is set; a swarm broadcast (DX-1125) when `tags`
68
+ * are set — fanned out to every peer whose tag subscription intersects, with the target swarm taken
69
+ * from `author.swarmKey`. Exactly one of `recipient` / `tags` must be present. Broadcasts are only
70
+ * supported by edge signaling.
49
71
  */
50
72
  sendMessage: (ctx: Context, message: Message) => Promise<void>;
51
73
  /**
52
- * Start receiving messages from peer.
53
- * @deprecated
54
- */
55
- subscribeMessages: (peer: PeerInfo) => Promise<void>;
56
- /**
57
- * Stop receiving messages from peer.
58
- * @deprecated
74
+ * Start receiving messages for `peer`: its point-to-point messages, plus — when `tags` are provided
75
+ * (DX-1125) — swarm broadcasts whose tags intersect. Matching messages are routed to
76
+ * `params.onMessage`; routing and the transport stream are owned here. Returns a callback that tears
77
+ * the subscription down; the subscriber owns that lifecycle.
59
78
  */
60
- unsubscribeMessages: (peer: PeerInfo) => Promise<void>;
61
- }
62
- /**
63
- * Signaling client.
64
- * TODO(mykola): Delete.
65
- * @deprecated
66
- */
67
- export interface SignalClientMethods extends SignalMethods, Required<Lifecycle> {
68
- getStatus(): SignalStatus;
79
+ subscribeMessages: (params: SubscribeMessagesParams) => Promise<UnsubscribeCallback>;
69
80
  }
70
81
  //# sourceMappingURL=signal-methods.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACpC,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,gBAAiB,QAAQ,WAAY,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE9B;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAEtE;;OAEG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;OAGG;IAEH,iBAAiB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;OAGG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC;IAC7E,SAAS,IAAI,YAAY,CAAC;CAC3B"}
1
+ {"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACpC,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC5B,eAAO,MAAM,YAAY,gBAAiB,QAAQ,WAAY,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE9B;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtF"}
@@ -1,4 +1,5 @@
1
1
  export * from './test-builder';
2
+ export * from './test-edge-mesh';
2
3
  export * from './test-peer';
3
4
  export * from './test-messages';
4
5
  export * from './utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { type Context } from '@dxos/context';
2
+ import { type EdgeConnection } from '@dxos/edge-client';
3
+ import { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
4
+ /**
5
+ * In-memory stand-in for the EDGE router + swarm, feature-complete for the messaging paths
6
+ * {@link EdgeSignalManager} exercises: swarm membership (JOIN/LEAVE), tag subscriptions (SUBSCRIBE),
7
+ * point-to-point relay, and tag broadcast fan-out (DX-1125). Multiple {@link TestEdgeConnection}s
8
+ * attach to one mesh, so a broadcast from one client is delivered to the matching subscribers of
9
+ * another — mirroring the real edge without a WebSocket or Durable Object.
10
+ */
11
+ export declare class TestEdgeMesh {
12
+ /** peerKey -> connection. */
13
+ private readonly _connections;
14
+ /** swarmKey -> (peerKey -> subscription tags). */
15
+ private readonly _subscriptions;
16
+ /** swarmKey -> set of member peerKeys. */
17
+ private readonly _members;
18
+ createConnection({ peerKey, identityDid }: {
19
+ peerKey: string;
20
+ identityDid: string;
21
+ }): TestEdgeConnection;
22
+ removeConnection(peerKey: string): void;
23
+ /** Handle a message sent by a client connection. */
24
+ receive(fromPeerKey: string, message: Message): void;
25
+ private _handleSwarmRequest;
26
+ private _handleSignal;
27
+ private _memberSet;
28
+ private _subscriptionMap;
29
+ }
30
+ /**
31
+ * In-memory {@link EdgeConnection} bound to a {@link TestEdgeMesh}. Only the members
32
+ * {@link EdgeSignalManager} uses are functional; the rest are inert stubs.
33
+ */
34
+ export declare class TestEdgeConnection implements EdgeConnection {
35
+ readonly statusChanged: EdgeConnection['statusChanged'];
36
+ private readonly _messageListeners;
37
+ private readonly _peerKey;
38
+ private readonly _identityDid;
39
+ private readonly _mesh;
40
+ constructor({ peerKey, identityDid, mesh }: {
41
+ peerKey: string;
42
+ identityDid: string;
43
+ mesh: TestEdgeMesh;
44
+ });
45
+ get info(): any;
46
+ get identityDid(): string;
47
+ get peerKey(): string;
48
+ get isOpen(): boolean;
49
+ get status(): EdgeConnection['status'];
50
+ setIdentity(): void;
51
+ send(_ctx: Context, message: Message): Promise<void>;
52
+ onMessage(listener: (message: Message) => void): () => void;
53
+ onReconnected(listener: () => void, opts?: {
54
+ emitCurrentState?: boolean;
55
+ }): () => void;
56
+ /** Deliver a message from the mesh to this connection's listeners. */
57
+ deliver(message: Message): void;
58
+ open(): Promise<void>;
59
+ close(): Promise<void>;
60
+ }
61
+ //# sourceMappingURL=test-edge-mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-edge-mesh.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-edge-mesh.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,mBAAmB,CAAC;AAElE,OAAO,EACL,KAAK,OAAO,EAGb,MAAM,4CAA4C,CAAC;AAEpD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;IACtE,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAC3E,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,gBAAgB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,kBAAkB,CAIvG;IAED,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQtC;IAED,oDAAoD;IACpD,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CASnD;IAED,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,gBAAgB;CAQzB;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,SAAgB,aAAa,EAAE,cAAc,CAAC,eAAe,CAAC,CAAoB;IAClF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyC;IAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,EAIvG;IAED,IAAI,IAAI,IAAI,GAAG,CAEd;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,CAErC;IAED,WAAW,IAAI,IAAI,CAAG;IAEhB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAG1D;IAED,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,IAAI,CAKrF;IAED,sEAAsE;IACtE,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAI9B;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}