FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

3
node_modules/@wallet-standard/base/lib/cjs/bytes.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=bytes.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/bytes.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=identifier.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/identifier.ts"],"names":[],"mappings":""}

21
node_modules/@wallet-standard/base/lib/cjs/index.js generated vendored Normal file
View File

@@ -0,0 +1,21 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./bytes.js"), exports);
__exportStar(require("./identifier.js"), exports);
__exportStar(require("./wallet.js"), exports);
__exportStar(require("./window.js"), exports);
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,kDAAgC;AAChC,8CAA4B;AAC5B,8CAA4B"}

View File

@@ -0,0 +1 @@
{ "type": "commonjs" }

3
node_modules/@wallet-standard/base/lib/cjs/wallet.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=wallet.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":""}

3
node_modules/@wallet-standard/base/lib/cjs/window.js generated vendored Normal file
View File

@@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=window.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/window.ts"],"names":[],"mappings":""}

2
node_modules/@wallet-standard/base/lib/esm/bytes.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=bytes.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/bytes.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=identifier.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/identifier.ts"],"names":[],"mappings":""}

5
node_modules/@wallet-standard/base/lib/esm/index.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
export * from './bytes.js';
export * from './identifier.js';
export * from './wallet.js';
export * from './window.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}

2
node_modules/@wallet-standard/base/lib/esm/wallet.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=wallet.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":""}

2
node_modules/@wallet-standard/base/lib/esm/window.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=window.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"window.js","sourceRoot":"","sources":["../../src/window.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,6 @@
type TypedArrayMutableProperties = 'copyWithin' | 'fill' | 'reverse' | 'set' | 'sort';
export interface ReadonlyUint8Array extends Omit<Uint8Array, TypedArrayMutableProperties> {
readonly [n: number]: number;
}
export {};
//# sourceMappingURL=bytes.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/bytes.ts"],"names":[],"mappings":"AAAA,KAAK,2BAA2B,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AACtF,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACrF,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,OAAO,EAAE,CAAC"}

View File

@@ -0,0 +1,26 @@
/**
* A namespaced identifier in the format `${namespace}:${reference}`.
*
* Used by {@link IdentifierArray} and {@link IdentifierRecord}.
*
* @group Identifier
*/
export type IdentifierString = `${string}:${string}`;
/**
* A read-only array of namespaced identifiers in the format `${namespace}:${reference}`.
*
* Used by {@link Wallet.chains | Wallet::chains}, {@link WalletAccount.chains | WalletAccount::chains}, and
* {@link WalletAccount.features | WalletAccount::features}.
*
* @group Identifier
*/
export type IdentifierArray = readonly IdentifierString[];
/**
* A read-only object with keys of namespaced identifiers in the format `${namespace}:${reference}`.
*
* Used by {@link Wallet.features | Wallet::features}.
*
* @group Identifier
*/
export type IdentifierRecord<T> = Readonly<Record<IdentifierString, T>>;
//# sourceMappingURL=identifier.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../src/identifier.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAErD;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,gBAAgB,EAAE,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1,5 @@
export * from './bytes.js';
export * from './identifier.js';
export * from './wallet.js';
export * from './window.js';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}

View File

@@ -0,0 +1,152 @@
import type { ReadonlyUint8Array } from './bytes.js';
import type { IdentifierArray, IdentifierRecord } from './identifier.js';
/**
* Version of the Wallet Standard implemented by a {@link Wallet}.
*
* Used by {@link Wallet.version | Wallet::version}.
*
* Note that this is _NOT_ a version of the Wallet, but a version of the Wallet Standard itself that the Wallet
* supports.
*
* This may be used by the app to determine compatibility and feature detect.
*
* @group Wallet
*/
export type WalletVersion = '1.0.0';
/**
* A data URI containing a base64-encoded SVG, WebP, PNG, or GIF image.
*
* Used by {@link Wallet.icon | Wallet::icon} and {@link WalletAccount.icon | WalletAccount::icon}.
*
* @group Wallet
*/
export type WalletIcon = `data:image/${'svg+xml' | 'webp' | 'png' | 'gif'};base64,${string}`;
/**
* Interface of a **Wallet**, also referred to as a **Standard Wallet**.
*
* A Standard Wallet implements and adheres to the Wallet Standard.
*
* @group Wallet
*/
export interface Wallet {
/**
* {@link WalletVersion | Version} of the Wallet Standard implemented by the Wallet.
*
* Must be read-only, static, and canonically defined by the Wallet Standard.
*/
readonly version: WalletVersion;
/**
* Name of the Wallet. This may be displayed by the app.
*
* Must be read-only, static, descriptive, unique, and canonically defined by the wallet extension or application.
*/
readonly name: string;
/**
* {@link WalletIcon | Icon} of the Wallet. This may be displayed by the app.
*
* Must be read-only, static, and canonically defined by the wallet extension or application.
*/
readonly icon: WalletIcon;
/**
* Chains supported by the Wallet.
*
* A **chain** is an {@link IdentifierString} which identifies a blockchain in a canonical, human-readable format.
* [CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/master/CAIPs/caip-2.md) chain IDs are compatible with this,
* but are not required to be used.
*
* Each blockchain should define its own **chains** by extension of the Wallet Standard, using its own namespace.
* The `standard` and `experimental` namespaces are reserved by the Wallet Standard.
*
* The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the
* app if the value changes.
*/
readonly chains: IdentifierArray;
/**
* Features supported by the Wallet.
*
* A **feature name** is an {@link IdentifierString} which identifies a **feature** in a canonical, human-readable
* format.
*
* Each blockchain should define its own features by extension of the Wallet Standard.
*
* The `standard` and `experimental` namespaces are reserved by the Wallet Standard.
*
* A **feature** may have any type. It may be a single method or value, or a collection of them.
*
* A **conventional feature** has the following structure:
*
* ```ts
* export type ExperimentalEncryptFeature = {
* // Name of the feature.
* 'experimental:encrypt': {
* // Version of the feature.
* version: '1.0.0';
* // Properties of the feature.
* ciphers: readonly 'x25519-xsalsa20-poly1305'[];
* // Methods of the feature.
* encrypt (data: Uint8Array): Promise<Uint8Array>;
* };
* };
* ```
*
* The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the
* app if the value changes.
*/
readonly features: IdentifierRecord<unknown>;
/**
* {@link WalletAccount | Accounts} that the app is authorized to use.
*
* This can be set by the Wallet so the app can use authorized accounts on the initial page load.
*
* The {@link "@wallet-standard/features".ConnectFeature | `standard:connect` feature} should be used to obtain
* authorization to the accounts.
*
* The {@link "@wallet-standard/features".EventsFeature | `standard:events` feature} should be used to notify the
* app if the value changes.
*/
readonly accounts: readonly WalletAccount[];
}
/**
* Interface of a **WalletAccount**, also referred to as an **Account**.
*
* An account is a _read-only data object_ that is provided from the Wallet to the app, authorizing the app to use it.
*
* The app can use an account to display and query information from a chain.
*
* The app can also act using an account by passing it to {@link Wallet.features | features} of the Wallet.
*
* Wallets may use or extend {@link "@wallet-standard/wallet".ReadonlyWalletAccount} which implements this interface.
*
* @group Wallet
*/
export interface WalletAccount {
/** Address of the account, corresponding with a public key. */
readonly address: string;
/** Public key of the account, corresponding with a secret key to use. */
readonly publicKey: ReadonlyUint8Array;
/**
* Chains supported by the account.
*
* This must be a subset of the {@link Wallet.chains | chains} of the Wallet.
*/
readonly chains: IdentifierArray;
/**
* Feature names supported by the account.
*
* This must be a subset of the names of {@link Wallet.features | features} of the Wallet.
*/
readonly features: IdentifierArray;
/** Optional user-friendly descriptive label or name for the account. This may be displayed by the app. */
readonly label?: string;
/** Optional user-friendly icon for the account. This may be displayed by the app. */
readonly icon?: WalletIcon;
}
/**
* Helper type for defining a {@link Wallet} with a union or intersection of {@link Wallet.features | features}.
*
* @group Wallet
*/
export type WalletWithFeatures<Features extends Wallet['features']> = Omit<Wallet, 'features'> & {
features: Features;
};
//# sourceMappingURL=wallet.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAoB,MAAM,iBAAiB,CAAC;AAE3F;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,WAAW,MAAM,EAAE,CAAC;AAE7F;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACnB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAEhC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAE1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC/C;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAEvC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEnC,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,QAAQ,SAAS,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG;IAC7F,QAAQ,EAAE,QAAQ,CAAC;CACtB,CAAC"}

View File

@@ -0,0 +1,136 @@
import type { Wallet } from './wallet.js';
/**
* Global `window` type for dispatching and listening for {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}.
*
* ```ts
* import { WalletEventsWindow } from '@wallet-standard/base';
*
* declare const window: WalletEventsWindow;
* // OR
* (window as WalletEventsWindow)
* ```
*
* @group Window
*/
export interface WalletEventsWindow extends Omit<Window, 'addEventListener' | 'dispatchEvent'> {
/** Add a listener for {@link WindowAppReadyEvent}. */
addEventListener(type: WindowAppReadyEventType, listener: (event: WindowAppReadyEvent) => void): void;
/** Add a listener for {@link WindowRegisterWalletEvent}. */
addEventListener(type: WindowRegisterWalletEventType, listener: (event: WindowRegisterWalletEvent) => void): void;
/** Dispatch a {@link WindowAppReadyEvent}. */
dispatchEvent(event: WindowAppReadyEvent): void;
/** Dispatch a {@link WindowRegisterWalletEvent}. */
dispatchEvent(event: WindowRegisterWalletEvent): void;
}
/**
* Type of {@link WindowAppReadyEvent}.
*
* @group App Ready Event
*/
export type WindowAppReadyEventType = 'wallet-standard:app-ready';
/** Interface that will be provided to {@link Wallet | Wallets} by the app when the app calls the
* {@link WindowRegisterWalletEventCallback} provided by Wallets.
*
* Wallets must call the {@link WindowAppReadyEventAPI.register | register} method to register themselves.
*
* @group App Ready Event
*/
export interface WindowAppReadyEventAPI {
/**
* Register a {@link Wallet} with the app.
*
* @return
* `unregister` function to programmatically unregister the Wallet.
*
* Wallets generally do not need to, and should not, call this.
*/
register(wallet: Wallet): () => void;
}
/**
* Event that will be dispatched by the app on the `window` when the app is ready to register {@link Wallet | Wallets}.
*
* Wallets must listen for this event, and {@link WindowAppReadyEventAPI.register register} themselves when the event is
* dispatched.
*
* @group App Ready Event
*/
export type WindowAppReadyEvent = UnstoppableCustomEvent<WindowAppReadyEventType, WindowAppReadyEventAPI>;
/**
* Type of {@link WindowRegisterWalletEvent}.
*
* @group Register Wallet Event
*/
export type WindowRegisterWalletEventType = 'wallet-standard:register-wallet';
/**
* Callback function provided by {@link Wallet | Wallets} to be called by the app when the app is ready to register
* Wallets.
*
* @group Register Wallet Event
*/
export type WindowRegisterWalletEventCallback = (api: WindowAppReadyEventAPI) => void;
/**
* Event that will be dispatched on the `window` by each {@link Wallet | Wallet} when the Wallet is ready to be
* registered by the app.
*
* The app must listen for this event, and register Wallets when the event is dispatched.
*
* @group Register Wallet Event
*/
export type WindowRegisterWalletEvent = UnstoppableCustomEvent<WindowRegisterWalletEventType, WindowRegisterWalletEventCallback>;
/**
* @deprecated Use {@link WalletEventsWindow} instead.
*
* @group Deprecated
*/
export interface DEPRECATED_WalletsWindow extends Window {
navigator: DEPRECATED_WalletsNavigator;
}
/**
* @deprecated Use {@link WalletEventsWindow} instead.
*
* @group Deprecated
*/
export interface DEPRECATED_WalletsNavigator extends Navigator {
wallets?: DEPRECATED_Wallets;
}
/**
* @deprecated Use {@link WalletEventsWindow} instead.
*
* @group Deprecated
*/
export interface DEPRECATED_Wallets {
push(...callbacks: DEPRECATED_WalletsCallback[]): void;
}
/**
* @deprecated Use {@link WalletEventsWindow} instead.
*
* @group Deprecated
*/
export type DEPRECATED_WalletsCallback = (wallets: {
register(...wallets: Wallet[]): () => void;
}) => void;
/**
* @internal
*
* A custom event that cannot have its default behavior prevented or its propagation stopped.
*
* This is an internal type, extended by {@link WindowAppReadyEvent} and {@link WindowRegisterWalletEvent}.
*
* [`window.CustomEvent`](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent) is not used because
* Node.js doesn't have it, but this interface is compatible with it.
*
* @group Internal
*/
export interface UnstoppableCustomEvent<T extends string, D> extends Event {
/** Type of the event. */
readonly type: T;
/** Data attached to the event. */
readonly detail: D;
/** @deprecated Does nothing and throws an error if called. */
preventDefault(): never;
/** @deprecated Does nothing and throws an error if called. */
stopImmediatePropagation(): never;
/** @deprecated Does nothing and throws an error if called. */
stopPropagation(): never;
}
//# sourceMappingURL=window.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAC1F,sDAAsD;IACtD,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACtG,4DAA4D;IAC5D,gBAAgB,CAAC,IAAI,EAAE,6BAA6B,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,GAAG,IAAI,CAAC;IAClH,8CAA8C;IAC9C,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAChD,oDAAoD;IACpD,aAAa,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACzD;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;AAE1G;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,GAAG,iCAAiC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,iCAAiC,GAAG,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAC;AAEtF;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,CAC1D,6BAA6B,EAC7B,iCAAiC,CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,wBAAyB,SAAQ,MAAM;IACpD,SAAS,EAAE,2BAA2B,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA4B,SAAQ,SAAS;IAC1D,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,CAAC,GAAG,SAAS,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAAC;CAC1D;AAED;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAA;CAAE,KAAK,IAAI,CAAC;AAE3G;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAE,SAAQ,KAAK;IACtE,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,8DAA8D;IAC9D,cAAc,IAAI,KAAK,CAAC;IACxB,8DAA8D;IAC9D,wBAAwB,IAAI,KAAK,CAAC;IAClC,8DAA8D;IAC9D,eAAe,IAAI,KAAK,CAAC;CAC5B"}