@metamask/connect-multichain 0.3.1 → 0.4.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +35 -13
  2. package/README.md +1 -1
  3. package/dist/browser/es/connect-multichain.d.mts +4 -6
  4. package/dist/browser/es/connect-multichain.mjs +593 -588
  5. package/dist/browser/es/connect-multichain.mjs.map +1 -1
  6. package/dist/browser/es/metafile-esm.json +1 -1
  7. package/dist/browser/iife/connect-multichain.d.ts +4 -6
  8. package/dist/browser/iife/connect-multichain.js +3821 -2109
  9. package/dist/browser/iife/connect-multichain.js.map +1 -1
  10. package/dist/browser/iife/metafile-iife.json +1 -1
  11. package/dist/browser/umd/connect-multichain.d.ts +4 -6
  12. package/dist/browser/umd/connect-multichain.js +593 -588
  13. package/dist/browser/umd/connect-multichain.js.map +1 -1
  14. package/dist/browser/umd/metafile-cjs.json +1 -1
  15. package/dist/node/cjs/connect-multichain.d.ts +4 -6
  16. package/dist/node/cjs/connect-multichain.js +594 -600
  17. package/dist/node/cjs/connect-multichain.js.map +1 -1
  18. package/dist/node/cjs/metafile-cjs.json +1 -1
  19. package/dist/node/es/connect-multichain.d.mts +4 -6
  20. package/dist/node/es/connect-multichain.mjs +593 -599
  21. package/dist/node/es/connect-multichain.mjs.map +1 -1
  22. package/dist/node/es/metafile-esm.json +1 -1
  23. package/dist/react-native/es/connect-multichain.d.mts +4 -6
  24. package/dist/react-native/es/connect-multichain.mjs +580 -584
  25. package/dist/react-native/es/connect-multichain.mjs.map +1 -1
  26. package/dist/react-native/es/metafile-esm.json +1 -1
  27. package/dist/src/domain/multichain/types.d.ts +2 -4
  28. package/dist/src/domain/multichain/types.d.ts.map +1 -1
  29. package/dist/src/multichain/index.d.ts +3 -22
  30. package/dist/src/multichain/index.d.ts.map +1 -1
  31. package/dist/src/multichain/index.js +422 -424
  32. package/dist/src/multichain/index.js.map +1 -1
  33. package/dist/src/multichain/rpc/requestRouter.js +17 -19
  34. package/dist/src/multichain/rpc/requestRouter.js.map +1 -1
  35. package/dist/src/multichain/transports/default/index.d.ts +2 -0
  36. package/dist/src/multichain/transports/default/index.d.ts.map +1 -1
  37. package/dist/src/multichain/transports/default/index.js +6 -0
  38. package/dist/src/multichain/transports/default/index.js.map +1 -1
  39. package/dist/src/multichain/transports/mwp/index.d.ts +2 -1
  40. package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -1
  41. package/dist/src/multichain/transports/mwp/index.js +41 -16
  42. package/dist/src/multichain/transports/mwp/index.js.map +1 -1
  43. package/dist/src/ui/index.d.ts +2 -6
  44. package/dist/src/ui/index.d.ts.map +1 -1
  45. package/dist/src/ui/index.js +8 -49
  46. package/dist/src/ui/index.js.map +1 -1
  47. package/dist/src/ui/modals/node/install.js +2 -2
  48. package/dist/src/ui/modals/node/install.js.map +1 -1
  49. package/dist/src/ui/preload.native.d.ts +5 -0
  50. package/dist/src/ui/preload.native.d.ts.map +1 -0
  51. package/dist/src/ui/preload.native.js +18 -0
  52. package/dist/src/ui/preload.native.js.map +1 -0
  53. package/dist/src/ui/preload.web.d.ts +5 -0
  54. package/dist/src/ui/preload.web.d.ts.map +1 -0
  55. package/dist/src/ui/{qr.js → preload.web.js} +13 -18
  56. package/dist/src/ui/preload.web.js.map +1 -0
  57. package/dist/types/connect-multichain.d.ts +4 -6
  58. package/package.json +7 -7
  59. package/dist/src/ui/qr.d.ts +0 -3
  60. package/dist/src/ui/qr.d.ts.map +0 -1
  61. package/dist/src/ui/qr.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
2
2
  /* eslint-disable no-restricted-syntax */
3
3
  import { createLogger, } from '../../../domain';
4
- import { encodeQRSync } from '../../qr';
4
+ import encodeQR from '@paulmillr/qr';
5
5
  import { AbstractInstallModal } from '../base/AbstractInstallModal';
6
6
  import { formatRemainingTime, shouldLogCountdown } from '../base/utils';
7
7
  const logger = createLogger('metamask-sdk:ui');
@@ -9,7 +9,7 @@ export class InstallModal extends AbstractInstallModal {
9
9
  displayQRWithCountdown(qrCodeLink, expiresInMs) {
10
10
  const isExpired = expiresInMs <= 0;
11
11
  const formattedTime = formatRemainingTime(expiresInMs);
12
- const qrCode = encodeQRSync(qrCodeLink);
12
+ const qrCode = encodeQR(qrCodeLink, 'ascii');
13
13
  // Clear console and display QR code with live countdown
14
14
  console.clear();
15
15
  console.log(qrCode);
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../../../src/ui/modals/node/install.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,yCAAyC;AACzC,OAAO,EAEL,YAAY,GAEb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,YAAa,SAAQ,oBAAoB;IAC5C,sBAAsB,CAAC,UAAkB,EAAE,WAAmB;QACpE,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAExC,wDAAwD;QACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,iBAAoC;QAC7D,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,CAAC;QAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QAE7C,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE7C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CACJ,mDAAmD,aAAa,KAAK,SAAS,KAAK,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../../../src/ui/modals/node/install.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,yCAAyC;AACzC,OAAO,EAEL,YAAY,GAEb,MAAM,iBAAiB,CAAC;AACzB,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,YAAa,SAAQ,oBAAoB;IAC5C,sBAAsB,CAAC,UAAkB,EAAE,WAAmB;QACpE,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE7C,wDAAwD;QACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,iBAAoC;QAC7D,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,CAAC;QAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;QAE7C,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE7C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CACJ,mDAAmD,aAAa,KAAK,SAAS,KAAK,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * React Native preload - no-op since Stencil web components are not used
3
+ */
4
+ export declare function preload(): Promise<void>;
5
+ //# sourceMappingURL=preload.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.native.d.ts","sourceRoot":"","sources":["../../../src/ui/preload.native.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C"}
@@ -0,0 +1,18 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /**
11
+ * React Native preload - no-op since Stencil web components are not used
12
+ */
13
+ export function preload() {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ // No-op for React Native - web components are not applicable
16
+ });
17
+ }
18
+ //# sourceMappingURL=preload.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.native.js","sourceRoot":"","sources":["../../../src/ui/preload.native.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,MAAM,UAAgB,OAAO;;QAC3B,6DAA6D;IAC/D,CAAC;CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Web-specific preload that loads Stencil custom elements
3
+ */
4
+ export declare function preload(): Promise<void>;
5
+ //# sourceMappingURL=preload.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.web.d.ts","sourceRoot":"","sources":["../../../src/ui/preload.web.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7C"}
@@ -1,9 +1,3 @@
1
- /* eslint-disable require-atomic-updates */
2
- /* eslint-disable jsdoc/require-jsdoc */
3
- /*
4
- QR adapter that hides ESM import details and exposes a sync API.
5
- Consumers must call preloadQR() once before first use.
6
- */
7
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -13,20 +7,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
13
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
14
8
  });
15
9
  };
16
- let encodeQRImpl = null;
17
- export function preloadQR() {
10
+ /**
11
+ * Web-specific preload that loads Stencil custom elements
12
+ */
13
+ export function preload() {
18
14
  return __awaiter(this, void 0, void 0, function* () {
19
- if (encodeQRImpl) {
15
+ if (typeof document === 'undefined') {
20
16
  return;
21
17
  }
22
- const mod = (yield import('@paulmillr/qr'));
23
- encodeQRImpl = mod.default;
18
+ try {
19
+ const { defineCustomElements } = yield import('@metamask/multichain-ui/loader');
20
+ yield defineCustomElements();
21
+ }
22
+ catch (error) {
23
+ console.error('Failed to load customElements:', error);
24
+ }
24
25
  });
25
26
  }
26
- export function encodeQRSync(input) {
27
- if (!encodeQRImpl) {
28
- throw new Error('QR module not preloaded. Call preloadQR() first.');
29
- }
30
- return encodeQRImpl(input, 'ascii');
31
- }
32
- //# sourceMappingURL=qr.js.map
27
+ //# sourceMappingURL=preload.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.web.js","sourceRoot":"","sources":["../../../src/ui/preload.web.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,MAAM,UAAgB,OAAO;;QAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3C,gCAAgC,CACjC,CAAC;YACF,MAAM,oBAAoB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CAAA"}
@@ -2,7 +2,7 @@ import debug from 'debug';
2
2
  import { SessionData, Transport, TransportRequest, TransportResponse, MultichainApiClient } from '@metamask/multichain-api-client';
3
3
  export { SessionData } from '@metamask/multichain-api-client';
4
4
  import { CaipAccountId, Json } from '@metamask/utils';
5
- import { SessionRequest } from '@metamask/mobile-wallet-protocol-core';
5
+ import { SessionRequest, Session } from '@metamask/mobile-wallet-protocol-core';
6
6
  import { Components } from '@metamask/multichain-ui';
7
7
 
8
8
  type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
@@ -326,8 +326,8 @@ declare class ModalFactory<T extends FactoryModals = FactoryModals> {
326
326
  get isWeb(): boolean;
327
327
  private getContainer;
328
328
  private getMountedContainer;
329
- createDeeplink(connectionRequest?: ConnectionRequest): string;
330
- createUniversalLink(connectionRequest?: ConnectionRequest): string;
329
+ createConnectionDeeplink(connectionRequest?: ConnectionRequest): string;
330
+ createConnectionUniversalLink(connectionRequest?: ConnectionRequest): string;
331
331
  private onCloseModal;
332
332
  private onStartDesktopOnboarding;
333
333
  renderInstallModal(showInstallModal: boolean, createConnectionRequest: () => Promise<ConnectionRequest>, successCallback: (error?: Error) => Promise<void>): Promise<void>;
@@ -393,9 +393,6 @@ type MultichainOptions = {
393
393
  };
394
394
  /** Analytics configuration */
395
395
  analytics?: {
396
- enabled: false;
397
- } | {
398
- enabled: true;
399
396
  integrationType: string;
400
397
  };
401
398
  /** Storage client for persisting SDK data */
@@ -444,6 +441,7 @@ type ExtendedTransport = Omit<Transport, 'connect'> & {
444
441
  sendEip1193Message: <TRequest extends TransportRequest, TResponse extends TransportResponse>(request: TRequest, options?: {
445
442
  timeout?: number;
446
443
  }) => Promise<TResponse>;
444
+ getActiveSession: () => Promise<Session | undefined>;
447
445
  };
448
446
 
449
447
  declare const infuraRpcUrls: RpcUrlsMap;
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@metamask/connect-multichain",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Multichain package for MetaMask Connect",
5
5
  "keywords": [
6
6
  "MetaMask",
7
7
  "Ethereum"
8
8
  ],
9
- "homepage": "https://github.com/MetaMask/metamask-connect-monorepo/tree/main/packages/multichain#readme",
9
+ "homepage": "https://github.com/MetaMask/connect-monorepo/tree/main/packages/multichain#readme",
10
10
  "bugs": {
11
- "url": "https://github.com/MetaMask/metamask-connect-monorepo/issues"
11
+ "url": "https://github.com/MetaMask/connect-monorepo/issues"
12
12
  },
13
13
  "repository": {
14
14
  "type": "git",
15
- "url": "https://github.com/MetaMask/metamask-connect-monorepo.git"
15
+ "url": "https://github.com/MetaMask/connect-monorepo.git"
16
16
  },
17
17
  "license": "MIT",
18
18
  "sideEffects": false,
@@ -70,7 +70,7 @@
70
70
  "@metamask/mobile-wallet-protocol-core": "^0.3.0",
71
71
  "@metamask/mobile-wallet-protocol-dapp-client": "^0.2.1",
72
72
  "@metamask/multichain-api-client": "^0.10.1",
73
- "@metamask/multichain-ui": "^0.2.0",
73
+ "@metamask/multichain-ui": "^0.3.0",
74
74
  "@metamask/onboarding": "^1.0.1",
75
75
  "@metamask/utils": "^11.8.1",
76
76
  "@paulmillr/qr": "^0.2.1",
@@ -98,14 +98,14 @@
98
98
  "tsup": "^8.4.0",
99
99
  "typedoc": "^0.28.14",
100
100
  "typedoc-plugin-missing-exports": "^4.1.2",
101
- "typescript": "~5.9.2",
101
+ "typescript": "^5.9.3",
102
102
  "vitest": "^3.1.2"
103
103
  },
104
104
  "peerDependencies": {
105
105
  "@react-native-async-storage/async-storage": "^1.23"
106
106
  },
107
107
  "engines": {
108
- "node": "^18.18 || >=20"
108
+ "node": ">=20.19.0"
109
109
  },
110
110
  "publishConfig": {
111
111
  "access": "public",
@@ -1,3 +0,0 @@
1
- export declare function preloadQR(): Promise<void>;
2
- export declare function encodeQRSync(input: string): string;
3
- //# sourceMappingURL=qr.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../src/ui/qr.ts"],"names":[],"mappings":"AAWA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../src/ui/qr.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,wCAAwC;AACxC;;;EAGE;;;;;;;;;;AAEF,IAAI,YAAY,GAAsD,IAAI,CAAC;AAI3E,MAAM,UAAgB,SAAS;;QAC7B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAEzC,CAAC;QACF,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;CAAA;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC"}