{"version":3,"sources":["../../src/cart/index.ts","../../src/cart/store.ts","../../src/cart/cart.ts","../../src/cart/handlers.ts"],"sourcesContent":["export { createInMemoryCartStore, CART_TTL_MS, type CartStore } from './store';\nexport {\n  addItem,\n  clearCart,\n  getCart,\n  getOrCreateCart,\n  removeItem,\n  setEmail,\n  setShippingAddress,\n  updateItemQuantity,\n  type AddItemInput,\n  type CartContext,\n} from './cart';\nexport {\n  createCartHandlers,\n  CART_COOKIE_NAME,\n  type CartHandlers,\n  type CartHandlerOptions,\n} from './handlers';\n","/**\n * F136 Phase 1 — Cart storage adapter.\n *\n * Default implementation: in-process Map keyed by cartId. That's enough\n * for filesystem-adapter sites running on a single Node process and for\n * the unit tests.\n *\n * Sites running on multiple instances (Fly machine pairs, Vercel\n * serverless) should pass a `CartStore` backed by their shared cache —\n * Redis, Upstash KV, Cloudflare KV. The interface is small on purpose.\n *\n * Carts have a 48 h TTL. The in-memory store sweeps expired entries on\n * each `get()` so it doesn't grow unbounded.\n */\nimport type { ShopCart } from '../types';\n\nexport interface CartStore {\n  get(id: string): Promise<ShopCart | null>;\n  set(cart: ShopCart): Promise<void>;\n  delete(id: string): Promise<void>;\n}\n\nconst TTL_MS = 48 * 60 * 60 * 1000;\n\nexport function createInMemoryCartStore(): CartStore {\n  const data = new Map<string, ShopCart>();\n\n  function reap() {\n    const now = Date.now();\n    for (const [id, cart] of data) {\n      if (Date.parse(cart.expiresAt) <= now) data.delete(id);\n    }\n  }\n\n  return {\n    async get(id: string): Promise<ShopCart | null> {\n      reap();\n      return data.get(id) ?? null;\n    },\n    async set(cart: ShopCart): Promise<void> {\n      data.set(cart.id, cart);\n    },\n    async delete(id: string): Promise<void> {\n      data.delete(id);\n    },\n  };\n}\n\nexport const CART_TTL_MS = TTL_MS;\n","/**\n * F136 Phase 1 — Cart engine.\n *\n * Pure functions over the ShopCart data shape. The `CartStore` adapter\n * persists; this file does math + invariants.\n *\n * Currency rule: a cart is single-currency. The first item locks the\n * currency; adding an item priced in a different currency throws.\n * Sites that need multi-currency carts should split into separate carts\n * per currency (matches Stripe Checkout's own limitation).\n */\nimport { randomUUID } from 'crypto';\nimport type {\n  CartLineItem,\n  CurrencyCode,\n  MoneyAmount,\n  ShopAddress,\n  ShopCart,\n  ShopProduct,\n} from '../types';\nimport { CART_TTL_MS, type CartStore } from './store';\n\nexport interface CartContext {\n  store: CartStore;\n}\n\nexport interface AddItemInput {\n  product: ShopProduct;\n  variantId?: string;\n  quantity?: number;\n  /** Currency to price the item in. Must match an entry in priceByCurrency. */\n  currency: CurrencyCode;\n  /** Locale to lock onto the cart on first item add. */\n  locale?: string;\n}\n\nfunction newId(): string {\n  return `cart_${randomUUID().replace(/-/g, '').slice(0, 24)}`;\n}\n\nfunction nowIso(): string {\n  return new Date().toISOString();\n}\n\nfunction expiryIso(): string {\n  return new Date(Date.now() + CART_TTL_MS).toISOString();\n}\n\nfunction emptyCart(currency: CurrencyCode, locale?: string): ShopCart {\n  const now = nowIso();\n  return {\n    id: newId(),\n    currency: currency.toUpperCase(),\n    items: [],\n    subtotal: 0,\n    discountTotal: 0,\n    shippingTotal: 0,\n    taxTotal: 0,\n    total: 0,\n    createdAt: now,\n    updatedAt: now,\n    expiresAt: expiryIso(),\n    ...(locale ? { locale } : {}),\n  };\n}\n\nfunction lineKey(item: Pick<CartLineItem, 'productId' | 'variantId'>): string {\n  return `${item.productId}::${item.variantId ?? ''}`;\n}\n\nfunction recomputeTotals(cart: ShopCart): ShopCart {\n  const subtotal = cart.items.reduce(\n    (sum, l) => sum + l.unitPrice * l.quantity,\n    0,\n  );\n  const total =\n    subtotal - cart.discountTotal + cart.shippingTotal + cart.taxTotal;\n  return {\n    ...cart,\n    subtotal,\n    total: Math.max(0, total),\n    updatedAt: nowIso(),\n  };\n}\n\nfunction resolveUnitPrice(\n  product: ShopProduct,\n  variantId: string | undefined,\n  currency: string,\n): MoneyAmount {\n  const cur = currency.toUpperCase();\n  if (variantId) {\n    const variant = product.data.variants?.find((v) => v.id === variantId);\n    if (!variant) {\n      throw new Error(\n        `[cms-shop] variant ${variantId} not found on product ${product.id}`,\n      );\n    }\n    const variantPrice = variant.priceByCurrency?.[cur];\n    if (typeof variantPrice === 'number' && variantPrice > 0) {\n      return variantPrice;\n    }\n  }\n  const price = product.data.priceByCurrency?.[cur];\n  if (typeof price !== 'number' || price <= 0) {\n    throw new Error(\n      `[cms-shop] product ${product.id} is not priced in ${cur}`,\n    );\n  }\n  return price;\n}\n\nexport async function getOrCreateCart(\n  ctx: CartContext,\n  cartId: string | undefined,\n  fallbackCurrency: CurrencyCode,\n  locale?: string,\n): Promise<ShopCart> {\n  if (cartId) {\n    const existing = await ctx.store.get(cartId);\n    if (existing) return existing;\n  }\n  const cart = emptyCart(fallbackCurrency, locale);\n  await ctx.store.set(cart);\n  return cart;\n}\n\nexport async function getCart(\n  ctx: CartContext,\n  cartId: string,\n): Promise<ShopCart | null> {\n  return ctx.store.get(cartId);\n}\n\nexport async function addItem(\n  ctx: CartContext,\n  cartId: string | undefined,\n  input: AddItemInput,\n): Promise<ShopCart> {\n  const cart = await getOrCreateCart(\n    ctx,\n    cartId,\n    input.currency,\n    input.locale,\n  );\n  const cur = input.currency.toUpperCase();\n\n  if (cart.items.length > 0 && cart.currency !== cur) {\n    throw new Error(\n      `[cms-shop] cart is in ${cart.currency} — cannot add item in ${cur}`,\n    );\n  }\n  if (cart.items.length === 0 && cart.currency !== cur) {\n    cart.currency = cur;\n  }\n\n  const qty = Math.max(1, Math.floor(input.quantity ?? 1));\n  const unitPrice = resolveUnitPrice(input.product, input.variantId, cur);\n\n  const newLine: CartLineItem = {\n    productId: input.product.id,\n    ...(input.variantId ? { variantId: input.variantId } : {}),\n    unitPrice,\n    currency: cur,\n    quantity: qty,\n    titleSnapshot: input.product.data.title,\n    ...(input.product.data.cardImageUrl\n      ? { imageSnapshot: input.product.data.cardImageUrl }\n      : input.product.data.images?.[0]\n        ? { imageSnapshot: input.product.data.images[0] }\n        : {}),\n  };\n\n  const key = lineKey(newLine);\n  const existingIndex = cart.items.findIndex((l) => lineKey(l) === key);\n\n  if (existingIndex >= 0) {\n    const merged = [...cart.items];\n    const existing = merged[existingIndex]!;\n    merged[existingIndex] = {\n      ...existing,\n      quantity: existing.quantity + qty,\n    };\n    cart.items = merged;\n  } else {\n    cart.items = [...cart.items, newLine];\n  }\n\n  const next = recomputeTotals(cart);\n  await ctx.store.set(next);\n  return next;\n}\n\nexport async function updateItemQuantity(\n  ctx: CartContext,\n  cartId: string,\n  productId: string,\n  variantId: string | undefined,\n  quantity: number,\n): Promise<ShopCart> {\n  const cart = await ctx.store.get(cartId);\n  if (!cart) throw new Error(`[cms-shop] cart ${cartId} not found`);\n\n  const key = lineKey({ productId, ...(variantId ? { variantId } : {}) });\n  const items = cart.items\n    .map((l) =>\n      lineKey(l) === key\n        ? { ...l, quantity: Math.max(0, Math.floor(quantity)) }\n        : l,\n    )\n    .filter((l) => l.quantity > 0);\n\n  const next = recomputeTotals({ ...cart, items });\n  await ctx.store.set(next);\n  return next;\n}\n\nexport async function removeItem(\n  ctx: CartContext,\n  cartId: string,\n  productId: string,\n  variantId?: string,\n): Promise<ShopCart> {\n  return updateItemQuantity(ctx, cartId, productId, variantId, 0);\n}\n\nexport async function setShippingAddress(\n  ctx: CartContext,\n  cartId: string,\n  address: ShopAddress,\n): Promise<ShopCart> {\n  const cart = await ctx.store.get(cartId);\n  if (!cart) throw new Error(`[cms-shop] cart ${cartId} not found`);\n  const next = recomputeTotals({ ...cart, shippingAddress: address });\n  await ctx.store.set(next);\n  return next;\n}\n\nexport async function setEmail(\n  ctx: CartContext,\n  cartId: string,\n  email: string,\n): Promise<ShopCart> {\n  const cart = await ctx.store.get(cartId);\n  if (!cart) throw new Error(`[cms-shop] cart ${cartId} not found`);\n  const next = recomputeTotals({ ...cart, email });\n  await ctx.store.set(next);\n  return next;\n}\n\nexport async function clearCart(\n  ctx: CartContext,\n  cartId: string,\n): Promise<void> {\n  await ctx.store.delete(cartId);\n}\n","/**\n * F136 Phase 1 — Framework-agnostic cart HTTP handlers.\n *\n * Returns plain `Request → Response` functions so consumers can wire\n * them into Next.js Route Handlers, Hono, Fastify, or Bun.serve with\n * one line each.\n *\n * Cart id transport: `cms_shop_cart` cookie. The handler reads it on\n * every request, generates one on first add, and re-issues a Set-Cookie\n * so the client persists it. SameSite=Lax is the default — anything\n * stricter blocks Stripe Checkout's redirect-back flow.\n */\nimport type { ShopProduct } from '../types';\nimport {\n  addItem,\n  clearCart,\n  getCart,\n  removeItem,\n  setEmail,\n  setShippingAddress,\n  updateItemQuantity,\n  type CartContext,\n} from './cart';\nimport type { CartStore } from './store';\nimport { CART_TTL_MS } from './store';\n\nconst COOKIE_NAME = 'cms_shop_cart';\n\nexport interface CartHandlerOptions {\n  store: CartStore;\n  /**\n   * Resolve a product by id from the site's CMS. The shop module is\n   * data-source agnostic so we don't import filesystem readers here —\n   * the host wires this in.\n   */\n  loadProduct(id: string): Promise<ShopProduct | null>;\n  /** Called whenever a cart mutates — useful for analytics/abandonment. */\n  onCartChanged?(cartId: string): void;\n  /** Cookie domain (default: omit, browser scopes to current host). */\n  cookieDomain?: string;\n  /** Set Secure flag on the cookie (default: true in prod, false in dev). */\n  cookieSecure?: boolean;\n}\n\nexport interface CartHandlers {\n  /** GET — returns the current cart (creates one if cookie missing). */\n  get(req: Request): Promise<Response>;\n  /** POST { productId, variantId?, quantity?, currency, locale? }. */\n  add(req: Request): Promise<Response>;\n  /** PATCH { productId, variantId?, quantity }. */\n  update(req: Request): Promise<Response>;\n  /** DELETE { productId, variantId? }. */\n  remove(req: Request): Promise<Response>;\n  /** POST { email } — captures email for abandonment + receipt. */\n  setEmail(req: Request): Promise<Response>;\n  /** POST { address } — for shipping rate calc + checkout. */\n  setAddress(req: Request): Promise<Response>;\n  /** DELETE — wipes the current cart. */\n  clear(req: Request): Promise<Response>;\n}\n\nfunction readCookie(req: Request, name: string): string | undefined {\n  const header = req.headers.get('cookie');\n  if (!header) return undefined;\n  for (const part of header.split(';')) {\n    const [k, v] = part.trim().split('=');\n    if (k === name) return v;\n  }\n  return undefined;\n}\n\nfunction buildSetCookie(\n  cartId: string,\n  opts: { domain?: string; secure: boolean },\n): string {\n  const maxAge = Math.floor(CART_TTL_MS / 1000);\n  const parts = [\n    `${COOKIE_NAME}=${cartId}`,\n    'Path=/',\n    'HttpOnly',\n    'SameSite=Lax',\n    `Max-Age=${maxAge}`,\n  ];\n  if (opts.domain) parts.push(`Domain=${opts.domain}`);\n  if (opts.secure) parts.push('Secure');\n  return parts.join('; ');\n}\n\nfunction json(\n  body: unknown,\n  init: ResponseInit & { setCartCookie?: string } = {},\n): Response {\n  const headers = new Headers(init.headers);\n  headers.set('content-type', 'application/json; charset=utf-8');\n  if (init.setCartCookie) headers.set('set-cookie', init.setCartCookie);\n  return new Response(JSON.stringify(body), {\n    status: init.status ?? 200,\n    headers,\n  });\n}\n\nfunction badRequest(message: string): Response {\n  return json({ error: message }, { status: 400 });\n}\n\nasync function readJson(req: Request): Promise<Record<string, unknown>> {\n  try {\n    const body = (await req.json()) as Record<string, unknown>;\n    return body && typeof body === 'object' ? body : {};\n  } catch {\n    return {};\n  }\n}\n\nexport function createCartHandlers(opts: CartHandlerOptions): CartHandlers {\n  const ctx: CartContext = { store: opts.store };\n  const secure =\n    opts.cookieSecure ?? process.env.NODE_ENV === 'production';\n  const cookieOpts = {\n    secure,\n    ...(opts.cookieDomain ? { domain: opts.cookieDomain } : {}),\n  };\n\n  function setCookie(cartId: string): string {\n    return buildSetCookie(cartId, cookieOpts);\n  }\n\n  return {\n    async get(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (!cartId) return json({ cart: null });\n      const cart = await getCart(ctx, cartId);\n      return json({ cart });\n    },\n\n    async add(req: Request): Promise<Response> {\n      const body = await readJson(req);\n      const productId = String(body.productId ?? '');\n      if (!productId) return badRequest('productId required');\n      const product = await opts.loadProduct(productId);\n      if (!product) return badRequest(`product ${productId} not found`);\n      const currency = String(body.currency ?? '').trim();\n      if (!currency) return badRequest('currency required');\n\n      const cartId = readCookie(req, COOKIE_NAME);\n      const cart = await addItem(ctx, cartId, {\n        product,\n        currency,\n        ...(body.variantId ? { variantId: String(body.variantId) } : {}),\n        ...(typeof body.quantity === 'number'\n          ? { quantity: body.quantity }\n          : {}),\n        ...(body.locale ? { locale: String(body.locale) } : {}),\n      });\n      opts.onCartChanged?.(cart.id);\n      return json({ cart }, { setCartCookie: setCookie(cart.id) });\n    },\n\n    async update(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (!cartId) return badRequest('no cart');\n      const body = await readJson(req);\n      const productId = String(body.productId ?? '');\n      const quantity = Number(body.quantity);\n      if (!productId || !Number.isFinite(quantity)) {\n        return badRequest('productId + quantity required');\n      }\n      const cart = await updateItemQuantity(\n        ctx,\n        cartId,\n        productId,\n        body.variantId ? String(body.variantId) : undefined,\n        quantity,\n      );\n      opts.onCartChanged?.(cart.id);\n      return json({ cart });\n    },\n\n    async remove(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (!cartId) return badRequest('no cart');\n      const body = await readJson(req);\n      const productId = String(body.productId ?? '');\n      if (!productId) return badRequest('productId required');\n      const cart = await removeItem(\n        ctx,\n        cartId,\n        productId,\n        body.variantId ? String(body.variantId) : undefined,\n      );\n      opts.onCartChanged?.(cart.id);\n      return json({ cart });\n    },\n\n    async setEmail(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (!cartId) return badRequest('no cart');\n      const body = await readJson(req);\n      const email = String(body.email ?? '').trim();\n      if (!email || !email.includes('@')) return badRequest('email required');\n      const cart = await setEmail(ctx, cartId, email);\n      opts.onCartChanged?.(cart.id);\n      return json({ cart });\n    },\n\n    async setAddress(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (!cartId) return badRequest('no cart');\n      const body = await readJson(req);\n      const address = body.address as\n        | Record<string, unknown>\n        | undefined;\n      if (!address || typeof address !== 'object') {\n        return badRequest('address required');\n      }\n      const required = ['name', 'line1', 'postalCode', 'city', 'country'];\n      for (const k of required) {\n        if (!address[k] || typeof address[k] !== 'string') {\n          return badRequest(`address.${k} required`);\n        }\n      }\n      const cart = await setShippingAddress(ctx, cartId, {\n        name: String(address.name),\n        line1: String(address.line1),\n        postalCode: String(address.postalCode),\n        city: String(address.city),\n        country: String(address.country),\n        ...(address.line2 ? { line2: String(address.line2) } : {}),\n        ...(address.region ? { region: String(address.region) } : {}),\n        ...(address.phone ? { phone: String(address.phone) } : {}),\n        ...(address.kind\n          ? { kind: address.kind as 'shipping' | 'billing' | 'both' }\n          : {}),\n      });\n      opts.onCartChanged?.(cart.id);\n      return json({ cart });\n    },\n\n    async clear(req: Request): Promise<Response> {\n      const cartId = readCookie(req, COOKIE_NAME);\n      if (cartId) await clearCart(ctx, cartId);\n      const expired = `${COOKIE_NAME}=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax${secure ? '; Secure' : ''}`;\n      return json({ cleared: true }, { setCartCookie: expired });\n    },\n  };\n}\n\nexport const CART_COOKIE_NAME = COOKIE_NAME;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACsBA,IAAM,SAAS,KAAK,KAAK,KAAK;AAEvB,SAAS,0BAAqC;AACnD,QAAM,OAAO,oBAAI,IAAsB;AAEvC,WAAS,OAAO;AACd,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,IAAI,IAAI,KAAK,MAAM;AAC7B,UAAI,KAAK,MAAM,KAAK,SAAS,KAAK,IAAK,MAAK,OAAO,EAAE;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,IAAI,IAAsC;AAC9C,WAAK;AACL,aAAO,KAAK,IAAI,EAAE,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,IAAI,MAA+B;AACvC,WAAK,IAAI,KAAK,IAAI,IAAI;AAAA,IACxB;AAAA,IACA,MAAM,OAAO,IAA2B;AACtC,WAAK,OAAO,EAAE;AAAA,IAChB;AAAA,EACF;AACF;AAEO,IAAM,cAAc;;;ACrC3B,oBAA2B;AAyB3B,SAAS,QAAgB;AACvB,SAAO,YAAQ,0BAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC5D;AAEA,SAAS,SAAiB;AACxB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEA,SAAS,YAAoB;AAC3B,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,EAAE,YAAY;AACxD;AAEA,SAAS,UAAU,UAAwB,QAA2B;AACpE,QAAM,MAAM,OAAO;AACnB,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,SAAS,YAAY;AAAA,IAC/B,OAAO,CAAC;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW,UAAU;AAAA,IACrB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AACF;AAEA,SAAS,QAAQ,MAA6D;AAC5E,SAAO,GAAG,KAAK,SAAS,KAAK,KAAK,aAAa,EAAE;AACnD;AAEA,SAAS,gBAAgB,MAA0B;AACjD,QAAM,WAAW,KAAK,MAAM;AAAA,IAC1B,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QACJ,WAAW,KAAK,gBAAgB,KAAK,gBAAgB,KAAK;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,OAAO,KAAK,IAAI,GAAG,KAAK;AAAA,IACxB,WAAW,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,iBACP,SACA,WACA,UACa;AACb,QAAM,MAAM,SAAS,YAAY;AACjC,MAAI,WAAW;AACb,UAAM,UAAU,QAAQ,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACrE,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,sBAAsB,SAAS,yBAAyB,QAAQ,EAAE;AAAA,MACpE;AAAA,IACF;AACA,UAAM,eAAe,QAAQ,kBAAkB,GAAG;AAClD,QAAI,OAAO,iBAAiB,YAAY,eAAe,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,KAAK,kBAAkB,GAAG;AAChD,MAAI,OAAO,UAAU,YAAY,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,sBAAsB,QAAQ,EAAE,qBAAqB,GAAG;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,gBACpB,KACA,QACA,kBACA,QACmB;AACnB,MAAI,QAAQ;AACV,UAAM,WAAW,MAAM,IAAI,MAAM,IAAI,MAAM;AAC3C,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,QAAM,OAAO,UAAU,kBAAkB,MAAM;AAC/C,QAAM,IAAI,MAAM,IAAI,IAAI;AACxB,SAAO;AACT;AAEA,eAAsB,QACpB,KACA,QAC0B;AAC1B,SAAO,IAAI,MAAM,IAAI,MAAM;AAC7B;AAEA,eAAsB,QACpB,KACA,QACA,OACmB;AACnB,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,QAAM,MAAM,MAAM,SAAS,YAAY;AAEvC,MAAI,KAAK,MAAM,SAAS,KAAK,KAAK,aAAa,KAAK;AAClD,UAAM,IAAI;AAAA,MACR,yBAAyB,KAAK,QAAQ,8BAAyB,GAAG;AAAA,IACpE;AAAA,EACF;AACA,MAAI,KAAK,MAAM,WAAW,KAAK,KAAK,aAAa,KAAK;AACpD,SAAK,WAAW;AAAA,EAClB;AAEA,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,YAAY,CAAC,CAAC;AACvD,QAAM,YAAY,iBAAiB,MAAM,SAAS,MAAM,WAAW,GAAG;AAEtE,QAAM,UAAwB;AAAA,IAC5B,WAAW,MAAM,QAAQ;AAAA,IACzB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IACxD;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,eAAe,MAAM,QAAQ,KAAK;AAAA,IAClC,GAAI,MAAM,QAAQ,KAAK,eACnB,EAAE,eAAe,MAAM,QAAQ,KAAK,aAAa,IACjD,MAAM,QAAQ,KAAK,SAAS,CAAC,IAC3B,EAAE,eAAe,MAAM,QAAQ,KAAK,OAAO,CAAC,EAAE,IAC9C,CAAC;AAAA,EACT;AAEA,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,gBAAgB,KAAK,MAAM,UAAU,CAAC,MAAM,QAAQ,CAAC,MAAM,GAAG;AAEpE,MAAI,iBAAiB,GAAG;AACtB,UAAM,SAAS,CAAC,GAAG,KAAK,KAAK;AAC7B,UAAM,WAAW,OAAO,aAAa;AACrC,WAAO,aAAa,IAAI;AAAA,MACtB,GAAG;AAAA,MACH,UAAU,SAAS,WAAW;AAAA,IAChC;AACA,SAAK,QAAQ;AAAA,EACf,OAAO;AACL,SAAK,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO;AAAA,EACtC;AAEA,QAAM,OAAO,gBAAgB,IAAI;AACjC,QAAM,IAAI,MAAM,IAAI,IAAI;AACxB,SAAO;AACT;AAEA,eAAsB,mBACpB,KACA,QACA,WACA,WACA,UACmB;AACnB,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM;AACvC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,YAAY;AAEhE,QAAM,MAAM,QAAQ,EAAE,WAAW,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AACtE,QAAM,QAAQ,KAAK,MAChB;AAAA,IAAI,CAAC,MACJ,QAAQ,CAAC,MAAM,MACX,EAAE,GAAG,GAAG,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,EAAE,IACpD;AAAA,EACN,EACC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC;AAE/B,QAAM,OAAO,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;AAC/C,QAAM,IAAI,MAAM,IAAI,IAAI;AACxB,SAAO;AACT;AAEA,eAAsB,WACpB,KACA,QACA,WACA,WACmB;AACnB,SAAO,mBAAmB,KAAK,QAAQ,WAAW,WAAW,CAAC;AAChE;AAEA,eAAsB,mBACpB,KACA,QACA,SACmB;AACnB,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM;AACvC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,YAAY;AAChE,QAAM,OAAO,gBAAgB,EAAE,GAAG,MAAM,iBAAiB,QAAQ,CAAC;AAClE,QAAM,IAAI,MAAM,IAAI,IAAI;AACxB,SAAO;AACT;AAEA,eAAsB,SACpB,KACA,QACA,OACmB;AACnB,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM;AACvC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,mBAAmB,MAAM,YAAY;AAChE,QAAM,OAAO,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;AAC/C,QAAM,IAAI,MAAM,IAAI,IAAI;AACxB,SAAO;AACT;AAEA,eAAsB,UACpB,KACA,QACe;AACf,QAAM,IAAI,MAAM,OAAO,MAAM;AAC/B;;;ACrOA,IAAM,cAAc;AAmCpB,SAAS,WAAW,KAAc,MAAkC;AAClE,QAAM,SAAS,IAAI,QAAQ,IAAI,QAAQ;AACvC,MAAI,CAAC,OAAQ,QAAO;AACpB,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AACpC,UAAM,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG;AACpC,QAAI,MAAM,KAAM,QAAO;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,eACP,QACA,MACQ;AACR,QAAM,SAAS,KAAK,MAAM,cAAc,GAAI;AAC5C,QAAM,QAAQ;AAAA,IACZ,GAAG,WAAW,IAAI,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AAAA,EACnB;AACA,MAAI,KAAK,OAAQ,OAAM,KAAK,UAAU,KAAK,MAAM,EAAE;AACnD,MAAI,KAAK,OAAQ,OAAM,KAAK,QAAQ;AACpC,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,KACP,MACA,OAAkD,CAAC,GACzC;AACV,QAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,UAAQ,IAAI,gBAAgB,iCAAiC;AAC7D,MAAI,KAAK,cAAe,SAAQ,IAAI,cAAc,KAAK,aAAa;AACpE,SAAO,IAAI,SAAS,KAAK,UAAU,IAAI,GAAG;AAAA,IACxC,QAAQ,KAAK,UAAU;AAAA,IACvB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,SAA2B;AAC7C,SAAO,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AACjD;AAEA,eAAe,SAAS,KAAgD;AACtE,MAAI;AACF,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,QAAQ,OAAO,SAAS,WAAW,OAAO,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,mBAAmB,MAAwC;AACzE,QAAM,MAAmB,EAAE,OAAO,KAAK,MAAM;AAC7C,QAAM,SACJ,KAAK,gBAAgB,QAAQ,IAAI,aAAa;AAChD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,GAAI,KAAK,eAAe,EAAE,QAAQ,KAAK,aAAa,IAAI,CAAC;AAAA,EAC3D;AAEA,WAAS,UAAU,QAAwB;AACzC,WAAO,eAAe,QAAQ,UAAU;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,MAAM,IAAI,KAAiC;AACzC,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,CAAC,OAAQ,QAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AACvC,YAAM,OAAO,MAAM,QAAQ,KAAK,MAAM;AACtC,aAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,IAAI,KAAiC;AACzC,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,UAAI,CAAC,UAAW,QAAO,WAAW,oBAAoB;AACtD,YAAM,UAAU,MAAM,KAAK,YAAY,SAAS;AAChD,UAAI,CAAC,QAAS,QAAO,WAAW,WAAW,SAAS,YAAY;AAChE,YAAM,WAAW,OAAO,KAAK,YAAY,EAAE,EAAE,KAAK;AAClD,UAAI,CAAC,SAAU,QAAO,WAAW,mBAAmB;AAEpD,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,YAAM,OAAO,MAAM,QAAQ,KAAK,QAAQ;AAAA,QACtC;AAAA,QACA;AAAA,QACA,GAAI,KAAK,YAAY,EAAE,WAAW,OAAO,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,QAC9D,GAAI,OAAO,KAAK,aAAa,WACzB,EAAE,UAAU,KAAK,SAAS,IAC1B,CAAC;AAAA,QACL,GAAI,KAAK,SAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,MACvD,CAAC;AACD,WAAK,gBAAgB,KAAK,EAAE;AAC5B,aAAO,KAAK,EAAE,KAAK,GAAG,EAAE,eAAe,UAAU,KAAK,EAAE,EAAE,CAAC;AAAA,IAC7D;AAAA,IAEA,MAAM,OAAO,KAAiC;AAC5C,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,CAAC,OAAQ,QAAO,WAAW,SAAS;AACxC,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAI,CAAC,aAAa,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC5C,eAAO,WAAW,+BAA+B;AAAA,MACnD;AACA,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,QAC1C;AAAA,MACF;AACA,WAAK,gBAAgB,KAAK,EAAE;AAC5B,aAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,OAAO,KAAiC;AAC5C,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,CAAC,OAAQ,QAAO,WAAW,SAAS;AACxC,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,YAAY,OAAO,KAAK,aAAa,EAAE;AAC7C,UAAI,CAAC,UAAW,QAAO,WAAW,oBAAoB;AACtD,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,MAC5C;AACA,WAAK,gBAAgB,KAAK,EAAE;AAC5B,aAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,SAAS,KAAiC;AAC9C,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,CAAC,OAAQ,QAAO,WAAW,SAAS;AACxC,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,QAAQ,OAAO,KAAK,SAAS,EAAE,EAAE,KAAK;AAC5C,UAAI,CAAC,SAAS,CAAC,MAAM,SAAS,GAAG,EAAG,QAAO,WAAW,gBAAgB;AACtE,YAAM,OAAO,MAAM,SAAS,KAAK,QAAQ,KAAK;AAC9C,WAAK,gBAAgB,KAAK,EAAE;AAC5B,aAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,WAAW,KAAiC;AAChD,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,CAAC,OAAQ,QAAO,WAAW,SAAS;AACxC,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,UAAU,KAAK;AAGrB,UAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,eAAO,WAAW,kBAAkB;AAAA,MACtC;AACA,YAAM,WAAW,CAAC,QAAQ,SAAS,cAAc,QAAQ,SAAS;AAClE,iBAAW,KAAK,UAAU;AACxB,YAAI,CAAC,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,MAAM,UAAU;AACjD,iBAAO,WAAW,WAAW,CAAC,WAAW;AAAA,QAC3C;AAAA,MACF;AACA,YAAM,OAAO,MAAM,mBAAmB,KAAK,QAAQ;AAAA,QACjD,MAAM,OAAO,QAAQ,IAAI;AAAA,QACzB,OAAO,OAAO,QAAQ,KAAK;AAAA,QAC3B,YAAY,OAAO,QAAQ,UAAU;AAAA,QACrC,MAAM,OAAO,QAAQ,IAAI;AAAA,QACzB,SAAS,OAAO,QAAQ,OAAO;AAAA,QAC/B,GAAI,QAAQ,QAAQ,EAAE,OAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,QACxD,GAAI,QAAQ,SAAS,EAAE,QAAQ,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC;AAAA,QAC3D,GAAI,QAAQ,QAAQ,EAAE,OAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,QACxD,GAAI,QAAQ,OACR,EAAE,MAAM,QAAQ,KAAwC,IACxD,CAAC;AAAA,MACP,CAAC;AACD,WAAK,gBAAgB,KAAK,EAAE;AAC5B,aAAO,KAAK,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,MAAM,KAAiC;AAC3C,YAAM,SAAS,WAAW,KAAK,WAAW;AAC1C,UAAI,OAAQ,OAAM,UAAU,KAAK,MAAM;AACvC,YAAM,UAAU,GAAG,WAAW,+CAA+C,SAAS,aAAa,EAAE;AACrG,aAAO,KAAK,EAAE,SAAS,KAAK,GAAG,EAAE,eAAe,QAAQ,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB;","names":[]}