@silkweave/mcp 1.9.0 → 1.10.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.
@@ -1,13 +1,13 @@
1
1
  $ tsdown
2
- ℹ tsdown v0.21.8 powered by rolldown v1.0.0-rc.15
2
+ ℹ tsdown v0.21.10 powered by rolldown v1.0.0-rc.17
3
3
  ℹ config file: /Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts
4
4
  ℹ entry: src/index.ts
5
5
  ℹ tsconfig: tsconfig.json
6
6
  ℹ Build start
7
7
  ℹ Cleaning 4 files
8
- ℹ build/index.mjs 17.31 kB │ gzip: 5.04 kB
9
- ℹ build/index.mjs.map 32.92 kB │ gzip: 9.07 kB
10
- ℹ build/index.d.mts.map  1.22 kB │ gzip: 0.55 kB
11
- ℹ build/index.d.mts  3.71 kB │ gzip: 1.36 kB
12
- ℹ 4 files, total: 55.16 kB
13
- ✔ Build complete in 673ms
8
+ ℹ build/index.mjs 22.50 kB │ gzip: 6.48 kB
9
+ ℹ build/index.mjs.map 41.78 kB │ gzip: 11.23 kB
10
+ ℹ build/index.d.mts.map  2.08 kB │ gzip: 0.80 kB
11
+ ℹ build/index.d.mts  8.15 kB │ gzip: 2.86 kB
12
+ ℹ 4 files, total: 74.51 kB
13
+ ✔ Build complete in 699ms
@@ -1,4 +1,3 @@
1
1
  $ pnpm lint && pnpm typecheck
2
2
  $ eslint
3
- [ELIFECYCLE] Command failed.
4
- [ELIFECYCLE] Command failed.
3
+ $ tsc --noEmit
@@ -1,5 +1,2 @@
1
1
 
2
- 
3
- > @silkweave/mcp@1.7.1 lint /Users/atomic/projects/silkweave/silkweave/packages/mcp
4
- > eslint
5
-
2
+ $ eslint
@@ -1,24 +1,15 @@
1
1
 
2
- 
3
- > @silkweave/mcp@1.8.0 prepack /Users/atomic/projects/silkweave/silkweave/packages/mcp
4
- > pnpm clean && pnpm build
5
-
6
-
7
- > @silkweave/mcp@1.8.0 clean /Users/atomic/projects/silkweave/silkweave/packages/mcp
8
- > rimraf build
9
-
10
-
11
- > @silkweave/mcp@1.8.0 build /Users/atomic/projects/silkweave/silkweave/packages/mcp
12
- > tsdown
13
-
14
- ℹ tsdown v0.21.8 powered by rolldown v1.0.0-rc.15
2
+ $ pnpm clean && pnpm build
3
+ $ rimraf build
4
+ $ tsdown
5
+ ℹ tsdown v0.21.10 powered by rolldown v1.0.0-rc.17
15
6
  ℹ config file: /Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts
16
7
  ℹ entry: src/index.ts
17
8
  ℹ tsconfig: tsconfig.json
18
9
  ℹ Build start
19
- ℹ build/index.mjs 16.50 kB │ gzip: 4.74 kB
20
- ℹ build/index.mjs.map 30.99 kB │ gzip: 8.52 kB
21
- ℹ build/index.d.mts.map  0.93 kB │ gzip: 0.43 kB
22
- ℹ build/index.d.mts  2.15 kB │ gzip: 0.80 kB
23
- ℹ 4 files, total: 50.57 kB
24
- ✔ Build complete in 755ms
10
+ ℹ build/index.mjs 22.50 kB │ gzip: 6.48 kB
11
+ ℹ build/index.mjs.map 41.78 kB │ gzip: 11.23 kB
12
+ ℹ build/index.d.mts.map  2.08 kB │ gzip: 0.80 kB
13
+ ℹ build/index.d.mts  8.15 kB │ gzip: 2.86 kB
14
+ ℹ 4 files, total: 74.51 kB
15
+ ✔ Build complete in 627ms
package/README.md CHANGED
@@ -85,6 +85,37 @@ await silkweave({ name: 'my-tools', description: 'My Tools', version: '1.0.0' })
85
85
 
86
86
  Logging notifications (`logger.info()`, `logger.progress()`) are sent to the MCP client as `notifications/message` and `notifications/progress`.
87
87
 
88
+ ## Streaming Actions
89
+
90
+ Actions that declare a `chunk` schema and an `async function*` `run` (see [`@silkweave/core`](https://www.npmjs.com/package/@silkweave/core) for the action definition) stream over MCP using `notifications/progress`:
91
+
92
+ - The client opts in by sending `_meta.progressToken` with the tool call. The MCP TypeScript SDK does this automatically when the host registers a progress listener.
93
+ - For each yielded chunk, the adapter sends a `notifications/progress` with the same `progressToken`, a 1-based `progress` counter, and the JSON-stringified chunk in the `message` field. The send is awaited so transport backpressure flows back to your generator.
94
+ - The tool call resolves with the full buffered chunk array as the `CallToolResult`. Clients that did not opt in (no `progressToken`) receive only this final result.
95
+
96
+ ```typescript
97
+ import { createAction } from '@silkweave/core'
98
+ import z from 'zod/v4'
99
+
100
+ createAction({
101
+ name: 'generate-messages',
102
+ description: 'Stream messages about a topic',
103
+ input: z.object({ topic: z.string(), count: z.number().int().min(1).max(50) }),
104
+ chunk: z.object({ index: z.number().int(), text: z.string() }),
105
+ run: async function* ({ topic, count }) {
106
+ for (let i = 0; i < count; i += 1) {
107
+ yield { index: i, text: `Message ${i + 1} about ${topic}` }
108
+ }
109
+ }
110
+ })
111
+ ```
112
+
113
+ ### What this means for AI hosts
114
+
115
+ MCP `notifications/progress` is part of the standard protocol - chunks reach the wire correctly. But **what the host client does with them is up to the host**. Most LLM-driven MCP hosts today (Claude Code, Cursor, generic chat UIs) consume progress notifications for **UI rendering** (spinners, status text, progress bars) and **not** as incremental data fed into the model's context. From the model's perspective, an MCP tool call is still atomic - the model sees the final buffered result when the call returns, not the chunks in flight.
116
+
117
+ This is a host-side rendering choice, not a protocol limitation. If you need per-chunk model visibility today, expose the action via [`@silkweave/fastify`](https://www.npmjs.com/package/@silkweave/fastify) (SSE/NDJSON) or [`@silkweave/trpc`](https://www.npmjs.com/package/@silkweave/trpc) (subscriptions) and have your consumer iterate chunks directly.
118
+
88
119
  ## Smart Tool Results
89
120
 
90
121
  By default, all MCP adapters use `smartToolResult()` to format action return values:
package/build/index.d.mts CHANGED
@@ -1,9 +1,11 @@
1
1
  import { CallToolResult, ContentBlock, EmbeddedResource } from "@modelcontextprotocol/sdk/types.js";
2
2
  import { Action, AdapterFactory, SilkweaveContext, SilkweaveError, SilkweaveOptions } from "@silkweave/core";
3
3
  import { CreateMcpExpressAppOptions } from "@modelcontextprotocol/sdk/server/express.js";
4
- import { AuthConfig } from "@silkweave/auth";
4
+ import { Express, RequestHandler } from "express";
5
+ import { AuthConfig, AuthInfo } from "@silkweave/auth";
6
+ import { AsyncLocalStorage } from "node:async_hooks";
5
7
  import { CorsOptions, CorsOptions as CorsOptions$1 } from "cors";
6
- import { Express } from "express";
8
+ import { Server } from "http";
7
9
 
8
10
  //#region src/adapter/cliProxy.d.ts
9
11
  type CLIFormatterFn = (message: ContentBlock, index: number, messages: ContentBlock[]) => string | undefined;
@@ -13,43 +15,137 @@ interface CliProxyOptions {
13
15
  }
14
16
  declare const cliProxy: AdapterFactory<CliProxyOptions>;
15
17
  //#endregion
16
- //#region src/lib/handler.d.ts
17
- /** Headers required by the MCP protocol that must always be exposed when CORS is in use. */
18
- declare const MCP_REQUIRED_HEADERS: string[];
19
- interface CreateMcpExpressHandlerOptions extends CreateMcpExpressAppOptions {
20
- /** Bearer-token / OAuth auth configuration. Omit to disable auth entirely. */
18
+ //#region src/adapter/http.d.ts
19
+ interface StartMcpHttpOptions extends CreateMcpExpressAppOptions {
20
+ host: string;
21
+ port: number;
21
22
  auth?: AuthConfig;
22
- /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */
23
+ /** CORS configuration. `false` to disable, omitted/`true` for permissive defaults, or a `CorsOptions` object. */
23
24
  cors?: CorsOptions$1 | boolean;
24
- /** Hostname for the underlying express app (used by some MCP SDK checks). Default `'0.0.0.0'`. */
25
- host?: string;
26
- /** Mount the `/resource/:id` sideload route on the returned app. Default `true`. */
25
+ /** Mount the `/resource/:id` sideload route. Default `true`. */
27
26
  sideloadResources?: boolean;
27
+ /** Directory the sideload route reads from. Default `'resources'`. */
28
+ resourceDir?: string;
28
29
  }
29
30
  /**
30
- * Build an Express sub-app exposing the MCP Streamable HTTP transport, OAuth
31
- * routes (if configured), and bearer-token auth middleware. The returned app
32
- * can be listened on directly OR mounted onto an existing server via
33
- * `parentApp.use(basePath, app)` / Nest's `httpAdapter.use(basePath, app)`.
31
+ * Build a fully-wired Express app that exposes the MCP Streamable HTTP
32
+ * transport (plus OAuth / sideload / well-known routes when configured).
34
33
  *
35
- * Used by `@silkweave/mcp`'s `http()` adapter (server-owning) and
36
- * `@silkweave/nestjs`'s `mcp()` adapter (mounts on Nest's HTTP server).
34
+ * Pass the resulting `app` to `app.listen(port, host)` yourself, or use the
35
+ * top-level `startMcpServer()` / `http()` adapter conveniences.
37
36
  */
38
- declare function createMcpExpressHandler(silkweaveOptions: SilkweaveOptions, context: SilkweaveContext, actions: Action[], options?: CreateMcpExpressHandlerOptions): Express;
39
- //#endregion
40
- //#region src/adapter/http.d.ts
41
- interface HttpAdapterOptions extends Omit<CreateMcpExpressHandlerOptions, 'auth' | 'cors'> {
42
- host: string;
43
- port: number;
44
- auth?: AuthConfig;
45
- /** CORS configuration. `false` to disable, `true`/`undefined` for permissive defaults, or a CorsOptions object. */
46
- cors?: CorsOptions$1 | boolean;
47
- }
48
- declare const http: AdapterFactory<HttpAdapterOptions>;
37
+ declare function buildMcpExpressApp(silkweaveOptions: SilkweaveOptions, context: SilkweaveContext, actions: Action[], options: StartMcpHttpOptions): Express;
38
+ /**
39
+ * Spin up a standalone MCP Streamable HTTP server on `host:port` for the
40
+ * given `actions`. Returns the underlying `Server` so callers can close it.
41
+ *
42
+ * Convenience for use cases that don't go through the `silkweave()` builder.
43
+ */
44
+ declare function startMcpServer(silkweaveOptions: SilkweaveOptions, actions: Action[], options: StartMcpHttpOptions, context?: SilkweaveContext): Promise<Server>;
45
+ /**
46
+ * Silkweave adapter that owns its own HTTP server. Composes the MCP handler
47
+ * primitives into a fully-wired Express app and listens on `host:port`.
48
+ */
49
+ declare const http: AdapterFactory<StartMcpHttpOptions>;
49
50
  //#endregion
50
51
  //#region src/adapter/stdio.d.ts
51
52
  declare const stdio: AdapterFactory;
52
53
  //#endregion
54
+ //#region src/handlers/auth.d.ts
55
+ /**
56
+ * Per-request bearer-token storage used by tool handlers to read the resolved
57
+ * `AuthInfo` for the currently-handled MCP call.
58
+ */
59
+ declare const authStorage: AsyncLocalStorage<AuthInfo>;
60
+ /**
61
+ * Express middleware that validates the `Authorization: Bearer …` header via
62
+ * the supplied `AuthConfig`. On success the resolved `AuthInfo` is placed in
63
+ * `authStorage` for the duration of the downstream handler - `mcpTransport`'s
64
+ * tool callbacks pick it up to populate the silkweave context's `auth` key.
65
+ *
66
+ * The middleware should NOT be applied to OAuth-discovery / token routes -
67
+ * compose it only on the routes that require an authenticated caller (the MCP
68
+ * transport itself, sideload, etc.).
69
+ */
70
+ declare function authMiddleware(auth: AuthConfig, context: SilkweaveContext): RequestHandler;
71
+ //#endregion
72
+ //#region src/handlers/cors.d.ts
73
+ /** Headers required by the MCP protocol that must always be exposed when CORS is in use. */
74
+ declare const MCP_REQUIRED_HEADERS: string[];
75
+ /**
76
+ * CORS middleware preconfigured to expose the headers MCP clients need
77
+ * (`Mcp-Session-Id`, `Last-Event-Id`, `Mcp-Protocol-Version`, `WWW-Authenticate`)
78
+ * on top of any user-supplied options.
79
+ *
80
+ * Pass `false` to disable, omit / pass `true` for permissive defaults, or pass
81
+ * a `CorsOptions` object to override.
82
+ */
83
+ declare function mcpCors(corsConfig?: CorsOptions$1 | boolean): RequestHandler | null;
84
+ //#endregion
85
+ //#region src/handlers/metadata.d.ts
86
+ /**
87
+ * Handler for `GET /.well-known/oauth-protected-resource` (RFC 9728). Returns
88
+ * the resource server's metadata pointing at the configured authorization
89
+ * servers. Requires `auth.resourceUrl` and a non-empty `auth.authorizationServers`.
90
+ */
91
+ declare function protectedResourceMetadata(auth: AuthConfig): RequestHandler;
92
+ //#endregion
93
+ //#region src/handlers/oauth.d.ts
94
+ interface OAuthRouteHandlers {
95
+ /** `GET /.well-known/oauth-authorization-server` - RFC 8414 discovery. */
96
+ wellKnownAuthServer: RequestHandler;
97
+ /** `GET /authorize` - start the OAuth flow. */
98
+ authorize: RequestHandler;
99
+ /** `GET {callbackPath}` - provider callback. */
100
+ callback: RequestHandler;
101
+ /** Path the provider should redirect to (defaults to `/auth/callback`). */
102
+ callbackPath: string;
103
+ /** `POST /token` - exchange code / refresh token. Includes urlencoded body parser. */
104
+ token: RequestHandler[];
105
+ /** `POST /register` - dynamic client registration. Includes JSON body parser. */
106
+ register: RequestHandler[];
107
+ }
108
+ /**
109
+ * Build the OAuth 2.1 proxy route handlers (authorize, callback, token,
110
+ * register, well-known) backed by the configured `auth.provider`. Returns the
111
+ * handlers as individual `RequestHandler`s so callers can register them
112
+ * wherever they like - under `/mcp`, at the server root, etc.
113
+ *
114
+ * `token` and `register` are returned as middleware arrays because the
115
+ * appropriate body parser must run before the handler. Apply with
116
+ * `app.post(path, ...token)`.
117
+ */
118
+ declare function oauthRoutes(auth: AuthConfig): OAuthRouteHandlers;
119
+ //#endregion
120
+ //#region src/handlers/sideload.d.ts
121
+ interface SideloadResourceOptions {
122
+ /** Directory to read sideload resources from. Defaults to `resources/` (cwd-relative). */
123
+ resourceDir?: string;
124
+ }
125
+ /**
126
+ * Handler for `GET /resource/:id` - serves a large MCP response that was
127
+ * sideloaded to disk as a `{id}` payload with a `{id}.json` metadata sidecar.
128
+ *
129
+ * The route param `id` is provided by the host framework (Express, Nest, etc.).
130
+ */
131
+ declare function sideloadResource(options?: SideloadResourceOptions): RequestHandler;
132
+ //#endregion
133
+ //#region src/handlers/transport.d.ts
134
+ interface McpTransportHandlers {
135
+ /** `POST /mcp` - initialize session or dispatch request to an existing one. */
136
+ post: RequestHandler;
137
+ /** `GET /mcp` and `DELETE /mcp` - long-poll session stream / session termination. Also covers `GET /mcp/resource/:id`. */
138
+ stream: RequestHandler;
139
+ }
140
+ /**
141
+ * Build the MCP Streamable HTTP transport route handlers.
142
+ *
143
+ * Sessions are kept in a per-call closure (one map per `mcpTransport()` call),
144
+ * so the same handler object should be registered for all three transport
145
+ * routes - `POST /mcp`, `GET /mcp`, `DELETE /mcp` - to share session state.
146
+ */
147
+ declare function mcpTransport(silkweaveOptions: SilkweaveOptions, context: SilkweaveContext, actions: Action[]): McpTransportHandlers;
148
+ //#endregion
53
149
  //#region src/util/result.d.ts
54
150
  declare function smartToolResult(data: string | object | object[]): CallToolResult;
55
151
  declare function jsonToolResult(data: object, isError?: boolean): CallToolResult;
@@ -75,5 +171,5 @@ declare function createSideloadResource(buffer: Buffer, {
75
171
  contentType
76
172
  }: Pick<SideloadResource, 'name' | 'contentType'>): Promise<SideloadResource>;
77
173
  //#endregion
78
- export { CLIFormatterFn, CliProxyOptions, type CorsOptions, CreateMcpExpressHandlerOptions, HttpAdapterOptions, MCP_REQUIRED_HEADERS, SideloadResource, cliProxy, createMcpExpressHandler, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, parseResourceMessage, smartToolResult, stdio };
174
+ export { CLIFormatterFn, CliProxyOptions, type CorsOptions, MCP_REQUIRED_HEADERS, McpTransportHandlers, OAuthRouteHandlers, SideloadResource, SideloadResourceOptions, StartMcpHttpOptions, authMiddleware, authStorage, buildMcpExpressApp, cliProxy, createSideloadResource, errorToolResult, handleToolError, http, jsonToolResult, mcpCors, mcpTransport, oauthRoutes, parseResourceMessage, protectedResourceMetadata, sideloadResource, smartToolResult, startMcpServer, stdio };
79
175
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/cliProxy.ts","../src/lib/handler.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/util/result.ts","../src/util/sideload.ts"],"mappings":";;;;;;;;KAaY,cAAA,IAAkB,OAAA,EAAS,YAAA,EAAc,KAAA,UAAe,QAAA,EAAU,YAAA;AAAA,UAE7D,eAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA,GAAY,cAAA;AAAA;AAAA,cAgCD,QAAA,EAAU,cAAA,CAAe,eAAA;;;;cC7BzB,oBAAA;AAAA,UAEI,8BAAA,SAAuC,0BAAA;EDT5C;ECWV,IAAA,GAAO,UAAA;;EAEP,IAAA,GAAO,aAAA;EDb8B;ECerC,IAAA;EDfmD;ECiBnD,iBAAA;AAAA;;;ADfF;;;;;;;iBCqNgB,uBAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,OAAA,EAAS,gBAAA,EACT,OAAA,EAAS,MAAA,IACT,OAAA,GAAS,8BAAA,GACR,OAAA;;;UClOc,kBAAA,SAA2B,IAAA,CAAK,8BAAA;EAC/C,IAAA;EACA,IAAA;EACA,IAAA,GAAO,UAAA;EFGG;EEDV,IAAA,GAAO,aAAA;AAAA;AAAA,cAGI,IAAA,EAAM,cAAA,CAAe,kBAAA;;;cCoBrB,KAAA,EAAO,cAAA;;;iBC/BJ,eAAA,CAAgB,IAAA,+BAAmC,cAAA;AAAA,iBAqBnD,cAAA,CAAe,IAAA,UAAc,OAAA,aAAkB,cAAA;AAAA,iBAM/C,eAAA,CAAA;EAAkB,IAAA;EAAM,IAAA;EAAM;AAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,iBAU1D,eAAA,CAAgB,KAAA,YAAiB,cAAA;AAAA,iBAUjC,oBAAA,CAAA;EAAuB;AAAA,GAAY,gBAAA;;;UChDlC,gBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,iBAGoB,sBAAA,CAAuB,MAAA,EAAQ,MAAA;EAAU,IAAA;EAAM;AAAA,GAAe,IAAA,CAAK,gBAAA,4BAAyC,OAAA,CAAA,gBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/cliProxy.ts","../src/adapter/http.ts","../src/adapter/stdio.ts","../src/handlers/auth.ts","../src/handlers/cors.ts","../src/handlers/metadata.ts","../src/handlers/oauth.ts","../src/handlers/sideload.ts","../src/handlers/transport.ts","../src/util/result.ts","../src/util/sideload.ts"],"mappings":";;;;;;;;;;KAWY,cAAA,IAAkB,OAAA,EAAS,YAAA,EAAc,KAAA,UAAe,QAAA,EAAU,YAAA;AAAA,UAE7D,eAAA;EACf,GAAA,EAAK,GAAA;EACL,SAAA,GAAY,cAAA;AAAA;AAAA,cA4DD,QAAA,EAAU,cAAA,CAAe,eAAA;;;UC9DrB,mBAAA,SAA4B,0BAAA;EAC3C,IAAA;EACA,IAAA;EACA,IAAA,GAAO,UAAA;EDLG;ECOV,IAAA,GAAO,aAAA;;EAEP,iBAAA;EDTqC;ECWrC,WAAA;AAAA;;;;;ADTF;;;iBCmBgB,kBAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,OAAA,EAAS,gBAAA,EACT,OAAA,EAAS,MAAA,IACT,OAAA,EAAS,mBAAA,GACR,OAAA;;;;;;;iBAiDmB,cAAA,CACpB,gBAAA,EAAkB,gBAAA,EAClB,OAAA,EAAS,MAAA,IACT,OAAA,EAAS,mBAAA,EACT,OAAA,GAAU,gBAAA,GACT,OAAA,CAAQ,MAAA;;;;;cAgBE,IAAA,EAAM,cAAA,CAAe,mBAAA;;;cCxDrB,KAAA,EAAO,cAAA;;;;;;;cC1CP,WAAA,EAAW,iBAAA,CAAA,QAAA;;AHExB;;;;;;;;;iBGUgB,cAAA,CAAe,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,gBAAA,GAAmB,cAAA;;;;cCjBhE,oBAAA;;;;;;;AJOb;;iBIGgB,OAAA,CAAQ,UAAA,GAAY,aAAA,aAA+B,cAAA;;;;;;;;iBCNnD,yBAAA,CAA0B,IAAA,EAAM,UAAA,GAAa,cAAA;;;UCa5C,kBAAA;;EAEf,mBAAA,EAAqB,cAAA;;EAErB,SAAA,EAAW,cAAA;;EAEX,QAAA,EAAU,cAAA;;EAEV,YAAA;ENlBwB;EMoBxB,KAAA,EAAO,cAAA;ENpBiF;EMsBxF,QAAA,EAAU,cAAA;AAAA;;;;;;ANpBZ;;;;;iBMiCgB,WAAA,CAAY,IAAA,EAAM,UAAA,GAAa,kBAAA;;;UC1C9B,uBAAA;;EAEf,WAAA;AAAA;;;;;;APKF;iBOIgB,gBAAA,CAAiB,OAAA,GAAS,uBAAA,GAA+B,cAAA;;;UC6ExD,oBAAA;;EAEf,IAAA,EAAM,cAAA;;EAEN,MAAA,EAAQ,cAAA;AAAA;;;ARrFV;;;;;iBQ+FgB,YAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,OAAA,EAAS,gBAAA,EACT,OAAA,EAAS,MAAA,KACR,oBAAA;;;iBC1Ga,eAAA,CAAgB,IAAA,+BAAmC,cAAA;AAAA,iBAqBnD,cAAA,CAAe,IAAA,UAAc,OAAA,aAAkB,cAAA;AAAA,iBAM/C,eAAA,CAAA;EAAkB,IAAA;EAAM,IAAA;EAAM;AAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,iBAU1D,eAAA,CAAgB,KAAA,YAAiB,cAAA;AAAA,iBAUjC,oBAAA,CAAA;EAAuB;AAAA,GAAY,gBAAA;;;UChDlC,gBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,iBAGoB,sBAAA,CAAuB,MAAA,EAAQ,MAAA;EAAU,IAAA;EAAM;AAAA,GAAe,IAAA,CAAK,gBAAA,4BAAyC,OAAA,CAAA,gBAAA"}