{"version":3,"sources":["../src/builders.ts","../src/telemetry.ts","../src/client.ts","../src/verify.ts","../src/plugins/metrics.ts","../src/shared/logger.ts","../src/middleware/logging.ts","../src/middleware/metrics.ts","../src/plugins/logger.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Fluent Interface Builders for Financial Workspace Backend Client\n *\n * This module provides strongly-typed builder patterns for creating API requests\n * with improved developer experience, type safety, and method chaining capabilities.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport type { PermissionQuery } from \"@unkey/rbac\";\nimport type { FinancialWorkspaceBackendClient } from \"./client\";\nimport type { paths } from \"./openapi\";\n\n/**\n * Builder interface for creating API keys with fluent method chaining.\n *\n * @template TPermissions - Union type of permission strings for type safety\n */\nexport class KeyBuilder<TPermissions extends string = string> {\n  private request: Partial<\n    paths[\"/v1/keys.createKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"]\n  > = {};\n\n  constructor(private client: FinancialWorkspaceBackendClient) {}\n\n  /**\n   * Sets the API ID for the key.\n   *\n   * @param apiId - The API identifier\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .forApi('api_123456');\n   * ```\n   */\n  forApi(apiId: string): this {\n    this.request.apiId = apiId;\n    return this;\n  }\n\n  /**\n   * Sets a human-readable name for the key.\n   *\n   * @param name - The key name\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withName('Production API Key');\n   * ```\n   */\n  withName(name: string): this {\n    this.request.name = name;\n    return this;\n  }\n\n  /**\n   * Sets a prefix for the generated key.\n   *\n   * @param prefix - The key prefix\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withPrefix('prod_sk');\n   * ```\n   */\n  withPrefix(prefix: string): this {\n    this.request.prefix = prefix;\n    return this;\n  }\n\n  /**\n   * Adds metadata to the key.\n   *\n   * @param meta - Key-value pairs for metadata\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withMetadata({\n   *     environment: 'production',\n   *     team: 'backend',\n   *     version: '2.0'\n   *   });\n   * ```\n   */\n  withMetadata(meta: Record<string, unknown>): this {\n    this.request.meta = { ...this.request.meta, ...meta };\n    return this;\n  }\n\n  /**\n   * Sets permissions for the key with type safety.\n   *\n   * @param permissions - Array of permission strings\n   * @returns The builder instance for method chaining with updated type\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withPermissions(['read:users', 'write:posts', 'admin:system']);\n   * ```\n   */\n  withPermissions<P extends string>(permissions: P[]): KeyBuilder<P> {\n    this.request.permissions = permissions;\n    return this as unknown as KeyBuilder<P>;\n  }\n\n  /**\n   * Adds a single permission to the existing permission set.\n   *\n   * @param permission - Permission string to add\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withPermissions(['read:users'])\n   *   .addPermission('write:posts');\n   * ```\n   */\n  addPermission<P extends string>(permission: P): KeyBuilder<TPermissions | P> {\n    if (!this.request.permissions) {\n      this.request.permissions = [];\n    }\n    this.request.permissions.push(permission);\n    return this as unknown as KeyBuilder<TPermissions | P>;\n  }\n\n  /**\n   * Sets roles for the key.\n   *\n   * @param roles - Array of role names\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withRoles(['admin', 'user-manager']);\n   * ```\n   */\n  withRoles(roles: string[]): this {\n    this.request.roles = roles;\n    return this;\n  }\n\n  /**\n   * Sets an expiration timestamp for the key.\n   *\n   * @param expiresAt - Unix timestamp in milliseconds\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withExpiration(Date.now() + 86400000); // 24 hours\n   * ```\n   */\n  withExpiration(expiresAt: number): this {\n    this.request.expires = expiresAt;\n    return this;\n  }\n\n  /**\n   * Sets an expiration using a Date object.\n   *\n   * @param date - Expiration date\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .expiresAt(new Date('2024-12-31'));\n   * ```\n   */\n  expiresAt(date: Date): this {\n    this.request.expires = date.getTime();\n    return this;\n  }\n\n  /**\n   * Sets the remaining usage count for the key.\n   *\n   * @param remaining - Number of allowed uses\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withRemainingUses(1000);\n   * ```\n   */\n  withRemainingUses(remaining: number): this {\n    this.request.remaining = remaining;\n    return this;\n  }\n\n  /**\n   * Sets rate limiting configuration for the key.\n   *\n   * @param config - Rate limit configuration\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withRateLimit({\n   *     type: 'fast',\n   *     limit: 100,\n   *     refillRate: 10,\n   *     refillInterval: 60000\n   *   });\n   * ```\n   */\n  withRateLimit(config: NonNullable<typeof this.request.ratelimit>): this {\n    this.request.ratelimit = config;\n    return this;\n  }\n\n  /**\n   * Sets the key as enabled or disabled.\n   *\n   * @param enabled - Whether the key should be enabled\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .enabled(false); // Create disabled key\n   * ```\n   */\n  enabled(enabled = true): this {\n    this.request.enabled = enabled;\n    return this;\n  }\n\n  /**\n   * Sets external ID for the key (for integration with external systems).\n   *\n   * @param externalId - External identifier\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const builder = client.keys.builder()\n   *   .withExternalId('ext_user_123');\n   * ```\n   */\n  withExternalId(externalId: string): this {\n    this.request.externalId = externalId;\n    return this;\n  }\n\n  /**\n   * Gets the current request configuration.\n   *\n   * @returns The built request object\n   */\n  build(): Partial<\n    paths[\"/v1/keys.createKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"]\n  > {\n    return { ...this.request };\n  }\n\n  /**\n   * Validates the current configuration.\n   *\n   * @returns Validation result with errors if any\n   *\n   * @example\n   * ```typescript\n   * const validation = builder.validate();\n   * if (!validation.valid) {\n   *   console.error('Validation errors:', validation.errors);\n   * }\n   * ```\n   */\n  validate(): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (!this.request.apiId) {\n      errors.push(\"API ID is required\");\n    }\n\n    if (this.request.expires && this.request.expires <= Date.now()) {\n      errors.push(\"Expiration date must be in the future\");\n    }\n\n    if (this.request.remaining !== undefined && this.request.remaining < 0) {\n      errors.push(\"Remaining uses cannot be negative\");\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n    };\n  }\n\n  /**\n   * Creates the API key using the configured parameters.\n   *\n   * @returns Promise resolving to the created key\n   *\n   * @example\n   * ```typescript\n   * const result = await client.keys.builder()\n   *   .forApi('api_123')\n   *   .withName('My API Key')\n   *   .withPermissions(['read:users'])\n   *   .create();\n   *\n   * if (!result.error) {\n   *   console.log('Created key:', result.result.key);\n   * }\n   * ```\n   */\n  async create(): Promise<\n    | {\n        error: {\n          code: \"VALIDATION_ERROR\";\n          message: string;\n          docs: string;\n          requestId: string;\n        };\n      }\n    | Awaited<ReturnType<FinancialWorkspaceBackendClient[\"keys\"][\"create\"]>>\n  > {\n    const validation = this.validate();\n    if (!validation.valid) {\n      return {\n        error: {\n          code: \"VALIDATION_ERROR\" as const,\n          message: `Validation failed: ${validation.errors.join(\", \")}`,\n          docs: \"https://docs.solomon-ai.app/api/keys/create\",\n          requestId: \"N/A\",\n        },\n      };\n    }\n\n    return await this.client.keys.create(\n      this\n        .request as paths[\"/v1/keys.createKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n    );\n  }\n}\n\n/**\n * Builder for creating key verification requests with type safety.\n *\n * @template TPermissions - Union type of permission strings for type safety\n */\nexport class KeyVerificationBuilder<TPermissions extends string = string> {\n  private request: {\n    key: string;\n    authorization?: { permissions: PermissionQuery<TPermissions> };\n  };\n\n  constructor(\n    private client: FinancialWorkspaceBackendClient,\n    key: string,\n  ) {\n    this.request = { key };\n  }\n\n  /**\n   * Adds permission requirements using AND logic.\n   *\n   * @param permissions - Array of required permissions\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const result = await client.keys.verify('sk_123')\n   *   .requireAllPermissions(['read:users', 'write:posts']);\n   * ```\n   */\n  requireAllPermissions<P extends string>(\n    permissions: P[],\n  ): KeyVerificationBuilder<P> {\n    (this.request as any).authorization = {\n      permissions: { and: permissions } as PermissionQuery<P>,\n    };\n    return this as unknown as KeyVerificationBuilder<P>;\n  }\n\n  /**\n   * Adds permission requirements using OR logic.\n   *\n   * @param permissions - Array of alternative permissions\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const result = await client.keys.verify('sk_123')\n   *   .requireAnyPermission(['admin:system', 'read:users']);\n   * ```\n   */\n  requireAnyPermission<P extends string>(\n    permissions: P[],\n  ): KeyVerificationBuilder<P> {\n    (this.request as any).authorization = {\n      permissions: { or: permissions } as PermissionQuery<P>,\n    };\n    return this as unknown as KeyVerificationBuilder<P>;\n  }\n\n  /**\n   * Adds complex permission requirements with nested logic.\n   *\n   * @param query - Complex permission query\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * const result = await client.keys.verify('sk_123')\n   *   .withPermissionQuery({\n   *     or: [\n   *       { and: ['admin:system'] },\n   *       { and: ['read:users', 'write:users'] }\n   *     ]\n   *   });\n   * ```\n   */\n  withPermissionQuery<P extends string>(\n    query: PermissionQuery<P>,\n  ): KeyVerificationBuilder<P> {\n    (this.request as any).authorization = { permissions: query };\n    return this as unknown as KeyVerificationBuilder<P>;\n  }\n\n  /**\n   * Executes the key verification.\n   *\n   * @returns Promise resolving to verification result\n   */\n  async execute(): Promise<\n    Awaited<ReturnType<FinancialWorkspaceBackendClient[\"keys\"][\"verify\"]>>\n  > {\n    return await this.client.keys.verify(\n      this.request as Parameters<\n        FinancialWorkspaceBackendClient[\"keys\"][\"verify\"]\n      >[0],\n    );\n  }\n}\n\n/**\n * Builder for creating API configurations.\n */\nexport class ApiBuilder {\n  private request: Partial<\n    paths[\"/v1/apis.createApi\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"]\n  > = {};\n\n  constructor(private client: FinancialWorkspaceBackendClient) {}\n\n  /**\n   * Sets the API name.\n   *\n   * @param name - The API name\n   * @returns The builder instance for method chaining\n   */\n  withName(name: string): this {\n    this.request.name = name;\n    return this;\n  }\n\n  /**\n   * Validates the API configuration.\n   *\n   * @returns Validation result\n   */\n  validate(): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (!this.request.name) {\n      errors.push(\"API name is required\");\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n    };\n  }\n\n  /**\n   * Sets the workspace for the API.\n   *\n   * @param workspaceId - The workspace identifier\n   * @returns The builder instance for method chaining\n   */\n  inWorkspace(workspaceId: string): this {\n    (this.request as any).workspaceId = workspaceId;\n    return this;\n  }\n\n  /**\n   * Creates the API using the configured parameters.\n   *\n   * @returns Promise resolving to the created API\n   */\n  async create(): Promise<\n    | {\n        error: {\n          code: \"VALIDATION_ERROR\";\n          message: string;\n          docs: string;\n          requestId: string;\n        };\n      }\n    | Awaited<ReturnType<FinancialWorkspaceBackendClient[\"apis\"][\"create\"]>>\n  > {\n    const validation = this.validate();\n    if (!validation.valid) {\n      return {\n        error: {\n          code: \"VALIDATION_ERROR\" as const,\n          message: `Validation failed: ${validation.errors.join(\", \")}`,\n          docs: \"https://docs.solomon-ai.app/api/apis/create\",\n          requestId: \"N/A\",\n        },\n      };\n    }\n\n    return await this.client.apis.create(\n      this\n        .request as paths[\"/v1/apis.createApi\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n    );\n  }\n}\n\n/**\n * Builder for creating permission configurations.\n */\nexport class PermissionBuilder {\n  private request: Partial<\n    paths[\"/v1/permissions.createPermission\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"]\n  > = {};\n\n  constructor(private client: FinancialWorkspaceBackendClient) {}\n\n  /**\n   * Sets the permission name.\n   *\n   * @param name - The permission name\n   * @returns The builder instance for method chaining\n   */\n  withName(name: string): this {\n    this.request.name = name;\n    return this;\n  }\n\n  /**\n   * Sets the permission description.\n   *\n   * @param description - The permission description\n   * @returns The builder instance for method chaining\n   */\n  withDescription(description: string): this {\n    this.request.description = description;\n    return this;\n  }\n\n  /**\n   * Creates the permission using the configured parameters.\n   *\n   * @returns Promise resolving to the created permission\n   */\n  async create(): Promise<\n    | {\n        error: {\n          code: \"VALIDATION_ERROR\";\n          message: string;\n          docs: string;\n          requestId: string;\n        };\n      }\n    | Awaited<\n        ReturnType<\n          FinancialWorkspaceBackendClient[\"permissions\"][\"createPermission\"]\n        >\n      >\n  > {\n    if (!this.request.name) {\n      return {\n        error: {\n          code: \"VALIDATION_ERROR\" as const,\n          message: \"Permission name is required\",\n          docs: \"https://docs.solomon-ai.app/api/permissions/create\",\n          requestId: \"N/A\",\n        },\n      };\n    }\n\n    return await this.client.permissions.createPermission(\n      this\n        .request as paths[\"/v1/permissions.createPermission\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n    );\n  }\n}\n\n/**\n * Builder for creating role configurations.\n */\nexport class RoleBuilder {\n  private request: Partial<\n    paths[\"/v1/permissions.createRole\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"]\n  > & {\n    permissions?: string[];\n  } = {};\n\n  constructor(private client: FinancialWorkspaceBackendClient) {}\n\n  /**\n   * Sets the role name.\n   *\n   * @param name - The role name\n   * @returns The builder instance for method chaining\n   */\n  withName(name: string): this {\n    this.request.name = name;\n    return this;\n  }\n\n  /**\n   * Sets the role description.\n   *\n   * @param description - The role description\n   * @returns The builder instance for method chaining\n   */\n  withDescription(description: string): this {\n    this.request.description = description;\n    return this;\n  }\n\n  /**\n   * Sets permissions for the role.\n   *\n   * @param permissions - Array of permission names\n   * @returns The builder instance for method chaining\n   */\n  withPermissions(permissions: string[]): this {\n    this.request.permissions = permissions;\n    return this;\n  }\n\n  /**\n   * Adds a single permission to the existing permission set.\n   *\n   * @param permission - Permission name to add\n   * @returns The builder instance for method chaining\n   */\n  addPermission(permission: string): this {\n    if (!this.request.permissions) {\n      this.request.permissions = [];\n    }\n    this.request.permissions.push(permission);\n    return this;\n  }\n\n  /**\n   * Creates the role using the configured parameters.\n   *\n   * @returns Promise resolving to the created role\n   */\n  async create(): Promise<\n    | {\n        error: {\n          code: \"VALIDATION_ERROR\";\n          message: string;\n          docs: string;\n          requestId: string;\n        };\n      }\n    | Awaited<\n        ReturnType<FinancialWorkspaceBackendClient[\"permissions\"][\"createRole\"]>\n      >\n  > {\n    if (!this.request.name) {\n      return {\n        error: {\n          code: \"VALIDATION_ERROR\" as const,\n          message: \"Role name is required\",\n          docs: \"https://docs.solomon-ai.app/api/permissions/create-role\",\n          requestId: \"N/A\",\n        },\n      };\n    }\n\n    return await this.client.permissions.createRole(\n      this\n        .request as paths[\"/v1/permissions.createRole\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n    );\n  }\n}\n","import type { ClientOptions } from \"./client\";\n\nconst version = \"1.0.0\"; // Fallback version\n\nexport type Telemetry = {\n  /**\n   * Unkey-Telemetry-Sdk\n   * @example @solomonai/financial-engine-sdk@v1.1.1\n   */\n  sdkVersions: string[];\n  /**\n   * Unkey-Telemetry-Platform\n   * @example cloudflare\n   */\n  platform?: string;\n  /**\n   * Unkey-Telemetry-Runtime\n   * @example node@v18\n   */\n  runtime?: string;\n};\n\nexport function getTelemetry(opts: ClientOptions): Telemetry | null {\n  let platform: string | undefined;\n  let runtime: string | undefined;\n  const sdkVersions = [`@solomonai/fwb-client@${version}`];\n\n  try {\n    if (typeof process !== \"undefined\") {\n      if (process.env.UNKEY_DISABLE_TELEMETRY) {\n        return null;\n      }\n      platform = process.env.VERCEL\n        ? \"vercel\"\n        : process.env.AWS_REGION\n          ? \"aws\"\n          : undefined;\n\n      // @ts-ignore\n      if (typeof EdgeRuntime !== \"undefined\") {\n        runtime = \"edge-light\";\n      } else {\n        runtime = `node@${process.version}`;\n      }\n    }\n\n    if (opts.wrapperSdkVersion) {\n      sdkVersions.push(opts.wrapperSdkVersion);\n    }\n  } catch (_error) {}\n\n  return { platform, runtime, sdkVersions };\n}\n","/**\n * @fileoverview Financial Workspace Backend Client SDK\n *\n * This module provides a comprehensive TypeScript SDK for interacting with the Financial Workspace Backend API.\n * It includes support for AI-powered transaction analysis, banking integrations, key management, permissions,\n * rate limiting, and more.\n *\n * @author Solomon AI Engineering Team\n * @version 2.0.0\n * @since 1.0.0\n */\n\nimport type { PermissionQuery } from \"@unkey/rbac\";\nimport type { ErrorResponse } from \"./errors\";\nimport type { operations, paths, components } from \"./openapi\";\n\nimport {\n  ApiBuilder,\n  KeyBuilder,\n  KeyVerificationBuilder,\n  PermissionBuilder,\n  RoleBuilder,\n} from \"./builders\";\nimport type { Middleware, Plugin } from \"./middleware\";\nimport { type Telemetry, getTelemetry } from \"./telemetry\";\n\n// Re-export all types\nexport * from \"./types\";\n\n/**\n * Configuration options for the Financial Workspace Backend Client.\n *\n * @public\n * @interface ClientOptions\n *\n * @example\n * ```typescript\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_1234567890abcdef',\n *   baseUrl: 'https://api.solomon-ai.app',\n *   retry: {\n *     attempts: 3,\n *     backoff: (count) => Math.pow(2, count) * 1000\n *   }\n * });\n * ```\n */\nexport type ClientOptions = (\n  | {\n      /** @deprecated Use rootKey instead */\n      token?: never;\n\n      /**\n       * The root API key from the Financial Workspace Backend platform.\n       *\n       * This is the primary authentication method for accessing the API.\n       * Root keys provide full access to all API endpoints and should be\n       * kept secure and never exposed in client-side code.\n       *\n       * You can create and manage your root keys here:\n       * https://financial-workspace-backend.solomon-ai.app/app/settings/root-keys\n       *\n       * @example \"fwb_1234567890abcdef1234567890abcdef\"\n       */\n      rootKey: string;\n    }\n  | {\n      /**\n       * Legacy workspace key from the Financial Workspace Backend platform.\n       *\n       * @deprecated Use `rootKey` instead for enhanced security and features.\n       * This field will be removed in a future version.\n       *\n       * @example \"fwb_legacy_1234567890abcdef\"\n       */\n      token: string;\n      /** @deprecated Use rootKey instead */\n      rootKey?: never;\n    }\n) & {\n  /**\n   * The base URL for the Financial Workspace Backend API.\n   *\n   * This should point to your deployment of the Financial Workspace Backend.\n   * For production use, this typically points to your hosted instance.\n   * For development, you might use a local or staging environment.\n   *\n   * @default \"https://fwb-engine.solomon-ai.app\"\n   * @example \"https://api.solomon-ai.app\"\n   * @example \"https://staging-api.solomon-ai.app\"\n   * @example \"http://localhost:3000\"\n   */\n  baseUrl?: string;\n\n  /**\n   * Default API ID for operations that require it.\n   *\n   * When set, this API ID will be automatically used for all operations\n   * that require an apiId parameter, eliminating the need to pass it\n   * repeatedly. This significantly improves developer experience.\n   *\n   * You can still override this on a per-request basis by passing\n   * a different apiId in the request parameters.\n   *\n   * @example \"api_1234567890abcdef\"\n   * @since 2.0.0\n   */\n  apiId?: string;\n\n  /**\n   * Controls whether telemetry data is collected and sent.\n   *\n   * When enabled (default), the SDK collects anonymous usage statistics\n   * to help improve the service. This includes:\n   * - Runtime environment (Node.js version, browser info)\n   * - Platform information (Vercel, AWS Lambda, etc.)\n   * - SDK version and wrapper SDK versions\n   * - Request patterns and error rates\n   *\n   * No sensitive data (API keys, request bodies, responses) is ever collected.\n   *\n   * @default false\n   * @example true // Disable telemetry for enhanced privacy\n   */\n  disableTelemetry?: boolean;\n\n  /**\n   * Configuration for automatic retry behavior on network errors and server issues.\n   *\n   * The SDK will automatically retry failed requests with exponential backoff\n   * for transient errors (network issues, 5xx server errors, timeouts).\n   * Client errors (4xx) are not retried as they indicate permanent failures.\n   *\n   * @example\n   * ```typescript\n   * {\n   *   attempts: 3,\n   *   backoff: (retryCount) => Math.min(1000 * Math.pow(2, retryCount), 30000)\n   * }\n   * ```\n   */\n  retry?: {\n    /**\n     * Maximum number of retry attempts for failed requests.\n     *\n     * The total number of requests made will be `attempts + 1` (initial attempt + retries).\n     * Set to `0` to disable retries entirely.\n     *\n     * @default 5\n     * @minimum 0\n     * @maximum 10\n     * @example 3 // Will make up to 4 total requests (1 initial + 3 retries)\n     */\n    attempts?: number;\n\n    /**\n     * Function that determines the delay before the next retry attempt.\n     *\n     * This function receives the current retry count (0-indexed) and should\n     * return the number of milliseconds to wait before the next attempt.\n     *\n     * The default implementation uses exponential backoff with jitter:\n     * `Math.round(Math.exp(retryCount) * 10)`\n     *\n     * @param retryCount - The current retry attempt (0 for first retry, 1 for second, etc.)\n     * @returns The number of milliseconds to wait before the next retry\n     *\n     * @default `(retryCount) => Math.round(Math.exp(retryCount) * 10)`\n     *\n     * @example\n     * ```typescript\n     * // Linear backoff: 1s, 2s, 3s, ...\n     * (retryCount) => (retryCount + 1) * 1000\n     *\n     * // Exponential backoff with cap: 1s, 2s, 4s, 8s, 16s (max 30s)\n     * (retryCount) => Math.min(1000 * Math.pow(2, retryCount), 30000)\n     *\n     * // Fixed delay: always wait 5 seconds\n     * () => 5000\n     * ```\n     */\n    backoff?: (retryCount: number) => number;\n  };\n\n  /**\n   * Custom fetch cache behavior for HTTP requests.\n   *\n   * This controls how the underlying fetch requests are cached by the browser\n   * or runtime environment. This follows the standard Fetch API cache options.\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n   *\n   * @example \"no-cache\" // Always fetch from server, bypassing cache\n   * @example \"force-cache\" // Use cached response if available\n   * @example \"only-if-cached\" // Only use cached responses\n   */\n  cache?: RequestCache;\n\n  /**\n   * Version identifier for SDK wrappers and integrations.\n   *\n   * This field is used internally for telemetry and debugging purposes\n   * to track which wrapper SDKs or integration libraries are being used.\n   *\n   * Only set this if you're building a wrapper around this SDK.\n   * End users should leave this undefined.\n   *\n   * @internal\n   * @example \"next-auth-adapter@1.2.3\"\n   * @example \"solomon-ai-react@2.1.0\"\n   */\n  wrapperSdkVersion?: string;\n\n  /**\n   * Middleware to apply to all requests.\n   *\n   * Middleware allows you to intercept and modify requests and responses,\n   * add logging, metrics collection, caching, and other cross-cutting concerns.\n   *\n   * @example\n   * ```typescript\n   * import { createLoggingMiddleware } from '@solomonai/fwb-client/middleware';\n   *\n   * const client = new FinancialWorkspaceBackendClient({\n   *   rootKey: 'fwb_123',\n   *   middleware: [\n   *     createLoggingMiddleware({ logRequests: true, logResponses: true })\n   *   ]\n   * });\n   * ```\n   */\n  middleware?: Middleware[];\n\n  /**\n   * Plugins to extend the client with additional functionality.\n   *\n   * Plugins can add new methods, middleware, and capabilities to the client.\n   * They provide a way to package and reuse common functionality.\n   *\n   * @example Metrics and Logging Configuration\n   * ```typescript\n   * import { createMetricsPlugin, createLoggerPlugin, LogLevel } from '@solomonai/fwb-client/plugins';\n   *\n   * const client = new FinancialWorkspaceBackendClient({\n   *   rootKey: 'fwb_123',\n   *   plugins: [\n   *     {\n   *       plugin: createMetricsPlugin(),\n   *       options: {\n   *         enableOTel: true,\n   *         otelExportEndpoint: 'https://otlp.example.com/v1/metrics',\n   *         otelExportHeaders: { 'Authorization': 'Bearer token' },\n   *         enableTiming: true\n   *       }\n   *     },\n   *     {\n   *       plugin: createLoggerPlugin(),\n   *       options: {\n   *         logLevel: LogLevel.INFO,\n   *         format: 'text',\n   *         useColors: true,\n   *         logRequests: true,\n   *         logErrors: true\n   *       }\n   *     }\n   *   ]\n   * });\n   * ```\n   */\n  plugins?: Array<{ plugin: Plugin; options?: Record<string, unknown> }>;\n};\n\n/**\n * Internal type representing an API request configuration.\n *\n * This type defines the structure of requests made to the Financial Workspace Backend API.\n * It's a discriminated union that ensures type safety for different HTTP methods\n * and their corresponding payload requirements.\n *\n * @internal\n * @private\n */\ntype ApiRequest = {\n  /**\n   * Array of path segments that will be joined to form the API endpoint URL.\n   * @example [\"v1\", \"keys\", \"verify\"] becomes \"/v1/keys/verify\"\n   */\n  path: string[];\n} & (\n  | {\n      /** HTTP GET method - used for retrieving data */\n      method: \"GET\";\n      /** GET requests cannot have a body */\n      body?: never;\n      /** Query parameters for filtering, pagination, etc. */\n      query?: Record<string, string | number | boolean | null | string[]>;\n    }\n  | {\n      /** HTTP POST method - used for creating new resources */\n      method: \"POST\";\n      /** Request payload for POST requests */\n      body?: unknown;\n      /** POST requests typically don't use query parameters */\n      query?: never;\n    }\n  | {\n      /** HTTP DELETE method - used for removing resources */\n      method: \"DELETE\";\n      /** Request payload for DELETE requests (if needed) */\n      body?: unknown;\n      /** DELETE requests typically don't use query parameters */\n      query?: never;\n    }\n  | {\n      /** HTTP PUT method - used for updating existing resources */\n      method: \"PUT\";\n      /** Request payload for PUT requests */\n      body?: unknown;\n      /** Query parameters for PUT requests (sometimes used for targeting) */\n      query?: Record<string, string | number | boolean | null | string[]>;\n    }\n);\n\n/**\n * Standard result type for all API operations.\n *\n * This is a discriminated union that represents either a successful result\n * or an error. This pattern ensures that you always handle both success\n * and error cases when working with API responses.\n *\n * @template R The type of the successful result data\n *\n * @example\n * ```typescript\n * const result = await client.keys.verify({ key: 'key_123' });\n *\n * if (result.error) {\n *   console.error(`API Error ${result.error.code}: ${result.error.message}`);\n *   console.log(`See docs: ${result.error.docs}`);\n *   console.log(`Request ID: ${result.error.requestId}`);\n *   return;\n * }\n *\n * // TypeScript knows that result.result is available and result.error is not\n * console.log('Key is valid:', result.result.valid);\n * ```\n */\ntype Result<R> =\n  | {\n      /**\n       * The successful result data from the API.\n       * Only available when the request succeeds.\n       */\n      result: R;\n      /**\n       * Error information is not present in successful responses.\n       * @internal\n       */\n      error?: never;\n    }\n  | {\n      /**\n       * Result data is not present in error responses.\n       * @internal\n       */\n      result?: never;\n      /**\n       * Detailed error information when the request fails.\n       */\n      error: {\n        /**\n         * Machine-readable error code for programmatic handling.\n         * @example \"INVALID_KEY\"\n         * @example \"RATE_LIMITED\"\n         * @example \"INSUFFICIENT_PERMISSIONS\"\n         */\n        code: ErrorResponse[\"error\"][\"code\"];\n\n        /**\n         * Human-readable error message describing what went wrong.\n         * @example \"The provided key is invalid or has been revoked\"\n         */\n        message: ErrorResponse[\"error\"][\"message\"];\n\n        /**\n         * URL to documentation that provides more information about this error.\n         * @example \"https://docs.solomon-ai.app/errors#invalid-key\"\n         */\n        docs: ErrorResponse[\"error\"][\"docs\"];\n\n        /**\n         * Unique identifier for this request, useful for debugging and support.\n         * Include this in support requests for faster resolution.\n         * @example \"req_1234567890abcdef\"\n         */\n        requestId: string;\n      };\n    };\n\n/**\n * Main client class for interacting with the Financial Workspace Backend API.\n *\n * This class provides a comprehensive TypeScript SDK for all Financial Workspace Backend\n * API endpoints, including AI-powered transaction analysis, banking integrations,\n * key management, permissions, rate limiting, and more.\n *\n * The client is designed with type safety, automatic retries, comprehensive error handling,\n * and built-in telemetry to provide the best developer experience.\n *\n * @public\n * @class FinancialWorkspaceBackendClient\n *\n * @example Basic Usage\n * ```typescript\n * import { FinancialWorkspaceBackendClient } from '@solomonai/financial-workspace-backend';\n *\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_1234567890abcdef',\n *   baseUrl: 'https://api.solomon-ai.app'\n * });\n *\n * // Verify an API key\n * const result = await client.keys.verify({ key: 'key_123' });\n * if (result.error) {\n *   console.error('Verification failed:', result.error.message);\n * } else {\n *   console.log('Key valid:', result.result.valid);\n * }\n * ```\n *\n * @example AI-Powered Transaction Analysis\n * ```typescript\n * // Enrich transaction data with AI\n * const enrichResult = await client.ai.enrich({\n *   data: [{\n *     id: 'txn_123',\n *     description: 'UBER TRIP',\n *     amount: 2500,\n *     currency: 'USD'\n *   }]\n * });\n *\n * if (!enrichResult.error) {\n *   console.log('Enriched categories:', enrichResult.result.enrichedTransactions);\n * }\n * ```\n *\n * @example Banking Integration\n * ```typescript\n * // Create a Plaid link token\n * const linkResult = await client.banking.plaid.link({\n *   userId: 'user_123',\n *   products: ['transactions', 'accounts']\n * });\n *\n * if (!linkResult.error) {\n *   console.log('Link token:', linkResult.result.linkToken);\n * }\n * ```\n *\n * @see {@link ClientOptions} for configuration options\n * @see {@link https://docs.solomon-ai.app} for complete API documentation\n */\nexport class FinancialWorkspaceBackendClient {\n  /**\n   * The base URL for all API requests.\n   * @readonly\n   * @public\n   */\n  public readonly baseUrl: string;\n\n  /**\n   * The API key used for authentication.\n   * @readonly\n   * @private\n   */\n  private readonly rootKey: string;\n\n  /**\n   * Default API ID for operations.\n   * @readonly\n   * @private\n   */\n  private readonly defaultApiId?: string;\n\n  /**\n   * HTTP cache configuration for requests.\n   * @readonly\n   * @private\n   */\n  private readonly cache?: RequestCache;\n\n  /**\n   * Telemetry collector instance for usage analytics.\n   * @readonly\n   * @private\n   */\n  private readonly telemetry?: Telemetry | null;\n\n  /**\n   * Retry configuration for failed requests.\n   * @readonly\n   * @public\n   */\n  public readonly retry: {\n    /** Maximum number of retry attempts */\n    attempts: number;\n    /** Function to calculate delay between retries */\n    backoff: (retryCount: number) => number;\n  };\n\n  /**\n   * Creates a new instance of the Financial Workspace Backend client.\n   *\n   * @param opts - Configuration options for the client\n   *\n   * @throws {Error} When no valid authentication key is provided\n   *\n   * @example\n   * ```typescript\n   * const client = new FinancialWorkspaceBackendClient({\n   *   rootKey: 'fwb_1234567890abcdef',\n   *   baseUrl: 'https://api.solomon-ai.app',\n   *   retry: {\n   *     attempts: 3,\n   *     backoff: (count) => Math.pow(2, count) * 1000\n   *   },\n   *   disableTelemetry: true\n   * });\n   * ```\n   */\n  constructor(opts: ClientOptions) {\n    this.baseUrl = opts.baseUrl ?? \"https://fwb-api.solomon-ai.app\";\n    this.rootKey = opts.rootKey ?? opts.token;\n    this.defaultApiId = opts.apiId;\n\n    if (!opts.disableTelemetry) {\n      this.telemetry = getTelemetry(opts);\n    }\n\n    this.cache = opts.cache;\n    /**\n     * Even though typescript should prevent this, some people still pass undefined or empty strings\n     */\n    if (!this.rootKey) {\n      throw new Error(\n        \"FWB Engine root key must be set, maybe you passed in `undefined` or an empty string?\",\n      );\n    }\n\n    this.retry = {\n      attempts: opts.retry?.attempts ?? 5,\n      backoff: opts.retry?.backoff ?? ((n) => Math.round(Math.exp(n) * 10)),\n    };\n  }\n\n  /**\n   * Generates HTTP headers for API requests.\n   *\n   * This method constructs the standard headers required for all API requests,\n   * including authentication, content type, and telemetry information.\n   *\n   * @private\n   * @returns Headers object containing authorization and telemetry data\n   *\n   * @example Headers Generated:\n   * ```\n   * {\n   *   \"Content-Type\": \"application/json\",\n   *   \"Authorization\": \"Bearer fwb_1234567890abcdef\",\n   *   \"Unkey-Telemetry-SDK\": \"@solomonai/fwb-client@2.0.0\",\n   *   \"Unkey-Telemetry-Platform\": \"vercel\",\n   *   \"Unkey-Telemetry-Runtime\": \"node@18.17.0\"\n   * }\n   * ```\n   */\n  private getHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      Authorization: `Bearer ${this.rootKey}`,\n    };\n    if (this.telemetry?.sdkVersions) {\n      headers[\"Unkey-Telemetry-SDK\"] = this.telemetry.sdkVersions.join(\",\");\n    }\n    if (this.telemetry?.platform) {\n      headers[\"Unkey-Telemetry-Platform\"] = this.telemetry.platform;\n    }\n    if (this.telemetry?.runtime) {\n      headers[\"Unkey-Telemetry-Runtime\"] = this.telemetry.runtime;\n    }\n    return headers;\n  }\n\n  /**\n   * Internal method for making HTTP requests to the API with automatic retries.\n   *\n   * This method handles the low-level HTTP communication, including:\n   * - URL construction from path segments\n   * - Query parameter serialization\n   * - Request body JSON serialization\n   * - Automatic retries with exponential backoff\n   * - Error handling and response parsing\n   * - Telemetry data collection\n   *\n   * @template TResult The expected type of the successful response data\n   * @param req - The request configuration object\n   * @returns Promise resolving to either success result or error details\n   *\n   * @private\n   *\n   * @example Internal Usage:\n   * ```typescript\n   * const result = await this.fetch<KeyVerificationResponse>({\n   *   path: ['v1', 'keys', 'verify'],\n   *   method: 'POST',\n   *   body: { key: 'key_123' }\n   * });\n   * ```\n   */\n  private async fetch<TResult>(req: ApiRequest): Promise<Result<TResult>> {\n    let res: Response | null = null;\n    let err: Error | null = null;\n    for (let i = 0; i <= this.retry.attempts; i++) {\n      const url = new URL(`${this.baseUrl}/${req.path.join(\"/\")}`);\n      if (req.query) {\n        for (const [k, v] of Object.entries(req.query)) {\n          if (typeof v === \"undefined\" || v === null) {\n            continue;\n          }\n          url.searchParams.set(k, v.toString());\n        }\n      }\n      res = await fetch(url, {\n        method: req.method,\n        headers: this.getHeaders(),\n        cache: this.cache,\n        body: JSON.stringify(req.body),\n      }).catch((e: Error) => {\n        err = e;\n        return null; // set `res` to `null`\n      });\n      // 200-299 -> success\n      if (res && res.status >= 200 && res.status <= 299) {\n        return { result: (await res.json()) as TResult };\n      }\n      // 400-499 -> client error, retries are futile\n      if (res && res.status >= 400 && res.status <= 499) {\n        return (await res.json()) as ErrorResponse;\n      }\n      const backoff = this.retry.backoff(i);\n      console.debug(\n        `attempt ${i + 1} of ${\n          this.retry.attempts + 1\n        } to reach ${url} failed, retrying in ${backoff} ms: status=${\n          res?.status\n        } | ${res?.headers.get(\"unkey-request-id\")}`,\n      );\n      await new Promise((r) => setTimeout(r, backoff));\n    }\n\n    if (res) {\n      return (await res.json()) as ErrorResponse;\n    }\n\n    return {\n      error: {\n        // @ts-ignore\n        code: \"FETCH_ERROR\",\n        // @ts-ignore I don't understand why `err` is `never`\n        message: err?.message ?? \"No response\",\n        docs: \"https://developer.mozilla.org/en-US/docs/Web/API/fetch\",\n        requestId: \"N/A\",\n      },\n    };\n  }\n\n  /**\n   * Health check and service monitoring endpoints.\n   *\n   * These endpoints allow you to monitor the health and availability of the\n   * Financial Workspace Backend API. Use these for uptime monitoring, health checks\n   * in load balancers, and service discovery systems.\n   *\n   * @public\n   * @readonly\n   *\n   * @example\n   * ```typescript\n   * // Check if the API is healthy and responding\n   * const healthCheck = await client.liveness.check();\n   *\n   * if (healthCheck.error) {\n   *   console.error('API is down:', healthCheck.error.message);\n   * } else {\n   *   console.log('API is healthy:', healthCheck.result.status);\n   * }\n   * ```\n   */\n  public get liveness() {\n    return {\n      /**\n       * Performs a health check on the Financial Workspace Backend API.\n       *\n       * This endpoint returns the current health status of the API, including\n       * service availability, database connectivity, and any ongoing maintenance.\n       * Use this for monitoring and alerting systems.\n       *\n       * @returns Promise resolving to the health status information\n       *\n       * @example\n       * ```typescript\n       * const health = await client.liveness.check();\n       *\n       * if (!health.error) {\n       *   console.log('Service status:', health.result.status);\n       *   console.log('Response time:', health.result.responseTime);\n       *   console.log('Version:', health.result.version);\n       * }\n       * ```\n       */\n      check: async (): Promise<\n        Result<\n          paths[\"/v1/liveness\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"liveness\"],\n          method: \"GET\",\n        });\n      },\n    };\n  }\n\n  /**\n   * API key management endpoints.\n   *\n   * These endpoints provide comprehensive key lifecycle management including creation,\n   * verification, permissions, roles, and analytics. Keys are the primary method of\n   * authentication for accessing protected resources in your application.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Creating and verifying a key\n   * ```typescript\n   * // Create a new API key\n   * const newKey = await client.keys.create({\n   *   apiId: 'api_123',\n   *   prefix: 'sk',\n   *   meta: { userId: 'user_456' }\n   * });\n   *\n   * if (!newKey.error) {\n   *   console.log('Created key:', newKey.result.key);\n   *\n   *   // Verify the key works\n   *   const verification = await client.keys.verify({\n   *     key: newKey.result.key\n   *   });\n   *\n   *   console.log('Key valid:', verification.result?.valid);\n   * }\n   * ```\n   *\n   * @example Permission management\n   * ```typescript\n   * // Add permissions to a key\n   * await client.keys.addPermissions({\n   *   keyId: 'key_123',\n   *   permissions: ['read:users', 'write:posts']\n   * });\n   *\n   * // Verify key with permission check\n   * const verification = await client.keys.verify({\n   *   key: 'sk_123',\n   *   authorization: {\n   *     permissions: {\n   *       and: ['read:users']\n   *     }\n   *   }\n   * });\n   * ```\n   */\n  public get keys() {\n    return {\n      /**\n       * Creates a new fluent builder for API key creation.\n       *\n       * The builder pattern provides a more intuitive way to create API keys\n       * with method chaining, type safety, and validation capabilities.\n       *\n       * @returns A new KeyBuilder instance for fluent API key creation\n       *\n       * @example Using the builder pattern\n       * ```typescript\n       * const result = await client.keys.builder()\n       *   .forApi('api_123456')\n       *   .withName('Production API Key')\n       *   .withPermissions(['read:users', 'write:posts'])\n       *   .withExpiration(Date.now() + 86400000) // 24 hours\n       *   .withMetadata({\n       *     environment: 'production',\n       *     team: 'backend'\n       *   })\n       *   .withRateLimit({\n       *     type: 'fast',\n       *     limit: 1000,\n       *     refillRate: 100,\n       *     refillInterval: 60000\n       *   })\n       *   .create();\n       *\n       * if (!result.error) {\n       *   console.log('Created key:', result.result.key);\n       * }\n       * ```\n       *\n       * @example Validation and error handling\n       * ```typescript\n       * const builder = client.keys.builder()\n       *   .forApi('api_123')\n       *   .withName('Test Key');\n       *\n       * const validation = builder.validate();\n       * if (validation.valid) {\n       *   const result = await builder.create();\n       * } else {\n       *   console.error('Configuration errors:', validation.errors);\n       * }\n       * ```\n       */\n      builder: (): KeyBuilder => new KeyBuilder(this),\n\n      /**\n       * Creates a fluent builder for key verification with type-safe permissions.\n       *\n       * This method provides a more expressive way to verify keys with complex\n       * permission requirements using method chaining.\n       *\n       * @param key - The API key to verify\n       * @returns A new KeyVerificationBuilder instance\n       *\n       * @example Basic key verification\n       * ```typescript\n       * const result = await client.keys.verifyWith('sk_123456')\n       *   .requireAllPermissions(['read:users', 'write:posts'])\n       *   .execute();\n       *\n       * if (!result.error && result.result.valid) {\n       *   console.log('Key is valid and has required permissions');\n       * }\n       * ```\n       *\n       * @example Complex permission logic\n       * ```typescript\n       * const result = await client.keys.verifyWith('sk_123456')\n       *   .withPermissionQuery({\n       *     or: [\n       *       { and: ['admin:system'] },\n       *       { and: ['read:users', 'write:users'] }\n       *     ]\n       *   })\n       *   .execute();\n       * ```\n       */\n      verifyWith: <TPermissions extends string = string>(\n        key: string,\n      ): KeyVerificationBuilder<TPermissions> =>\n        new KeyVerificationBuilder<TPermissions>(this, key),\n\n      /**\n       * Creates a new API key with optional configuration.\n       *\n       * This endpoint generates a new API key that can be used to authenticate\n       * requests to your API. Keys can be configured with metadata, expiration,\n       * rate limits, and other security settings.\n       *\n       * @param req - Key creation configuration\n       * @returns Promise resolving to the created key details\n       *\n       * @example Basic key creation\n       * ```typescript\n       * const result = await client.keys.create({\n       *   apiId: 'api_123',\n       *   prefix: 'sk',\n       *   meta: {\n       *     userId: 'user_456',\n       *     environment: 'production'\n       *   }\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('New key:', result.result.key);\n       *   console.log('Key ID:', result.result.keyId);\n       * }\n       * ```\n       *\n       * @example Key with expiration and limits\n       * ```typescript\n       * const result = await client.keys.create({\n       *   apiId: 'api_123',\n       *   expires: Date.now() + (30 * 24 * 60 * 60 * 1000), // 30 days\n       *   ratelimit: {\n       *     type: 'fast',\n       *     limit: 1000,\n       *     refillRate: 100,\n       *     refillInterval: 60000\n       *   }\n       * });\n       * ```\n       */\n      create: async (\n        req: paths[\"/v1/keys.createKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.createKey\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        // Use default apiId if not provided\n        const requestBody = {\n          ...req,\n          apiId: req.apiId || this.defaultApiId,\n        };\n\n        if (!requestBody.apiId) {\n          throw new Error(\n            \"apiId is required. Either pass it in the request or set a default apiId when initializing the client.\",\n          );\n        }\n\n        return await this.fetch({\n          path: [\"v1\", \"keys.createKey\"],\n          method: \"POST\",\n          body: requestBody,\n        });\n      },\n      /**\n       * Retrieves information about the current API key being used for authentication.\n       *\n       * This endpoint returns detailed information about the key making the request,\n       * including its permissions, metadata, remaining usage, and associated API details.\n       * Useful for validating key capabilities and debugging authorization issues.\n       *\n       * @param req - The key identification request\n       * @returns Promise resolving to key information and metadata\n       *\n       * @example\n       * ```typescript\n       * const keyInfo = await client.keys.whoami({\n       *   key: 'sk_1234567890abcdef'\n       * });\n       *\n       * if (!keyInfo.error) {\n       *   console.log('Key ID:', keyInfo.result.id);\n       *   console.log('Permissions:', keyInfo.result.permissions);\n       *   console.log('Remaining uses:', keyInfo.result.remaining);\n       *   console.log('API name:', keyInfo.result.api.name);\n       * }\n       * ```\n       */\n      whoami: async (\n        req: paths[\"/v1/keys.whoami\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.whoami\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.whoami\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Adds new permissions to an existing API key.\n       *\n       * This endpoint allows you to grant additional permissions to a key without\n       * affecting its existing permissions. The new permissions will be merged with\n       * the key's current permission set.\n       *\n       * @param req - The key ID and permissions to add\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.addPermissions({\n       *   keyId: 'key_123',\n       *   permissions: ['read:analytics', 'write:webhooks']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permissions added successfully');\n       *   console.log('Total permissions:', result.result.permissions);\n       * }\n       * ```\n       */\n      addPermissions: async (\n        req: paths[\"/v1/keys.addPermissions\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.addPermissions\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.addPermissions\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Sets the complete permission set for an API key, replacing all existing permissions.\n       *\n       * This endpoint completely replaces the key's current permissions with the provided list.\n       * Any permissions not included in the request will be removed from the key.\n       * Use `addPermissions` if you want to add permissions without affecting existing ones.\n       *\n       * @param req - The key ID and complete permissions list\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.setPermissions({\n       *   keyId: 'key_123',\n       *   permissions: ['read:users', 'write:users', 'admin:system']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permissions set successfully');\n       *   console.log('New permissions:', result.result.permissions);\n       * }\n       * ```\n       */\n      setPermissions: async (\n        req: paths[\"/v1/keys.setPermissions\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.setPermissions\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.setPermissions\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Removes specific permissions from an API key.\n       *\n       * This endpoint removes the specified permissions from the key's current\n       * permission set. Permissions not included in the request will remain unchanged.\n       *\n       * @param req - The key ID and permissions to remove\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.removePermissions({\n       *   keyId: 'key_123',\n       *   permissions: ['admin:system', 'delete:users']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permissions removed successfully');\n       *   console.log('Remaining permissions:', result.result.permissions);\n       * }\n       * ```\n       */\n      removePermissions: async (\n        req: paths[\"/v1/keys.removePermissions\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.removePermissions\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.removePermissions\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Adds role assignments to an existing API key.\n       *\n       * This endpoint assigns additional roles to a key, granting it all permissions\n       * associated with those roles. The new roles will be merged with the key's\n       * current role assignments.\n       *\n       * @param req - The key ID and roles to add\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.addRoles({\n       *   keyId: 'key_123',\n       *   roles: ['reader', 'analytics-viewer']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Roles added successfully');\n       *   console.log('Current roles:', result.result.roles);\n       * }\n       * ```\n       */\n      addRoles: async (\n        req: paths[\"/v1/keys.addRoles\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.addRoles\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.addRoles\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Removes specific role assignments from an API key.\n       *\n       * This endpoint removes the specified roles from the key's current role assignments.\n       * The key will lose all permissions associated with the removed roles.\n       * Roles not included in the request will remain unchanged.\n       *\n       * @param req - The key ID and roles to remove\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.removeRoles({\n       *   keyId: 'key_123',\n       *   roles: ['admin', 'write-access']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Roles removed successfully');\n       *   console.log('Remaining roles:', result.result.roles);\n       * }\n       * ```\n       */\n      removeRoles: async (\n        req: paths[\"/v1/keys.removeRoles\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.removeRoles\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.removeRoles\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Sets the complete role assignment for an API key, replacing all existing roles.\n       *\n       * This endpoint completely replaces the key's current role assignments with the provided list.\n       * Any roles not included in the request will be removed from the key.\n       * Use `addRoles` if you want to add roles without affecting existing ones.\n       *\n       * @param req - The key ID and complete roles list\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.setRoles({\n       *   keyId: 'key_123',\n       *   roles: ['reader', 'api-consumer', 'webhook-manager']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Roles set successfully');\n       *   console.log('New roles:', result.result.roles);\n       * }\n       * ```\n       */\n      setRoles: async (\n        req: paths[\"/v1/keys.setRoles\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.setRoles\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.setRoles\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Updates an existing API key's configuration and metadata.\n       *\n       * This endpoint allows you to modify various aspects of an existing key,\n       * including its name, metadata, enabled status, and other configuration settings.\n       * Only the fields you provide will be updated; others will remain unchanged.\n       *\n       * @param req - The key ID and update parameters\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.update({\n       *   keyId: 'key_123',\n       *   name: 'Updated API Key',\n       *   meta: {\n       *     environment: 'production',\n       *     version: '2.0'\n       *   },\n       *   enabled: false\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Key updated successfully');\n       *   console.log('Updated key:', result.result);\n       * }\n       * ```\n       */\n      update: async (\n        req: paths[\"/v1/keys.updateKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.updateKey\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.updateKey\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Verifies an API key and optionally checks specific permissions.\n       *\n       * This is the primary endpoint for authenticating and authorizing API requests.\n       * It checks if the key is valid, active, and has the required permissions.\n       * The response includes key metadata, usage information, and verification results.\n       *\n       * @template TPermission - Type for permission strings (for better type safety)\n       * @param req - The key to verify and optional permission requirements\n       * @returns Promise resolving to verification results and key information\n       *\n       * @example Basic key verification\n       * ```typescript\n       * const result = await client.keys.verify({\n       *   key: 'sk_1234567890abcdef'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Key is valid:', result.result.valid);\n       *   console.log('Key ID:', result.result.keyId);\n       *   console.log('API name:', result.result.meta?.api?.name);\n       * }\n       * ```\n       *\n       * @example Verification with permission checks\n       * ```typescript\n       * const result = await client.keys.verify({\n       *   key: 'sk_1234567890abcdef',\n       *   authorization: {\n       *     permissions: {\n       *       and: ['read:users', 'write:posts']\n       *     }\n       *   }\n       * });\n       *\n       * if (!result.error && result.result.valid) {\n       *   console.log('Key has required permissions');\n       * }\n       * ```\n       *\n       * @example Complex permission logic\n       * ```typescript\n       * const result = await client.keys.verify({\n       *   key: 'sk_1234567890abcdef',\n       *   authorization: {\n       *     permissions: {\n       *       or: [\n       *         { and: ['admin:system'] },\n       *         { and: ['read:users', 'write:users'] }\n       *       ]\n       *     }\n       *   }\n       * });\n       * ```\n       */\n      verify: async <TPermission extends string = string>(\n        req: Omit<\n          paths[\"/v1/keys.verifyKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n          \"authorization\"\n        > & { authorization?: { permissions: PermissionQuery<TPermission> } },\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.verifyKey\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        // Use default apiId if not provided, but validate it exists\n        const apiId = req.apiId || this.defaultApiId;\n        if (!apiId) {\n          throw new Error(\n            \"apiId is required. Either provide it in the request or set defaultApiId during client initialization\",\n          );\n        }\n\n        const requestBody = {\n          ...req,\n          apiId,\n        };\n\n        return await this.fetch({\n          path: [\"v1\", \"keys.verifyKey\"],\n          method: \"POST\",\n          body: requestBody,\n        });\n      },\n      /**\n       * Permanently deletes an API key.\n       *\n       * This endpoint permanently removes an API key from the system. The key will\n       * immediately become invalid and cannot be recovered. Use with caution.\n       *\n       * @param req - The key ID to delete\n       * @returns Promise resolving to deletion confirmation\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.delete({\n       *   keyId: 'key_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Key deleted successfully');\n       * }\n       * ```\n       */\n      delete: async (\n        req: paths[\"/v1/keys.deleteKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.deleteKey\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.deleteKey\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Updates the remaining usage count for an API key.\n       *\n       * This endpoint allows you to manually adjust the remaining usage count for a key.\n       * Useful for implementing custom billing logic, granting additional usage credits,\n       * or resetting usage counters.\n       *\n       * @param req - The key ID and new remaining count\n       * @returns Promise resolving to the updated key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.updateRemaining({\n       *   keyId: 'key_123',\n       *   op: 'set',\n       *   value: 1000\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Usage updated successfully');\n       *   console.log('New remaining count:', result.result.remaining);\n       * }\n       * ```\n       *\n       * @example Increment usage allowance\n       * ```typescript\n       * const result = await client.keys.updateRemaining({\n       *   keyId: 'key_123',\n       *   op: 'increment',\n       *   value: 500\n       * });\n       * ```\n       */\n      updateRemaining: async (\n        req: paths[\"/v1/keys.updateRemaining\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.updateRemaining\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.updateRemaining\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves detailed information about a specific API key.\n       *\n       * This endpoint returns comprehensive information about a key including its\n       * configuration, metadata, permissions, usage statistics, and creation details.\n       *\n       * @param req - Query parameters including the key ID\n       * @returns Promise resolving to the key information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.get({\n       *   keyId: 'key_123'\n       * });\n       *\n       * if (!result.error) {\n       *   const key = result.result;\n       *   console.log('Key name:', key.name);\n       *   console.log('Created:', new Date(key.createdAt));\n       *   console.log('Permissions:', key.permissions);\n       *   console.log('Usage:', key.usage);\n       *   console.log('Remaining:', key.remaining);\n       * }\n       * ```\n       */\n      get: async (\n        req: paths[\"/v1/keys.getKey\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.getKey\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.getKey\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Retrieves verification logs and analytics for an API key.\n       *\n       * This endpoint returns a paginated list of verification attempts for a specific key,\n       * including successful and failed attempts, timestamps, and associated metadata.\n       * Useful for monitoring key usage patterns and debugging authentication issues.\n       *\n       * @param req - Query parameters including key ID and pagination options\n       * @returns Promise resolving to verification log entries\n       *\n       * @example\n       * ```typescript\n       * const result = await client.keys.getVerifications({\n       *   keyId: 'key_123',\n       *   limit: 50,\n       *   offset: 0\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Total verifications:', result.result.total);\n       *   result.result.verifications.forEach(v => {\n       *     console.log(`${v.time}: ${v.success ? 'SUCCESS' : 'FAILED'} - ${v.requestId}`);\n       *   });\n       * }\n       * ```\n       */\n      getVerifications: async (\n        req: paths[\"/v1/keys.getVerifications\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/keys.getVerifications\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"keys.getVerifications\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * API management endpoints.\n   *\n   * These endpoints provide comprehensive management of API configurations,\n   * including creation, deletion, key management, and analytics. APIs represent\n   * the top-level containers for organizing and managing access to your services.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Creating and managing an API\n   * ```typescript\n   * // Create a new API\n   * const newApi = await client.apis.create({\n   *   name: 'My Service API',\n   *   workspaceId: 'ws_123'\n   * });\n   *\n   * if (!newApi.error) {\n   *   console.log('API created:', newApi.result.id);\n   *\n   *   // Get API details\n   *   const apiDetails = await client.apis.get({\n   *     apiId: newApi.result.id\n   *   });\n   *\n   *   // List all keys for this API\n   *   const keys = await client.apis.listKeys({\n   *     apiId: newApi.result.id\n   *   });\n   * }\n   * ```\n   */\n  public get apis() {\n    return {\n      /**\n       * Creates a new fluent builder for API creation.\n       *\n       * The builder pattern provides a more intuitive way to create APIs\n       * with method chaining, validation, and a cleaner API.\n       *\n       * @returns A new ApiBuilder instance for fluent API creation\n       *\n       * @example Using the builder pattern\n       * ```typescript\n       * const result = await client.apis.builder()\n       *   .withName('Payment Processing API')\n       *   .create();\n       *\n       * if (!result.error) {\n       *   console.log('Created API:', result.result.id);\n       * }\n       * ```\n       *\n       * @example With validation\n       * ```typescript\n       * const builder = client.apis.builder()\n       *   .withName('My API');\n       *\n       * const validation = builder.validate();\n       * if (validation.valid) {\n       *   const result = await builder.create();\n       * } else {\n       *   console.error('Validation errors:', validation.errors);\n       * }\n       * ```\n       */\n      builder: (): ApiBuilder => new ApiBuilder(this),\n\n      /**\n       * Creates a new API configuration.\n       *\n       * This endpoint creates a new API container that can be used to organize\n       * and manage API keys, permissions, and access controls for your service.\n       *\n       * @param req - API creation configuration\n       * @returns Promise resolving to the created API details\n       *\n       * @example\n       * ```typescript\n       * const result = await client.apis.create({\n       *   name: 'Payment Processing API',\n       *   workspaceId: 'ws_123456'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('API created successfully');\n       *   console.log('API ID:', result.result.id);\n       *   console.log('API Name:', result.result.name);\n       * }\n       * ```\n       */\n      create: async (\n        req: paths[\"/v1/apis.createApi\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/apis.createApi\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"apis.createApi\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Permanently deletes an API configuration.\n       *\n       * This endpoint permanently removes an API and all of its associated keys.\n       * All keys belonging to this API will be immediately invalidated and cannot\n       * be recovered. Use with extreme caution.\n       *\n       * @param req - The API ID to delete\n       * @returns Promise resolving to deletion confirmation\n       *\n       * @example\n       * ```typescript\n       * const result = await client.apis.delete({\n       *   apiId: 'api_123456'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('API deleted successfully');\n       * }\n       * ```\n       */\n      delete: async (\n        req: paths[\"/v1/apis.deleteApi\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/apis.deleteApi\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"apis.deleteApi\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Deletes multiple API keys belonging to a specific API.\n       *\n       * This endpoint allows you to delete multiple keys at once for bulk operations.\n       * All specified keys will be immediately invalidated and cannot be recovered.\n       *\n       * @param req - The API ID and array of key IDs to delete\n       * @returns Promise resolving to deletion results\n       *\n       * @example\n       * ```typescript\n       * const result = await client.apis.deleteKeys({\n       *   apiId: 'api_123456',\n       *   keyIds: ['key_123', 'key_456', 'key_789']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Keys deleted successfully');\n       *   console.log('Deleted count:', result.result.deleted);\n       * }\n       * ```\n       */\n      deleteKeys: async (\n        req: paths[\"/v1/apis.deleteKeys\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/apis.deleteKeys\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"apis.deleteKeys\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves detailed information about a specific API.\n       *\n       * This endpoint returns comprehensive information about an API including its\n       * configuration, metadata, key statistics, and usage information.\n       *\n       * @param req - Query parameters including the API ID\n       * @returns Promise resolving to the API information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.apis.get({\n       *   apiId: 'api_123456'\n       * });\n       *\n       * if (!result.error) {\n       *   const api = result.result;\n       *   console.log('API name:', api.name);\n       *   console.log('Created:', new Date(api.createdAt));\n       *   console.log('Total keys:', api.keyCount);\n       *   console.log('Workspace:', api.workspaceId);\n       * }\n       * ```\n       */\n      get: async (\n        req: paths[\"/v1/apis.getApi\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/apis.getApi\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"apis.getApi\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Lists all API keys belonging to a specific API.\n       *\n       * This endpoint returns a paginated list of all keys associated with an API,\n       * including their metadata, usage statistics, and current status.\n       *\n       * @param req - Query parameters including API ID and pagination options\n       * @returns Promise resolving to the list of API keys\n       *\n       * @example\n       * ```typescript\n       * const result = await client.apis.listKeys({\n       *   apiId: 'api_123456',\n       *   limit: 25,\n       *   offset: 0\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Total keys:', result.result.total);\n       *   result.result.keys.forEach(key => {\n       *     console.log(`Key: ${key.id} - ${key.name || 'Unnamed'} - ${key.enabled ? 'Enabled' : 'Disabled'}`);\n       *   });\n       * }\n       * ```\n       */\n      listKeys: async (\n        req: paths[\"/v1/apis.listKeys\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/apis.listKeys\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        // Use default apiId if not provided\n        const queryParams = {\n          ...req,\n          apiId: req.apiId || this.defaultApiId,\n        } as Record<string, string | number | boolean | string[] | null>;\n\n        if (!queryParams.apiId) {\n          throw new Error(\n            \"apiId is required. Either pass it in the request or set a default apiId when initializing the client.\",\n          );\n        }\n\n        return await this.fetch({\n          path: [\"v1\", \"apis.listKeys\"],\n          method: \"GET\",\n          query: queryParams,\n        });\n      },\n    };\n  }\n\n  /**\n   * Permission and role management endpoints.\n   *\n   * These endpoints provide comprehensive management of permissions and roles\n   * for implementing fine-grained access control in your applications.\n   * Permissions represent individual capabilities, while roles are collections\n   * of permissions that can be assigned to API keys.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Setting up permissions and roles\n   * ```typescript\n   * // Create individual permissions\n   * const readPerm = await client.permissions.createPermission({\n   *   name: 'read:users',\n   *   description: 'Read user data'\n   * });\n   *\n   * const writePerm = await client.permissions.createPermission({\n   *   name: 'write:users',\n   *   description: 'Create and update user data'\n   * });\n   *\n   * // Create a role with multiple permissions\n   * const userRole = await client.permissions.createRole({\n   *   name: 'user-manager',\n   *   description: 'Can manage user accounts',\n   *   permissions: ['read:users', 'write:users']\n   * });\n   *\n   * // Assign role to an API key\n   * await client.keys.addRoles({\n   *   keyId: 'key_123',\n   *   roles: ['user-manager']\n   * });\n   * ```\n   */\n  public get permissions() {\n    return {\n      /**\n       * Creates a new fluent builder for role creation.\n       *\n       * The builder pattern provides an intuitive way to create roles\n       * with method chaining and validation.\n       *\n       * @returns A new RoleBuilder instance for fluent role creation\n       *\n       * @example Using the role builder\n       * ```typescript\n       * const result = await client.permissions.roleBuilder()\n       *   .withName('content-manager')\n       *   .withDescription('Can manage content and posts')\n       *   .create();\n       *\n       * if (!result.error) {\n       *   console.log('Created role:', result.result.id);\n       * }\n       * ```\n       */\n      roleBuilder: (): RoleBuilder => new RoleBuilder(this),\n\n      /**\n       * Creates a new fluent builder for permission creation.\n       *\n       * The builder pattern provides an intuitive way to create permissions\n       * with method chaining and validation.\n       *\n       * @returns A new PermissionBuilder instance for fluent permission creation\n       *\n       * @example Using the permission builder\n       * ```typescript\n       * const result = await client.permissions.permissionBuilder()\n       *   .withName('manage:webhooks')\n       *   .withDescription('Permission to create and manage webhooks')\n       *   .create();\n       *\n       * if (!result.error) {\n       *   console.log('Created permission:', result.result.id);\n       * }\n       * ```\n       */\n      permissionBuilder: (): PermissionBuilder => new PermissionBuilder(this),\n\n      /**\n       * Creates a new role with specified permissions.\n       *\n       * Roles are collections of permissions that can be assigned to API keys\n       * for simplified access control management. This endpoint creates a new\n       * role and assigns it the specified permissions.\n       *\n       * @param req - Role creation configuration\n       * @returns Promise resolving to the created role details\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.createRole({\n       *   name: 'content-editor',\n       *   description: 'Can create and edit content',\n       *   permissions: ['read:posts', 'write:posts', 'edit:posts']\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Role created:', result.result.id);\n       *   console.log('Role name:', result.result.name);\n       * }\n       * ```\n       */\n      createRole: async (\n        req: paths[\"/v1/permissions.createRole\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.createRole\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.createRole\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves detailed information about a specific role.\n       *\n       * This endpoint returns comprehensive information about a role including\n       * its permissions, description, and usage statistics.\n       *\n       * @param req - Query parameters including the role ID\n       * @returns Promise resolving to the role information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.getRole({\n       *   roleId: 'role_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Role name:', result.result.name);\n       *   console.log('Description:', result.result.description);\n       *   console.log('Permissions:', result.result.permissions);\n       * }\n       * ```\n       */\n      getRole: async (\n        req: paths[\"/v1/permissions.getRole\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.getRole\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.getRole\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Lists all roles in the workspace.\n       *\n       * This endpoint returns a paginated list of all roles with their\n       * basic information and permission counts.\n       *\n       * @param req - Optional query parameters for filtering and pagination\n       * @returns Promise resolving to the list of roles\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.listRoles({\n       *   limit: 20,\n       *   offset: 0\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Total roles:', result.result.total);\n       *   result.result.roles.forEach(role => {\n       *     console.log(`${role.name}: ${role.permissions.length} permissions`);\n       *   });\n       * }\n       * ```\n       */\n      listRoles: async (\n        req?: paths[\"/v1/permissions.listRoles\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.listRoles\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.listRoles\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Permanently deletes a role.\n       *\n       * This endpoint permanently removes a role from the system. Any API keys\n       * that were assigned this role will lose the associated permissions.\n       *\n       * @param req - The role ID to delete\n       * @returns Promise resolving to deletion confirmation\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.deleteRole({\n       *   roleId: 'role_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Role deleted successfully');\n       * }\n       * ```\n       */\n      deleteRole: async (\n        req: paths[\"/v1/permissions.deleteRole\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.deleteRole\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.deleteRole\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Creates a new permission.\n       *\n       * Permissions represent individual capabilities or actions that can be\n       * granted to API keys. They are the building blocks for role-based access control.\n       *\n       * @param req - Permission creation configuration\n       * @returns Promise resolving to the created permission details\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.createPermission({\n       *   name: 'delete:posts',\n       *   description: 'Permission to delete blog posts'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permission created:', result.result.id);\n       *   console.log('Permission name:', result.result.name);\n       * }\n       * ```\n       */\n      createPermission: async (\n        req: paths[\"/v1/permissions.createPermission\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.createPermission\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.createPermission\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves detailed information about a specific permission.\n       *\n       * This endpoint returns information about a permission including its\n       * name, description, and usage statistics.\n       *\n       * @param req - Query parameters including the permission ID\n       * @returns Promise resolving to the permission information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.getPermission({\n       *   permissionId: 'perm_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permission name:', result.result.name);\n       *   console.log('Description:', result.result.description);\n       *   console.log('Created:', new Date(result.result.createdAt));\n       * }\n       * ```\n       */\n      getPermission: async (\n        req: paths[\"/v1/permissions.getPermission\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.getPermission\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.getPermission\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Lists all permissions in the workspace.\n       *\n       * This endpoint returns a paginated list of all permissions with their\n       * basic information and usage statistics.\n       *\n       * @param req - Optional query parameters for filtering and pagination\n       * @returns Promise resolving to the list of permissions\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.listPermissions({\n       *   limit: 50,\n       *   offset: 0\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Total permissions:', result.result.total);\n       *   result.result.permissions.forEach(perm => {\n       *     console.log(`${perm.name}: ${perm.description}`);\n       *   });\n       * }\n       * ```\n       */\n      listPermissions: async (\n        req?: paths[\"/v1/permissions.listPermissions\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.listPermissions\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.listPermissions\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Permanently deletes a permission.\n       *\n       * This endpoint permanently removes a permission from the system. Any roles\n       * or API keys that had this permission will lose it immediately.\n       *\n       * @param req - The permission ID to delete\n       * @returns Promise resolving to deletion confirmation\n       *\n       * @example\n       * ```typescript\n       * const result = await client.permissions.deletePermission({\n       *   permissionId: 'perm_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Permission deleted successfully');\n       * }\n       * ```\n       */\n      deletePermission: async (\n        req: paths[\"/v1/permissions.deletePermission\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/permissions.deletePermission\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"permissions.deletePermission\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Rate limiting and quota management endpoints.\n   *\n   * These endpoints provide advanced rate limiting capabilities including\n   * checking rate limits, setting per-key overrides, and managing quota\n   * allocations for fine-grained API usage control.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Basic rate limiting check\n   * ```typescript\n   * // Check if an identifier is rate limited\n   * const result = await client.ratelimits.limit({\n   *   namespace: 'user-actions',\n   *   identifier: 'user_123',\n   *   limit: 10,\n   *   duration: 60000 // 1 minute\n   * });\n   *\n   * if (!result.error) {\n   *   if (result.result.pass) {\n   *     console.log('Request allowed');\n   *     console.log('Remaining:', result.result.remaining);\n   *   } else {\n   *     console.log('Rate limited. Try again in:', result.result.reset);\n   *   }\n   * }\n   * ```\n   *\n   * @example Setting rate limit overrides\n   * ```typescript\n   * // Set a custom rate limit for a specific API key\n   * await client.ratelimits.setOverride({\n   *   namespace: 'api-calls',\n   *   identifier: 'key_123',\n   *   limit: 1000,\n   *   duration: 3600000 // 1 hour\n   * });\n   * ```\n   */\n  public get ratelimits() {\n    return {\n      /**\n       * Performs a rate limiting check for a specific identifier.\n       *\n       * This endpoint checks if a request should be allowed based on the current\n       * rate limit configuration. It returns the current state and remaining quota.\n       *\n       * @param req - Rate limit check parameters\n       * @returns Promise resolving to rate limit decision and current state\n       *\n       * @example\n       * ```typescript\n       * const result = await client.ratelimits.limit({\n       *   namespace: 'user-api-calls',\n       *   identifier: 'user_123',\n       *   limit: 100,\n       *   duration: 3600000 // 1 hour in milliseconds\n       * });\n       *\n       * if (!result.error) {\n       *   if (result.result.pass) {\n       *     console.log('Request allowed');\n       *     console.log('Remaining requests:', result.result.remaining);\n       *     console.log('Reset time:', new Date(result.result.reset));\n       *   } else {\n       *     console.log('Rate limited!');\n       *     console.log('Retry after:', new Date(result.result.reset));\n       *   }\n       * }\n       * ```\n       */\n      limit: async (\n        req: paths[\"/v1/ratelimits.limit\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/ratelimits.limit\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"ratelimits.limit\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves rate limit override configuration for a specific identifier.\n       *\n       * This endpoint returns the custom rate limit settings that have been\n       * configured for a particular namespace and identifier combination.\n       *\n       * @param req - Query parameters including namespace and identifier\n       * @returns Promise resolving to the override configuration\n       *\n       * @example\n       * ```typescript\n       * const result = await client.ratelimits.getOverride({\n       *   namespace: 'premium-users',\n       *   identifier: 'user_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Override limit:', result.result.limit);\n       *   console.log('Override duration:', result.result.duration);\n       * }\n       * ```\n       */\n      getOverride: async (\n        req: paths[\"/v1/ratelimits.getOverride\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/ratelimits.getOverride\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"ratelimits.getOverride\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Lists all rate limit overrides for a specific namespace.\n       *\n       * This endpoint returns a paginated list of all custom rate limit\n       * configurations that have been set for identifiers in the specified namespace.\n       *\n       * @param req - Query parameters including namespace and pagination options\n       * @returns Promise resolving to the list of rate limit overrides\n       *\n       * @example\n       * ```typescript\n       * const result = await client.ratelimits.listOverrides({\n       *   namespace: 'api-keys',\n       *   limit: 25,\n       *   offset: 0\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Total overrides:', result.result.total);\n       *   result.result.overrides.forEach(override => {\n       *     console.log(`${override.identifier}: ${override.limit}/${override.duration}ms`);\n       *   });\n       * }\n       * ```\n       */\n      listOverrides: async (\n        req: paths[\"/v1/ratelimits.listOverrides\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/ratelimits.listOverrides\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"ratelimits.listOverrides\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      /**\n       * Sets a custom rate limit override for a specific identifier.\n       *\n       * This endpoint creates or updates a rate limit override that will be used\n       * instead of the default rate limit configuration for the specified identifier.\n       *\n       * @param req - Rate limit override configuration\n       * @returns Promise resolving to the created/updated override\n       *\n       * @example\n       * ```typescript\n       * const result = await client.ratelimits.setOverride({\n       *   namespace: 'premium-users',\n       *   identifier: 'user_123',\n       *   limit: 1000,\n       *   duration: 3600000 // 1 hour\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Override created successfully');\n       * }\n       * ```\n       */\n      setOverride: async (\n        req: paths[\"/v1/ratelimits.setOverride\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/ratelimits.setOverride\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"ratelimits.setOverride\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Removes a rate limit override for a specific identifier.\n       *\n       * This endpoint deletes a custom rate limit override, causing the identifier\n       * to fall back to the default rate limit configuration.\n       *\n       * @param req - The namespace and identifier of the override to delete\n       * @returns Promise resolving to deletion confirmation\n       *\n       * @example\n       * ```typescript\n       * const result = await client.ratelimits.deleteOverride({\n       *   namespace: 'premium-users',\n       *   identifier: 'user_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Override deleted successfully');\n       * }\n       * ```\n       */\n      deleteOverride: async (\n        req: paths[\"/v1/ratelimits.deleteOverride\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/ratelimits.deleteOverride\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"ratelimits.deleteOverride\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Identity management endpoints.\n   *\n   * These endpoints provide management of user identities and their associated\n   * metadata for implementing user-based access control and tracking.\n   * Identities can be linked to API keys for user-specific operations.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Creating and managing identities\n   * ```typescript\n   * // Create a new identity\n   * const identity = await client.identities.create({\n   *   externalId: 'user_123',\n   *   meta: {\n   *     email: 'user@example.com',\n   *     plan: 'premium'\n   *   }\n   * });\n   *\n   * if (!identity.error) {\n   *   console.log('Identity created:', identity.result.id);\n   *\n   *   // Get identity details\n   *   const details = await client.identities.get({\n   *     identityId: identity.result.id\n   *   });\n   * }\n   * ```\n   */\n  public get identities() {\n    return {\n      /**\n       * Creates a new identity record.\n       *\n       * This endpoint creates a new identity that can be associated with API keys\n       * for user-specific operations and access control.\n       *\n       * @param req - Identity creation configuration\n       * @returns Promise resolving to the created identity details\n       *\n       * @example\n       * ```typescript\n       * const result = await client.identities.create({\n       *   externalId: 'user_456',\n       *   meta: {\n       *     email: 'alice@company.com',\n       *     department: 'engineering',\n       *     role: 'senior-developer'\n       *   }\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('Identity created:', result.result.id);\n       *   console.log('External ID:', result.result.externalId);\n       * }\n       * ```\n       */\n      create: async (\n        req: paths[\"/v1/identities.createIdentity\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/identities.createIdentity\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"identities.createIdentity\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Retrieves detailed information about a specific identity.\n       *\n       * This endpoint returns comprehensive information about an identity including\n       * its metadata, associated keys, and usage statistics.\n       *\n       * @param req - Query parameters including the identity ID\n       * @returns Promise resolving to the identity information\n       *\n       * @example\n       * ```typescript\n       * const result = await client.identities.get({\n       *   identityId: 'id_123'\n       * });\n       *\n       * if (!result.error) {\n       *   console.log('External ID:', result.result.externalId);\n       *   console.log('Metadata:', result.result.meta);\n       *   console.log('Created:', new Date(result.result.createdAt));\n       * }\n       * ```\n       */\n      get: async (\n        req: paths[\"/v1/identities.getIdentity\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/identities.getIdentity\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"identities.getIdentity\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      list: async (\n        req: paths[\"/v1/identities.listIdentities\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/identities.listIdentities\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"identities.listIdentities\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      delete: async (\n        req: paths[\"/v1/identities.deleteIdentity\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/identities.deleteIdentity\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"identities.deleteIdentity\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      update: async (\n        req: paths[\"/v1/identities.updateIdentity\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/identities.updateIdentity\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"identities.updateIdentity\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n    };\n  }\n\n  public get analytics() {\n    return {\n      getVerifications: async (\n        req: paths[\"/v1/analytics.getVerifications\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/analytics.getVerifications\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"analytics.getVerifications\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n    };\n  }\n\n  public get migrations() {\n    return {\n      createKeys: async (\n        req: paths[\"/v1/migrations.createKeys\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/migrations.createKeys\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"migrations.createKeys\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      enqueueKeys: async (\n        req: paths[\"/v1/migrations.enqueueKeys\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/migrations.enqueueKeys\"][\"post\"][\"responses\"][\"202\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"migrations.enqueueKeys\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Connection management for banking providers\n   */\n  public get connections() {\n    return {\n      status: async (\n        req: paths[\"/v1/api.connections.status\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.status\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", \"status\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      delete: async (\n        req: NonNullable<\n          operations[\"delete.connections\"][\"requestBody\"]\n        >[\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          operations[\"delete.connections\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", \"delete\"],\n          method: \"DELETE\",\n          body: req,\n        });\n      },\n      gocardless: async (\n        req: operations[\"get.connections.gocardless\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          operations[\"get.connections.gocardless\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", \"gocardless\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      get: async (\n        req: paths[\"/v1/api.connections/{reference}\"][\"get\"][\"parameters\"][\"path\"] &\n          paths[\"/v1/api.connections/{reference}\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections/{reference}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", req.reference],\n          method: \"GET\",\n          query: req,\n        });\n      },\n\n      /**\n       * Get Connection Accounts\n       *\n       * Retrieves all accounts associated with financial connections.\n       * This endpoint provides access to account information from various financial\n       * providers including bank accounts, credit cards, and other financial accounts.\n       *\n       * @param req - Query parameters for filtering connection accounts\n       * @returns Promise resolving to connection accounts data\n       *\n       * @example\n       * ```typescript\n       * const accounts = await client.connections.accounts({\n       *   connectionId: 'conn_123456789'\n       * });\n       *\n       * if (accounts.result) {\n       *   console.log('Found accounts:', accounts.result.data);\n       * }\n       * ```\n       */\n      accounts: async (\n        req: paths[\"/v1/api.connections.accounts\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.accounts\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", \"accounts\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n\n      /**\n       * Get Account Balance\n       *\n       * Retrieves the current balance for a specific financial account.\n       * This endpoint provides real-time balance information for bank accounts,\n       * credit cards, and other financial accounts.\n       *\n       * @param req - Query parameters specifying the account\n       * @returns Promise resolving to account balance data\n       *\n       * @example\n       * ```typescript\n       * const balance = await client.connections.accountBalance({\n       *   accountId: 'acc_123456789',\n       *   connectionId: 'conn_123456789'\n       * });\n       *\n       * if (balance.result) {\n       *   console.log('Account balance:', balance.result.data);\n       * }\n       * ```\n       */\n      accountBalance: async (\n        req: paths[\"/v1/api.connections.accounts.balance\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.accounts.balance\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"connections\", \"accounts\", \"balance\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Financial services API\n   */\n  public get financial() {\n    return {\n      transactions: async (\n        req: paths[\"/v1/api.transactions\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.transactions\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.transactions\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      recurringTransactions: async (\n        req: paths[\"/v1/api.transactions/recurring\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.transactions/recurring\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.transactions\", \"recurring\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      health: async (\n        req: paths[\"/v1/api.health\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.health\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.health\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      institutions: async (\n        req: paths[\"/v1/api.institutions\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.institutions\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.institutions\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      institutionUsage: async (\n        req: operations[\"update.institutions.usage\"][\"parameters\"][\"path\"] &\n          operations[\"update.institutions.usage\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          operations[\"update.institutions.usage\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.institutions\", req.id, \"usage\"],\n          method: \"PUT\",\n          query: req,\n        });\n      },\n      rates: async (\n        req: paths[\"/v1/api.rates\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.rates\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.rates\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      statements: async (\n        req: paths[\"/v1/api.statements\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.statements\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.statements\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      statementsPdf: async (\n        req: paths[\"/v1/api.statements/pdf\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.statements/pdf\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/pdf\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.statements\", \"pdf\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      connections: async (\n        req: paths[\"/v1/api.connections.accounts\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.accounts\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.connections.accounts\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      connectionsBalance: async (\n        req: paths[\"/v1/api.connections.accounts.balance\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.accounts.balance\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.connections.accounts.balance\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      connectionsStatus: async (\n        req: paths[\"/v1/api.connections.status\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.status\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.connections.status\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n      connectionsDelete: async (\n        req: paths[\"/v1/api.connections.delete\"][\"delete\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections.delete\"][\"delete\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.connections.delete\"],\n          method: \"DELETE\",\n          query: req,\n        });\n      },\n      connectionsGet: async (\n        req: paths[\"/v1/api.connections/{reference}\"][\"get\"][\"parameters\"][\"path\"] &\n          paths[\"/v1/api.connections/{reference}\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.connections/{reference}\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"v1\", \"api.connections\", req.reference],\n          method: \"GET\",\n          query: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Banking provider integrations\n   */\n  public get banking() {\n    return {\n      gocardless: {\n        link: async (\n          req: NonNullable<\n            paths[\"/v1/api.gocardless/link\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.gocardless/link\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"api.gocardless\", \"link\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        agreement: async (\n          req: NonNullable<\n            paths[\"/v1/api.gocardless/agreement\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.gocardless/agreement\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"api.gocardless\", \"agreement\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        exchange: async (\n          req: NonNullable<\n            paths[\"/v1/api.gocardless/exchange\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.gocardless/exchange\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"api.gocardless\", \"exchange\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      plaid: {\n        link: async (\n          req: NonNullable<\n            paths[\"/v1/api.plaid/link\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.plaid/link\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"api.plaid\", \"link\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        exchange: async (\n          req: NonNullable<\n            paths[\"/v1/api.plaid/exchange\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.plaid/exchange\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"api.plaid\", \"exchange\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      enablebanking: {\n        link: async (\n          req: NonNullable<\n            paths[\"/v1/api.enablebanking.link\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.enablebanking.link\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"financials\", \"enablebanking\", \"link\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        exchange: async (\n          req: NonNullable<\n            paths[\"/v1/api.enablebanking.exchange\"][\"post\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/api.enablebanking.exchange\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"financials\", \"enablebanking\", \"exchange\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n    };\n  }\n\n  /**\n   * Legacy endpoints for backward compatibility\n   */\n  public get legacy() {\n    return {\n      keys: {\n        create: async (\n          req: paths[\"/v1/legacy/keys\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/legacy/keys\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"legacy\", \"keys\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        verify: async (\n          req: paths[\"/v1/legacy/keys/verify\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/legacy/keys/verify\"][\"post\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"legacy\", \"keys\", \"verify\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        list: async (\n          req: paths[\"/v1/legacy/apis/{legacyApiId}/keys\"][\"get\"][\"parameters\"][\"path\"] &\n            paths[\"/v1/legacy/apis/{legacyApiId}/keys\"][\"get\"][\"parameters\"][\"query\"],\n        ): Promise<\n          Result<\n            paths[\"/v1/legacy/apis/{legacyApiId}/keys\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"v1\", \"legacy\", \"apis\", req.legacyApiId, \"keys\"],\n            method: \"GET\",\n            query: req,\n          });\n        },\n      },\n    };\n  }\n\n  /**\n   * AI-powered transaction analysis and enrichment services.\n   *\n   * This comprehensive suite of AI endpoints provides advanced transaction analysis,\n   * categorization, tax optimization, compliance checking, and business intelligence.\n   * All endpoints use state-of-the-art machine learning models to provide accurate\n   * and actionable insights for financial data.\n   *\n   * @public\n   * @readonly\n   *\n   * @example Basic transaction enrichment\n   * ```typescript\n   * const result = await client.ai.enrich({\n   *   data: [{\n   *     id: 'txn_123',\n   *     date: '2024-01-15',\n   *     description: 'AMAZON.COM*RETAIL',\n   *     amount: 4999, // $49.99 in cents\n   *     currency: 'USD'\n   *   }]\n   * });\n   *\n   * if (!result.error) {\n   *   const enriched = result.result.enrichedTransactions[0];\n   *   console.log('Category:', enriched.category);\n   *   console.log('Merchant:', enriched.merchant);\n   *   console.log('Confidence:', enriched.confidence);\n   * }\n   * ```\n   *\n   * @example Tax compliance analysis\n   * ```typescript\n   * // Analyze tax categories for business expenses\n   * const taxAnalysis = await client.ai.taxCategories.single({\n   *   transaction: {\n   *     id: 'txn_456',\n   *     description: 'Office supplies from Staples',\n   *     amount: 12500 // $125.00\n   *   },\n   *   countryCode: 'US',\n   *   taxYear: 2024,\n   *   businessType: 'corporation'\n   * });\n   *\n   * if (!taxAnalysis.error) {\n   *   console.log('Tax category:', taxAnalysis.result.category);\n   *   console.log('Deductible:', taxAnalysis.result.deductible);\n   *   console.log('Documentation required:', taxAnalysis.result.documentationRequired);\n   * }\n   * ```\n   *\n   * @example Receipt requirement analysis\n   * ```typescript\n   * const receiptAnalysis = await client.ai.receiptRequirements.single({\n   *   transaction: {\n   *     id: 'txn_789',\n   *     description: 'Business dinner at The Capital Grille',\n   *     amount: 15000 // $150.00\n   *   },\n   *   countryCode: 'US',\n   *   taxYear: 2024,\n   *   businessType: 'sole_proprietor'\n   * });\n   *\n   * if (!receiptAnalysis.error) {\n   *   console.log('Receipt required:', receiptAnalysis.result.receiptRequired);\n   *   console.log('Threshold:', receiptAnalysis.result.threshold);\n   *   console.log('Retention period:', receiptAnalysis.result.retentionPeriod);\n   * }\n   * ```\n   */\n  public get ai() {\n    return {\n      /**\n       * Enriches transaction data with AI-powered categorization and merchant identification.\n       *\n       * This endpoint analyzes transaction descriptions and amounts to automatically\n       * categorize transactions, identify merchants, and extract relevant metadata.\n       * Perfect for expense management, budgeting, and financial analytics.\n       *\n       * @param req - Array of transactions to enrich\n       * @returns Promise resolving to enriched transaction data\n       *\n       * @example Enrich multiple transactions\n       * ```typescript\n       * const result = await client.ai.enrich({\n       *   data: [\n       *     {\n       *       id: 'txn_1',\n       *       description: 'UBER *TRIP',\n       *       amount: 1250, // $12.50\n       *       currency: 'USD',\n       *       date: '2024-01-15'\n       *     },\n       *     {\n       *       id: 'txn_2',\n       *       description: 'STARBUCKS #1234',\n       *       amount: 545, // $5.45\n       *       currency: 'USD',\n       *       date: '2024-01-15'\n       *     }\n       *   ]\n       * });\n       *\n       * if (!result.error) {\n       *   result.result.enrichedTransactions.forEach(txn => {\n       *     console.log(`${txn.id}: ${txn.category} (${txn.confidence}% confident)`);\n       *   });\n       * }\n       * ```\n       */\n      enrich: async (\n        req: NonNullable<\n          operations[\"enrich-transactions\"][\"requestBody\"]\n        >[\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          operations[\"enrich-transactions\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      /**\n       * Provides comprehensive, detailed analysis of a single transaction.\n       *\n       * This advanced endpoint performs deep analysis including frequency prediction,\n       * purpose identification, merchant details, location inference, and spending\n       * pattern analysis. Ideal for detailed financial insights and business intelligence.\n       *\n       * @param req - Single transaction for detailed analysis\n       * @returns Promise resolving to comprehensive transaction insights\n       *\n       * @example Detailed analysis of a business expense\n       * ```typescript\n       * const result = await client.ai.detailedEnrichment({\n       *   transaction: {\n       *     id: 'txn_detailed_1',\n       *     description: 'ADOBE CREATIVE CLOUD',\n       *     amount: 5999, // $59.99\n       *     currency: 'USD',\n       *     date: '2024-01-15'\n       *   }\n       * });\n       *\n       * if (!result.error) {\n       *   const analysis = result.result;\n       *   console.log('Category:', analysis.category);\n       *   console.log('Merchant:', analysis.merchantDetails);\n       *   console.log('Business purpose:', analysis.businessPurpose);\n       *   console.log('Frequency prediction:', analysis.frequencyPrediction);\n       *   console.log('Tax implications:', analysis.taxImplications);\n       * }\n       * ```\n       */\n      detailedEnrichment: async (\n        req: NonNullable<\n          operations[\"detailed-enrichment\"][\"requestBody\"]\n        >[\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          operations[\"detailed-enrichment\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"detailed\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      categorize: async (\n        req: NonNullable<\n          operations[\"category-prediction\"][\"requestBody\"]\n        >[\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          operations[\"category-prediction\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"categorize\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      multiModel: async (\n        req: NonNullable<\n          operations[\"multi-model-enrichment\"][\"requestBody\"]\n        >[\"content\"][\"application/json\"],\n      ): Promise<\n        Result<\n          operations[\"multi-model-enrichment\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"multi\"],\n          method: \"POST\",\n          body: req,\n        });\n      },\n      taxCategories: {\n        /**\n         * Analyzes a single transaction to determine its tax category and deductibility.\n         *\n         * This endpoint classifies transactions into appropriate tax categories based on\n         * the business type, country regulations, and transaction details. Essential for\n         * tax preparation, compliance, and financial planning.\n         *\n         * @param req - Transaction and tax context for analysis\n         * @returns Promise resolving to tax category classification\n         *\n         * @example Analyze office supply purchase\n         * ```typescript\n         * const result = await client.ai.taxCategories.single({\n         *   transaction: {\n         *     id: 'txn_office_1',\n         *     description: 'Office Depot - Paper & Supplies',\n         *     amount: 8750, // $87.50\n         *     currency: 'USD'\n         *   },\n         *   countryCode: 'US',\n         *   taxYear: 2024,\n         *   businessType: 'sole_proprietor'\n         * });\n         *\n         * if (!result.error) {\n         *   console.log('Tax category:', result.result.category);\n         *   console.log('Deductible amount:', result.result.deductibleAmount);\n         *   console.log('Deduction percentage:', result.result.deductionPercentage);\n         *   console.log('IRS code:', result.result.irsCode);\n         * }\n         * ```\n         */\n        single: async (\n          req: NonNullable<\n            operations[\"tax-category-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"tax-category-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"tax-categories\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"tax-category-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"tax-category-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"tax-categories\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      businessPurpose: {\n        single: async (\n          req: NonNullable<\n            operations[\"business-purpose-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"business-purpose-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"business-purpose\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"business-purpose-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"business-purpose-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"business-purpose\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      receiptRequirements: {\n        single: async (\n          req: NonNullable<\n            operations[\"receipt-requirement-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"receipt-requirement-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"receipt-requirements\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"receipt-requirement-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"receipt-requirement-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"receipt-requirements\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      taxDeductions: {\n        single: async (\n          req: NonNullable<\n            operations[\"tax-deduction-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"tax-deduction-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"deductions\", \"optimize\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"tax-deduction-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"tax-deduction-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"deductions\", \"optimize\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      perDiem: {\n        single: async (\n          req: NonNullable<\n            operations[\"per-diem-analysis-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"per-diem-analysis-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"per-diem\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"per-diem-analysis-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"per-diem-analysis-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"per-diem\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n      workerClassification: {\n        single: async (\n          req: NonNullable<\n            operations[\"worker-classification-single\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"worker-classification-single\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"classify\", \"worker\", \"single\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n        bulk: async (\n          req: NonNullable<\n            operations[\"worker-classification-bulk\"][\"requestBody\"]\n          >[\"content\"][\"application/json\"],\n        ): Promise<\n          Result<\n            operations[\"worker-classification-bulk\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n          >\n        > => {\n          return await this.fetch({\n            path: [\"classify\", \"worker\", \"bulk\"],\n            method: \"POST\",\n            body: req,\n          });\n        },\n      },\n\n      /**\n       * Get Enrichment Analytics\n       *\n       * Retrieve comprehensive analytics for enrichment API usage including costs,\n       * performance, and cache metrics. This endpoint provides insights into your\n       * transaction enrichment service usage patterns.\n       *\n       * @param req - Query parameters for analytics filtering\n       * @returns Promise resolving to enrichment analytics data\n       *\n       * @example\n       * ```typescript\n       * const analytics = await client.ai.analytics({\n       *   apiId: 'api_123456',\n       *   startDate: '2024-01-01',\n       *   endDate: '2024-01-31',\n       *   groupBy: 'day'\n       * });\n       *\n       * if (analytics.result) {\n       *   console.log('Usage analytics:', analytics.result.data);\n       * }\n       * ```\n       */\n      analytics: async (\n        req: paths[\"/v1/api.enrich.analytics\"][\"get\"][\"parameters\"][\"query\"],\n      ): Promise<\n        Result<\n          paths[\"/v1/api.enrich.analytics\"][\"get\"][\"responses\"][\"200\"][\"content\"][\"application/json\"]\n        >\n      > => {\n        return await this.fetch({\n          path: [\"analytics\"],\n          method: \"GET\",\n          query: req,\n        });\n      },\n    };\n  }\n\n  /**\n   * Creates a new API key with streamlined configuration.\n   *\n   * This convenience method allows creating keys with just the essential parameters,\n   * using sensible defaults for everything else. Ideal for standard use cases\n   * where full configuration complexity isn't needed.\n   *\n   * @param options - Simplified key creation options\n   * @returns Promise resolving to the new key details\n   *\n   * @example\n   * ```typescript\n   * // Initialize client with default apiId\n   * const client = new FinancialWorkspaceBackendClient({\n   *   rootKey: 'fwb_123...',\n   *   apiId: 'api_default123'\n   * });\n   *\n   * // Create a key with just a name\n   * const key = await client.createKey({\n   *   name: 'Customer API Key'\n   * });\n   *\n   * // Create a key with expiration\n   * const tempKey = await client.createKey({\n   *   name: 'Temporary Access',\n   *   expiresIn: '24h'\n   * });\n   * ```\n   */\n  public async createKey(\n    options: {\n      name?: string;\n      expiresIn?: string | number; // e.g., '24h', '7d', or milliseconds\n      ownerId?: string;\n      permissions?: string[];\n      rateLimit?: number; // requests per minute\n      enabled?: boolean;\n    } = {},\n  ): Promise<Result<{ keyId: string; key: string }>> {\n    if (!this.defaultApiId) {\n      throw new Error(\n        \"defaultApiId is required. Set it during client initialization or pass apiId directly to keys.create()\",\n      );\n    }\n\n    let expires: number | undefined;\n\n    if (options.expiresIn) {\n      if (typeof options.expiresIn === \"string\") {\n        // Parse duration strings like '24h', '7d', '30m', '1w', '1y'\n        const match = options.expiresIn.match(/^(\\d+)([hdmwy])$/);\n        if (match) {\n          const value = Number.parseInt(match[1]);\n          const unit = match[2];\n          const now = Date.now();\n          switch (unit) {\n            case \"h\":\n              expires = now + value * 60 * 60 * 1000;\n              break;\n            case \"d\":\n              expires = now + value * 24 * 60 * 60 * 1000;\n              break;\n            case \"m\":\n              expires = now + value * 60 * 1000;\n              break;\n            case \"w\":\n              expires = now + value * 7 * 24 * 60 * 60 * 1000;\n              break;\n            case \"y\":\n              expires = now + value * 365 * 24 * 60 * 60 * 1000;\n              break;\n          }\n        } else {\n          throw new Error(\n            `Invalid expiresIn format: '${options.expiresIn}'. Supported formats: 30m (minutes), 24h (hours), 7d (days), 4w (weeks), 1y (years). Examples: \"1h\", \"24h\", \"7d\", \"4w\", \"1y\"`,\n          );\n        }\n      } else {\n        if (options.expiresIn <= 0) {\n          throw new Error(\n            \"expiresIn must be a positive number when specified as milliseconds\",\n          );\n        }\n        expires = Date.now() + options.expiresIn;\n      }\n    }\n\n    const ratelimit = options.rateLimit\n      ? {\n          async: true,\n          type: \"fast\" as const,\n          limit: options.rateLimit,\n          duration: 60000, // 1 minute window\n        }\n      : undefined;\n\n    return await this.keys.create({\n      apiId: this.defaultApiId,\n      name: options.name,\n      externalId: options.ownerId,\n      permissions: options.permissions,\n      expires,\n      ratelimit,\n      enabled: options.enabled ?? true,\n    });\n  }\n\n  /**\n   * Verifies if an API key is valid.\n   *\n   * @param key - The key to verify\n   * @returns Promise resolving to a boolean indicating key validity\n   *\n   * @example\n   * ```typescript\n   * const isValid = await client.isKeyValid('sk_123...');\n   * if (isValid) {\n   *   console.log('Key is valid!');\n   * }\n   * ```\n   */\n  public async isKeyValid(key: string): Promise<boolean> {\n    if (!this.defaultApiId) {\n      return false;\n    }\n\n    try {\n      const result = await this.keys.verify({\n        key,\n        apiId: this.defaultApiId,\n      });\n\n      return result.result?.valid ?? false;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * List all keys with pagination support.\n   *\n   * This convenience method simplifies listing keys with automatic pagination\n   * handling and filtering options.\n   *\n   * @param options - Listing options\n   * @returns Promise resolving to array of keys\n   *\n   * @example\n   * ```typescript\n   * // Get all keys\n   * const allKeys = await client.listAllKeys();\n   *\n   * // Get keys for a specific owner\n   * const userKeys = await client.listAllKeys({\n   *   ownerId: 'user_123'\n   * });\n   * ```\n   */\n  public async listAllKeys(\n    options: {\n      ownerId?: string;\n      limit?: number;\n    } = {},\n  ): Promise<components[\"schemas\"][\"Key\"][]> {\n    if (!this.defaultApiId) {\n      throw new Error(\n        \"defaultApiId is required. Set it during client initialization or use apis.listKeys() directly with apiId parameter\",\n      );\n    }\n\n    const keys: components[\"schemas\"][\"Key\"][] = [];\n    let cursor: string | undefined;\n\n    do {\n      const result = await this.apis.listKeys({\n        apiId: this.defaultApiId,\n        limit: options.limit || 100,\n        cursor,\n        ownerId: options.ownerId,\n      });\n\n      if (result.error) {\n        throw new Error(result.error.message);\n      }\n\n      if (result.result?.keys) {\n        keys.push(...result.result.keys);\n      }\n\n      cursor = result.result?.cursor;\n    } while (cursor);\n\n    return keys;\n  }\n\n  /**\n   * Get financial transactions with enhanced filtering.\n   *\n   * @param options - Transaction query options (accountId is required)\n   * @returns Promise resolving to transactions\n   *\n   * @example\n   * ```typescript\n   * // Get transactions for a specific account\n   * const accountTxns = await client.getTransactions({\n   *   accountId: 'acc_123'\n   * });\n   *\n   * // Get transactions with connection filtering\n   * const connectionTxns = await client.getTransactions({\n   *   accountId: 'acc_123',\n   *   connectionId: 'conn_456'\n   * });\n   * ```\n   */\n  public async getTransactions(options: {\n    accountId: string;\n    connectionId?: string;\n    cursor?: string;\n  }) {\n    if (!options.accountId) {\n      throw new Error(\"accountId is required\");\n    }\n\n    if (!this.defaultApiId) {\n      throw new Error(\n        \"defaultApiId is required. Set it during client initialization or use financial.transactions() directly with apiId parameter\",\n      );\n    }\n\n    return await this.financial.transactions({\n      apiId: this.defaultApiId,\n      connectionId: options.connectionId,\n      accountId: options.accountId,\n      syncCursor: options.cursor,\n      latest: \"true\",\n    });\n  }\n\n  /**\n   * Get recurring transactions for a specific account.\n   *\n   * @param options - Recurring transaction query options (accountId is required)\n   * @returns Promise resolving to recurring transactions\n   *\n   * @example\n   * ```typescript\n   * const recurringTransactions = await client.getRecurringTransactions({\n   *   accountId: 'acc_123',\n   *   accessToken: 'access_123',\n   *   userId: 'user_123',\n   *   teamId: 'team_123'\n   * });\n   * ```\n   */\n  public async getRecurringTransactions(options: {\n    accountId: string;\n    accessToken: string;\n    userId: string;\n    teamId: string;\n  }) {\n    if (!options.accountId) {\n      throw new Error(\"accountId is required\");\n    }\n\n    if (!this.defaultApiId) {\n      throw new Error(\n        \"defaultApiId is required. Set it during client initialization or use financial.transactions() directly with apiId parameter\",\n      );\n    }\n\n    return await this.financial.recurringTransactions({\n      apiId: this.defaultApiId,\n      accountId: options.accountId,\n      accessToken: options.accessToken,\n      userId: options.userId,\n      teamId: options.teamId,\n      provider: \"plaid\",\n    });\n  }\n\n  /**\n   * Enrich a single transaction with AI-powered analysis.\n   *\n   * @param transaction - Transaction to enrich\n   * @returns Promise resolving to enriched transaction data\n   *\n   * @example\n   * ```typescript\n   * const enriched = await client.enrichTransaction({\n   *   description: 'AMZN Marketplace',\n   *   amount: 49.99,\n   *   date: '2024-01-15'\n   * });\n   *\n   * console.log('Category:', enriched.result?.category);\n   * console.log('Merchant:', enriched.result?.merchant);\n   * ```\n   */\n  public async enrichTransaction(transaction: {\n    description: string;\n    amount: number;\n    date?: string;\n    currency?: string;\n  }) {\n    return await this.ai.enrich({\n      data: [\n        {\n          id: `txn_${Date.now()}`, // Generate a temporary ID\n          description: transaction.description,\n          amount: transaction.amount,\n          date: transaction.date || new Date().toISOString().split(\"T\")[0],\n          currency: transaction.currency || \"USD\",\n        },\n      ],\n    });\n  }\n}\n\n/**\n * @deprecated Use FinancialWorkspaceBackendClient instead. This alias is provided for backward compatibility.\n */\nexport const SolomonAIWorkspaceEngineSdk = FinancialWorkspaceBackendClient;\n","import type { PermissionQuery } from \"@unkey/rbac\";\nimport { FinancialWorkspaceBackendClient } from \"./client\";\nimport type { paths } from \"./openapi\";\n\n/**\n * Verify a key\n *\n * @example\n * ```ts\n * const { result, error } = await verifyKey(\"key_123\")\n * if (error){\n *   // handle potential network or bad request error\n *   // a link to our docs will be in the `error.docs` field\n *   console.error(error.message)\n *   return\n * }\n * if (!result.valid) {\n *   // do not grant access\n *   return\n * }\n *\n * // process request\n * console.log(result)\n * ```\n */\nexport function verifyKey<TPermission extends string = string>(\n  req:\n    | string\n    | (Omit<\n        paths[\"/v1/keys.verifyKey\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n        \"authorization\"\n      > & { authorization?: { permissions: PermissionQuery<TPermission> } }),\n) {\n  // yes this is empty to make typescript happy but we don't need a token for verifying keys\n  // it's not the cleanest but it works for now :)\n  const unkey = new FinancialWorkspaceBackendClient({ rootKey: \"public\" });\n  return unkey.keys.verify(typeof req === \"string\" ? { key: req } : req);\n}\n","/**\n * @fileoverview Metrics Plugin Implementation with OpenTelemetry Integration\n *\n * This module provides metrics collection plugin that adds performance monitoring\n * capabilities to the Financial Workspace Backend Client with OpenTelemetry support.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport {\n  type Counter,\n  type Histogram,\n  type Meter,\n  type UpDownCounter,\n  metrics,\n} from \"@opentelemetry/api\";\nimport { z } from \"zod\";\nimport type { Middleware, Plugin } from \"../middleware\";\nimport {\n  type MetricsCollector,\n  createMetricsMiddleware,\n} from \"../middleware/common\";\n\n// Use OpenTelemetry types directly\ntype OTelMeter = Meter;\ntype OTelCounter = Counter;\ntype OTelHistogram = Histogram;\n// OpenTelemetry uses UpDownCounter for gauge-like metrics\ntype OTelGauge = UpDownCounter;\n\n/**\n * Helper function to get OpenTelemetry meter if available\n *\n * @param serviceName - Service name for the meter\n * @param serviceVersion - Service version for the meter\n * @returns OpenTelemetry meter instance or null if not available\n *\n * @example\n * ```typescript\n * import { getOTelMeter } from '@solomonai/fwb-client/plugins';\n *\n * const meter = getOTelMeter('my-service', '1.0.0');\n * if (meter) {\n *   // OpenTelemetry is available\n *   const counter = meter.createCounter('requests_total');\n * }\n * ```\n */\nexport function getOTelMeter(\n  serviceName: string,\n  serviceVersion: string,\n): OTelMeter | null {\n  try {\n    return metrics.getMeter(serviceName, serviceVersion);\n  } catch (error) {\n    console.debug(\"OpenTelemetry not available:\", error);\n    return null;\n  }\n}\n\n/**\n * Zod schema for metrics plugin options\n */\nexport const MetricsPluginOptionsSchema = z\n  .object({\n    /** Custom metrics collector */\n    collector: z.custom<MetricsCollector>().optional(),\n    /** Enable request/response timing */\n    enableTiming: z.boolean().default(true),\n    /** Enable error tracking */\n    enableErrorTracking: z.boolean().default(true),\n    /** Custom metric tags */\n    defaultTags: z.record(z.string()).default({}),\n    /** Endpoint for sending metrics */\n    metricsEndpoint: z.string().url().optional(),\n    /** How often to flush metrics (in ms) */\n    flushInterval: z.number().min(1000).max(300000).default(30000),\n    /** OpenTelemetry meter instance for standardized metrics */\n    otelMeter: z.custom<OTelMeter>().optional(),\n    /** Service name for OpenTelemetry metrics */\n    serviceName: z.string().min(1).max(100).default(\"fwb-client\"),\n    /** Service version for OpenTelemetry metrics */\n    serviceVersion: z\n      .string()\n      .regex(/^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?$/)\n      .default(\"1.0.0\"),\n    /** Enable OpenTelemetry integration */\n    enableOTel: z.boolean().default(false),\n    /** OpenTelemetry export endpoint (OTLP/HTTP) */\n    otelExportEndpoint: z.string().url().optional(),\n    /** OpenTelemetry export headers for authentication */\n    otelExportHeaders: z.record(z.string()).optional(),\n    /** OpenTelemetry export timeout in milliseconds */\n    otelExportTimeout: z.number().min(1000).max(60000).default(10000),\n    /** OpenTelemetry export protocol (http/protobuf or http/json) */\n    otelExportProtocol: z\n      .enum([\"http/protobuf\", \"http/json\"])\n      .default(\"http/protobuf\"),\n  })\n  .strict();\n\n/**\n * Configuration options for the metrics plugin\n */\nexport type MetricsPluginOptions = z.infer<typeof MetricsPluginOptionsSchema>;\n\n/**\n * Metrics collection plugin that adds performance monitoring capabilities\n *\n * This plugin collects various metrics about API usage including:\n * - Request/response timing\n * - Error rates and types\n * - Usage patterns\n * - Performance metrics\n *\n * @example Basic Usage\n * ```typescript\n * import { MetricsPlugin } from '@solomonai/fwb-client/plugins';\n *\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_123',\n *   plugins: [{\n *     plugin: new MetricsPlugin(),\n *     options: {\n *       enableTiming: true,\n *       enableErrorTracking: true,\n *       metricsEndpoint: 'https://metrics.example.com/api/metrics',\n *       flushInterval: 30000 // 30 seconds\n *     }\n *   }]\n * });\n * ```\n *\n * @example OpenTelemetry Integration\n * ```typescript\n * import { metrics } from '@opentelemetry/api';\n * import { MetricsPlugin } from '@solomonai/fwb-client/plugins';\n *\n * // Get the global meter\n * const meter = metrics.getMeter('fwb-client', '1.0.0');\n *\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_123',\n *   plugins: [{\n *     plugin: new MetricsPlugin(),\n *     options: {\n *       enableOTel: true,\n *       otelMeter: meter,\n *       serviceName: 'my-financial-app',\n *       serviceVersion: '2.1.0',\n *       otelExportEndpoint: 'https://otlp.example.com/v1/metrics',\n *       otelExportHeaders: {\n *         'Authorization': 'Bearer your-token-here',\n *         'X-Custom-Header': 'value'\n *       },\n *       otelExportTimeout: 15000,\n *       otelExportProtocol: 'http/json',\n *       enableTiming: true,\n *       enableErrorTracking: true\n *     }\n *   }]\n * });\n * ```\n */\nexport class MetricsPlugin implements Plugin {\n  name = \"metrics\";\n  version = \"1.0.0\";\n  description =\n    \"Collects and reports client performance metrics with OpenTelemetry support\";\n\n  private metricsCollector?: MetricsCollector;\n  private flushTimer?: NodeJS.Timeout;\n  private metricBuffer: Array<{\n    name: string;\n    value: number;\n    tags?: Record<string, string>;\n    type: string;\n    timestamp: number;\n  }> = [];\n\n  // OpenTelemetry instruments\n  private otelMeter?: OTelMeter;\n  private otelCounters: Map<string, OTelCounter> = new Map();\n  private otelHistograms: Map<string, OTelHistogram> = new Map();\n  private otelGauges: Map<string, OTelGauge> = new Map();\n  private serviceName = \"fwb-client\";\n  private serviceVersion = \"1.0.0\";\n\n  async initialize(\n    _client: unknown,\n    options: Record<string, unknown> = {},\n  ): Promise<void> {\n    // Validate and parse options using Zod schema\n    const {\n      collector,\n      enableTiming,\n      enableErrorTracking,\n      defaultTags,\n      metricsEndpoint,\n      flushInterval,\n      otelMeter,\n      serviceName,\n      serviceVersion,\n      enableOTel,\n      otelExportEndpoint,\n      otelExportHeaders,\n      otelExportTimeout,\n      otelExportProtocol,\n    } = MetricsPluginOptionsSchema.parse(options);\n\n    // Set service metadata\n    this.serviceName = serviceName;\n    this.serviceVersion = serviceVersion;\n\n    // Initialize OpenTelemetry if provided\n    if (enableOTel && otelMeter) {\n      this.otelMeter = otelMeter;\n      this.initializeOTelInstruments();\n\n      // Log OpenTelemetry export configuration\n      if (otelExportEndpoint) {\n        console.log(\"OpenTelemetry export configured:\", {\n          endpoint: otelExportEndpoint,\n          protocol: otelExportProtocol,\n          timeout: otelExportTimeout,\n          hasHeaders: !!otelExportHeaders,\n          headerCount: otelExportHeaders\n            ? Object.keys(otelExportHeaders).length\n            : 0,\n        });\n      }\n    }\n\n    // Create metrics collector that buffers metrics and optionally sends to OTel\n    this.metricsCollector = collector || {\n      timing: (name, value, tags) => {\n        this.bufferMetric(\"timing\", name, value, tags);\n        this.recordOTelHistogram(name, value, tags);\n      },\n      increment: (name, value, tags) => {\n        this.bufferMetric(\"counter\", name, value ?? 1, tags);\n        this.recordOTelCounter(name, value ?? 1, tags);\n      },\n      gauge: (name, value, tags) => {\n        this.bufferMetric(\"gauge\", name, value, tags);\n        this.recordOTelGauge(name, value, tags);\n      },\n    };\n\n    // Set up periodic flushing if endpoint is provided\n    if (metricsEndpoint && flushInterval > 0) {\n      this.flushTimer = setInterval(() => {\n        this.flushMetrics(metricsEndpoint);\n      }, flushInterval);\n    }\n\n    console.log(\"MetricsPlugin initialized\", {\n      enableTiming,\n      enableErrorTracking,\n      defaultTags,\n      enableOTel: !!this.otelMeter,\n      serviceName: this.serviceName,\n      otelExportConfigured: !!otelExportEndpoint,\n    });\n  }\n\n  async destroy(): Promise<void> {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n    }\n\n    // Flush any remaining metrics\n    if (this.metricBuffer.length > 0) {\n      console.log(\n        \"Flushing remaining metrics on plugin destroy:\",\n        this.metricBuffer.length,\n      );\n    }\n  }\n\n  getMiddleware(): Middleware[] {\n    if (!this.metricsCollector) {\n      return [];\n    }\n\n    return [\n      createMetricsMiddleware({\n        collector: this.metricsCollector,\n        collectTiming: true,\n        collectErrors: true,\n      }),\n    ];\n  }\n\n  getClientExtensions(): Record<string, unknown> {\n    return {\n      getMetrics: () => [...this.metricBuffer],\n      clearMetrics: () => {\n        this.metricBuffer = [];\n      },\n      flushMetrics: (endpoint?: string) => this.flushMetrics(endpoint),\n    };\n  }\n\n  private bufferMetric(\n    type: string,\n    name: string,\n    value: number,\n    tags?: Record<string, string>,\n  ): void {\n    this.metricBuffer.push({\n      type,\n      name,\n      value,\n      tags,\n      timestamp: Date.now(),\n    });\n  }\n\n  private async flushMetrics(endpoint?: string): Promise<void> {\n    if (this.metricBuffer.length === 0) {\n      return;\n    }\n\n    const metrics = [...this.metricBuffer];\n    this.metricBuffer = [];\n\n    if (endpoint) {\n      try {\n        await fetch(endpoint, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          body: JSON.stringify({ metrics }),\n        });\n        console.log(`Flushed ${metrics.length} metrics to ${endpoint}`);\n      } catch (error) {\n        console.error(\"Failed to flush metrics:\", error);\n        // Re-add metrics to buffer for retry\n        this.metricBuffer.unshift(...metrics);\n      }\n    } else {\n      console.log(\"Metrics to flush:\", metrics);\n    }\n  }\n\n  /**\n   * Initializes OpenTelemetry instruments for common metrics\n   */\n  private initializeOTelInstruments(): void {\n    if (!this.otelMeter) {\n      return;\n    }\n\n    // Create standard instruments for FWB client metrics\n    const commonInstruments = [\n      {\n        name: \"fwb_request_duration\",\n        type: \"histogram\",\n        description: \"Request duration in milliseconds\",\n        unit: \"ms\",\n      },\n      {\n        name: \"fwb_request_count\",\n        type: \"counter\",\n        description: \"Total number of requests\",\n        unit: \"1\",\n      },\n      {\n        name: \"fwb_error_count\",\n        type: \"counter\",\n        description: \"Total number of errors\",\n        unit: \"1\",\n      },\n      {\n        name: \"fwb_response_size\",\n        type: \"histogram\",\n        description: \"Response size in bytes\",\n        unit: \"By\",\n      },\n      {\n        name: \"fwb_request_size\",\n        type: \"histogram\",\n        description: \"Request size in bytes\",\n        unit: \"By\",\n      },\n      {\n        name: \"fwb_active_requests\",\n        type: \"gauge\",\n        description: \"Number of active requests\",\n        unit: \"1\",\n      },\n    ];\n\n    for (const instrument of commonInstruments) {\n      const options = {\n        description: instrument.description,\n        unit: instrument.unit,\n      };\n\n      switch (instrument.type) {\n        case \"counter\": {\n          this.otelCounters.set(\n            instrument.name,\n            this.otelMeter.createCounter(instrument.name, options),\n          );\n          break;\n        }\n        case \"histogram\": {\n          this.otelHistograms.set(\n            instrument.name,\n            this.otelMeter.createHistogram(instrument.name, options),\n          );\n          break;\n        }\n        case \"gauge\": {\n          this.otelGauges.set(\n            instrument.name,\n            this.otelMeter.createUpDownCounter(instrument.name, options),\n          );\n          break;\n        }\n      }\n    }\n  }\n\n  /**\n   * Records a value to an OpenTelemetry histogram\n   */\n  private recordOTelHistogram(\n    name: string,\n    value: number,\n    tags?: Record<string, string>,\n  ): void {\n    if (!this.otelMeter) {\n      return;\n    }\n\n    let histogram = this.otelHistograms.get(name);\n    if (!histogram) {\n      histogram = this.otelMeter.createHistogram(name, {\n        description: `Histogram metric: ${name}`,\n        unit: \"ms\",\n      });\n      this.otelHistograms.set(name, histogram);\n    }\n\n    const attributes = this.buildOTelAttributes(tags);\n    histogram.record(value, attributes);\n  }\n\n  /**\n   * Records a value to an OpenTelemetry counter\n   */\n  private recordOTelCounter(\n    name: string,\n    value: number,\n    tags?: Record<string, string>,\n  ): void {\n    if (!this.otelMeter) {\n      return;\n    }\n\n    let counter = this.otelCounters.get(name);\n    if (!counter) {\n      counter = this.otelMeter.createCounter(name, {\n        description: `Counter metric: ${name}`,\n        unit: \"1\",\n      });\n      this.otelCounters.set(name, counter);\n    }\n\n    const attributes = this.buildOTelAttributes(tags);\n    counter.add(value, attributes);\n  }\n\n  /**\n   * Records a value to an OpenTelemetry gauge (UpDownCounter)\n   */\n  private recordOTelGauge(\n    name: string,\n    value: number,\n    tags?: Record<string, string>,\n  ): void {\n    if (!this.otelMeter) {\n      return;\n    }\n\n    let gauge = this.otelGauges.get(name);\n    if (!gauge) {\n      gauge = this.otelMeter.createUpDownCounter(name, {\n        description: `Gauge metric: ${name}`,\n        unit: \"1\",\n      });\n      this.otelGauges.set(name, gauge);\n    }\n\n    const attributes = this.buildOTelAttributes(tags);\n    // UpDownCounter uses add() method, not record()\n    gauge.add(value, attributes);\n  }\n\n  /**\n   * Builds OpenTelemetry attributes from tags, adding service metadata\n   */\n  private buildOTelAttributes(\n    tags?: Record<string, string>,\n  ): Record<string, string | number | boolean> {\n    const attributes: Record<string, string | number | boolean> = {\n      \"service.name\": this.serviceName,\n      \"service.version\": this.serviceVersion,\n      \"telemetry.sdk.name\": \"fwb-client\",\n      \"telemetry.sdk.version\": this.version,\n    };\n\n    if (tags) {\n      for (const [key, value] of Object.entries(tags)) {\n        attributes[key] = value;\n      }\n    }\n\n    return attributes;\n  }\n}\n\n/**\n * Factory function to create a metrics plugin instance\n *\n * @param options - Configuration options for the metrics plugin\n * @returns A new MetricsPlugin instance\n *\n * @example Basic Usage\n * ```typescript\n * const metricsPlugin = createMetricsPlugin({\n *   enableTiming: true,\n *   metricsEndpoint: 'https://metrics.example.com/api/metrics'\n * });\n * ```\n *\n * @example With OpenTelemetry and Export Configuration\n * ```typescript\n * import { metrics } from '@opentelemetry/api';\n *\n * const metricsPlugin = createMetricsPlugin({\n *   enableOTel: true,\n *   otelMeter: metrics.getMeter('fwb-client'),\n *   serviceName: 'my-service',\n *   otelExportEndpoint: 'https://otlp.example.com/v1/metrics',\n *   otelExportHeaders: {\n *     'Authorization': 'Bearer your-api-key'\n *   },\n *   otelExportTimeout: 15000,\n *   otelExportProtocol: 'http/json',\n *   enableTiming: true,\n *   enableErrorTracking: true\n * });\n * ```\n */\nexport function createMetricsPlugin(\n  _options?: MetricsPluginOptions,\n): MetricsPlugin {\n  const plugin = new MetricsPlugin();\n  return plugin;\n}\n","/**\n * @fileoverview Shared Logger Implementation\n *\n * This module provides a reusable logger class with configurable formatting,\n * log levels, and output options that can be shared across plugins and middleware.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport { z } from \"zod\";\n\n/**\n * Log level enumeration\n */\nexport enum LogLevel {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  FATAL = 5,\n  OFF = 6,\n}\n\n/**\n * Zod schema for shared logger options\n */\nexport const SharedLoggerOptionsSchema = z\n  .object({\n    /** Output format */\n    format: z.enum([\"json\", \"text\", \"custom\"]).default(\"json\"),\n    /** Minimum log level to output */\n    logLevel: z.nativeEnum(LogLevel).default(LogLevel.INFO),\n    /** Custom formatter function */\n    customFormatter: z.function().args(z.any()).returns(z.string()).optional(),\n    /** Whether to use colors in console output */\n    useColors: z.boolean().default(true),\n    /** Whether to log timestamps */\n    includeTimestamp: z.boolean().default(true),\n    /** Whether to log the component name in each log entry */\n    includeComponentName: z.boolean().default(true),\n    /** Component name for identification */\n    componentName: z.string().default(\"fwb-client\"),\n  })\n  .strict();\n\n/**\n * Configuration options for the shared logger\n */\nexport type SharedLoggerOptions = z.infer<typeof SharedLoggerOptionsSchema>;\n\n/**\n * Shared logger class with configurable formatting and log levels\n *\n * This class provides comprehensive logging capabilities that can be reused\n * across different components like plugins and middleware.\n *\n * @example Basic Usage\n * ```typescript\n * import { SharedLogger, LogLevel } from '../shared/logger';\n *\n * const logger = new SharedLogger({\n *   logLevel: LogLevel.DEBUG,\n *   format: 'text',\n *   useColors: true,\n *   componentName: 'metrics-plugin'\n * });\n *\n * logger.info('Plugin initialized');\n * logger.error('Something went wrong', { error: 'details' });\n * ```\n */\nexport class SharedLogger {\n  private options: SharedLoggerOptions;\n\n  // ANSI color codes for console output\n  private readonly colors = {\n    reset: \"\\x1b[0m\",\n    bright: \"\\x1b[1m\",\n    dim: \"\\x1b[2m\",\n    red: \"\\x1b[31m\",\n    green: \"\\x1b[32m\",\n    yellow: \"\\x1b[33m\",\n    blue: \"\\x1b[34m\",\n    magenta: \"\\x1b[35m\",\n    cyan: \"\\x1b[36m\",\n    white: \"\\x1b[37m\",\n    gray: \"\\x1b[90m\",\n  };\n\n  constructor(options: Partial<SharedLoggerOptions> = {}) {\n    this.options = SharedLoggerOptionsSchema.parse(options);\n  }\n\n  /**\n   * Log a trace message (most verbose)\n   */\n  trace(message: string, data?: unknown): void {\n    this.log(LogLevel.TRACE, message, data);\n  }\n\n  /**\n   * Log a debug message\n   */\n  debug(message: string, data?: unknown): void {\n    this.log(LogLevel.DEBUG, message, data);\n  }\n\n  /**\n   * Log an info message\n   */\n  info(message: string, data?: unknown): void {\n    this.log(LogLevel.INFO, message, data);\n  }\n\n  /**\n   * Log a warning message\n   */\n  warn(message: string, data?: unknown): void {\n    this.log(LogLevel.WARN, message, data);\n  }\n\n  /**\n   * Log an error message\n   */\n  error(message: string, data?: unknown): void {\n    this.log(LogLevel.ERROR, message, data);\n  }\n\n  /**\n   * Log a fatal error message\n   */\n  fatal(message: string, data?: unknown): void {\n    this.log(LogLevel.FATAL, message, data);\n  }\n\n  /**\n   * Main logging method with level filtering\n   *\n   * @param level - Log level\n   * @param message - Log message\n   * @param data - Additional data to log\n   */\n  public log(level: LogLevel, message: string, data?: unknown): void {\n    // Check if this log level should be output\n    if (level < this.options.logLevel) {\n      return;\n    }\n\n    this.outputLog(LogLevel[level].toLowerCase(), message, data);\n  }\n\n  /**\n   * Updates the logger configuration\n   */\n  public configure(options: Partial<SharedLoggerOptions>): void {\n    this.options = SharedLoggerOptionsSchema.parse({\n      ...this.options,\n      ...options,\n    });\n  }\n\n  /**\n   * Gets the current log level\n   */\n  public getLogLevel(): LogLevel {\n    return this.options.logLevel;\n  }\n\n  /**\n   * Sets the log level\n   */\n  public setLogLevel(level: LogLevel): void {\n    this.options.logLevel = level;\n  }\n\n  /**\n   * Checks if a log level would be output\n   */\n  public isLevelEnabled(level: LogLevel): boolean {\n    return level >= this.options.logLevel;\n  }\n\n  /**\n   * Internal method to handle log output\n   *\n   * @param level - Log level string (info, error, warn, debug)\n   * @param message - Log message\n   * @param data - Additional data to log\n   */\n  private outputLog(level: string, message: string, data?: unknown): void {\n    const timestamp = this.options.includeTimestamp\n      ? new Date().toISOString()\n      : undefined;\n    const componentName = this.options.includeComponentName\n      ? this.options.componentName\n      : undefined;\n\n    const logEntry: Record<string, unknown> = {\n      level,\n      message,\n    };\n\n    if (timestamp) {\n      logEntry.timestamp = timestamp;\n    }\n\n    if (componentName) {\n      logEntry.component = componentName;\n    }\n\n    if (data) {\n      logEntry.data = data;\n    }\n\n    let formattedMessage: string;\n\n    switch (this.options.format) {\n      case \"json\":\n        formattedMessage = JSON.stringify(logEntry, null, 2);\n        break;\n      case \"text\":\n        formattedMessage = this.formatTextMessage(\n          level,\n          message,\n          data,\n          timestamp,\n          componentName,\n        );\n        break;\n      case \"custom\":\n        if (this.options.customFormatter) {\n          formattedMessage = this.options.customFormatter(logEntry);\n        } else {\n          formattedMessage = JSON.stringify(logEntry);\n        }\n        break;\n      default:\n        formattedMessage = JSON.stringify(logEntry);\n    }\n\n    // Apply colors if enabled and in text format\n    if (this.options.useColors && this.options.format === \"text\") {\n      formattedMessage = this.colorizeMessage(level, formattedMessage);\n    }\n\n    // Output to console\n    this.outputToConsole(level, formattedMessage);\n  }\n\n  /**\n   * Formats a text message with optional timestamp and component name\n   */\n  private formatTextMessage(\n    level: string,\n    message: string,\n    data?: unknown,\n    timestamp?: string,\n    componentName?: string,\n  ): string {\n    const parts: string[] = [];\n\n    if (timestamp) {\n      parts.push(`[${timestamp}]`);\n    }\n\n    if (componentName) {\n      parts.push(`[${componentName}]`);\n    }\n\n    parts.push(`${level.toUpperCase()}:`);\n    parts.push(message);\n\n    let formattedMessage = parts.join(\" \");\n\n    if (data) {\n      formattedMessage += `\\n${JSON.stringify(data, null, 2)}`;\n    }\n\n    return formattedMessage;\n  }\n\n  /**\n   * Colorizes a message based on log level\n   */\n  private colorizeMessage(level: string, message: string): string {\n    if (!this.options.useColors) {\n      return message;\n    }\n\n    let color: string;\n    switch (level.toLowerCase()) {\n      case \"trace\":\n        color = this.colors.gray;\n        break;\n      case \"debug\":\n        color = this.colors.cyan;\n        break;\n      case \"info\":\n        color = this.colors.green;\n        break;\n      case \"warn\":\n        color = this.colors.yellow;\n        break;\n      case \"error\":\n        color = this.colors.red;\n        break;\n      case \"fatal\":\n        color = this.colors.red + this.colors.bright;\n        break;\n      default:\n        color = this.colors.white;\n    }\n\n    return `${color}${message}${this.colors.reset}`;\n  }\n\n  /**\n   * Outputs message to appropriate console method based on level\n   */\n  private outputToConsole(level: string, message: string): void {\n    switch (level.toLowerCase()) {\n      case \"trace\":\n      case \"debug\":\n        console.debug(message);\n        break;\n      case \"info\":\n        console.info(message);\n        break;\n      case \"warn\":\n        console.warn(message);\n        break;\n      case \"error\":\n      case \"fatal\":\n        console.error(message);\n        break;\n      default:\n        console.log(message);\n    }\n  }\n}\n\n/**\n * Factory function to create a shared logger instance\n *\n * @param options - Configuration options for the logger\n * @returns A new SharedLogger instance\n *\n * @example\n * ```typescript\n * const logger = createSharedLogger({\n *   logLevel: LogLevel.DEBUG,\n *   format: 'text',\n *   useColors: true,\n *   componentName: 'my-component'\n * });\n * ```\n */\nexport function createSharedLogger(\n  options?: Partial<SharedLoggerOptions>,\n): SharedLogger {\n  return new SharedLogger(options);\n}\n","/**\n * @fileoverview Logging Middleware Implementation\n *\n * This module provides logging middleware for request/response logging\n * with configurable options for different log levels and output formats.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport type {\n  ApiRequest,\n  ApiResponse,\n  Middleware,\n  MiddlewareContext,\n} from \"../middleware\";\nimport { LogLevel, createSharedLogger } from \"../shared/logger\";\n\n/**\n * Configuration options for the logging middleware\n */\nexport interface LoggingOptions {\n  /** Whether to log requests */\n  logRequests?: boolean;\n  /** Whether to log responses */\n  logResponses?: boolean;\n  /** Whether to log errors */\n  logErrors?: boolean;\n  /** Whether to log response bodies (may contain sensitive data) */\n  logResponseBodies?: boolean;\n  /** Custom logger function */\n  logger?: (\n    level: \"info\" | \"error\" | \"warn\" | \"debug\",\n    message: string,\n    data?: unknown,\n  ) => void;\n  /** Whether to include headers in logs */\n  includeHeaders?: boolean;\n  /** Maximum length for logged request/response bodies */\n  maxBodyLength?: number;\n  /** Log level for the middleware */\n  logLevel?: LogLevel;\n  /** Whether to use colors in output */\n  useColors?: boolean;\n  /** Output format */\n  format?: \"json\" | \"text\" | \"custom\";\n}\n\n/**\n * Creates a logging middleware instance with the specified options.\n *\n * This middleware logs requests, responses, and errors with configurable\n * detail levels and output formatting.\n *\n * @param options - Logging configuration options\n * @returns Configured logging middleware\n *\n * @example\n * ```typescript\n * const loggingMiddleware = createLoggingMiddleware({\n *   logRequests: true,\n *   logResponses: true,\n *   logErrors: true,\n *   includeHeaders: false,\n *   maxBodyLength: 1000\n * });\n * ```\n */\nexport function createLoggingMiddleware(\n  options: LoggingOptions = {},\n): Middleware {\n  const {\n    logRequests = true,\n    logResponses = true,\n    logErrors = true,\n    logResponseBodies = false,\n    includeHeaders = false,\n    maxBodyLength = 1000,\n    logger,\n    logLevel = LogLevel.INFO,\n    useColors = true,\n    format = \"json\",\n  } = options;\n\n  // Create shared logger instance for middleware\n  const sharedLogger = createSharedLogger({\n    logLevel,\n    useColors,\n    format,\n    componentName: \"logging-middleware\",\n  });\n\n  // Use shared logger if no custom logger provided\n  const logFunction =\n    logger ||\n    ((level: string, message: string, data?: unknown) => {\n      const logLevelEnum =\n        level === \"info\"\n          ? LogLevel.INFO\n          : level === \"error\"\n            ? LogLevel.ERROR\n            : level === \"warn\"\n              ? LogLevel.WARN\n              : level === \"debug\"\n                ? LogLevel.DEBUG\n                : LogLevel.INFO;\n      sharedLogger.log(logLevelEnum, message, data);\n    });\n\n  const truncateBody = (body: unknown): unknown => {\n    if (typeof body === \"string\" && body.length > maxBodyLength) {\n      return `${body.substring(0, maxBodyLength)}... [truncated]`;\n    }\n    if (typeof body === \"object\" && body !== null) {\n      const str = JSON.stringify(body);\n      if (str.length > maxBodyLength) {\n        return `${str.substring(0, maxBodyLength)}... [truncated]`;\n      }\n    }\n    return body;\n  };\n\n  return {\n    name: \"logging\",\n\n    before: async (request: ApiRequest, context: MiddlewareContext) => {\n      if (logRequests) {\n        const logData: Record<string, unknown> = {\n          requestId: context.requestId,\n          method: request.method,\n          path: request.path.join(\"/\"),\n          timestamp: new Date().toISOString(),\n        };\n\n        if (includeHeaders && request.headers) {\n          logData.headers = request.headers;\n        }\n\n        if (request.query) {\n          logData.query = request.query;\n        }\n\n        if (request.body) {\n          logData.body = truncateBody(request.body);\n        }\n\n        logFunction(\"info\", `[${context.requestId}] Outgoing request`, logData);\n      }\n\n      return request;\n    },\n\n    after: async (\n      response: ApiResponse,\n      request: ApiRequest,\n      context: MiddlewareContext,\n    ) => {\n      if (logResponses) {\n        const duration = Date.now() - context.startTime;\n        const logData: Record<string, unknown> = {\n          requestId: context.requestId,\n          method: request.method,\n          path: request.path.join(\"/\"),\n          status: response.status,\n          duration: `${duration}ms`,\n          timestamp: new Date().toISOString(),\n        };\n\n        if (includeHeaders && response.headers) {\n          logData.responseHeaders = response.headers;\n        }\n\n        if (logResponseBodies && response.data) {\n          logData.responseBody = truncateBody(response.data);\n        }\n\n        logFunction(\n          \"info\",\n          `[${context.requestId}] Response received`,\n          logData,\n        );\n      }\n\n      return response;\n    },\n\n    onError: async (\n      error: Error,\n      request: ApiRequest,\n      context: MiddlewareContext,\n    ) => {\n      if (logErrors) {\n        const duration = Date.now() - context.startTime;\n        logFunction(\"error\", `[${context.requestId}] Request failed`, {\n          requestId: context.requestId,\n          method: request.method,\n          path: request.path.join(\"/\"),\n          error: error.message,\n          stack: error.stack,\n          duration: `${duration}ms`,\n          timestamp: new Date().toISOString(),\n        });\n      }\n    },\n  };\n}\n","/**\n * @fileoverview Metrics Middleware Implementation\n *\n * This module provides metrics collection middleware for performance monitoring,\n * usage tracking, and operational insights.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport type { Counter, Histogram, Meter } from \"@opentelemetry/api\";\nimport type {\n  ApiRequest,\n  ApiResponse,\n  Middleware,\n  MiddlewareContext,\n} from \"../middleware\";\n\n/**\n * Interface for metrics collection backends\n */\nexport interface MetricsCollector {\n  /** Record a timing metric */\n  timing(name: string, value: number, tags?: Record<string, string>): void;\n  /** Increment a counter metric */\n  increment(name: string, value?: number, tags?: Record<string, string>): void;\n  /** Record a gauge metric */\n  gauge(name: string, value: number, tags?: Record<string, string>): void;\n}\n\n/**\n * Configuration options for the metrics middleware\n */\nexport interface MetricsOptions {\n  /** Custom metrics collector */\n  collector?: MetricsCollector;\n  /** Whether to collect timing metrics */\n  collectTiming?: boolean;\n  /** Whether to collect error metrics */\n  collectErrors?: boolean;\n  /** Custom tags to add to all metrics */\n  defaultTags?: Record<string, string>;\n  /** OpenTelemetry meter for standardized metrics */\n  otelMeter?: Meter;\n  /** Enable OpenTelemetry integration */\n  enableOTel?: boolean;\n  /** Service name for OpenTelemetry metrics */\n  serviceName?: string;\n  /** Service version for OpenTelemetry metrics */\n  serviceVersion?: string;\n  /** OpenTelemetry export endpoint (OTLP/HTTP) */\n  otelExportEndpoint?: string;\n  /** OpenTelemetry export headers for authentication */\n  otelExportHeaders?: Record<string, string>;\n  /** OpenTelemetry export timeout in milliseconds */\n  otelExportTimeout?: number;\n  /** OpenTelemetry export protocol (http/protobuf or http/json) */\n  otelExportProtocol?: \"http/protobuf\" | \"http/json\";\n}\n\n/**\n * Default console-based metrics collector for development and testing\n */\nclass ConsoleMetricsCollector implements MetricsCollector {\n  timing(name: string, value: number, tags?: Record<string, string>): void {\n    console.log(`TIMING: ${name} = ${value}ms`, tags);\n  }\n\n  increment(name: string, value?: number, tags?: Record<string, string>): void {\n    console.log(`INCREMENT: ${name} += ${value ?? 1}`, tags);\n  }\n\n  gauge(name: string, value: number, tags?: Record<string, string>): void {\n    console.log(`GAUGE: ${name} = ${value}`, tags);\n  }\n}\n\n/**\n * Creates a metrics collection middleware instance.\n *\n * This middleware collects performance and usage metrics including\n * request counts, response times, error rates, and custom metrics.\n *\n * @param options - Metrics configuration options\n * @returns Configured metrics middleware\n *\n * @example Basic Usage\n * ```typescript\n * const metricsMiddleware = createMetricsMiddleware({\n *   collectTiming: true,\n *   collectErrors: true,\n *   defaultTags: { service: 'fwb-client', version: '1.0.0' },\n *   collector: new CustomMetricsCollector()\n * });\n * ```\n *\n * @example With OpenTelemetry and Export Configuration\n * ```typescript\n * import { metrics } from '@opentelemetry/api';\n *\n * const metricsMiddleware = createMetricsMiddleware({\n *   enableOTel: true,\n *   otelMeter: metrics.getMeter('fwb-client', '1.0.0'),\n *   serviceName: 'my-service',\n *   otelExportEndpoint: 'https://otlp.example.com/v1/metrics',\n *   otelExportHeaders: {\n *     'Authorization': 'Bearer your-api-key',\n *     'X-Scope-OrgID': 'tenant-123'\n *   },\n *   otelExportTimeout: 10000,\n *   otelExportProtocol: 'http/json',\n *   collectTiming: true,\n *   collectErrors: true\n * });\n * ```\n */\nexport function createMetricsMiddleware(\n  options: MetricsOptions = {},\n): Middleware {\n  const {\n    collectTiming = true,\n    collectErrors = true,\n    defaultTags = {},\n    collector = new ConsoleMetricsCollector(),\n    otelMeter,\n    enableOTel = false,\n    serviceName = \"fwb-client\",\n    serviceVersion = \"1.0.0\",\n  } = options;\n\n  // Initialize OpenTelemetry instruments if enabled\n  let otelRequestCounter: Counter | null = null;\n  let otelRequestDuration: Histogram | null = null;\n  let otelErrorCounter: Counter | null = null;\n\n  if (enableOTel && otelMeter) {\n    otelRequestCounter = otelMeter.createCounter(\"fwb_requests_total\", {\n      description: \"Total number of FWB API requests\",\n      unit: \"1\",\n    });\n\n    otelRequestDuration = otelMeter.createHistogram(\n      \"fwb_request_duration_seconds\",\n      {\n        description: \"Duration of FWB API requests in seconds\",\n        unit: \"s\",\n      },\n    );\n\n    otelErrorCounter = otelMeter.createCounter(\"fwb_errors_total\", {\n      description: \"Total number of FWB API errors\",\n      unit: \"1\",\n    });\n  }\n\n  return {\n    name: \"metrics\",\n\n    before: async (request: ApiRequest, context: MiddlewareContext) => {\n      // Store start time for duration calculation\n      context.middlewareData = context.middlewareData || {};\n      context.middlewareData.metricsStartTime = Date.now();\n\n      const endpoint = request.path.join(\"/\");\n      const method = request.method;\n\n      // Increment request counter (internal collector)\n      collector.increment(\"fwb.client.requests.total\", 1, {\n        ...defaultTags,\n        method,\n        endpoint,\n      });\n\n      // Increment OpenTelemetry request counter\n      if (otelRequestCounter) {\n        otelRequestCounter.add(1, {\n          \"service.name\": serviceName,\n          \"service.version\": serviceVersion,\n          \"http.method\": method,\n          \"http.route\": endpoint,\n          ...defaultTags,\n        });\n      }\n\n      return request;\n    },\n\n    after: async (\n      response: ApiResponse,\n      request: ApiRequest,\n      context: MiddlewareContext,\n    ) => {\n      const startTime = context.middlewareData?.metricsStartTime as number;\n      const duration = startTime ? Date.now() - startTime : 0;\n\n      const endpoint = request.path.join(\"/\");\n      const method = request.method;\n      const status = response.status?.toString() || \"unknown\";\n\n      const tags = {\n        ...defaultTags,\n        method,\n        endpoint,\n        status,\n      };\n\n      if (collectTiming && duration > 0) {\n        // Internal collector (milliseconds)\n        collector.timing(\"fwb.client.request.duration\", duration, tags);\n\n        // OpenTelemetry histogram (seconds)\n        if (otelRequestDuration) {\n          otelRequestDuration.record(duration / 1000, {\n            \"service.name\": serviceName,\n            \"service.version\": serviceVersion,\n            \"http.method\": method,\n            \"http.route\": endpoint,\n            \"http.status_code\": status,\n            ...defaultTags,\n          });\n        }\n      }\n\n      // Increment response counter\n      collector.increment(\"fwb.client.responses.total\", 1, tags);\n\n      return response;\n    },\n\n    onError: async (\n      error: Error,\n      request: ApiRequest,\n      _context: MiddlewareContext,\n    ) => {\n      if (collectErrors) {\n        const endpoint = request.path.join(\"/\");\n        const method = request.method;\n        const errorType = error.constructor.name;\n\n        // Internal collector\n        collector.increment(\"fwb.client.errors.total\", 1, {\n          ...defaultTags,\n          method,\n          endpoint,\n          error_type: errorType,\n        });\n\n        // OpenTelemetry error counter\n        if (otelErrorCounter) {\n          otelErrorCounter.add(1, {\n            \"service.name\": serviceName,\n            \"service.version\": serviceVersion,\n            \"http.method\": method,\n            \"http.route\": endpoint,\n            \"error.type\": errorType,\n            ...defaultTags,\n          });\n        }\n      }\n    },\n  };\n}\n","/**\n * @fileoverview Logger Plugin Implementation\n *\n * This module provides advanced logging plugin with customizable formatting\n * and output options for the Financial Workspace Backend Client.\n *\n * @author Solomon AI Engineering Team\n * @version 1.0.0\n */\n\nimport type { Middleware, Plugin } from \"../middleware\";\nimport {\n  LogLevel,\n  SharedLogger,\n  SharedLoggerOptionsSchema,\n} from \"../shared/logger\";\n\nimport { z } from \"zod\";\nimport { createLoggingMiddleware } from \"../middleware/common\";\n\n// Re-export LogLevel for backward compatibility\nexport { LogLevel } from \"../shared/logger\";\n\n/**\n * Zod schema for logger plugin options\n */\nexport const LoggerPluginOptionsSchema = SharedLoggerOptionsSchema.extend({\n  /** Log file path (Node.js only) */\n  logFile: z.string().min(1).optional(),\n  /** Whether to include stack traces in error logs */\n  includeStackTrace: z.boolean().default(true),\n  /** Whether to log requests */\n  logRequests: z.boolean().default(true),\n  /** Whether to log responses */\n  logResponses: z.boolean().default(true),\n  /** Whether to log errors */\n  logErrors: z.boolean().default(true),\n  /** Whether to log response bodies (may contain sensitive data) */\n  logResponseBodies: z.boolean().default(false),\n  /** Custom logger function */\n  logger: z\n    .function()\n    .args(z.string(), z.string(), z.unknown().optional())\n    .returns(z.void())\n    .optional(),\n}).strict();\n\n/**\n * Configuration options for the logger plugin\n */\nexport type LoggerPluginOptions = z.infer<typeof LoggerPluginOptionsSchema>;\n\n/**\n * Advanced request/response logger plugin with customizable formatting\n *\n * This plugin provides comprehensive logging capabilities including:\n * - Request/response logging with customizable formats\n * - Error logging with stack traces\n * - Performance timing information\n * - Custom log formatting and output destinations\n *\n * @example Basic Usage\n * ```typescript\n * import { LoggerPlugin, LogLevel } from '@solomonai/fwb-client/plugins';\n *\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_123',\n *   plugins: [{\n *     plugin: new LoggerPlugin(),\n *     options: {\n *       format: 'json',\n *       logLevel: LogLevel.DEBUG,\n *       logRequests: true,\n *       logResponses: true,\n *       logErrors: true,\n *       includeStackTrace: true,\n *       useColors: true\n *     }\n *   }]\n * });\n * ```\n *\n * @example Production Configuration\n * ```typescript\n * import { LoggerPlugin, LogLevel } from '@solomonai/fwb-client/plugins';\n *\n * const client = new FinancialWorkspaceBackendClient({\n *   rootKey: 'fwb_123',\n *   plugins: [{\n *     plugin: new LoggerPlugin(),\n *     options: {\n *       format: 'json',\n *       logLevel: LogLevel.WARN, // Only log warnings and errors\n *       logRequests: false,\n *       logResponses: false,\n *       logErrors: true,\n *       logResponseBodies: false,\n *       useColors: false,\n *       includeTimestamp: true\n *     }\n *   }]\n * });\n * ```\n */\nexport class LoggerPlugin implements Plugin {\n  name = \"logger\";\n  version = \"1.0.0\";\n  description =\n    \"Advanced request/response logging with customizable formatting and log levels\";\n\n  private options!: LoggerPluginOptions;\n  private sharedLogger!: SharedLogger;\n\n  async initialize(\n    _client: unknown,\n    options: Record<string, unknown> = {},\n  ): Promise<void> {\n    // Validate and parse options using Zod schema\n    this.options = LoggerPluginOptionsSchema.parse(options);\n\n    // Create shared logger instance with mapped options\n    this.sharedLogger = new SharedLogger({\n      format: this.options.format,\n      logLevel: this.options.logLevel,\n      customFormatter: this.options.customFormatter,\n      useColors: this.options.useColors,\n      includeTimestamp: this.options.includeTimestamp,\n      includeComponentName: this.options.includeComponentName,\n      componentName: this.name, // Use plugin name as component name\n    });\n\n    this.sharedLogger.info(\"LoggerPlugin initialized\", {\n      logLevel: LogLevel[this.options.logLevel],\n      format: this.options.format,\n      useColors: this.options.useColors,\n    });\n  }\n\n  getMiddleware(): Middleware[] {\n    return [\n      createLoggingMiddleware({\n        logRequests: this.options.logRequests,\n        logResponses: this.options.logResponses,\n        logErrors: this.options.logErrors,\n        logResponseBodies: this.options.logResponseBodies,\n        logger: this.customLogger.bind(this),\n      }),\n    ];\n  }\n\n  /**\n   * Main logging method with level filtering\n   *\n   * @param level - Log level\n   * @param message - Log message\n   * @param data - Additional data to log\n   */\n  public log(level: LogLevel, message: string, data?: unknown): void {\n    this.sharedLogger.log(level, message, data);\n  }\n\n  /**\n   * Convenience methods for different log levels\n   */\n  public trace(message: string, data?: unknown): void {\n    this.sharedLogger.trace(message, data);\n  }\n\n  public debug(message: string, data?: unknown): void {\n    this.sharedLogger.debug(message, data);\n  }\n\n  public info(message: string, data?: unknown): void {\n    this.sharedLogger.info(message, data);\n  }\n\n  public warn(message: string, data?: unknown): void {\n    this.sharedLogger.warn(message, data);\n  }\n\n  public error(message: string, data?: unknown): void {\n    this.sharedLogger.error(message, data);\n  }\n\n  public fatal(message: string, data?: unknown): void {\n    this.sharedLogger.fatal(message, data);\n  }\n\n  /**\n   * Custom logger function that delegates to the shared logger\n   *\n   * @param level - Log level (info, error, warn, debug)\n   * @param message - Log message\n   * @param data - Additional data to log\n   */\n  private customLogger(level: string, message: string, data?: unknown): void {\n    // Map string level to LogLevel enum\n    let logLevel: LogLevel;\n    switch (level.toLowerCase()) {\n      case \"trace\":\n        logLevel = LogLevel.TRACE;\n        break;\n      case \"debug\":\n        logLevel = LogLevel.DEBUG;\n        break;\n      case \"info\":\n        logLevel = LogLevel.INFO;\n        break;\n      case \"warn\":\n        logLevel = LogLevel.WARN;\n        break;\n      case \"error\":\n        logLevel = LogLevel.ERROR;\n        break;\n      case \"fatal\":\n        logLevel = LogLevel.FATAL;\n        break;\n      default:\n        logLevel = LogLevel.INFO;\n    }\n\n    this.sharedLogger.log(logLevel, message, data);\n  }\n}\n\n/**\n * Factory function to create a logger plugin instance\n *\n * @param options - Configuration options for the logger plugin\n * @returns A new LoggerPlugin instance\n *\n * @example Basic Configuration\n * ```typescript\n * const loggerPlugin = createLoggerPlugin({\n *   format: 'text',\n *   logLevel: LogLevel.DEBUG,\n *   logRequests: true,\n *   logResponses: false,\n *   useColors: true,\n *   includeTimestamp: true\n * });\n * ```\n *\n * @example Production Configuration\n * ```typescript\n * const loggerPlugin = createLoggerPlugin({\n *   format: 'json',\n *   logLevel: LogLevel.WARN,\n *   logRequests: false,\n *   logResponses: false,\n *   logErrors: true,\n *   useColors: false,\n *   includeTimestamp: true,\n *   includeComponentName: false\n * });\n * ```\n */\nexport function createLoggerPlugin(\n  _options?: LoggerPluginOptions,\n): LoggerPlugin {\n  const plugin = new LoggerPlugin();\n  return plugin;\n}\n","export * from \"./client\";\nexport * from \"./verify\";\nexport * from \"./errors\";\nexport * from \"./builders\";\nexport * from \"./plugins/metrics\";\nexport * from \"./plugins/logger\";\nexport * from \"./middleware/metrics\";\nexport * from \"./shared/logger\";\nexport * from \"./types\";\nexport { and, or, type Flatten } from \"@unkey/rbac\";\n"],"mappings":";AAmBO,IAAM,aAAN,MAAuD;AAAA,EAK5D,YAAoB,QAAyC;AAAzC;AAAA,EAA0C;AAAA,EAJtD,UAEJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBL,OAAO,OAAqB;AAC1B,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,MAAoB;AAC3B,SAAK,QAAQ,OAAO;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,WAAW,QAAsB;AAC/B,SAAK,QAAQ,SAAS;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,aAAa,MAAqC;AAChD,SAAK,QAAQ,OAAO,EAAE,GAAG,KAAK,QAAQ,MAAM,GAAG,KAAK;AACpD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,gBAAkC,aAAiC;AACjE,SAAK,QAAQ,cAAc;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,cAAgC,YAA6C;AAC3E,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,QAAQ,cAAc,CAAC;AAAA,IAC9B;AACA,SAAK,QAAQ,YAAY,KAAK,UAAU;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,OAAuB;AAC/B,SAAK,QAAQ,QAAQ;AACrB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,eAAe,WAAyB;AACtC,SAAK,QAAQ,UAAU;AACvB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,MAAkB;AAC1B,SAAK,QAAQ,UAAU,KAAK,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,kBAAkB,WAAyB;AACzC,SAAK,QAAQ,YAAY;AACzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,cAAc,QAA0D;AACtE,SAAK,QAAQ,YAAY;AACzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQ,UAAU,MAAY;AAC5B,SAAK,QAAQ,UAAU;AACvB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,eAAe,YAA0B;AACvC,SAAK,QAAQ,aAAa;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAEE;AACA,WAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,WAAiD;AAC/C,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,KAAK,QAAQ,OAAO;AACvB,aAAO,KAAK,oBAAoB;AAAA,IAClC;AAEA,QAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,WAAW,KAAK,IAAI,GAAG;AAC9D,aAAO,KAAK,uCAAuC;AAAA,IACrD;AAEA,QAAI,KAAK,QAAQ,cAAc,UAAa,KAAK,QAAQ,YAAY,GAAG;AACtE,aAAO,KAAK,mCAAmC;AAAA,IACjD;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,SAUJ;AACA,UAAM,aAAa,KAAK,SAAS;AACjC,QAAI,CAAC,WAAW,OAAO;AACrB,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,sBAAsB,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC3D,MAAM;AAAA,UACN,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,KAAK;AAAA,MAC5B,KACG;AAAA,IACL;AAAA,EACF;AACF;AAOO,IAAM,yBAAN,MAAmE;AAAA,EAMxE,YACU,QACR,KACA;AAFQ;AAGR,SAAK,UAAU,EAAE,IAAI;AAAA,EACvB;AAAA,EAVQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBR,sBACE,aAC2B;AAC3B,IAAC,KAAK,QAAgB,gBAAgB;AAAA,MACpC,aAAa,EAAE,KAAK,YAAY;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,qBACE,aAC2B;AAC3B,IAAC,KAAK,QAAgB,gBAAgB;AAAA,MACpC,aAAa,EAAE,IAAI,YAAY;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,oBACE,OAC2B;AAC3B,IAAC,KAAK,QAAgB,gBAAgB,EAAE,aAAa,MAAM;AAC3D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAEJ;AACA,WAAO,MAAM,KAAK,OAAO,KAAK;AAAA,MAC5B,KAAK;AAAA,IAGP;AAAA,EACF;AACF;AAKO,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAoB,QAAyC;AAAzC;AAAA,EAA0C;AAAA,EAJtD,UAEJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,SAAS,MAAoB;AAC3B,SAAK,QAAQ,OAAO;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAiD;AAC/C,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,aAAO,KAAK,sBAAsB;AAAA,IACpC;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,aAA2B;AACrC,IAAC,KAAK,QAAgB,cAAc;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAUJ;AACA,UAAM,aAAa,KAAK,SAAS;AACjC,QAAI,CAAC,WAAW,OAAO;AACrB,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,sBAAsB,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC3D,MAAM;AAAA,UACN,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,KAAK;AAAA,MAC5B,KACG;AAAA,IACL;AAAA,EACF;AACF;AAKO,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAoB,QAAyC;AAAzC;AAAA,EAA0C;AAAA,EAJtD,UAEJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,SAAS,MAAoB;AAC3B,SAAK,QAAQ,OAAO;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,aAA2B;AACzC,SAAK,QAAQ,cAAc;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAcJ;AACA,QAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,UACN,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,YAAY;AAAA,MACnC,KACG;AAAA,IACL;AAAA,EACF;AACF;AAKO,IAAM,cAAN,MAAkB;AAAA,EAOvB,YAAoB,QAAyC;AAAzC;AAAA,EAA0C;AAAA,EANtD,UAIJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUL,SAAS,MAAoB;AAC3B,SAAK,QAAQ,OAAO;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,aAA2B;AACzC,SAAK,QAAQ,cAAc;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,aAA6B;AAC3C,SAAK,QAAQ,cAAc;AAC3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,YAA0B;AACtC,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,QAAQ,cAAc,CAAC;AAAA,IAC9B;AACA,SAAK,QAAQ,YAAY,KAAK,UAAU;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAYJ;AACA,QAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,UACN,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,YAAY;AAAA,MACnC,KACG;AAAA,IACL;AAAA,EACF;AACF;;;AC3rBA,IAAM,UAAU;AAoBT,SAAS,aAAa,MAAuC;AAClE,MAAI;AACJ,MAAI;AACJ,QAAM,cAAc,CAAC,yBAAyB,OAAO,EAAE;AAEvD,MAAI;AACF,QAAI,OAAO,YAAY,aAAa;AAClC,UAAI,QAAQ,IAAI,yBAAyB;AACvC,eAAO;AAAA,MACT;AACA,iBAAW,QAAQ,IAAI,SACnB,WACA,QAAQ,IAAI,aACV,QACA;AAGN,UAAI,OAAO,gBAAgB,aAAa;AACtC,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU,QAAQ,QAAQ,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB;AAC1B,kBAAY,KAAK,KAAK,iBAAiB;AAAA,IACzC;AAAA,EACF,SAAS,QAAQ;AAAA,EAAC;AAElB,SAAO,EAAE,UAAU,SAAS,YAAY;AAC1C;;;AC2ZO,IAAM,kCAAN,MAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BhB,YAAY,MAAqB;AAC/B,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,UAAU,KAAK,WAAW,KAAK;AACpC,SAAK,eAAe,KAAK;AAEzB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,YAAY,aAAa,IAAI;AAAA,IACpC;AAEA,SAAK,QAAQ,KAAK;AAIlB,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,UAAU,KAAK,OAAO,YAAY;AAAA,MAClC,SAAS,KAAK,OAAO,YAAY,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBQ,aAAqC;AAC3C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK,OAAO;AAAA,IACvC;AACA,QAAI,KAAK,WAAW,aAAa;AAC/B,cAAQ,qBAAqB,IAAI,KAAK,UAAU,YAAY,KAAK,GAAG;AAAA,IACtE;AACA,QAAI,KAAK,WAAW,UAAU;AAC5B,cAAQ,0BAA0B,IAAI,KAAK,UAAU;AAAA,IACvD;AACA,QAAI,KAAK,WAAW,SAAS;AAC3B,cAAQ,yBAAyB,IAAI,KAAK,UAAU;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAc,MAAe,KAA2C;AACtE,QAAI,MAAuB;AAC3B,QAAI,MAAoB;AACxB,aAAS,IAAI,GAAG,KAAK,KAAK,MAAM,UAAU,KAAK;AAC7C,YAAM,MAAM,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAC3D,UAAI,IAAI,OAAO;AACb,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AAC9C,cAAI,OAAO,MAAM,eAAe,MAAM,MAAM;AAC1C;AAAA,UACF;AACA,cAAI,aAAa,IAAI,GAAG,EAAE,SAAS,CAAC;AAAA,QACtC;AAAA,MACF;AACA,YAAM,MAAM,MAAM,KAAK;AAAA,QACrB,QAAQ,IAAI;AAAA,QACZ,SAAS,KAAK,WAAW;AAAA,QACzB,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK,UAAU,IAAI,IAAI;AAAA,MAC/B,CAAC,EAAE,MAAM,CAAC,MAAa;AACrB,cAAM;AACN,eAAO;AAAA,MACT,CAAC;AAED,UAAI,OAAO,IAAI,UAAU,OAAO,IAAI,UAAU,KAAK;AACjD,eAAO,EAAE,QAAS,MAAM,IAAI,KAAK,EAAc;AAAA,MACjD;AAEA,UAAI,OAAO,IAAI,UAAU,OAAO,IAAI,UAAU,KAAK;AACjD,eAAQ,MAAM,IAAI,KAAK;AAAA,MACzB;AACA,YAAM,UAAU,KAAK,MAAM,QAAQ,CAAC;AACpC,cAAQ;AAAA,QACN,WAAW,IAAI,CAAC,OACd,KAAK,MAAM,WAAW,CACxB,aAAa,GAAG,wBAAwB,OAAO,eAC7C,KAAK,MACP,MAAM,KAAK,QAAQ,IAAI,kBAAkB,CAAC;AAAA,MAC5C;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,IACjD;AAEA,QAAI,KAAK;AACP,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB;AAEA,WAAO;AAAA,MACL,OAAO;AAAA;AAAA,QAEL,MAAM;AAAA;AAAA,QAEN,SAAS,KAAK,WAAW;AAAA,QACzB,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,IAAW,WAAW;AACpB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBL,OAAO,YAIF;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,UAAU;AAAA,UACvB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoDA,IAAW,OAAO;AAChB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA+CL,SAAS,MAAkB,IAAI,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkC9C,YAAY,CACV,QAEA,IAAI,uBAAqC,MAAM,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA2CpD,QAAQ,OACN,QAKG;AAEH,cAAM,cAAc;AAAA,UAClB,GAAG;AAAA,UACH,OAAO,IAAI,SAAS,KAAK;AAAA,QAC3B;AAEA,YAAI,CAAC,YAAY,OAAO;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,aAAa;AAAA,UAC1B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,gBAAgB,OACd,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,qBAAqB;AAAA,UAClC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,gBAAgB,OACd,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,qBAAqB;AAAA,UAClC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,mBAAmB,OACjB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,UAAU,OACR,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe;AAAA,UAC5B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,aAAa,OACX,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kBAAkB;AAAA,UAC/B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,UAAU,OACR,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe;AAAA,UAC5B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6BA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwDA,QAAQ,OACN,QAQG;AAEH,cAAM,QAAQ,IAAI,SAAS,KAAK;AAChC,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc;AAAA,UAClB,GAAG;AAAA,UACH;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkCA,iBAAiB,OACf,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,sBAAsB;AAAA,UACnC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,KAAK,OACH,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,aAAa;AAAA,UAC1B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA2BA,kBAAkB,OAChB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,uBAAuB;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,IAAW,OAAO;AAChB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiCL,SAAS,MAAkB,IAAI,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyB9C,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,iBAAiB;AAAA,UAC9B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,KAAK,OACH,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,aAAa;AAAA,UAC1B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,UAAU,OACR,QAKG;AAEH,cAAM,cAAc;AAAA,UAClB,GAAG;AAAA,UACH,OAAO,IAAI,SAAS,KAAK;AAAA,QAC3B;AAEA,YAAI,CAAC,YAAY,OAAO;AACtB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe;AAAA,UAC5B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCA,IAAW,cAAc;AACvB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBL,aAAa,MAAmB,IAAI,YAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBpD,mBAAmB,MAAyB,IAAI,kBAAkB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BtE,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,SAAS,OACP,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,qBAAqB;AAAA,UAClC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,WAAW,OACT,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,uBAAuB;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,kBAAkB,OAChB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,8BAA8B;AAAA,UAC3C,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,eAAe,OACb,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,iBAAiB,OACf,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,6BAA6B;AAAA,UAC1C,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,kBAAkB,OAChB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,8BAA8B;AAAA,UAC3C,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CA,IAAW,aAAa;AACtB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA+BL,OAAO,OACL,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kBAAkB;AAAA,UAC/B,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,aAAa,OACX,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,eAAe,OACb,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,0BAA0B;AAAA,UACvC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,aAAa,OACX,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,gBAAgB,OACd,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,IAAW,aAAa;AACtB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA2BL,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,KAAK,OACH,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,MAAM,OACJ,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,2BAA2B;AAAA,UACxC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAW,YAAY;AACrB,WAAO;AAAA,MACL,kBAAkB,OAChB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,4BAA4B;AAAA,UACzC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAW,aAAa;AACtB,WAAO;AAAA,MACL,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,uBAAuB;AAAA,UACpC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,aAAa,OACX,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,cAAc;AACvB,WAAO;AAAA,MACL,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,QAAQ;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OACN,QAOG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,QAAQ;AAAA,UACpC,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,YAAY;AAAA,UACxC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,OACH,QAMG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,IAAI,SAAS;AAAA,UACzC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,UAAU,OACR,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,UAAU;AAAA,UACtC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,gBAAgB,OACd,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,eAAe,YAAY,SAAS;AAAA,UACjD,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,YAAY;AACrB,WAAO;AAAA,MACL,cAAc,OACZ,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kBAAkB;AAAA,UAC/B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,uBAAuB,OACrB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,oBAAoB,WAAW;AAAA,UAC5C,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OACN,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,YAAY;AAAA,UACzB,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,cAAc,OACZ,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kBAAkB;AAAA,UAC/B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,kBAAkB,OAChB,QAMG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,oBAAoB,IAAI,IAAI,OAAO;AAAA,UAChD,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,OAAO,OACL,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,WAAW;AAAA,UACxB,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,YAAY,OACV,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,gBAAgB;AAAA,UAC7B,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,eAAe,OACb,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kBAAkB,KAAK;AAAA,UACpC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,aAAa,OACX,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,0BAA0B;AAAA,UACvC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,oBAAoB,OAClB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,kCAAkC;AAAA,UAC/C,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB,OACjB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB,OACjB,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,wBAAwB;AAAA,UACrC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,gBAAgB,OACd,QAMG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,MAAM,mBAAmB,IAAI,SAAS;AAAA,UAC7C,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAU;AACnB,WAAO;AAAA,MACL,YAAY;AAAA,QACV,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,kBAAkB,MAAM;AAAA,YACrC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,WAAW,OACT,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,kBAAkB,WAAW;AAAA,YAC1C,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,UAAU,OACR,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,kBAAkB,UAAU;AAAA,YACzC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,aAAa,MAAM;AAAA,YAChC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,UAAU,OACR,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,aAAa,UAAU;AAAA,YACpC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,cAAc,iBAAiB,MAAM;AAAA,YAClD,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,UAAU,OACR,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,cAAc,iBAAiB,UAAU;AAAA,YACtD,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,SAAS;AAClB,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,QAAQ,OACN,QAKG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,UAAU,MAAM;AAAA,YAC7B,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,QAAQ,OACN,QAKG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,UAAU,QAAQ,QAAQ;AAAA,YACvC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAMG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,MAAM,UAAU,QAAQ,IAAI,aAAa,MAAM;AAAA,YACtD,QAAQ;AAAA,YACR,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0EA,IAAW,KAAK;AACd,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuCL,QAAQ,OACN,QAOG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC;AAAA,UACP,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiCA,oBAAoB,OAClB,QAOG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,UAAU;AAAA,UACjB,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,YAAY,OACV,QAOG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,YAAY;AAAA,UACnB,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,YAAY,OACV,QAOG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,OAAO;AAAA,UACd,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAiCb,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,kBAAkB,QAAQ;AAAA,YACjC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,kBAAkB,MAAM;AAAA,YAC/B,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,iBAAiB;AAAA,QACf,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,oBAAoB,QAAQ;AAAA,YACnC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,oBAAoB,MAAM;AAAA,YACjC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,qBAAqB;AAAA,QACnB,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,wBAAwB,QAAQ;AAAA,YACvC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,wBAAwB,MAAM;AAAA,YACrC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,cAAc,YAAY,QAAQ;AAAA,YACzC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,cAAc,YAAY,MAAM;AAAA,YACvC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,YAAY,QAAQ;AAAA,YAC3B,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,YAAY,MAAM;AAAA,YACzB,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,QACpB,QAAQ,OACN,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,YAAY,UAAU,QAAQ;AAAA,YACrC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,MAAM,OACJ,QAOG;AACH,iBAAO,MAAM,KAAK,MAAM;AAAA,YACtB,MAAM,CAAC,YAAY,UAAU,MAAM;AAAA,YACnC,QAAQ;AAAA,YACR,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,WAAW,OACT,QAKG;AACH,eAAO,MAAM,KAAK,MAAM;AAAA,UACtB,MAAM,CAAC,WAAW;AAAA,UAClB,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,MAAa,UACX,UAOI,CAAC,GAC4C;AACjD,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,QAAQ,WAAW;AACrB,UAAI,OAAO,QAAQ,cAAc,UAAU;AAEzC,cAAM,QAAQ,QAAQ,UAAU,MAAM,kBAAkB;AACxD,YAAI,OAAO;AACT,gBAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,CAAC;AACtC,gBAAM,OAAO,MAAM,CAAC;AACpB,gBAAM,MAAM,KAAK,IAAI;AACrB,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,wBAAU,MAAM,QAAQ,KAAK,KAAK;AAClC;AAAA,YACF,KAAK;AACH,wBAAU,MAAM,QAAQ,KAAK,KAAK,KAAK;AACvC;AAAA,YACF,KAAK;AACH,wBAAU,MAAM,QAAQ,KAAK;AAC7B;AAAA,YACF,KAAK;AACH,wBAAU,MAAM,QAAQ,IAAI,KAAK,KAAK,KAAK;AAC3C;AAAA,YACF,KAAK;AACH,wBAAU,MAAM,QAAQ,MAAM,KAAK,KAAK,KAAK;AAC7C;AAAA,UACJ;AAAA,QACF,OAAO;AACL,gBAAM,IAAI;AAAA,YACR,8BAA8B,QAAQ,SAAS;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,QAAQ,aAAa,GAAG;AAC1B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,kBAAU,KAAK,IAAI,IAAI,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,YACtB;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,QAAQ;AAAA,MACf,UAAU;AAAA;AAAA,IACZ,IACA;AAEJ,WAAO,MAAM,KAAK,KAAK,OAAO;AAAA,MAC5B,OAAO,KAAK;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAa,WAAW,KAA+B;AACrD,QAAI,CAAC,KAAK,cAAc;AACtB,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK,OAAO;AAAA,QACpC;AAAA,QACA,OAAO,KAAK;AAAA,MACd,CAAC;AAED,aAAO,OAAO,QAAQ,SAAS;AAAA,IACjC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,YACX,UAGI,CAAC,GACoC;AACzC,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAuC,CAAC;AAC9C,QAAI;AAEJ,OAAG;AACD,YAAM,SAAS,MAAM,KAAK,KAAK,SAAS;AAAA,QACtC,OAAO,KAAK;AAAA,QACZ,OAAO,QAAQ,SAAS;AAAA,QACxB;AAAA,QACA,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,UAAI,OAAO,OAAO;AAChB,cAAM,IAAI,MAAM,OAAO,MAAM,OAAO;AAAA,MACtC;AAEA,UAAI,OAAO,QAAQ,MAAM;AACvB,aAAK,KAAK,GAAG,OAAO,OAAO,IAAI;AAAA,MACjC;AAEA,eAAS,OAAO,QAAQ;AAAA,IAC1B,SAAS;AAET,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,gBAAgB,SAI1B;AACD,QAAI,CAAC,QAAQ,WAAW;AACtB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,UAAU,aAAa;AAAA,MACvC,OAAO,KAAK;AAAA,MACZ,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,MACnB,YAAY,QAAQ;AAAA,MACpB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,yBAAyB,SAKnC;AACD,QAAI,CAAC,QAAQ,WAAW;AACtB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,UAAU,sBAAsB;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAa,kBAAkB,aAK5B;AACD,WAAO,MAAM,KAAK,GAAG,OAAO;AAAA,MAC1B,MAAM;AAAA,QACJ;AAAA,UACE,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,UACrB,aAAa,YAAY;AAAA,UACzB,QAAQ,YAAY;AAAA,UACpB,MAAM,YAAY,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,UAC/D,UAAU,YAAY,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKO,IAAM,8BAA8B;;;ACxsHpC,SAAS,UACd,KAMA;AAGA,QAAM,QAAQ,IAAI,gCAAgC,EAAE,SAAS,SAAS,CAAC;AACvE,SAAO,MAAM,KAAK,OAAO,OAAO,QAAQ,WAAW,EAAE,KAAK,IAAI,IAAI,GAAG;AACvE;;;AC3BA;AAAA,EAKE;AAAA,OACK;AACP,SAAS,KAAAA,UAAS;;;ACPlB,SAAS,SAAS;AAKX,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,SAAM,KAAN;AAPU,SAAAA;AAAA,GAAA;AAaL,IAAM,4BAA4B,EACtC,OAAO;AAAA;AAAA,EAEN,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAAA;AAAA,EAEzD,UAAU,EAAE,WAAW,QAAQ,EAAE,QAAQ,YAAa;AAAA;AAAA,EAEtD,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEzE,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEnC,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAE1C,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAE9C,eAAe,EAAE,OAAO,EAAE,QAAQ,YAAY;AAChD,CAAC,EACA,OAAO;AA4BH,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA;AAAA,EAGS,SAAS;AAAA,IACxB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EAEA,YAAY,UAAwC,CAAC,GAAG;AACtD,SAAK,UAAU,0BAA0B,MAAM,OAAO;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsB;AAC3C,SAAK,IAAI,eAAgB,SAAS,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsB;AAC3C,SAAK,IAAI,eAAgB,SAAS,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsB;AAC1C,SAAK,IAAI,cAAe,SAAS,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsB;AAC1C,SAAK,IAAI,cAAe,SAAS,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsB;AAC3C,SAAK,IAAI,eAAgB,SAAS,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsB;AAC3C,SAAK,IAAI,eAAgB,SAAS,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAI,OAAiB,SAAiB,MAAsB;AAEjE,QAAI,QAAQ,KAAK,QAAQ,UAAU;AACjC;AAAA,IACF;AAEA,SAAK,UAAU,SAAS,KAAK,EAAE,YAAY,GAAG,SAAS,IAAI;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU,SAA6C;AAC5D,SAAK,UAAU,0BAA0B,MAAM;AAAA,MAC7C,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,cAAwB;AAC7B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,OAAuB;AACxC,SAAK,QAAQ,WAAW;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,OAA0B;AAC9C,WAAO,SAAS,KAAK,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,UAAU,OAAe,SAAiB,MAAsB;AACtE,UAAM,YAAY,KAAK,QAAQ,oBAC3B,oBAAI,KAAK,GAAE,YAAY,IACvB;AACJ,UAAM,gBAAgB,KAAK,QAAQ,uBAC/B,KAAK,QAAQ,gBACb;AAEJ,UAAM,WAAoC;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,WAAW;AACb,eAAS,YAAY;AAAA,IACvB;AAEA,QAAI,eAAe;AACjB,eAAS,YAAY;AAAA,IACvB;AAEA,QAAI,MAAM;AACR,eAAS,OAAO;AAAA,IAClB;AAEA,QAAI;AAEJ,YAAQ,KAAK,QAAQ,QAAQ;AAAA,MAC3B,KAAK;AACH,2BAAmB,KAAK,UAAU,UAAU,MAAM,CAAC;AACnD;AAAA,MACF,KAAK;AACH,2BAAmB,KAAK;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,QAAQ,iBAAiB;AAChC,6BAAmB,KAAK,QAAQ,gBAAgB,QAAQ;AAAA,QAC1D,OAAO;AACL,6BAAmB,KAAK,UAAU,QAAQ;AAAA,QAC5C;AACA;AAAA,MACF;AACE,2BAAmB,KAAK,UAAU,QAAQ;AAAA,IAC9C;AAGA,QAAI,KAAK,QAAQ,aAAa,KAAK,QAAQ,WAAW,QAAQ;AAC5D,yBAAmB,KAAK,gBAAgB,OAAO,gBAAgB;AAAA,IACjE;AAGA,SAAK,gBAAgB,OAAO,gBAAgB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,kBACN,OACA,SACA,MACA,WACA,eACQ;AACR,UAAM,QAAkB,CAAC;AAEzB,QAAI,WAAW;AACb,YAAM,KAAK,IAAI,SAAS,GAAG;AAAA,IAC7B;AAEA,QAAI,eAAe;AACjB,YAAM,KAAK,IAAI,aAAa,GAAG;AAAA,IACjC;AAEA,UAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG;AACpC,UAAM,KAAK,OAAO;AAElB,QAAI,mBAAmB,MAAM,KAAK,GAAG;AAErC,QAAI,MAAM;AACR,0BAAoB;AAAA,EAAK,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAe,SAAyB;AAC9D,QAAI,CAAC,KAAK,QAAQ,WAAW;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,YAAQ,MAAM,YAAY,GAAG;AAAA,MAC3B,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO,MAAM,KAAK,OAAO;AACtC;AAAA,MACF;AACE,gBAAQ,KAAK,OAAO;AAAA,IACxB;AAEA,WAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,OAAO,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAe,SAAuB;AAC5D,YAAQ,MAAM,YAAY,GAAG;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,MAAM,OAAO;AACrB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,MAAM,OAAO;AACrB;AAAA,MACF;AACE,gBAAQ,IAAI,OAAO;AAAA,IACvB;AAAA,EACF;AACF;AAkBO,SAAS,mBACd,SACc;AACd,SAAO,IAAI,aAAa,OAAO;AACjC;;;ACvSO,SAAS,wBACd,UAA0B,CAAC,GACf;AACZ,QAAM;AAAA,IACJ,cAAc;AAAA,IACd,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,EACX,IAAI;AAGJ,QAAM,eAAe,mBAAmB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,CAAC;AAGD,QAAM,cACJ,WACC,CAAC,OAAe,SAAiB,SAAmB;AACnD,UAAM,eACJ,UAAU,wBAEN,UAAU,0BAER,UAAU,wBAER,UAAU;AAGpB,iBAAa,IAAI,cAAc,SAAS,IAAI;AAAA,EAC9C;AAEF,QAAM,eAAe,CAAC,SAA2B;AAC/C,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,eAAe;AAC3D,aAAO,GAAG,KAAK,UAAU,GAAG,aAAa,CAAC;AAAA,IAC5C;AACA,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,MAAM,KAAK,UAAU,IAAI;AAC/B,UAAI,IAAI,SAAS,eAAe;AAC9B,eAAO,GAAG,IAAI,UAAU,GAAG,aAAa,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,QAAQ,OAAO,SAAqB,YAA+B;AACjE,UAAI,aAAa;AACf,cAAM,UAAmC;AAAA,UACvC,WAAW,QAAQ;AAAA,UACnB,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;AAAA,UAC3B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAEA,YAAI,kBAAkB,QAAQ,SAAS;AACrC,kBAAQ,UAAU,QAAQ;AAAA,QAC5B;AAEA,YAAI,QAAQ,OAAO;AACjB,kBAAQ,QAAQ,QAAQ;AAAA,QAC1B;AAEA,YAAI,QAAQ,MAAM;AAChB,kBAAQ,OAAO,aAAa,QAAQ,IAAI;AAAA,QAC1C;AAEA,oBAAY,QAAQ,IAAI,QAAQ,SAAS,sBAAsB,OAAO;AAAA,MACxE;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,OACL,UACA,SACA,YACG;AACH,UAAI,cAAc;AAChB,cAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AACtC,cAAM,UAAmC;AAAA,UACvC,WAAW,QAAQ;AAAA,UACnB,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;AAAA,UAC3B,QAAQ,SAAS;AAAA,UACjB,UAAU,GAAG,QAAQ;AAAA,UACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAEA,YAAI,kBAAkB,SAAS,SAAS;AACtC,kBAAQ,kBAAkB,SAAS;AAAA,QACrC;AAEA,YAAI,qBAAqB,SAAS,MAAM;AACtC,kBAAQ,eAAe,aAAa,SAAS,IAAI;AAAA,QACnD;AAEA;AAAA,UACE;AAAA,UACA,IAAI,QAAQ,SAAS;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OACP,OACA,SACA,YACG;AACH,UAAI,WAAW;AACb,cAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AACtC,oBAAY,SAAS,IAAI,QAAQ,SAAS,oBAAoB;AAAA,UAC5D,WAAW,QAAQ;AAAA,UACnB,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ,KAAK,KAAK,GAAG;AAAA,UAC3B,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb,UAAU,GAAG,QAAQ;AAAA,UACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC9IA,IAAM,0BAAN,MAA0D;AAAA,EACxD,OAAO,MAAc,OAAe,MAAqC;AACvE,YAAQ,IAAI,WAAW,IAAI,MAAM,KAAK,MAAM,IAAI;AAAA,EAClD;AAAA,EAEA,UAAU,MAAc,OAAgB,MAAqC;AAC3E,YAAQ,IAAI,cAAc,IAAI,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EACzD;AAAA,EAEA,MAAM,MAAc,OAAe,MAAqC;AACtE,YAAQ,IAAI,UAAU,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC/C;AACF;AAyCO,SAAS,wBACd,UAA0B,CAAC,GACf;AACZ,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,cAAc,CAAC;AAAA,IACf,YAAY,IAAI,wBAAwB;AAAA,IACxC;AAAA,IACA,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB,IAAI;AAGJ,MAAI,qBAAqC;AACzC,MAAI,sBAAwC;AAC5C,MAAI,mBAAmC;AAEvC,MAAI,cAAc,WAAW;AAC3B,yBAAqB,UAAU,cAAc,sBAAsB;AAAA,MACjE,aAAa;AAAA,MACb,MAAM;AAAA,IACR,CAAC;AAED,0BAAsB,UAAU;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAEA,uBAAmB,UAAU,cAAc,oBAAoB;AAAA,MAC7D,aAAa;AAAA,MACb,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,QAAQ,OAAO,SAAqB,YAA+B;AAEjE,cAAQ,iBAAiB,QAAQ,kBAAkB,CAAC;AACpD,cAAQ,eAAe,mBAAmB,KAAK,IAAI;AAEnD,YAAM,WAAW,QAAQ,KAAK,KAAK,GAAG;AACtC,YAAM,SAAS,QAAQ;AAGvB,gBAAU,UAAU,6BAA6B,GAAG;AAAA,QAClD,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC;AAGD,UAAI,oBAAoB;AACtB,2BAAmB,IAAI,GAAG;AAAA,UACxB,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,eAAe;AAAA,UACf,cAAc;AAAA,UACd,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,OACL,UACA,SACA,YACG;AACH,YAAM,YAAY,QAAQ,gBAAgB;AAC1C,YAAM,WAAW,YAAY,KAAK,IAAI,IAAI,YAAY;AAEtD,YAAM,WAAW,QAAQ,KAAK,KAAK,GAAG;AACtC,YAAM,SAAS,QAAQ;AACvB,YAAM,SAAS,SAAS,QAAQ,SAAS,KAAK;AAE9C,YAAM,OAAO;AAAA,QACX,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,iBAAiB,WAAW,GAAG;AAEjC,kBAAU,OAAO,+BAA+B,UAAU,IAAI;AAG9D,YAAI,qBAAqB;AACvB,8BAAoB,OAAO,WAAW,KAAM;AAAA,YAC1C,gBAAgB;AAAA,YAChB,mBAAmB;AAAA,YACnB,eAAe;AAAA,YACf,cAAc;AAAA,YACd,oBAAoB;AAAA,YACpB,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF;AAGA,gBAAU,UAAU,8BAA8B,GAAG,IAAI;AAEzD,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OACP,OACA,SACA,aACG;AACH,UAAI,eAAe;AACjB,cAAM,WAAW,QAAQ,KAAK,KAAK,GAAG;AACtC,cAAM,SAAS,QAAQ;AACvB,cAAM,YAAY,MAAM,YAAY;AAGpC,kBAAU,UAAU,2BAA2B,GAAG;AAAA,UAChD,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAGD,YAAI,kBAAkB;AACpB,2BAAiB,IAAI,GAAG;AAAA,YACtB,gBAAgB;AAAA,YAChB,mBAAmB;AAAA,YACnB,eAAe;AAAA,YACf,cAAc;AAAA,YACd,cAAc;AAAA,YACd,GAAG;AAAA,UACL,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AHpNO,SAAS,aACd,aACA,gBACkB;AAClB,MAAI;AACF,WAAO,QAAQ,SAAS,aAAa,cAAc;AAAA,EACrD,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO;AAAA,EACT;AACF;AAKO,IAAM,6BAA6BC,GACvC,OAAO;AAAA;AAAA,EAEN,WAAWA,GAAE,OAAyB,EAAE,SAAS;AAAA;AAAA,EAEjD,cAAcA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEtC,qBAAqBA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAE7C,aAAaA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE5C,iBAAiBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAE3C,eAAeA,GAAE,OAAO,EAAE,IAAI,GAAI,EAAE,IAAI,GAAM,EAAE,QAAQ,GAAK;AAAA;AAAA,EAE7D,WAAWA,GAAE,OAAkB,EAAE,SAAS;AAAA;AAAA,EAE1C,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,YAAY;AAAA;AAAA,EAE5D,gBAAgBA,GACb,OAAO,EACP,MAAM,2BAA2B,EACjC,QAAQ,OAAO;AAAA;AAAA,EAElB,YAAYA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,oBAAoBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAE9C,mBAAmBA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEjD,mBAAmBA,GAAE,OAAO,EAAE,IAAI,GAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,GAAK;AAAA;AAAA,EAEhE,oBAAoBA,GACjB,KAAK,CAAC,iBAAiB,WAAW,CAAC,EACnC,QAAQ,eAAe;AAC5B,CAAC,EACA,OAAO;AAiEH,IAAM,gBAAN,MAAsC;AAAA,EAC3C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cACE;AAAA,EAEM;AAAA,EACA;AAAA,EACA,eAMH,CAAC;AAAA;AAAA,EAGE;AAAA,EACA,eAAyC,oBAAI,IAAI;AAAA,EACjD,iBAA6C,oBAAI,IAAI;AAAA,EACrD,aAAqC,oBAAI,IAAI;AAAA,EAC7C,cAAc;AAAA,EACd,iBAAiB;AAAA,EAEzB,MAAM,WACJ,SACA,UAAmC,CAAC,GACrB;AAEf,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,2BAA2B,MAAM,OAAO;AAG5C,SAAK,cAAc;AACnB,SAAK,iBAAiB;AAGtB,QAAI,cAAc,WAAW;AAC3B,WAAK,YAAY;AACjB,WAAK,0BAA0B;AAG/B,UAAI,oBAAoB;AACtB,gBAAQ,IAAI,oCAAoC;AAAA,UAC9C,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY,CAAC,CAAC;AAAA,UACd,aAAa,oBACT,OAAO,KAAK,iBAAiB,EAAE,SAC/B;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IACF;AAGA,SAAK,mBAAmB,aAAa;AAAA,MACnC,QAAQ,CAAC,MAAM,OAAO,SAAS;AAC7B,aAAK,aAAa,UAAU,MAAM,OAAO,IAAI;AAC7C,aAAK,oBAAoB,MAAM,OAAO,IAAI;AAAA,MAC5C;AAAA,MACA,WAAW,CAAC,MAAM,OAAO,SAAS;AAChC,aAAK,aAAa,WAAW,MAAM,SAAS,GAAG,IAAI;AACnD,aAAK,kBAAkB,MAAM,SAAS,GAAG,IAAI;AAAA,MAC/C;AAAA,MACA,OAAO,CAAC,MAAM,OAAO,SAAS;AAC5B,aAAK,aAAa,SAAS,MAAM,OAAO,IAAI;AAC5C,aAAK,gBAAgB,MAAM,OAAO,IAAI;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,mBAAmB,gBAAgB,GAAG;AACxC,WAAK,aAAa,YAAY,MAAM;AAClC,aAAK,aAAa,eAAe;AAAA,MACnC,GAAG,aAAa;AAAA,IAClB;AAEA,YAAQ,IAAI,6BAA6B;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,CAAC,CAAC,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,sBAAsB,CAAC,CAAC;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAAA,IAC/B;AAGA,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAA8B;AAC5B,QAAI,CAAC,KAAK,kBAAkB;AAC1B,aAAO,CAAC;AAAA,IACV;AAEA,WAAO;AAAA,MACL,wBAAwB;AAAA,QACtB,WAAW,KAAK;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,sBAA+C;AAC7C,WAAO;AAAA,MACL,YAAY,MAAM,CAAC,GAAG,KAAK,YAAY;AAAA,MACvC,cAAc,MAAM;AAClB,aAAK,eAAe,CAAC;AAAA,MACvB;AAAA,MACA,cAAc,CAAC,aAAsB,KAAK,aAAa,QAAQ;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,aACN,MACA,MACA,OACA,MACM;AACN,SAAK,aAAa,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAAa,UAAkC;AAC3D,QAAI,KAAK,aAAa,WAAW,GAAG;AAClC;AAAA,IACF;AAEA,UAAMC,WAAU,CAAC,GAAG,KAAK,YAAY;AACrC,SAAK,eAAe,CAAC;AAErB,QAAI,UAAU;AACZ,UAAI;AACF,cAAM,MAAM,UAAU;AAAA,UACpB,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,SAAAA,SAAQ,CAAC;AAAA,QAClC,CAAC;AACD,gBAAQ,IAAI,WAAWA,SAAQ,MAAM,eAAe,QAAQ,EAAE;AAAA,MAChE,SAAS,OAAO;AACd,gBAAQ,MAAM,4BAA4B,KAAK;AAE/C,aAAK,aAAa,QAAQ,GAAGA,QAAO;AAAA,MACtC;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,qBAAqBA,QAAO;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAkC;AACxC,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAGA,UAAM,oBAAoB;AAAA,MACxB;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAEA,eAAW,cAAc,mBAAmB;AAC1C,YAAM,UAAU;AAAA,QACd,aAAa,WAAW;AAAA,QACxB,MAAM,WAAW;AAAA,MACnB;AAEA,cAAQ,WAAW,MAAM;AAAA,QACvB,KAAK,WAAW;AACd,eAAK,aAAa;AAAA,YAChB,WAAW;AAAA,YACX,KAAK,UAAU,cAAc,WAAW,MAAM,OAAO;AAAA,UACvD;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,eAAK,eAAe;AAAA,YAClB,WAAW;AAAA,YACX,KAAK,UAAU,gBAAgB,WAAW,MAAM,OAAO;AAAA,UACzD;AACA;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,eAAK,WAAW;AAAA,YACd,WAAW;AAAA,YACX,KAAK,UAAU,oBAAoB,WAAW,MAAM,OAAO;AAAA,UAC7D;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,MACA,OACA,MACM;AACN,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,YAAY,KAAK,eAAe,IAAI,IAAI;AAC5C,QAAI,CAAC,WAAW;AACd,kBAAY,KAAK,UAAU,gBAAgB,MAAM;AAAA,QAC/C,aAAa,qBAAqB,IAAI;AAAA,QACtC,MAAM;AAAA,MACR,CAAC;AACD,WAAK,eAAe,IAAI,MAAM,SAAS;AAAA,IACzC;AAEA,UAAM,aAAa,KAAK,oBAAoB,IAAI;AAChD,cAAU,OAAO,OAAO,UAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBACN,MACA,OACA,MACM;AACN,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,aAAa,IAAI,IAAI;AACxC,QAAI,CAAC,SAAS;AACZ,gBAAU,KAAK,UAAU,cAAc,MAAM;AAAA,QAC3C,aAAa,mBAAmB,IAAI;AAAA,QACpC,MAAM;AAAA,MACR,CAAC;AACD,WAAK,aAAa,IAAI,MAAM,OAAO;AAAA,IACrC;AAEA,UAAM,aAAa,KAAK,oBAAoB,IAAI;AAChD,YAAQ,IAAI,OAAO,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,MACA,OACA,MACM;AACN,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,WAAW,IAAI,IAAI;AACpC,QAAI,CAAC,OAAO;AACV,cAAQ,KAAK,UAAU,oBAAoB,MAAM;AAAA,QAC/C,aAAa,iBAAiB,IAAI;AAAA,QAClC,MAAM;AAAA,MACR,CAAC;AACD,WAAK,WAAW,IAAI,MAAM,KAAK;AAAA,IACjC;AAEA,UAAM,aAAa,KAAK,oBAAoB,IAAI;AAEhD,UAAM,IAAI,OAAO,UAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,MAC2C;AAC3C,UAAM,aAAwD;AAAA,MAC5D,gBAAgB,KAAK;AAAA,MACrB,mBAAmB,KAAK;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB,KAAK;AAAA,IAChC;AAEA,QAAI,MAAM;AACR,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,mBAAW,GAAG,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAmCO,SAAS,oBACd,UACe;AACf,QAAM,SAAS,IAAI,cAAc;AACjC,SAAO;AACT;;;AIliBA,SAAS,KAAAC,UAAS;AASX,IAAM,4BAA4B,0BAA0B,OAAO;AAAA;AAAA,EAExE,SAASC,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAEpC,mBAAmBA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAE3C,aAAaA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAErC,cAAcA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEtC,WAAWA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA,EAEnC,mBAAmBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAE5C,QAAQA,GACL,SAAS,EACT,KAAKA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,QAAQ,EAAE,SAAS,CAAC,EACnD,QAAQA,GAAE,KAAK,CAAC,EAChB,SAAS;AACd,CAAC,EAAE,OAAO;AA2DH,IAAM,eAAN,MAAqC;AAAA,EAC1C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cACE;AAAA,EAEM;AAAA,EACA;AAAA,EAER,MAAM,WACJ,SACA,UAAmC,CAAC,GACrB;AAEf,SAAK,UAAU,0BAA0B,MAAM,OAAO;AAGtD,SAAK,eAAe,IAAI,aAAa;AAAA,MACnC,QAAQ,KAAK,QAAQ;AAAA,MACrB,UAAU,KAAK,QAAQ;AAAA,MACvB,iBAAiB,KAAK,QAAQ;AAAA,MAC9B,WAAW,KAAK,QAAQ;AAAA,MACxB,kBAAkB,KAAK,QAAQ;AAAA,MAC/B,sBAAsB,KAAK,QAAQ;AAAA,MACnC,eAAe,KAAK;AAAA;AAAA,IACtB,CAAC;AAED,SAAK,aAAa,KAAK,4BAA4B;AAAA,MACjD,UAAU,SAAS,KAAK,QAAQ,QAAQ;AAAA,MACxC,QAAQ,KAAK,QAAQ;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,gBAA8B;AAC5B,WAAO;AAAA,MACL,wBAAwB;AAAA,QACtB,aAAa,KAAK,QAAQ;AAAA,QAC1B,cAAc,KAAK,QAAQ;AAAA,QAC3B,WAAW,KAAK,QAAQ;AAAA,QACxB,mBAAmB,KAAK,QAAQ;AAAA,QAChC,QAAQ,KAAK,aAAa,KAAK,IAAI;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAI,OAAiB,SAAiB,MAAsB;AACjE,SAAK,aAAa,IAAI,OAAO,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,SAAiB,MAAsB;AAClD,SAAK,aAAa,MAAM,SAAS,IAAI;AAAA,EACvC;AAAA,EAEO,MAAM,SAAiB,MAAsB;AAClD,SAAK,aAAa,MAAM,SAAS,IAAI;AAAA,EACvC;AAAA,EAEO,KAAK,SAAiB,MAAsB;AACjD,SAAK,aAAa,KAAK,SAAS,IAAI;AAAA,EACtC;AAAA,EAEO,KAAK,SAAiB,MAAsB;AACjD,SAAK,aAAa,KAAK,SAAS,IAAI;AAAA,EACtC;AAAA,EAEO,MAAM,SAAiB,MAAsB;AAClD,SAAK,aAAa,MAAM,SAAS,IAAI;AAAA,EACvC;AAAA,EAEO,MAAM,SAAiB,MAAsB;AAClD,SAAK,aAAa,MAAM,SAAS,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAa,OAAe,SAAiB,MAAsB;AAEzE,QAAI;AACJ,YAAQ,MAAM,YAAY,GAAG;AAAA,MAC3B,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAEA,SAAK,aAAa,IAAI,UAAU,SAAS,IAAI;AAAA,EAC/C;AACF;AAkCO,SAAS,mBACd,UACc;AACd,QAAM,SAAS,IAAI,aAAa;AAChC,SAAO;AACT;;;AC7PA,SAAS,KAAK,UAAwB;","names":["z","LogLevel","z","metrics","z","z"]}