@silkweave/mcp 1.9.0 → 1.9.1
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/.turbo/turbo-build.log +14 -13
- package/.turbo/turbo-check.log +1 -2
- package/.turbo/turbo-lint.log +1 -4
- package/.turbo/turbo-prepack.log +10 -19
- package/README.md +31 -0
- package/build/index.d.mts +125 -29
- package/build/index.d.mts.map +1 -1
- package/build/index.mjs +291 -136
- package/build/index.mjs.map +1 -1
- package/package.json +5 -4
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
[34mℹ[39m
|
|
4
|
-
[34mℹ[39m
|
|
5
|
-
[34mℹ[39m
|
|
6
|
-
[34mℹ[39m
|
|
7
|
-
[34mℹ[39m
|
|
8
|
-
[34mℹ[39m
|
|
9
|
-
[34mℹ[39m [2mbuild/[
|
|
10
|
-
[34mℹ[39m [2mbuild/[22mindex.
|
|
11
|
-
[34mℹ[39m [2mbuild/[
|
|
12
|
-
[34mℹ[39m
|
|
13
|
-
[
|
|
1
|
+
|
|
2
|
+
[2m$ tsdown[22m
|
|
3
|
+
[34mℹ[39m [34mtsdown v0.21.10[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.17[39m
|
|
4
|
+
[34mℹ[39m config file: [4m/Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts[24m
|
|
5
|
+
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
6
|
+
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
7
|
+
[34mℹ[39m Build start
|
|
8
|
+
[34mℹ[39m Cleaning 4 files
|
|
9
|
+
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m22.50 kB[22m [2m│ gzip: 6.48 kB[22m
|
|
10
|
+
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m41.78 kB[22m [2m│ gzip: 11.23 kB[22m
|
|
11
|
+
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 2.08 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
12
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 8.15 kB[22m [2m│ gzip: 2.86 kB[22m
|
|
13
|
+
[34mℹ[39m 4 files, total: 74.51 kB
|
|
14
|
+
[32m✔[39m Build complete in [32m602ms[39m
|
package/.turbo/turbo-check.log
CHANGED
package/.turbo/turbo-lint.log
CHANGED
package/.turbo/turbo-prepack.log
CHANGED
|
@@ -1,24 +1,15 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
[34mℹ[39m [34mtsdown v0.21.8[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.15[39m
|
|
2
|
+
[2m$ pnpm clean && pnpm build[22m
|
|
3
|
+
[2m$ rimraf build[22m
|
|
4
|
+
[2m$ tsdown[22m
|
|
5
|
+
[34mℹ[39m [34mtsdown v0.21.10[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.17[39m
|
|
15
6
|
[34mℹ[39m config file: [4m/Users/atomic/projects/silkweave/silkweave/packages/mcp/tsdown.config.ts[24m
|
|
16
7
|
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
17
8
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
18
9
|
[34mℹ[39m Build start
|
|
19
|
-
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [
|
|
20
|
-
[34mℹ[39m [2mbuild/[22mindex.mjs.map [
|
|
21
|
-
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m
|
|
22
|
-
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m
|
|
23
|
-
[34mℹ[39m 4 files, total:
|
|
24
|
-
[32m✔[39m Build complete in [
|
|
10
|
+
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m22.50 kB[22m [2m│ gzip: 6.48 kB[22m
|
|
11
|
+
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m41.78 kB[22m [2m│ gzip: 11.23 kB[22m
|
|
12
|
+
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 2.08 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
13
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 8.15 kB[22m [2m│ gzip: 2.86 kB[22m
|
|
14
|
+
[34mℹ[39m 4 files, total: 74.51 kB
|
|
15
|
+
[32m✔[39m Build complete in [32m625ms[39m
|
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 {
|
|
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 {
|
|
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/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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,
|
|
23
|
+
/** CORS configuration. `false` to disable, omitted/`true` for permissive defaults, or a `CorsOptions` object. */
|
|
23
24
|
cors?: CorsOptions$1 | boolean;
|
|
24
|
-
/**
|
|
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
|
|
31
|
-
*
|
|
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
|
-
*
|
|
36
|
-
*
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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,
|
|
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
|
package/build/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/adapter/cliProxy.ts","../src/
|
|
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"}
|