@spider-mesh/ws 2.0.42 → 2.0.44

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.
Files changed (74) hide show
  1. package/README.md +22 -6
  2. package/build/src/BaseWebsocketTransporter.d.ts +5 -2
  3. package/build/src/BaseWebsocketTransporter.js +25 -9
  4. package/build/src/BaseWebsocketTransporter.js.map +1 -1
  5. package/build/src/websocketProtocol.d.ts +2 -2
  6. package/build/tsconfig.tsbuildinfo +1 -1
  7. package/package.json +3 -3
  8. package/tsconfig.json +1 -0
  9. package/build/examples/helpers/createMesh.d.ts +0 -13
  10. package/build/examples/helpers/createMesh.js +0 -19
  11. package/build/examples/helpers/createMesh.js.map +0 -1
  12. package/build/examples/websocket-client.d.ts +0 -1
  13. package/build/examples/websocket-client.js +0 -17
  14. package/build/examples/websocket-client.js.map +0 -1
  15. package/build/examples/websocket-e2e-client.d.ts +0 -1
  16. package/build/examples/websocket-e2e-client.js +0 -36
  17. package/build/examples/websocket-e2e-client.js.map +0 -1
  18. package/build/examples/websocket-e2e-matrix-client.d.ts +0 -1
  19. package/build/examples/websocket-e2e-matrix-client.js +0 -66
  20. package/build/examples/websocket-e2e-matrix-client.js.map +0 -1
  21. package/build/examples/websocket-e2e-matrix-provider.d.ts +0 -1
  22. package/build/examples/websocket-e2e-matrix-provider.js +0 -41
  23. package/build/examples/websocket-e2e-matrix-provider.js.map +0 -1
  24. package/build/examples/websocket-e2e-matrix-test.d.ts +0 -1
  25. package/build/examples/websocket-e2e-matrix-test.js +0 -85
  26. package/build/examples/websocket-e2e-matrix-test.js.map +0 -1
  27. package/build/examples/websocket-e2e-provider.d.ts +0 -1
  28. package/build/examples/websocket-e2e-provider.js +0 -22
  29. package/build/examples/websocket-e2e-provider.js.map +0 -1
  30. package/build/examples/websocket-e2e-reverse-client.d.ts +0 -1
  31. package/build/examples/websocket-e2e-reverse-client.js +0 -21
  32. package/build/examples/websocket-e2e-reverse-client.js.map +0 -1
  33. package/build/examples/websocket-e2e-reverse-server.d.ts +0 -1
  34. package/build/examples/websocket-e2e-reverse-server.js +0 -36
  35. package/build/examples/websocket-e2e-reverse-server.js.map +0 -1
  36. package/build/examples/websocket-e2e-reverse-test.d.ts +0 -1
  37. package/build/examples/websocket-e2e-reverse-test.js +0 -85
  38. package/build/examples/websocket-e2e-reverse-test.js.map +0 -1
  39. package/build/examples/websocket-e2e-round-robin-client.d.ts +0 -1
  40. package/build/examples/websocket-e2e-round-robin-client.js +0 -41
  41. package/build/examples/websocket-e2e-round-robin-client.js.map +0 -1
  42. package/build/examples/websocket-e2e-round-robin-test.d.ts +0 -1
  43. package/build/examples/websocket-e2e-round-robin-test.js +0 -93
  44. package/build/examples/websocket-e2e-round-robin-test.js.map +0 -1
  45. package/build/examples/websocket-e2e-test.d.ts +0 -1
  46. package/build/examples/websocket-e2e-test.js +0 -85
  47. package/build/examples/websocket-e2e-test.js.map +0 -1
  48. package/build/examples/websocket-provider.d.ts +0 -1
  49. package/build/examples/websocket-provider.js +0 -20
  50. package/build/examples/websocket-provider.js.map +0 -1
  51. package/build/examples/websocket-server.d.ts +0 -1
  52. package/build/examples/websocket-server.js +0 -6
  53. package/build/examples/websocket-server.js.map +0 -1
  54. package/build/examples/websocket-smoke-test.d.ts +0 -1
  55. package/build/examples/websocket-smoke-test.js +0 -169
  56. package/build/examples/websocket-smoke-test.js.map +0 -1
  57. package/build/tests/helpers/runBunScript.d.ts +0 -6
  58. package/build/tests/helpers/runBunScript.js +0 -46
  59. package/build/tests/helpers/runBunScript.js.map +0 -1
  60. package/build/tests/websocket-spidermesh-matrix.e2e.test.d.ts +0 -1
  61. package/build/tests/websocket-spidermesh-matrix.e2e.test.js +0 -13
  62. package/build/tests/websocket-spidermesh-matrix.e2e.test.js.map +0 -1
  63. package/build/tests/websocket-spidermesh-reverse.e2e.test.d.ts +0 -1
  64. package/build/tests/websocket-spidermesh-reverse.e2e.test.js +0 -9
  65. package/build/tests/websocket-spidermesh-reverse.e2e.test.js.map +0 -1
  66. package/build/tests/websocket-spidermesh-round-robin.e2e.test.d.ts +0 -1
  67. package/build/tests/websocket-spidermesh-round-robin.e2e.test.js +0 -20
  68. package/build/tests/websocket-spidermesh-round-robin.e2e.test.js.map +0 -1
  69. package/build/tests/websocket-spidermesh.e2e.test.d.ts +0 -1
  70. package/build/tests/websocket-spidermesh.e2e.test.js +0 -9
  71. package/build/tests/websocket-spidermesh.e2e.test.js.map +0 -1
  72. package/build/tests/websocket-transporter.e2e.test.d.ts +0 -1
  73. package/build/tests/websocket-transporter.e2e.test.js +0 -9
  74. package/build/tests/websocket-transporter.e2e.test.js.map +0 -1
@@ -1,46 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- export async function runBunScript(args, timeoutMs = 15000, env = {}) {
3
- return await new Promise((resolve, reject) => {
4
- const child = spawn('bun', args, {
5
- cwd: new URL('../..', import.meta.url),
6
- env: {
7
- ...process.env,
8
- ...env,
9
- },
10
- stdio: ['ignore', 'pipe', 'pipe'],
11
- });
12
- const stdout = child.stdout;
13
- const stderr = child.stderr;
14
- if (!stdout || !stderr) {
15
- reject(new Error('Missing piped stdout/stderr from bun child process'));
16
- return;
17
- }
18
- let stdoutText = '';
19
- let stderrText = '';
20
- const cleanup = () => {
21
- clearTimeout(timer);
22
- stdout.off('data', onStdout);
23
- stderr.off('data', onStderr);
24
- child.off('exit', onExit);
25
- };
26
- const onStdout = (chunk) => {
27
- stdoutText += chunk.toString();
28
- };
29
- const onStderr = (chunk) => {
30
- stderrText += chunk.toString();
31
- };
32
- const onExit = (code) => {
33
- cleanup();
34
- resolve({ code, stdout: stdoutText, stderr: stderrText });
35
- };
36
- const timer = setTimeout(() => {
37
- cleanup();
38
- child.kill('SIGTERM');
39
- reject(new Error(`bun ${args.join(' ')} timed out after ${timeoutMs}ms\nstdout:\n${stdoutText}\nstderr:\n${stderrText}`));
40
- }, timeoutMs);
41
- stdout.on('data', onStdout);
42
- stderr.on('data', onStderr);
43
- child.on('exit', onExit);
44
- });
45
- }
46
- //# sourceMappingURL=runBunScript.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runBunScript.js","sourceRoot":"","sources":["../../../tests/helpers/runBunScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAQ1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,SAAS,GAAG,KAAK,EAAE,MAA8B,EAAE;IAClG,OAAO,MAAM,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACtC,GAAG,EAAE;gBACD,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,GAAG;aACT;YACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAA;YACvE,OAAM;QACV,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,UAAU,GAAG,EAAE,CAAA;QAEnB,MAAM,OAAO,GAAG,GAAG,EAAE;YACjB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC5B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC7B,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC,CAAA;QAED,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,EAAE;YACnC,OAAO,EAAE,CAAA;YACT,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;QAC7D,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,OAAO,EAAE,CAAA;YACT,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,SAAS,gBAAgB,UAAU,cAAc,UAAU,EAAE,CAAC,CAAC,CAAA;QAC7H,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC3B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,13 +0,0 @@
1
- import { expect, test } from 'bun:test';
2
- import { runBunScript } from './helpers/runBunScript.js';
3
- test('websocket spidermesh rpc matrix e2e', async () => {
4
- const result = await runBunScript(['run', 'examples/websocket-e2e-matrix-test.ts'], 25000);
5
- expect(result.code).toBe(0);
6
- expect(result.stderr).toBe('');
7
- expect(result.stdout).toContain('"syncValue":"sync:case-sync"');
8
- expect(result.stdout).toContain('"asyncValue":"async:case-async"');
9
- expect(result.stdout).toContain('"syncObservable":["sync-observable:case-sync-observable:1","sync-observable:case-sync-observable:2"]');
10
- expect(result.stdout).toContain('"asyncObservable":["async-observable:case-async-observable:1","async-observable:case-async-observable:2"]');
11
- expect(result.stdout).toContain('"errors":["sync-error","async-error","observable-error"]');
12
- });
13
- //# sourceMappingURL=websocket-spidermesh-matrix.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-spidermesh-matrix.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-matrix.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIxD,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,uCAAuC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE1F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;IAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;IAClE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sGAAsG,CAAC,CAAA;IACvI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2GAA2G,CAAC,CAAA;IAC5I,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0DAA0D,CAAC,CAAA;AAC/F,CAAC,CAAC,CAAA"}
@@ -1,9 +0,0 @@
1
- import { expect, test } from 'bun:test';
2
- import { runBunScript } from './helpers/runBunScript.js';
3
- test('websocket spidermesh reverse rpc e2e', async () => {
4
- const result = await runBunScript(['run', 'examples/websocket-e2e-reverse-test.ts'], 20000);
5
- expect(result.code).toBe(0);
6
- expect(result.stderr).toBe('');
7
- expect(result.stdout).toContain('hello from server from client');
8
- });
9
- //# sourceMappingURL=websocket-spidermesh-reverse.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-spidermesh-reverse.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-reverse.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,wCAAwC,CAAC,EAAE,KAAK,CAAC,CAAA;IAE3F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAA;AACpE,CAAC,CAAC,CAAA"}
@@ -1,20 +0,0 @@
1
- import { expect, setDefaultTimeout, test } from 'bun:test';
2
- import { runBunScript } from './helpers/runBunScript.js';
3
- setDefaultTimeout(30000);
4
- test('websocket spidermesh round-robin e2e', async () => {
5
- const result = await runBunScript(['run', 'examples/websocket-e2e-round-robin-test.ts'], 25000);
6
- expect(result.code).toBe(0);
7
- expect(result.stderr).toBe('');
8
- const jsonLine = result.stdout.split('\n').find(line => line.includes('"results":['));
9
- expect(jsonLine).toBeDefined();
10
- const payload = JSON.parse(jsonLine);
11
- const providers = payload.results.map(result => result.split(' from ')[1]);
12
- expect(payload.results).toHaveLength(4);
13
- expect(new Set(providers).size).toBe(2);
14
- expect(providers[0]).toContain('provider-');
15
- expect(providers[1]).toContain('provider-');
16
- expect(providers[0]).not.toBe(providers[1]);
17
- expect(providers[0]).toBe(providers[2]);
18
- expect(providers[1]).toBe(providers[3]);
19
- });
20
- //# sourceMappingURL=websocket-spidermesh-round-robin.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-spidermesh-round-robin.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh-round-robin.e2e.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,iBAAiB,CAAC,KAAK,CAAC,CAAA;AAExB,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;IACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,4CAA4C,CAAC,EAAE,KAAK,CAAC,CAAA;IAE/F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;IACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAS,CAA0B,CAAA;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAE1E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,9 +0,0 @@
1
- import { expect, test } from 'bun:test';
2
- import { runBunScript } from './helpers/runBunScript.js';
3
- test('websocket spidermesh rpc e2e', async () => {
4
- const result = await runBunScript(['run', 'examples/websocket-e2e-test.ts'], 20000);
5
- expect(result.code).toBe(0);
6
- expect(result.stderr).toBe('');
7
- expect(result.stdout).toContain('hello websocket e2e from provider');
8
- });
9
- //# sourceMappingURL=websocket-spidermesh.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-spidermesh.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-spidermesh.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,gCAAgC,CAAC,EAAE,KAAK,CAAC,CAAA;IAEnF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,9 +0,0 @@
1
- import { expect, test } from 'bun:test';
2
- import { runBunScript } from './helpers/runBunScript.js';
3
- test('websocket transporter e2e', async () => {
4
- const result = await runBunScript(['run', 'examples/websocket-smoke-test.ts'], 20000);
5
- expect(result.code).toBe(0);
6
- expect(result.stderr).toBe('');
7
- expect(result.stdout).toContain('WebSocket binary smoke test passed');
8
- });
9
- //# sourceMappingURL=websocket-transporter.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-transporter.e2e.test.js","sourceRoot":"","sources":["../../tests/websocket-transporter.e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,KAAK,EAAE,kCAAkC,CAAC,EAAE,KAAK,CAAC,CAAA;IAErF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;AACzE,CAAC,CAAC,CAAA"}