paygate-mcp 0.7.0 → 0.9.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/README.md CHANGED
@@ -28,9 +28,14 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
28
28
 
29
29
  - **API Key Auth** — Clients need a valid `X-API-Key` to call tools
30
30
  - **Credit Billing** — Each tool call costs credits (configurable per-tool)
31
- - **Rate Limiting** — Sliding window per-key rate limits
31
+ - **Rate Limiting** — Sliding window per-key rate limits + per-tool rate limits
32
32
  - **Usage Metering** — Track who called what, when, and how much they spent
33
+ - **Multi-Server Mode** — Wrap N MCP servers behind one PayGate with tool prefix routing
34
+ - **Client SDK** — `PayGateClient` with auto 402 retry, balance tracking, and typed errors
33
35
  - **Two Transports** — Wrap local servers via stdio or remote servers via Streamable HTTP
36
+ - **Per-Tool ACL** — Whitelist/blacklist tools per API key (enterprise access control)
37
+ - **Per-Tool Rate Limits** — Independent rate limits per tool, not just global
38
+ - **Key Expiry (TTL)** — Auto-expire API keys after a set time
34
39
  - **Spending Limits** — Cap total spend per API key to prevent runaway costs
35
40
  - **Refund on Failure** — Automatically refund credits when downstream tool calls fail
36
41
  - **Webhook Events** — POST batched usage events to any URL for external billing/alerting
@@ -85,6 +90,75 @@ The proxy handles:
85
90
 
86
91
  When started, you'll see your admin key in the console. Save it.
87
92
 
93
+ ### Multi-Server Mode
94
+
95
+ Wrap multiple MCP servers behind a single PayGate instance. Tools are prefixed with the server name:
96
+
97
+ ```bash
98
+ npx paygate-mcp wrap --config multi-server.json
99
+ ```
100
+
101
+ Example `multi-server.json`:
102
+ ```json
103
+ {
104
+ "port": 3402,
105
+ "defaultCreditsPerCall": 1,
106
+ "servers": [
107
+ {
108
+ "prefix": "fs",
109
+ "serverCommand": "npx",
110
+ "serverArgs": ["@modelcontextprotocol/server-filesystem", "/tmp"]
111
+ },
112
+ {
113
+ "prefix": "github",
114
+ "remoteUrl": "https://github-mcp.example.com/mcp"
115
+ }
116
+ ]
117
+ }
118
+ ```
119
+
120
+ Tools are exposed with prefixes: `fs:read_file`, `fs:write_file`, `github:search_repos`, etc. Pricing and ACLs work on the prefixed names:
121
+
122
+ ```json
123
+ {
124
+ "toolPricing": {
125
+ "github:search_repos": { "creditsPerCall": 5 },
126
+ "fs:read_file": { "creditsPerCall": 1 }
127
+ }
128
+ }
129
+ ```
130
+
131
+ Credits are shared across all backends — one API key works for all servers.
132
+
133
+ ### Client SDK
134
+
135
+ Use `PayGateClient` to call tools from TypeScript/Node.js with auto 402 retry:
136
+
137
+ ```typescript
138
+ import { PayGateClient, PayGateError } from 'paygate-mcp/client';
139
+
140
+ const client = new PayGateClient({
141
+ url: 'http://localhost:3402',
142
+ apiKey: 'pg_abc123...',
143
+ autoRetry: true,
144
+ onCreditsNeeded: async (info) => {
145
+ // Called when credits run out — add credits and return true to retry
146
+ await topUpCredits(info.creditsRequired);
147
+ return true;
148
+ },
149
+ });
150
+
151
+ const tools = await client.listTools();
152
+ const result = await client.callTool('search', { query: 'hello' });
153
+ const balance = await client.getBalance();
154
+ ```
155
+
156
+ Features:
157
+ - **Auto 402 retry**: When a tool call returns payment-required, calls `onCreditsNeeded` and retries
158
+ - **Balance tracking**: `client.lastKnownBalance` tracks credits from `getBalance()` calls
159
+ - **Typed errors**: `PayGateError` with `.isPaymentRequired`, `.isRateLimited`, `.isExpired` helpers
160
+ - **Zero dependencies**: Uses Node.js built-in `http`/`https`
161
+
88
162
  ### Create API Keys
89
163
 
90
164
  ```bash
@@ -171,15 +245,17 @@ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls
171
245
  | Endpoint | Method | Auth | Description |
172
246
  |----------|--------|------|-------------|
173
247
  | `/mcp` | POST | `X-API-Key` | JSON-RPC 2.0 proxy to wrapped MCP server |
174
- | `/balance` | GET | `X-API-Key` | Client self-service — check own credits |
175
- | `/keys` | POST | `X-Admin-Key` | Create a new API key with credits |
176
- | `/keys` | GET | `X-Admin-Key` | List all keys (masked) |
248
+ | `/balance` | GET | `X-API-Key` | Client self-service — check own credits, ACL, expiry |
249
+ | `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, credits) |
250
+ | `/keys` | GET | `X-Admin-Key` | List all keys (masked, with expiry status) |
177
251
  | `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
178
252
  | `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
253
+ | `/keys/acl` | POST | `X-Admin-Key` | Set tool ACL (whitelist/blacklist) on a key |
254
+ | `/keys/expiry` | POST | `X-Admin-Key` | Set or remove key expiry (TTL) |
255
+ | `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
179
256
  | `/usage` | GET | `X-Admin-Key` | Export usage data (JSON or CSV) |
180
257
  | `/status` | GET | `X-Admin-Key` | Full dashboard with usage stats |
181
258
  | `/dashboard` | GET | None (admin key in-browser) | Real-time admin web dashboard |
182
- | `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
183
259
  | `/stripe/webhook` | POST | Stripe Signature | Auto-top-up credits on payment |
184
260
  | `/` | GET | None | Health check |
185
261
 
@@ -208,7 +284,7 @@ These MCP methods pass through without auth or billing:
208
284
  --config <path> Load settings from a JSON config file
209
285
  ```
210
286
 
211
- > **Note:** Use `--server` OR `--remote-url`, not both.
287
+ > **Note:** Use `--server` OR `--remote-url` for single-server mode. Use `servers` in a config file for multi-server mode.
212
288
 
213
289
  ### Persistent Storage
214
290
 
@@ -245,6 +321,82 @@ When a customer completes payment, credits are automatically added to their API
245
321
  - Payment status verification (only `paid` triggers credits)
246
322
  - Zero dependencies — uses Node.js built-in `crypto`
247
323
 
324
+ ### Per-Tool ACL (Access Control)
325
+
326
+ Control which tools each API key can access:
327
+
328
+ ```bash
329
+ # Create a key that can only access search and read tools
330
+ curl -X POST http://localhost:3402/keys \
331
+ -H "Content-Type: application/json" \
332
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
333
+ -d '{"name": "limited-client", "credits": 100, "allowedTools": ["search", "read_file"]}'
334
+
335
+ # Create a key with specific tools blocked
336
+ curl -X POST http://localhost:3402/keys \
337
+ -H "Content-Type: application/json" \
338
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
339
+ -d '{"name": "safe-client", "credits": 100, "deniedTools": ["delete_file", "admin_reset"]}'
340
+
341
+ # Update ACL on an existing key
342
+ curl -X POST http://localhost:3402/keys/acl \
343
+ -H "Content-Type: application/json" \
344
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
345
+ -d '{"key": "CLIENT_API_KEY", "allowedTools": ["search"], "deniedTools": ["admin"]}'
346
+ ```
347
+
348
+ - **allowedTools** (whitelist): Only these tools are accessible. Empty = all tools.
349
+ - **deniedTools** (blacklist): These tools are always denied. Applied after allowedTools.
350
+ - ACL also filters `tools/list` — clients only see their permitted tools.
351
+
352
+ ### Per-Tool Rate Limits
353
+
354
+ Set independent rate limits per tool (on top of the global limit):
355
+
356
+ ```json
357
+ {
358
+ "toolPricing": {
359
+ "expensive_analyze": { "creditsPerCall": 10, "rateLimitPerMin": 5 },
360
+ "search": { "creditsPerCall": 1, "rateLimitPerMin": 30 },
361
+ "cheap_read": { "creditsPerCall": 1 }
362
+ }
363
+ }
364
+ ```
365
+
366
+ Per-tool limits are enforced independently per API key. A key can be rate-limited on one tool while still accessing others. The global `--rate-limit` applies across all tools.
367
+
368
+ ### Key Expiry (TTL)
369
+
370
+ Create API keys that auto-expire:
371
+
372
+ ```bash
373
+ # Create a key that expires in 1 hour (3600 seconds)
374
+ curl -X POST http://localhost:3402/keys \
375
+ -H "Content-Type: application/json" \
376
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
377
+ -d '{"name": "trial-user", "credits": 50, "expiresIn": 3600}'
378
+
379
+ # Create a key with a specific expiry date
380
+ curl -X POST http://localhost:3402/keys \
381
+ -H "Content-Type: application/json" \
382
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
383
+ -d '{"name": "quarterly", "credits": 1000, "expiresAt": "2026-06-01T00:00:00Z"}'
384
+
385
+ # Set or extend expiry on an existing key
386
+ curl -X POST http://localhost:3402/keys/expiry \
387
+ -H "Content-Type: application/json" \
388
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
389
+ -d '{"key": "CLIENT_API_KEY", "expiresIn": 86400}'
390
+
391
+ # Remove expiry (key never expires)
392
+ curl -X POST http://localhost:3402/keys/expiry \
393
+ -H "Content-Type: application/json" \
394
+ -H "X-Admin-Key: YOUR_ADMIN_KEY" \
395
+ -d '{"key": "CLIENT_API_KEY", "expiresAt": null}'
396
+ ```
397
+
398
+ Expired keys return a clear `api_key_expired` error. Admins can extend or remove expiry at any time.
399
+
248
400
  ### Spending Limits
249
401
 
250
402
  Cap the total credits any API key can spend:
@@ -316,7 +468,7 @@ CLI flags override config file values when both are specified.
316
468
  ## Programmatic API
317
469
 
318
470
  ```typescript
319
- import { PayGateServer, HttpMcpProxy } from 'paygate-mcp';
471
+ import { PayGateServer } from 'paygate-mcp';
320
472
 
321
473
  // Wrap a local server (stdio)
322
474
  const server = new PayGateServer({
@@ -329,14 +481,28 @@ const server = new PayGateServer({
329
481
  },
330
482
  });
331
483
 
332
- // Or gate a remote server (Streamable HTTP)
333
- const remoteServer = new PayGateServer({
334
- serverCommand: '',
335
- port: 3402,
336
- defaultCreditsPerCall: 5,
337
- }, undefined, undefined, 'https://my-mcp-server.example.com/mcp');
338
-
339
484
  const { port, adminKey } = await server.start();
485
+
486
+ // Multi-server mode
487
+ const multiServer = new PayGateServer(
488
+ { serverCommand: '', port: 3402, defaultCreditsPerCall: 1 },
489
+ undefined, undefined, undefined, undefined,
490
+ [
491
+ { prefix: 'fs', serverCommand: 'npx', serverArgs: ['@modelcontextprotocol/server-filesystem', '/tmp'] },
492
+ { prefix: 'api', remoteUrl: 'https://my-mcp-server.example.com/mcp' },
493
+ ]
494
+ );
495
+
496
+ // Client SDK
497
+ import { PayGateClient } from 'paygate-mcp/client';
498
+
499
+ const client = new PayGateClient({
500
+ url: `http://localhost:${port}`,
501
+ apiKey: 'pg_...',
502
+ });
503
+
504
+ const tools = await client.listTools();
505
+ const result = await client.callTool('search', { query: 'hello' });
340
506
  ```
341
507
 
342
508
  ## Security
@@ -353,7 +519,9 @@ const { port, adminKey } = await server.start();
353
519
  - Dashboard uses safe DOM methods (textContent/createElement) — no innerHTML
354
520
  - Webhook URLs masked in status output
355
521
  - Spending limits enforced with integer arithmetic (no float bypass)
356
- - Red-teamed with 84 adversarial security tests across 11 passes
522
+ - Per-tool ACL enforcement (whitelist + blacklist, sanitized inputs)
523
+ - Key expiry with fail-closed behavior (expired = denied)
524
+ - Red-teamed with 101 adversarial security tests across 14 passes
357
525
 
358
526
  ## Current Limitations
359
527
 
@@ -372,7 +540,12 @@ const { port, adminKey } = await server.start();
372
540
  - [x] Webhook events (`--webhook-url`)
373
541
  - [x] Refund on failure (`--refund-on-failure`)
374
542
  - [x] Config file mode (`--config`)
375
- - [ ] Multi-tenant mode
543
+ - [x] Per-tool ACL — whitelist/blacklist tools per key
544
+ - [x] Per-tool rate limits — independent limits per tool
545
+ - [x] Key expiry (TTL) — auto-expire API keys
546
+ - [x] Multi-server mode — wrap N MCP servers behind one PayGate
547
+ - [x] Client SDK — `PayGateClient` with auto 402 retry
548
+ - [ ] OAuth 2.1 — MCP spec mandates it for production
376
549
 
377
550
  ## Requirements
378
551
 
package/dist/cli.js CHANGED
@@ -76,6 +76,14 @@ function printUsage() {
76
76
  # Gate a remote MCP server (Streamable HTTP transport)
77
77
  paygate-mcp wrap --remote-url "https://my-server.example.com/mcp" --price 5
78
78
 
79
+ # Multi-server mode: wrap N servers behind one PayGate
80
+ paygate-mcp wrap --config multi-server.json
81
+ # Config file: { "servers": [
82
+ # { "prefix": "fs", "serverCommand": "npx", "serverArgs": ["@mcp/server-filesystem", "/tmp"] },
83
+ # { "prefix": "gh", "remoteUrl": "https://github-mcp.example.com/mcp" }
84
+ # ]}
85
+ # Tools become: "fs:read_file", "gh:search_repos", etc.
86
+
79
87
  # Custom pricing and rate limit
80
88
  paygate-mcp wrap --server "python my-server.py" --price 2 --rate-limit 30
81
89
 
@@ -114,13 +122,20 @@ async function main() {
114
122
  process.exit(1);
115
123
  }
116
124
  }
125
+ // Multi-server mode check
126
+ const multiServers = fileConfig.servers;
127
+ const isMultiServer = multiServers && multiServers.length > 0;
117
128
  const serverCmd = flags['server'] || (fileConfig.serverCommand ? [fileConfig.serverCommand, ...(fileConfig.serverArgs || [])].join(' ') : '');
118
129
  const remoteUrl = flags['remote-url'] || fileConfig.remoteUrl;
119
- if (!serverCmd && !remoteUrl) {
120
- console.error('Error: --server, --remote-url, or --config is required.\n');
130
+ if (!serverCmd && !remoteUrl && !isMultiServer) {
131
+ console.error('Error: --server, --remote-url, or --config (with servers[]) is required.\n');
121
132
  printUsage();
122
133
  process.exit(1);
123
134
  }
135
+ if (isMultiServer && (serverCmd || remoteUrl)) {
136
+ console.error('Error: use "servers" array OR --server/--remote-url, not both.\n');
137
+ process.exit(1);
138
+ }
124
139
  if (serverCmd && remoteUrl) {
125
140
  console.error('Error: use --server OR --remote-url, not both.\n');
126
141
  process.exit(1);
@@ -155,7 +170,7 @@ async function main() {
155
170
  toolPricing,
156
171
  webhookUrl,
157
172
  refundOnFailure: !!refundOnFailure,
158
- }, adminKey, stateFile, remoteUrl, stripeSecret);
173
+ }, adminKey, stateFile, remoteUrl, stripeSecret, multiServers);
159
174
  // Import keys from CLI flags
160
175
  if (flags['import-key']) {
161
176
  const pairs = flags['import-key'].split(',');
@@ -182,6 +197,18 @@ async function main() {
182
197
  process.on('SIGTERM', shutdown);
183
198
  try {
184
199
  const result = await server.start();
200
+ // Build backend display string
201
+ let backendDisplay;
202
+ if (isMultiServer) {
203
+ const prefixes = multiServers.map(s => s.prefix).join(', ');
204
+ backendDisplay = `multi (${multiServers.length}) → ${prefixes}`.slice(0, 35);
205
+ }
206
+ else if (remoteUrl) {
207
+ backendDisplay = ('HTTP → ' + remoteUrl.slice(0, 28));
208
+ }
209
+ else {
210
+ backendDisplay = ('stdio → ' + (serverCmd || serverCommand).slice(0, 27));
211
+ }
185
212
  console.log(`
186
213
  ╔══════════════════════════════════════════════════╗
187
214
  ║ PayGate MCP — Server Running ║
@@ -189,7 +216,7 @@ async function main() {
189
216
  ║ ║
190
217
  ║ Endpoint: http://localhost:${String(result.port).padEnd(5)} ║
191
218
  ║ Admin Key: ${result.adminKey.slice(0, 20)}... ║
192
- ║ Backend: ${(remoteUrl ? 'HTTP → ' + remoteUrl.slice(0, 28) : 'stdio → ' + (serverCmd || serverCommand).slice(0, 27)).padEnd(35)}║
219
+ ║ Backend: ${backendDisplay.padEnd(35)}║
193
220
  ║ ║
194
221
  ║ Pricing: ${String(price).padEnd(3)} credit(s) per tool call ║
195
222
  ║ Rate Limit: ${String(rateLimit).padEnd(3)} calls/min per key ║
@@ -208,6 +235,15 @@ async function main() {
208
235
  ║ POST /limits — Set spending limit (Admin) ║
209
236
  ╚══════════════════════════════════════════════════╝
210
237
  `);
238
+ // Show multi-server details
239
+ if (isMultiServer) {
240
+ console.log(' Multi-server backends:');
241
+ for (const s of multiServers) {
242
+ const transport = s.remoteUrl ? `HTTP → ${s.remoteUrl}` : `stdio → ${s.serverCommand} ${(s.serverArgs || []).join(' ')}`;
243
+ console.log(` ${s.prefix}: ${transport}`);
244
+ }
245
+ console.log('');
246
+ }
211
247
  console.log(` Admin key (save this): ${result.adminKey}\n`);
212
248
  }
213
249
  catch (error) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * PayGateClient — Client SDK for consuming PayGate-protected MCP servers.
3
+ *
4
+ * Features:
5
+ * - Auto 402 retry: when a tool call returns -32402 (payment required),
6
+ * the client can automatically call a top-up function and retry.
7
+ * - Balance tracking: monitors remaining credits locally.
8
+ * - Connection management: handles MCP Streamable HTTP transport.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { PayGateClient } from 'paygate-mcp/client';
13
+ *
14
+ * const client = new PayGateClient({
15
+ * url: 'http://localhost:3402',
16
+ * apiKey: 'pg_abc123...',
17
+ * });
18
+ *
19
+ * const tools = await client.listTools();
20
+ * const result = await client.callTool('search', { query: 'hello' });
21
+ * const balance = await client.getBalance();
22
+ * ```
23
+ */
24
+ export interface PayGateClientConfig {
25
+ /** PayGate server URL (e.g., "http://localhost:3402") */
26
+ url: string;
27
+ /** API key for authentication */
28
+ apiKey: string;
29
+ /** Request timeout in ms (default: 30000) */
30
+ timeout?: number;
31
+ /** Auto-retry on 402 (payment required). Calls onCreditsNeeded before retry.
32
+ * Default: false. */
33
+ autoRetry?: boolean;
34
+ /** Called when credits are needed (402 response). Return true if credits
35
+ * were added (e.g., via external top-up), false to abort. */
36
+ onCreditsNeeded?: (info: CreditsNeededInfo) => Promise<boolean>;
37
+ /** Max auto-retries per request (default: 1) */
38
+ maxRetries?: number;
39
+ }
40
+ export interface CreditsNeededInfo {
41
+ tool: string;
42
+ creditsRequired: number;
43
+ remainingCredits: number;
44
+ }
45
+ export interface ToolInfo {
46
+ name: string;
47
+ description?: string;
48
+ inputSchema?: Record<string, unknown>;
49
+ }
50
+ export interface ToolCallResult {
51
+ content: Array<{
52
+ type: string;
53
+ text?: string;
54
+ [k: string]: unknown;
55
+ }>;
56
+ isError?: boolean;
57
+ }
58
+ export interface BalanceInfo {
59
+ name: string;
60
+ credits: number;
61
+ totalSpent: number;
62
+ totalCalls: number;
63
+ spendingLimit: number;
64
+ remainingBudget: number | null;
65
+ lastUsedAt: string | null;
66
+ allowedTools: string[];
67
+ deniedTools: string[];
68
+ expiresAt: string | null;
69
+ }
70
+ export declare class PayGateClient {
71
+ private readonly baseUrl;
72
+ private readonly apiKey;
73
+ private readonly timeout;
74
+ private readonly autoRetry;
75
+ private readonly maxRetries;
76
+ private readonly onCreditsNeeded?;
77
+ private nextId;
78
+ private _lastBalance;
79
+ constructor(config: PayGateClientConfig);
80
+ /**
81
+ * List available tools from the gated MCP server.
82
+ */
83
+ listTools(): Promise<ToolInfo[]>;
84
+ /**
85
+ * Call a tool on the gated MCP server.
86
+ * If autoRetry is enabled and the server returns -32402 (payment required),
87
+ * the client will call onCreditsNeeded and retry.
88
+ */
89
+ callTool(name: string, args?: Record<string, unknown>): Promise<ToolCallResult>;
90
+ /**
91
+ * Get balance information for the current API key.
92
+ */
93
+ getBalance(): Promise<BalanceInfo>;
94
+ /**
95
+ * Send an initialize request to the MCP server.
96
+ */
97
+ initialize(): Promise<Record<string, unknown>>;
98
+ /**
99
+ * Ping the server.
100
+ */
101
+ ping(): Promise<boolean>;
102
+ /**
103
+ * Get the last known balance (from the last getBalance() call).
104
+ * Returns null if getBalance() hasn't been called yet.
105
+ */
106
+ get lastKnownBalance(): number | null;
107
+ private rpcCall;
108
+ private httpPost;
109
+ private httpGet;
110
+ }
111
+ export declare class PayGateError extends Error {
112
+ readonly code: number;
113
+ readonly data?: unknown;
114
+ constructor(code: number, message: string, data?: unknown);
115
+ get isPaymentRequired(): boolean;
116
+ get isRateLimited(): boolean;
117
+ get isExpired(): boolean;
118
+ }
119
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;0BACsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;kEAC8D;IAC9D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAWD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAgD;IACjF,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAuB;gBAE/B,MAAM,EAAE,mBAAmB;IASvC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAStC;;;;OAIG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAmCrF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAOxC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAYpD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B;;;OAGG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;YAIa,OAAO;IAiBrB,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,OAAO;CAqChB;AAID,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAOzD,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF"}