@kronos-ts/axon-server 0.3.1 → 0.4.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/axon-server-event-store.d.ts +9 -5
- package/dist/axon-server-event-store.d.ts.map +1 -1
- package/dist/axon-server-event-store.js +38 -30
- package/dist/axon-server-event-store.js.map +1 -1
- package/dist/axon-server-snapshot-store.d.ts +8 -8
- package/dist/axon-server-snapshot-store.d.ts.map +1 -1
- package/dist/axon-server-snapshot-store.js +8 -14
- package/dist/axon-server-snapshot-store.js.map +1 -1
- package/dist/axon-server.d.ts +97 -186
- package/dist/axon-server.d.ts.map +1 -1
- package/dist/axon-server.js +217 -318
- package/dist/axon-server.js.map +1 -1
- package/dist/connection.d.ts +128 -0
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +134 -10
- package/dist/connection.js.map +1 -1
- package/dist/context-view.d.ts +30 -0
- package/dist/context-view.d.ts.map +1 -0
- package/dist/context-view.js +19 -0
- package/dist/context-view.js.map +1 -0
- package/dist/control-plane.d.ts +14 -13
- package/dist/control-plane.d.ts.map +1 -1
- package/dist/control-plane.js +8 -6
- package/dist/control-plane.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/flow-controlled-sender.js.map +1 -1
- package/dist/generated/command.d.ts.map +1 -1
- package/dist/generated/command.js.map +1 -1
- package/dist/generated/common.js.map +1 -1
- package/dist/generated/control.d.ts.map +1 -1
- package/dist/generated/control.js.map +1 -1
- package/dist/generated/dcb.d.ts.map +1 -1
- package/dist/generated/dcb.js.map +1 -1
- package/dist/generated/event.d.ts.map +1 -1
- package/dist/generated/event.js.map +1 -1
- package/dist/generated/google/protobuf/empty.js.map +1 -1
- package/dist/generated/query.d.ts.map +1 -1
- package/dist/generated/query.js.map +1 -1
- package/dist/index.d.ts +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/message-size.d.ts.map +1 -1
- package/dist/metadata-conversion.d.ts +1 -1
- package/dist/metadata-conversion.d.ts.map +1 -1
- package/dist/shutdown-latch.d.ts.map +1 -1
- package/dist/shutdown-latch.js.map +1 -1
- package/package.json +4 -8
- package/src/axon-server-event-store.ts +51 -43
- package/src/axon-server-snapshot-store.ts +17 -25
- package/src/axon-server.ts +358 -512
- package/src/connection.ts +270 -18
- package/src/context-view.ts +46 -0
- package/src/control-plane.ts +17 -17
- package/src/index.ts +12 -18
- package/src/metadata-conversion.ts +1 -1
package/dist/axon-server.d.ts
CHANGED
|
@@ -1,64 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Axon Server
|
|
2
|
+
* The Axon Server command and query buses.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* the
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `onStart("processors")` / `onStop("connect")` is now three lines you write
|
|
9
|
-
* in your composition root:
|
|
4
|
+
* Axon Server is a SMART HUB: outbound dispatch always goes to the server, and
|
|
5
|
+
* the server decides which node handles it — there is no client-side
|
|
6
|
+
* prefer-local fork here, which is the whole difference from the dumb-pipe
|
|
7
|
+
* broker in `@kronos-ts/rabbitmq`.
|
|
10
8
|
*
|
|
11
|
-
*
|
|
12
|
-
* const axon = await axonServer({
|
|
13
|
-
* componentName: "university-service",
|
|
14
|
-
* serializer,
|
|
15
|
-
* unitOfWorkFactory,
|
|
16
|
-
* })
|
|
17
|
-
* const app = kronos({
|
|
18
|
-
* components: { ...inMemoryComponents({ serializer, unitOfWorkFactory }), ...axon.components },
|
|
19
|
-
* modules,
|
|
20
|
-
* })
|
|
21
|
-
* await axon.start() // readiness barrier: the server can route to our handlers
|
|
22
|
-
* // …
|
|
23
|
-
* await app.stop(); await axon.close()
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* Connecting before the app is built is what removes the lazy proxies and
|
|
27
|
-
* subscribe-buffering wrappers the container version needed: by the time
|
|
28
|
-
* `kronos` subscribes a handler, the gRPC streams are already live.
|
|
29
|
-
*
|
|
30
|
-
* REMOTE ADMINISTRATION IS NOT IN HERE. Processor instructions (pause / start /
|
|
31
|
-
* release / split / merge) and processor status reporting are the platform
|
|
32
|
-
* CONTROL PLANE — they are neither persistence nor transport, and lived here
|
|
33
|
-
* only because they share this gRPC connection. They are now an opt-in second
|
|
34
|
-
* object built on the platform stream this backend exposes:
|
|
9
|
+
* Both buses are plain functions over the shared connection and YOUR local bus:
|
|
35
10
|
*
|
|
36
11
|
* ```ts
|
|
37
|
-
* const
|
|
12
|
+
* const commandBus = interceptingCommandBus(
|
|
13
|
+
* axonServerCommandBus(axon, simpleCommandBus(unitOfWork)), lineage)
|
|
14
|
+
* const queryBus = interceptingQueryBus(
|
|
15
|
+
* axonServerQueryBus(axon, simpleQueryBus(unitOfWork)), lineage)
|
|
38
16
|
* ```
|
|
39
17
|
*
|
|
40
|
-
* `start()` therefore takes NO arguments and does exactly one thing: the
|
|
41
|
-
* data-path readiness barrier. See `control-plane.ts`.
|
|
42
|
-
*
|
|
43
18
|
* Axon-specific protocol invariants are preserved byte-for-byte:
|
|
44
19
|
*
|
|
45
20
|
* - CLIENT_SUPPORTS_STREAMING capability advertised on every dispatched
|
|
46
21
|
* query via `defaultQueryInstructions(...)`;
|
|
47
22
|
* - AxonIQ-Context + AxonIQ-Access-Token gRPC metadata headers built by
|
|
48
|
-
* `
|
|
23
|
+
* `contextView(...)` and attached to every outbound stream/RPC;
|
|
49
24
|
* - permits-AFTER-subscriptions stream ordering preserved on the initial
|
|
50
25
|
* handshake AND on reconnect (see `ensureStreamStarted` /
|
|
51
|
-
* `reestablishStreamBody`)
|
|
52
|
-
* - shutdown ordering: busLatches → platform.stop → connection.close.
|
|
26
|
+
* `reestablishStreamBody`).
|
|
53
27
|
*/
|
|
54
|
-
import { type
|
|
55
|
-
import type { CommandBus, QueryBus
|
|
56
|
-
import type {
|
|
57
|
-
import { type AxonServerConnection } from "./connection.js";
|
|
58
|
-
import { axonServerEventStore } from "./axon-server-event-store.js";
|
|
59
|
-
import { axonServerSnapshotStore } from "./axon-server-snapshot-store.js";
|
|
60
|
-
import { type ShutdownLatch } from "./shutdown-latch.js";
|
|
61
|
-
import { type PlatformConnection, type PlatformServiceOptions } from "./platform-service.js";
|
|
28
|
+
import { type ResilienceConfig } from "@kronos-ts/core";
|
|
29
|
+
import type { CommandBus, QueryBus } from "@kronos-ts/core";
|
|
30
|
+
import type { AxonServerBusSource } from "./connection.js";
|
|
62
31
|
/**
|
|
63
32
|
* Flow control configuration for a bus channel.
|
|
64
33
|
*/
|
|
@@ -80,175 +49,117 @@ export interface ProcessingInstructions {
|
|
|
80
49
|
/** Timeout in ms. Axon Server cancels the command/query if not handled in time. */
|
|
81
50
|
timeoutMs?: number;
|
|
82
51
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
* when the handler is co-located.
|
|
94
|
-
*
|
|
95
|
-
* Aligned with Java's `shortcutQueriesToLocalHandlers`.
|
|
96
|
-
* Default: false.
|
|
97
|
-
*/
|
|
98
|
-
shortcutQueriesToLocalHandlers?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Tuning for {@link axonServerCommandBus}. Every field has a working default;
|
|
54
|
+
* the two arguments that carry meaning — the connection and your local bus —
|
|
55
|
+
* are positional, and this record is the trailing remainder.
|
|
56
|
+
*/
|
|
57
|
+
export interface AxonServerCommandBusOptions {
|
|
58
|
+
/** Axon Server context for this bus's stream. Default: the connection's. */
|
|
59
|
+
context?: string;
|
|
60
|
+
/** Flow control for the command stream. */
|
|
61
|
+
flowControl?: FlowControlConfig;
|
|
99
62
|
/**
|
|
100
|
-
* Load factor for command handler
|
|
101
|
-
*
|
|
102
|
-
* Higher value = handler can take more commands.
|
|
103
|
-
*
|
|
63
|
+
* Load factor for this command handler. Signals to Axon Server how much
|
|
64
|
+
* capacity this node has — higher value = more commands routed here.
|
|
104
65
|
* Aligned with Java's `commandLoadFactor`. Default: 100.
|
|
105
66
|
*/
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Default timeout for command dispatch in ms. Default: 300000 (5 min).
|
|
109
|
-
* Aligned with Java's processing instruction timeout.
|
|
110
|
-
*/
|
|
111
|
-
commandTimeoutMs?: number;
|
|
112
|
-
/**
|
|
113
|
-
* Default timeout for query dispatch in ms. Default: 3600000 (1 hour).
|
|
114
|
-
* Aligned with Java's processing instruction timeout.
|
|
115
|
-
*/
|
|
116
|
-
queryTimeoutMs?: number;
|
|
117
|
-
/** Per-extension resilience config (D-100 / D-101). */
|
|
67
|
+
loadFactor?: number;
|
|
68
|
+
/** Retry policy for stream re-establishment. Default: the connection's. */
|
|
118
69
|
resilience?: Partial<ResilienceConfig>;
|
|
119
|
-
/**
|
|
120
|
-
* How long `start()` waits for Axon Server's routing tables to register the
|
|
121
|
-
* subscribe frames sent on the command/query streams. This is the entire
|
|
122
|
-
* data-path readiness barrier.
|
|
123
|
-
*
|
|
124
|
-
* It is a timed wait rather than an observed signal because nothing on the
|
|
125
|
-
* client can observe it: subscribes travel on the bus streams, and the
|
|
126
|
-
* platform stream — which is where an ack would arrive — is a different
|
|
127
|
-
* stream that Axon Server holds open silently after `register`. Default:
|
|
128
|
-
* 1000, matching the legacy enhancer. Tests against a freshly-booted server
|
|
129
|
-
* can tighten this once subscriptions are observed to land faster.
|
|
130
|
-
*/
|
|
131
|
-
busSubscriptionAckDelayMs?: number;
|
|
132
|
-
}
|
|
133
|
-
/** The components an Axon Server backend provides. Spread into `kronos`. */
|
|
134
|
-
export interface AxonServerComponents {
|
|
135
|
-
eventStore: ReturnType<typeof axonServerEventStore>;
|
|
136
|
-
snapshotStore: ReturnType<typeof axonServerSnapshotStore>;
|
|
137
|
-
commandBus: CommandBus;
|
|
138
|
-
queryBus: QueryBus;
|
|
139
70
|
}
|
|
140
71
|
/**
|
|
141
|
-
*
|
|
142
|
-
* that used to be lifecycle stages.
|
|
72
|
+
* Tuning for {@link axonServerQueryBus}. See {@link AxonServerCommandBusOptions}.
|
|
143
73
|
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
export interface AxonServerBackend {
|
|
150
|
-
readonly components: AxonServerComponents;
|
|
74
|
+
export interface AxonServerQueryBusOptions {
|
|
75
|
+
/** Axon Server context for this bus's stream. Default: the connection's. */
|
|
76
|
+
context?: string;
|
|
77
|
+
/** Flow control for the query stream. */
|
|
78
|
+
flowControl?: FlowControlConfig;
|
|
151
79
|
/**
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
* `start()` below brings it up for the DATA path — heartbeats and reconnect
|
|
156
|
-
* detection — via `platform.armConnectionMonitoring()`. What it deliberately
|
|
157
|
-
* does NOT do is arm processor status reporting or route instructions: that is
|
|
158
|
-
* remote administration, and it stays opt-in behind
|
|
159
|
-
* `axonServerControlPlane(axon.platform, …)`, which registers its handler and
|
|
160
|
-
* supplier and then calls `platform.start()` on this same live stream.
|
|
80
|
+
* When true, queries are first checked against locally subscribed handlers
|
|
81
|
+
* before being dispatched through Axon Server. Avoids a network round-trip
|
|
82
|
+
* when the handler is co-located.
|
|
161
83
|
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
84
|
+
* This is NOT the rabbitmq `preferLocal` fork by another name: it is Java's
|
|
85
|
+
* `shortcutQueriesToLocalHandlers`, it is off by default, and commands have
|
|
86
|
+
* no equivalent — Axon Server routes those, always.
|
|
165
87
|
*/
|
|
166
|
-
|
|
88
|
+
shortcutQueriesToLocalHandlers?: boolean;
|
|
167
89
|
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* 1. arm heartbeat-driven reconnect detection on the platform stream, and
|
|
171
|
-
* 2. wait until Axon Server can route to the handlers subscribed on the bus
|
|
172
|
-
* streams.
|
|
173
|
-
*
|
|
174
|
-
* Call AFTER `kronos` — the subscribe frames must already be on the wire for
|
|
175
|
-
* the readiness wait to mean anything.
|
|
176
|
-
*
|
|
177
|
-
* Takes no arguments and arms no control-plane state.
|
|
90
|
+
* Default timeout for query dispatch in ms. Default: 3600000 (1 hour).
|
|
91
|
+
* Aligned with Java's processing instruction timeout.
|
|
178
92
|
*/
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
|
|
93
|
+
timeoutMs?: number;
|
|
94
|
+
/** Retry policy for stream re-establishment. Default: the connection's. */
|
|
95
|
+
resilience?: Partial<ResilienceConfig>;
|
|
182
96
|
}
|
|
183
97
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* - **
|
|
198
|
-
* Axon Server
|
|
199
|
-
* routes an inbound command to this node, it's executed on the local segment
|
|
200
|
-
* within a UnitOfWork.
|
|
201
|
-
*/
|
|
202
|
-
/**
|
|
203
|
-
* A command bus backed by Axon Server.
|
|
98
|
+
* A command bus backed by Axon Server, over YOUR local bus.
|
|
99
|
+
*
|
|
100
|
+
* - **Outbound dispatch**: ALWAYS through Axon Server, via the unary Dispatch
|
|
101
|
+
* RPC. Axon Server routes the command to the appropriate node (which may be
|
|
102
|
+
* this one). There is deliberately no client-side prefer-local fork: the hub
|
|
103
|
+
* is the router, and short-circuiting it would silently defeat load factors,
|
|
104
|
+
* priorities and routing keys.
|
|
105
|
+
* - **Inbound**: a command the server routes here is dispatched into `local` —
|
|
106
|
+
* not into a privately-held handler map. That is what makes the unit-of-work
|
|
107
|
+
* policy you chose for `local` (say `postgresUnitOfWork(pg, unitOfWork)`)
|
|
108
|
+
* apply to server-routed work exactly as it applies to work this process
|
|
109
|
+
* originated. It is also why this function takes no `unitOfWork` argument:
|
|
110
|
+
* `local` carries that policy now.
|
|
111
|
+
* - **subscribe**: registers the handler on `local` AND announces the name to
|
|
112
|
+
* Axon Server, so other nodes can route to us.
|
|
204
113
|
*
|
|
205
114
|
* ## Correlation lineage and the interceptor layer
|
|
206
115
|
*
|
|
207
|
-
* The returned bus
|
|
208
|
-
*
|
|
209
|
-
*
|
|
116
|
+
* The returned bus stamps no lineage of its own. A host that wants it wraps the
|
|
117
|
+
* OUTERMOST bus:
|
|
118
|
+
*
|
|
119
|
+
* ```ts
|
|
120
|
+
* interceptingCommandBus(axonServerCommandBus(conn, local), lineage)
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* so whatever a host adds runs BEFORE the message is serialized onto the wire.
|
|
124
|
+
* Lineage itself is usually already on `message.metadata` by then — `ctx.send`
|
|
125
|
+
* stamps the unit of work's correlation data before any bus sees the message.
|
|
210
126
|
*
|
|
211
127
|
* This is precisely how the Java client does it. AF4's `AxonServerCommandBus`
|
|
212
128
|
* holds its own `DispatchInterceptors` and dispatches as
|
|
213
129
|
* `doDispatch(dispatchInterceptors.intercept(commandMessage), cb)` — one call
|
|
214
|
-
* site, at the top, ahead of any routing
|
|
215
|
-
*
|
|
216
|
-
* AF5 keeps the property via decorator order:
|
|
217
|
-
* `DISTRIBUTED_COMMAND_BUS_ORDER = InterceptingCommandBus.DECORATION_ORDER - 50`
|
|
130
|
+
* site, at the top, ahead of any routing. AF5 keeps the property via decorator
|
|
131
|
+
* order: `DISTRIBUTED_COMMAND_BUS_ORDER = InterceptingCommandBus.DECORATION_ORDER - 50`
|
|
218
132
|
* stacks `InterceptingCommandBus → DistributedCommandBus → SimpleCommandBus`.
|
|
219
133
|
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* this backend replaces it wholesale.
|
|
224
|
-
*
|
|
225
|
-
* No double-application risk: the local segment here is a plain handler map, not
|
|
226
|
-
* a `CommandBus`, so this is the only interceptor in the chain. Inbound commands
|
|
227
|
-
* from the server are invoked through that map directly, which matches AF —
|
|
228
|
-
* `CommandProcessingTask` runs the local segment WITHOUT re-running dispatch
|
|
229
|
-
* interceptors.
|
|
134
|
+
* If `local` is itself an intercepting bus, a server-routed command sees
|
|
135
|
+
* `lineage` twice. That is harmless: both of its fields are `??` seeds, so the
|
|
136
|
+
* second application finds them set and changes nothing.
|
|
230
137
|
*/
|
|
231
|
-
export declare function
|
|
138
|
+
export declare function axonServerCommandBus(conn: AxonServerBusSource, local: CommandBus, options?: AxonServerCommandBusOptions): CommandBus;
|
|
232
139
|
/**
|
|
233
|
-
* A query bus backed by Axon Server.
|
|
140
|
+
* A query bus backed by Axon Server, over YOUR local bus.
|
|
141
|
+
*
|
|
142
|
+
* Same architecture as {@link axonServerCommandBus}: outbound dispatch goes
|
|
143
|
+
* through Axon Server, and a query the server routes here runs through `local`,
|
|
144
|
+
* so your unit-of-work policy applies to server-routed reads too. `subscribe`
|
|
145
|
+
* registers on `local` and announces the name to the server.
|
|
234
146
|
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
147
|
+
* The one asymmetry with commands is `shortcutQueriesToLocalHandlers` — Java
|
|
148
|
+
* has it for queries and not for commands, and so do we. When it is on and this
|
|
149
|
+
* node subscribed the name, `query()` goes straight to `local` and the caller's
|
|
150
|
+
* unit of work is passed through, so the local branch nests exactly as the
|
|
151
|
+
* in-process bus does.
|
|
240
152
|
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
* `
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
* `query()` gets identical lineage to the remote branch.
|
|
153
|
+
* Lineage, if wanted, is `interceptingQueryBus(bus, lineage)` at the host,
|
|
154
|
+
* matching AF4's `AxonServerQueryBus`, which calls
|
|
155
|
+
* `dispatchInterceptors.intercept(...)` at the top of `query`, `streamingQuery`,
|
|
156
|
+
* `scatterGather` and `subscriptionQuery`. Because the wrap is outside, the
|
|
157
|
+
* shortcut branch gets identical lineage to the remote branch.
|
|
247
158
|
*
|
|
248
159
|
* KNOWN GAP: `subscriptionQuery` / `subscribeToUpdates` build their proto
|
|
249
160
|
* straight from `message.metadata`, and `interceptingQueryBus` (in
|
|
250
|
-
* `@kronos-ts/
|
|
251
|
-
* running the dispatch chain. Closing that needs a
|
|
161
|
+
* `@kronos-ts/core`) forwards those two calls to the delegate without
|
|
162
|
+
* running the dispatch chain. Closing that needs a core change.
|
|
252
163
|
*/
|
|
253
|
-
export declare function
|
|
164
|
+
export declare function axonServerQueryBus(conn: AxonServerBusSource, local: QueryBus, options?: AxonServerQueryBusOptions): QueryBus;
|
|
254
165
|
//# sourceMappingURL=axon-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axon-server.d.ts","sourceRoot":"","sources":["../src/axon-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"axon-server.d.ts","sourceRoot":"","sources":["../src/axon-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,UAAU,EAEV,QAAQ,EAOT,MAAM,iBAAiB,CAAA;AAOxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAgB1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;;;;;OAQG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAA;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACvC;AAyED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,2BAAgC,GACxC,UAAU,CAuOZ;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,QAAQ,EACf,OAAO,GAAE,yBAA8B,GACtC,QAAQ,CAojBV"}
|