ICUICU
critical

bitget-mcp-server

v1.0.6

Official Bitget MCP Server

npmdigmouseFirst seen Feb 22, 2026

143

Total

6

Critical

103

High

34

Medium

Findings

unknown
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

>>> 1: {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/errors.ts","../src/config.ts","../src/server.ts","../src/utils/signature.ts","../src/utils/rate-limiter.ts","../src/client/rest-client.ts","../src/tools/helpers.ts","../src/tools/common.ts","../src/tools/earn.ts","../src/tools/account.ts","../src/tools/broker.ts","../src/tools/convert.ts","../src/tools/copy-trading.ts","../src/tools/futures-market.ts","../src/tools/futures-trade.ts","../src/tools/margin.ts","../src/tools/p2p.ts","../src/tools/spot-market.ts","../src/tools/spot-trade.ts","../src/tools/index.ts","../src/tools/types.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { loadConfig } from \"./config.js\";\nimport { SERVER_NAME, SERVER_VERSION } from \"./constants.js\";\nimport { createServer } from \"./server.js\";\nimport { toToolErrorPayload } from \"./utils/errors.js\";\n\nfunction printHelp(): void {\n  const help = `\nUsage: ${SERVER_NAME} [options]\n\nOptions:\n  --modules <list>     Comma-separated list of modules to load\n                       Available: spot, futures, account, margin, copytrading,\n                       convert, earn, p2p, broker\n                       Special: \"all\" loads all modules\n                       Default: spot,futures,account\n\n  --read-only          Expose only read/query tools and disable write operations\n  --help               Show this help message\n  --version            Show version\n\nEnvironment Variables:\n  BITGET_API_KEY       Bitget API key (required for private endpoints)\n  BITGET_SECRET_KEY    Bitget secret key (required for private endpoints)\n  BITGET_PASSPHRASE    Bitget passphrase (required for private endpoints)\n  BITGET_API_BASE_URL  Optional API base URL (default: https://api.bitget.com)\n  BITGET_TIMEOUT_MS    Optional request timeout in milliseconds (default: 15000)\n`;\n  process.stdout.write(help);\n}\n\nfunction parseCli(): {\n  modules?: string;\n  readOnly: boolean;\n  help: boolean;\n  version: boolean;\n} {\n  const parsed = parseArgs({\n    options: {\n      modules: {\n        type: \"string\",\n      },\n      \"read-only\": {\n        type: \"boolean\",\n        default: false,\n      },\n      help: {\n        type: \"boolean\",\n        default: false,\n      },\n      version: {\n        type: \"boolean\",\n        default: false,\n      },\n    },\n    allowPositionals: false,\n  });\n\n  return {\n    modules: parsed.values.modules,\n    readOnly: parsed.values[\"read-only\"],\n    help: parsed.values.help,\n    version: parsed.values.version,\n  };\n}\n\nexport async function main(): Promise<void> {\n  const cli = parseCli();\n\n  if (cli.help) {\n    printHelp();\n    return;\n  }\n\n  if (cli.version) {\n    process.stdout.write(`${SERVER_VERSION}\\n`);\n    return;\n  }\n\n  const config = loadConfig({\n    modules: cli.modules,\n    readOnly: cli.readOnly,\n  });\n  const server = createServer(config);\n  const transport = new StdioServerTransport();\n  await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n  const payload = toToolErrorPayload(error);\n  process.stderr.write(`${JSON.stringify(payload, null, 2)}\\n`);\n  process.exitCode = 1;\n});\n","export const SERVER_NAME = \"bitget-mcp-server\";\nexport const SERVER_VERSION = \"1.0.6\";\n\nexport const MODULES = [\n  \"spot\",\n  \"futures\",\n  \"account\",\n  \"margin\",\n  \"copytrading\",\n  \"convert\",\n  \"earn\",\n  \"p2p\",\n  \"broker\",\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"futures\", \"account\"];\n","export type ErrorType =\n  | \"ConfigError\"\n  | \"AuthenticationError\"\n  | \"RateLimitError\"\n  | \"ValidationError\"\n  | \"BitgetApiError\"\n  | \"NetworkError\"\n  | \"InternalError\";\n\nexport interface ToolErrorPayload {\n  error: true;\n  type: ErrorType;\n  code?: string;\n  message: string;\n  suggestion?: string;\n  endpoint?: string;\n  timestamp: string;\n}\n\nexport class BitgetMcpError extends Error {\n  public readonly type: ErrorType;\n  public readonly code?: string;\n  public readonly suggestion?: string;\n  public readonly endpoint?: string;\n\n  public constructor(\n    type: ErrorType,\n    message: string,\n    options?: {\n      code?: string;\n      suggestion?: string;\n      endpoint?: string;\n      cause?: unknown;\n    },\n  ) {\n    super(message, options?.cause ? { cause: options.cause } : undefined);\n    this.name = type;\n    this.type = type;\n    this.code = options?.code;\n    this.suggestion = options?.suggestion;\n    this.endpoint = options?.endpoint;\n  }\n}\n\nexport class ConfigError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string) {\n    super(\"ConfigError\", message, { suggestion });\n  }\n}\n\nexport class ValidationError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string) {\n    super(\"ValidationError\", message, { suggestion });\n  }\n}\n\nexport class RateLimitError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string, endpoint?: string) {\n    super(\"RateLimitError\", message, { suggestion, endpoint });\n  }\n}\n\nexport class AuthenticationError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string, endpoint?: string) {\n    super(\"AuthenticationError\", message, { suggestion, endpoint });\n  }\n}\n\nexport class BitgetApiError extends BitgetMcpError {\n  public constructor(\n    message: string,\n    options?: {\n      code?: string;\n      suggestion?: string;\n      endpoint?: string;\n      cause?: unknown;\n    },\n  ) {\n    super(\"BitgetApiError\", message, options);\n  }\n}\n\nexport class NetworkError extends BitgetMcpError {\n  public constructor(message: string, endpoint?: string, cause?: unknown) {\n    super(\"NetworkError\", message, {\n      endpoint,\n      cause,\n      suggestion:\n        \"Please check network connectivity and retry the request in a few seconds.\",\n    });\n  }\n}\n\nexport function toToolErrorPayload(\n  error: unknown,\n  fallbackEndpoint?: string,\n): ToolErrorPayload {\n  if (error instanceof BitgetMcpError) {\n    return {\n      error: true,\n      type: error.type,\n      code: error.code,\n      message: error.message,\n      suggestion: error.suggestion,\n      endpoint: error.endpoint ?? fallbackEndpoint,\n      timestamp: new Date().toISOString(),\n    };\n  }\n\n  const message = error instanceof Error ? error.message : String(error);\n\n  return {\n    error: true,\n    type: \"InternalError\",\n    message,\n    suggestion:\n      \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n    endpoint: fallbackEndpoint,\n    timestamp: new Date().toISOString(),\n  };\n}\n","import { DEFAULT_MODULES, MODULES, type ModuleId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\n\nexport interface CliOptions {\n  modules?: string;\n  readOnly: boolean;\n}\n\nexport interface BitgetConfig {\n  apiKey?: string;\n  secretKey?: string;\n  passphrase?: string;\n  hasAuth: boolean;\n  baseUrl: string;\n  timeoutMs: number;\n  modules: ModuleId[];\n  readOnly: boolean;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n  if (!rawModules || rawModules.trim().length === 0) {\n    return [...DEFAULT_MODULES];\n  }\n\n  const trimmed = rawModules.trim().toLowerCase();\n  if (trimmed === \"all\") {\n    return [...MODULES];\n  }\n\n  const requested = trimmed\n    .split(\",\")\n    .map((item) => item.trim())\n    .filter((item) => item.length > 0);\n\n  if (requested.length === 0) {\n    return [...DEFAULT_MODULES];\n  }\n\n  const deduped = new Set<ModuleId>();\n  for (const moduleId of requested) {\n    if (!MODULES.includes(moduleId as ModuleId)) {\n      throw new ConfigError(\n        `Unknown module \"${moduleId}\".`,\n        `Use one of: ${MODULES.join(\", \")} or \"all\".`,\n      );\n    }\n    deduped.add(moduleId as ModuleId);\n  }\n\n  return Array.from(deduped);\n}\n\nfunction loadTimeoutMs(): number {\n  const raw = process.env.BITGET_TIMEOUT_MS;\n  if (!raw) {\n    return 15_000;\n  }\n\n  const parsed = Number(raw);\n  if (!Number.isFinite(parsed) || parsed <= 0) {\n    throw new ConfigError(\n      `Invalid BITGET_TIMEOUT_MS value \"${raw}\".`,\n      \"Set BITGET_TIMEOUT_MS as a positive integer in milliseconds.\",\n    );\n  }\n\n  return Math.floor(parsed);\n}\n\nfunction loadBaseUrl(): string {\n  const baseUrl = process.env.BITGET_API_BASE_URL?.trim() || \"https://api.bitget.com\";\n  if (!baseUrl.startsWith(\"http://\") && !baseUrl.startsWith(\"https://\")) {\n    throw new ConfigError(\n      `Invalid BITGET_API_BASE_URL \"${baseUrl}\".`,\n      \"BITGET_API_BASE_URL must start with http:// or https://\",\n    );\n  }\n  return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function loadConfig(cli: CliOptions): BitgetConfig {\n  const apiKey = process.env.BITGET_API_KEY?.trim();\n  const secretKey = process.env.BITGET_SECRET_KEY?.trim();\n  const passphrase = process.env.BITGET_PASSPHRASE?.trim();\n\n  const hasAuth = Boolean(apiKey && secretKey && passphrase);\n  const partialAuth =\n    Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n\n  if (partialAuth && !hasAuth) {\n    throw new ConfigError(\n      \"Partial API credentials detected.\",\n      \"Set BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE together.\",\n    );\n  }\n\n  return {\n    apiKey,\n    secretKey,\n    passphrase,\n    hasAuth,\n    baseUrl: loadBaseUrl(),\n    timeoutMs: loadTimeoutMs(),\n    modules: parseModuleList(cli.modules),\n    readOnly: cli.readOnly,\n  };\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n  type CallToolResult,\n  type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetConfig } from \"./config.js\";\nimport { BitgetRestClient } from \"./client/rest-client.js\";\nimport { MODULES, SERVER_NAME, SERVER_VERSION, type ModuleId } from \"./constants.js\";\nimport { getEarnCapabilityStatus, warmupEarnCapability } from \"./tools/earn.js\";\nimport { buildTools } from \"./tools/index.js\";\nimport { toMcpTool, type ToolSpec } from \"./tools/types.js\";\nimport { BitgetApiError, toToolErrorPayload } from \"./utils/errors.js\";\n\nconst SYSTEM_CAPABILITIES_TOOL_NAME = \"system_get_capabilities\";\nconst SYSTEM_CAPABILITIES_TOOL: Tool = {\n  name: SYSTEM_CAPABILITIES_TOOL_NAME,\n  description:\n    \"Return machine-readable server capabilities and module availability for agent planning.\",\n  inputSchema: {\n    type: \"object\",\n    additionalProperties: false,\n  },\n  annotations: {\n    readOnlyHint: true,\n    destructiveHint: false,\n    idempotentHint: true,\n    openWorldHint: false,\n  },\n};\n\ntype ModuleCapabilityStatus =\n  | \"enabled\"\n  | \"disabled\"\n  | \"unsupported\"\n  | \"requires_auth\"\n  | \"unknown\";\n\ninterface CapabilitySnapshot {\n  readOnly: boolean;\n  hasAuth: boolean;\n  moduleAvailability: Record<\n    ModuleId,\n    {\n      status: ModuleCapabilityStatus;\n      reasonCode?: string;\n    }\n  >;\n}\n\nfunction buildCapabilitySnapshot(config: BitgetConfig): CapabilitySnapshot {\n  const enabledModules = new Set(config.modules);\n  const earnCapability = getEarnCapabilityStatus();\n  const moduleAvailability = {} as CapabilitySnapshot[\"moduleAvailability\"];\n\n  for (const moduleId of MODULES) {\n    if (!enabledModules.has(moduleId)) {\n      moduleAvailability[moduleId] = {\n        status: \"disabled\",\n        reasonCode: \"MODULE_FILTERED\",\n      };\n      continue;\n    }\n\n    if (moduleId !== \"earn\") {\n      moduleAvailability[moduleId] = { status: \"enabled\" };\n      continue;\n    }\n\n    if (!config.hasAuth) {\n      moduleAvailability[moduleId] = {\n        status: \"requires_auth\",\n        reasonCode: \"AUTH_MISSING\",\n      };\n      continue;\n    }\n\n    if (earnCapability === \"unsupported\") {\n      moduleAvailability[moduleId] = {\n        status: \"unsupported\",\n        reasonCode: \"EARN_UNAVAILABLE\",\n      };\n      continue;\n    }\n\n    if (earnCapability === \"supported\") {\n      moduleAvailability[moduleId] = { status: \"enabled\" };\n      continue;\n    }\n\n    moduleAvailability[moduleId] = {\n      status: \"unknown\",\n      reasonCode: \"CAPABILITY_PROBING\",\n    };\n  }\n\n  return {\n    readOnly: config.readOnly,\n    hasAuth: config.hasAuth,\n    moduleAvailability,\n  };\n}\n\nfunction successResult(\n  toolName: string,\n  data: unknown,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  const payload: Record<string, unknown> = {\n    tool: toolName,\n    ok: true,\n    data,\n    capabilities: capabilitySnapshot,\n    timestamp: new Date().toISOString(),\n  };\n  return {\n    content: [{ type: \"text\", text: JSON.stringify(payload, null, 2) }],\n    structuredContent: payload,\n  };\n}\n\nfunction errorResult(\n  toolName: string,\n  error: unknown,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  const payload = toToolErrorPayload(error);\n  const structured: Record<string, unknown> = {\n    tool: toolName,\n    ...payload,\n    capabilities: capabilitySnapshot,\n  };\n  return {\n    isError: true,\n    content: [{ type: \"text\", text: JSON.stringify(structured, null, 2) }],\n    structuredContent: structured,\n  };\n}\n\nfunction unknownToolResult(\n  toolName: string,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  return errorResult(\n    toolName,\n    new BitgetApiError(`Tool \"${toolName}\" is not available in this server session.`, {\n      code: \"TOOL_NOT_AVAILABLE\",\n      suggestion: \"Call list_tools again and choose from currently available tools.\",\n    }),\n    capabilitySnapshot,\n  );\n}\n\nexport function createServer(config: BitgetConfig): Server {\n  const client = new BitgetRestClient(config);\n  const tools = buildTools(config);\n  const toolMap = new Map<string, ToolSpec>(tools.map((tool) => [tool.name, tool]));\n  const hasEarnTools = tools.some((tool) => tool.module === \"earn\");\n  let earnWarmupDone = false;\n  const ensureEarnWarmupIfNeeded = async (): Promise<void> => {\n    if (!hasEarnTools || !config.hasAuth || earnWarmupDone) {\n      return;\n    }\n    earnWarmupDone = true;\n    await warmupEarnCapability({ config, client });\n  };\n  const listVisibleTools = (): ToolSpec[] => {\n    if (getEarnCapabilityStatus() !== \"unsupported\") {\n      return tools;\n    }\n    return tools.filter((tool) => tool.module !== \"earn\");\n  };\n\n  const server = new Server(\n    { name: SERVER_NAME, version: SERVER_VERSION },\n    {\n      capabilities: {\n        tools: {},\n      },\n    },\n  );\n\n  server.setRequestHandler(ListToolsRequestSchema, async () => {\n    await ensureEarnWarmupIfNeeded();\n    return {\n      tools: [...listVisibleTools().map(toMcpTool), SYSTEM_CAPABILITIES_TOOL],\n    };\n  });\n\n  server.setRequestHandler(CallToolRequestSchema, async (request) => {\n    const toolName = request.params.name;\n    await ensureEarnWarmupIfNeeded();\n    if (toolName === SYSTEM_CAPABILITIES_TOOL_NAME) {\n      const snapshot = buildCapabilitySnapshot(config);\n      return successResult(\n        toolName,\n        {\n          server: {\n            name: SERVER_NAME,\n            version: SERVER_VERSION,\n          },\n          capabilities: snapshot,\n        },\n        snapshot,\n      );\n    }\n    const tool = toolMap.get(toolName);\n\n    if (!tool) {\n      return unknownToolResult(toolName, buildCapabilitySnapshot(config));\n    }\n\n    try {\n      const response = await tool.handler(request.params.arguments ?? {}, {\n        config,\n        client,\n      });\n      return successResult(toolName, response, buildCapabilitySnapshot(config));\n    } catch (error) {\n      return errorResult(toolName, error, buildCapabilitySnapshot(config));\n    }\n  });\n\n  return server;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function signBitgetPayload(payload: string, secretKey: string): string {\n  return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n  tokens: number;\n  lastRefillMs: number;\n  capacity: number;\n  refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n  key: string;\n  capacity: number;\n  refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nexport class RateLimiter {\n  private readonly buckets = new Map<string, Bucket>();\n  private readonly maxWaitMs: number;\n\n  public constructor(maxWaitMs = 30_000) {\n    this.maxWaitMs = maxWaitMs;\n  }\n\n  public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n    const bucket = this.getBucket(config);\n    this.refill(bucket);\n\n    if (bucket.tokens >= amount) {\n      bucket.tokens -= amount;\n      return;\n    }\n\n    const missing = amount - bucket.tokens;\n    const secondsToWait = missing / bucket.refillPerSecond;\n    const waitMs = Math.ceil(secondsToWait * 1000);\n\n    if (waitMs > this.maxWaitMs) {\n      throw new RateLimitError(\n        `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n        \"Reduce tool call frequency or retry later.\",\n      );\n    }\n\n    await sleep(waitMs);\n    this.refill(bucket);\n\n    if (bucket.tokens < amount) {\n      throw new RateLimitError(\n        `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n      );\n    }\n\n    bucket.tokens -= amount;\n  }\n\n  private getBucket(config: RateLimitConfig): Bucket {\n    const existing = this.buckets.get(config.key);\n    if (existing) {\n      if (\n        existing.capacity !== config.capacity ||\n        existing.refillPerSecond !== config.refillPerSecond\n      ) {\n        existing.capacity = config.capacity;\n        existing.refillPerSecond = config.refillPerSecond;\n        existing.tokens = Math.min(existing.tokens, config.capacity);\n      }\n      return existing;\n    }\n\n    const now = Date.now();\n    const created: Bucket = {\n      tokens: config.capacity,\n      lastRefillMs: now,\n      capacity: config.capacity,\n      refillPerSecond: config.refillPerSecond,\n    };\n    this.buckets.set(config.key, created);\n    return created;\n  }\n\n  private refill(bucket: Bucket): void {\n    const now = Date.now();\n    const elapsedMs = now - bucket.lastRefillMs;\n    if (elapsedMs <= 0) {\n      return;\n    }\n\n    const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n    bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n    bucket.lastRefillMs = now;\n  }\n}\n","import { signBitgetPayload } from \"../utils/signature.js\";\nimport {\n  AuthenticationError,\n  BitgetApiError,\n  ConfigError,\n  NetworkError,\n} from \"../utils/errors.js\";\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type {\n  BitgetApiResponse,\n  QueryParams,\n  QueryValue,\n  RequestConfig,\n  RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n  return value !== undefined && value !== null;\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n  if (Array.isArray(value)) {\n    return value.map((item) => String(item)).join(\",\");\n  }\n  return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n  if (!query) {\n    return \"\";\n  }\n\n  const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n  if (entries.length === 0) {\n    return \"\";\n  }\n\n  const params = new URLSearchParams();\n  for (const [key, value] of entries) {\n    params.set(key, stringifyQueryValue(value));\n  }\n  return params.toString();\n}\n\nexport class BitgetRestClient {\n  private readonly config: BitgetConfig;\n  private readonly rateLimiter = new RateLimiter();\n\n  public constructor(config: BitgetConfig) {\n    this.config = config;\n  }\n\n  public async publicGet<TData = unknown>(\n    path: string,\n    query?: QueryParams,\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"GET\",\n      path,\n      auth: \"public\",\n      query,\n      rateLimit,\n    });\n  }\n\n  public async privateGet<TData = unknown>(\n    path: string,\n    query?: QueryParams,\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"GET\",\n      path,\n      auth: \"private\",\n      query,\n      rateLimit,\n    });\n  }\n\n  public async privatePost<TData = unknown>(\n    path: string,\n    body?: RequestConfig[\"body\"],\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"POST\",\n      path,\n      auth: \"private\",\n      body,\n      rateLimit,\n    });\n  }\n\n  private async request<TData = unknown>(\n    config: RequestConfig,\n  ): Promise<RequestResult<TData>> {\n    const queryString = buildQueryString(config.query);\n    const endpoint = queryString.length > 0 ? `${config.path}?${queryString}` : config.path;\n    const url = `${this.config.baseUrl}${endpoint}`;\n    const bodyJson = config.body ? JSON.stringify(config.body) : \"\";\n    const timestamp = Date.now().toString();\n\n    if (config.rateLimit) {\n      await this.rateLimiter.consume(config.rateLimit);\n    }\n\n    const headers = new Headers({\n      \"Content-Type\": \"application/json\",\n      Accept: \"application/json\",\n      locale: \"en-US\",\n    });\n\n    if (config.auth === \"private\") {\n      if (!this.config.hasAuth) {\n        throw new ConfigError(\n          \"Private endpoint requires API credentials.\",\n          \"Configure BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE.\",\n        );\n      }\n\n      if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n        throw new ConfigError(\n          \"Invalid private API credentials state.\",\n          \"Ensure all BITGET credentials are set.\",\n        );\n      }\n\n      const payload = `${timestamp}${config.method.toUpperCase()}${endpoint}${bodyJson}`;\n      const signature = signBitgetPayload(payload, this.config.secretKey);\n      headers.set(\"ACCESS-KEY\", this.config.apiKey);\n      headers.set(\"ACCESS-SIGN\", signature);\n      headers.set(\"ACCESS-PASSPHRASE\", this.config.passphrase);\n      headers.set(\"ACCESS-TIMESTAMP\", timestamp);\n    }\n\n    let response: Response;\n    try {\n      response = await fetch(url, {\n        method: config.method,\n        headers,\n        body: config.method === \"POST\" ? bodyJson : undefined,\n        signal: AbortSignal.timeout(this.config.timeoutMs),\n      });\n    } catch (error) {\n      throw new NetworkError(\n        `Failed to call Bitget endpoint ${config.method} ${endpoint}.`,\n        `${config.method} ${endpoint}`,\n        error,\n      );\n    }\n\n    const rawText = await response.text();\n    let parsed: BitgetApiResponse<TData>;\n    try {\n      parsed = (rawText ? JSON.parse(rawText) : {}) as BitgetApiResponse<TData>;\n    } catch (error) {\n      if (!response.ok) {\n        const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n        throw new BitgetApiError(\n          `HTTP ${response.status} from Bitget: ${messagePreview || \"Non-JSON response body\"}`,\n          {\n            code: String(response.status),\n            endpoint: `${config.method} ${config.path}`,\n            suggestion: \"Verify endpoint path and request parameters.\",\n          },\n        );\n      }\n      throw new NetworkError(\n        `Bitget returned non-JSON response for ${config.method} ${endpoint}.`,\n        `${config.method} ${endpoint}`,\n        error,\n      );\n    }\n\n    if (!response.ok) {\n      throw new BitgetApiError(\n        `HTTP ${response.status} from Bitget: ${parsed.msg ?? \"Unknown error\"}`,\n        {\n          code: String(response.status),\n          endpoint: `${config.method} ${config.path}`,\n          suggestion: \"Retry later or verify endpoint parameters.\",\n        },\n      );\n    }\n\n    const responseCode = parsed.code;\n    if (responseCode && responseCode !== \"00000\") {\n      const message = parsed.msg ?? \"Bitget API request failed.\";\n      if (\n        responseCode === \"40017\" ||\n        responseCode === \"40018\" ||\n        responseCode === \"40036\"\n      ) {\n        throw new AuthenticationError(message, \"Check API key, secret, passphrase and permissions.\", `${config.method} ${config.path}`);\n      }\n\n      throw new BitgetApiError(message, {\n        code: responseCode,\n        endpoint: `${config.method} ${config.path}`,\n      });\n    }\n\n    return {\n      endpoint: `${config.method} ${config.path}`,\n      requestTime: new Date().toISOString(),\n      data: (parsed.data ?? null) as TData,\n      raw: parsed,\n    };\n  }\n}\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n    return {};\n  }\n  return value as Record<string, unknown>;\n}\n\nexport function readString(\n  args: Record<string, unknown>,\n  key: string,\n): string | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"string\") {\n    throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n  }\n  return value;\n}\n\nexport function readNumber(\n  args: Record<string, unknown>,\n  key: string,\n): number | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"number\" || Number.isNaN(value)) {\n    throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n  }\n  return value;\n}\n\nexport function readBoolean(\n  args: Record<string, unknown>,\n  key: string,\n): boolean | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"boolean\") {\n    throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n  }\n  return value;\n}\n\nexport function readStringArray(\n  args: Record<string, unknown>,\n  key: string,\n): string[] | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n    throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n  }\n  return value;\n}\n\nexport function readObjectArray(\n  args: Record<string, unknown>,\n  key: string,\n): Record<string, unknown>[] | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (\n    !Array.isArray(value) ||\n    value.some((item) => !item || typeof item !== \"object\" || Array.isArray(item))\n  ) {\n    throw new ValidationError(`Parameter \"${key}\" must be an array of objects.`);\n  }\n  return value as Record<string, unknown>[];\n}\n\nexport function requireString(\n  args: Record<string, unknown>,\n  key: string,\n): string {\n  const value = readString(args, key);\n  if (!value || value.length === 0) {\n    throw new ValidationError(`Missing required parameter \"${key}\".`);\n  }\n  return value;\n}\n\nexport function requireObjectArray(\n  args: Record<string, unknown>,\n  key: string,\n): Record<string, unknown>[] {\n  const value = readObjectArray(args, key);\n  if (!value || value.length === 0) {\n    throw new ValidationError(`Missing required non-empty array \"${key}\".`);\n  }\n  return value;\n}\n\nexport function ensureOneOf(\n  args: Record<string, unknown>,\n  keys: string[],\n  message: string,\n): void {\n  const hasAny = keys.some((key) => args[key] !== undefined && args[key] !== null);\n  if (!hasAny) {\n    throw new ValidationError(message);\n  }\n}\n\nexport function assertEnum(\n  value: string | undefined,\n  key: string,\n  values: readonly string[],\n): void {\n  if (value === undefined) {\n    return;\n  }\n  if (!values.includes(value)) {\n    throw new ValidationError(\n      `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n    );\n  }\n}\n\nexport function compactObject(\n  object: Record<string, unknown>,\n): Record<string, unknown> {\n  const next: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(object)) {\n    if (value !== undefined && value !== null) {\n      next[key] = value;\n    }\n  }\n  return next;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\n\nexport const PRODUCT_TYPES = [\n  \"USDT-FUTURES\",\n  \"USDC-FUTURES\",\n  \"COIN-FUTURES\",\n] as const;\n\nexport const GRANULARITIES = [\n  \"1min\",\n  \"5min\",\n  \"15min\",\n  \"30min\",\n  \"1h\",\n  \"4h\",\n  \"6h\",\n  \"12h\",\n  \"1day\",\n  \"3day\",\n  \"1week\",\n  \"1M\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n  return {\n    key: `public:${key}`,\n    capacity: rps,\n    refillPerSecond: rps,\n  };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n  return {\n    key: `private:${key}`,\n    capacity: rps,\n    refillPerSecond: rps,\n  };\n}\n","import type { ToolContext, ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport type { RequestResult } from \"../client/types.js\";\nimport { BitgetApiError } from \"../utils/errors.js\";\n\ntype EarnOperation = \"products\" | \"holdings\" | \"subscribe\" | \"redeem\";\nexport type EarnCapabilityStatus = \"unknown\" | \"supported\" | \"unsupported\";\n\nconst EARN_ENDPOINTS: Record<EarnOperation, string[]> = {\n  products: [\"/api/v2/earn/product/list\", \"/api/v2/earn/saving/product/list\"],\n  holdings: [\"/api/v2/earn/holding/list\", \"/api/v2/earn/saving/holding/list\"],\n  subscribe: [\"/api/v2/earn/subscribe\"],\n  redeem: [\"/api/v2/earn/redeem\"],\n};\n\nconst earnEndpointCache: Partial<Record<EarnOperation, string>> = {};\nlet earnCapability: EarnCapabilityStatus = \"unknown\";\n\nexport function getEarnCapabilityStatus(): EarnCapabilityStatus {\n  return earnCapability;\n}\n\nexport async function warmupEarnCapability(context: ToolContext): Promise<EarnCapabilityStatus> {\n  if (earnCapability !== \"unknown\") {\n    return earnCapability;\n  }\n  try {\n    await ensureEarnSupported(context);\n  } catch {\n    // warmup is best-effort; status transition is handled in ensureEarnSupported.\n  }\n  return earnCapability;\n}\n\nfunction is404Error(error: unknown): boolean {\n  return error instanceof BitgetApiError && error.code === \"404\";\n}\n\nfunction earnUnavailableError(operation: EarnOperation): BitgetApiError {\n  return new BitgetApiError(\n    `Earn API operation \"${operation}\" is unavailable in current account/region or API environment.`,\n    {\n      code: \"EARN_UNAVAILABLE\",\n      suggestion:\n        \"Current Bitget environment does not expose earn endpoints for this account. Consider disabling earn module for this deployment.\",\n    },\n  );\n}\n\nfunction endpointCandidates(operation: EarnOperation): string[] {\n  const cached = earnEndpointCache[operation];\n  if (!cached) {\n    return [...EARN_ENDPOINTS[operation]];\n  }\n  return [cached, ...EARN_ENDPOINTS[operation].filter((item) => item !== cached)];\n}\n\nasync function callEarnGet(\n  context: ToolContext,\n  operation: EarnOperation,\n  query: Record<string, unknown>,\n  rateLimitKey: string,\n): Promise<RequestResult> {\n  for (const path of endpointCandidates(operation)) {\n    try {\n      const response = await context.client.privateGet(\n        path,\n        query,\n        privateRateLimit(rateLimitKey, 10),\n      );\n      earnEndpointCache[operation] = path;\n      return response;\n    } catch (error) {\n      if (is404Error(error)) {\n        continue;\n      }\n      throw error;\n    }\n  }\n  throw earnUnavailableError(operation);\n}\n\nasync function callEarnPost(\n  context: ToolContext,\n  operation: EarnOperation,\n  body: Record<string, unknown>,\n  rateLimitKey: string,\n): Promise<RequestResult> {\n  for (const path of endpointCandidates(operation)) {\n    try {\n      const response = await context.client.privatePost(\n        path,\n        body,\n        privateRateLimit(rateLimitKey, 5),\n      );\n      earnEndpointCache[operation] = path;\n      return response;\n    } catch (error) {\n      if (is404Error(error)) {\n        continue;\n      }\n      throw error;\n    }\n  }\n  throw earnUnavailableError(operation);\n}\n\nasync function ensureEarnSupported(context: ToolContext): Promise<void> {\n  if (earnCapability === \"supported\") {\n    return;\n  }\n  if (earnCapability === \"unsupported\") {\n    throw earnUnavailableError(\"products\");\n  }\n  try {\n    await callEarnGet(\n      context,\n      \"products\",\n      compactObject({\n        coin: \"USDT\",\n      }),\n      \"earn_probe\",\n    );\n    earnCapability = \"supported\";\n  } catch (error) {\n    if (error instanceof BitgetApiError && error.code === \"EARN_UNAVAILABLE\") {\n      earnCapability = \"unsupported\";\n    }\n    throw error;\n  }\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerEarnTools(): ToolSpec[] {\n  return [\n    {\n      name: \"earn_get_products\",\n      module: \"earn\",\n      description:\n        \"Query available earn products such as savings and staking. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          productType: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        await ensureEarnSupported(context);\n        const response = await callEarnGet(\n          context,\n          \"products\",\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productType: readString(args, \"productType\"),\n          }),\n          \"earn_get_products\",\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"earn_subscribe_redeem\",\n      module: \"earn\",\n      description:\n        \"Subscribe or redeem earn products. [CAUTION] Locks/releases funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"subscribe\", \"redeem\"] },\n          productId: { type: \"string\" },\n          amount: { type: \"string\" },\n          coin: { type: \"string\" },\n        },\n        required: [\"action\", \"productId\", \"amount\", \"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\"subscribe\", \"redeem\"]);\n        await ensureEarnSupported(context);\n        const operation = action === \"subscribe\" ? \"subscribe\" : \"redeem\";\n        const response = await callEarnPost(\n          context,\n          operation,\n          {\n            productId: requireString(args, \"productId\"),\n            amount: requireString(args, \"amount\"),\n            coin: requireString(args, \"coin\"),\n          },\n          \"earn_subscribe_redeem\",\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"earn_get_holdings\",\n      module: \"earn\",\n      description:\n        \"Get current earn holdings and earnings records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          productId: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        await ensureEarnSupported(context);\n        const response = await callEarnGet(\n          context,\n          \"holdings\",\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productId: readString(args, \"productId\"),\n          }),\n          \"earn_get_holdings\",\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\n\nfunction toApiTransferType(accountType: string): string {\n  // Bitget transfer API uses p2p naming for funding wallet.\n  return accountType === \"funding\" ? \"p2p\" : accountType;\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerAccountTools(): ToolSpec[] {\n  return [\n    {\n      name: \"get_account_assets\",\n      module: \"account\",\n      description:\n        \"Get spot/futures/funding/all account balances. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          accountType: {\n            type: \"string\",\n            enum: [\"spot\", \"futures\", \"funding\", \"all\"],\n            description: \"Target account type. Default all.\",\n          },\n          coin: { type: \"string\", description: \"Optional coin filter.\" },\n          productType: {\n            type: \"string\",\n            enum: [...PRODUCT_TYPES],\n            description: \"Required when accountType=futures.\",\n          },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const accountType = readString(args, \"accountType\") ?? \"all\";\n        assertEnum(accountType, \"accountType\", [\"spot\", \"futures\", \"funding\", \"all\"]);\n        const coin = readString(args, \"coin\");\n        const productType = readString(args, \"productType\");\n        if (productType) {\n          assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        }\n        const route =\n          accountType === \"spot\"\n            ? \"/api/v2/spot/account/assets\"\n            : accountType === \"futures\"\n              ? \"/api/v2/mix/account/accounts\"\n              : accountType === \"funding\"\n                ? \"/api/v2/account/funding-assets\"\n                : \"/api/v2/account/all-account-balance\";\n        const response = await context.client.privateGet(\n          route,\n          compactObject({ coin, productType }),\n          privateRateLimit(\"get_account_assets\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_account_bills\",\n      module: \"account\",\n      description:\n        \"Get account bill records for spot or futures account. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          accountType: { type: \"string\", enum: [\"spot\", \"futures\"] },\n          coin: { type: \"string\" },\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          businessType: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const accountType = readString(args, \"accountType\") ?? \"spot\";\n        assertEnum(accountType, \"accountType\", [\"spot\", \"futures\"]);\n        const productType = readString(args, \"productType\");\n        if (productType) {\n          assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        }\n        const route =\n          accountType === \"futures\"\n            ? \"/api/v2/mix/account/bill\"\n            : \"/api/v2/spot/account/bills\";\n        const response = await context.client.privateGet(\n          route,\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productType,\n            businessType: readString(args, \"businessType\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"get_account_bills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"transfer\",\n      module: \"account\",\n      description:\n        \"Transfer funds between accounts or sub-account. [CAUTION] Moves funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          fromAccountType: { type: \"string\" },\n          toAccountType: { type: \"string\" },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          subAccountUid: { type: \"string\" },\n          symbol: { type: \"string\" },\n          clientOid: { type: \"string\" },\n        },\n        required: [\"fromAccountType\", \"toAccountType\", \"coin\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const subAccountUid = readString(args, \"subAccountUid\");\n        const path = subAccountUid\n          ? \"/api/v2/spot/wallet/subaccount-transfer\"\n          : \"/api/v2/spot/wallet/transfer\";\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            fromType: toApiTransferType(requireString(args, \"fromAccountType\")),\n            toType: toApiTransferType(requireString(args, \"toAccountType\")),\n            coin: requireString(args, \"coin\"),\n            amount: requireString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n            clientOid: readString(args, \"clientOid\"),\n            subAccountUid,\n          }),\n          privateRateLimit(\"transfer\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"withdraw\",\n      module: \"account\",\n      description:\n        \"Withdraw funds to external address. [DANGER] Irreversible fund movement. Private endpoint. Rate limit: 1 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          transferType: { type: \"string\", enum: [\"on_chain\", \"internal_transfer\"] },\n          address: { type: \"string\" },\n          chain: { type: \"string\" },\n          amount: { type: \"string\" },\n          tag: { type: \"string\" },\n          clientOid: { type: \"string\" },\n        },\n        required: [\"coin\", \"transferType\", \"address\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const transferType = requireString(args, \"transferType\");\n        assertEnum(transferType, \"transferType\", [\"on_chain\", \"internal_transfer\"]);\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/wallet/withdrawal\",\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            transferType,\n            address: requireString(args, \"address\"),\n            chain: readString(args, \"chain\"),\n            amount: requireString(args, \"amount\"),\n            tag: readString(args, \"tag\"),\n            clientOid: readString(args, \"clientOid\"),\n          }),\n          privateRateLimit(\"withdraw\", 1),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"cancel_withdrawal\",\n      module: \"account\",\n      description:\n        \"Cancel pending withdrawal request by order id. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Withdrawal order id.\" },\n        },\n        required: [\"orderId\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/wallet/cancel-withdrawal\",\n          { orderId: requireString(args, \"orderId\") },\n          privateRateLimit(\"cancel_withdrawal\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_deposit_address\",\n      module: \"account\",\n      description:\n        \"Get deposit address for coin and optional chain. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          chain: { type: \"string\" },\n        },\n        required: [\"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privateGet(\n          \"/api/v2/spot/wallet/deposit-address\",\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            chain: readString(args, \"chain\"),\n          }),\n          privateRateLimit(\"get_deposit_address\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_transaction_records\",\n      module: \"account\",\n      description:\n        \"Get deposit, withdrawal, or transfer records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          recordType: {\n            type: \"string\",\n            enum: [\"deposit\", \"withdrawal\", \"transfer\"],\n          },\n          coin: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          orderId: { type: \"string\" },\n        },\n        required: [\"recordType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const recordType = requireString(args, \"recordType\");\n        assertEnum(recordType, \"recordType\", [\"deposit\", \"withdrawal\", \"transfer\"]);\n        const now = Date.now();\n        const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n        const defaultEndTime = String(now);\n        const path =\n          recordType === \"deposit\"\n            ? \"/api/v2/spot/wallet/deposit-records\"\n            : recordType === \"withdrawal\"\n              ? \"/api/v2/spot/wallet/withdrawal-records\"\n              : \"/api/v2/spot/account/sub-main-trans-record\";\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            coin: readString(args, \"coin\"),\n            startTime:\n              recordType === \"deposit\" || recordType === \"transfer\"\n                ? (startTime ?? defaultStartTime)\n                : startTime,\n            endTime:\n              recordType === \"deposit\" || recordType === \"transfer\"\n                ? (endTime ?? defaultEndTime)\n                : endTime,\n            limit: readNumber(args, \"limit\"),\n            orderId: readString(args, \"orderId\"),\n          }),\n          privateRateLimit(\"get_transaction_records\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"manage_subaccounts\",\n      module: \"account\",\n      description:\n        \"Create, modify, list subaccounts and manage subaccount API keys. [CAUTION] Account management operation. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: {\n            type: \"string\",\n            enum: [\n              \"create\",\n              \"modify\",\n              \"list\",\n              \"createApiKey\",\n              \"modifyApiKey\",\n              \"listApiKeys\",\n            ],\n          },\n          subAccountName: { type: \"string\" },\n          subAccountUid: { type: \"string\" },\n          remark: { type: \"string\" },\n          apiKeyPermissions: { type: \"string\" },\n          apiKeyIp: { type: \"string\" },\n          apiKeyPassphrase: { type: \"string\" },\n        },\n        required: [\"action\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\n          \"create\",\n          \"modify\",\n          \"list\",\n          \"createApiKey\",\n          \"modifyApiKey\",\n          \"listApiKeys\",\n        ]);\n        const common = compactObject({\n          subAccountName: readString(args, \"subAccountName\"),\n          subAccountUid: readString(args, \"subAccountUid\"),\n          remark: readString(args, \"remark\"),\n          apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n          apiKeyIp: readString(args, \"apiKeyIp\"),\n          apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n        });\n\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/user/virtual-subaccount-list\",\n            common,\n            privateRateLimit(\"manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n\n        if (action === \"listApiKeys\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/user/virtual-subaccount-apikey-list\",\n            common,\n            privateRateLimit(\"manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/user/create-virtual-subaccount\"\n            : action === \"modify\"\n              ? \"/api/v2/user/modify-virtual-subaccount\"\n              : action === \"createApiKey\"\n                ? \"/api/v2/user/create-virtual-subaccount-apikey\"\n                : \"/api/v2/user/modify-virtual-subaccount-apikey\";\n        const response = await context.client.privatePost(\n          endpoint,\n          common,\n          privateRateLimit(\"manage_subaccounts\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerBrokerTools(): ToolSpec[] {\n  return [\n    {\n      name: \"broker_get_info\",\n      module: \"broker\",\n      description:\n        \"Get broker account information and commission data. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {},\n      },\n      handler: async (_rawArgs, context) => {\n        const response = await context.client.privateGet(\n          \"/api/v2/broker/account/info\",\n          undefined,\n          privateRateLimit(\"broker_get_info\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"broker_manage_subaccounts\",\n      module: \"broker\",\n      description:\n        \"Create, modify, or list broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n          subAccountUid: { type: \"string\" },\n          subAccountName: { type: \"string\" },\n          remark: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"action\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n        const payload = compactObject({\n          subAccountUid: readString(args, \"subAccountUid\"),\n          subAccountName: readString(args, \"subAccountName\"),\n          remark: readString(args, \"remark\"),\n          limit: readNumber(args, \"limit\"),\n        });\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/broker/account/subaccount-list\",\n            payload,\n            privateRateLimit(\"broker_manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/broker/account/create-subaccount\"\n            : \"/api/v2/broker/account/modify-subaccount\";\n        const response = await context.client.privatePost(\n          endpoint,\n          payload,\n          privateRateLimit(\"broker_manage_subaccounts\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"broker_manage_apikeys\",\n      module: \"broker\",\n      description:\n        \"Create, modify, or list API keys for broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n          subAccountUid: { type: \"string\" },\n          apiKeyPermissions: { type: \"string\" },\n          apiKeyIp: { type: \"string\" },\n          apiKeyPassphrase: { type: \"string\" },\n        },\n        required: [\"action\", \"subAccountUid\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        const subAccountUid = requireString(args, \"subAccountUid\");\n        assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n        const payload = compactObject({\n          subAccountUid,\n          apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n          apiKeyIp: readString(args, \"apiKeyIp\"),\n          apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n        });\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/broker/account/subaccount-apikey-list\",\n            payload,\n            privateRateLimit(\"broker_manage_apikeys\", 5),\n          );\n          return normalize(response);\n        }\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/broker/account/create-subaccount-apikey\"\n            : \"/api/v2/broker/account/modify-subaccount-apikey\";\n        const response = await context.client.privatePost(\n          endpoint,\n          payload,\n          privateRateLimit(\"broker_manage_apikeys\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readNumber,\n  readString,\n  readStringArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerConvertTools(): ToolSpec[] {\n  return [\n    {\n      name: \"convert_get_quote\",\n      module: \"convert\",\n      description:\n        \"Get supported convert currencies or quoted conversion price. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          fromCoin: { type: \"string\" },\n          toCoin: { type: \"string\" },\n          fromCoinAmount: { type: \"string\" },\n          toCoinAmount: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const fromCoin = readString(args, \"fromCoin\");\n        const path = fromCoin\n          ? \"/api/v2/convert/quoted-price\"\n          : \"/api/v2/convert/currencies\";\n        const fromCoinSize = readString(args, \"fromCoinAmount\");\n        const toCoinSize = readString(args, \"toCoinAmount\");\n        if (fromCoin && toCoinSize && fromCoinSize) {\n          throw new ValidationError(\n            'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n          );\n        }\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            fromCoin,\n            toCoin: readString(args, \"toCoin\"),\n            fromCoinSize,\n            toCoinSize,\n          }),\n          privateRateLimit(\"convert_get_quote\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"convert_execute\",\n      module: \"convert\",\n      description:\n        \"Execute normal conversion or BGB small balance sweep. [CAUTION] Converts funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n          fromCoin: { type: \"string\" },\n          toCoin: { type: \"string\" },\n          fromCoinAmount: { type: \"string\" },\n          toCoinAmount: { type: \"string\" },\n          traceId: { type: \"string\" },\n          coinList: { type: \"array\", items: { type: \"string\" } },\n        },\n        required: [\"fromCoin\", \"toCoin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"normal\";\n        assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n        const path =\n          type === \"bgb\"\n            ? \"/api/v2/convert/bgb-convert\"\n            : \"/api/v2/convert/trade\";\n\n        if (type === \"bgb\") {\n          const response = await context.client.privatePost(\n            path,\n            compactObject({\n              coinList: readStringArray(args, \"coinList\"),\n              traceId: readString(args, \"traceId\") ?? `mcp-${Date.now()}`,\n            }),\n            privateRateLimit(\"convert_execute\", 5),\n          );\n          return normalize(response);\n        }\n\n        ensureOneOf(\n          args,\n          [\"fromCoinAmount\", \"toCoinAmount\"],\n          'Provide one of \"fromCoinAmount\" or \"toCoinAmount\" for normal conversion.',\n        );\n        const fromCoin = requireString(args, \"fromCoin\");\n        const toCoin = requireString(args, \"toCoin\");\n        const fromCoinSize = readString(args, \"fromCoinAmount\");\n        const toCoinSize = readString(args, \"toCoinAmount\");\n        if (fromCoinSize && toCoinSize) {\n          throw new ValidationError(\n            'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n          );\n        }\n\n        const quoted = await context.client.privateGet<{\n          fromCoin: string;\n          fromCoinSize: string;\n          toCoin: string;\n          toCoinSize: string;\n          cnvtPrice: string;\n          traceId: string;\n        }>(\n          \"/api/v2/convert/quoted-price\",\n          compactObject({ fromCoin, toCoin, fromCoinSize, toCoinSize }),\n          privateRateLimit(\"convert_execute_quote\", 10),\n        );\n        const quoteData = quoted.data;\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            fromCoin: quoteData.fromCoin,\n            toCoin: quoteData.toCoin,\n            fromCoinSize: quoteData.fromCoinSize,\n            toCoinSize: quoteData.toCoinSize,\n            cnvtPrice: quoteData.cnvtPrice,\n            traceId: quoteData.traceId,\n          }),\n          privateRateLimit(\"convert_execute\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"convert_get_history\",\n      module: \"convert\",\n      description:\n        \"Get conversion or BGB sweep history. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"normal\";\n        assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n        const now = Date.now();\n        const defaultStartTime = String(now - 7 * 24 * 60 * 60 * 1000);\n        const defaultEndTime = String(now);\n        const path =\n          type === \"bgb\"\n            ? \"/api/v2/convert/bgb-convert-records\"\n            : \"/api/v2/convert/convert-record\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            startTime:\n              type === \"normal\"\n                ? (readString(args, \"startTime\") ?? defaultStartTime)\n                : readString(args, \"startTime\"),\n            endTime:\n              type === \"normal\"\n                ? (readString(args, \"endTime\") ?? defaultEndTime)\n                : readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"convert_get_history\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readBoolean,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { BitgetApiError, ValidationError } from \"../utils/errors.js\";\n\nconst COPY_PRODUCT_TYPES = [...PRODUCT_TYPES, \"SPOT\"] as const;\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nfunction isSpot(productType: string): boolean {\n  return productType === \"SPOT\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction extractTraderRows(data: unknown): Record<string, unknown>[] {\n  if (Array.isArray(data)) {\n    return data.filter(isRecord);\n  }\n  if (!isRecord(data)) {\n    return [];\n  }\n  const keys = [\"list\", \"rows\", \"resultList\", \"traderList\", \"data\"];\n  for (const key of keys) {\n    const value = data[key];\n    if (Array.isArray(value)) {\n      return value.filter(isRecord);\n    }\n    if (isRecord(value)) {\n      const nested = extractTraderRows(value);\n      if (nested.length > 0) {\n        return nested;\n      }\n    }\n  }\n  return [];\n}\n\nfunction toNumber(value: unknown): number {\n  if (typeof value === \"number\" && Number.isFinite(value)) {\n    return value;\n  }\n  if (typeof value === \"string\") {\n    const parsed = Number(value);\n    if (Number.isFinite(parsed)) {\n      return parsed;\n    }\n  }\n  return 0;\n}\n\nfunction traderScore(row: Record<string, unknown>): number {\n  const keys = [\n    \"followerNum\",\n    \"followerCount\",\n    \"copyCount\",\n    \"winRate\",\n    \"profitRate\",\n    \"aum\",\n  ];\n  return keys.reduce((acc, key) => acc + toNumber(row[key]), 0);\n}\n\nfunction traderIdFromRow(\n  row: Record<string, unknown>,\n  productType: string,\n): string | undefined {\n  const idKeys = isSpot(productType)\n    ? [\"traderUserId\", \"traderId\", \"uid\", \"userId\"]\n    : [\"traderId\", \"traderUserId\", \"uid\", \"userId\"];\n  for (const key of idKeys) {\n    const value = row[key];\n    if (typeof value === \"string\" && value.length > 0) {\n      return value;\n    }\n    if (typeof value === \"number\") {\n      return String(value);\n    }\n  }\n  return undefined;\n}\n\nfunction selectTrader(\n  rows: Record<string, unknown>[],\n  productType: string,\n  selectionPolicy: string,\n): { traderId: string; row: Record<string, unknown> } | null {\n  const candidates = rows\n    .map((row) => ({\n      traderId: traderIdFromRow(row, productType),\n      row,\n      score: traderScore(row),\n    }))\n    .filter(\n      (\n        item,\n      ): item is {\n        traderId: string;\n        row: Record<string, unknown>;\n        score: number;\n      } => Boolean(item.traderId),\n    );\n  if (candidates.length === 0) {\n    return null;\n  }\n  if (selectionPolicy === \"stable\") {\n    candidates.sort((a, b) => b.score - a.score || a.traderId.localeCompare(b.traderId));\n  }\n  const best = candidates[0];\n  if (!best) {\n    return null;\n  }\n  return {\n    traderId: best.traderId,\n    row: best.row,\n  };\n}\n\nexport function registerCopyTradingTools(): ToolSpec[] {\n  return [\n    {\n      name: \"copy_get_traders\",\n      module: \"copytrading\",\n      description:\n        \"Get copy-trading trader list and configuration candidates. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: {\n            type: \"string\",\n            enum: [...COPY_PRODUCT_TYPES],\n            description: \"Copy trading market type.\",\n          },\n          symbol: { type: \"string\", description: \"Optional symbol filter for spot copy.\" },\n          limit: { type: \"number\", description: \"Page size, default 20.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const symbol = readString(args, \"symbol\");\n        const limit = readNumber(args, \"limit\");\n        const path = isSpot(productType)\n          ? \"/api/v2/copy/spot-follower/query-traders\"\n          : \"/api/v2/copy/mix-follower/query-traders\";\n        const query = isSpot(productType)\n          ? compactObject({ symbol, limit })\n          : compactObject({ productType, symbol, limit });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_traders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_place_order\",\n      module: \"copytrading\",\n      description:\n        \"Create or update copy-trading follow settings. [CAUTION] Changes copy-trading behavior. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          traderId: {\n            type: \"string\",\n            description:\n              \"Required trader id. For spot copy this is traderUserId. For futures copy this is traderId.\",\n          },\n          symbol: { type: \"string\", description: \"Optional symbol for spot copy settings.\" },\n          leverageType: {\n            type: \"string\",\n            enum: [\"position\", \"contract\"],\n            description: \"Futures copy leverage type. Default position.\",\n          },\n          traceType: {\n            type: \"string\",\n            enum: [\"amount\", \"ratio\"],\n            description: \"Futures copy size mode. Default amount.\",\n          },\n          marginType: {\n            type: \"string\",\n            enum: [\"cross\", \"isolated\"],\n            description: \"Futures margin type. Default cross.\",\n          },\n          amount: {\n            type: \"string\",\n            description: \"Trace amount (for amount mode).\",\n          },\n          ratio: {\n            type: \"string\",\n            description: \"Trace ratio (for ratio mode).\",\n          },\n          autoSelectTrader: {\n            type: \"boolean\",\n            description:\n              \"When true (or traderId omitted), auto-select trader from query-traders list.\",\n          },\n          selectionPolicy: {\n            type: \"string\",\n            enum: [\"recommended\", \"stable\"],\n            description: \"Trader auto-selection policy. Default recommended.\",\n          },\n          dryRun: {\n            type: \"boolean\",\n            description:\n              \"When true, resolve trader and return payload preview without sending write request.\",\n          },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const requestedTraderId = readString(args, \"traderId\");\n        const autoSelectTrader =\n          readBoolean(args, \"autoSelectTrader\") ?? !requestedTraderId;\n        const selectionPolicy = readString(args, \"selectionPolicy\") ?? \"recommended\";\n        assertEnum(selectionPolicy, \"selectionPolicy\", [\"recommended\", \"stable\"]);\n        const dryRun = readBoolean(args, \"dryRun\") ?? false;\n\n        let resolvedTraderId = requestedTraderId;\n        let selectedTrader: Record<string, unknown> | null = null;\n        let candidateCount = 0;\n\n        if (!resolvedTraderId && autoSelectTrader) {\n          const tradersPath = isSpot(productType)\n            ? \"/api/v2/copy/spot-follower/query-traders\"\n            : \"/api/v2/copy/mix-follower/query-traders\";\n          const tradersResponse = await context.client.privateGet(\n            tradersPath,\n            isSpot(productType)\n              ? compactObject({\n                  symbol: readString(args, \"symbol\"),\n                  limit: 20,\n                })\n              : compactObject({\n                  productType,\n                  symbol: readString(args, \"symbol\"),\n                  limit: 20,\n                }),\n            privateRateLimit(\"copy_place_order_select\", 10),\n          );\n          const rows = extractTraderRows(tradersResponse.data);\n          candidateCount = rows.length;\n          const picked = selectTrader(rows, productType, selectionPolicy);\n          if (!picked) {\n            throw new BitgetApiError(\n              \"No available copy traders found for auto selection.\",\n              {\n                code: \"COPY_TRADER_NOT_FOUND\",\n                suggestion:\n                  \"Call copy_get_traders and pass traderId explicitly, or switch productType.\",\n              },\n            );\n          }\n          resolvedTraderId = picked.traderId;\n          selectedTrader = picked.row;\n        }\n\n        if (!resolvedTraderId) {\n          throw new ValidationError(\n            'Missing \"traderId\". Provide traderId or set autoSelectTrader=true.',\n          );\n        }\n\n        if (isSpot(productType)) {\n          const payload = compactObject({\n            traderUserId: resolvedTraderId,\n            symbol: readString(args, \"symbol\"),\n          });\n          if (dryRun) {\n            return {\n              endpoint: \"DRY_RUN POST /api/v2/copy/spot-follower/settings\",\n              requestTime: new Date().toISOString(),\n              data: {\n                dryRun: true,\n                payload,\n                requestedTraderId: requestedTraderId ?? null,\n                resolvedTraderId,\n                autoSelected: !requestedTraderId,\n                selectionPolicy,\n                candidateCount,\n                selectedTrader,\n              },\n            };\n          }\n          const response = await context.client.privatePost(\n            \"/api/v2/copy/spot-follower/settings\",\n            payload,\n            privateRateLimit(\"copy_place_order\", 10),\n          );\n          return {\n            ...normalize(response),\n            selection: {\n              requestedTraderId: requestedTraderId ?? null,\n              resolvedTraderId,\n              autoSelected: !requestedTraderId,\n              selectionPolicy,\n              candidateCount,\n              selectedTrader,\n            },\n          };\n        }\n\n        const symbol = readString(args, \"symbol\");\n        if (!symbol) {\n          throw new ValidationError(\n            'Parameter \"symbol\" is required for futures copy settings.',\n          );\n        }\n\n        const payload = {\n          traderId: resolvedTraderId,\n          productType,\n          settings: [\n            compactObject({\n              traderId: resolvedTraderId,\n              symbol,\n              leverType: readString(args, \"leverageType\") ?? \"position\",\n              traceType: readString(args, \"traceType\") ?? \"amount\",\n              marginType: readString(args, \"marginType\") ?? \"cross\",\n              amount: readString(args, \"amount\") ?? \"10\",\n              ratio: readString(args, \"ratio\"),\n            }),\n          ],\n        };\n        if (dryRun) {\n          return {\n            endpoint: \"DRY_RUN POST /api/v2/copy/mix-follower/settings\",\n            requestTime: new Date().toISOString(),\n            data: {\n              dryRun: true,\n              payload,\n              requestedTraderId: requestedTraderId ?? null,\n              resolvedTraderId,\n              autoSelected: !requestedTraderId,\n              selectionPolicy,\n              candidateCount,\n              selectedTrader,\n            },\n          };\n        }\n\n        const response = await context.client.privatePost(\n          \"/api/v2/copy/mix-follower/settings\",\n          payload,\n          privateRateLimit(\"copy_place_order\", 10),\n        );\n        return {\n          ...normalize(response),\n          selection: {\n            requestedTraderId: requestedTraderId ?? null,\n            resolvedTraderId,\n            autoSelected: !requestedTraderId,\n            selectionPolicy,\n            candidateCount,\n            selectedTrader,\n          },\n        };\n      },\n    },\n    {\n      name: \"copy_close_position\",\n      module: \"copytrading\",\n      description:\n        \"Close copy-trading follower position (futures). [CAUTION] Closes positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          subPosId: {\n            type: \"string\",\n            description: \"Tracking number (maps to trackingNo).\",\n          },\n          marginCoin: { type: \"string\" },\n          marginMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.privatePost(\n          \"/api/v2/copy/mix-follower/close-positions\",\n          compactObject({\n            productType,\n            symbol: requireString(args, \"symbol\"),\n            trackingNo: readString(args, \"subPosId\"),\n            marginCoin: readString(args, \"marginCoin\"),\n            marginMode: readString(args, \"marginMode\"),\n            holdSide: readString(args, \"holdSide\"),\n          }),\n          privateRateLimit(\"copy_close_position\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_get_orders\",\n      module: \"copytrading\",\n      description:\n        \"Query copy-trading historical orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          traderId: { type: \"string\", description: \"Optional trader id filter.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const path = isSpot(productType)\n          ? \"/api/v2/copy/spot-follower/query-history-orders\"\n          : \"/api/v2/copy/mix-follower/query-history-orders\";\n        const query = isSpot(productType)\n          ? compactObject({\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n            })\n          : compactObject({\n              productType,\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n              traderId: readString(args, \"traderId\"),\n            });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_get_positions\",\n      module: \"copytrading\",\n      description:\n        \"Get current or historical copy-trading positions/orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          history: { type: \"boolean\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          traderId: { type: \"string\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const history = readBoolean(args, \"history\") ?? false;\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const path = isSpot(productType)\n          ? history\n            ? \"/api/v2/copy/spot-follower/query-history-orders\"\n            : \"/api/v2/copy/spot-follower/query-current-orders\"\n          : history\n            ? \"/api/v2/copy/mix-follower/query-history-orders\"\n            : \"/api/v2/copy/mix-follower/query-current-orders\";\n        const query = isSpot(productType)\n          ? compactObject({\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n            })\n          : compactObject({\n              productType,\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n              traderId: readString(args, \"traderId\"),\n            });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_positions\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readBoolean,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { GRANULARITIES, PRODUCT_TYPES, publicRateLimit } from \"./common.js\";\n\nconst FUTURES_GRANULARITY_MAP: Record<string, string> = {\n  \"1min\": \"1m\",\n  \"5min\": \"5m\",\n  \"15min\": \"15m\",\n  \"30min\": \"30m\",\n  \"1h\": \"1H\",\n  \"4h\": \"4H\",\n  \"6h\": \"6H\",\n  \"12h\": \"12H\",\n  \"1day\": \"1D\",\n  \"3day\": \"3D\",\n  \"1week\": \"1W\",\n  \"1M\": \"1M\",\n};\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerFuturesMarketTools(): ToolSpec[] {\n  return [\n    {\n      name: \"futures_get_ticker\",\n      module: \"futures\",\n      description:\n        \"Get futures ticker for one symbol or all symbols in product type. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: {\n            type: \"string\",\n            enum: [...PRODUCT_TYPES],\n            description: \"Futures product type.\",\n          },\n          symbol: { type: \"string\", description: \"Contract symbol, e.g. BTCUSDT.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const symbol = readString(args, \"symbol\");\n        const path = symbol\n          ? \"/api/v2/mix/market/ticker\"\n          : \"/api/v2/mix/market/tickers\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ productType, symbol }),\n          publicRateLimit(\"futures_get_ticker\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_depth\",\n      module: \"futures\",\n      description:\n        \"Get futures orderbook depth with precision levels. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\", description: \"Contract symbol.\" },\n          limit: { type: \"number\", description: \"Depth levels, default 100.\" },\n          precision: { type: \"string\", description: \"Merge precision value.\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/merge-depth\",\n          compactObject({\n            productType,\n            symbol,\n            limit: readNumber(args, \"limit\"),\n            precision: readString(args, \"precision\"),\n          }),\n          publicRateLimit(\"futures_get_depth\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_candles\",\n      module: \"futures\",\n      description:\n        \"Get futures candles from trade/index/mark price sources. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          granularity: { type: \"string\", enum: [...GRANULARITIES] },\n          priceType: {\n            type: \"string\",\n            enum: [\"trade\", \"index\", \"mark\"],\n            description: \"trade(default), index, or mark.\",\n          },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\", \"symbol\", \"granularity\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const granularity = requireString(args, \"granularity\");\n        const priceType = readString(args, \"priceType\") ?? \"trade\";\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        assertEnum(granularity, \"granularity\", GRANULARITIES);\n        assertEnum(priceType, \"priceType\", [\"trade\", \"index\", \"mark\"]);\n        const apiGranularity = FUTURES_GRANULARITY_MAP[granularity] ?? granularity;\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const path =\n          priceType === \"index\"\n            ? \"/api/v2/mix/market/history-index-candles\"\n            : priceType === \"mark\"\n              ? \"/api/v2/mix/market/history-mark-candles\"\n              : startTime\n                ? \"/api/v2/mix/market/history-candles\"\n                : \"/api/v2/mix/market/candles\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            granularity: apiGranularity,\n            startTime,\n            endTime,\n            limit,\n          }),\n          publicRateLimit(\"futures_get_candles\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_trades\",\n      module: \"futures\",\n      description:\n        \"Get recent or historical futures trade records. Public endpoint. Rate limit: 10 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          limit: { type: \"number\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const startTime = readString(args, \"startTime\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = startTime\n          ? \"/api/v2/mix/market/fills-history\"\n          : \"/api/v2/mix/market/fills\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            limit: readNumber(args, \"limit\"),\n            startTime,\n            endTime: readString(args, \"endTime\"),\n          }),\n          publicRateLimit(\"futures_get_trades\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_contracts\",\n      module: \"futures\",\n      description:\n        \"Get futures contract configuration details. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\", description: \"Optional symbol filter.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/contracts\",\n          compactObject({\n            productType,\n            symbol: readString(args, \"symbol\"),\n          }),\n          publicRateLimit(\"futures_get_contracts\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_funding_rate\",\n      module: \"futures\",\n      description:\n        \"Get current or historical funding rates for a futures symbol. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          history: { type: \"boolean\", description: \"true for historical funding rates.\" },\n          pageSize: { type: \"number\", description: \"Page size for history mode.\" },\n          pageNo: { type: \"number\", description: \"Page number for history mode.\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const history = readBoolean(args, \"history\") ?? false;\n        if (history) {\n          const historyResponse = await context.client.publicGet(\n            \"/api/v2/mix/market/history-fund-rate\",\n            compactObject({\n              productType,\n              symbol,\n              pageSize: readNumber(args, \"pageSize\"),\n              pageNo: readNumber(args, \"pageNo\"),\n            }),\n            publicRateLimit(\"futures_get_funding_rate\", 20),\n          );\n          return normalize(historyResponse);\n        }\n\n        const [currentRate, fundingTime] = await Promise.all([\n          context.client.publicGet(\n            \"/api/v2/mix/market/current-fund-rate\",\n            compactObject({ productType, symbol }),\n            publicRateLimit(\"futures_get_funding_rate_current\", 20),\n          ),\n          context.client.publicGet(\n            \"/api/v2/mix/market/funding-time\",\n            compactObject({ productType, symbol }),\n            publicRateLimit(\"futures_get_funding_rate_time\", 20),\n          ),\n        ]);\n\n        return {\n          endpoint: `${currentRate.endpoint} + ${fundingTime.endpoint}`,\n          requestTime: new Date().toISOString(),\n          data: {\n            currentFundRate: currentRate.data,\n            fundingTime: fundingTime.data,\n          },\n        };\n      },\n    },\n    {\n      name: \"futures_get_open_interest\",\n      module: \"futures\",\n      description:\n        \"Get open interest for a futures contract. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/open-interest\",\n          compactObject({ productType, symbol }),\n          publicRateLimit(\"futures_get_open_interest\", 20),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readObjectArray,\n  readString,\n  readStringArray,\n  requireObjectArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerFuturesTradeTools(): ToolSpec[] {\n  return [\n    {\n      name: \"futures_place_order\",\n      module: \"futures\",\n      description:\n        \"Place one or more futures orders with optional TP/SL. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orders: {\n            type: \"array\",\n            description: \"Array of futures order objects.\",\n            items: { type: \"object\" },\n          },\n        },\n        required: [\"orders\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orders = requireObjectArray(args, \"orders\");\n        if (orders.length > 50) {\n          throw new ValidationError(\"orders supports at most 50 items.\");\n        }\n        const normalizedOrders = orders.map((order) => {\n          const orderType = readString(order, \"orderType\");\n          return compactObject({\n            ...order,\n            marginMode: readString(order, \"marginMode\") ?? \"crossed\",\n            force:\n              readString(order, \"force\") ??\n              (orderType === \"limit\" ? \"gtc\" : undefined),\n          });\n        });\n        const isSingle = orders.length === 1;\n        const path = isSingle\n          ? \"/api/v2/mix/order/place-order\"\n          : \"/api/v2/mix/order/batch-place-order\";\n        const first = normalizedOrders.at(0);\n        if (!first) {\n          throw new ValidationError(\"orders cannot be empty.\");\n        }\n        let body: Record<string, unknown>;\n        if (isSingle) {\n          body = first;\n        } else {\n          const shared = {\n            symbol: readString(first, \"symbol\"),\n            productType: readString(first, \"productType\"),\n            marginCoin: readString(first, \"marginCoin\"),\n            marginMode: readString(first, \"marginMode\") ?? \"crossed\",\n          };\n          const isSameKey = normalizedOrders.every(\n            (order) =>\n              readString(order, \"symbol\") === shared.symbol &&\n              readString(order, \"productType\") === shared.productType &&\n              readString(order, \"marginCoin\") === shared.marginCoin &&\n              (readString(order, \"marginMode\") ?? \"crossed\") ===\n                shared.marginMode,\n          );\n          if (!isSameKey) {\n            throw new ValidationError(\n              \"Batch futures orders must share symbol, productType, marginCoin, and marginMode.\",\n            );\n          }\n          body = {\n            symbol: shared.symbol,\n            productType: shared.productType,\n            marginCoin: shared.marginCoin,\n            marginMode: shared.marginMode,\n            orderList: normalizedOrders.map((order) => {\n              const { symbol, productType, marginCoin, marginMode, ...rest } = order;\n              void symbol;\n              void productType;\n              void marginCoin;\n              void marginMode;\n              return rest;\n            }),\n          };\n        }\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"futures_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_cancel_orders\",\n      module: \"futures\",\n      description:\n        \"Cancel futures orders by order id, batch ids, or cancel-all mode. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          orderIds: { type: \"array\", items: { type: \"string\" } },\n          cancelAll: { type: \"boolean\" },\n          marginCoin: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const cancelAll = readBoolean(args, \"cancelAll\");\n        const marginCoin = readString(args, \"marginCoin\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"cancelAll\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const { path, body } = orderId\n          ? {\n              path: \"/api/v2/mix/order/cancel-order\",\n              body: { productType, symbol, orderId },\n            }\n          : orderIds\n            ? {\n                path: \"/api/v2/mix/order/batch-cancel-orders\",\n                body: { productType, symbol, orderIds },\n              }\n            : {\n                path: \"/api/v2/mix/order/cancel-all-orders\",\n                body: compactObject({ productType, symbol, marginCoin }),\n              };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"futures_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_orders\",\n      module: \"futures\",\n      description:\n        \"Query futures orders by id, open status, or history. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          orderId: { type: \"string\" },\n          symbol: { type: \"string\" },\n          status: { type: \"string\", enum: [\"open\", \"history\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const orderId = readString(args, \"orderId\");\n        const symbol = readString(args, \"symbol\");\n        const status = readString(args, \"status\") ?? \"open\";\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = orderId\n          ? \"/api/v2/mix/order/detail\"\n          : status === \"history\"\n            ? \"/api/v2/mix/order/orders-history\"\n            : \"/api/v2/mix/order/orders-pending\";\n        const query = compactObject({\n          productType,\n          orderId,\n          symbol,\n          startTime: readString(args, \"startTime\"),\n          endTime: readString(args, \"endTime\"),\n          limit: readNumber(args, \"limit\"),\n        });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"futures_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_fills\",\n      module: \"futures\",\n      description:\n        \"Get futures fills and fill history records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const startTime = readString(args, \"startTime\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = startTime\n          ? \"/api/v2/mix/order/fill-history\"\n          : \"/api/v2/mix/order/fills\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            productType,\n            symbol: readString(args, \"symbol\"),\n            orderId: readString(args, \"orderId\"),\n            startTime,\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"futures_get_fills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_positions\",\n      module: \"futures\",\n      description:\n        \"Get current or historical futures positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          history: { type: \"boolean\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = readString(args, \"symbol\");\n        const history = readBoolean(args, \"history\") ?? false;\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = history\n          ? \"/api/v2/mix/position/history-position\"\n          : symbol\n            ? \"/api/v2/mix/position/single-position\"\n            : \"/api/v2/mix/position/all-position\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            marginCoin:\n              readString(args, \"marginCoin\") ?? (symbol ? \"USDT\" : undefined),\n          }),\n          privateRateLimit(\"futures_get_positions\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_set_leverage\",\n      module: \"futures\",\n      description:\n        \"Set futures leverage for symbol and margin coin. [CAUTION] Affects risk exposure. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          leverage: { type: \"string\" },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\", \"marginCoin\", \"leverage\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.privatePost(\n          \"/api/v2/mix/account/set-leverage\",\n          compactObject({\n            productType,\n            symbol: requireString(args, \"symbol\"),\n            marginCoin: requireString(args, \"marginCoin\"),\n            leverage: requireString(args, \"leverage\"),\n            holdSide: readString(args, \"holdSide\"),\n          }),\n          privateRateLimit(\"futures_set_leverage\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_update_config\",\n      module: \"futures\",\n      description:\n        \"Update futures margin mode, position mode, or auto-margin setting. [CAUTION] Affects trading behavior. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          setting: {\n            type: \"string\",\n            enum: [\"marginMode\", \"positionMode\", \"autoMargin\"],\n          },\n          value: { type: \"string\" },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\", \"marginCoin\", \"setting\", \"value\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const setting = requireString(args, \"setting\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        assertEnum(setting, \"setting\", [\"marginMode\", \"positionMode\", \"autoMargin\"]);\n        const endpoint =\n          setting === \"marginMode\"\n            ? \"/api/v2/mix/account/set-margin-mode\"\n            : setting === \"positionMode\"\n              ? \"/api/v2/mix/account/set-position-mode\"\n              : \"/api/v2/mix/account/set-auto-margin\";\n        const response = await context.client.privatePost(\n          endpoint,\n          setting === \"marginMode\"\n            ? compactObject({\n                productType,\n                symbol: requireString(args, \"symbol\"),\n                marginCoin: requireString(args, \"marginCoin\"),\n                marginMode: requireString(args, \"value\"),\n              })\n            : setting === \"positionMode\"\n              ? compactObject({\n                  productType,\n                  symbol: requireString(args, \"symbol\"),\n                  marginCoin: requireString(args, \"marginCoin\"),\n                  posMode: requireString(args, \"value\"),\n                })\n              : compactObject({\n                  productType,\n                  symbol: requireString(args, \"symbol\"),\n                  marginCoin: requireString(args, \"marginCoin\"),\n                  autoMargin: requireString(args, \"value\"),\n                  holdSide: readString(args, \"holdSide\"),\n                }),\n          privateRateLimit(\"futures_update_config\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readString,\n  readStringArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nconst MARGIN_TYPES = [\"crossed\", \"isolated\"] as const;\n\nfunction marginPath(marginType: string, suffix: string): string {\n  const scope = marginType === \"crossed\" ? \"crossed\" : \"isolated\";\n  return `/api/v2/margin/${scope}/${suffix}`;\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerMarginTools(): ToolSpec[] {\n  return [\n    {\n      name: \"margin_get_assets\",\n      module: \"margin\",\n      description:\n        \"Get crossed or isolated margin assets and risk metrics. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          coin: { type: \"string\" },\n        },\n        required: [\"marginType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privateGet(\n          marginPath(marginType, \"account/assets\"),\n          compactObject({\n            symbol: readString(args, \"symbol\"),\n            coin: readString(args, \"coin\"),\n          }),\n          privateRateLimit(\"margin_get_assets\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_borrow\",\n      module: \"margin\",\n      description:\n        \"Borrow margin funds. [CAUTION] Creates debt. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          symbol: { type: \"string\" },\n        },\n        required: [\"marginType\", \"coin\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privatePost(\n          marginPath(marginType, \"account/borrow\"),\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            borrowAmount: requireString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n          }),\n          privateRateLimit(\"margin_borrow\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_repay\",\n      module: \"margin\",\n      description:\n        \"Repay margin debt with optional flash repay. [CAUTION] Uses account funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          symbol: { type: \"string\" },\n          flashRepay: { type: \"boolean\" },\n        },\n        required: [\"marginType\", \"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const flashRepay = readBoolean(args, \"flashRepay\") ?? false;\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const path = flashRepay\n          ? marginPath(marginType, \"account/flash-repay\")\n          : marginPath(marginType, \"account/repay\");\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            repayAmount: readString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n          }),\n          privateRateLimit(\"margin_repay\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_place_order\",\n      module: \"margin\",\n      description:\n        \"Place margin order in crossed or isolated mode. [CAUTION] Executes real trade. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          side: { type: \"string\", enum: [\"buy\", \"sell\"] },\n          orderType: { type: \"string\", enum: [\"limit\", \"market\"] },\n          price: { type: \"string\" },\n          size: { type: \"string\" },\n          loanType: {\n            type: \"string\",\n            enum: [\"normal\", \"autoLoan\", \"autoRepay\", \"autoLoanAndRepay\"],\n          },\n        },\n        required: [\"marginType\", \"symbol\", \"side\", \"orderType\", \"size\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privatePost(\n          marginPath(marginType, \"place-order\"),\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            side: requireString(args, \"side\"),\n            orderType: requireString(args, \"orderType\"),\n            price: readString(args, \"price\"),\n            baseSize: requireString(args, \"size\"),\n            loanType: readString(args, \"loanType\") ?? \"normal\",\n            force: \"gtc\",\n          }),\n          privateRateLimit(\"margin_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_cancel_orders\",\n      module: \"margin\",\n      description:\n        \"Cancel one or more margin orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          orderIds: { type: \"array\", items: { type: \"string\" } },\n        },\n        required: [\"marginType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\"],\n          'Provide one of \"orderId\" or \"orderIds\".',\n        );\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const path = orderId\n          ? marginPath(marginType, \"cancel-order\")\n          : marginPath(marginType, \"batch-cancel-order\");\n        const response = await context.client.privatePost(\n          path,\n          orderId\n            ? compactObject({ symbol, orderId })\n            : {\n                symbol,\n                orderIdList: (orderIds ?? []).map((id) => ({ orderId: id })),\n              },\n          privateRateLimit(\"margin_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_get_orders\",\n      module: \"margin\",\n      description:\n        \"Query margin orders (open/history/order detail). Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          status: { type: \"string\", enum: [\"open\", \"history\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"marginType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const orderId = readString(args, \"orderId\");\n        const status = readString(args, \"status\") ?? \"open\";\n        const path =\n          status === \"history\" || orderId\n            ? marginPath(marginType, \"history-orders\")\n            : marginPath(marginType, \"open-orders\");\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            symbol: readString(args, \"symbol\"),\n            orderId,\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"margin_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_get_records\",\n      module: \"margin\",\n      description:\n        \"Get borrow/repay/interest/liquidation records for margin accounts. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          recordType: {\n            type: \"string\",\n            enum: [\"borrow\", \"repay\", \"interest\", \"liquidation\"],\n          },\n          coin: { type: \"string\" },\n          symbol: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"marginType\", \"recordType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const recordType = requireString(args, \"recordType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        assertEnum(recordType, \"recordType\", [\n          \"borrow\",\n          \"repay\",\n          \"interest\",\n          \"liquidation\",\n        ]);\n        const apiMarginType =\n          recordType === \"borrow\"\n            ? \"borrow\"\n            : recordType === \"repay\"\n              ? \"repay\"\n              : recordType === \"interest\"\n                ? \"interest\"\n                : \"liquidation_fee\";\n        const now = Date.now();\n        const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n        const response = await context.client.privateGet(\n          marginPath(marginType, \"financial-records\"),\n          compactObject({\n            marginType: apiMarginType,\n            coin: readString(args, \"coin\"),\n            startTime: readString(args, \"startTime\") ?? defaultStartTime,\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"margin_get_records\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerP2pTools(): ToolSpec[] {\n  return [\n    {\n      name: \"p2p_get_merchants\",\n      module: \"p2p\",\n      description:\n        \"Get P2P merchant list or specific merchant details. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          merchantId: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const merchantId = readString(args, \"merchantId\");\n        const path = merchantId\n          ? \"/api/v2/p2p/merchantInfo\"\n          : \"/api/v2/p2p/merchantList\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({ merchantId }),\n          privateRateLimit(\"p2p_get_merchants\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"p2p_get_orders\",\n      module: \"p2p\",\n      description:\n        \"Get P2P order list or advertisement list. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: {\n            type: \"string\",\n            enum: [\"orders\", \"advertisements\"],\n            description: \"orders(default) or advertisements.\",\n          },\n          status: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"orders\";\n        assertEnum(type, \"type\", [\"orders\", \"advertisements\"]);\n        const path =\n          type === \"advertisements\"\n            ? \"/api/v2/p2p/advList\"\n            : \"/api/v2/p2p/orderList\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            status: readString(args, \"status\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n          }),\n          privateRateLimit(\"p2p_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  asRecord,\n} from \"./helpers.js\";\nimport { GRANULARITIES, publicRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerSpotMarketTools(): ToolSpec[] {\n  return [\n    {\n      name: \"spot_get_ticker\",\n      module: \"spot\",\n      description:\n        \"Get real-time ticker data for spot trading pair(s). Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: {\n            type: \"string\",\n            description: \"Trading pair symbol, e.g. BTCUSDT. Omit for all tickers.\",\n          },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const response = await context.client.publicGet(\n          \"/api/v2/spot/market/tickers\",\n          compactObject({ symbol }),\n          publicRateLimit(\"spot_get_ticker\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_depth\",\n      module: \"spot\",\n      description:\n        \"Get orderbook depth for a spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n          type: {\n            type: \"string\",\n            enum: [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"],\n            description: \"Depth merge level. step0 means raw orderbook.\",\n          },\n          limit: {\n            type: \"number\",\n            description: \"Depth levels, default 150, max 150.\",\n          },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const type = readString(args, \"type\") ?? \"step0\";\n        const limit = readNumber(args, \"limit\");\n        assertEnum(type, \"type\", [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"]);\n        const path =\n          type === \"step0\"\n            ? \"/api/v2/spot/market/orderbook\"\n            : \"/api/v2/spot/market/merge-depth\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, type, limit }),\n          publicRateLimit(\"spot_get_depth\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_candles\",\n      module: \"spot\",\n      description:\n        \"Get K-line data for spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n          granularity: {\n            type: \"string\",\n            enum: [...GRANULARITIES],\n            description: \"Candlestick period.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100, max 1000.\" },\n        },\n        required: [\"symbol\", \"granularity\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const granularity = readString(args, \"granularity\");\n        assertEnum(granularity, \"granularity\", GRANULARITIES);\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const path = startTime\n          ? \"/api/v2/spot/market/history-candles\"\n          : \"/api/v2/spot/market/candles\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, granularity, startTime, endTime, limit }),\n          publicRateLimit(\"spot_get_candles\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_trades\",\n      module: \"spot\",\n      description:\n        \"Get recent or historical trade records for spot symbol. Public endpoint. Rate limit: 10 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          limit: { type: \"number\", description: \"Result size, default 100, max 500.\" },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const limit = readNumber(args, \"limit\");\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const path = startTime\n          ? \"/api/v2/spot/market/fills-history\"\n          : \"/api/v2/spot/market/fills\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, limit, startTime, endTime }),\n          publicRateLimit(\"spot_get_trades\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_symbols\",\n      module: \"spot\",\n      description:\n        \"Get spot symbol info or coin chain info. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: {\n            type: \"string\",\n            enum: [\"symbols\", \"coins\"],\n            description: \"symbols(default) or coins.\",\n          },\n          symbol: { type: \"string\", description: \"Specific symbol filter.\" },\n          coin: { type: \"string\", description: \"Specific coin filter.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"symbols\";\n        assertEnum(type, \"type\", [\"symbols\", \"coins\"]);\n        const symbol = readString(args, \"symbol\");\n        const coin = readString(args, \"coin\");\n        const path =\n          type === \"coins\"\n            ? \"/api/v2/spot/public/coins\"\n            : \"/api/v2/spot/public/symbols\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, coin }),\n          publicRateLimit(\"spot_get_symbols\", 20),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readObjectArray,\n  readString,\n  readStringArray,\n  requireObjectArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n  return [\n    {\n      name: \"spot_place_order\",\n      module: \"spot\",\n      description:\n        \"Place one or more spot orders. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orders: {\n            type: \"array\",\n            description:\n              \"Array of order objects. Single order should still be passed as an array with one item.\",\n            items: {\n              type: \"object\",\n            },\n          },\n        },\n        required: [\"orders\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orders = requireObjectArray(args, \"orders\");\n        if (orders.length > 50) {\n          throw new ValidationError(\"orders supports at most 50 items.\");\n        }\n        const normalizedOrders = orders.map((order) => {\n          const orderType = readString(order, \"orderType\");\n          return compactObject({\n            ...order,\n            force:\n              readString(order, \"force\") ??\n              (orderType === \"limit\" ? \"gtc\" : undefined),\n          });\n        });\n        const isSingle = orders.length === 1;\n        const path = isSingle\n          ? \"/api/v2/spot/trade/place-order\"\n          : \"/api/v2/spot/trade/batch-orders\";\n        const body = isSingle ? normalizedOrders[0] : { orderList: normalizedOrders };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_cancel_orders\",\n      module: \"spot\",\n      description:\n        \"Cancel one or more spot orders by id, batch ids, or symbol-wide cancel. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Single order id.\" },\n          orderIds: {\n            type: \"array\",\n            description: \"Multiple order ids. Max 50.\",\n            items: { type: \"string\" },\n          },\n          cancelAll: {\n            type: \"boolean\",\n            description: \"If true, cancel all open orders for symbol.\",\n          },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = requireString(args, \"symbol\");\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const cancelAll = readBoolean(args, \"cancelAll\");\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"cancelAll\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const { path, body } = orderId\n          ? {\n              path: \"/api/v2/spot/trade/cancel-order\",\n              body: { symbol, orderId },\n            }\n          : orderIds\n            ? {\n                path: \"/api/v2/spot/trade/batch-cancel-order\",\n                body: { symbol, orderIds },\n              }\n            : cancelAll\n              ? {\n                  path: \"/api/v2/spot/trade/cancel-symbol-order\",\n                  body: { symbol },\n                }\n              : {\n                  path: \"/api/v2/spot/trade/cancel-order\",\n                  body: { symbol },\n                };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_modify_order\",\n      module: \"spot\",\n      description:\n        \"Cancel and replace a spot order atomically. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Original order id.\" },\n          newPrice: { type: \"string\", description: \"New price for limit order.\" },\n          newSize: { type: \"string\", description: \"New order size.\" },\n          newClientOid: { type: \"string\", description: \"New client order id.\" },\n        },\n        required: [\"symbol\", \"orderId\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const newPrice = readString(args, \"newPrice\");\n        const newSize = readString(args, \"newSize\");\n        const newClientOid = readString(args, \"newClientOid\");\n        if (!newPrice && !newSize && !newClientOid) {\n          throw new ValidationError(\n            'Provide at least one of \"newPrice\", \"newSize\", or \"newClientOid\".',\n          );\n        }\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/trade/cancel-replace-order\",\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            orderId: requireString(args, \"orderId\"),\n            price: newPrice,\n            size: newSize,\n            clientOid: newClientOid,\n            force: \"gtc\",\n          }),\n          privateRateLimit(\"spot_modify_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_orders\",\n      module: \"spot\",\n      description:\n        \"Query spot order detail, open orders, or history orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Specific order id.\" },\n          symbol: { type: \"string\", description: \"Trading pair filter.\" },\n          status: {\n            type: \"string\",\n            enum: [\"open\", \"history\"],\n            description: \"open(default) or history.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n          idLessThan: { type: \"string\", description: \"Pagination cursor.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const symbol = readString(args, \"symbol\");\n        const status = readString(args, \"status\") ?? \"open\";\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const idLessThan = readString(args, \"idLessThan\");\n        const route = orderId\n          ? \"/api/v2/spot/trade/orderInfo\"\n          : status === \"history\"\n            ? \"/api/v2/spot/trade/history-orders\"\n            : \"/api/v2/spot/trade/unfilled-orders\";\n        const query = compactObject({\n          orderId,\n          symbol,\n          startTime,\n          endTime,\n          limit,\n          idLessThan,\n        });\n        const response = await context.client.privateGet(\n          route,\n          query,\n          privateRateLimit(\"spot_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_fills\",\n      module: \"spot\",\n      description:\n        \"Get spot fills for order execution details. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Specific order id.\" },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privateGet(\n          \"/api/v2/spot/trade/fills\",\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            orderId: readString(args, \"orderId\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"spot_get_fills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_place_plan_order\",\n      module: \"spot\",\n      description:\n        \"Create or modify spot plan order (trigger order). Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"When provided, modify existing plan order.\" },\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          side: { type: \"string\", enum: [\"buy\", \"sell\"], description: \"Order side.\" },\n          triggerPrice: { type: \"string\", description: \"Trigger price.\" },\n          triggerType: {\n            type: \"string\",\n            enum: [\"mark_price\", \"fill_price\", \"last_price\"],\n            description: \"Trigger source.\",\n          },\n          orderType: {\n            type: \"string\",\n            enum: [\"limit\", \"market\"],\n            description: \"Execution order type.\",\n          },\n          price: { type: \"string\", description: \"Execution price for limit orders.\" },\n          size: { type: \"string\", description: \"Order quantity.\" },\n        },\n        required: [\"triggerPrice\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const path = orderId\n          ? \"/api/v2/spot/trade/modify-plan-order\"\n          : \"/api/v2/spot/trade/place-plan-order\";\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            orderId,\n            symbol: readString(args, \"symbol\"),\n            side: readString(args, \"side\"),\n            triggerPrice: requireString(args, \"triggerPrice\"),\n            triggerType:\n              readString(args, \"triggerType\") === \"last_price\"\n                ? \"fill_price\"\n                : (readString(args, \"triggerType\") ?? \"fill_price\"),\n            orderType: readString(args, \"orderType\"),\n            executePrice: readString(args, \"price\"),\n            planType: \"amount\",\n            size: readString(args, \"size\"),\n          }),\n          privateRateLimit(\"spot_place_plan_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_plan_orders\",\n      module: \"spot\",\n      description:\n        \"Get current or historical spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          status: {\n            type: \"string\",\n            enum: [\"current\", \"history\"],\n            description: \"current(default) or history.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const status = readString(args, \"status\") ?? \"current\";\n        const path =\n          status === \"history\"\n            ? \"/api/v2/spot/trade/history-plan-order\"\n            : \"/api/v2/spot/trade/current-plan-order\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"spot_get_plan_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_cancel_plan_orders\",\n      module: \"spot\",\n      description:\n        \"Cancel one or multiple spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Single plan order id.\" },\n          orderIds: {\n            type: \"array\",\n            description: \"Multiple plan order ids.\",\n            items: { type: \"string\" },\n          },\n          symbol: { type: \"string\", description: \"Cancel all plan orders for symbol.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const symbol = readString(args, \"symbol\");\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"symbol\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"symbol\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const path = orderId\n          ? \"/api/v2/spot/trade/cancel-plan-order\"\n          : \"/api/v2/spot/trade/batch-cancel-plan-order\";\n        const body = compactObject({ orderId, orderIds, symbol });\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_cancel_plan_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { BitgetConfig } from \"../config.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerBrokerTools } from \"./broker.js\";\nimport { registerConvertTools } from \"./convert.js\";\nimport { registerCopyTradingTools } from \"./copy-trading.js\";\nimport { registerEarnTools } from \"./earn.js\";\nimport { registerFuturesMarketTools } from \"./futures-market.js\";\nimport { registerFuturesTradeTools } from \"./futures-trade.js\";\nimport { registerMarginTools } from \"./margin.js\";\nimport { registerP2pTools } from \"./p2p.js\";\nimport { registerSpotMarketTools } from \"./spot-market.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport type { ToolSpec } from \"./types.js\";\n\nfunction allToolSpecs(): ToolSpec[] {\n  return [\n    ...registerSpotMarketTools(),\n    ...registerSpotTradeTools(),\n    ...registerFuturesMarketTools(),\n    ...registerFuturesTradeTools(),\n    ...registerAccountTools(),\n    ...registerMarginTools(),\n    ...registerCopyTradingTools(),\n    ...registerConvertTools(),\n    ...registerEarnTools(),\n    ...registerP2pTools(),\n    ...registerBrokerTools(),\n  ];\n}\n\nexport function buildTools(config: BitgetConfig): ToolSpec[] {\n  const enabledModules = new Set(config.modules);\n  const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n  if (!config.readOnly) {\n    return tools;\n  }\n  return tools.filter((tool) => !tool.isWrite);\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetRestClient } from \"../client/rest-client.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n  config: BitgetConfig;\n  client: BitgetRestClient;\n}\n\nexport interface ToolSpec {\n  name: string;\n  module: ModuleId;\n  description: string;\n  inputSchema: JsonSchema;\n  isWrite: boolean;\n  handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n  return {\n    name: tool.name,\n    description: tool.description,\n    inputSchema: tool.inputSchema,\n    annotations: {\n      readOnlyHint: !tool.isWrite,\n      destructiveHint: tool.isWrite,\n      idempotentHint: !tool.isWrite,\n      openWorldHint: true,\n    },\n  };\n}\n"],"mappings":";;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;;;ACD9B,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEvB,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,kBAA8B,CAAC,QAAQ,WAAW,SAAS;;;ACEjE,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACL,MACA,SACA,SAMA;AACA,UAAM,SAAS,SAAS,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AACpE,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO,SAAS;AACrB,SAAK,aAAa,SAAS;AAC3B,SAAK,WAAW,SAAS;AAAA,EAC3B;AACF;AAEO,IAAM,cAAN,cAA0B,eAAe;AAAA,EACvC,YAAY,SAAiB,YAAqB;AACvD,UAAM,eAAe,SAAS,EAAE,WAAW,CAAC;AAAA,EAC9C;AACF;AAEO,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAC3C,YAAY,SAAiB,YAAqB;AACvD,UAAM,mBAAmB,SAAS,EAAE,WAAW,CAAC;AAAA,EAClD;AACF;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAC1C,YAAY,SAAiB,YAAqB,UAAmB;AAC1E,UAAM,kBAAkB,SAAS,EAAE,YAAY,SAAS,CAAC;AAAA,EAC3D;AACF;AAEO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAC/C,YAAY,SAAiB,YAAqB,UAAmB;AAC1E,UAAM,uBAAuB,SAAS,EAAE,YAAY,SAAS,CAAC;AAAA,EAChE;AACF;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EAC1C,YACL,SACA,SAMA;AACA,UAAM,kBAAkB,SAAS,OAAO;AAAA,EAC1C;AACF;AAEO,IAAM,eAAN,cAA2B,eAAe;AAAA,EACxC,YAAY,SAAiB,UAAmB,OAAiB;AACtE,UAAM,gBAAgB,SAAS;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,YACE;AAAA,IACJ,CAAC;AAAA,EACH;AACF;AAEO,SAAS,mBACd,OACA,kBACkB;AAClB,MAAI,iBAAiB,gBAAgB;AACnC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM,YAAY;AAAA,MAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA,YACE;AAAA,IACF,UAAU;AAAA,IACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;ACrGA,SAAS,gBAAgB,YAAiC;AACxD,MAAI,CAAC,cAAc,WAAW,KAAK,EAAE,WAAW,GAAG;AACjD,WAAO,CAAC,GAAG,eAAe;AAAA,EAC5B;AAEA,QAAM,UAAU,WAAW,KAAK,EAAE,YAAY;AAC9C,MAAI,YAAY,OAAO;AACrB,WAAO,CAAC,GAAG,OAAO;AAAA,EACpB;AAEA,QAAM,YAAY,QACf,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,CAAC,GAAG,eAAe;AAAA,EAC5B;AAEA,QAAM,UAAU,oBAAI,IAAc;AAClC,aAAW,YAAY,WAAW;AAChC,QAAI,CAAC,QAAQ,SAAS,QAAoB,GAAG;AAC3C,YAAM,IAAI;AAAA,QACR,mBAAmB,QAAQ;AAAA,QAC3B,eAAe,QAAQ,KAAK,IAAI,CAAC;AAAA,MACnC;AAAA,IACF;AACA,YAAQ,IAAI,QAAoB;AAAA,EAClC;AAEA,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,gBAAwB;AAC/B,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,oCAAoC,GAAG;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,cAAsB;AAC7B,QAAM,UAAU,QAAQ,IAAI,qBAAqB,KAAK,KAAK;AAC3D,MAAI,CAAC,QAAQ,WAAW,SAAS,KAAK,CAAC,QAAQ,WAAW,UAAU,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,gCAAgC,OAAO;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACA,SAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnC;AAEO,SAAS,WAAW,KAA+B;AACxD,QAAM,SAAS,QAAQ,IAAI,gBAAgB,KAAK;AAChD,QAAM,YAAY,QAAQ,IAAI,mBAAmB,KAAK;AACtD,QAAM,aAAa,QAAQ,IAAI,mBAAmB,KAAK;AAEvD,QAAM,UAAU,QAAQ,UAAU,aAAa,UAAU;AACzD,QAAM,cACJ,QAAQ,MAAM,KAAK,QAAQ,SAAS,KAAK,QAAQ,UAAU;AAE7D,MAAI,eAAe,CAAC,SAAS;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,YAAY;AAAA,IACrB,WAAW,cAAc;AAAA,IACzB,SAAS,gBAAgB,IAAI,OAAO;AAAA,IACpC,UAAU,IAAI;AAAA,EAChB;AACF;;;AC1GA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OAGK;;;ACNP,SAAS,kBAAkB;AAEpB,SAAS,kBAAkB,SAAiB,WAA2B;AAC5E,SAAO,WAAW,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ;AACxE;;;ACWA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEO,IAAM,cAAN,MAAkB;AAAA,EACN,UAAU,oBAAI,IAAoB;AAAA,EAClC;AAAA,EAEV,YAAY,YAAY,KAAQ;AACrC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAa,QAAQ,QAAyB,SAAS,GAAkB;AACvE,UAAM,SAAS,KAAK,UAAU,MAAM;AACpC,SAAK,OAAO,MAAM;AAElB,QAAI,OAAO,UAAU,QAAQ;AAC3B,aAAO,UAAU;AACjB;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,OAAO;AAChC,UAAM,gBAAgB,UAAU,OAAO;AACvC,UAAM,SAAS,KAAK,KAAK,gBAAgB,GAAI;AAE7C,QAAI,SAAS,KAAK,WAAW;AAC3B,YAAM,IAAI;AAAA,QACR,sCAAsC,OAAO,GAAG,mBAAmB,MAAM,0BAA0B,KAAK,SAAS;AAAA,QACjH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM;AAClB,SAAK,OAAO,MAAM;AAElB,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,IAAI;AAAA,QACR,oDAAoD,OAAO,GAAG;AAAA,MAChE;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA,EAEQ,UAAU,QAAiC;AACjD,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO,GAAG;AAC5C,QAAI,UAAU;AACZ,UACE,SAAS,aAAa,OAAO,YAC7B,SAAS,oBAAoB,OAAO,iBACpC;AACA,iBAAS,WAAW,OAAO;AAC3B,iBAAS,kBAAkB,OAAO;AAClC,iBAAS,SAAS,KAAK,IAAI,SAAS,QAAQ,OAAO,QAAQ;AAAA,MAC7D;AACA,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAkB;AAAA,MACtB,QAAQ,OAAO;AAAA,MACf,cAAc;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,iBAAiB,OAAO;AAAA,IAC1B;AACA,SAAK,QAAQ,IAAI,OAAO,KAAK,OAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,QAAsB;AACnC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,YAAY,MAAM,OAAO;AAC/B,QAAI,aAAa,GAAG;AAClB;AAAA,IACF;AAEA,UAAM,eAAgB,YAAY,MAAQ,OAAO;AACjD,WAAO,SAAS,KAAK,IAAI,OAAO,UAAU,OAAO,SAAS,YAAY;AACtE,WAAO,eAAe;AAAA,EACxB;AACF;;;AChFA,SAAS,UAAU,OAAyB;AAC1C,SAAO,UAAU,UAAa,UAAU;AAC1C;AAEA,SAAS,oBAAoB,OAA2B;AACtD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,EACnD;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iBAAiB,OAA6B;AACrD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,KAAK,CAAC;AAC5E,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,WAAO,IAAI,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC5C;AACA,SAAO,OAAO,SAAS;AACzB;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACA,cAAc,IAAI,YAAY;AAAA,EAExC,YAAY,QAAsB;AACvC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAa,UACX,MACA,OACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,WACX,MACA,OACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,YACX,MACA,MACA,WAC+B;AAC/B,WAAO,KAAK,QAAe;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QACZ,QAC+B;AAC/B,UAAM,cAAc,iBAAiB,OAAO,KAAK;AACjD,UAAM,WAAW,YAAY,SAAS,IAAI,GAAG,OAAO,IAAI,IAAI,WAAW,KAAK,OAAO;AACnF,UAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,QAAQ;AAC7C,UAAM,WAAW,OAAO,OAAO,KAAK,UAAU,OAAO,IAAI,IAAI;AAC7D,UAAM,YAAY,KAAK,IAAI,EAAE,SAAS;AAEtC,QAAI,OAAO,WAAW;AACpB,YAAM,KAAK,YAAY,QAAQ,OAAO,SAAS;AAAA,IACjD;AAEA,UAAM,UAAU,IAAI,QAAQ;AAAA,MAC1B,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,OAAO,SAAS,WAAW;AAC7B,UAAI,CAAC,KAAK,OAAO,SAAS;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,OAAO,aAAa,CAAC,KAAK,OAAO,YAAY;AAC5E,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,GAAG,SAAS,GAAG,OAAO,OAAO,YAAY,CAAC,GAAG,QAAQ,GAAG,QAAQ;AAChF,YAAM,YAAY,kBAAkB,SAAS,KAAK,OAAO,SAAS;AAClE,cAAQ,IAAI,cAAc,KAAK,OAAO,MAAM;AAC5C,cAAQ,IAAI,eAAe,SAAS;AACpC,cAAQ,IAAI,qBAAqB,KAAK,OAAO,UAAU;AACvD,cAAQ,IAAI,oBAAoB,SAAS;AAAA,IAC3C;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK;AAAA,QAC1B,QAAQ,OAAO;AAAA,QACf;AAAA,QACA,MAAM,OAAO,WAAW,SAAS,WAAW;AAAA,QAC5C,QAAQ,YAAY,QAAQ,KAAK,OAAO,SAAS;AAAA,MACnD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,kCAAkC,OAAO,MAAM,IAAI,QAAQ;AAAA,QAC3D,GAAG,OAAO,MAAM,IAAI,QAAQ;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAI;AACJ,QAAI;AACF,eAAU,UAAU,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,IAC7C,SAAS,OAAO;AACd,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,iBAAiB,QAAQ,MAAM,GAAG,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvE,cAAM,IAAI;AAAA,UACR,QAAQ,SAAS,MAAM,iBAAiB,kBAAkB,wBAAwB;AAAA,UAClF;AAAA,YACE,MAAM,OAAO,SAAS,MAAM;AAAA,YAC5B,UAAU,GAAG,OAAO,MAAM,IAAI,OAAO,IAAI;AAAA,YACzC,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,yCAAyC,OAAO,MAAM,IAAI,QAAQ;AAAA,QAClE,GAAG,OAAO,MAAM,IAAI,QAAQ;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,QAAQ,SAAS,MAAM,iBAAiB,OAAO,OAAO,eAAe;AAAA,QACrE;AAAA,UACE,MAAM,OAAO,SAAS,MAAM;AAAA,UAC5B,UAAU,GAAG,OAAO,MAAM,IAAI,OAAO,IAAI;AAAA,UACzC,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,OAAO;AAC5B,QAAI,gBAAgB,iBAAiB,SAAS;AAC5C,YAAM,UAAU,OAAO,OAAO;AAC9B,UACE,iBAAiB,WACjB,iBAAiB,WACjB,iBAAiB,SACjB;AACA,cAAM,IAAI,oBAAoB,SAAS,sDAAsD,GAAG,OAAO,MAAM,IAAI,OAAO,IAAI,EAAE;AAAA,MAChI;AAEA,YAAM,IAAI,eAAe,SAAS;AAAA,QAChC,MAAM;AAAA,QACN,UAAU,GAAG,OAAO,MAAM,IAAI,OAAO,IAAI;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,UAAU,GAAG,OAAO,MAAM,IAAI,OAAO,IAAI;AAAA,MACzC,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,MAAO,OAAO,QAAQ;AAAA,MACtB,KAAK;AAAA,IACP;AAAA,EACF;AACF;;;ACjNO,SAAS,SAAS,OAAyC;AAChE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,KACoB;AACpB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,gBAAgB,cAAc,GAAG,qBAAqB;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,KACoB;AACpB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,GAAG;AACpD,UAAM,IAAI,gBAAgB,cAAc,GAAG,qBAAqB;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,YACd,MACA,KACqB;AACrB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,IAAI,gBAAgB,cAAc,GAAG,sBAAsB;AAAA,EACnE;AACA,SAAO;AACT;AAEO,SAAS,gBACd,MACA,KACsB;AACtB,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC3E,UAAM,IAAI,gBAAgB,cAAc,GAAG,gCAAgC;AAAA,EAC7E;AACA,SAAO;AACT;AAEO,SAAS,gBACd,MACA,KACuC;AACvC,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MACE,CAAC,MAAM,QAAQ,KAAK,KACpB,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,CAAC,GAC7E;AACA,UAAM,IAAI,gBAAgB,cAAc,GAAG,gCAAgC;AAAA,EAC7E;AACA,SAAO;AACT;AAEO,SAAS,cACd,MACA,KACQ;AACR,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,UAAM,IAAI,gBAAgB,+BAA+B,GAAG,IAAI;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,mBACd,MACA,KAC2B;AAC3B,QAAM,QAAQ,gBAAgB,MAAM,GAAG;AACvC,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,UAAM,IAAI,gBAAgB,qCAAqC,GAAG,IAAI;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,YACd,MACA,MACA,SACM;AACN,QAAM,SAAS,KAAK,KAAK,CAAC,QAAQ,KAAK,GAAG,MAAM,UAAa,KAAK,GAAG,MAAM,IAAI;AAC/E,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,OAAO;AAAA,EACnC;AACF;AAEO,SAAS,WACd,OACA,KACA,QACM;AACN,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,cAAc,GAAG,qBAAqB,OAAO,KAAK,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEO,SAAS,cACd,QACyB;AACzB,QAAM,OAAgC,CAAC;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;;;AC1IO,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,KAAa,MAAM,IAAqB;AACtE,SAAO;AAAA,IACL,KAAK,UAAU,GAAG;AAAA,IAClB,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,iBAAiB,KAAa,MAAM,IAAqB;AACvE,SAAO;AAAA,IACL,KAAK,WAAW,GAAG;AAAA,IACnB,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AACF;;;ACtBA,IAAM,iBAAkD;AAAA,EACtD,UAAU,CAAC,6BAA6B,kCAAkC;AAAA,EAC1E,UAAU,CAAC,6BAA6B,kCAAkC;AAAA,EAC1E,WAAW,CAAC,wBAAwB;AAAA,EACpC,QAAQ,CAAC,qBAAqB;AAChC;AAEA,IAAM,oBAA4D,CAAC;AACnE,IAAI,iBAAuC;AAEpC,SAAS,0BAAgD;AAC9D,SAAO;AACT;AAEA,eAAsB,qBAAqB,SAAqD;AAC9F,MAAI,mBAAmB,WAAW;AAChC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,oBAAoB,OAAO;AAAA,EACnC,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO,iBAAiB,kBAAkB,MAAM,SAAS;AAC3D;AAEA,SAAS,qBAAqB,WAA0C;AACtE,SAAO,IAAI;AAAA,IACT,uBAAuB,SAAS;AAAA,IAChC;AAAA,MACE,MAAM;AAAA,MACN,YACE;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,WAAoC;AAC9D,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC,GAAG,eAAe,SAAS,CAAC;AAAA,EACtC;AACA,SAAO,CAAC,QAAQ,GAAG,eAAe,SAAS,EAAE,OAAO,CAAC,SAAS,SAAS,MAAM,CAAC;AAChF;AAEA,eAAe,YACb,SACA,WACA,OACA,cACwB;AACxB,aAAW,QAAQ,mBAAmB,SAAS,GAAG;AAChD,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,QACpC;AAAA,QACA;AAAA,QACA,iBAAiB,cAAc,EAAE;AAAA,MACnC;AACA,wBAAkB,SAAS,IAAI;AAC/B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,qBAAqB,SAAS;AACtC;AAEA,eAAe,aACb,SACA,WACA,MACA,cACwB;AACxB,aAAW,QAAQ,mBAAmB,SAAS,GAAG;AAChD,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,QACpC;AAAA,QACA;AAAA,QACA,iBAAiB,cAAc,CAAC;AAAA,MAClC;AACA,wBAAkB,SAAS,IAAI;AAC/B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,WAAW,KAAK,GAAG;AACrB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,QAAM,qBAAqB,SAAS;AACtC;AAEA,eAAe,oBAAoB,SAAqC;AACtE,MAAI,mBAAmB,aAAa;AAClC;AAAA,EACF;AACA,MAAI,mBAAmB,eAAe;AACpC,UAAM,qBAAqB,UAAU;AAAA,EACvC;AACA,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,MACR,CAAC;AAAA,MACD;AAAA,IACF;AACA,qBAAiB;AAAA,EACnB,SAAS,OAAO;AACd,QAAI,iBAAiB,kBAAkB,MAAM,SAAS,oBAAoB;AACxE,uBAAiB;AAAA,IACnB;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,UAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,oBAAgC;AAC9C,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,aAAa,EAAE,MAAM,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,oBAAoB,OAAO;AACjC,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,aAAa,WAAW,MAAM,aAAa;AAAA,UAC7C,CAAC;AAAA,UACD;AAAA,QACF;AACA,eAAO,UAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,aAAa,QAAQ,EAAE;AAAA,UACxD,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,MAAM,EAAE,MAAM,SAAS;AAAA,QACzB;AAAA,QACA,UAAU,CAAC,UAAU,aAAa,UAAU,MAAM;AAAA,MACpD;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,QAAQ,UAAU,CAAC,aAAa,QAAQ,CAAC;AACpD,cAAM,oBAAoB,OAAO;AACjC,cAAM,YAAY,WAAW,cAAc,cAAc;AACzD,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,YACE,WAAW,cAAc,MAAM,WAAW;AAAA,YAC1C,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,MAAM,cAAc,MAAM,MAAM;AAAA,UAClC;AAAA,UACA;AAAA,QACF;AACA,eAAO,UAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,WAAW,EAAE,MAAM,SAAS;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,oBAAoB,OAAO;AACjC,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,WAAW,WAAW,MAAM,WAAW;AAAA,UACzC,CAAC;AAAA,UACD;AAAA,QACF;AACA,eAAO,UAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC1OA,SAAS,kBAAkB,aAA6B;AAEtD,SAAO,gBAAgB,YAAY,QAAQ;AAC7C;AAEA,SAASA,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,uBAAmC;AACjD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,QAAQ,WAAW,WAAW,KAAK;AAAA,YAC1C,aAAa;AAAA,UACf;AAAA,UACA,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,UAC7D,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,aAAa;AAAA,YACvB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,WAAW,MAAM,aAAa,KAAK;AACvD,mBAAW,aAAa,eAAe,CAAC,QAAQ,WAAW,WAAW,KAAK,CAAC;AAC5E,cAAM,OAAO,WAAW,MAAM,MAAM;AACpC,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,YAAI,aAAa;AACf,qBAAW,aAAa,eAAe,aAAa;AAAA,QACtD;AACA,cAAM,QACJ,gBAAgB,SACZ,gCACA,gBAAgB,YACd,iCACA,gBAAgB,YACd,mCACA;AACV,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,MAAM,YAAY,CAAC;AAAA,UACnC,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,SAAS,EAAE;AAAA,UACzD,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,WAAW,MAAM,aAAa,KAAK;AACvD,mBAAW,aAAa,eAAe,CAAC,QAAQ,SAAS,CAAC;AAC1D,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,YAAI,aAAa;AACf,qBAAW,aAAa,eAAe,aAAa;AAAA,QACtD;AACA,cAAM,QACJ,gBAAgB,YACZ,6BACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B;AAAA,YACA,cAAc,WAAW,MAAM,cAAc;AAAA,YAC7C,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,iBAAiB,EAAE,MAAM,SAAS;AAAA,UAClC,eAAe,EAAE,MAAM,SAAS;AAAA,UAChC,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,eAAe,EAAE,MAAM,SAAS;AAAA,UAChC,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,WAAW,EAAE,MAAM,SAAS;AAAA,QAC9B;AAAA,QACA,UAAU,CAAC,mBAAmB,iBAAiB,QAAQ,QAAQ;AAAA,MACjE;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,gBAAgB,WAAW,MAAM,eAAe;AACtD,cAAM,OAAO,gBACT,4CACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,UAAU,kBAAkB,cAAc,MAAM,iBAAiB,CAAC;AAAA,YAClE,QAAQ,kBAAkB,cAAc,MAAM,eAAe,CAAC;AAAA,YAC9D,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC;AAAA,UACF,CAAC;AAAA,UACD,iBAAiB,YAAY,EAAE;AAAA,QACjC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,cAAc,EAAE,MAAM,UAAU,MAAM,CAAC,YAAY,mBAAmB,EAAE;AAAA,UACxE,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,KAAK,EAAE,MAAM,SAAS;AAAA,UACtB,WAAW,EAAE,MAAM,SAAS;AAAA,QAC9B;AAAA,QACA,UAAU,CAAC,QAAQ,gBAAgB,WAAW,QAAQ;AAAA,MACxD;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,eAAe,cAAc,MAAM,cAAc;AACvD,mBAAW,cAAc,gBAAgB,CAAC,YAAY,mBAAmB,CAAC;AAC1E,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC;AAAA,YACA,SAAS,cAAc,MAAM,SAAS;AAAA,YACtC,OAAO,WAAW,MAAM,OAAO;AAAA,YAC/B,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,KAAK,WAAW,MAAM,KAAK;AAAA,YAC3B,WAAW,WAAW,MAAM,WAAW;AAAA,UACzC,CAAC;AAAA,UACD,iBAAiB,YAAY,CAAC;AAAA,QAChC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,QACjE;AAAA,QACA,UAAU,CAAC,SAAS;AAAA,MACtB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,EAAE,SAAS,cAAc,MAAM,SAAS,EAAE;AAAA,UAC1C,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,MAAM;AAAA,MACnB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,uBAAuB,EAAE;AAAA,QAC5C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY;AAAA,YACV,MAAM;AAAA,YACN,MAAM,CAAC,WAAW,cAAc,UAAU;AAAA,UAC5C;AAAA,UACA,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B;AAAA,QACA,UAAU,CAAC,YAAY;AAAA,MACzB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,CAAC,WAAW,cAAc,UAAU,CAAC;AAC1E,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,mBAAmB,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,GAAI;AAC9D,cAAM,iBAAiB,OAAO,GAAG;AACjC,cAAM,OACJ,eAAe,YACX,wCACA,eAAe,eACb,2CACA;AACR,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,WACE,eAAe,aAAa,eAAe,aACtC,aAAa,mBACd;AAAA,YACN,SACE,eAAe,aAAa,eAAe,aACtC,WAAW,iBACZ;AAAA,YACN,OAAO,WAAW,MAAM,OAAO;AAAA,YAC/B,SAAS,WAAW,MAAM,SAAS;AAAA,UACrC,CAAC;AAAA,UACD,iBAAiB,2BAA2B,EAAE;AAAA,QAChD;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,UACA,gBAAgB,EAAE,MAAM,SAAS;AAAA,UACjC,eAAe,EAAE,MAAM,SAAS;AAAA,UAChC,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,mBAAmB,EAAE,MAAM,SAAS;AAAA,UACpC,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,kBAAkB,EAAE,MAAM,SAAS;AAAA,QACrC;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,QAAQ,UAAU;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,cAAc;AAAA,UAC3B,gBAAgB,WAAW,MAAM,gBAAgB;AAAA,UACjD,eAAe,WAAW,MAAM,eAAe;AAAA,UAC/C,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,mBAAmB,WAAW,MAAM,mBAAmB;AAAA,UACvD,UAAU,WAAW,MAAM,UAAU;AAAA,UACrC,kBAAkB,WAAW,MAAM,kBAAkB;AAAA,QACvD,CAAC;AAED,YAAI,WAAW,QAAQ;AACrB,gBAAMC,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACA;AAAA,YACA,iBAAiB,sBAAsB,CAAC;AAAA,UAC1C;AACA,iBAAOD,WAAUC,SAAQ;AAAA,QAC3B;AAEA,YAAI,WAAW,eAAe;AAC5B,gBAAMA,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACA;AAAA,YACA,iBAAiB,sBAAsB,CAAC;AAAA,UAC1C;AACA,iBAAOD,WAAUC,SAAQ;AAAA,QAC3B;AAEA,cAAM,WACJ,WAAW,WACP,2CACA,WAAW,WACT,2CACA,WAAW,iBACT,kDACA;AACV,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,sBAAsB,CAAC;AAAA,QAC1C;AACA,eAAOD,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC7XA,SAASE,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,sBAAkC;AAChD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,MACf;AAAA,MACA,SAAS,OAAO,UAAU,YAAY;AACpC,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,mBAAmB,EAAE;AAAA,QACxC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,UAAU,MAAM,EAAE;AAAA,UAC7D,eAAe,EAAE,MAAM,SAAS;AAAA,UAChC,gBAAgB,EAAE,MAAM,SAAS;AAAA,UACjC,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,QAAQ,UAAU,CAAC,UAAU,UAAU,MAAM,CAAC;AACzD,cAAM,UAAU,cAAc;AAAA,UAC5B,eAAe,WAAW,MAAM,eAAe;AAAA,UAC/C,gBAAgB,WAAW,MAAM,gBAAgB;AAAA,UACjD,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,OAAO,WAAW,MAAM,OAAO;AAAA,QACjC,CAAC;AACD,YAAI,WAAW,QAAQ;AACrB,gBAAMC,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACA;AAAA,YACA,iBAAiB,6BAA6B,CAAC;AAAA,UACjD;AACA,iBAAOD,WAAUC,SAAQ;AAAA,QAC3B;AACA,cAAM,WACJ,WAAW,WACP,6CACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,6BAA6B,CAAC;AAAA,QACjD;AACA,eAAOD,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,UAAU,MAAM,EAAE;AAAA,UAC7D,eAAe,EAAE,MAAM,SAAS;AAAA,UAChC,mBAAmB,EAAE,MAAM,SAAS;AAAA,UACpC,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,kBAAkB,EAAE,MAAM,SAAS;AAAA,QACrC;AAAA,QACA,UAAU,CAAC,UAAU,eAAe;AAAA,MACtC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,gBAAgB,cAAc,MAAM,eAAe;AACzD,mBAAW,QAAQ,UAAU,CAAC,UAAU,UAAU,MAAM,CAAC;AACzD,cAAM,UAAU,cAAc;AAAA,UAC5B;AAAA,UACA,mBAAmB,WAAW,MAAM,mBAAmB;AAAA,UACvD,UAAU,WAAW,MAAM,UAAU;AAAA,UACrC,kBAAkB,WAAW,MAAM,kBAAkB;AAAA,QACvD,CAAC;AACD,YAAI,WAAW,QAAQ;AACrB,gBAAMC,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACA;AAAA,YACA,iBAAiB,yBAAyB,CAAC;AAAA,UAC7C;AACA,iBAAOD,WAAUC,SAAQ;AAAA,QAC3B;AACA,cAAM,WACJ,WAAW,WACP,oDACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,yBAAyB,CAAC;AAAA,QAC7C;AACA,eAAOD,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC9HA,SAASE,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,uBAAmC;AACjD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,gBAAgB,EAAE,MAAM,SAAS;AAAA,UACjC,cAAc,EAAE,MAAM,SAAS;AAAA,QACjC;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,WAAW,MAAM,UAAU;AAC5C,cAAM,OAAO,WACT,iCACA;AACJ,cAAM,eAAe,WAAW,MAAM,gBAAgB;AACtD,cAAM,aAAa,WAAW,MAAM,cAAc;AAClD,YAAI,YAAY,cAAc,cAAc;AAC1C,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,KAAK,EAAE;AAAA,UAChD,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,gBAAgB,EAAE,MAAM,SAAS;AAAA,UACjC,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACvD;AAAA,QACA,UAAU,CAAC,YAAY,QAAQ;AAAA,MACjC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,OAAO,WAAW,MAAM,MAAM,KAAK;AACzC,mBAAW,MAAM,QAAQ,CAAC,UAAU,KAAK,CAAC;AAC1C,cAAM,OACJ,SAAS,QACL,gCACA;AAEN,YAAI,SAAS,OAAO;AAClB,gBAAMC,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACA,cAAc;AAAA,cACZ,UAAU,gBAAgB,MAAM,UAAU;AAAA,cAC1C,SAAS,WAAW,MAAM,SAAS,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,YAC3D,CAAC;AAAA,YACD,iBAAiB,mBAAmB,CAAC;AAAA,UACvC;AACA,iBAAOD,WAAUC,SAAQ;AAAA,QAC3B;AAEA;AAAA,UACE;AAAA,UACA,CAAC,kBAAkB,cAAc;AAAA,UACjC;AAAA,QACF;AACA,cAAM,WAAW,cAAc,MAAM,UAAU;AAC/C,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,eAAe,WAAW,MAAM,gBAAgB;AACtD,cAAM,aAAa,WAAW,MAAM,cAAc;AAClD,YAAI,gBAAgB,YAAY;AAC9B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,QAAQ,OAAO;AAAA,UAQlC;AAAA,UACA,cAAc,EAAE,UAAU,QAAQ,cAAc,WAAW,CAAC;AAAA,UAC5D,iBAAiB,yBAAyB,EAAE;AAAA,QAC9C;AACA,cAAM,YAAY,OAAO;AACzB,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,UAAU,UAAU;AAAA,YACpB,QAAQ,UAAU;AAAA,YAClB,cAAc,UAAU;AAAA,YACxB,YAAY,UAAU;AAAA,YACtB,WAAW,UAAU;AAAA,YACrB,SAAS,UAAU;AAAA,UACrB,CAAC;AAAA,UACD,iBAAiB,mBAAmB,CAAC;AAAA,QACvC;AACA,eAAOD,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,KAAK,EAAE;AAAA,UAChD,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,OAAO,WAAW,MAAM,MAAM,KAAK;AACzC,mBAAW,MAAM,QAAQ,CAAC,UAAU,KAAK,CAAC;AAC1C,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,mBAAmB,OAAO,MAAM,IAAI,KAAK,KAAK,KAAK,GAAI;AAC7D,cAAM,iBAAiB,OAAO,GAAG;AACjC,cAAM,OACJ,SAAS,QACL,wCACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,WACE,SAAS,WACJ,WAAW,MAAM,WAAW,KAAK,mBAClC,WAAW,MAAM,WAAW;AAAA,YAClC,SACE,SAAS,WACJ,WAAW,MAAM,SAAS,KAAK,iBAChC,WAAW,MAAM,SAAS;AAAA,YAChC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,uBAAuB,EAAE;AAAA,QAC5C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACxLA,IAAM,qBAAqB,CAAC,GAAG,eAAe,MAAM;AAEpD,SAASE,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEA,SAAS,OAAO,aAA8B;AAC5C,SAAO,gBAAgB;AACzB;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,MAA0C;AACnE,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AACA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,CAAC,QAAQ,QAAQ,cAAc,cAAc,MAAM;AAChE,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,OAAO,QAAQ;AAAA,IAC9B;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,YAAM,SAAS,kBAAkB,KAAK;AACtC,UAAI,OAAO,SAAS,GAAG;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAsC;AACzD,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC;AAC9D;AAEA,SAAS,gBACP,KACA,aACoB;AACpB,QAAM,SAAS,OAAO,WAAW,IAC7B,CAAC,gBAAgB,YAAY,OAAO,QAAQ,IAC5C,CAAC,YAAY,gBAAgB,OAAO,QAAQ;AAChD,aAAW,OAAO,QAAQ;AACxB,UAAM,QAAQ,IAAI,GAAG;AACrB,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AACjD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,MACA,aACA,iBAC2D;AAC3D,QAAM,aAAa,KAChB,IAAI,CAAC,SAAS;AAAA,IACb,UAAU,gBAAgB,KAAK,WAAW;AAAA,IAC1C;AAAA,IACA,OAAO,YAAY,GAAG;AAAA,EACxB,EAAE,EACD;AAAA,IACC,CACE,SAKG,QAAQ,KAAK,QAAQ;AAAA,EAC5B;AACF,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,oBAAoB,UAAU;AAChC,eAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;AAAA,EACrF;AACA,QAAM,OAAO,WAAW,CAAC;AACzB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,KAAK,KAAK;AAAA,EACZ;AACF;AAEO,SAAS,2BAAuC;AACrD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,kBAAkB;AAAA,YAC5B,aAAa;AAAA,UACf;AAAA,UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,UAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,QACjE;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,WAAW,MAAM,aAAa,KAAK;AACvD,mBAAW,aAAa,eAAe,kBAAkB;AACzD,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,OAAO,OAAO,WAAW,IAC3B,6CACA;AACJ,cAAM,QAAQ,OAAO,WAAW,IAC5B,cAAc,EAAE,QAAQ,MAAM,CAAC,IAC/B,cAAc,EAAE,aAAa,QAAQ,MAAM,CAAC;AAChD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,oBAAoB,EAAE;AAAA,QACzC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,kBAAkB,EAAE;AAAA,UAC7D,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aACE;AAAA,UACJ;AAAA,UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,UACjF,cAAc;AAAA,YACZ,MAAM;AAAA,YACN,MAAM,CAAC,YAAY,UAAU;AAAA,YAC7B,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,OAAO;AAAA,YACxB,aAAa;AAAA,UACf;AAAA,UACA,YAAY;AAAA,YACV,MAAM;AAAA,YACN,MAAM,CAAC,SAAS,UAAU;AAAA,YAC1B,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,aACE;AAAA,UACJ;AAAA,UACA,iBAAiB;AAAA,YACf,MAAM;AAAA,YACN,MAAM,CAAC,eAAe,QAAQ;AAAA,YAC9B,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aACE;AAAA,UACJ;AAAA,QACF;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,WAAW,MAAM,aAAa,KAAK;AACvD,mBAAW,aAAa,eAAe,kBAAkB;AACzD,cAAM,oBAAoB,WAAW,MAAM,UAAU;AACrD,cAAM,mBACJ,YAAY,MAAM,kBAAkB,KAAK,CAAC;AAC5C,cAAM,kBAAkB,WAAW,MAAM,iBAAiB,KAAK;AAC/D,mBAAW,iBAAiB,mBAAmB,CAAC,eAAe,QAAQ,CAAC;AACxE,cAAM,SAAS,YAAY,MAAM,QAAQ,KAAK;AAE9C,YAAI,mBAAmB;AACvB,YAAI,iBAAiD;AACrD,YAAI,iBAAiB;AAErB,YAAI,CAAC,oBAAoB,kBAAkB;AACzC,gBAAM,cAAc,OAAO,WAAW,IAClC,6CACA;AACJ,gBAAM,kBAAkB,MAAM,QAAQ,OAAO;AAAA,YAC3C;AAAA,YACA,OAAO,WAAW,IACd,cAAc;AAAA,cACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,cACjC,OAAO;AAAA,YACT,CAAC,IACD,cAAc;AAAA,cACZ;AAAA,cACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,cACjC,OAAO;AAAA,YACT,CAAC;AAAA,YACL,iBAAiB,2BAA2B,EAAE;AAAA,UAChD;AACA,gBAAM,OAAO,kBAAkB,gBAAgB,IAAI;AACnD,2BAAiB,KAAK;AACtB,gBAAM,SAAS,aAAa,MAAM,aAAa,eAAe;AAC9D,cAAI,CAAC,QAAQ;AACX,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,YACE;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AACA,6BAAmB,OAAO;AAC1B,2BAAiB,OAAO;AAAA,QAC1B;AAEA,YAAI,CAAC,kBAAkB;AACrB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,OAAO,WAAW,GAAG;AACvB,gBAAMC,WAAU,cAAc;AAAA,YAC5B,cAAc;AAAA,YACd,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACnC,CAAC;AACD,cAAI,QAAQ;AACV,mBAAO;AAAA,cACL,UAAU;AAAA,cACV,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,cACpC,MAAM;AAAA,gBACJ,QAAQ;AAAA,gBACR,SAAAA;AAAA,gBACA,mBAAmB,qBAAqB;AAAA,gBACxC;AAAA,gBACA,cAAc,CAAC;AAAA,gBACf;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,gBAAMC,YAAW,MAAM,QAAQ,OAAO;AAAA,YACpC;AAAA,YACAD;AAAA,YACA,iBAAiB,oBAAoB,EAAE;AAAA,UACzC;AACA,iBAAO;AAAA,YACL,GAAGD,WAAUE,SAAQ;AAAA,YACrB,WAAW;AAAA,cACT,mBAAmB,qBAAqB;AAAA,cACxC;AAAA,cACA,cAAc,CAAC;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd,UAAU;AAAA,UACV;AAAA,UACA,UAAU;AAAA,YACR,cAAc;AAAA,cACZ,UAAU;AAAA,cACV;AAAA,cACA,WAAW,WAAW,MAAM,cAAc,KAAK;AAAA,cAC/C,WAAW,WAAW,MAAM,WAAW,KAAK;AAAA,cAC5C,YAAY,WAAW,MAAM,YAAY,KAAK;AAAA,cAC9C,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAAA,cACtC,OAAO,WAAW,MAAM,OAAO;AAAA,YACjC,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,QAAQ;AACV,iBAAO;AAAA,YACL,UAAU;AAAA,YACV,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,YACpC,MAAM;AAAA,cACJ,QAAQ;AAAA,cACR;AAAA,cACA,mBAAmB,qBAAqB;AAAA,cACxC;AAAA,cACA,cAAc,CAAC;AAAA,cACf;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,oBAAoB,EAAE;AAAA,QACzC;AACA,eAAO;AAAA,UACL,GAAGF,WAAU,QAAQ;AAAA,UACrB,WAAW;AAAA,YACT,mBAAmB,qBAAqB;AAAA,YACxC;AAAA,YACA,cAAc,CAAC;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,YAAY,EAAE,MAAM,SAAS;AAAA,UAC7B,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,UAAU,EAAE;AAAA,UAC1D,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,EAAE;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,YAAY,WAAW,MAAM,UAAU;AAAA,YACvC,YAAY,WAAW,MAAM,YAAY;AAAA,YACzC,YAAY,WAAW,MAAM,YAAY;AAAA,YACzC,UAAU,WAAW,MAAM,UAAU;AAAA,UACvC,CAAC;AAAA,UACD,iBAAiB,uBAAuB,EAAE;AAAA,QAC5C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,kBAAkB,EAAE;AAAA,UAC7D,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,QACxE;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,mBAAW,aAAa,eAAe,kBAAkB;AACzD,cAAM,OAAO,OAAO,WAAW,IAC3B,oDACA;AACJ,cAAM,QAAQ,OAAO,WAAW,IAC5B,cAAc;AAAA,UACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,WAAW,WAAW,MAAM,WAAW;AAAA,UACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACnC,OAAO,WAAW,MAAM,OAAO;AAAA,QACjC,CAAC,IACD,cAAc;AAAA,UACZ;AAAA,UACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,WAAW,WAAW,MAAM,WAAW;AAAA,UACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UAC/B,UAAU,WAAW,MAAM,UAAU;AAAA,QACvC,CAAC;AACL,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,mBAAmB,EAAE;AAAA,QACxC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,kBAAkB,EAAE;AAAA,UAC7D,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,UAAU;AAAA,UAC3B,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,EAAE,MAAM,SAAS;AAAA,QAC7B;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,mBAAW,aAAa,eAAe,kBAAkB;AACzD,cAAM,OAAO,OAAO,WAAW,IAC3B,UACE,oDACA,oDACF,UACE,mDACA;AACN,cAAM,QAAQ,OAAO,WAAW,IAC5B,cAAc;AAAA,UACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,WAAW,WAAW,MAAM,WAAW;AAAA,UACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACnC,OAAO,WAAW,MAAM,OAAO;AAAA,QACjC,CAAC,IACD,cAAc;AAAA,UACZ;AAAA,UACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACjC,WAAW,WAAW,MAAM,WAAW;AAAA,UACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UAC/B,UAAU,WAAW,MAAM,UAAU;AAAA,QACvC,CAAC;AACL,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACtgBA,IAAM,0BAAkD;AAAA,EACtD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR;AAEA,SAASG,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,6BAAyC;AACvD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,aAAa;AAAA,YACvB,aAAa;AAAA,UACf;AAAA,UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QAC1E;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,OAAO,SACT,8BACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,aAAa,OAAO,CAAC;AAAA,UACrC,gBAAgB,sBAAsB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,UAC1D,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,UACnE,WAAW,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,QACrE;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA,OAAO,WAAW,MAAM,OAAO;AAAA,YAC/B,WAAW,WAAW,MAAM,WAAW;AAAA,UACzC,CAAC;AAAA,UACD,gBAAgB,qBAAqB,EAAE;AAAA,QACzC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,WAAW;AAAA,YACT,MAAM;AAAA,YACN,MAAM,CAAC,SAAS,SAAS,MAAM;AAAA,YAC/B,aAAa;AAAA,UACf;AAAA,UACA,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,eAAe,UAAU,aAAa;AAAA,MACnD;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,YAAY,WAAW,MAAM,WAAW,KAAK;AACnD,mBAAW,aAAa,eAAe,aAAa;AACpD,mBAAW,aAAa,eAAe,aAAa;AACpD,mBAAW,WAAW,aAAa,CAAC,SAAS,SAAS,MAAM,CAAC;AAC7D,cAAM,iBAAiB,wBAAwB,WAAW,KAAK;AAC/D,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,OACJ,cAAc,UACV,6CACA,cAAc,SACZ,4CACA,YACE,uCACA;AACV,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,gBAAgB,uBAAuB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,OAAO,YACT,qCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA,OAAO,WAAW,MAAM,OAAO;AAAA,YAC/B;AAAA,YACA,SAAS,WAAW,MAAM,SAAS;AAAA,UACrC,CAAC;AAAA,UACD,gBAAgB,sBAAsB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,QACnE;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACnC,CAAC;AAAA,UACD,gBAAgB,yBAAyB,EAAE;AAAA,QAC7C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,WAAW,aAAa,qCAAqC;AAAA,UAC9E,UAAU,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACvE,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACzE;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,YAAI,SAAS;AACX,gBAAM,kBAAkB,MAAM,QAAQ,OAAO;AAAA,YAC3C;AAAA,YACA,cAAc;AAAA,cACZ;AAAA,cACA;AAAA,cACA,UAAU,WAAW,MAAM,UAAU;AAAA,cACrC,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACnC,CAAC;AAAA,YACD,gBAAgB,4BAA4B,EAAE;AAAA,UAChD;AACA,iBAAOA,WAAU,eAAe;AAAA,QAClC;AAEA,cAAM,CAAC,aAAa,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,UACnD,QAAQ,OAAO;AAAA,YACb;AAAA,YACA,cAAc,EAAE,aAAa,OAAO,CAAC;AAAA,YACrC,gBAAgB,oCAAoC,EAAE;AAAA,UACxD;AAAA,UACA,QAAQ,OAAO;AAAA,YACb;AAAA,YACA,cAAc,EAAE,aAAa,OAAO,CAAC;AAAA,YACrC,gBAAgB,iCAAiC,EAAE;AAAA,UACrD;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,UAAU,GAAG,YAAY,QAAQ,MAAM,YAAY,QAAQ;AAAA,UAC3D,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,MAAM;AAAA,YACJ,iBAAiB,YAAY;AAAA,YAC7B,aAAa,YAAY;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,QAC3B;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,aAAa,OAAO,CAAC;AAAA,UACrC,gBAAgB,6BAA6B,EAAE;AAAA,QACjD;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACpTA,SAASC,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,4BAAwC;AACtD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,QACF;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,mBAAmB,MAAM,QAAQ;AAChD,YAAI,OAAO,SAAS,IAAI;AACtB,gBAAM,IAAI,gBAAgB,mCAAmC;AAAA,QAC/D;AACA,cAAM,mBAAmB,OAAO,IAAI,CAAC,UAAU;AAC7C,gBAAM,YAAY,WAAW,OAAO,WAAW;AAC/C,iBAAO,cAAc;AAAA,YACnB,GAAG;AAAA,YACH,YAAY,WAAW,OAAO,YAAY,KAAK;AAAA,YAC/C,OACE,WAAW,OAAO,OAAO,MACxB,cAAc,UAAU,QAAQ;AAAA,UACrC,CAAC;AAAA,QACH,CAAC;AACD,cAAM,WAAW,OAAO,WAAW;AACnC,cAAM,OAAO,WACT,kCACA;AACJ,cAAM,QAAQ,iBAAiB,GAAG,CAAC;AACnC,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,gBAAgB,yBAAyB;AAAA,QACrD;AACA,YAAI;AACJ,YAAI,UAAU;AACZ,iBAAO;AAAA,QACT,OAAO;AACL,gBAAM,SAAS;AAAA,YACb,QAAQ,WAAW,OAAO,QAAQ;AAAA,YAClC,aAAa,WAAW,OAAO,aAAa;AAAA,YAC5C,YAAY,WAAW,OAAO,YAAY;AAAA,YAC1C,YAAY,WAAW,OAAO,YAAY,KAAK;AAAA,UACjD;AACA,gBAAM,YAAY,iBAAiB;AAAA,YACjC,CAAC,UACC,WAAW,OAAO,QAAQ,MAAM,OAAO,UACvC,WAAW,OAAO,aAAa,MAAM,OAAO,eAC5C,WAAW,OAAO,YAAY,MAAM,OAAO,eAC1C,WAAW,OAAO,YAAY,KAAK,eAClC,OAAO;AAAA,UACb;AACA,cAAI,CAAC,WAAW;AACd,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,iBAAO;AAAA,YACL,QAAQ,OAAO;AAAA,YACf,aAAa,OAAO;AAAA,YACpB,YAAY,OAAO;AAAA,YACnB,YAAY,OAAO;AAAA,YACnB,WAAW,iBAAiB,IAAI,CAAC,UAAU;AACzC,oBAAM,EAAE,QAAQ,aAAa,YAAY,YAAY,GAAG,KAAK,IAAI;AACjE,mBAAK;AACL,mBAAK;AACL,mBAAK;AACL,mBAAK;AACL,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,uBAAuB,EAAE;AAAA,QAC5C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,UACrD,WAAW,EAAE,MAAM,UAAU;AAAA,UAC7B,YAAY,EAAE,MAAM,SAAS;AAAA,QAC/B;AAAA,QACA,UAAU,CAAC,eAAe,QAAQ;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,cAAM,YAAY,YAAY,MAAM,WAAW;AAC/C,cAAM,aAAa,WAAW,MAAM,YAAY;AAChD,mBAAW,aAAa,eAAe,aAAa;AACpD;AAAA,UACE;AAAA,UACA,CAAC,WAAW,YAAY,WAAW;AAAA,UACnC;AAAA,QACF;AACA,YAAI,YAAY,SAAS,SAAS,IAAI;AACpC,gBAAM,IAAI,gBAAgB,qCAAqC;AAAA,QACjE;AACA,cAAM,EAAE,MAAM,KAAK,IAAI,UACnB;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,QACvC,IACA,WACE;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,aAAa,QAAQ,SAAS;AAAA,QACxC,IACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM,cAAc,EAAE,aAAa,QAAQ,WAAW,CAAC;AAAA,QACzD;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,yBAAyB,EAAE;AAAA,QAC9C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,SAAS,EAAE;AAAA,UACpD,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,OAAO,UACT,6BACA,WAAW,YACT,qCACA;AACN,cAAM,QAAQ,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,WAAW,MAAM,WAAW;AAAA,UACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACnC,OAAO,WAAW,MAAM,OAAO;AAAA,QACjC,CAAC;AACD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,OAAO,YACT,mCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC;AAAA,YACA,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,YAAY,EAAE,MAAM,SAAS;AAAA,UAC7B,SAAS,EAAE,MAAM,UAAU;AAAA,QAC7B;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,UAAU,YAAY,MAAM,SAAS,KAAK;AAChD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,OAAO,UACT,0CACA,SACE,yCACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA,YACE,WAAW,MAAM,YAAY,MAAM,SAAS,SAAS;AAAA,UACzD,CAAC;AAAA,UACD,iBAAiB,yBAAyB,EAAE;AAAA,QAC9C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,YAAY,EAAE,MAAM,SAAS;AAAA,UAC7B,UAAU,EAAE,MAAM,SAAS;AAAA,UAC3B,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,EAAE;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,eAAe,UAAU,cAAc,UAAU;AAAA,MAC9D;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,YAAY,cAAc,MAAM,YAAY;AAAA,YAC5C,UAAU,cAAc,MAAM,UAAU;AAAA,YACxC,UAAU,WAAW,MAAM,UAAU;AAAA,UACvC,CAAC;AAAA,UACD,iBAAiB,wBAAwB,CAAC;AAAA,QAC5C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,aAAa,EAAE;AAAA,UACxD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,YAAY,EAAE,MAAM,SAAS;AAAA,UAC7B,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,CAAC,cAAc,gBAAgB,YAAY;AAAA,UACnD;AAAA,UACA,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,EAAE;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,eAAe,UAAU,cAAc,WAAW,OAAO;AAAA,MACtE;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,cAAc,cAAc,MAAM,aAAa;AACrD,cAAM,UAAU,cAAc,MAAM,SAAS;AAC7C,mBAAW,aAAa,eAAe,aAAa;AACpD,mBAAW,SAAS,WAAW,CAAC,cAAc,gBAAgB,YAAY,CAAC;AAC3E,cAAM,WACJ,YAAY,eACR,wCACA,YAAY,iBACV,0CACA;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,YAAY,eACR,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,YAAY,cAAc,MAAM,YAAY;AAAA,YAC5C,YAAY,cAAc,MAAM,OAAO;AAAA,UACzC,CAAC,IACD,YAAY,iBACV,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,YAAY,cAAc,MAAM,YAAY;AAAA,YAC5C,SAAS,cAAc,MAAM,OAAO;AAAA,UACtC,CAAC,IACD,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,YAAY,cAAc,MAAM,YAAY;AAAA,YAC5C,YAAY,cAAc,MAAM,OAAO;AAAA,YACvC,UAAU,WAAW,MAAM,UAAU;AAAA,UACvC,CAAC;AAAA,UACP,iBAAiB,yBAAyB,CAAC;AAAA,QAC7C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACjYA,IAAM,eAAe,CAAC,WAAW,UAAU;AAE3C,SAAS,WAAW,YAAoB,QAAwB;AAC9D,QAAM,QAAQ,eAAe,YAAY,YAAY;AACrD,SAAO,kBAAkB,KAAK,IAAI,MAAM;AAC1C;AAEA,SAASC,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,sBAAkC;AAChD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,MAAM,EAAE,MAAM,SAAS;AAAA,QACzB;AAAA,QACA,UAAU,CAAC,YAAY;AAAA,MACzB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,YAAY;AACjD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC,WAAW,YAAY,gBAAgB;AAAA,UACvC,cAAc;AAAA,YACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC,MAAM,WAAW,MAAM,MAAM;AAAA,UAC/B,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,QAC3B;AAAA,QACA,UAAU,CAAC,cAAc,QAAQ,QAAQ;AAAA,MAC3C;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,YAAY;AACjD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC,WAAW,YAAY,gBAAgB;AAAA,UACvC,cAAc;AAAA,YACZ,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC,cAAc,cAAc,MAAM,QAAQ;AAAA,YAC1C,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACnC,CAAC;AAAA,UACD,iBAAiB,iBAAiB,EAAE;AAAA,QACtC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,YAAY,EAAE,MAAM,UAAU;AAAA,QAChC;AAAA,QACA,UAAU,CAAC,cAAc,MAAM;AAAA,MACjC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,cAAM,aAAa,YAAY,MAAM,YAAY,KAAK;AACtD,mBAAW,YAAY,cAAc,YAAY;AACjD,cAAM,OAAO,aACT,WAAW,YAAY,qBAAqB,IAC5C,WAAW,YAAY,eAAe;AAC1C,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC,aAAa,WAAW,MAAM,QAAQ;AAAA,YACtC,QAAQ,WAAW,MAAM,QAAQ;AAAA,UACnC,CAAC;AAAA,UACD,iBAAiB,gBAAgB,EAAE;AAAA,QACrC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,OAAO,MAAM,EAAE;AAAA,UAC9C,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,QAAQ,EAAE;AAAA,UACvD,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,UAAU;AAAA,YACR,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,YAAY,aAAa,kBAAkB;AAAA,UAC9D;AAAA,QACF;AAAA,QACA,UAAU,CAAC,cAAc,UAAU,QAAQ,aAAa,MAAM;AAAA,MAChE;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,YAAY;AACjD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC,WAAW,YAAY,aAAa;AAAA,UACpC,cAAc;AAAA,YACZ,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,MAAM,cAAc,MAAM,MAAM;AAAA,YAChC,WAAW,cAAc,MAAM,WAAW;AAAA,YAC1C,OAAO,WAAW,MAAM,OAAO;AAAA,YAC/B,UAAU,cAAc,MAAM,MAAM;AAAA,YACpC,UAAU,WAAW,MAAM,UAAU,KAAK;AAAA,YAC1C,OAAO;AAAA,UACT,CAAC;AAAA,UACD,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACvD;AAAA,QACA,UAAU,CAAC,cAAc,QAAQ;AAAA,MACnC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,mBAAW,YAAY,cAAc,YAAY;AACjD;AAAA,UACE;AAAA,UACA,CAAC,WAAW,UAAU;AAAA,UACtB;AAAA,QACF;AACA,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,YAAI,YAAY,SAAS,SAAS,IAAI;AACpC,gBAAM,IAAI,gBAAgB,qCAAqC;AAAA,QACjE;AACA,cAAM,OAAO,UACT,WAAW,YAAY,cAAc,IACrC,WAAW,YAAY,oBAAoB;AAC/C,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,UACI,cAAc,EAAE,QAAQ,QAAQ,CAAC,IACjC;AAAA,YACE;AAAA,YACA,cAAc,YAAY,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,EAAE;AAAA,UAC7D;AAAA,UACJ,iBAAiB,wBAAwB,EAAE;AAAA,QAC7C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,SAAS,EAAE;AAAA,UACpD,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,YAAY;AAAA,MACzB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,YAAY;AACjD,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,OACJ,WAAW,aAAa,UACpB,WAAW,YAAY,gBAAgB,IACvC,WAAW,YAAY,aAAa;AAC1C,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC;AAAA,YACA,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,YAAY,EAAE;AAAA,UACtD,YAAY;AAAA,YACV,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,SAAS,YAAY,aAAa;AAAA,UACrD;AAAA,UACA,MAAM,EAAE,MAAM,SAAS;AAAA,UACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,UAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,UAAU,CAAC,cAAc,YAAY;AAAA,MACvC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,cAAM,aAAa,cAAc,MAAM,YAAY;AACnD,mBAAW,YAAY,cAAc,YAAY;AACjD,mBAAW,YAAY,cAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,gBACJ,eAAe,WACX,WACA,eAAe,UACb,UACA,eAAe,aACb,aACA;AACV,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,mBAAmB,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,GAAI;AAC9D,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC,WAAW,YAAY,mBAAmB;AAAA,UAC1C,cAAc;AAAA,YACZ,YAAY;AAAA,YACZ,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,WAAW,WAAW,MAAM,WAAW,KAAK;AAAA,YAC5C,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC3TA,SAASC,WAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,mBAA+B;AAC7C,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,SAAS;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,aAAa,WAAW,MAAM,YAAY;AAChD,cAAM,OAAO,aACT,6BACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,WAAW,CAAC;AAAA,UAC5B,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,UAAU,gBAAgB;AAAA,YACjC,aAAa;AAAA,UACf;AAAA,UACA,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,WAAW,EAAE,MAAM,SAAS;AAAA,UAC5B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,OAAO,WAAW,MAAM,MAAM,KAAK;AACzC,mBAAW,MAAM,QAAQ,CAAC,UAAU,gBAAgB,CAAC;AACrD,cAAM,OACJ,SAAS,mBACL,wBACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,SAAS,WAAW,MAAM,SAAS;AAAA,UACrC,CAAC;AAAA,UACD,iBAAiB,kBAAkB,EAAE;AAAA,QACvC;AACA,eAAOA,WAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AChFA,SAASC,YAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,0BAAsC;AACpD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,OAAO,CAAC;AAAA,UACxB,gBAAgB,mBAAmB,EAAE;AAAA,QACvC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,UAC3E,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,SAAS,SAAS,SAAS,SAAS,SAAS,OAAO;AAAA,YAC3D,aAAa;AAAA,UACf;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,OAAO,WAAW,MAAM,MAAM,KAAK;AACzC,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,mBAAW,MAAM,QAAQ,CAAC,SAAS,SAAS,SAAS,SAAS,SAAS,OAAO,CAAC;AAC/E,cAAM,OACJ,SAAS,UACL,kCACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrC,gBAAgB,kBAAkB,EAAE;AAAA,QACtC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,UAC3E,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,GAAG,aAAa;AAAA,YACvB,aAAa;AAAA,UACf;AAAA,UACA,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACxE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UACpE,OAAO,EAAE,MAAM,UAAU,aAAa,sCAAsC;AAAA,QAC9E;AAAA,QACA,UAAU,CAAC,UAAU,aAAa;AAAA,MACpC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,cAAc,WAAW,MAAM,aAAa;AAClD,mBAAW,aAAa,eAAe,aAAa;AACpD,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,OAAO,YACT,wCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,QAAQ,aAAa,WAAW,SAAS,MAAM,CAAC;AAAA,UAChE,gBAAgB,oBAAoB,EAAE;AAAA,QACxC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,OAAO,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,UAC3E,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACxE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACtE;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,OAAO,YACT,sCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,QAAQ,OAAO,WAAW,QAAQ,CAAC;AAAA,UACnD,gBAAgB,mBAAmB,EAAE;AAAA,QACvC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,WAAW,OAAO;AAAA,YACzB,aAAa;AAAA,UACf;AAAA,UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,UACjE,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,QAC/D;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,OAAO,WAAW,MAAM,MAAM,KAAK;AACzC,mBAAW,MAAM,QAAQ,CAAC,WAAW,OAAO,CAAC;AAC7C,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,OAAO,WAAW,MAAM,MAAM;AACpC,cAAM,OACJ,SAAS,UACL,8BACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc,EAAE,QAAQ,KAAK,CAAC;AAAA,UAC9B,gBAAgB,oBAAoB,EAAE;AAAA,QACxC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACxLA,SAASC,YAAU,UAIS;AAC1B,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,MAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,yBAAqC;AACnD,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aACE;AAAA,YACF,OAAO;AAAA,cACL,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,mBAAmB,MAAM,QAAQ;AAChD,YAAI,OAAO,SAAS,IAAI;AACtB,gBAAM,IAAI,gBAAgB,mCAAmC;AAAA,QAC/D;AACA,cAAM,mBAAmB,OAAO,IAAI,CAAC,UAAU;AAC7C,gBAAM,YAAY,WAAW,OAAO,WAAW;AAC/C,iBAAO,cAAc;AAAA,YACnB,GAAG;AAAA,YACH,OACE,WAAW,OAAO,OAAO,MACxB,cAAc,UAAU,QAAQ;AAAA,UACrC,CAAC;AAAA,QACH,CAAC;AACD,cAAM,WAAW,OAAO,WAAW;AACnC,cAAM,OAAO,WACT,mCACA;AACJ,cAAM,OAAO,WAAW,iBAAiB,CAAC,IAAI,EAAE,WAAW,iBAAiB;AAC5E,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,oBAAoB,EAAE;AAAA,QACzC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,SAAS,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,UAC3D,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,cAAc,MAAM,QAAQ;AAC3C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,cAAM,YAAY,YAAY,MAAM,WAAW;AAC/C;AAAA,UACE;AAAA,UACA,CAAC,WAAW,YAAY,WAAW;AAAA,UACnC;AAAA,QACF;AACA,YAAI,YAAY,SAAS,SAAS,IAAI;AACpC,gBAAM,IAAI,gBAAgB,qCAAqC;AAAA,QACjE;AACA,cAAM,EAAE,MAAM,KAAK,IAAI,UACnB;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,QAAQ,QAAQ;AAAA,QAC1B,IACA,WACE;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,QAAQ,SAAS;AAAA,QAC3B,IACA,YACE;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,OAAO;AAAA,QACjB,IACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM,EAAE,OAAO;AAAA,QACjB;AACR,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,sBAAsB,EAAE;AAAA,QAC3C;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,UAC7D,UAAU,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,UACtE,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,UAC1D,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,QACtE;AAAA,QACA,UAAU,CAAC,UAAU,SAAS;AAAA,MAChC;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,WAAW,MAAM,UAAU;AAC5C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,eAAe,WAAW,MAAM,cAAc;AACpD,YAAI,CAAC,YAAY,CAAC,WAAW,CAAC,cAAc;AAC1C,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,SAAS,cAAc,MAAM,SAAS;AAAA,YACtC,OAAO;AAAA,YACP,MAAM;AAAA,YACN,WAAW;AAAA,YACX,OAAO;AAAA,UACT,CAAC;AAAA,UACD,iBAAiB,qBAAqB,EAAE;AAAA,QAC1C;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,UAC7D,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,QAAQ,SAAS;AAAA,YACxB,aAAa;AAAA,UACf;AAAA,UACA,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACxE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UACpE,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UAClE,YAAY,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QAClE;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,YAAY,WAAW,MAAM,WAAW;AAC9C,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,cAAM,aAAa,WAAW,MAAM,YAAY;AAChD,cAAM,QAAQ,UACV,iCACA,WAAW,YACT,sCACA;AACN,cAAM,QAAQ,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,mBAAmB,EAAE;AAAA,QACxC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,UAC7D,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACxE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UACpE,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACpE;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,kBAAkB,EAAE;AAAA,QACvC;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,UACrF,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,OAAO,MAAM,GAAG,aAAa,cAAc;AAAA,UAC1E,cAAc,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,UAC9D,aAAa;AAAA,YACX,MAAM;AAAA,YACN,MAAM,CAAC,cAAc,cAAc,YAAY;AAAA,YAC/C,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,MAAM,CAAC,SAAS,QAAQ;AAAA,YACxB,aAAa;AAAA,UACf;AAAA,UACA,OAAO,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,UAC1E,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,QACzD;AAAA,QACA,UAAU,CAAC,cAAc;AAAA,MAC3B;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,OAAO,UACT,yCACA;AACJ,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA,QAAQ,WAAW,MAAM,QAAQ;AAAA,YACjC,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,cAAc,cAAc,MAAM,cAAc;AAAA,YAChD,aACE,WAAW,MAAM,aAAa,MAAM,eAChC,eACC,WAAW,MAAM,aAAa,KAAK;AAAA,YAC1C,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,cAAc,WAAW,MAAM,OAAO;AAAA,YACtC,UAAU;AAAA,YACV,MAAM,WAAW,MAAM,MAAM;AAAA,UAC/B,CAAC;AAAA,UACD,iBAAiB,yBAAyB,EAAE;AAAA,QAC9C;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,UAC9D,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,WAAW,SAAS;AAAA,YAC3B,aAAa;AAAA,UACf;AAAA,UACA,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,UACxE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UACpE,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACpE;AAAA,QACA,UAAU,CAAC,QAAQ;AAAA,MACrB;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,SAAS,WAAW,MAAM,QAAQ,KAAK;AAC7C,cAAM,OACJ,WAAW,YACP,0CACA;AACN,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA,cAAc;AAAA,YACZ,QAAQ,cAAc,MAAM,QAAQ;AAAA,YACpC,WAAW,WAAW,MAAM,WAAW;AAAA,YACvC,SAAS,WAAW,MAAM,SAAS;AAAA,YACnC,OAAO,WAAW,MAAM,OAAO;AAAA,UACjC,CAAC;AAAA,UACD,iBAAiB,wBAAwB,EAAE;AAAA,QAC7C;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,SAAS;AAAA,MACT,aAAa;AAAA,QACX,MAAM;AAAA,QACN,YAAY;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,UAChE,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,UACA,QAAQ,EAAE,MAAM,UAAU,aAAa,qCAAqC;AAAA,QAC9E;AAAA,MACF;AAAA,MACA,SAAS,OAAO,SAAS,YAAY;AACnC,cAAM,OAAO,SAAS,OAAO;AAC7B,cAAM,UAAU,WAAW,MAAM,SAAS;AAC1C,cAAM,WAAW,gBAAgB,MAAM,UAAU;AACjD,cAAM,SAAS,WAAW,MAAM,QAAQ;AACxC;AAAA,UACE;AAAA,UACA,CAAC,WAAW,YAAY,QAAQ;AAAA,UAChC;AAAA,QACF;AACA,YAAI,YAAY,SAAS,SAAS,IAAI;AACpC,gBAAM,IAAI,gBAAgB,qCAAqC;AAAA,QACjE;AACA,cAAM,OAAO,UACT,yCACA;AACJ,cAAM,OAAO,cAAc,EAAE,SAAS,UAAU,OAAO,CAAC;AACxD,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC;AAAA,UACA;AAAA,UACA,iBAAiB,2BAA2B,EAAE;AAAA,QAChD;AACA,eAAOA,YAAU,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AC3YA,SAAS,eAA2B;AAClC,SAAO;AAAA,IACL,GAAG,wBAAwB;AAAA,IAC3B,GAAG,uBAAuB;AAAA,IAC1B,GAAG,2BAA2B;AAAA,IAC9B,GAAG,0BAA0B;AAAA,IAC7B,GAAG,qBAAqB;AAAA,IACxB,GAAG,oBAAoB;AAAA,IACvB,GAAG,yBAAyB;AAAA,IAC5B,GAAG,qBAAqB;AAAA,IACxB,GAAG,kBAAkB;AAAA,IACrB,GAAG,iBAAiB;AAAA,IACpB,GAAG,oBAAoB;AAAA,EACzB;AACF;AAEO,SAAS,WAAW,QAAkC;AAC3D,QAAM,iBAAiB,IAAI,IAAI,OAAO,OAAO;AAC7C,QAAM,QAAQ,aAAa,EAAE,OAAO,CAAC,SAAS,eAAe,IAAI,KAAK,MAAM,CAAC;AAC7E,MAAI,CAAC,OAAO,UAAU;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO;AAC7C;;;ACdO,SAAS,UAAU,MAAsB;AAC9C,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,aAAa,KAAK;AAAA,IAClB,aAAa;AAAA,MACX,cAAc,CAAC,KAAK;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,gBAAgB,CAAC,KAAK;AAAA,MACtB,eAAe;AAAA,IACjB;AAAA,EACF;AACF;;;AlBpBA,IAAM,gCAAgC;AACtC,IAAM,2BAAiC;AAAA,EACrC,MAAM;AAAA,EACN,aACE;AAAA,EACF,aAAa;AAAA,IACX,MAAM;AAAA,IACN,sBAAsB;AAAA,EACxB;AAAA,EACA,aAAa;AAAA,IACX,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AACF;AAqBA,SAAS,wBAAwB,QAA0C;AACzE,QAAM,iBAAiB,IAAI,IAAI,OAAO,OAAO;AAC7C,QAAMC,kBAAiB,wBAAwB;AAC/C,QAAM,qBAAqB,CAAC;AAE5B,aAAW,YAAY,SAAS;AAC9B,QAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AACjC,yBAAmB,QAAQ,IAAI;AAAA,QAC7B,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AACA;AAAA,IACF;AAEA,QAAI,aAAa,QAAQ;AACvB,yBAAmB,QAAQ,IAAI,EAAE,QAAQ,UAAU;AACnD;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,yBAAmB,QAAQ,IAAI;AAAA,QAC7B,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AACA;AAAA,IACF;AAEA,QAAIA,oBAAmB,eAAe;AACpC,yBAAmB,QAAQ,IAAI;AAAA,QAC7B,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AACA;AAAA,IACF;AAEA,QAAIA,oBAAmB,aAAa;AAClC,yBAAmB,QAAQ,IAAI,EAAE,QAAQ,UAAU;AACnD;AAAA,IACF;AAEA,uBAAmB,QAAQ,IAAI;AAAA,MAC7B,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,cACP,UACA,MACA,oBACgB;AAChB,QAAM,UAAmC;AAAA,IACvC,MAAM;AAAA,IACN,IAAI;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,IACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,IAClE,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,YACP,UACA,OACA,oBACgB;AAChB,QAAM,UAAU,mBAAmB,KAAK;AACxC,QAAM,aAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,GAAG;AAAA,IACH,cAAc;AAAA,EAChB;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,CAAC;AAAA,IACrE,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,kBACP,UACA,oBACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA,IAAI,eAAe,SAAS,QAAQ,8CAA8C;AAAA,MAChF,MAAM;AAAA,MACN,YAAY;AAAA,IACd,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEO,SAAS,aAAa,QAA8B;AACzD,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,QAAQ,WAAW,MAAM;AAC/B,QAAM,UAAU,IAAI,IAAsB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAChF,QAAM,eAAe,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM;AAChE,MAAI,iBAAiB;AACrB,QAAM,2BAA2B,YAA2B;AAC1D,QAAI,CAAC,gBAAgB,CAAC,OAAO,WAAW,gBAAgB;AACtD;AAAA,IACF;AACA,qBAAiB;AACjB,UAAM,qBAAqB,EAAE,QAAQ,OAAO,CAAC;AAAA,EAC/C;AACA,QAAM,mBAAmB,MAAkB;AACzC,QAAI,wBAAwB,MAAM,eAAe;AAC/C,aAAO;AAAA,IACT;AACA,WAAO,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACtD;AAEA,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,aAAa,SAAS,eAAe;AAAA,IAC7C;AAAA,MACE,cAAc;AAAA,QACZ,OAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO,kBAAkB,wBAAwB,YAAY;AAC3D,UAAM,yBAAyB;AAC/B,WAAO;AAAA,MACL,OAAO,CAAC,GAAG,iBAAiB,EAAE,IAAI,SAAS,GAAG,wBAAwB;AAAA,IACxE;AAAA,EACF,CAAC;AAED,SAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,UAAM,WAAW,QAAQ,OAAO;AAChC,UAAM,yBAAyB;AAC/B,QAAI,aAAa,+BAA+B;AAC9C,YAAM,WAAW,wBAAwB,MAAM;AAC/C,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,UACA,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,QAAI,CAAC,MAAM;AACT,aAAO,kBAAkB,UAAU,wBAAwB,MAAM,CAAC;AAAA,IACpE;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ,OAAO,aAAa,CAAC,GAAG;AAAA,QAClE;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,cAAc,UAAU,UAAU,wBAAwB,MAAM,CAAC;AAAA,IAC1E,SAAS,OAAO;AACd,aAAO,YAAY,UAAU,OAAO,wBAAwB,MAAM,CAAC;AAAA,IACrE;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AJ1NA,SAAS,YAAkB;AACzB,QAAM,OAAO;AAAA,SACN,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBlB,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAEA,SAAS,WAKP;AACA,QAAM,SAAS,UAAU;AAAA,IACvB,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,OAAO;AAAA,IACvB,UAAU,OAAO,OAAO,WAAW;AAAA,IACnC,MAAM,OAAO,OAAO;AAAA,IACpB,SAAS,OAAO,OAAO;AAAA,EACzB;AACF;AAEA,eAAsB,OAAsB;AAC1C,QAAM,MAAM,SAAS;AAErB,MAAI,IAAI,MAAM;AACZ,cAAU;AACV;AAAA,EACF;AAEA,MAAI,IAAI,SAAS;AACf,YAAQ,OAAO,MAAM,GAAG,cAAc;AAAA,CAAI;AAC1C;AAAA,EACF;AAEA,QAAM,SAAS,WAAW;AAAA,IACxB,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,EAChB,CAAC;AACD,QAAM,SAAS,aAAa,MAAM;AAClC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,QAAM,UAAU,mBAAmB,KAAK;AACxC,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5D,UAAQ,WAAW;AACrB,CAAC;","names":["normalize","response","normalize","response","normalize","response","normalize","payload","response","normalize","normalize","normalize","normalize","normalize","normalize","earnCapability"]}
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    145:   const apiKey = process.env.BITGET_API_KEY?.trim();
    146:   const secretKey = process.env.BITGET_SECRET_KEY?.trim();
>>> 147:   const passphrase = process.env.BITGET_PASSPHRASE?.trim();
    148:   const hasAuth = Boolean(apiKey && secretKey && passphrase);
    149:   const partialAuth = Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    144: function loadConfig(cli) {
    145:   const apiKey = process.env.BITGET_API_KEY?.trim();
>>> 146:   const secretKey = process.env.BITGET_SECRET_KEY?.trim();
    147:   const passphrase = process.env.BITGET_PASSPHRASE?.trim();
    148:   const hasAuth = Boolean(apiKey && secretKey && passphrase);
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    143: }
    144: function loadConfig(cli) {
>>> 145:   const apiKey = process.env.BITGET_API_KEY?.trim();
    146:   const secretKey = process.env.BITGET_SECRET_KEY?.trim();
    147:   const passphrase = process.env.BITGET_PASSPHRASE?.trim();
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    133: }
    134: function loadBaseUrl() {
>>> 135:   const baseUrl = process.env.BITGET_API_BASE_URL?.trim() || "https://api.bitget.com";
    136:   if (!baseUrl.startsWith("http://") && !baseUrl.startsWith("https://")) {
    137:     throw new ConfigError(
Report false positive
criticalDE-002Data ExfiltrationHigh ConfidenceLine 0

Environment file access

Detected by automated pattern matching (rule DE-002) with medium confidence. May be a false positive.

    119: }
    120: function loadTimeoutMs() {
>>> 121:   const raw = process.env.BITGET_TIMEOUT_MS;
    122:   if (!raw) {
    123:     return 15e3;
Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ ��z�S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b���y���Ư�x?�����+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b���y���Ư�x?��]�x?�+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��溑�p����+r

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫�(�{S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��-���������v)���e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,i�(�{i�(�{l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,i�(�{n)e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-����������

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-������˛

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����ǫ�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����ǫ�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ ��z�S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ �rN���x��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z��z�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ܢ{ki�l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^���ǥ

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^���ǥ

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��^���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��+u��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��+u��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��"�*'�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��"�*'��e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����j��܅��"w�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����j��܅��.+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�镧

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��׫"w�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�镧

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫�(�{S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ �rN���x��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ ��z�S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: i�b�*'jS뢗��'�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��溑�p����+r

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �����b��� ڶ��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: J�b�'���ӭ�즊�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��溑�p����+r

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: i�b�*'jS뢗��'�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��溑�p����+r

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: z{.���u��k�!�^yם

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �� �Zn)b�$�j۬

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b���y���Ư�x?�����+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b���y���Ư�x?��]�x?�+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �� �Zn)b�$�j۬

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �� �Zn)b�$�j۬

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��溑�p����+r

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: �� �Zn)b�$�j۬

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: y��Rv�j)ZnW���+

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫�(�{S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��-���������v)���e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,i�(�{i�(�{l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,i�(�{n)e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-����������

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-������˛

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����ǫ�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����ǫ�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ ��z�S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ �rN���x��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z��z�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,���z�ܢ{ki�l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^���ǥ

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^���ǥ

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��^���

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��+u��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��^��+u��

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��"�*'�����

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����,��"�*'��e

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����j��܅��"w�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b����j��܅��.+-

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�镧

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��׫"w�

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�ߊYl

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u�镧

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��b�����-���u��j�!

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫�(�{S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ ��z�S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ �rN���x��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫�(�{S��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
highDO-BASunknownMedium ConfidenceLine 0

Decoded base64 content: ��"�׫ �rN���x��l

Detected by automated pattern matching (rule DO-BAS) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.9 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.9 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.0 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.6 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.6 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumNS-003Network SuspiciousMedium ConfidenceLine 0

JavaScript fetch() call

Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.

>>> 1: {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/errors.ts","../src/config.ts","../src/server.ts","../src/utils/signature.ts","../src/utils/rate-limiter.ts","../src/client/rest-client.ts","../src/tools/helpers.ts","../src/tools/common.ts","../src/tools/earn.ts","../src/tools/account.ts","../src/tools/broker.ts","../src/tools/convert.ts","../src/tools/copy-trading.ts","../src/tools/futures-market.ts","../src/tools/futures-trade.ts","../src/tools/margin.ts","../src/tools/p2p.ts","../src/tools/spot-market.ts","../src/tools/spot-trade.ts","../src/tools/index.ts","../src/tools/types.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { loadConfig } from \"./config.js\";\nimport { SERVER_NAME, SERVER_VERSION } from \"./constants.js\";\nimport { createServer } from \"./server.js\";\nimport { toToolErrorPayload } from \"./utils/errors.js\";\n\nfunction printHelp(): void {\n  const help = `\nUsage: ${SERVER_NAME} [options]\n\nOptions:\n  --modules <list>     Comma-separated list of modules to load\n                       Available: spot, futures, account, margin, copytrading,\n                       convert, earn, p2p, broker\n                       Special: \"all\" loads all modules\n                       Default: spot,futures,account\n\n  --read-only          Expose only read/query tools and disable write operations\n  --help               Show this help message\n  --version            Show version\n\nEnvironment Variables:\n  BITGET_API_KEY       Bitget API key (required for private endpoints)\n  BITGET_SECRET_KEY    Bitget secret key (required for private endpoints)\n  BITGET_PASSPHRASE    Bitget passphrase (required for private endpoints)\n  BITGET_API_BASE_URL  Optional API base URL (default: https://api.bitget.com)\n  BITGET_TIMEOUT_MS    Optional request timeout in milliseconds (default: 15000)\n`;\n  process.stdout.write(help);\n}\n\nfunction parseCli(): {\n  modules?: string;\n  readOnly: boolean;\n  help: boolean;\n  version: boolean;\n} {\n  const parsed = parseArgs({\n    options: {\n      modules: {\n        type: \"string\",\n      },\n      \"read-only\": {\n        type: \"boolean\",\n        default: false,\n      },\n      help: {\n        type: \"boolean\",\n        default: false,\n      },\n      version: {\n        type: \"boolean\",\n        default: false,\n      },\n    },\n    allowPositionals: false,\n  });\n\n  return {\n    modules: parsed.values.modules,\n    readOnly: parsed.values[\"read-only\"],\n    help: parsed.values.help,\n    version: parsed.values.version,\n  };\n}\n\nexport async function main(): Promise<void> {\n  const cli = parseCli();\n\n  if (cli.help) {\n    printHelp();\n    return;\n  }\n\n  if (cli.version) {\n    process.stdout.write(`${SERVER_VERSION}\\n`);\n    return;\n  }\n\n  const config = loadConfig({\n    modules: cli.modules,\n    readOnly: cli.readOnly,\n  });\n  const server = createServer(config);\n  const transport = new StdioServerTransport();\n  await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n  const payload = toToolErrorPayload(error);\n  process.stderr.write(`${JSON.stringify(payload, null, 2)}\\n`);\n  process.exitCode = 1;\n});\n","export const SERVER_NAME = \"bitget-mcp-server\";\nexport const SERVER_VERSION = \"1.0.6\";\n\nexport const MODULES = [\n  \"spot\",\n  \"futures\",\n  \"account\",\n  \"margin\",\n  \"copytrading\",\n  \"convert\",\n  \"earn\",\n  \"p2p\",\n  \"broker\",\n] as const;\n\nexport type ModuleId = (typeof MODULES)[number];\n\nexport const DEFAULT_MODULES: ModuleId[] = [\"spot\", \"futures\", \"account\"];\n","export type ErrorType =\n  | \"ConfigError\"\n  | \"AuthenticationError\"\n  | \"RateLimitError\"\n  | \"ValidationError\"\n  | \"BitgetApiError\"\n  | \"NetworkError\"\n  | \"InternalError\";\n\nexport interface ToolErrorPayload {\n  error: true;\n  type: ErrorType;\n  code?: string;\n  message: string;\n  suggestion?: string;\n  endpoint?: string;\n  timestamp: string;\n}\n\nexport class BitgetMcpError extends Error {\n  public readonly type: ErrorType;\n  public readonly code?: string;\n  public readonly suggestion?: string;\n  public readonly endpoint?: string;\n\n  public constructor(\n    type: ErrorType,\n    message: string,\n    options?: {\n      code?: string;\n      suggestion?: string;\n      endpoint?: string;\n      cause?: unknown;\n    },\n  ) {\n    super(message, options?.cause ? { cause: options.cause } : undefined);\n    this.name = type;\n    this.type = type;\n    this.code = options?.code;\n    this.suggestion = options?.suggestion;\n    this.endpoint = options?.endpoint;\n  }\n}\n\nexport class ConfigError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string) {\n    super(\"ConfigError\", message, { suggestion });\n  }\n}\n\nexport class ValidationError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string) {\n    super(\"ValidationError\", message, { suggestion });\n  }\n}\n\nexport class RateLimitError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string, endpoint?: string) {\n    super(\"RateLimitError\", message, { suggestion, endpoint });\n  }\n}\n\nexport class AuthenticationError extends BitgetMcpError {\n  public constructor(message: string, suggestion?: string, endpoint?: string) {\n    super(\"AuthenticationError\", message, { suggestion, endpoint });\n  }\n}\n\nexport class BitgetApiError extends BitgetMcpError {\n  public constructor(\n    message: string,\n    options?: {\n      code?: string;\n      suggestion?: string;\n      endpoint?: string;\n      cause?: unknown;\n    },\n  ) {\n    super(\"BitgetApiError\", message, options);\n  }\n}\n\nexport class NetworkError extends BitgetMcpError {\n  public constructor(message: string, endpoint?: string, cause?: unknown) {\n    super(\"NetworkError\", message, {\n      endpoint,\n      cause,\n      suggestion:\n        \"Please check network connectivity and retry the request in a few seconds.\",\n    });\n  }\n}\n\nexport function toToolErrorPayload(\n  error: unknown,\n  fallbackEndpoint?: string,\n): ToolErrorPayload {\n  if (error instanceof BitgetMcpError) {\n    return {\n      error: true,\n      type: error.type,\n      code: error.code,\n      message: error.message,\n      suggestion: error.suggestion,\n      endpoint: error.endpoint ?? fallbackEndpoint,\n      timestamp: new Date().toISOString(),\n    };\n  }\n\n  const message = error instanceof Error ? error.message : String(error);\n\n  return {\n    error: true,\n    type: \"InternalError\",\n    message,\n    suggestion:\n      \"Unexpected server error. Check tool arguments and retry. If it persists, inspect server logs.\",\n    endpoint: fallbackEndpoint,\n    timestamp: new Date().toISOString(),\n  };\n}\n","import { DEFAULT_MODULES, MODULES, type ModuleId } from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\n\nexport interface CliOptions {\n  modules?: string;\n  readOnly: boolean;\n}\n\nexport interface BitgetConfig {\n  apiKey?: string;\n  secretKey?: string;\n  passphrase?: string;\n  hasAuth: boolean;\n  baseUrl: string;\n  timeoutMs: number;\n  modules: ModuleId[];\n  readOnly: boolean;\n}\n\nfunction parseModuleList(rawModules?: string): ModuleId[] {\n  if (!rawModules || rawModules.trim().length === 0) {\n    return [...DEFAULT_MODULES];\n  }\n\n  const trimmed = rawModules.trim().toLowerCase();\n  if (trimmed === \"all\") {\n    return [...MODULES];\n  }\n\n  const requested = trimmed\n    .split(\",\")\n    .map((item) => item.trim())\n    .filter((item) => item.length > 0);\n\n  if (requested.length === 0) {\n    return [...DEFAULT_MODULES];\n  }\n\n  const deduped = new Set<ModuleId>();\n  for (const moduleId of requested) {\n    if (!MODULES.includes(moduleId as ModuleId)) {\n      throw new ConfigError(\n        `Unknown module \"${moduleId}\".`,\n        `Use one of: ${MODULES.join(\", \")} or \"all\".`,\n      );\n    }\n    deduped.add(moduleId as ModuleId);\n  }\n\n  return Array.from(deduped);\n}\n\nfunction loadTimeoutMs(): number {\n  const raw = process.env.BITGET_TIMEOUT_MS;\n  if (!raw) {\n    return 15_000;\n  }\n\n  const parsed = Number(raw);\n  if (!Number.isFinite(parsed) || parsed <= 0) {\n    throw new ConfigError(\n      `Invalid BITGET_TIMEOUT_MS value \"${raw}\".`,\n      \"Set BITGET_TIMEOUT_MS as a positive integer in milliseconds.\",\n    );\n  }\n\n  return Math.floor(parsed);\n}\n\nfunction loadBaseUrl(): string {\n  const baseUrl = process.env.BITGET_API_BASE_URL?.trim() || \"https://api.bitget.com\";\n  if (!baseUrl.startsWith(\"http://\") && !baseUrl.startsWith(\"https://\")) {\n    throw new ConfigError(\n      `Invalid BITGET_API_BASE_URL \"${baseUrl}\".`,\n      \"BITGET_API_BASE_URL must start with http:// or https://\",\n    );\n  }\n  return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function loadConfig(cli: CliOptions): BitgetConfig {\n  const apiKey = process.env.BITGET_API_KEY?.trim();\n  const secretKey = process.env.BITGET_SECRET_KEY?.trim();\n  const passphrase = process.env.BITGET_PASSPHRASE?.trim();\n\n  const hasAuth = Boolean(apiKey && secretKey && passphrase);\n  const partialAuth =\n    Boolean(apiKey) || Boolean(secretKey) || Boolean(passphrase);\n\n  if (partialAuth && !hasAuth) {\n    throw new ConfigError(\n      \"Partial API credentials detected.\",\n      \"Set BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE together.\",\n    );\n  }\n\n  return {\n    apiKey,\n    secretKey,\n    passphrase,\n    hasAuth,\n    baseUrl: loadBaseUrl(),\n    timeoutMs: loadTimeoutMs(),\n    modules: parseModuleList(cli.modules),\n    readOnly: cli.readOnly,\n  };\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n  CallToolRequestSchema,\n  ListToolsRequestSchema,\n  type CallToolResult,\n  type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetConfig } from \"./config.js\";\nimport { BitgetRestClient } from \"./client/rest-client.js\";\nimport { MODULES, SERVER_NAME, SERVER_VERSION, type ModuleId } from \"./constants.js\";\nimport { getEarnCapabilityStatus, warmupEarnCapability } from \"./tools/earn.js\";\nimport { buildTools } from \"./tools/index.js\";\nimport { toMcpTool, type ToolSpec } from \"./tools/types.js\";\nimport { BitgetApiError, toToolErrorPayload } from \"./utils/errors.js\";\n\nconst SYSTEM_CAPABILITIES_TOOL_NAME = \"system_get_capabilities\";\nconst SYSTEM_CAPABILITIES_TOOL: Tool = {\n  name: SYSTEM_CAPABILITIES_TOOL_NAME,\n  description:\n    \"Return machine-readable server capabilities and module availability for agent planning.\",\n  inputSchema: {\n    type: \"object\",\n    additionalProperties: false,\n  },\n  annotations: {\n    readOnlyHint: true,\n    destructiveHint: false,\n    idempotentHint: true,\n    openWorldHint: false,\n  },\n};\n\ntype ModuleCapabilityStatus =\n  | \"enabled\"\n  | \"disabled\"\n  | \"unsupported\"\n  | \"requires_auth\"\n  | \"unknown\";\n\ninterface CapabilitySnapshot {\n  readOnly: boolean;\n  hasAuth: boolean;\n  moduleAvailability: Record<\n    ModuleId,\n    {\n      status: ModuleCapabilityStatus;\n      reasonCode?: string;\n    }\n  >;\n}\n\nfunction buildCapabilitySnapshot(config: BitgetConfig): CapabilitySnapshot {\n  const enabledModules = new Set(config.modules);\n  const earnCapability = getEarnCapabilityStatus();\n  const moduleAvailability = {} as CapabilitySnapshot[\"moduleAvailability\"];\n\n  for (const moduleId of MODULES) {\n    if (!enabledModules.has(moduleId)) {\n      moduleAvailability[moduleId] = {\n        status: \"disabled\",\n        reasonCode: \"MODULE_FILTERED\",\n      };\n      continue;\n    }\n\n    if (moduleId !== \"earn\") {\n      moduleAvailability[moduleId] = { status: \"enabled\" };\n      continue;\n    }\n\n    if (!config.hasAuth) {\n      moduleAvailability[moduleId] = {\n        status: \"requires_auth\",\n        reasonCode: \"AUTH_MISSING\",\n      };\n      continue;\n    }\n\n    if (earnCapability === \"unsupported\") {\n      moduleAvailability[moduleId] = {\n        status: \"unsupported\",\n        reasonCode: \"EARN_UNAVAILABLE\",\n      };\n      continue;\n    }\n\n    if (earnCapability === \"supported\") {\n      moduleAvailability[moduleId] = { status: \"enabled\" };\n      continue;\n    }\n\n    moduleAvailability[moduleId] = {\n      status: \"unknown\",\n      reasonCode: \"CAPABILITY_PROBING\",\n    };\n  }\n\n  return {\n    readOnly: config.readOnly,\n    hasAuth: config.hasAuth,\n    moduleAvailability,\n  };\n}\n\nfunction successResult(\n  toolName: string,\n  data: unknown,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  const payload: Record<string, unknown> = {\n    tool: toolName,\n    ok: true,\n    data,\n    capabilities: capabilitySnapshot,\n    timestamp: new Date().toISOString(),\n  };\n  return {\n    content: [{ type: \"text\", text: JSON.stringify(payload, null, 2) }],\n    structuredContent: payload,\n  };\n}\n\nfunction errorResult(\n  toolName: string,\n  error: unknown,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  const payload = toToolErrorPayload(error);\n  const structured: Record<string, unknown> = {\n    tool: toolName,\n    ...payload,\n    capabilities: capabilitySnapshot,\n  };\n  return {\n    isError: true,\n    content: [{ type: \"text\", text: JSON.stringify(structured, null, 2) }],\n    structuredContent: structured,\n  };\n}\n\nfunction unknownToolResult(\n  toolName: string,\n  capabilitySnapshot: CapabilitySnapshot,\n): CallToolResult {\n  return errorResult(\n    toolName,\n    new BitgetApiError(`Tool \"${toolName}\" is not available in this server session.`, {\n      code: \"TOOL_NOT_AVAILABLE\",\n      suggestion: \"Call list_tools again and choose from currently available tools.\",\n    }),\n    capabilitySnapshot,\n  );\n}\n\nexport function createServer(config: BitgetConfig): Server {\n  const client = new BitgetRestClient(config);\n  const tools = buildTools(config);\n  const toolMap = new Map<string, ToolSpec>(tools.map((tool) => [tool.name, tool]));\n  const hasEarnTools = tools.some((tool) => tool.module === \"earn\");\n  let earnWarmupDone = false;\n  const ensureEarnWarmupIfNeeded = async (): Promise<void> => {\n    if (!hasEarnTools || !config.hasAuth || earnWarmupDone) {\n      return;\n    }\n    earnWarmupDone = true;\n    await warmupEarnCapability({ config, client });\n  };\n  const listVisibleTools = (): ToolSpec[] => {\n    if (getEarnCapabilityStatus() !== \"unsupported\") {\n      return tools;\n    }\n    return tools.filter((tool) => tool.module !== \"earn\");\n  };\n\n  const server = new Server(\n    { name: SERVER_NAME, version: SERVER_VERSION },\n    {\n      capabilities: {\n        tools: {},\n      },\n    },\n  );\n\n  server.setRequestHandler(ListToolsRequestSchema, async () => {\n    await ensureEarnWarmupIfNeeded();\n    return {\n      tools: [...listVisibleTools().map(toMcpTool), SYSTEM_CAPABILITIES_TOOL],\n    };\n  });\n\n  server.setRequestHandler(CallToolRequestSchema, async (request) => {\n    const toolName = request.params.name;\n    await ensureEarnWarmupIfNeeded();\n    if (toolName === SYSTEM_CAPABILITIES_TOOL_NAME) {\n      const snapshot = buildCapabilitySnapshot(config);\n      return successResult(\n        toolName,\n        {\n          server: {\n            name: SERVER_NAME,\n            version: SERVER_VERSION,\n          },\n          capabilities: snapshot,\n        },\n        snapshot,\n      );\n    }\n    const tool = toolMap.get(toolName);\n\n    if (!tool) {\n      return unknownToolResult(toolName, buildCapabilitySnapshot(config));\n    }\n\n    try {\n      const response = await tool.handler(request.params.arguments ?? {}, {\n        config,\n        client,\n      });\n      return successResult(toolName, response, buildCapabilitySnapshot(config));\n    } catch (error) {\n      return errorResult(toolName, error, buildCapabilitySnapshot(config));\n    }\n  });\n\n  return server;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function signBitgetPayload(payload: string, secretKey: string): string {\n  return createHmac(\"sha256\", secretKey).update(payload).digest(\"base64\");\n}\n","import { RateLimitError } from \"./errors.js\";\n\ntype Bucket = {\n  tokens: number;\n  lastRefillMs: number;\n  capacity: number;\n  refillPerSecond: number;\n};\n\nexport type RateLimitConfig = {\n  key: string;\n  capacity: number;\n  refillPerSecond: number;\n};\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n}\n\nexport class RateLimiter {\n  private readonly buckets = new Map<string, Bucket>();\n  private readonly maxWaitMs: number;\n\n  public constructor(maxWaitMs = 30_000) {\n    this.maxWaitMs = maxWaitMs;\n  }\n\n  public async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n    const bucket = this.getBucket(config);\n    this.refill(bucket);\n\n    if (bucket.tokens >= amount) {\n      bucket.tokens -= amount;\n      return;\n    }\n\n    const missing = amount - bucket.tokens;\n    const secondsToWait = missing / bucket.refillPerSecond;\n    const waitMs = Math.ceil(secondsToWait * 1000);\n\n    if (waitMs > this.maxWaitMs) {\n      throw new RateLimitError(\n        `Client-side rate limit reached for ${config.key}. Required wait ${waitMs}ms exceeds allowed max ${this.maxWaitMs}ms.`,\n        \"Reduce tool call frequency or retry later.\",\n      );\n    }\n\n    await sleep(waitMs);\n    this.refill(bucket);\n\n    if (bucket.tokens < amount) {\n      throw new RateLimitError(\n        `Rate limiter failed to acquire enough tokens for ${config.key}.`,\n      );\n    }\n\n    bucket.tokens -= amount;\n  }\n\n  private getBucket(config: RateLimitConfig): Bucket {\n    const existing = this.buckets.get(config.key);\n    if (existing) {\n      if (\n        existing.capacity !== config.capacity ||\n        existing.refillPerSecond !== config.refillPerSecond\n      ) {\n        existing.capacity = config.capacity;\n        existing.refillPerSecond = config.refillPerSecond;\n        existing.tokens = Math.min(existing.tokens, config.capacity);\n      }\n      return existing;\n    }\n\n    const now = Date.now();\n    const created: Bucket = {\n      tokens: config.capacity,\n      lastRefillMs: now,\n      capacity: config.capacity,\n      refillPerSecond: config.refillPerSecond,\n    };\n    this.buckets.set(config.key, created);\n    return created;\n  }\n\n  private refill(bucket: Bucket): void {\n    const now = Date.now();\n    const elapsedMs = now - bucket.lastRefillMs;\n    if (elapsedMs <= 0) {\n      return;\n    }\n\n    const refillTokens = (elapsedMs / 1000) * bucket.refillPerSecond;\n    bucket.tokens = Math.min(bucket.capacity, bucket.tokens + refillTokens);\n    bucket.lastRefillMs = now;\n  }\n}\n","import { signBitgetPayload } from \"../utils/signature.js\";\nimport {\n  AuthenticationError,\n  BitgetApiError,\n  ConfigError,\n  NetworkError,\n} from \"../utils/errors.js\";\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type {\n  BitgetApiResponse,\n  QueryParams,\n  QueryValue,\n  RequestConfig,\n  RequestResult,\n} from \"./types.js\";\n\nfunction isDefined(value: unknown): boolean {\n  return value !== undefined && value !== null;\n}\n\nfunction stringifyQueryValue(value: QueryValue): string {\n  if (Array.isArray(value)) {\n    return value.map((item) => String(item)).join(\",\");\n  }\n  return String(value);\n}\n\nfunction buildQueryString(query?: QueryParams): string {\n  if (!query) {\n    return \"\";\n  }\n\n  const entries = Object.entries(query).filter(([, value]) => isDefined(value));\n  if (entries.length === 0) {\n    return \"\";\n  }\n\n  const params = new URLSearchParams();\n  for (const [key, value] of entries) {\n    params.set(key, stringifyQueryValue(value));\n  }\n  return params.toString();\n}\n\nexport class BitgetRestClient {\n  private readonly config: BitgetConfig;\n  private readonly rateLimiter = new RateLimiter();\n\n  public constructor(config: BitgetConfig) {\n    this.config = config;\n  }\n\n  public async publicGet<TData = unknown>(\n    path: string,\n    query?: QueryParams,\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"GET\",\n      path,\n      auth: \"public\",\n      query,\n      rateLimit,\n    });\n  }\n\n  public async privateGet<TData = unknown>(\n    path: string,\n    query?: QueryParams,\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"GET\",\n      path,\n      auth: \"private\",\n      query,\n      rateLimit,\n    });\n  }\n\n  public async privatePost<TData = unknown>(\n    path: string,\n    body?: RequestConfig[\"body\"],\n    rateLimit?: RequestConfig[\"rateLimit\"],\n  ): Promise<RequestResult<TData>> {\n    return this.request<TData>({\n      method: \"POST\",\n      path,\n      auth: \"private\",\n      body,\n      rateLimit,\n    });\n  }\n\n  private async request<TData = unknown>(\n    config: RequestConfig,\n  ): Promise<RequestResult<TData>> {\n    const queryString = buildQueryString(config.query);\n    const endpoint = queryString.length > 0 ? `${config.path}?${queryString}` : config.path;\n    const url = `${this.config.baseUrl}${endpoint}`;\n    const bodyJson = config.body ? JSON.stringify(config.body) : \"\";\n    const timestamp = Date.now().toString();\n\n    if (config.rateLimit) {\n      await this.rateLimiter.consume(config.rateLimit);\n    }\n\n    const headers = new Headers({\n      \"Content-Type\": \"application/json\",\n      Accept: \"application/json\",\n      locale: \"en-US\",\n    });\n\n    if (config.auth === \"private\") {\n      if (!this.config.hasAuth) {\n        throw new ConfigError(\n          \"Private endpoint requires API credentials.\",\n          \"Configure BITGET_API_KEY, BITGET_SECRET_KEY and BITGET_PASSPHRASE.\",\n        );\n      }\n\n      if (!this.config.apiKey || !this.config.secretKey || !this.config.passphrase) {\n        throw new ConfigError(\n          \"Invalid private API credentials state.\",\n          \"Ensure all BITGET credentials are set.\",\n        );\n      }\n\n      const payload = `${timestamp}${config.method.toUpperCase()}${endpoint}${bodyJson}`;\n      const signature = signBitgetPayload(payload, this.config.secretKey);\n      headers.set(\"ACCESS-KEY\", this.config.apiKey);\n      headers.set(\"ACCESS-SIGN\", signature);\n      headers.set(\"ACCESS-PASSPHRASE\", this.config.passphrase);\n      headers.set(\"ACCESS-TIMESTAMP\", timestamp);\n    }\n\n    let response: Response;\n    try {\n      response = await fetch(url, {\n        method: config.method,\n        headers,\n        body: config.method === \"POST\" ? bodyJson : undefined,\n        signal: AbortSignal.timeout(this.config.timeoutMs),\n      });\n    } catch (error) {\n      throw new NetworkError(\n        `Failed to call Bitget endpoint ${config.method} ${endpoint}.`,\n        `${config.method} ${endpoint}`,\n        error,\n      );\n    }\n\n    const rawText = await response.text();\n    let parsed: BitgetApiResponse<TData>;\n    try {\n      parsed = (rawText ? JSON.parse(rawText) : {}) as BitgetApiResponse<TData>;\n    } catch (error) {\n      if (!response.ok) {\n        const messagePreview = rawText.slice(0, 160).replace(/\\s+/g, \" \").trim();\n        throw new BitgetApiError(\n          `HTTP ${response.status} from Bitget: ${messagePreview || \"Non-JSON response body\"}`,\n          {\n            code: String(response.status),\n            endpoint: `${config.method} ${config.path}`,\n            suggestion: \"Verify endpoint path and request parameters.\",\n          },\n        );\n      }\n      throw new NetworkError(\n        `Bitget returned non-JSON response for ${config.method} ${endpoint}.`,\n        `${config.method} ${endpoint}`,\n        error,\n      );\n    }\n\n    if (!response.ok) {\n      throw new BitgetApiError(\n        `HTTP ${response.status} from Bitget: ${parsed.msg ?? \"Unknown error\"}`,\n        {\n          code: String(response.status),\n          endpoint: `${config.method} ${config.path}`,\n          suggestion: \"Retry later or verify endpoint parameters.\",\n        },\n      );\n    }\n\n    const responseCode = parsed.code;\n    if (responseCode && responseCode !== \"00000\") {\n      const message = parsed.msg ?? \"Bitget API request failed.\";\n      if (\n        responseCode === \"40017\" ||\n        responseCode === \"40018\" ||\n        responseCode === \"40036\"\n      ) {\n        throw new AuthenticationError(message, \"Check API key, secret, passphrase and permissions.\", `${config.method} ${config.path}`);\n      }\n\n      throw new BitgetApiError(message, {\n        code: responseCode,\n        endpoint: `${config.method} ${config.path}`,\n      });\n    }\n\n    return {\n      endpoint: `${config.method} ${config.path}`,\n      requestTime: new Date().toISOString(),\n      data: (parsed.data ?? null) as TData,\n      raw: parsed,\n    };\n  }\n}\n","import { ValidationError } from \"../utils/errors.js\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n    return {};\n  }\n  return value as Record<string, unknown>;\n}\n\nexport function readString(\n  args: Record<string, unknown>,\n  key: string,\n): string | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"string\") {\n    throw new ValidationError(`Parameter \"${key}\" must be a string.`);\n  }\n  return value;\n}\n\nexport function readNumber(\n  args: Record<string, unknown>,\n  key: string,\n): number | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"number\" || Number.isNaN(value)) {\n    throw new ValidationError(`Parameter \"${key}\" must be a number.`);\n  }\n  return value;\n}\n\nexport function readBoolean(\n  args: Record<string, unknown>,\n  key: string,\n): boolean | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (typeof value !== \"boolean\") {\n    throw new ValidationError(`Parameter \"${key}\" must be a boolean.`);\n  }\n  return value;\n}\n\nexport function readStringArray(\n  args: Record<string, unknown>,\n  key: string,\n): string[] | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n    throw new ValidationError(`Parameter \"${key}\" must be an array of strings.`);\n  }\n  return value;\n}\n\nexport function readObjectArray(\n  args: Record<string, unknown>,\n  key: string,\n): Record<string, unknown>[] | undefined {\n  const value = args[key];\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n  if (\n    !Array.isArray(value) ||\n    value.some((item) => !item || typeof item !== \"object\" || Array.isArray(item))\n  ) {\n    throw new ValidationError(`Parameter \"${key}\" must be an array of objects.`);\n  }\n  return value as Record<string, unknown>[];\n}\n\nexport function requireString(\n  args: Record<string, unknown>,\n  key: string,\n): string {\n  const value = readString(args, key);\n  if (!value || value.length === 0) {\n    throw new ValidationError(`Missing required parameter \"${key}\".`);\n  }\n  return value;\n}\n\nexport function requireObjectArray(\n  args: Record<string, unknown>,\n  key: string,\n): Record<string, unknown>[] {\n  const value = readObjectArray(args, key);\n  if (!value || value.length === 0) {\n    throw new ValidationError(`Missing required non-empty array \"${key}\".`);\n  }\n  return value;\n}\n\nexport function ensureOneOf(\n  args: Record<string, unknown>,\n  keys: string[],\n  message: string,\n): void {\n  const hasAny = keys.some((key) => args[key] !== undefined && args[key] !== null);\n  if (!hasAny) {\n    throw new ValidationError(message);\n  }\n}\n\nexport function assertEnum(\n  value: string | undefined,\n  key: string,\n  values: readonly string[],\n): void {\n  if (value === undefined) {\n    return;\n  }\n  if (!values.includes(value)) {\n    throw new ValidationError(\n      `Parameter \"${key}\" must be one of: ${values.join(\", \")}.`,\n    );\n  }\n}\n\nexport function compactObject(\n  object: Record<string, unknown>,\n): Record<string, unknown> {\n  const next: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(object)) {\n    if (value !== undefined && value !== null) {\n      next[key] = value;\n    }\n  }\n  return next;\n}\n","import type { RateLimitConfig } from \"../utils/rate-limiter.js\";\n\nexport const PRODUCT_TYPES = [\n  \"USDT-FUTURES\",\n  \"USDC-FUTURES\",\n  \"COIN-FUTURES\",\n] as const;\n\nexport const GRANULARITIES = [\n  \"1min\",\n  \"5min\",\n  \"15min\",\n  \"30min\",\n  \"1h\",\n  \"4h\",\n  \"6h\",\n  \"12h\",\n  \"1day\",\n  \"3day\",\n  \"1week\",\n  \"1M\",\n] as const;\n\nexport function publicRateLimit(key: string, rps = 20): RateLimitConfig {\n  return {\n    key: `public:${key}`,\n    capacity: rps,\n    refillPerSecond: rps,\n  };\n}\n\nexport function privateRateLimit(key: string, rps = 10): RateLimitConfig {\n  return {\n    key: `private:${key}`,\n    capacity: rps,\n    refillPerSecond: rps,\n  };\n}\n","import type { ToolContext, ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport type { RequestResult } from \"../client/types.js\";\nimport { BitgetApiError } from \"../utils/errors.js\";\n\ntype EarnOperation = \"products\" | \"holdings\" | \"subscribe\" | \"redeem\";\nexport type EarnCapabilityStatus = \"unknown\" | \"supported\" | \"unsupported\";\n\nconst EARN_ENDPOINTS: Record<EarnOperation, string[]> = {\n  products: [\"/api/v2/earn/product/list\", \"/api/v2/earn/saving/product/list\"],\n  holdings: [\"/api/v2/earn/holding/list\", \"/api/v2/earn/saving/holding/list\"],\n  subscribe: [\"/api/v2/earn/subscribe\"],\n  redeem: [\"/api/v2/earn/redeem\"],\n};\n\nconst earnEndpointCache: Partial<Record<EarnOperation, string>> = {};\nlet earnCapability: EarnCapabilityStatus = \"unknown\";\n\nexport function getEarnCapabilityStatus(): EarnCapabilityStatus {\n  return earnCapability;\n}\n\nexport async function warmupEarnCapability(context: ToolContext): Promise<EarnCapabilityStatus> {\n  if (earnCapability !== \"unknown\") {\n    return earnCapability;\n  }\n  try {\n    await ensureEarnSupported(context);\n  } catch {\n    // warmup is best-effort; status transition is handled in ensureEarnSupported.\n  }\n  return earnCapability;\n}\n\nfunction is404Error(error: unknown): boolean {\n  return error instanceof BitgetApiError && error.code === \"404\";\n}\n\nfunction earnUnavailableError(operation: EarnOperation): BitgetApiError {\n  return new BitgetApiError(\n    `Earn API operation \"${operation}\" is unavailable in current account/region or API environment.`,\n    {\n      code: \"EARN_UNAVAILABLE\",\n      suggestion:\n        \"Current Bitget environment does not expose earn endpoints for this account. Consider disabling earn module for this deployment.\",\n    },\n  );\n}\n\nfunction endpointCandidates(operation: EarnOperation): string[] {\n  const cached = earnEndpointCache[operation];\n  if (!cached) {\n    return [...EARN_ENDPOINTS[operation]];\n  }\n  return [cached, ...EARN_ENDPOINTS[operation].filter((item) => item !== cached)];\n}\n\nasync function callEarnGet(\n  context: ToolContext,\n  operation: EarnOperation,\n  query: Record<string, unknown>,\n  rateLimitKey: string,\n): Promise<RequestResult> {\n  for (const path of endpointCandidates(operation)) {\n    try {\n      const response = await context.client.privateGet(\n        path,\n        query,\n        privateRateLimit(rateLimitKey, 10),\n      );\n      earnEndpointCache[operation] = path;\n      return response;\n    } catch (error) {\n      if (is404Error(error)) {\n        continue;\n      }\n      throw error;\n    }\n  }\n  throw earnUnavailableError(operation);\n}\n\nasync function callEarnPost(\n  context: ToolContext,\n  operation: EarnOperation,\n  body: Record<string, unknown>,\n  rateLimitKey: string,\n): Promise<RequestResult> {\n  for (const path of endpointCandidates(operation)) {\n    try {\n      const response = await context.client.privatePost(\n        path,\n        body,\n        privateRateLimit(rateLimitKey, 5),\n      );\n      earnEndpointCache[operation] = path;\n      return response;\n    } catch (error) {\n      if (is404Error(error)) {\n        continue;\n      }\n      throw error;\n    }\n  }\n  throw earnUnavailableError(operation);\n}\n\nasync function ensureEarnSupported(context: ToolContext): Promise<void> {\n  if (earnCapability === \"supported\") {\n    return;\n  }\n  if (earnCapability === \"unsupported\") {\n    throw earnUnavailableError(\"products\");\n  }\n  try {\n    await callEarnGet(\n      context,\n      \"products\",\n      compactObject({\n        coin: \"USDT\",\n      }),\n      \"earn_probe\",\n    );\n    earnCapability = \"supported\";\n  } catch (error) {\n    if (error instanceof BitgetApiError && error.code === \"EARN_UNAVAILABLE\") {\n      earnCapability = \"unsupported\";\n    }\n    throw error;\n  }\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerEarnTools(): ToolSpec[] {\n  return [\n    {\n      name: \"earn_get_products\",\n      module: \"earn\",\n      description:\n        \"Query available earn products such as savings and staking. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          productType: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        await ensureEarnSupported(context);\n        const response = await callEarnGet(\n          context,\n          \"products\",\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productType: readString(args, \"productType\"),\n          }),\n          \"earn_get_products\",\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"earn_subscribe_redeem\",\n      module: \"earn\",\n      description:\n        \"Subscribe or redeem earn products. [CAUTION] Locks/releases funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"subscribe\", \"redeem\"] },\n          productId: { type: \"string\" },\n          amount: { type: \"string\" },\n          coin: { type: \"string\" },\n        },\n        required: [\"action\", \"productId\", \"amount\", \"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\"subscribe\", \"redeem\"]);\n        await ensureEarnSupported(context);\n        const operation = action === \"subscribe\" ? \"subscribe\" : \"redeem\";\n        const response = await callEarnPost(\n          context,\n          operation,\n          {\n            productId: requireString(args, \"productId\"),\n            amount: requireString(args, \"amount\"),\n            coin: requireString(args, \"coin\"),\n          },\n          \"earn_subscribe_redeem\",\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"earn_get_holdings\",\n      module: \"earn\",\n      description:\n        \"Get current earn holdings and earnings records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          productId: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        await ensureEarnSupported(context);\n        const response = await callEarnGet(\n          context,\n          \"holdings\",\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productId: readString(args, \"productId\"),\n          }),\n          \"earn_get_holdings\",\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\n\nfunction toApiTransferType(accountType: string): string {\n  // Bitget transfer API uses p2p naming for funding wallet.\n  return accountType === \"funding\" ? \"p2p\" : accountType;\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerAccountTools(): ToolSpec[] {\n  return [\n    {\n      name: \"get_account_assets\",\n      module: \"account\",\n      description:\n        \"Get spot/futures/funding/all account balances. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          accountType: {\n            type: \"string\",\n            enum: [\"spot\", \"futures\", \"funding\", \"all\"],\n            description: \"Target account type. Default all.\",\n          },\n          coin: { type: \"string\", description: \"Optional coin filter.\" },\n          productType: {\n            type: \"string\",\n            enum: [...PRODUCT_TYPES],\n            description: \"Required when accountType=futures.\",\n          },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const accountType = readString(args, \"accountType\") ?? \"all\";\n        assertEnum(accountType, \"accountType\", [\"spot\", \"futures\", \"funding\", \"all\"]);\n        const coin = readString(args, \"coin\");\n        const productType = readString(args, \"productType\");\n        if (productType) {\n          assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        }\n        const route =\n          accountType === \"spot\"\n            ? \"/api/v2/spot/account/assets\"\n            : accountType === \"futures\"\n              ? \"/api/v2/mix/account/accounts\"\n              : accountType === \"funding\"\n                ? \"/api/v2/account/funding-assets\"\n                : \"/api/v2/account/all-account-balance\";\n        const response = await context.client.privateGet(\n          route,\n          compactObject({ coin, productType }),\n          privateRateLimit(\"get_account_assets\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_account_bills\",\n      module: \"account\",\n      description:\n        \"Get account bill records for spot or futures account. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          accountType: { type: \"string\", enum: [\"spot\", \"futures\"] },\n          coin: { type: \"string\" },\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          businessType: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const accountType = readString(args, \"accountType\") ?? \"spot\";\n        assertEnum(accountType, \"accountType\", [\"spot\", \"futures\"]);\n        const productType = readString(args, \"productType\");\n        if (productType) {\n          assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        }\n        const route =\n          accountType === \"futures\"\n            ? \"/api/v2/mix/account/bill\"\n            : \"/api/v2/spot/account/bills\";\n        const response = await context.client.privateGet(\n          route,\n          compactObject({\n            coin: readString(args, \"coin\"),\n            productType,\n            businessType: readString(args, \"businessType\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"get_account_bills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"transfer\",\n      module: \"account\",\n      description:\n        \"Transfer funds between accounts or sub-account. [CAUTION] Moves funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          fromAccountType: { type: \"string\" },\n          toAccountType: { type: \"string\" },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          subAccountUid: { type: \"string\" },\n          symbol: { type: \"string\" },\n          clientOid: { type: \"string\" },\n        },\n        required: [\"fromAccountType\", \"toAccountType\", \"coin\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const subAccountUid = readString(args, \"subAccountUid\");\n        const path = subAccountUid\n          ? \"/api/v2/spot/wallet/subaccount-transfer\"\n          : \"/api/v2/spot/wallet/transfer\";\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            fromType: toApiTransferType(requireString(args, \"fromAccountType\")),\n            toType: toApiTransferType(requireString(args, \"toAccountType\")),\n            coin: requireString(args, \"coin\"),\n            amount: requireString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n            clientOid: readString(args, \"clientOid\"),\n            subAccountUid,\n          }),\n          privateRateLimit(\"transfer\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"withdraw\",\n      module: \"account\",\n      description:\n        \"Withdraw funds to external address. [DANGER] Irreversible fund movement. Private endpoint. Rate limit: 1 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          transferType: { type: \"string\", enum: [\"on_chain\", \"internal_transfer\"] },\n          address: { type: \"string\" },\n          chain: { type: \"string\" },\n          amount: { type: \"string\" },\n          tag: { type: \"string\" },\n          clientOid: { type: \"string\" },\n        },\n        required: [\"coin\", \"transferType\", \"address\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const transferType = requireString(args, \"transferType\");\n        assertEnum(transferType, \"transferType\", [\"on_chain\", \"internal_transfer\"]);\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/wallet/withdrawal\",\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            transferType,\n            address: requireString(args, \"address\"),\n            chain: readString(args, \"chain\"),\n            amount: requireString(args, \"amount\"),\n            tag: readString(args, \"tag\"),\n            clientOid: readString(args, \"clientOid\"),\n          }),\n          privateRateLimit(\"withdraw\", 1),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"cancel_withdrawal\",\n      module: \"account\",\n      description:\n        \"Cancel pending withdrawal request by order id. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Withdrawal order id.\" },\n        },\n        required: [\"orderId\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/wallet/cancel-withdrawal\",\n          { orderId: requireString(args, \"orderId\") },\n          privateRateLimit(\"cancel_withdrawal\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_deposit_address\",\n      module: \"account\",\n      description:\n        \"Get deposit address for coin and optional chain. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          coin: { type: \"string\" },\n          chain: { type: \"string\" },\n        },\n        required: [\"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privateGet(\n          \"/api/v2/spot/wallet/deposit-address\",\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            chain: readString(args, \"chain\"),\n          }),\n          privateRateLimit(\"get_deposit_address\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"get_transaction_records\",\n      module: \"account\",\n      description:\n        \"Get deposit, withdrawal, or transfer records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          recordType: {\n            type: \"string\",\n            enum: [\"deposit\", \"withdrawal\", \"transfer\"],\n          },\n          coin: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          orderId: { type: \"string\" },\n        },\n        required: [\"recordType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const recordType = requireString(args, \"recordType\");\n        assertEnum(recordType, \"recordType\", [\"deposit\", \"withdrawal\", \"transfer\"]);\n        const now = Date.now();\n        const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n        const defaultEndTime = String(now);\n        const path =\n          recordType === \"deposit\"\n            ? \"/api/v2/spot/wallet/deposit-records\"\n            : recordType === \"withdrawal\"\n              ? \"/api/v2/spot/wallet/withdrawal-records\"\n              : \"/api/v2/spot/account/sub-main-trans-record\";\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            coin: readString(args, \"coin\"),\n            startTime:\n              recordType === \"deposit\" || recordType === \"transfer\"\n                ? (startTime ?? defaultStartTime)\n                : startTime,\n            endTime:\n              recordType === \"deposit\" || recordType === \"transfer\"\n                ? (endTime ?? defaultEndTime)\n                : endTime,\n            limit: readNumber(args, \"limit\"),\n            orderId: readString(args, \"orderId\"),\n          }),\n          privateRateLimit(\"get_transaction_records\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"manage_subaccounts\",\n      module: \"account\",\n      description:\n        \"Create, modify, list subaccounts and manage subaccount API keys. [CAUTION] Account management operation. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: {\n            type: \"string\",\n            enum: [\n              \"create\",\n              \"modify\",\n              \"list\",\n              \"createApiKey\",\n              \"modifyApiKey\",\n              \"listApiKeys\",\n            ],\n          },\n          subAccountName: { type: \"string\" },\n          subAccountUid: { type: \"string\" },\n          remark: { type: \"string\" },\n          apiKeyPermissions: { type: \"string\" },\n          apiKeyIp: { type: \"string\" },\n          apiKeyPassphrase: { type: \"string\" },\n        },\n        required: [\"action\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\n          \"create\",\n          \"modify\",\n          \"list\",\n          \"createApiKey\",\n          \"modifyApiKey\",\n          \"listApiKeys\",\n        ]);\n        const common = compactObject({\n          subAccountName: readString(args, \"subAccountName\"),\n          subAccountUid: readString(args, \"subAccountUid\"),\n          remark: readString(args, \"remark\"),\n          apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n          apiKeyIp: readString(args, \"apiKeyIp\"),\n          apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n        });\n\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/user/virtual-subaccount-list\",\n            common,\n            privateRateLimit(\"manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n\n        if (action === \"listApiKeys\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/user/virtual-subaccount-apikey-list\",\n            common,\n            privateRateLimit(\"manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/user/create-virtual-subaccount\"\n            : action === \"modify\"\n              ? \"/api/v2/user/modify-virtual-subaccount\"\n              : action === \"createApiKey\"\n                ? \"/api/v2/user/create-virtual-subaccount-apikey\"\n                : \"/api/v2/user/modify-virtual-subaccount-apikey\";\n        const response = await context.client.privatePost(\n          endpoint,\n          common,\n          privateRateLimit(\"manage_subaccounts\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerBrokerTools(): ToolSpec[] {\n  return [\n    {\n      name: \"broker_get_info\",\n      module: \"broker\",\n      description:\n        \"Get broker account information and commission data. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {},\n      },\n      handler: async (_rawArgs, context) => {\n        const response = await context.client.privateGet(\n          \"/api/v2/broker/account/info\",\n          undefined,\n          privateRateLimit(\"broker_get_info\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"broker_manage_subaccounts\",\n      module: \"broker\",\n      description:\n        \"Create, modify, or list broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n          subAccountUid: { type: \"string\" },\n          subAccountName: { type: \"string\" },\n          remark: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"action\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n        const payload = compactObject({\n          subAccountUid: readString(args, \"subAccountUid\"),\n          subAccountName: readString(args, \"subAccountName\"),\n          remark: readString(args, \"remark\"),\n          limit: readNumber(args, \"limit\"),\n        });\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/broker/account/subaccount-list\",\n            payload,\n            privateRateLimit(\"broker_manage_subaccounts\", 5),\n          );\n          return normalize(response);\n        }\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/broker/account/create-subaccount\"\n            : \"/api/v2/broker/account/modify-subaccount\";\n        const response = await context.client.privatePost(\n          endpoint,\n          payload,\n          privateRateLimit(\"broker_manage_subaccounts\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"broker_manage_apikeys\",\n      module: \"broker\",\n      description:\n        \"Create, modify, or list API keys for broker subaccounts. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: { type: \"string\", enum: [\"create\", \"modify\", \"list\"] },\n          subAccountUid: { type: \"string\" },\n          apiKeyPermissions: { type: \"string\" },\n          apiKeyIp: { type: \"string\" },\n          apiKeyPassphrase: { type: \"string\" },\n        },\n        required: [\"action\", \"subAccountUid\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const action = requireString(args, \"action\");\n        const subAccountUid = requireString(args, \"subAccountUid\");\n        assertEnum(action, \"action\", [\"create\", \"modify\", \"list\"]);\n        const payload = compactObject({\n          subAccountUid,\n          apiKeyPermissions: readString(args, \"apiKeyPermissions\"),\n          apiKeyIp: readString(args, \"apiKeyIp\"),\n          apiKeyPassphrase: readString(args, \"apiKeyPassphrase\"),\n        });\n        if (action === \"list\") {\n          const response = await context.client.privateGet(\n            \"/api/v2/broker/account/subaccount-apikey-list\",\n            payload,\n            privateRateLimit(\"broker_manage_apikeys\", 5),\n          );\n          return normalize(response);\n        }\n        const endpoint =\n          action === \"create\"\n            ? \"/api/v2/broker/account/create-subaccount-apikey\"\n            : \"/api/v2/broker/account/modify-subaccount-apikey\";\n        const response = await context.client.privatePost(\n          endpoint,\n          payload,\n          privateRateLimit(\"broker_manage_apikeys\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readNumber,\n  readString,\n  readStringArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerConvertTools(): ToolSpec[] {\n  return [\n    {\n      name: \"convert_get_quote\",\n      module: \"convert\",\n      description:\n        \"Get supported convert currencies or quoted conversion price. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          fromCoin: { type: \"string\" },\n          toCoin: { type: \"string\" },\n          fromCoinAmount: { type: \"string\" },\n          toCoinAmount: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const fromCoin = readString(args, \"fromCoin\");\n        const path = fromCoin\n          ? \"/api/v2/convert/quoted-price\"\n          : \"/api/v2/convert/currencies\";\n        const fromCoinSize = readString(args, \"fromCoinAmount\");\n        const toCoinSize = readString(args, \"toCoinAmount\");\n        if (fromCoin && toCoinSize && fromCoinSize) {\n          throw new ValidationError(\n            'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n          );\n        }\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            fromCoin,\n            toCoin: readString(args, \"toCoin\"),\n            fromCoinSize,\n            toCoinSize,\n          }),\n          privateRateLimit(\"convert_get_quote\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"convert_execute\",\n      module: \"convert\",\n      description:\n        \"Execute normal conversion or BGB small balance sweep. [CAUTION] Converts funds. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n          fromCoin: { type: \"string\" },\n          toCoin: { type: \"string\" },\n          fromCoinAmount: { type: \"string\" },\n          toCoinAmount: { type: \"string\" },\n          traceId: { type: \"string\" },\n          coinList: { type: \"array\", items: { type: \"string\" } },\n        },\n        required: [\"fromCoin\", \"toCoin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"normal\";\n        assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n        const path =\n          type === \"bgb\"\n            ? \"/api/v2/convert/bgb-convert\"\n            : \"/api/v2/convert/trade\";\n\n        if (type === \"bgb\") {\n          const response = await context.client.privatePost(\n            path,\n            compactObject({\n              coinList: readStringArray(args, \"coinList\"),\n              traceId: readString(args, \"traceId\") ?? `mcp-${Date.now()}`,\n            }),\n            privateRateLimit(\"convert_execute\", 5),\n          );\n          return normalize(response);\n        }\n\n        ensureOneOf(\n          args,\n          [\"fromCoinAmount\", \"toCoinAmount\"],\n          'Provide one of \"fromCoinAmount\" or \"toCoinAmount\" for normal conversion.',\n        );\n        const fromCoin = requireString(args, \"fromCoin\");\n        const toCoin = requireString(args, \"toCoin\");\n        const fromCoinSize = readString(args, \"fromCoinAmount\");\n        const toCoinSize = readString(args, \"toCoinAmount\");\n        if (fromCoinSize && toCoinSize) {\n          throw new ValidationError(\n            'Provide only one of \"fromCoinAmount\" or \"toCoinAmount\".',\n          );\n        }\n\n        const quoted = await context.client.privateGet<{\n          fromCoin: string;\n          fromCoinSize: string;\n          toCoin: string;\n          toCoinSize: string;\n          cnvtPrice: string;\n          traceId: string;\n        }>(\n          \"/api/v2/convert/quoted-price\",\n          compactObject({ fromCoin, toCoin, fromCoinSize, toCoinSize }),\n          privateRateLimit(\"convert_execute_quote\", 10),\n        );\n        const quoteData = quoted.data;\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            fromCoin: quoteData.fromCoin,\n            toCoin: quoteData.toCoin,\n            fromCoinSize: quoteData.fromCoinSize,\n            toCoinSize: quoteData.toCoinSize,\n            cnvtPrice: quoteData.cnvtPrice,\n            traceId: quoteData.traceId,\n          }),\n          privateRateLimit(\"convert_execute\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"convert_get_history\",\n      module: \"convert\",\n      description:\n        \"Get conversion or BGB sweep history. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: { type: \"string\", enum: [\"normal\", \"bgb\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"normal\";\n        assertEnum(type, \"type\", [\"normal\", \"bgb\"]);\n        const now = Date.now();\n        const defaultStartTime = String(now - 7 * 24 * 60 * 60 * 1000);\n        const defaultEndTime = String(now);\n        const path =\n          type === \"bgb\"\n            ? \"/api/v2/convert/bgb-convert-records\"\n            : \"/api/v2/convert/convert-record\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            startTime:\n              type === \"normal\"\n                ? (readString(args, \"startTime\") ?? defaultStartTime)\n                : readString(args, \"startTime\"),\n            endTime:\n              type === \"normal\"\n                ? (readString(args, \"endTime\") ?? defaultEndTime)\n                : readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"convert_get_history\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readBoolean,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { BitgetApiError, ValidationError } from \"../utils/errors.js\";\n\nconst COPY_PRODUCT_TYPES = [...PRODUCT_TYPES, \"SPOT\"] as const;\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nfunction isSpot(productType: string): boolean {\n  return productType === \"SPOT\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction extractTraderRows(data: unknown): Record<string, unknown>[] {\n  if (Array.isArray(data)) {\n    return data.filter(isRecord);\n  }\n  if (!isRecord(data)) {\n    return [];\n  }\n  const keys = [\"list\", \"rows\", \"resultList\", \"traderList\", \"data\"];\n  for (const key of keys) {\n    const value = data[key];\n    if (Array.isArray(value)) {\n      return value.filter(isRecord);\n    }\n    if (isRecord(value)) {\n      const nested = extractTraderRows(value);\n      if (nested.length > 0) {\n        return nested;\n      }\n    }\n  }\n  return [];\n}\n\nfunction toNumber(value: unknown): number {\n  if (typeof value === \"number\" && Number.isFinite(value)) {\n    return value;\n  }\n  if (typeof value === \"string\") {\n    const parsed = Number(value);\n    if (Number.isFinite(parsed)) {\n      return parsed;\n    }\n  }\n  return 0;\n}\n\nfunction traderScore(row: Record<string, unknown>): number {\n  const keys = [\n    \"followerNum\",\n    \"followerCount\",\n    \"copyCount\",\n    \"winRate\",\n    \"profitRate\",\n    \"aum\",\n  ];\n  return keys.reduce((acc, key) => acc + toNumber(row[key]), 0);\n}\n\nfunction traderIdFromRow(\n  row: Record<string, unknown>,\n  productType: string,\n): string | undefined {\n  const idKeys = isSpot(productType)\n    ? [\"traderUserId\", \"traderId\", \"uid\", \"userId\"]\n    : [\"traderId\", \"traderUserId\", \"uid\", \"userId\"];\n  for (const key of idKeys) {\n    const value = row[key];\n    if (typeof value === \"string\" && value.length > 0) {\n      return value;\n    }\n    if (typeof value === \"number\") {\n      return String(value);\n    }\n  }\n  return undefined;\n}\n\nfunction selectTrader(\n  rows: Record<string, unknown>[],\n  productType: string,\n  selectionPolicy: string,\n): { traderId: string; row: Record<string, unknown> } | null {\n  const candidates = rows\n    .map((row) => ({\n      traderId: traderIdFromRow(row, productType),\n      row,\n      score: traderScore(row),\n    }))\n    .filter(\n      (\n        item,\n      ): item is {\n        traderId: string;\n        row: Record<string, unknown>;\n        score: number;\n      } => Boolean(item.traderId),\n    );\n  if (candidates.length === 0) {\n    return null;\n  }\n  if (selectionPolicy === \"stable\") {\n    candidates.sort((a, b) => b.score - a.score || a.traderId.localeCompare(b.traderId));\n  }\n  const best = candidates[0];\n  if (!best) {\n    return null;\n  }\n  return {\n    traderId: best.traderId,\n    row: best.row,\n  };\n}\n\nexport function registerCopyTradingTools(): ToolSpec[] {\n  return [\n    {\n      name: \"copy_get_traders\",\n      module: \"copytrading\",\n      description:\n        \"Get copy-trading trader list and configuration candidates. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: {\n            type: \"string\",\n            enum: [...COPY_PRODUCT_TYPES],\n            description: \"Copy trading market type.\",\n          },\n          symbol: { type: \"string\", description: \"Optional symbol filter for spot copy.\" },\n          limit: { type: \"number\", description: \"Page size, default 20.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const symbol = readString(args, \"symbol\");\n        const limit = readNumber(args, \"limit\");\n        const path = isSpot(productType)\n          ? \"/api/v2/copy/spot-follower/query-traders\"\n          : \"/api/v2/copy/mix-follower/query-traders\";\n        const query = isSpot(productType)\n          ? compactObject({ symbol, limit })\n          : compactObject({ productType, symbol, limit });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_traders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_place_order\",\n      module: \"copytrading\",\n      description:\n        \"Create or update copy-trading follow settings. [CAUTION] Changes copy-trading behavior. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          traderId: {\n            type: \"string\",\n            description:\n              \"Required trader id. For spot copy this is traderUserId. For futures copy this is traderId.\",\n          },\n          symbol: { type: \"string\", description: \"Optional symbol for spot copy settings.\" },\n          leverageType: {\n            type: \"string\",\n            enum: [\"position\", \"contract\"],\n            description: \"Futures copy leverage type. Default position.\",\n          },\n          traceType: {\n            type: \"string\",\n            enum: [\"amount\", \"ratio\"],\n            description: \"Futures copy size mode. Default amount.\",\n          },\n          marginType: {\n            type: \"string\",\n            enum: [\"cross\", \"isolated\"],\n            description: \"Futures margin type. Default cross.\",\n          },\n          amount: {\n            type: \"string\",\n            description: \"Trace amount (for amount mode).\",\n          },\n          ratio: {\n            type: \"string\",\n            description: \"Trace ratio (for ratio mode).\",\n          },\n          autoSelectTrader: {\n            type: \"boolean\",\n            description:\n              \"When true (or traderId omitted), auto-select trader from query-traders list.\",\n          },\n          selectionPolicy: {\n            type: \"string\",\n            enum: [\"recommended\", \"stable\"],\n            description: \"Trader auto-selection policy. Default recommended.\",\n          },\n          dryRun: {\n            type: \"boolean\",\n            description:\n              \"When true, resolve trader and return payload preview without sending write request.\",\n          },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = readString(args, \"productType\") ?? \"USDT-FUTURES\";\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const requestedTraderId = readString(args, \"traderId\");\n        const autoSelectTrader =\n          readBoolean(args, \"autoSelectTrader\") ?? !requestedTraderId;\n        const selectionPolicy = readString(args, \"selectionPolicy\") ?? \"recommended\";\n        assertEnum(selectionPolicy, \"selectionPolicy\", [\"recommended\", \"stable\"]);\n        const dryRun = readBoolean(args, \"dryRun\") ?? false;\n\n        let resolvedTraderId = requestedTraderId;\n        let selectedTrader: Record<string, unknown> | null = null;\n        let candidateCount = 0;\n\n        if (!resolvedTraderId && autoSelectTrader) {\n          const tradersPath = isSpot(productType)\n            ? \"/api/v2/copy/spot-follower/query-traders\"\n            : \"/api/v2/copy/mix-follower/query-traders\";\n          const tradersResponse = await context.client.privateGet(\n            tradersPath,\n            isSpot(productType)\n              ? compactObject({\n                  symbol: readString(args, \"symbol\"),\n                  limit: 20,\n                })\n              : compactObject({\n                  productType,\n                  symbol: readString(args, \"symbol\"),\n                  limit: 20,\n                }),\n            privateRateLimit(\"copy_place_order_select\", 10),\n          );\n          const rows = extractTraderRows(tradersResponse.data);\n          candidateCount = rows.length;\n          const picked = selectTrader(rows, productType, selectionPolicy);\n          if (!picked) {\n            throw new BitgetApiError(\n              \"No available copy traders found for auto selection.\",\n              {\n                code: \"COPY_TRADER_NOT_FOUND\",\n                suggestion:\n                  \"Call copy_get_traders and pass traderId explicitly, or switch productType.\",\n              },\n            );\n          }\n          resolvedTraderId = picked.traderId;\n          selectedTrader = picked.row;\n        }\n\n        if (!resolvedTraderId) {\n          throw new ValidationError(\n            'Missing \"traderId\". Provide traderId or set autoSelectTrader=true.',\n          );\n        }\n\n        if (isSpot(productType)) {\n          const payload = compactObject({\n            traderUserId: resolvedTraderId,\n            symbol: readString(args, \"symbol\"),\n          });\n          if (dryRun) {\n            return {\n              endpoint: \"DRY_RUN POST /api/v2/copy/spot-follower/settings\",\n              requestTime: new Date().toISOString(),\n              data: {\n                dryRun: true,\n                payload,\n                requestedTraderId: requestedTraderId ?? null,\n                resolvedTraderId,\n                autoSelected: !requestedTraderId,\n                selectionPolicy,\n                candidateCount,\n                selectedTrader,\n              },\n            };\n          }\n          const response = await context.client.privatePost(\n            \"/api/v2/copy/spot-follower/settings\",\n            payload,\n            privateRateLimit(\"copy_place_order\", 10),\n          );\n          return {\n            ...normalize(response),\n            selection: {\n              requestedTraderId: requestedTraderId ?? null,\n              resolvedTraderId,\n              autoSelected: !requestedTraderId,\n              selectionPolicy,\n              candidateCount,\n              selectedTrader,\n            },\n          };\n        }\n\n        const symbol = readString(args, \"symbol\");\n        if (!symbol) {\n          throw new ValidationError(\n            'Parameter \"symbol\" is required for futures copy settings.',\n          );\n        }\n\n        const payload = {\n          traderId: resolvedTraderId,\n          productType,\n          settings: [\n            compactObject({\n              traderId: resolvedTraderId,\n              symbol,\n              leverType: readString(args, \"leverageType\") ?? \"position\",\n              traceType: readString(args, \"traceType\") ?? \"amount\",\n              marginType: readString(args, \"marginType\") ?? \"cross\",\n              amount: readString(args, \"amount\") ?? \"10\",\n              ratio: readString(args, \"ratio\"),\n            }),\n          ],\n        };\n        if (dryRun) {\n          return {\n            endpoint: \"DRY_RUN POST /api/v2/copy/mix-follower/settings\",\n            requestTime: new Date().toISOString(),\n            data: {\n              dryRun: true,\n              payload,\n              requestedTraderId: requestedTraderId ?? null,\n              resolvedTraderId,\n              autoSelected: !requestedTraderId,\n              selectionPolicy,\n              candidateCount,\n              selectedTrader,\n            },\n          };\n        }\n\n        const response = await context.client.privatePost(\n          \"/api/v2/copy/mix-follower/settings\",\n          payload,\n          privateRateLimit(\"copy_place_order\", 10),\n        );\n        return {\n          ...normalize(response),\n          selection: {\n            requestedTraderId: requestedTraderId ?? null,\n            resolvedTraderId,\n            autoSelected: !requestedTraderId,\n            selectionPolicy,\n            candidateCount,\n            selectedTrader,\n          },\n        };\n      },\n    },\n    {\n      name: \"copy_close_position\",\n      module: \"copytrading\",\n      description:\n        \"Close copy-trading follower position (futures). [CAUTION] Closes positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          subPosId: {\n            type: \"string\",\n            description: \"Tracking number (maps to trackingNo).\",\n          },\n          marginCoin: { type: \"string\" },\n          marginMode: { type: \"string\", enum: [\"cross\", \"isolated\"] },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.privatePost(\n          \"/api/v2/copy/mix-follower/close-positions\",\n          compactObject({\n            productType,\n            symbol: requireString(args, \"symbol\"),\n            trackingNo: readString(args, \"subPosId\"),\n            marginCoin: readString(args, \"marginCoin\"),\n            marginMode: readString(args, \"marginMode\"),\n            holdSide: readString(args, \"holdSide\"),\n          }),\n          privateRateLimit(\"copy_close_position\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_get_orders\",\n      module: \"copytrading\",\n      description:\n        \"Query copy-trading historical orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          traderId: { type: \"string\", description: \"Optional trader id filter.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const path = isSpot(productType)\n          ? \"/api/v2/copy/spot-follower/query-history-orders\"\n          : \"/api/v2/copy/mix-follower/query-history-orders\";\n        const query = isSpot(productType)\n          ? compactObject({\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n            })\n          : compactObject({\n              productType,\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n              traderId: readString(args, \"traderId\"),\n            });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"copy_get_positions\",\n      module: \"copytrading\",\n      description:\n        \"Get current or historical copy-trading positions/orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...COPY_PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          history: { type: \"boolean\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n          traderId: { type: \"string\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const history = readBoolean(args, \"history\") ?? false;\n        assertEnum(productType, \"productType\", COPY_PRODUCT_TYPES);\n        const path = isSpot(productType)\n          ? history\n            ? \"/api/v2/copy/spot-follower/query-history-orders\"\n            : \"/api/v2/copy/spot-follower/query-current-orders\"\n          : history\n            ? \"/api/v2/copy/mix-follower/query-history-orders\"\n            : \"/api/v2/copy/mix-follower/query-current-orders\";\n        const query = isSpot(productType)\n          ? compactObject({\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n            })\n          : compactObject({\n              productType,\n              symbol: readString(args, \"symbol\"),\n              startTime: readString(args, \"startTime\"),\n              endTime: readString(args, \"endTime\"),\n              limit: readNumber(args, \"limit\"),\n              traderId: readString(args, \"traderId\"),\n            });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"copy_get_positions\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readBoolean,\n  readNumber,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { GRANULARITIES, PRODUCT_TYPES, publicRateLimit } from \"./common.js\";\n\nconst FUTURES_GRANULARITY_MAP: Record<string, string> = {\n  \"1min\": \"1m\",\n  \"5min\": \"5m\",\n  \"15min\": \"15m\",\n  \"30min\": \"30m\",\n  \"1h\": \"1H\",\n  \"4h\": \"4H\",\n  \"6h\": \"6H\",\n  \"12h\": \"12H\",\n  \"1day\": \"1D\",\n  \"3day\": \"3D\",\n  \"1week\": \"1W\",\n  \"1M\": \"1M\",\n};\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerFuturesMarketTools(): ToolSpec[] {\n  return [\n    {\n      name: \"futures_get_ticker\",\n      module: \"futures\",\n      description:\n        \"Get futures ticker for one symbol or all symbols in product type. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: {\n            type: \"string\",\n            enum: [...PRODUCT_TYPES],\n            description: \"Futures product type.\",\n          },\n          symbol: { type: \"string\", description: \"Contract symbol, e.g. BTCUSDT.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const symbol = readString(args, \"symbol\");\n        const path = symbol\n          ? \"/api/v2/mix/market/ticker\"\n          : \"/api/v2/mix/market/tickers\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ productType, symbol }),\n          publicRateLimit(\"futures_get_ticker\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_depth\",\n      module: \"futures\",\n      description:\n        \"Get futures orderbook depth with precision levels. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\", description: \"Contract symbol.\" },\n          limit: { type: \"number\", description: \"Depth levels, default 100.\" },\n          precision: { type: \"string\", description: \"Merge precision value.\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/merge-depth\",\n          compactObject({\n            productType,\n            symbol,\n            limit: readNumber(args, \"limit\"),\n            precision: readString(args, \"precision\"),\n          }),\n          publicRateLimit(\"futures_get_depth\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_candles\",\n      module: \"futures\",\n      description:\n        \"Get futures candles from trade/index/mark price sources. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          granularity: { type: \"string\", enum: [...GRANULARITIES] },\n          priceType: {\n            type: \"string\",\n            enum: [\"trade\", \"index\", \"mark\"],\n            description: \"trade(default), index, or mark.\",\n          },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\", \"symbol\", \"granularity\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const granularity = requireString(args, \"granularity\");\n        const priceType = readString(args, \"priceType\") ?? \"trade\";\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        assertEnum(granularity, \"granularity\", GRANULARITIES);\n        assertEnum(priceType, \"priceType\", [\"trade\", \"index\", \"mark\"]);\n        const apiGranularity = FUTURES_GRANULARITY_MAP[granularity] ?? granularity;\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const path =\n          priceType === \"index\"\n            ? \"/api/v2/mix/market/history-index-candles\"\n            : priceType === \"mark\"\n              ? \"/api/v2/mix/market/history-mark-candles\"\n              : startTime\n                ? \"/api/v2/mix/market/history-candles\"\n                : \"/api/v2/mix/market/candles\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            granularity: apiGranularity,\n            startTime,\n            endTime,\n            limit,\n          }),\n          publicRateLimit(\"futures_get_candles\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_trades\",\n      module: \"futures\",\n      description:\n        \"Get recent or historical futures trade records. Public endpoint. Rate limit: 10 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          limit: { type: \"number\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const startTime = readString(args, \"startTime\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = startTime\n          ? \"/api/v2/mix/market/fills-history\"\n          : \"/api/v2/mix/market/fills\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            limit: readNumber(args, \"limit\"),\n            startTime,\n            endTime: readString(args, \"endTime\"),\n          }),\n          publicRateLimit(\"futures_get_trades\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_contracts\",\n      module: \"futures\",\n      description:\n        \"Get futures contract configuration details. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\", description: \"Optional symbol filter.\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/contracts\",\n          compactObject({\n            productType,\n            symbol: readString(args, \"symbol\"),\n          }),\n          publicRateLimit(\"futures_get_contracts\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_funding_rate\",\n      module: \"futures\",\n      description:\n        \"Get current or historical funding rates for a futures symbol. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          history: { type: \"boolean\", description: \"true for historical funding rates.\" },\n          pageSize: { type: \"number\", description: \"Page size for history mode.\" },\n          pageNo: { type: \"number\", description: \"Page number for history mode.\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const history = readBoolean(args, \"history\") ?? false;\n        if (history) {\n          const historyResponse = await context.client.publicGet(\n            \"/api/v2/mix/market/history-fund-rate\",\n            compactObject({\n              productType,\n              symbol,\n              pageSize: readNumber(args, \"pageSize\"),\n              pageNo: readNumber(args, \"pageNo\"),\n            }),\n            publicRateLimit(\"futures_get_funding_rate\", 20),\n          );\n          return normalize(historyResponse);\n        }\n\n        const [currentRate, fundingTime] = await Promise.all([\n          context.client.publicGet(\n            \"/api/v2/mix/market/current-fund-rate\",\n            compactObject({ productType, symbol }),\n            publicRateLimit(\"futures_get_funding_rate_current\", 20),\n          ),\n          context.client.publicGet(\n            \"/api/v2/mix/market/funding-time\",\n            compactObject({ productType, symbol }),\n            publicRateLimit(\"futures_get_funding_rate_time\", 20),\n          ),\n        ]);\n\n        return {\n          endpoint: `${currentRate.endpoint} + ${fundingTime.endpoint}`,\n          requestTime: new Date().toISOString(),\n          data: {\n            currentFundRate: currentRate.data,\n            fundingTime: fundingTime.data,\n          },\n        };\n      },\n    },\n    {\n      name: \"futures_get_open_interest\",\n      module: \"futures\",\n      description:\n        \"Get open interest for a futures contract. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.publicGet(\n          \"/api/v2/mix/market/open-interest\",\n          compactObject({ productType, symbol }),\n          publicRateLimit(\"futures_get_open_interest\", 20),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readObjectArray,\n  readString,\n  readStringArray,\n  requireObjectArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit, PRODUCT_TYPES } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerFuturesTradeTools(): ToolSpec[] {\n  return [\n    {\n      name: \"futures_place_order\",\n      module: \"futures\",\n      description:\n        \"Place one or more futures orders with optional TP/SL. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orders: {\n            type: \"array\",\n            description: \"Array of futures order objects.\",\n            items: { type: \"object\" },\n          },\n        },\n        required: [\"orders\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orders = requireObjectArray(args, \"orders\");\n        if (orders.length > 50) {\n          throw new ValidationError(\"orders supports at most 50 items.\");\n        }\n        const normalizedOrders = orders.map((order) => {\n          const orderType = readString(order, \"orderType\");\n          return compactObject({\n            ...order,\n            marginMode: readString(order, \"marginMode\") ?? \"crossed\",\n            force:\n              readString(order, \"force\") ??\n              (orderType === \"limit\" ? \"gtc\" : undefined),\n          });\n        });\n        const isSingle = orders.length === 1;\n        const path = isSingle\n          ? \"/api/v2/mix/order/place-order\"\n          : \"/api/v2/mix/order/batch-place-order\";\n        const first = normalizedOrders.at(0);\n        if (!first) {\n          throw new ValidationError(\"orders cannot be empty.\");\n        }\n        let body: Record<string, unknown>;\n        if (isSingle) {\n          body = first;\n        } else {\n          const shared = {\n            symbol: readString(first, \"symbol\"),\n            productType: readString(first, \"productType\"),\n            marginCoin: readString(first, \"marginCoin\"),\n            marginMode: readString(first, \"marginMode\") ?? \"crossed\",\n          };\n          const isSameKey = normalizedOrders.every(\n            (order) =>\n              readString(order, \"symbol\") === shared.symbol &&\n              readString(order, \"productType\") === shared.productType &&\n              readString(order, \"marginCoin\") === shared.marginCoin &&\n              (readString(order, \"marginMode\") ?? \"crossed\") ===\n                shared.marginMode,\n          );\n          if (!isSameKey) {\n            throw new ValidationError(\n              \"Batch futures orders must share symbol, productType, marginCoin, and marginMode.\",\n            );\n          }\n          body = {\n            symbol: shared.symbol,\n            productType: shared.productType,\n            marginCoin: shared.marginCoin,\n            marginMode: shared.marginMode,\n            orderList: normalizedOrders.map((order) => {\n              const { symbol, productType, marginCoin, marginMode, ...rest } = order;\n              void symbol;\n              void productType;\n              void marginCoin;\n              void marginMode;\n              return rest;\n            }),\n          };\n        }\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"futures_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_cancel_orders\",\n      module: \"futures\",\n      description:\n        \"Cancel futures orders by order id, batch ids, or cancel-all mode. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          orderIds: { type: \"array\", items: { type: \"string\" } },\n          cancelAll: { type: \"boolean\" },\n          marginCoin: { type: \"string\" },\n        },\n        required: [\"productType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = requireString(args, \"symbol\");\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const cancelAll = readBoolean(args, \"cancelAll\");\n        const marginCoin = readString(args, \"marginCoin\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"cancelAll\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const { path, body } = orderId\n          ? {\n              path: \"/api/v2/mix/order/cancel-order\",\n              body: { productType, symbol, orderId },\n            }\n          : orderIds\n            ? {\n                path: \"/api/v2/mix/order/batch-cancel-orders\",\n                body: { productType, symbol, orderIds },\n              }\n            : {\n                path: \"/api/v2/mix/order/cancel-all-orders\",\n                body: compactObject({ productType, symbol, marginCoin }),\n              };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"futures_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_orders\",\n      module: \"futures\",\n      description:\n        \"Query futures orders by id, open status, or history. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          orderId: { type: \"string\" },\n          symbol: { type: \"string\" },\n          status: { type: \"string\", enum: [\"open\", \"history\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const orderId = readString(args, \"orderId\");\n        const symbol = readString(args, \"symbol\");\n        const status = readString(args, \"status\") ?? \"open\";\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = orderId\n          ? \"/api/v2/mix/order/detail\"\n          : status === \"history\"\n            ? \"/api/v2/mix/order/orders-history\"\n            : \"/api/v2/mix/order/orders-pending\";\n        const query = compactObject({\n          productType,\n          orderId,\n          symbol,\n          startTime: readString(args, \"startTime\"),\n          endTime: readString(args, \"endTime\"),\n          limit: readNumber(args, \"limit\"),\n        });\n        const response = await context.client.privateGet(\n          path,\n          query,\n          privateRateLimit(\"futures_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_fills\",\n      module: \"futures\",\n      description:\n        \"Get futures fills and fill history records. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const startTime = readString(args, \"startTime\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = startTime\n          ? \"/api/v2/mix/order/fill-history\"\n          : \"/api/v2/mix/order/fills\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            productType,\n            symbol: readString(args, \"symbol\"),\n            orderId: readString(args, \"orderId\"),\n            startTime,\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"futures_get_fills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_get_positions\",\n      module: \"futures\",\n      description:\n        \"Get current or historical futures positions. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          history: { type: \"boolean\" },\n        },\n        required: [\"productType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const symbol = readString(args, \"symbol\");\n        const history = readBoolean(args, \"history\") ?? false;\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const path = history\n          ? \"/api/v2/mix/position/history-position\"\n          : symbol\n            ? \"/api/v2/mix/position/single-position\"\n            : \"/api/v2/mix/position/all-position\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            productType,\n            symbol,\n            marginCoin:\n              readString(args, \"marginCoin\") ?? (symbol ? \"USDT\" : undefined),\n          }),\n          privateRateLimit(\"futures_get_positions\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_set_leverage\",\n      module: \"futures\",\n      description:\n        \"Set futures leverage for symbol and margin coin. [CAUTION] Affects risk exposure. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          leverage: { type: \"string\" },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\", \"marginCoin\", \"leverage\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        const response = await context.client.privatePost(\n          \"/api/v2/mix/account/set-leverage\",\n          compactObject({\n            productType,\n            symbol: requireString(args, \"symbol\"),\n            marginCoin: requireString(args, \"marginCoin\"),\n            leverage: requireString(args, \"leverage\"),\n            holdSide: readString(args, \"holdSide\"),\n          }),\n          privateRateLimit(\"futures_set_leverage\", 5),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"futures_update_config\",\n      module: \"futures\",\n      description:\n        \"Update futures margin mode, position mode, or auto-margin setting. [CAUTION] Affects trading behavior. Private endpoint. Rate limit: 5 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          productType: { type: \"string\", enum: [...PRODUCT_TYPES] },\n          symbol: { type: \"string\" },\n          marginCoin: { type: \"string\" },\n          setting: {\n            type: \"string\",\n            enum: [\"marginMode\", \"positionMode\", \"autoMargin\"],\n          },\n          value: { type: \"string\" },\n          holdSide: { type: \"string\", enum: [\"long\", \"short\"] },\n        },\n        required: [\"productType\", \"symbol\", \"marginCoin\", \"setting\", \"value\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const productType = requireString(args, \"productType\");\n        const setting = requireString(args, \"setting\");\n        assertEnum(productType, \"productType\", PRODUCT_TYPES);\n        assertEnum(setting, \"setting\", [\"marginMode\", \"positionMode\", \"autoMargin\"]);\n        const endpoint =\n          setting === \"marginMode\"\n            ? \"/api/v2/mix/account/set-margin-mode\"\n            : setting === \"positionMode\"\n              ? \"/api/v2/mix/account/set-position-mode\"\n              : \"/api/v2/mix/account/set-auto-margin\";\n        const response = await context.client.privatePost(\n          endpoint,\n          setting === \"marginMode\"\n            ? compactObject({\n                productType,\n                symbol: requireString(args, \"symbol\"),\n                marginCoin: requireString(args, \"marginCoin\"),\n                marginMode: requireString(args, \"value\"),\n              })\n            : setting === \"positionMode\"\n              ? compactObject({\n                  productType,\n                  symbol: requireString(args, \"symbol\"),\n                  marginCoin: requireString(args, \"marginCoin\"),\n                  posMode: requireString(args, \"value\"),\n                })\n              : compactObject({\n                  productType,\n                  symbol: requireString(args, \"symbol\"),\n                  marginCoin: requireString(args, \"marginCoin\"),\n                  autoMargin: requireString(args, \"value\"),\n                  holdSide: readString(args, \"holdSide\"),\n                }),\n          privateRateLimit(\"futures_update_config\", 5),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readString,\n  readStringArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nconst MARGIN_TYPES = [\"crossed\", \"isolated\"] as const;\n\nfunction marginPath(marginType: string, suffix: string): string {\n  const scope = marginType === \"crossed\" ? \"crossed\" : \"isolated\";\n  return `/api/v2/margin/${scope}/${suffix}`;\n}\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerMarginTools(): ToolSpec[] {\n  return [\n    {\n      name: \"margin_get_assets\",\n      module: \"margin\",\n      description:\n        \"Get crossed or isolated margin assets and risk metrics. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          coin: { type: \"string\" },\n        },\n        required: [\"marginType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privateGet(\n          marginPath(marginType, \"account/assets\"),\n          compactObject({\n            symbol: readString(args, \"symbol\"),\n            coin: readString(args, \"coin\"),\n          }),\n          privateRateLimit(\"margin_get_assets\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_borrow\",\n      module: \"margin\",\n      description:\n        \"Borrow margin funds. [CAUTION] Creates debt. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          symbol: { type: \"string\" },\n        },\n        required: [\"marginType\", \"coin\", \"amount\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privatePost(\n          marginPath(marginType, \"account/borrow\"),\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            borrowAmount: requireString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n          }),\n          privateRateLimit(\"margin_borrow\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_repay\",\n      module: \"margin\",\n      description:\n        \"Repay margin debt with optional flash repay. [CAUTION] Uses account funds. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          coin: { type: \"string\" },\n          amount: { type: \"string\" },\n          symbol: { type: \"string\" },\n          flashRepay: { type: \"boolean\" },\n        },\n        required: [\"marginType\", \"coin\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const flashRepay = readBoolean(args, \"flashRepay\") ?? false;\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const path = flashRepay\n          ? marginPath(marginType, \"account/flash-repay\")\n          : marginPath(marginType, \"account/repay\");\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            coin: requireString(args, \"coin\"),\n            repayAmount: readString(args, \"amount\"),\n            symbol: readString(args, \"symbol\"),\n          }),\n          privateRateLimit(\"margin_repay\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_place_order\",\n      module: \"margin\",\n      description:\n        \"Place margin order in crossed or isolated mode. [CAUTION] Executes real trade. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          side: { type: \"string\", enum: [\"buy\", \"sell\"] },\n          orderType: { type: \"string\", enum: [\"limit\", \"market\"] },\n          price: { type: \"string\" },\n          size: { type: \"string\" },\n          loanType: {\n            type: \"string\",\n            enum: [\"normal\", \"autoLoan\", \"autoRepay\", \"autoLoanAndRepay\"],\n          },\n        },\n        required: [\"marginType\", \"symbol\", \"side\", \"orderType\", \"size\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const response = await context.client.privatePost(\n          marginPath(marginType, \"place-order\"),\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            side: requireString(args, \"side\"),\n            orderType: requireString(args, \"orderType\"),\n            price: readString(args, \"price\"),\n            baseSize: requireString(args, \"size\"),\n            loanType: readString(args, \"loanType\") ?? \"normal\",\n            force: \"gtc\",\n          }),\n          privateRateLimit(\"margin_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_cancel_orders\",\n      module: \"margin\",\n      description:\n        \"Cancel one or more margin orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          orderIds: { type: \"array\", items: { type: \"string\" } },\n        },\n        required: [\"marginType\", \"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const symbol = requireString(args, \"symbol\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\"],\n          'Provide one of \"orderId\" or \"orderIds\".',\n        );\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const path = orderId\n          ? marginPath(marginType, \"cancel-order\")\n          : marginPath(marginType, \"batch-cancel-order\");\n        const response = await context.client.privatePost(\n          path,\n          orderId\n            ? compactObject({ symbol, orderId })\n            : {\n                symbol,\n                orderIdList: (orderIds ?? []).map((id) => ({ orderId: id })),\n              },\n          privateRateLimit(\"margin_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_get_orders\",\n      module: \"margin\",\n      description:\n        \"Query margin orders (open/history/order detail). Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          symbol: { type: \"string\" },\n          orderId: { type: \"string\" },\n          status: { type: \"string\", enum: [\"open\", \"history\"] },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"marginType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        const orderId = readString(args, \"orderId\");\n        const status = readString(args, \"status\") ?? \"open\";\n        const path =\n          status === \"history\" || orderId\n            ? marginPath(marginType, \"history-orders\")\n            : marginPath(marginType, \"open-orders\");\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            symbol: readString(args, \"symbol\"),\n            orderId,\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"margin_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"margin_get_records\",\n      module: \"margin\",\n      description:\n        \"Get borrow/repay/interest/liquidation records for margin accounts. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          marginType: { type: \"string\", enum: [...MARGIN_TYPES] },\n          recordType: {\n            type: \"string\",\n            enum: [\"borrow\", \"repay\", \"interest\", \"liquidation\"],\n          },\n          coin: { type: \"string\" },\n          symbol: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n          limit: { type: \"number\" },\n        },\n        required: [\"marginType\", \"recordType\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const marginType = requireString(args, \"marginType\");\n        const recordType = requireString(args, \"recordType\");\n        assertEnum(marginType, \"marginType\", MARGIN_TYPES);\n        assertEnum(recordType, \"recordType\", [\n          \"borrow\",\n          \"repay\",\n          \"interest\",\n          \"liquidation\",\n        ]);\n        const apiMarginType =\n          recordType === \"borrow\"\n            ? \"borrow\"\n            : recordType === \"repay\"\n              ? \"repay\"\n              : recordType === \"interest\"\n                ? \"interest\"\n                : \"liquidation_fee\";\n        const now = Date.now();\n        const defaultStartTime = String(now - 30 * 24 * 60 * 60 * 1000);\n        const response = await context.client.privateGet(\n          marginPath(marginType, \"financial-records\"),\n          compactObject({\n            marginType: apiMarginType,\n            coin: readString(args, \"coin\"),\n            startTime: readString(args, \"startTime\") ?? defaultStartTime,\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"margin_get_records\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  assertEnum,\n  compactObject,\n  readString,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerP2pTools(): ToolSpec[] {\n  return [\n    {\n      name: \"p2p_get_merchants\",\n      module: \"p2p\",\n      description:\n        \"Get P2P merchant list or specific merchant details. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          merchantId: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const merchantId = readString(args, \"merchantId\");\n        const path = merchantId\n          ? \"/api/v2/p2p/merchantInfo\"\n          : \"/api/v2/p2p/merchantList\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({ merchantId }),\n          privateRateLimit(\"p2p_get_merchants\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"p2p_get_orders\",\n      module: \"p2p\",\n      description:\n        \"Get P2P order list or advertisement list. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: {\n            type: \"string\",\n            enum: [\"orders\", \"advertisements\"],\n            description: \"orders(default) or advertisements.\",\n          },\n          status: { type: \"string\" },\n          startTime: { type: \"string\" },\n          endTime: { type: \"string\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"orders\";\n        assertEnum(type, \"type\", [\"orders\", \"advertisements\"]);\n        const path =\n          type === \"advertisements\"\n            ? \"/api/v2/p2p/advList\"\n            : \"/api/v2/p2p/orderList\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            status: readString(args, \"status\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n          }),\n          privateRateLimit(\"p2p_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  assertEnum,\n  compactObject,\n  readNumber,\n  readString,\n  asRecord,\n} from \"./helpers.js\";\nimport { GRANULARITIES, publicRateLimit } from \"./common.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerSpotMarketTools(): ToolSpec[] {\n  return [\n    {\n      name: \"spot_get_ticker\",\n      module: \"spot\",\n      description:\n        \"Get real-time ticker data for spot trading pair(s). Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: {\n            type: \"string\",\n            description: \"Trading pair symbol, e.g. BTCUSDT. Omit for all tickers.\",\n          },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const response = await context.client.publicGet(\n          \"/api/v2/spot/market/tickers\",\n          compactObject({ symbol }),\n          publicRateLimit(\"spot_get_ticker\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_depth\",\n      module: \"spot\",\n      description:\n        \"Get orderbook depth for a spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n          type: {\n            type: \"string\",\n            enum: [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"],\n            description: \"Depth merge level. step0 means raw orderbook.\",\n          },\n          limit: {\n            type: \"number\",\n            description: \"Depth levels, default 150, max 150.\",\n          },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const type = readString(args, \"type\") ?? \"step0\";\n        const limit = readNumber(args, \"limit\");\n        assertEnum(type, \"type\", [\"step0\", \"step1\", \"step2\", \"step3\", \"step4\", \"step5\"]);\n        const path =\n          type === \"step0\"\n            ? \"/api/v2/spot/market/orderbook\"\n            : \"/api/v2/spot/market/merge-depth\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, type, limit }),\n          publicRateLimit(\"spot_get_depth\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_candles\",\n      module: \"spot\",\n      description:\n        \"Get K-line data for spot trading pair. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol, e.g. BTCUSDT\" },\n          granularity: {\n            type: \"string\",\n            enum: [...GRANULARITIES],\n            description: \"Candlestick period.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100, max 1000.\" },\n        },\n        required: [\"symbol\", \"granularity\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const granularity = readString(args, \"granularity\");\n        assertEnum(granularity, \"granularity\", GRANULARITIES);\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const path = startTime\n          ? \"/api/v2/spot/market/history-candles\"\n          : \"/api/v2/spot/market/candles\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, granularity, startTime, endTime, limit }),\n          publicRateLimit(\"spot_get_candles\", 20),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_trades\",\n      module: \"spot\",\n      description:\n        \"Get recent or historical trade records for spot symbol. Public endpoint. Rate limit: 10 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          limit: { type: \"number\", description: \"Result size, default 100, max 500.\" },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = readString(args, \"symbol\");\n        const limit = readNumber(args, \"limit\");\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const path = startTime\n          ? \"/api/v2/spot/market/fills-history\"\n          : \"/api/v2/spot/market/fills\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, limit, startTime, endTime }),\n          publicRateLimit(\"spot_get_trades\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_symbols\",\n      module: \"spot\",\n      description:\n        \"Get spot symbol info or coin chain info. Public endpoint. Rate limit: 20 req/s per IP.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          type: {\n            type: \"string\",\n            enum: [\"symbols\", \"coins\"],\n            description: \"symbols(default) or coins.\",\n          },\n          symbol: { type: \"string\", description: \"Specific symbol filter.\" },\n          coin: { type: \"string\", description: \"Specific coin filter.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const type = readString(args, \"type\") ?? \"symbols\";\n        assertEnum(type, \"type\", [\"symbols\", \"coins\"]);\n        const symbol = readString(args, \"symbol\");\n        const coin = readString(args, \"coin\");\n        const path =\n          type === \"coins\"\n            ? \"/api/v2/spot/public/coins\"\n            : \"/api/v2/spot/public/symbols\";\n        const response = await context.client.publicGet(\n          path,\n          compactObject({ symbol, coin }),\n          publicRateLimit(\"spot_get_symbols\", 20),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { ToolSpec } from \"./types.js\";\nimport {\n  asRecord,\n  compactObject,\n  ensureOneOf,\n  readBoolean,\n  readNumber,\n  readObjectArray,\n  readString,\n  readStringArray,\n  requireObjectArray,\n  requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nfunction normalize(response: {\n  endpoint: string;\n  requestTime: string;\n  data: unknown;\n}): Record<string, unknown> {\n  return {\n    endpoint: response.endpoint,\n    requestTime: response.requestTime,\n    data: response.data,\n  };\n}\n\nexport function registerSpotTradeTools(): ToolSpec[] {\n  return [\n    {\n      name: \"spot_place_order\",\n      module: \"spot\",\n      description:\n        \"Place one or more spot orders. [CAUTION] Executes real trades. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orders: {\n            type: \"array\",\n            description:\n              \"Array of order objects. Single order should still be passed as an array with one item.\",\n            items: {\n              type: \"object\",\n            },\n          },\n        },\n        required: [\"orders\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orders = requireObjectArray(args, \"orders\");\n        if (orders.length > 50) {\n          throw new ValidationError(\"orders supports at most 50 items.\");\n        }\n        const normalizedOrders = orders.map((order) => {\n          const orderType = readString(order, \"orderType\");\n          return compactObject({\n            ...order,\n            force:\n              readString(order, \"force\") ??\n              (orderType === \"limit\" ? \"gtc\" : undefined),\n          });\n        });\n        const isSingle = orders.length === 1;\n        const path = isSingle\n          ? \"/api/v2/spot/trade/place-order\"\n          : \"/api/v2/spot/trade/batch-orders\";\n        const body = isSingle ? normalizedOrders[0] : { orderList: normalizedOrders };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_place_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_cancel_orders\",\n      module: \"spot\",\n      description:\n        \"Cancel one or more spot orders by id, batch ids, or symbol-wide cancel. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Single order id.\" },\n          orderIds: {\n            type: \"array\",\n            description: \"Multiple order ids. Max 50.\",\n            items: { type: \"string\" },\n          },\n          cancelAll: {\n            type: \"boolean\",\n            description: \"If true, cancel all open orders for symbol.\",\n          },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const symbol = requireString(args, \"symbol\");\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const cancelAll = readBoolean(args, \"cancelAll\");\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"cancelAll\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"cancelAll=true\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const { path, body } = orderId\n          ? {\n              path: \"/api/v2/spot/trade/cancel-order\",\n              body: { symbol, orderId },\n            }\n          : orderIds\n            ? {\n                path: \"/api/v2/spot/trade/batch-cancel-order\",\n                body: { symbol, orderIds },\n              }\n            : cancelAll\n              ? {\n                  path: \"/api/v2/spot/trade/cancel-symbol-order\",\n                  body: { symbol },\n                }\n              : {\n                  path: \"/api/v2/spot/trade/cancel-order\",\n                  body: { symbol },\n                };\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_cancel_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_modify_order\",\n      module: \"spot\",\n      description:\n        \"Cancel and replace a spot order atomically. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Original order id.\" },\n          newPrice: { type: \"string\", description: \"New price for limit order.\" },\n          newSize: { type: \"string\", description: \"New order size.\" },\n          newClientOid: { type: \"string\", description: \"New client order id.\" },\n        },\n        required: [\"symbol\", \"orderId\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const newPrice = readString(args, \"newPrice\");\n        const newSize = readString(args, \"newSize\");\n        const newClientOid = readString(args, \"newClientOid\");\n        if (!newPrice && !newSize && !newClientOid) {\n          throw new ValidationError(\n            'Provide at least one of \"newPrice\", \"newSize\", or \"newClientOid\".',\n          );\n        }\n        const response = await context.client.privatePost(\n          \"/api/v2/spot/trade/cancel-replace-order\",\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            orderId: requireString(args, \"orderId\"),\n            price: newPrice,\n            size: newSize,\n            clientOid: newClientOid,\n            force: \"gtc\",\n          }),\n          privateRateLimit(\"spot_modify_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_orders\",\n      module: \"spot\",\n      description:\n        \"Query spot order detail, open orders, or history orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Specific order id.\" },\n          symbol: { type: \"string\", description: \"Trading pair filter.\" },\n          status: {\n            type: \"string\",\n            enum: [\"open\", \"history\"],\n            description: \"open(default) or history.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n          idLessThan: { type: \"string\", description: \"Pagination cursor.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const symbol = readString(args, \"symbol\");\n        const status = readString(args, \"status\") ?? \"open\";\n        const startTime = readString(args, \"startTime\");\n        const endTime = readString(args, \"endTime\");\n        const limit = readNumber(args, \"limit\");\n        const idLessThan = readString(args, \"idLessThan\");\n        const route = orderId\n          ? \"/api/v2/spot/trade/orderInfo\"\n          : status === \"history\"\n            ? \"/api/v2/spot/trade/history-orders\"\n            : \"/api/v2/spot/trade/unfilled-orders\";\n        const query = compactObject({\n          orderId,\n          symbol,\n          startTime,\n          endTime,\n          limit,\n          idLessThan,\n        });\n        const response = await context.client.privateGet(\n          route,\n          query,\n          privateRateLimit(\"spot_get_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_fills\",\n      module: \"spot\",\n      description:\n        \"Get spot fills for order execution details. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          orderId: { type: \"string\", description: \"Specific order id.\" },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const response = await context.client.privateGet(\n          \"/api/v2/spot/trade/fills\",\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            orderId: readString(args, \"orderId\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"spot_get_fills\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_place_plan_order\",\n      module: \"spot\",\n      description:\n        \"Create or modify spot plan order (trigger order). Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"When provided, modify existing plan order.\" },\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          side: { type: \"string\", enum: [\"buy\", \"sell\"], description: \"Order side.\" },\n          triggerPrice: { type: \"string\", description: \"Trigger price.\" },\n          triggerType: {\n            type: \"string\",\n            enum: [\"mark_price\", \"fill_price\", \"last_price\"],\n            description: \"Trigger source.\",\n          },\n          orderType: {\n            type: \"string\",\n            enum: [\"limit\", \"market\"],\n            description: \"Execution order type.\",\n          },\n          price: { type: \"string\", description: \"Execution price for limit orders.\" },\n          size: { type: \"string\", description: \"Order quantity.\" },\n        },\n        required: [\"triggerPrice\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const path = orderId\n          ? \"/api/v2/spot/trade/modify-plan-order\"\n          : \"/api/v2/spot/trade/place-plan-order\";\n        const response = await context.client.privatePost(\n          path,\n          compactObject({\n            orderId,\n            symbol: readString(args, \"symbol\"),\n            side: readString(args, \"side\"),\n            triggerPrice: requireString(args, \"triggerPrice\"),\n            triggerType:\n              readString(args, \"triggerType\") === \"last_price\"\n                ? \"fill_price\"\n                : (readString(args, \"triggerType\") ?? \"fill_price\"),\n            orderType: readString(args, \"orderType\"),\n            executePrice: readString(args, \"price\"),\n            planType: \"amount\",\n            size: readString(args, \"size\"),\n          }),\n          privateRateLimit(\"spot_place_plan_order\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_get_plan_orders\",\n      module: \"spot\",\n      description:\n        \"Get current or historical spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: false,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          symbol: { type: \"string\", description: \"Trading pair symbol.\" },\n          status: {\n            type: \"string\",\n            enum: [\"current\", \"history\"],\n            description: \"current(default) or history.\",\n          },\n          startTime: { type: \"string\", description: \"Start time in milliseconds.\" },\n          endTime: { type: \"string\", description: \"End time in milliseconds.\" },\n          limit: { type: \"number\", description: \"Result size, default 100.\" },\n        },\n        required: [\"symbol\"],\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const status = readString(args, \"status\") ?? \"current\";\n        const path =\n          status === \"history\"\n            ? \"/api/v2/spot/trade/history-plan-order\"\n            : \"/api/v2/spot/trade/current-plan-order\";\n        const response = await context.client.privateGet(\n          path,\n          compactObject({\n            symbol: requireString(args, \"symbol\"),\n            startTime: readString(args, \"startTime\"),\n            endTime: readString(args, \"endTime\"),\n            limit: readNumber(args, \"limit\"),\n          }),\n          privateRateLimit(\"spot_get_plan_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n    {\n      name: \"spot_cancel_plan_orders\",\n      module: \"spot\",\n      description:\n        \"Cancel one or multiple spot plan orders. Private endpoint. Rate limit: 10 req/s per UID.\",\n      isWrite: true,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          orderId: { type: \"string\", description: \"Single plan order id.\" },\n          orderIds: {\n            type: \"array\",\n            description: \"Multiple plan order ids.\",\n            items: { type: \"string\" },\n          },\n          symbol: { type: \"string\", description: \"Cancel all plan orders for symbol.\" },\n        },\n      },\n      handler: async (rawArgs, context) => {\n        const args = asRecord(rawArgs);\n        const orderId = readString(args, \"orderId\");\n        const orderIds = readStringArray(args, \"orderIds\");\n        const symbol = readString(args, \"symbol\");\n        ensureOneOf(\n          args,\n          [\"orderId\", \"orderIds\", \"symbol\"],\n          'Provide one of \"orderId\", \"orderIds\", or \"symbol\".',\n        );\n        if (orderIds && orderIds.length > 50) {\n          throw new ValidationError(\"orderIds supports at most 50 items.\");\n        }\n        const path = orderId\n          ? \"/api/v2/spot/trade/cancel-plan-order\"\n          : \"/api/v2/spot/trade/batch-cancel-plan-order\";\n        const body = compactObject({ orderId, orderIds, symbol });\n        const response = await context.client.privatePost(\n          path,\n          body,\n          privateRateLimit(\"spot_cancel_plan_orders\", 10),\n        );\n        return normalize(response);\n      },\n    },\n  ];\n}\n","import type { BitgetConfig } from \"../config.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerBrokerTools } from \"./broker.js\";\nimport { registerConvertTools } from \"./convert.js\";\nimport { registerCopyTradingTools } from \"./copy-trading.js\";\nimport { registerEarnTools } from \"./earn.js\";\nimport { registerFuturesMarketTools } from \"./futures-market.js\";\nimport { registerFuturesTradeTools } from \"./futures-trade.js\";\nimport { registerMarginTools } from \"./margin.js\";\nimport { registerP2pTools } from \"./p2p.js\";\nimport { registerSpotMarketTools } from \"./spot-market.js\";\nimport { registerSpotTradeTools } from \"./spot-trade.js\";\nimport type { ToolSpec } from \"./types.js\";\n\nfunction allToolSpecs(): ToolSpec[] {\n  return [\n    ...registerSpotMarketTools(),\n    ...registerSpotTradeTools(),\n    ...registerFuturesMarketTools(),\n    ...registerFuturesTradeTools(),\n    ...registerAccountTools(),\n    ...registerMarginTools(),\n    ...registerCopyTradingTools(),\n    ...registerConvertTools(),\n    ...registerEarnTools(),\n    ...registerP2pTools(),\n    ...registerBrokerTools(),\n  ];\n}\n\nexport function buildTools(config: BitgetConfig): ToolSpec[] {\n  const enabledModules = new Set(config.modules);\n  const tools = allToolSpecs().filter((tool) => enabledModules.has(tool.module));\n  if (!config.readOnly) {\n    return tools;\n  }\n  return tools.filter((tool) => !tool.isWrite);\n}\n","import type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BitgetRestClient } from \"../client/rest-client.js\";\nimport type { BitgetConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\n\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n  config: BitgetConfig;\n  client: BitgetRestClient;\n}\n\nexport interface ToolSpec {\n  name: string;\n  module: ModuleId;\n  description: string;\n  inputSchema: JsonSchema;\n  isWrite: boolean;\n  handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n  return {\n    name: tool.name,\n    description: tool.description,\n    inputSchema: tool.inputSchema,\n    annotations: {\n      readOnlyHint: !tool.isWrite,\n      destructiveHint: tool.isWrite,\n      idempotentHint: !tool.isWrite,\n      openWorldHint: true,\n    },\n  };\n}\n"],"mappings":"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","names":["normalize","response","normalize","response","normalize","response","normalize","payload","response","normalize","normalize","normalize","normalize","normalize","normalize","earnCapability"]}
Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.9 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumNS-003Network SuspiciousMedium ConfidenceLine 0

JavaScript fetch() call

Detected by automated pattern matching (rule NS-003) with medium confidence. May be a false positive.

    341:     let response;
    342:     try {
>>> 343:       response = await fetch(url, {
    344:         method: config.method,
    345:         headers,
Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.5 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.6 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.5 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.8 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.6 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.7 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.5 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.5 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (4.5 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive
mediumEN-001unknownMedium ConfidenceLine 0

High-entropy string (5.2 bits/char) — possible encoded payload

Detected by automated pattern matching (rule EN-001) with medium confidence. May be a false positive.

Report false positive

Scan History

DateRiskFindings
Feb 27, 2026critical143
Feb 25, 2026critical143
Feb 23, 2026critical143
Feb 22, 2026critical143