@peac/adapter-openclaw 0.10.7

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.
@@ -0,0 +1,213 @@
1
+ /**
2
+ * @peac/adapter-openclaw - Plugin Entry Point
3
+ *
4
+ * OpenClaw plugin types and utilities for PEAC receipts.
5
+ * This module provides types and factory functions for OpenClaw integration.
6
+ *
7
+ * Note: Full plugin activation requires OpenClaw's plugin runtime.
8
+ * The types and utilities here allow building custom integrations.
9
+ */
10
+ import type { CaptureSession, SpoolStore, DedupeIndex } from '@peac/capture-core';
11
+ import type { OpenClawAdapterConfig } from './types.js';
12
+ import { type OpenClawHookHandler } from './hooks.js';
13
+ import { type Signer, type ReceiptWriter, type BackgroundEmitterService } from './emitter.js';
14
+ /**
15
+ * JSON Web Key structure for signing keys (Ed25519).
16
+ */
17
+ export interface JWK {
18
+ kty: string;
19
+ crv?: string;
20
+ x?: string;
21
+ d?: string;
22
+ kid?: string;
23
+ alg?: string;
24
+ use?: string;
25
+ }
26
+ /**
27
+ * Plugin configuration from openclaw.plugin.json configSchema.
28
+ *
29
+ * @experimental This interface is experimental and may change.
30
+ */
31
+ export interface PluginConfig {
32
+ enabled?: boolean;
33
+ output_dir?: string;
34
+ capture?: {
35
+ mode?: 'hash_only' | 'allowlist';
36
+ allowlist?: string[];
37
+ max_payload_size?: number;
38
+ };
39
+ signing: {
40
+ key_ref: string;
41
+ issuer: string;
42
+ audience?: string;
43
+ };
44
+ correlation?: {
45
+ include_workflow?: boolean;
46
+ };
47
+ background?: {
48
+ drain_interval_ms?: number;
49
+ batch_size?: number;
50
+ };
51
+ }
52
+ /**
53
+ * OpenClaw plugin context provided by the runtime.
54
+ */
55
+ export interface PluginContext {
56
+ /** Plugin configuration from gateway config */
57
+ config: PluginConfig;
58
+ /** Agent workspace directory */
59
+ workspaceDir: string;
60
+ /** Logger instance */
61
+ logger: PluginLogger;
62
+ /** Register a tool call hook */
63
+ onToolCall: (handler: ToolCallHandler) => void;
64
+ /** Register a tool result hook */
65
+ onToolResult: (handler: ToolResultHandler) => void;
66
+ /** Register tools */
67
+ registerTools: (tools: PluginTool[]) => void;
68
+ }
69
+ /**
70
+ * Plugin logger interface.
71
+ */
72
+ export interface PluginLogger {
73
+ debug: (message: string, ...args: unknown[]) => void;
74
+ info: (message: string, ...args: unknown[]) => void;
75
+ warn: (message: string, ...args: unknown[]) => void;
76
+ error: (message: string, ...args: unknown[]) => void;
77
+ }
78
+ /**
79
+ * Tool call event from OpenClaw.
80
+ */
81
+ export interface ToolCallEvent {
82
+ tool_call_id: string;
83
+ run_id: string;
84
+ session_key?: string;
85
+ tool_name: string;
86
+ tool_provider?: string;
87
+ input: unknown;
88
+ started_at: string;
89
+ }
90
+ /**
91
+ * Tool result event from OpenClaw.
92
+ */
93
+ export interface ToolResultEvent {
94
+ tool_call_id: string;
95
+ run_id: string;
96
+ session_key?: string;
97
+ tool_name: string;
98
+ output: unknown;
99
+ completed_at: string;
100
+ status: 'ok' | 'error' | 'timeout' | 'canceled';
101
+ error_code?: string;
102
+ }
103
+ /**
104
+ * Tool call handler function.
105
+ */
106
+ export type ToolCallHandler = (event: ToolCallEvent) => void | Promise<void>;
107
+ /**
108
+ * Tool result handler function.
109
+ */
110
+ export type ToolResultHandler = (event: ToolResultEvent) => void | Promise<void>;
111
+ /**
112
+ * Plugin tool definition.
113
+ */
114
+ export interface PluginTool {
115
+ name: string;
116
+ description: string;
117
+ parameters?: Record<string, unknown>;
118
+ execute: (params: Record<string, unknown>) => Promise<unknown>;
119
+ }
120
+ /**
121
+ * Create a signer from a JWK private key.
122
+ *
123
+ * @param jwk - Ed25519 private key in JWK format
124
+ * @param issuer - Issuer URI for receipts
125
+ * @param audience - Optional audience URI
126
+ * @returns Signer instance
127
+ */
128
+ export declare function createJwkSigner(jwk: JWK, issuer: string, audience?: string): Signer;
129
+ /**
130
+ * Resolve a signer from a key reference string.
131
+ *
132
+ * Supported formats:
133
+ * - env:VAR_NAME - Load key from environment variable
134
+ * - file:/path - Load from file (development only)
135
+ *
136
+ * @param keyRef - Key reference string
137
+ * @param issuer - Issuer URI
138
+ * @param audience - Optional audience URI
139
+ * @returns Promise resolving to Signer
140
+ */
141
+ export declare function resolveSigner(keyRef: string, issuer: string, audience?: string): Promise<Signer>;
142
+ /**
143
+ * Generate a key ID from a JWK by hashing its public components.
144
+ */
145
+ export declare function generateKeyId(jwk: JWK): string;
146
+ /**
147
+ * Create a file system receipt writer with atomic writes.
148
+ *
149
+ * Writes are atomic: write to .tmp, fsync, rename. This ensures
150
+ * partially written files are never observable.
151
+ *
152
+ * @param outputDir - Directory for receipt files
153
+ * @returns Promise resolving to ReceiptWriter
154
+ */
155
+ export declare function createFileReceiptWriter(outputDir: string): Promise<ReceiptWriter>;
156
+ /**
157
+ * Plugin instance state.
158
+ */
159
+ export interface PluginInstance {
160
+ /** Capture session */
161
+ session: CaptureSession;
162
+ /** Hook handler for tool calls */
163
+ hookHandler: OpenClawHookHandler;
164
+ /** Background emitter service */
165
+ backgroundService: BackgroundEmitterService;
166
+ /** Start the plugin */
167
+ start(): void;
168
+ /** Stop the plugin */
169
+ stop(): Promise<void>;
170
+ /** Get plugin stats */
171
+ getStats(): PluginStats;
172
+ }
173
+ /**
174
+ * Plugin statistics.
175
+ */
176
+ export interface PluginStats {
177
+ totalCaptured: number;
178
+ duplicatesSkipped: number;
179
+ pendingCount: number;
180
+ totalEmitted: number;
181
+ totalErrors: number;
182
+ keyId: string;
183
+ isRunning: boolean;
184
+ }
185
+ /**
186
+ * Options for creating a plugin instance.
187
+ */
188
+ export interface CreatePluginOptions {
189
+ /** Signer for receipts */
190
+ signer: Signer;
191
+ /** Receipt writer */
192
+ writer: ReceiptWriter;
193
+ /** Adapter configuration */
194
+ adapterConfig?: OpenClawAdapterConfig;
195
+ /** Spool store implementation (required) */
196
+ store: SpoolStore;
197
+ /** Dedupe index implementation (required) */
198
+ dedupe: DedupeIndex;
199
+ /** Background drain interval in ms (default: 1000) */
200
+ drainIntervalMs?: number;
201
+ /** Batch size for draining (default: 100) */
202
+ batchSize?: number;
203
+ /** Error callback */
204
+ onError?: (error: Error) => void;
205
+ }
206
+ /**
207
+ * Create a plugin instance.
208
+ *
209
+ * @param options - Plugin options
210
+ * @returns Plugin instance
211
+ */
212
+ export declare function createPluginInstance(options: CreatePluginOptions): Promise<PluginInstance>;
213
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/plugin.js ADDED
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ /**
3
+ * @peac/adapter-openclaw - Plugin Entry Point
4
+ *
5
+ * OpenClaw plugin types and utilities for PEAC receipts.
6
+ * This module provides types and factory functions for OpenClaw integration.
7
+ *
8
+ * Note: Full plugin activation requires OpenClaw's plugin runtime.
9
+ * The types and utilities here allow building custom integrations.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.createJwkSigner = createJwkSigner;
46
+ exports.resolveSigner = resolveSigner;
47
+ exports.generateKeyId = generateKeyId;
48
+ exports.createFileReceiptWriter = createFileReceiptWriter;
49
+ exports.createPluginInstance = createPluginInstance;
50
+ const capture_core_1 = require("@peac/capture-core");
51
+ const crypto_1 = require("@peac/crypto");
52
+ const hooks_js_1 = require("./hooks.js");
53
+ const emitter_js_1 = require("./emitter.js");
54
+ // =============================================================================
55
+ // Signer Creation
56
+ // =============================================================================
57
+ /**
58
+ * Create a signer from a JWK private key.
59
+ *
60
+ * @param jwk - Ed25519 private key in JWK format
61
+ * @param issuer - Issuer URI for receipts
62
+ * @param audience - Optional audience URI
63
+ * @returns Signer instance
64
+ */
65
+ function createJwkSigner(jwk, issuer, audience) {
66
+ const kid = jwk.kid || generateKeyId(jwk);
67
+ // Extract the private key bytes from JWK
68
+ if (!jwk.d) {
69
+ throw new Error('JWK must include private key (d parameter)');
70
+ }
71
+ // Decode base64url to get raw key bytes
72
+ const privateKeyBytes = (0, crypto_1.base64urlDecode)(jwk.d);
73
+ return {
74
+ async sign(payload) {
75
+ return (0, crypto_1.sign)(payload, privateKeyBytes, kid);
76
+ },
77
+ getKeyId() {
78
+ return kid;
79
+ },
80
+ getIssuer() {
81
+ return issuer;
82
+ },
83
+ getAudience() {
84
+ return audience;
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * Resolve a signer from a key reference string.
90
+ *
91
+ * Supported formats:
92
+ * - env:VAR_NAME - Load key from environment variable
93
+ * - file:/path - Load from file (development only)
94
+ *
95
+ * @param keyRef - Key reference string
96
+ * @param issuer - Issuer URI
97
+ * @param audience - Optional audience URI
98
+ * @returns Promise resolving to Signer
99
+ */
100
+ async function resolveSigner(keyRef, issuer, audience) {
101
+ const colonIndex = keyRef.indexOf(':');
102
+ if (colonIndex === -1) {
103
+ throw new Error(`Invalid key reference format: ${keyRef}. Expected scheme:value`);
104
+ }
105
+ const scheme = keyRef.slice(0, colonIndex);
106
+ const value = keyRef.slice(colonIndex + 1);
107
+ switch (scheme) {
108
+ case 'env': {
109
+ const keyData = process.env[value];
110
+ if (!keyData) {
111
+ throw new Error(`Environment variable ${value} not set for signing key`);
112
+ }
113
+ const jwk = JSON.parse(keyData);
114
+ return createJwkSigner(jwk, issuer, audience);
115
+ }
116
+ case 'file': {
117
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
118
+ const keyData = await fs.promises.readFile(value, 'utf-8');
119
+ const jwk = JSON.parse(keyData);
120
+ return createJwkSigner(jwk, issuer, audience);
121
+ }
122
+ case 'keychain':
123
+ throw new Error('Keychain signing not yet implemented. Use env: for development.');
124
+ case 'sidecar':
125
+ throw new Error('Sidecar signing not yet implemented. Use env: for development.');
126
+ default:
127
+ throw new Error(`Unknown key reference scheme: ${scheme}. Use env: or file:`);
128
+ }
129
+ }
130
+ /**
131
+ * Generate a key ID from a JWK by hashing its public components.
132
+ */
133
+ function generateKeyId(jwk) {
134
+ const publicPart = jwk.x || '';
135
+ let hash = 0;
136
+ for (let i = 0; i < publicPart.length; i++) {
137
+ const char = publicPart.charCodeAt(i);
138
+ hash = (hash << 5) - hash + char;
139
+ hash = hash & hash;
140
+ }
141
+ return `k_${Math.abs(hash).toString(16).padStart(8, '0')}`;
142
+ }
143
+ // =============================================================================
144
+ // Receipt Writer
145
+ // =============================================================================
146
+ /**
147
+ * Create a file system receipt writer with atomic writes.
148
+ *
149
+ * Writes are atomic: write to .tmp, fsync, rename. This ensures
150
+ * partially written files are never observable.
151
+ *
152
+ * @param outputDir - Directory for receipt files
153
+ * @returns Promise resolving to ReceiptWriter
154
+ */
155
+ async function createFileReceiptWriter(outputDir) {
156
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
157
+ const pathModule = await Promise.resolve().then(() => __importStar(require('path')));
158
+ // Use path.resolve for portability
159
+ const resolvedOutputDir = pathModule.resolve(outputDir);
160
+ // Ensure directory exists
161
+ await fs.promises.mkdir(resolvedOutputDir, { recursive: true });
162
+ return {
163
+ async write(receipt) {
164
+ const filename = `${receipt.rid}.peac.json`;
165
+ const filepath = pathModule.join(resolvedOutputDir, filename);
166
+ const tempPath = `${filepath}.tmp`;
167
+ const content = JSON.stringify({
168
+ rid: receipt.rid,
169
+ interaction_id: receipt.interaction_id,
170
+ entry_digest: receipt.entry_digest,
171
+ _jws: receipt.jws,
172
+ }, null, 2);
173
+ // Atomic write: write to .tmp, fsync, rename, fsync dir
174
+ await fs.promises.writeFile(tempPath, content, 'utf-8');
175
+ // fsync file for durability (open, sync, close)
176
+ const fd = await fs.promises.open(tempPath, 'r');
177
+ await fd.sync();
178
+ await fd.close();
179
+ // Atomic rename (POSIX guarantees atomicity)
180
+ await fs.promises.rename(tempPath, filepath);
181
+ // fsync parent directory for full crash durability (POSIX best practice)
182
+ // This ensures the rename is persisted even on power loss
183
+ // Best-effort: may fail on some platforms (Windows, network FS)
184
+ try {
185
+ const dirFd = await fs.promises.open(resolvedOutputDir, 'r');
186
+ await dirFd.sync();
187
+ await dirFd.close();
188
+ }
189
+ catch {
190
+ // Directory fsync not supported on this platform - continue anyway
191
+ // Receipt is still atomic via rename, just not fully durable on power loss
192
+ }
193
+ return filepath;
194
+ },
195
+ async close() {
196
+ // No-op for file writer
197
+ },
198
+ };
199
+ }
200
+ /**
201
+ * Create a plugin instance.
202
+ *
203
+ * @param options - Plugin options
204
+ * @returns Plugin instance
205
+ */
206
+ async function createPluginInstance(options) {
207
+ const { signer, writer, adapterConfig, store, dedupe, drainIntervalMs = 1000, batchSize = 100, onError, } = options;
208
+ // Create hasher
209
+ const hasher = await (0, capture_core_1.createHasher)();
210
+ // Create capture session
211
+ const session = (0, capture_core_1.createCaptureSession)({
212
+ store,
213
+ dedupe,
214
+ hasher,
215
+ });
216
+ // Track stats
217
+ const stats = {
218
+ totalCaptured: 0,
219
+ duplicatesSkipped: 0,
220
+ pendingCount: 0,
221
+ totalEmitted: 0,
222
+ totalErrors: 0,
223
+ keyId: signer.getKeyId(),
224
+ isRunning: false,
225
+ };
226
+ // Create hook handler
227
+ const hookHandler = (0, hooks_js_1.createHookHandler)({
228
+ session,
229
+ config: adapterConfig,
230
+ onCapture: (result) => {
231
+ if (result.success) {
232
+ stats.totalCaptured++;
233
+ stats.pendingCount++;
234
+ }
235
+ else {
236
+ stats.duplicatesSkipped++;
237
+ }
238
+ },
239
+ });
240
+ // Create receipt emitter
241
+ const emitter = (0, emitter_js_1.createReceiptEmitter)({
242
+ signer,
243
+ writer,
244
+ onEmit: (result) => {
245
+ if (result.success) {
246
+ stats.totalEmitted++;
247
+ stats.pendingCount = Math.max(0, stats.pendingCount - 1);
248
+ }
249
+ },
250
+ onError: (error) => {
251
+ stats.totalErrors++;
252
+ if (onError)
253
+ onError(error);
254
+ },
255
+ });
256
+ // Track last emitted sequence for cursor-based emission
257
+ // This is the in-memory cursor; on restart, we rebuild from dedupe index
258
+ let lastEmittedSequence = 0;
259
+ // Mutex to prevent overlapping drain cycles
260
+ let drainInProgress = false;
261
+ // Create background service with proper cursor tracking
262
+ // Note: For full restart safety, the dedupe index should be persistent.
263
+ // The getPendingEntries filters out already-emitted entries using the dedupe index.
264
+ const backgroundService = (0, emitter_js_1.createBackgroundService)({
265
+ emitter,
266
+ drainIntervalMs,
267
+ getPendingEntries: async () => {
268
+ // Prevent overlapping drain cycles
269
+ if (drainInProgress)
270
+ return [];
271
+ drainInProgress = true;
272
+ try {
273
+ // Read entries after the last emitted sequence
274
+ const currentSequence = await store.getSequence();
275
+ if (currentSequence <= lastEmittedSequence)
276
+ return [];
277
+ // Read from cursor position
278
+ const entries = await store.read(lastEmittedSequence, batchSize);
279
+ // Filter out entries that are already emitted (restart safety)
280
+ // This uses the persistent dedupe index as source of truth
281
+ const pending = [];
282
+ for (const entry of entries) {
283
+ if (entry.sequence <= lastEmittedSequence)
284
+ continue;
285
+ // Check if already emitted in dedupe index
286
+ const dedupeEntry = await dedupe.get(entry.action.id);
287
+ if (dedupeEntry?.emitted)
288
+ continue;
289
+ pending.push(entry);
290
+ }
291
+ return pending;
292
+ }
293
+ finally {
294
+ drainInProgress = false;
295
+ }
296
+ },
297
+ markEmitted: async (digest) => {
298
+ // Find the entry with this digest and update cursor
299
+ const entries = await store.read(lastEmittedSequence, batchSize);
300
+ const entry = entries.find((e) => e.entry_digest === digest);
301
+ if (entry) {
302
+ // Update in-memory cursor
303
+ if (entry.sequence > lastEmittedSequence) {
304
+ lastEmittedSequence = entry.sequence;
305
+ }
306
+ // Mark in persistent dedupe index (restart-safe)
307
+ await dedupe.markEmitted(entry.action.id);
308
+ }
309
+ },
310
+ onError,
311
+ });
312
+ return {
313
+ session,
314
+ hookHandler,
315
+ backgroundService,
316
+ start() {
317
+ stats.isRunning = true;
318
+ backgroundService.start();
319
+ },
320
+ async stop() {
321
+ backgroundService.stop();
322
+ await backgroundService.drain();
323
+ await hookHandler.close();
324
+ stats.isRunning = false;
325
+ },
326
+ getStats() {
327
+ return { ...stats };
328
+ },
329
+ };
330
+ }
331
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @peac/adapter-openclaw - Plugin Tools
3
+ *
4
+ * Tools exposed by the PEAC receipts plugin for OpenClaw.
5
+ *
6
+ * @experimental This module is experimental and may change.
7
+ */
8
+ import type { PluginTool, PluginLogger } from './plugin.js';
9
+ /**
10
+ * Plugin stats interface matching plugin.ts PluginStats.
11
+ */
12
+ interface PluginStats {
13
+ totalCaptured: number;
14
+ duplicatesSkipped: number;
15
+ pendingCount: number;
16
+ totalEmitted: number;
17
+ totalErrors: number;
18
+ keyId: string;
19
+ isRunning: boolean;
20
+ }
21
+ /**
22
+ * Create the peac_receipts.status tool.
23
+ * Shows spool size, last receipt time, and config summary.
24
+ */
25
+ export declare function createStatusTool(stats: PluginStats, outputDir: string): PluginTool;
26
+ /**
27
+ * Create the peac_receipts.export_bundle tool.
28
+ * Exports receipts as a bundle directory for audit.
29
+ *
30
+ * Note: Creates a directory structure, not a ZIP archive.
31
+ * Use @peac/audit createDisputeBundle for production ZIP bundles.
32
+ */
33
+ export declare function createExportBundleTool(outputDir: string, logger: PluginLogger): PluginTool;
34
+ /**
35
+ * Create the peac_receipts.verify tool.
36
+ * Verifies a receipt or bundle offline.
37
+ */
38
+ export declare function createVerifyTool(logger: PluginLogger): PluginTool;
39
+ /**
40
+ * Create the peac_receipts.query tool.
41
+ * Query receipts by workflow_id, tool name, or time range.
42
+ */
43
+ export declare function createQueryTool(outputDir: string, logger: PluginLogger): PluginTool;
44
+ export {};
45
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiC5D;;GAEG;AACH,UAAU,WAAW;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAoElF;AA4BD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CA2J1F;AAoBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAmDjE;AA6RD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,UAAU,CAoNnF"}