@fayz-ai/plugin-shop 0.18.2 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/{ShopPage-J34V43NW.js → ShopPage-2CTRGQTX.js} +176 -247
  2. package/dist/ShopPage-2CTRGQTX.js.map +1 -0
  3. package/dist/{chunk-6DRDPROL.js → chunk-XV3KZRQX.js} +136 -31
  4. package/dist/chunk-XV3KZRQX.js.map +1 -0
  5. package/dist/data/registries.d.ts +2 -0
  6. package/dist/data/registries.d.ts.map +1 -1
  7. package/dist/index.d.ts +23 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +757 -511
  10. package/dist/index.js.map +1 -1
  11. package/dist/integrations/abacatepay/connectorDef.d.ts.map +1 -1
  12. package/dist/settings/ChoiceCards.d.ts.map +1 -1
  13. package/dist/settings/HandlingSettings.d.ts.map +1 -1
  14. package/dist/settings/MarketsSettings.d.ts +12 -0
  15. package/dist/settings/MarketsSettings.d.ts.map +1 -0
  16. package/dist/settings/PaymentProviderRow.d.ts.map +1 -1
  17. package/dist/settings/ShippingSettings.d.ts.map +1 -1
  18. package/dist/views/DeliveryAreaPicker.d.ts.map +1 -1
  19. package/dist/views/DeliveryRulesDraft.d.ts.map +1 -1
  20. package/dist/views/EmailTemplatePage.d.ts.map +1 -1
  21. package/dist/views/EmailsPage.d.ts.map +1 -1
  22. package/dist/views/FulfillmentProviderSelect.d.ts.map +1 -1
  23. package/dist/views/NewOrderCharge.d.ts.map +1 -1
  24. package/dist/views/NewOrderPage.d.ts.map +1 -1
  25. package/dist/views/OrderDetailView.d.ts.map +1 -1
  26. package/dist/views/OrderPaymentDetail.d.ts.map +1 -1
  27. package/dist/views/ProductMarketPricesTab.d.ts +19 -0
  28. package/dist/views/ProductMarketPricesTab.d.ts.map +1 -0
  29. package/dist/views/ProductPositionsTab.d.ts.map +1 -1
  30. package/dist/views/ProductStockTab.d.ts.map +1 -1
  31. package/dist/views/ProductVariantsTab.d.ts.map +1 -1
  32. package/dist/views/ShipOrderForm.d.ts.map +1 -1
  33. package/dist/views/ShipmentActions.d.ts.map +1 -1
  34. package/dist/views/ShippingProfileSelect.d.ts.map +1 -1
  35. package/dist/views/ShopPage.d.ts.map +1 -1
  36. package/dist/views/StockEntryModal.d.ts.map +1 -1
  37. package/dist/views/customerEntity.d.ts.map +1 -1
  38. package/dist/views/customerSegmentEntity.d.ts.map +1 -1
  39. package/dist/views/discountEntity.d.ts.map +1 -1
  40. package/dist/views/giftCardEntity.d.ts.map +1 -1
  41. package/dist/views/product-matching.d.ts.map +1 -1
  42. package/dist/views/productEntity.d.ts.map +1 -1
  43. package/dist/views/shippingZoneEntity.d.ts.map +1 -1
  44. package/package.json +7 -7
  45. package/dist/ShopPage-J34V43NW.js.map +0 -1
  46. package/dist/chunk-6DRDPROL.js.map +0 -1
  47. package/dist/integrations/bling/index.d.ts +0 -9
  48. package/dist/integrations/bling/index.d.ts.map +0 -1
  49. package/dist/integrations/neochef/index.d.ts +0 -8
  50. package/dist/integrations/neochef/index.d.ts.map +0 -1
  51. package/dist/settings/index.d.ts +0 -12
  52. package/dist/settings/index.d.ts.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/onboarding.ts","../src/integrations/melhor-envio/labelProvider.ts","../src/views/ProductImagesTab.tsx","../src/views/ProductVariantsTab.tsx","../src/views/stock-agent.ts","../src/views/ProductPositionsTab.tsx","../src/data/registry-routes.ts","../src/views/PackageSelect.tsx","../src/views/ShippingProfileSelect.tsx","../src/views/productEntity.tsx","../src/views/discountEntity.tsx","../src/views/discount-agent.ts","../src/views/categoryEntity.tsx","../src/views/collectionEntity.tsx","../src/views/giftCardEntity.tsx","../src/views/customerGroupEntity.tsx","../src/views/customerSegmentEntity.tsx","../src/data/productDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/categoryDataProvider.ts","../src/data/collectionDataProvider.ts","../src/data/giftCardDataProvider.ts","../src/data/customerGroupDataProvider.ts","../src/data/customerSegmentDataProvider.ts","../src/settings/useStoreSettings.ts","../src/settings/SettingsState.tsx","../src/settings/StoreGeneralSettings.tsx","../src/settings/payment-provider.ts","../src/settings/PaymentProviderRow.tsx","../src/settings/PaymentsSettings.tsx","../src/settings/CheckoutSettings.tsx","../src/settings/PackagesSettings.tsx","../src/settings/HandlingSettings.tsx","../src/settings/ChoiceCards.tsx","../src/views/delivery-draft.ts","../src/views/delivery-agent.ts","../src/views/DeliveryAgentSurface.tsx","../src/views/DeliveryAreaPicker.tsx","../src/views/DeliveryRulesDraft.tsx","../src/settings/ShippingSettings.tsx","../src/settings/FulfillmentSettings.tsx","../src/integrations/melhor-envio/connectorDef.tsx","../src/integrations/appmax/connectorDef.tsx","../src/integrations/abacatepay/data.ts","../src/integrations/abacatepay/connectorDef.tsx","../src/integrations/stripe-connect/connectorDef.tsx","../src/integrations/vindi/connectorDef.tsx","../src/integrations/mercadopago/connectorDef.tsx","../src/views/media-links.ts","../src/views/ContentPage.tsx","../src/integrations/bling/limits.ts","../src/integrations/bling/data.ts","../src/integrations/bling/connectorDef.tsx","../src/integrations/bling/mapping.ts","../src/integrations/bling/sync.ts","../src/integrations/bling/inbound.ts","../src/integrations/neochef/limits.ts","../src/integrations/neochef/mark.ts","../src/integrations/neochef/data.ts","../src/integrations/neochef/connectorDef.tsx","../src/integrations/neochef/mapping.ts","../src/analytics/cards.ts","../src/views/ProductContentTab.tsx","../src/index.ts"],"names":["resolve","update","React","jsx","jsxs","DetailTabHeader","Button","Plus","draft","IconButton","field","errorMessage","store","stockStore","resolveStockStore","getActiveTenantId","createSupabaseStockStore","useState","useEffect","listStockReasonCodes","amount","Fragment","Modal","ModalContent","ModalHeader","ModalTitle","ModalDescription","ModalFooter","getShopProvider","adminNavigateTo","STATUS_TONE","STATUS_LABEL","money","AlertTriangle","Skeleton","Loader2","SettingsGroup","ToggleRow","SelectRow","React9","text","React10","useAgentSurface","DEBOUNCE_MS","Check","Trash2","X","parseMoney","useConnectors","useConnectorsPanelAvailable","openConnectorsPanel","outcomeOf","RegistryCrudView","TextRow","ArrowRight","MapPin","ConnectorDetail","createConnectionStore","fayzConnectorOAuth","connectionStatus","settingsStatus","connectionSettings","message","METHOD_LABELS","methodsDetail","connectionDetail","toast","nextId","AskAIButton","Package","client","getSupabaseClientOptional","invoke","getShopTenantId","connectorRuntimeToken","CONNECTOR_RUNTIME_TOKEN_HEADER","pushCatalogue","pullCatalogue","pushOrders","reconcile","pendingOrders","listOrderDeliveries","connectionRuns","toNumber","Layers"],"mappings":"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","file":"index.js","sourcesContent":["import { countByTenant, type OnboardingProgramDef } from '@fayz-ai/core'\n\n/**\n * Implantação da loja — o que \"no ar\" quer dizer para uma loja.\n *\n * O checklist genérico da plataforma (marca, equipe, recebimento, site) vale\n * para qualquer negócio e não sabe o que é um pedido. Esta lista sabe: uma loja\n * não está viva porque tem logo, está viva quando alguém consegue comprar e o\n * dinheiro cai. É por isso que a ordem é catálogo → pagamento → vitrine →\n * primeiro pedido, e não a ordem em que as telas aparecem no menu.\n *\n * Cada passo carrega três coisas além do título: a ROTA (para o agente levar a\n * pessoa até lá em vez de descrever onde clicar), o SENSOR (para o passo se\n * fechar sozinho quando a coisa já é verdade no dado) e o TOUR (para o agente\n * apontar o controle na tela). O `agentHint` é a intenção — não é fala pronta.\n */\nexport function buildShopOnboarding(\n siteRoute = '/site',\n // O passo do catálogo só é desta lista quando o catálogo é desta loja. Com o\n // módulo de produtos desligado (o host registra produto noutro lugar), a rota\n // `/products` não existe — o passo levaria a pessoa a lugar nenhum e ainda\n // ficaria com `replaces: 'catalog'`, calando o passo genérico da plataforma\n // que voltou a ser o certo.\n withProducts = true,\n): OnboardingProgramDef {\n return {\n id: 'shop',\n title: 'Sua loja no ar',\n order: 10,\n role: 'operations',\n instructions: `Você está implantando uma LOJA. A pessoa não quer aprender um sistema: ela quer vender.\n\n- A ordem importa e é esta: ter o que vender → onde vender → como receber → como entregar → um motivo para comprar → a primeira venda. Não pule para \"divulgue\" antes de a loja aceitar um pedido.\n- Importar catálogo é o passo que trava mais gente. Ofereça planilha, integração (Bling, Nuvemshop) ou cadastrar um produto à mão para destravar — um produto já é o suficiente para seguir.\n- Em pagamento, pergunte COMO ela recebe hoje (Pix, cartão, maquininha) antes de falar de gateway. O nome do provedor é detalhe nosso, não dela.\n- Antes de dizer que a loja está pronta, confira: tem produto ativo, tem forma de pagamento, e a vitrine está publicada. Se faltar uma, diga qual falta.\n- Quando estiver pronta para receber pedidos, chame o colega de growth para a primeira campanha — não invente plano de mídia por conta própria.`,\n steps: ([\n {\n key: 'catalog',\n title: 'Cadastre seu primeiro produto',\n description: 'Seu catálogo é o que a loja vende. Um produto já destrava o resto.',\n icon: 'Package',\n route: '/products',\n priority: 'high',\n // O passo genérico da plataforma (\"cadastre seu primeiro produto\") e\n // este são o mesmo recado — a loja é dona dele.\n replaces: 'catalog',\n agentHint:\n 'Pergunte onde o catálogo está hoje (planilha, ERP, Instagram). Ofereça importar; se travar, um produto à mão já destrava.',\n howTo:\n 'Produtos › Adicionar. Nome, preço e uma foto já bastam para o produto aparecer na loja — estoque e variações dá para completar depois. Se você já tem uma planilha, use Adicionar › Importar: colunas de nome, preço e estoque viram o catálogo inteiro de uma vez.',\n celebrate: 'Produto no ar 🎉',\n // A coreografia, como dado: nenhuma dessas quatro falas varia, e cada\n // uma delas custava um turno de modelo para ser escrita de novo.\n script: [\n { kind: 'say', text: 'Vamos começar pelo que a loja vende. Te levo até os Produtos.' },\n { kind: 'goto', route: '/products' },\n {\n kind: 'say',\n text: 'Esta é a sua lista de produtos — hoje vazia. Tudo que entrar aqui aparece na vitrine.',\n },\n {\n // Três caminhos, e \"cadastre um produto\" assumia que só existia um.\n // A pergunta é o passo: quem tem planilha não quer digitar, e quem\n // não tem nada quer que alguém comece por ele.\n kind: 'choose',\n id: 'shop.catalog.how',\n question: 'Como você prefere trazer seus produtos?',\n options: [\n { id: 'import', label: 'Tenho uma planilha', meta: 'Importo e mapeio as colunas com você' },\n { id: 'manual', label: 'Vou cadastrar à mão', meta: 'Te mostro onde, começando por um' },\n {\n id: 'suggest',\n label: 'Me sugira o catálogo',\n meta: 'Monto uma lista a partir do que já sei do seu negócio',\n },\n ],\n },\n ],\n check: async () => (await countByTenant('plg_shop_products')) > 0,\n tour: {\n id: 'shop.catalog',\n stops: [\n {\n anchor: 'action.new',\n title: 'É aqui que nasce um produto',\n body: 'Nome, preço e uma foto já bastam. Pode cadastrar agora — eu vejo quando ele entrar.',\n route: '/products',\n waitForUser: true,\n },\n {\n anchor: 'action.import',\n title: 'Ou traga tudo de uma vez',\n body: 'Uma planilha com nome, preço e estoque vira o catálogo inteiro.',\n },\n ],\n },\n },\n {\n key: 'storefront',\n title: 'Configure sua loja online',\n description: 'O endereço que você manda para o cliente — e como a vitrine está hoje.',\n icon: 'Store',\n route: siteRoute,\n priority: 'high',\n // A plataforma chama de \"publique seu site\"; numa loja é a vitrine, e\n // quem sabe configurá-la é este módulo.\n replaces: 'publish',\n agentHint:\n 'Confira como a vitrine está e o endereço dela. Publicar sem frete configurado gera pedido que ninguém consegue entregar.',\n howTo:\n 'O construtor do site (o \"Editar\" no item \"Sua loja\", na barra lateral). Veja como a vitrine está, ajuste o que precisar conversando com o assistente e publique. Esse link é o que vai para a bio do Instagram e para o WhatsApp.',\n celebrate: 'Vitrine pronta ✨',\n script: [\n { kind: 'say', text: 'Agora a vitrine — o endereço que você manda para o cliente.' },\n { kind: 'goto', route: siteRoute },\n {\n kind: 'ask',\n text: 'Estou vendo o site da loja. Confira comigo como ele está e me diga o que falta para publicar.',\n },\n ],\n },\n {\n key: 'payments',\n title: 'Decida como vai receber',\n description: 'Pix, cartão ou boleto — o dinheiro precisa de um caminho.',\n icon: 'CreditCard',\n route: '/settings/shop-payments',\n priority: 'high',\n replaces: 'payments',\n agentHint:\n 'Comece por como ela já recebe hoje. Pix costuma ser o caminho mais curto para a primeira venda; cartão vem depois.',\n howTo:\n 'Configurações › Pagamentos. Ligue as formas que você aceita e conecte o provedor de cada uma. Para Pix você precisa da chave ou das credenciais do provedor; sem isso o pedido entra, mas o pagamento não é confirmado sozinho.',\n celebrate: 'Recebimento no lugar 💳',\n script: [\n { kind: 'goto', route: '/settings/shop-payments' },\n {\n kind: 'ask',\n text: 'Estamos em Pagamentos. Pergunte como a pessoa recebe hoje (Pix, cartão, maquininha) antes de falar de provedor, e ligue a forma que ela usar.',\n },\n ],\n },\n {\n key: 'shipping',\n title: 'Configure a entrega',\n description: 'Zonas, prazos e quanto custa o frete.',\n icon: 'Truck',\n route: '/settings/shop-shipping',\n agentHint:\n 'Pergunte até onde entregam e como (carro próprio, transportadora, retirada). Frete errado é o motivo nº 1 de carrinho abandonado.',\n howTo:\n 'Configurações › Entrega. Crie uma zona (por CEP ou por cidade), diga o prazo e o preço — pode ser valor fixo para começar. Retirada no local é uma zona com frete zero.',\n celebrate: 'Entrega configurada 🚚',\n script: [\n { kind: 'goto', route: '/settings/shop-shipping' },\n {\n kind: 'ask',\n text: 'Estamos em Entrega. Pergunte até onde a pessoa entrega e como, e monte a primeira zona junto com ela.',\n },\n ],\n },\n {\n key: 'discount',\n title: 'Crie um cupom de desconto',\n description: 'Dê um motivo para o cliente fechar a primeira compra.',\n icon: 'Tag',\n route: '/discounts',\n priority: 'low',\n agentHint:\n 'Este é passo de growth: sugira um cupom de primeira compra e ajude a decidir o valor. Se houver colega de growth, passe a bola.',\n howTo:\n 'Descontos › Adicionar. Escolha o código (algo curto, tipo BEMVINDO10), o tipo (percentual ou valor) e até quando vale. O cliente digita esse código no checkout.',\n },\n {\n key: 'first-order',\n title: 'Receba seu primeiro pedido',\n description: 'Faça um pedido de teste e veja ele cair aqui dentro.',\n icon: 'ShoppingBag',\n route: '/orders',\n agentHint:\n 'Um pedido de teste é o que transforma \"acho que está no ar\" em \"está no ar\". Acompanhe até ele aparecer na lista.',\n howTo:\n 'Abra sua vitrine como se fosse um cliente, escolha um produto e finalize a compra. O pedido aparece em Pedidos em segundos — e é assim que você confere que preço, frete e pagamento estão certos antes do primeiro cliente de verdade.',\n celebrate: 'Primeiro pedido na casa 🛍️',\n script: [\n {\n kind: 'say',\n text: 'Último: um pedido de teste. Abra sua vitrine como se fosse um cliente e finalize uma compra — eu aviso aqui quando ele cair.',\n },\n { kind: 'goto', route: '/orders' },\n {\n kind: 'point',\n anchor: 'nav./orders',\n title: 'Todo pedido cai aqui',\n body: 'Pago, em separação, enviado — o estado de cada venda vive nesta lista.',\n waitForUser: true,\n },\n ],\n check: async () => (await countByTenant('v_shop_orders')) > 0,\n tour: {\n id: 'shop.orders',\n stops: [\n {\n anchor: 'nav./orders',\n title: 'Todo pedido cai aqui',\n body: 'Pago, em separação, enviado — o estado de cada venda vive nesta lista.',\n route: '/orders',\n },\n ],\n },\n },\n ] as OnboardingProgramDef['steps']).filter((s) => withProducts || s.key !== 'catalog'),\n }\n}\n","import type { ShippingLabelProvider, ShopProvider } from '@fayz-ai/shop'\n\n// The Melhor Envio implementation of the label port. It knows its own connector\n// slug and nothing else the panel needs: every screen goes through\n// resolveShippingLabelProvider, so a second carrier is a second file like this\n// one and no change anywhere else.\n\nexport const MELHOR_ENVIO_CARRIER = 'melhor-envio'\n\nexport function createMelhorEnvioLabelProvider(\n resolve: () => ShopProvider,\n): ShippingLabelProvider {\n const unsupported = () => {\n throw new Error('Este painel não sabe comprar etiquetas nesta loja.')\n }\n\n return {\n id: MELHOR_ENVIO_CARRIER,\n label: 'Melhor Envio',\n quote: async (orderId) =>\n (await resolve().quoteShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n buy: async (orderId, serviceId) =>\n (await resolve().buyShippingLabel?.(orderId, serviceId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n print: async (orderId) =>\n (await resolve().printShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n track: async (orderId) =>\n (await resolve().trackShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n }\n}\n","import { AskAIButton, DetailTabHeader } from '@fayz-ai/admin'\nimport { Button, Skeleton } from '@fayz-ai/ui'\nimport { Plus, UploadCloud } from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider, footer }: {\n item: unknown\n getProvider: () => ShopProvider\n /** Under the gallery: where else this content lives. */\n footer?: React.ReactNode\n}) {\n const product = item as Product\n // `null` until the first read: an empty gallery and a gallery still loading are not the same screen.\n const [images, setImages] = useState<ProductImage[] | null>(null)\n const [dragging, setDragging] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => {\n setImages(null)\n void reload().catch((err: unknown) => { setImages([]); setError(errorMessage(err)) })\n }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(picked: FileList | File[] | null) {\n const files = Array.from(picked ?? []).filter((file) => file.type.startsWith('image/'))\n if (!files.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of files) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (!images || target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n // The whole tab takes a drop: aiming at a small box with six files in hand\n // is the part of uploading that goes wrong.\n <div\n className=\"space-y-4\"\n onDragOver={(event) => { if (event.dataTransfer.types.includes('Files')) { event.preventDefault(); setDragging(true) } }}\n onDragLeave={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setDragging(false) }}\n onDrop={(event) => {\n if (!event.dataTransfer.files.length) return\n event.preventDefault()\n setDragging(false)\n void upload(event.dataTransfer.files)\n }}\n >\n <DetailTabHeader\n title=\"Fotos do produto\"\n description=\"A capa é a foto do produto em todo lugar: no cadastro, no estoque, no catálogo, no carrinho e no pedido. As demais viram o carrossel na página do produto.\"\n actions={\n // The same Button as every other tab. It used to be a <label> hand-\n // painted to look like one, which drifted the moment the real button\n // changed — different height, no icon, no disabled state.\n <Button disabled={busy} onClick={() => fileRef.current?.click()}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n </Button>\n }\n />\n\n {/* The picker itself: opened by the button, never shown. */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images === null ? (\n <ul className=\"fz-cards gap-3\" aria-busy=\"true\">\n {[0, 1, 2, 3].map((i) => (\n <li key={i} className=\"overflow-hidden rounded-lg border\">\n <Skeleton className=\"aspect-square w-full rounded-none\" />\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </li>\n ))}\n </ul>\n ) : images.length === 0 || dragging ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className={`flex w-full flex-col items-center gap-2 rounded-lg border border-dashed px-4 py-10 text-center text-sm transition-colors ${\n dragging ? 'border-primary bg-primary/5 text-foreground' : 'text-muted-foreground hover:bg-muted/40'\n }`}\n >\n <UploadCloud className=\"h-6 w-6\" aria-hidden />\n <span className=\"font-medium\">{dragging ? 'Solte para enviar' : 'Arraste as fotos para cá, ou clique para escolher'}</span>\n {!dragging && (\n <span className=\"max-w-md text-xs\">\n Produtos com mais de uma foto vendem melhor — mostre a embalagem, o produto pronto e uma referência de tamanho.\n </span>\n )}\n </button>\n ) : (\n <ul className=\"fz-cards gap-3\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-1 gap-y-1.5 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex items-center gap-1\">\n {!image.isPrimary && update && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"whitespace-nowrap rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </button>\n )}\n <AskAIButton\n size=\"sm\"\n variant=\"outline\"\n className=\"h-6 px-2 text-xs\"\n label=\"IA\"\n media={{ url: image.url, name: image.altText ?? product.name }}\n draft=\"Melhora essa imagem\"\n hint=\"o que você quer mudar nessa foto\"\n intro={{\n persona: 'Estúdio de imagem',\n pitch: `Vamos melhorar a foto de ${product.name}.`,\n description: 'Posso limpar o fundo, corrigir luz e cor, e gerar uma versão em resolução maior para o catálogo.',\n suggestions: [\n { label: 'Fundo branco', prompt: 'Remove o fundo e deixa branco' },\n { label: 'Mais nítida', prompt: 'Aumenta a resolução e a nitidez' },\n ],\n }}\n />\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n {footer}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React from 'react'\nimport type { Product, ProductVariant, ShopProvider, VariantAxisInput, VariantMatrixRow } from '@fayz-ai/shop'\nimport {\n applyVariantMatrix, axesFromOptions, formatVariantCombination, hasOnlyDefaultVariant,\n leavesNothingSellable, MAX_VARIANT_AXES, planVariantMatrix, validateVariantAxes,\n} from '@fayz-ai/shop'\nimport { AlertTriangle, Loader2, Plus, Trash2, X } from 'lucide-react'\nimport { Button, Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle } from '@fayz-ai/ui'\nimport { DetailTabHeader } from '@fayz-ai/admin'\n\n/**\n * Variantes — os eixos de opção e a matriz que eles geram.\n *\n * A tela que faltava. As tabelas existem desde a 0028, a vitrine monta o\n * seletor a partir delas desde o M5 e o `shop_place_order` cobra por elas desde\n * a 0029 — mas nenhuma tela do admin sabia criá-las. Na prática, ou o lojista\n * chamava alguém com acesso ao banco, ou vendia P, M e G contra o mesmo\n * contador, que é exatamente o defeito que o cabeçalho da 0028 descreve.\n *\n * DUAS COISAS AQUI NÃO SÃO ESCOLHA DE TELA, e é por isso que elas moram no\n * @fayz-ai/shop e não neste arquivo:\n *\n * • A VARIANTE PADRÃO (0037). Todo produto tem uma, ela não aparece em lugar\n * nenhum, e sumir com o último eixo tem que trazê-la de volta — senão o\n * produto fica esgotado para sempre e ninguém vê erro. `applyVariantMatrix`\n * é quem sabe disso.\n * • O ESTOQUE. Desde a 0034 ele é razão, não coluna: quem digita 12 aqui não\n * escreve 12 em lugar nenhum, gera o movimento da DIFERENÇA e deixa a 0036\n * espelhar de volta. `setVariantStock` é quem sabe disso.\n */\nexport function ProductVariantsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const shop = getProvider()\n // Os quatro verbos que esta tela chama. Checar só um deixaria a aba abrir e\n // quebrar no primeiro clique — que é pior do que não abrir.\n const supported =\n typeof shop.getProductVariants === 'function' &&\n typeof shop.saveProductOptions === 'function' &&\n typeof shop.createProductVariant === 'function' &&\n typeof shop.updateProductVariant === 'function'\n\n const [axes, setAxes] = React.useState<VariantAxisInput[]>([])\n const [variants, setVariants] = React.useState<ProductVariant[]>([])\n const [busy, setBusy] = React.useState(false)\n // Nova opção nasce num modal e chega pronta. Appending an empty axis put a\n // half-built row in the list — a name-less option the matrix already counted.\n const [adding, setAdding] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n const [dirty, setDirty] = React.useState(false)\n\n const reload = React.useCallback(async () => {\n // includeArchived: uma combinação removida e recolocada tem que REVIVER a\n // linha antiga — a 0028 tem UNIQUE (product_id, options) e um INSERT novo\n // bateria nela.\n const set = await getProvider().getProductVariants!(product.id, { includeArchived: true })\n setAxes(axesFromOptions(set.options))\n setVariants(set.variants)\n setSelected(new Set())\n setDirty(false)\n }, [getProvider, product.id])\n\n React.useEffect(() => {\n if (!supported) return\n void reload().catch((e) => setError(message(e)))\n }, [reload, supported])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (e) {\n setError(message(e))\n } finally {\n setBusy(false)\n }\n }\n\n const plan = React.useMemo(() => planVariantMatrix(axes, variants), [axes, variants])\n const axisError = validateVariantAxes(axes)\n const onlyDefault = hasOnlyDefaultVariant(variants)\n const rows = plan.rows\n\n function patchAxes(next: VariantAxisInput[]) {\n setAxes(next)\n setDirty(true)\n }\n\n const save = () => run(() => applyVariantMatrix(getProvider(), product.id, axes, variants))\n\n if (!supported) {\n return <Notice>Este provedor de loja não administra variantes.</Notice>\n }\n\n return (\n <div className=\"space-y-6\">\n {/* — Eixos — */}\n <section className=\"space-y-3\">\n <DetailTabHeader\n title=\"Opções\"\n description=\"Tamanho, cor, sabor. Cada combinação vira uma variante com preço, SKU e estoque próprios — é assim que P e GG deixam de dividir o mesmo contador.\"\n actions={\n // Same Button as the other two tabs. It used to be a bare <button>\n // at text-xs with its own border, which read as a lesser control\n // than \"Dar entrada\" one tab over, for no reason anybody chose.\n <Button\n disabled={busy || axes.length >= MAX_VARIANT_AXES}\n onClick={() => setAdding(true)}\n >\n <Plus className=\"mr-1.5 h-4 w-4\" /> Adicionar opção\n </Button>\n }\n />\n\n <NewAxisModal\n open={adding}\n onClose={() => setAdding(false)}\n onCreate={(axis) => { patchAxes([...axes, axis]); setAdding(false) }}\n />\n\n {axes.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto é vendido de um jeito só. Adicione uma opção se ele tem tamanhos, cores ou sabores.\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {axes.map((axis, index) => (\n <AxisEditor\n key={index}\n axis={axis}\n index={index}\n count={axes.length}\n disabled={busy}\n onChange={(next) => patchAxes(axes.map((a, i) => (i === index ? next : a)))}\n onMove={(delta) => {\n const target = index + delta\n if (target < 0 || target >= axes.length) return\n const next = [...axes]\n const [moved] = next.splice(index, 1)\n next.splice(target, 0, moved!)\n patchAxes(next)\n }}\n onRemove={() => patchAxes(axes.filter((_, i) => i !== index))}\n />\n ))}\n </ul>\n )}\n\n {axisError && <Notice tone=\"error\">{axisError}</Notice>}\n {!axisError && leavesNothingSellable(plan) && (\n <Notice tone=\"error\">\n Sem nenhuma opção este produto ficaria sem nada vendável — ele não tem a variante padrão\n que a plataforma cria hoje. Fale com o suporte antes de salvar.\n </Notice>\n )}\n\n {dirty && (\n <div className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-muted/30 px-4 py-3\">\n <p className=\"flex-1 text-xs text-muted-foreground\">\n {describePlan(plan)}\n </p>\n <button type=\"button\" disabled={busy} onClick={() => void reload()}\n className=\"rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted disabled:opacity-40\">\n Descartar\n </button>\n <button\n type=\"button\"\n disabled={busy || Boolean(axisError)}\n onClick={save}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground disabled:opacity-50\"\n >\n {busy && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Salvar variantes\n </button>\n </div>\n )}\n </section>\n\n {error && <Notice tone=\"error\">{error}</Notice>}\n\n {/* — Matriz — */}\n {rows.length > 0 && (\n <VariantGrid\n rows={rows}\n axes={axes}\n product={product}\n busy={busy}\n dirty={dirty}\n selected={selected}\n onSelect={setSelected}\n onSave={(variantId, patch) => run(() => getProvider().updateProductVariant!(variantId, patch))}\n onStock={(variantId, count) => run(() => getProvider().setVariantStock!(variantId, count))}\n />\n )}\n\n {rows.length === 0 && onlyDefault && (\n <p className=\"text-xs text-muted-foreground\">\n Preço, SKU e estoque deste produto continuam na aba de cadastro.\n </p>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Eixo\n// ---------------------------------------------------------------------------\n\nfunction AxisEditor({ axis, index, count, disabled, onChange, onMove, onRemove }: {\n axis: VariantAxisInput\n index: number\n count: number\n disabled: boolean\n onChange: (next: VariantAxisInput) => void\n onMove: (delta: number) => void\n onRemove: () => void\n}) {\n const [draft, setDraft] = React.useState('')\n\n function commit(raw: string) {\n // Vírgula separa: colar \"P, M, G\" é como um lojista digita uma grade, e\n // pedir três enters para isso é atrito sem motivo.\n const values = raw.split(',').map((v) => v.trim()).filter(Boolean)\n if (values.length === 0) return\n const merged = [...axis.values]\n for (const value of values) if (!merged.includes(value)) merged.push(value)\n onChange({ ...axis, values: merged })\n setDraft('')\n }\n\n return (\n <li className=\"rounded-card border bg-card p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <input\n value={axis.name}\n disabled={disabled}\n onChange={(e) => onChange({ ...axis, name: e.target.value })}\n placeholder=\"Tamanho\"\n aria-label={`Nome da opção ${index + 1}`}\n className=\"h-8 w-40 rounded-input border border-input bg-background px-2 text-sm font-medium\"\n />\n <span className=\"flex-1\" />\n <IconButton label=\"Mover para cima\" disabled={disabled || index === 0} onClick={() => onMove(-1)}>↑</IconButton>\n <IconButton label=\"Mover para baixo\" disabled={disabled || index === count - 1} onClick={() => onMove(1)}>↓</IconButton>\n <button\n type=\"button\"\n aria-label=\"Remover opção\"\n disabled={disabled}\n onClick={onRemove}\n className=\"rounded p-1.5 text-muted-foreground transition hover:text-destructive disabled:opacity-40\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n {axis.values.map((value, position) => (\n <span key={value} className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs\">\n {value}\n <button\n type=\"button\"\n aria-label={`Remover ${value}`}\n disabled={disabled}\n onClick={() => onChange({ ...axis, values: axis.values.filter((_, i) => i !== position) })}\n className=\"text-muted-foreground hover:text-destructive disabled:opacity-40\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <input\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(draft) }\n }}\n onBlur={() => commit(draft)}\n placeholder={axis.values.length === 0 ? 'P, M, G' : 'adicionar'}\n aria-label={`Valores da opção ${index + 1}`}\n className=\"h-7 min-w-28 flex-1 rounded-input border border-dashed border-input bg-transparent px-2 text-xs\"\n />\n </div>\n </li>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Matriz\n// ---------------------------------------------------------------------------\n\nconst UNITS = ['kg', 'g', 'lb']\n\nfunction VariantGrid({ rows, axes, product, busy, dirty, selected, onSelect, onSave, onStock }: {\n rows: VariantMatrixRow[]\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n dirty: boolean\n selected: Set<string>\n onSelect: (next: Set<string>) => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const saved = rows.filter((row) => row.variant)\n const allSelected = saved.length > 0 && saved.every((row) => selected.has(row.variant!.id))\n\n function toggle(id: string) {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelect(next)\n }\n\n return (\n <section className=\"space-y-3\">\n <DetailTabHeader\n title=\"Variantes\"\n description={\n <>\n Preço vazio herda o preço do produto — o catálogo em que todo tamanho custa igual não precisa\n repetir o número {rows.length} vezes. Medida vazia herda a do produto, do mesmo jeito.\n </>\n }\n />\n\n {dirty && (\n <Notice>\n As linhas abaixo ainda refletem o que está salvo. Salve as opções para gerar as novas combinações.\n </Notice>\n )}\n\n {selected.size > 0 && (\n <BulkBar\n count={selected.size}\n disabled={busy}\n onApply={(patch) => {\n for (const id of selected) onSave(id, patch)\n }}\n onClear={() => onSelect(new Set())}\n />\n )}\n\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full min-w-[62rem] text-sm\">\n <thead className=\"bg-muted/40 text-left text-xs text-muted-foreground\">\n <tr>\n <th className=\"w-9 px-2 py-2\">\n <input\n type=\"checkbox\"\n aria-label=\"Selecionar todas\"\n checked={allSelected}\n disabled={busy || saved.length === 0}\n onChange={() => onSelect(allSelected ? new Set() : new Set(saved.map((r) => r.variant!.id)))}\n />\n </th>\n <th className=\"px-2 py-2 font-medium\">Variante</th>\n <th className=\"px-2 py-2 font-medium\">Preço</th>\n <th className=\"px-2 py-2 font-medium\">Comparativo</th>\n <th className=\"px-2 py-2 font-medium\">SKU</th>\n <th className=\"px-2 py-2 font-medium\">Estoque</th>\n <th className=\"px-2 py-2 font-medium\">Peso</th>\n <th className=\"px-2 py-2 font-medium\">A × L × C (cm)</th>\n <th className=\"px-2 py-2 font-medium\">Foto</th>\n <th className=\"px-2 py-2 font-medium\">Ativa</th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {rows.map((row) => (\n <VariantRow\n key={row.variant?.id ?? formatVariantCombination(row.options, axes)}\n row={row}\n axes={axes}\n product={product}\n busy={busy}\n checked={row.variant ? selected.has(row.variant.id) : false}\n onToggle={() => row.variant && toggle(row.variant.id)}\n onSave={onSave}\n onStock={onStock}\n />\n ))}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\nfunction VariantRow({ row, axes, product, busy, checked, onToggle, onSave, onStock }: {\n row: VariantMatrixRow\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n checked: boolean\n onToggle: () => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const variant = row.variant\n const pending = !variant\n const label = formatVariantCombination(row.options, axes)\n\n // Só grava no blur, e só quando mudou: cada campo é um UPDATE e o estoque é\n // um movimento no razão — disparar a cada tecla encheria o histórico de\n // ajustes de um dígito.\n const commit = (field: string, value: unknown, previous: unknown) => {\n if (!variant || value === previous) return\n onSave(variant.id, { [field]: value })\n }\n\n return (\n <tr className={pending ? 'bg-muted/20 text-muted-foreground' : undefined}>\n <td className=\"px-2 py-1.5\">\n <input type=\"checkbox\" aria-label={`Selecionar ${label}`} checked={checked}\n disabled={busy || pending} onChange={onToggle} />\n </td>\n <td className=\"px-2 py-1.5 font-medium\">\n {label}\n {pending && <span className=\"ml-2 text-[10px] uppercase tracking-wide\">a criar</span>}\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.price ?? null} disabled={busy || pending}\n placeholder={String(product.price)} onCommit={(v) => commit('price', v, variant?.price ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.compareAtPrice ?? null} disabled={busy || pending}\n placeholder=\"—\" onCommit={(v) => commit('compareAtPrice', v, variant?.compareAtPrice ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <TextCell value={variant?.sku ?? ''} disabled={busy || pending}\n placeholder={product.sku ?? 'SKU'} onCommit={(v) => commit('sku', v || null, variant?.sku ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell\n value={variant?.inventoryCount ?? null}\n disabled={busy || pending}\n placeholder=\"0\"\n integer\n onCommit={(v) => {\n if (!variant || v == null || v === variant.inventoryCount) return\n onStock(variant.id, v)\n }}\n />\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <NumberCell value={variant?.weight ?? null} disabled={busy || pending}\n placeholder={product.weight == null ? '—' : String(product.weight)} width=\"w-16\"\n onCommit={(v) => commit('weight', v, variant?.weight ?? null)} />\n <select\n value={variant?.weightUnit ?? ''}\n disabled={busy || pending}\n onChange={(e) => commit('weightUnit', e.target.value || null, variant?.weightUnit ?? null)}\n aria-label={`Unidade de peso de ${label}`}\n className=\"h-7 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">{product.weightUnit}</option>\n {UNITS.map((unit) => <option key={unit} value={unit}>{unit}</option>)}\n </select>\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n {(['heightCm', 'widthCm', 'lengthCm'] as const).map((key) => (\n <NumberCell\n key={key}\n value={variant?.[key] ?? null}\n disabled={busy || pending}\n width=\"w-14\"\n placeholder={product[key] == null ? '—' : String(product[key])}\n onCommit={(v) => commit(key, v, variant?.[key] ?? null)}\n />\n ))}\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <select\n value={variant?.imageId ?? ''}\n disabled={busy || pending || product.images.length === 0}\n onChange={(e) => commit('imageId', e.target.value || null, variant?.imageId ?? null)}\n aria-label={`Foto de ${label}`}\n className=\"h-7 w-24 rounded-input border border-input bg-background px-1 text-xs\"\n >\n <option value=\"\">capa</option>\n {product.images.map((image, index) => (\n <option key={image.id} value={image.id}>Foto {index + 1}</option>\n ))}\n </select>\n </td>\n <td className=\"px-2 py-1.5\">\n <input\n type=\"checkbox\"\n aria-label={`${label} ativa`}\n checked={variant?.status === 'active'}\n disabled={busy || pending}\n onChange={(e) => commit('status', e.target.checked ? 'active' : 'archived', variant?.status)}\n />\n </td>\n </tr>\n )\n}\n\n/** Preço e peso em massa — os dois que o Shopify tem, e os dois que uma grade\n * inteira costuma compartilhar. */\nfunction BulkBar({ count, disabled, onApply, onClear }: {\n count: number\n disabled: boolean\n onApply: (patch: Record<string, unknown>) => void\n onClear: () => void\n}) {\n const [price, setPrice] = React.useState('')\n const [weight, setWeight] = React.useState('')\n const [unit, setUnit] = React.useState('')\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-xs\">\n <span className=\"font-medium\">{count} selecionada{count > 1 ? 's' : ''}</span>\n <span className=\"text-muted-foreground\">·</span>\n <input value={price} onChange={(e) => setPrice(e.target.value)} placeholder=\"Preço\"\n aria-label=\"Preço para todas\" className=\"h-7 w-24 rounded-input border border-input bg-background px-2\" />\n <button type=\"button\" disabled={disabled || parseNumber(price) == null}\n onClick={() => { onApply({ price: parseNumber(price) }); setPrice('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar preço\n </button>\n <span className=\"text-muted-foreground\">·</span>\n <input value={weight} onChange={(e) => setWeight(e.target.value)} placeholder=\"Peso\"\n aria-label=\"Peso para todas\" className=\"h-7 w-20 rounded-input border border-input bg-background px-2\" />\n <select value={unit} onChange={(e) => setUnit(e.target.value)} aria-label=\"Unidade para todas\"\n className=\"h-7 rounded-input border border-input bg-background px-1\">\n <option value=\"\">herdar</option>\n {UNITS.map((u) => <option key={u} value={u}>{u}</option>)}\n </select>\n <button type=\"button\" disabled={disabled || parseNumber(weight) == null}\n onClick={() => { onApply({ weight: parseNumber(weight), weightUnit: unit || null }); setWeight('') }}\n className=\"rounded-md border px-2 py-1 font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar peso\n </button>\n <span className=\"flex-1\" />\n <button type=\"button\" onClick={onClear} className=\"text-muted-foreground hover:text-foreground\">\n limpar seleção\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Peças\n// ---------------------------------------------------------------------------\n\n/** '2,5' e '2.5' são a mesma medida — o lojista digita como o teclado dele manda. */\nexport function parseNumber(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nfunction NumberCell({ value, disabled, placeholder, onCommit, width = 'w-20', integer }: {\n value: number | null\n disabled?: boolean\n placeholder?: string\n onCommit: (value: number | null) => void\n width?: string\n integer?: boolean\n}) {\n const [draft, setDraft] = React.useState(value == null ? '' : String(value))\n React.useEffect(() => { setDraft(value == null ? '' : String(value)) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n const parsed = parseNumber(draft)\n onCommit(parsed == null ? null : integer ? Math.trunc(parsed) : parsed)\n }}\n className={`h-7 ${width} rounded-input border border-input bg-background px-2 text-xs tabular-nums`}\n />\n )\n}\n\nfunction TextCell({ value, disabled, placeholder, onCommit }: {\n value: string\n disabled?: boolean\n placeholder?: string\n onCommit: (value: string) => void\n}) {\n const [draft, setDraft] = React.useState(value)\n React.useEffect(() => { setDraft(value) }, [value])\n return (\n <input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft.trim())}\n className=\"h-7 w-28 rounded-input border border-input bg-background px-2 text-xs\"\n />\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </button>\n )\n}\n\nfunction Notice({ children, tone }: { children: React.ReactNode; tone?: 'error' }) {\n const cls = tone === 'error'\n ? 'border-destructive/30 bg-destructive/5 text-destructive'\n : 'border-border bg-muted/30 text-muted-foreground'\n return (\n <p className={`flex items-start gap-2 rounded-md border px-3 py-2 text-xs ${cls}`}>\n {tone === 'error' && <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />}\n <span>{children}</span>\n </p>\n )\n}\n\nfunction describePlan(plan: ReturnType<typeof planVariantMatrix>): string {\n const parts: string[] = []\n if (plan.create.length) parts.push(`${plan.create.length} a criar`)\n if (plan.reactivate.length) parts.push(`${plan.reactivate.length} a reativar`)\n if (plan.archive.length) parts.push(`${plan.archive.length} a arquivar`)\n if (parts.length === 0) return 'Nenhuma combinação muda.'\n // Arquivar e não excluir: a 0034 apaga o saldo junto com a variante, e o\n // estoque que sobrou é de mercadoria que o lojista ainda tem na prateleira.\n return `${parts.join(', ')}. Combinações removidas são arquivadas, nunca excluídas — o estoque delas continua no histórico.`\n}\n\nfunction message(error: unknown): string {\n return errorMessage(error)\n}\n\n\n/**\n * Nova opção, num modal com a mesma anatomia do resto: cabeçalho diz o que é,\n * corpo pergunta, rodapé decide.\n *\n * It creates a COMPLETE axis. The old button appended `{ name: '', values: [] }`\n * straight into the list, so an option existed — and was counted by the matrix\n * planner — before it had a name or a single value.\n */\nfunction NewAxisModal({ open, onClose, onCreate }: {\n open: boolean\n onClose: () => void\n onCreate: (axis: VariantAxisInput) => void\n}) {\n const [name, setName] = React.useState('')\n // A LIST, one value per row — the shape Shopify uses, and the shape the thing\n // itself has. A comma-separated box asks the shopkeeper to encode a list into\n // a string and hides the count until they get the separator right; a value\n // containing a comma was simply unrepresentable.\n //\n // The last row is always empty: typing in it grows the list, so \"add another\"\n // is not a button you have to find.\n const [values, setValues] = React.useState<string[]>([''])\n\n React.useEffect(() => { if (open) { setName(''); setValues(['']) } }, [open])\n\n function setValue(index: number, next: string) {\n setValues((prev) => {\n const out = [...prev]\n out[index] = next\n // Grow when the last row starts being used; never leave two empties.\n if (index === out.length - 1 && next.trim()) out.push('')\n return out\n })\n }\n\n function removeValue(index: number) {\n setValues((prev) => {\n const out = prev.filter((_, i) => i !== index)\n return out.length === 0 || out[out.length - 1]!.trim() ? [...out, ''] : out\n })\n }\n\n const filled = values.map((v) => v.trim()).filter(Boolean)\n // Duplicates would silently collapse into one column of the matrix.\n const unique = [...new Set(filled)]\n const hasDuplicate = unique.length !== filled.length\n const ready = name.trim().length > 0 && unique.length > 0 && !hasDuplicate\n\n return (\n <Modal open={open} onOpenChange={(o: boolean) => { if (!o) onClose() }}>\n <ModalContent className=\"sm:max-w-md\">\n <ModalHeader>\n <ModalTitle>Nova opção</ModalTitle>\n <ModalDescription>\n Cada combinação de opções vira uma variante com preço, SKU e estoque próprios.\n </ModalDescription>\n </ModalHeader>\n\n <div className=\"space-y-3 py-2\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Nome</span>\n <input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Tamanho\"\n className=\"mt-1 h-9 w-full rounded-md border bg-background px-2.5 text-sm outline-none focus:border-primary\"\n />\n </label>\n\n <div>\n <span className=\"text-xs font-medium text-muted-foreground\">Valores</span>\n <ul className=\"mt-1 space-y-1.5\">\n {values.map((value, index) => (\n <li key={index} className=\"flex items-center gap-1.5\">\n <input\n value={value}\n onChange={(e) => setValue(index, e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n if (index === values.length - 1 && value.trim()) setValue(index, value)\n // Focus follows the row that was just created.\n const rows = e.currentTarget.closest('ul')?.querySelectorAll('input')\n window.setTimeout(() => rows?.[index + 1]?.focus(), 0)\n }\n }}\n placeholder={index === values.length - 1 ? 'Adicionar valor' : ''}\n aria-label={`Valor ${index + 1}`}\n className=\"h-9 w-full rounded-md border bg-background px-2.5 text-sm outline-none focus:border-primary\"\n />\n {/* No remove on the trailing empty row: there is nothing to\n remove, and a dead button beside every list is noise. */}\n {index < values.length - 1 && (\n <button\n type=\"button\"\n onClick={() => removeValue(index)}\n aria-label={`Remover valor ${index + 1}`}\n className=\"fz-tap shrink-0 rounded-md p-1.5 text-muted-foreground transition hover:bg-muted hover:text-destructive\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n {hasDuplicate && (\n <span className=\"mt-1 block text-[11px] text-destructive\">\n Há valores repetidos — cada um vira uma variante, então dois iguais viram uma só.\n </span>\n )}\n </div>\n </div>\n\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onClose}>Cancelar</Button>\n <Button disabled={!ready} onClick={() => onCreate({ name: name.trim(), values: unique })}>\n Adicionar\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport { normalizeMovementType, type MovementType } from '@fayz-ai/plugin-inventory'\nimport { getActiveTenantId, emitDataChanged } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\n// O razão inteiro vive no subpath, que é onde StockEntryModal já busca o\n// vocabulário — a raiz do pacote carrega só o que a vitrine precisa.\nimport {\n createSupabaseStockStore, listStockReasonCodes, resolveStockStore,\n type StockBalance, type StockLocation, type StockReasonCode,\n} from '@fayz-ai/shop/inventory'\nimport { errorMessage } from '../settings/error-message'\nimport { listProductsCached } from '../data/shared'\nimport { candidateMeta, resolveTerm } from './product-matching'\n\n// ---------------------------------------------------------------------------\n// Entrada e saída pela conversa — o razão de estoque com uma porta de balcão.\n//\n// A loja já tem o razão de verdade desde a 0034: movimento IMUTÁVEL, saldo\n// projetado por gatilho, reserva, lote e local, com o vocabulário guardado como\n// LINHA (o lojista acrescenta \"quebra de vitrine\" sem migration) e um validador\n// só, compartilhado entre o TypeScript e o SQL. Nada disso se reescreve aqui —\n// este arquivo só abre a porta que faltava: a de quem fala.\n//\n// O verbo vem do plugin-inventory de propósito. Ele é quem já sabe que\n// \"entrada\", \"saída\", \"ajuste\", \"perda\" e \"transferência\" são as cinco coisas\n// que um humano diz, e ele já normaliza as grafias (com acento, sem acento) que\n// beauty e resto importaram de sistemas velhos. O razão da loja tem OITO\n// espécies porque também registra o que a venda faz; as cinco humanas são um\n// recorte dele, não um segundo vocabulário.\n//\n// A regra de sinal é do razão e não se negocia: `in` exige positivo, `out`\n// exige negativo, `either` aceita qualquer coisa diferente de zero. O lojista\n// diz \"saída de 3\" — quem põe o sinal é este arquivo, nunca o modelo.\n// ---------------------------------------------------------------------------\n\n/** Como cada verbo humano cai no razão da loja. */\nconst KIND_OF: Record<MovementType, { kind: string; sign: -1 | 1 | 0; reason: string }> = {\n // `sign: 0` = o razão aceita os dois lados (ajuste corrige para cima e para baixo).\n entry: { kind: 'receipt', sign: 1, reason: 'purchase' },\n exit: { kind: 'adjustment', sign: -1, reason: 'correction' },\n adjustment: { kind: 'adjustment', sign: 0, reason: 'correction' },\n loss: { kind: 'loss', sign: -1, reason: 'breakage' },\n // Transferência é DOIS movimentos amarrados, com origem e destino. Metade de\n // uma transferência é estoque sumindo de um lugar e não aparecendo no outro.\n transfer: { kind: 'transfer_out', sign: -1, reason: 'transfer' },\n}\n\nexport interface MovementPlan {\n kind: string\n quantity: number\n reasonCode: string\n}\n\n/**\n * O que o lojista disse, traduzido para uma linha do razão.\n *\n * A razão manda na espécie quando ela implica uma: \"saída por quebra\" não é um\n * ajuste com uma observação, é uma PERDA — e o relatório de perdas do mês\n * depende dessa diferença. Por isso a tabela de razões é consultada antes de a\n * espécie do verbo valer.\n */\nexport function planMovement(\n rawType: string,\n quantity: number,\n reasonCode?: string,\n): MovementPlan | { error: string; message: string } {\n const type = normalizeMovementType(rawType)\n if (!type) {\n return { error: 'unknown_movement_type', message: 'Use entrada, saída, ajuste ou perda.' }\n }\n if (type === 'transfer') {\n return {\n error: 'transfer_unsupported',\n message: 'Transferência entre locais precisa de origem e destino — ainda não faço por aqui.',\n }\n }\n const magnitude = Math.abs(Number(quantity) || 0)\n if (magnitude === 0) return { error: 'zero_quantity', message: 'Movimento de zero não é movimento.' }\n\n const fallback = KIND_OF[type]\n const declared = reasonCode\n ? listStockReasonCodes().find((r: StockReasonCode) => r.key === reasonCode)\n : undefined\n const kind = declared?.movementKind ?? fallback.kind\n // Um ajuste explícito pode ir para os dois lados; o sinal vem do que veio.\n const sign = fallback.sign === 0 ? (Number(quantity) < 0 ? -1 : 1) : fallback.sign\n return { kind, quantity: magnitude * sign, reasonCode: declared?.key ?? fallback.reason }\n}\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst WHERE_IS: PluginAITool = {\n id: 'shop.stock.position',\n name: 'getStockPosition',\n description:\n 'Answers \"where is my X\" for a product the merchant names in words: how many are on hand, how many are held for orders, '\n + 'and how that splits across locations and lots. Resolves the words itself — send the term as the merchant said it. '\n + 'When two products fit equally it asks with a card instead of guessing.',\n icon: 'Boxes',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: { term: { type: 'string', description: 'The product, in the merchant\\'s words.' } },\n required: ['term'],\n },\n}\n\nconst RECORD: PluginAITool = {\n id: 'shop.stock.record',\n name: 'recordStockMovement',\n description:\n 'Writes one line in the stock ledger: entrada, saída, ajuste or perda. Takes the `variantId` from getStockPosition — never a name. '\n + 'Send the quantity as a plain positive number and say which movement it is; the sign belongs to the ledger, not to you. '\n + 'The ledger is append-only: a mistake is corrected by an opposing movement, never by editing. '\n + '`occurredAt` is WHEN the goods moved, which is not when they were typed — Friday\\'s delivery entered on Monday.',\n icon: 'ArrowDownToLine',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'update' },\n parameters: {\n type: 'object',\n properties: {\n variantId: { type: 'string', description: 'From getStockPosition.' },\n productName: { type: 'string', description: 'So the merchant reads the card without ids.' },\n movementType: {\n type: 'string',\n description: 'entrada | saída | ajuste | perda',\n enum: ['entrada', 'saida', 'ajuste', 'perda'],\n },\n quantity: { type: 'number', description: 'How many, as a positive number.' },\n reasonCode: { type: 'string', description: 'Reason key when the merchant gave one (purchase, breakage, expiry, theft…).' },\n locationId: { type: 'string', description: 'Which location. Omitted means the store default.' },\n note: { type: 'string', description: 'Anything the merchant said that is not a field — the invoice number, who delivered.' },\n occurredAt: { type: 'string', description: 'ISO date when it actually moved. Omitted means now.' },\n },\n required: ['variantId', 'productName', 'movementType', 'quantity'],\n },\n}\n\n/**\n * O razão não está NESTA loja.\n *\n * O ledger inteiro — `plg_shop_stock_balances`, `plg_shop_stock_movements`, e a\n * coluna `tracking` na variante — nasce na migration 0034, e um pool que nunca\n * a aplicou responde com o erro cru do PostgREST: \"Could not find the table\" ou\n * \"column ... does not exist\". Isso é verdade e é ilegível para quem está\n * tentando lançar uma nota, e pior: parece defeito da tela.\n *\n * Reconhecer a falta e dizer o nome dela é a diferença entre \"o app quebrou\" e\n * \"falta aplicar o estoque nesta loja\".\n */\nexport function isLedgerMissing(error: unknown): boolean {\n const raw = error instanceof Error ? error.message : String((error as { message?: unknown })?.message ?? error)\n return /plg_shop_stock_|\\btracking\\b.*does not exist/i.test(raw)\n}\n\nexport const LEDGER_MISSING_MESSAGE =\n 'O controle de estoque ainda não foi aplicado nesta loja (migration 0034). '\n + 'Enquanto isso o saldo vive só no número do produto.'\n\n/**\n * A data que o lojista escolheu, virada em instante — ou nada.\n *\n * Duas armadilhas de uma vez. A primeira: mandar a data de HOJE é trocar o\n * relógio do servidor pelo do navegador sem ganhar nada, então um dia não\n * alterado devolve `undefined` e o razão carimba o próprio `now()`. A segunda:\n * `new Date('2026-08-21')` é meia-noite UTC, que no Brasil é o dia 20 às 21h —\n * uma nota lançada retroativa cairia um dia antes do que foi digitado. Meio-dia\n * local sobrevive a qualquer fuso.\n */\nexport function occurredAtFor(chosenDay: string, today: string): string | undefined {\n if (!chosenDay || chosenDay === today) return undefined\n const parsed = new Date(`${chosenDay}T12:00:00`)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString()\n}\n\nexport interface CommitMovementArgs {\n variantId: string\n movementType: string\n quantity: number\n reasonCode?: string\n locationId?: string\n note?: string\n occurredAt?: string\n}\n\nexport interface CommittedMovement {\n ok: true\n movementId: string\n kind: string\n quantity: number\n reasonCode: string\n available: number\n}\n\nexport interface RefusedMovement {\n ok: false\n error: string\n message?: string\n available?: number\n}\n\n/**\n * O único caminho de gravação do razão — do formulário e do agente.\n *\n * Ter dois seria ter duas opiniões sobre o sinal, sobre a guarda de negativo e\n * sobre qual razão implica qual espécie, e elas divergiriam na primeira vez que\n * alguém mexesse num só. A porta é a mesma; o que muda é quem digita.\n */\nexport async function commitMovement(args: CommitMovementArgs): Promise<CommittedMovement | RefusedMovement> {\n const plan = planMovement(args.movementType, args.quantity, args.reasonCode)\n if ('error' in plan) return { ok: false, ...plan }\n\n const store = stockStore()\n // O razão aceita saldo negativo — quem recusa a falta é `allocate`, e ele só\n // protege a VENDA. Aqui a origem é um humano digitando: \"saída 999\" com 10 na\n // prateleira é dedo gordo, e deixar o saldo em -989 estraga o inventário de um\n // jeito que ninguém percebe até a contagem. Recusar dizendo o saldo custa uma\n // frase.\n if (plan.quantity < 0) {\n const available = await store.getAvailable(args.variantId)\n if (Math.abs(plan.quantity) > available) {\n return {\n ok: false,\n error: 'insufficient_stock',\n available,\n message: `Só há ${available} em estoque — a saída de ${Math.abs(plan.quantity)} deixaria negativo.`,\n }\n }\n }\n\n const movement = await store.recordMovement({\n variantId: args.variantId,\n kind: plan.kind,\n quantity: plan.quantity,\n reasonCode: plan.reasonCode,\n ...(args.locationId ? { locationId: args.locationId } : {}),\n ...(args.note ? { note: args.note } : {}),\n ...(args.occurredAt ? { occurredAt: args.occurredAt } : {}),\n })\n\n // UM MOVIMENTO MUDA QUATRO TABELAS, e o escritor é o único que sabe disso.\n // O razão recebe a linha e o banco faz o resto em cascata: saldo, contagem da\n // variante, contagem do produto e — quando a loja é a dona (146) —\n // products.stock. Nenhuma dessas escritas passa por um provider daqui, então\n // nada invalida o cache delas: a Lista de produtos seguia mostrando o valor\n // anterior até alguém recarregar a página à mão.\n //\n // emitDataChanged invalida o cache da tabela nomeada E avisa quem a estiver\n // renderizando, então uma chamada por tabela afetada é o que fecha a volta.\n // As quatro são batidas numa só rajada (o bus acumula por 120ms).\n for (const table of [\n 'plg_shop_products', // a Lista, e é a que o usuário estava vendo\n 'plg_shop_product_variants', // a matriz de variantes\n // O saldo mudou de livro: quem move o número agora é o razão do\n // plugin-inventory, e o saldo compartilhado é `public.stock_balances`.\n // Invalidar a tabela antiga deixava as Posições mostrando o valor anterior\n // até alguém recarregar — o cache apontando para onde ninguém mais escreve.\n 'stock_balances', // as Posições\n 'plg_inventory_stock_movements', // o histórico de movimentos\n 'products', // o arquétipo, que as telas de Estoque leem\n ]) {\n emitDataChanged({ table, op: 'update' })\n }\n\n return {\n ok: true,\n movementId: movement.id,\n kind: plan.kind,\n quantity: plan.quantity,\n reasonCode: plan.reasonCode,\n available: await store.getAvailable(args.variantId),\n }\n}\n\nexport interface StockAgentDeps {\n getProvider: () => ShopProvider\n onChanged?: () => void\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\n/**\n * O razão desta loja.\n *\n * Mesma resolução que `setVariantStock` faz do outro lado: o mapa de override\n * primeiro (um ERP que assumiu o estoque), a implementação Supabase depois. Sem\n * tenant resolvido a chave é '' — nenhum override é registrado sob branco, então\n * cai no padrão em vez de encontrar o razão de outra pessoa.\n */\nconst stockStore = () => resolveStockStore(getActiveTenantId() ?? '', () => createSupabaseStockStore())\n\n/** Saldo somado, e o mesmo saldo aberto por local — que é a pergunta real. */\nfunction summarize(balances: StockBalance[], locations: StockLocation[]) {\n const nameOf = (id: string) => locations.find((l: StockLocation) => l.id === id)?.name ?? id\n const total = balances.reduce(\n (acc, b) => ({\n onHand: acc.onHand + b.onHand,\n reserved: acc.reserved + b.reserved,\n available: acc.available + b.available,\n }),\n { onHand: 0, reserved: 0, available: 0 },\n )\n const byLocation = new Map<string, { location: string; onHand: number; available: number }>()\n for (const b of balances) {\n const row = byLocation.get(b.locationId)\n ?? { location: nameOf(b.locationId), onHand: 0, available: 0 }\n row.onHand += b.onHand\n row.available += b.available\n byLocation.set(b.locationId, row)\n }\n return { total, byLocation: [...byLocation.values()] }\n}\n\nexport function createStockAgentTools({ getProvider, onChanged }: StockAgentDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => (\n isLedgerMissing(error)\n ? { ok: false, error: 'ledger_not_installed', message: LEDGER_MISSING_MESSAGE }\n : { ok: false, error: errorMessage(error) }\n )\n\n /** As variantes vendáveis de um produto — o razão fala em variante, o lojista em produto. */\n const variantsOf = async (product: Product): Promise<string[]> => {\n try {\n const set = await getProvider().getProductVariants?.(product.id)\n const ids = (set?.variants ?? []).map((v) => v.id)\n if (ids.length > 0) return ids\n } catch {\n /* catálogo sem tabela de variação é o caso comum */\n }\n return []\n }\n\n return [\n {\n tool: WHERE_IS,\n execute: async (args) => {\n const term = text(args.term)\n if (!term) return { ok: false, error: 'no_term' }\n try {\n const catalog = await listProductsCached(getProvider, { status: 'active', limit: 500 })\n const answer = resolveTerm(term, catalog)\n if (!answer.resolved) {\n if (!answer.options?.length) return { ok: true, term, notFound: true }\n return {\n ok: true,\n kind: 'record_choice',\n choices: [{\n id: 'stock-product',\n question: `Qual \"${term}\"?`,\n options: answer.options.map((c) => ({ id: c.productId, label: c.name, meta: candidateMeta(c) })),\n }],\n term,\n needsChoice: true,\n }\n }\n\n const product = catalog.find((p) => p.id === answer.resolved!.productId)!\n const variantIds = await variantsOf(product)\n const store = stockStore()\n const [balances, locations] = await Promise.all([\n store.listBalances(variantIds.length > 0 ? { variantIds } : {}),\n store.listLocations(),\n ])\n const mine = variantIds.length > 0\n ? balances\n : balances.filter(() => false)\n const { total, byLocation } = summarize(mine, locations)\n return {\n ok: true,\n product: { productId: product.id, name: product.name, sku: product.sku },\n // A variante é o que o lançamento precisa; sem ela o razão não tem\n // onde postar, e é melhor dizer isso do que gravar no lugar errado.\n variantId: variantIds[0] ?? null,\n variants: variantIds,\n total,\n byLocation,\n locations: locations.map((l: StockLocation) => ({ locationId: l.id, name: l.name, isDefault: l.isDefault })),\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: RECORD,\n execute: async (args) => {\n const variantId = text(args.variantId)\n if (!variantId) return { ok: false, error: 'no_variant', message: 'Preciso da variante — pergunte a posição primeiro.' }\n try {\n const answer = await commitMovement({\n variantId,\n movementType: text(args.movementType),\n quantity: Number(args.quantity),\n reasonCode: text(args.reasonCode) || undefined,\n locationId: text(args.locationId) || undefined,\n note: text(args.note) || undefined,\n occurredAt: text(args.occurredAt) || undefined,\n })\n if (answer.ok) onChanged?.()\n return answer\n } catch (error) {\n return failed(error)\n }\n },\n },\n ]\n}\n\nexport const STOCK_INSTRUCTIONS = `\nEsta tela é o estoque da loja. O lojista lança o que entrou e o que saiu, e pergunta onde estão as coisas.\n\n· \"Cadê minha costela\", \"quanto tem de X\": \\`getStockPosition\\` com as palavras dele. Ela resolve o produto sozinha e devolve o saldo por local. Responda com o número e o local, uma linha.\n· Lançar entrada ou saída: pegue o \\`variantId\\` na posição e chame \\`recordStockMovement\\`. Quantidade sempre positiva — o sinal é do razão, não seu.\n· A espécie vem do que ele disse: \"chegaram 20\" é entrada, \"quebrou 3\" é perda com razão \\`breakage\\`, \"vencerem 2\" é perda com \\`expiry\\`, \"contei e tem 18\" é ajuste.\n· A nota de sexta lançada na segunda: se ele disser QUANDO chegou, mande em \\`occurredAt\\`. Sem isso o razão registra hoje, e o custo cai no mês errado.\n· O razão não se edita. Errou, lança o movimento contrário — nunca prometa \"corrigir\" o lançamento.\n· Nunca invente produto nem variante. Termo ambíguo já virou pergunta com botões: não repita as opções no texto.\n`.trim()\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n Button, Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, toast,\n} from '@fayz-ai/ui'\nimport { Plus, WandSparkles } from 'lucide-react'\nimport {\n DetailTabHeader, askAI, useAgentSurface,\n type AgentSurfaceContribution, type AskAIIntro,\n} from '@fayz-ai/admin'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport {\n createSupabaseStockStore, listStockReasonCodes, resolveStockStore,\n type StockBalance, type StockLocation, type StockMovement, type StockReasonCode,\n} from '@fayz-ai/shop/inventory'\nimport type { Product, ProductVariant, ShopProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport {\n commitMovement, createStockAgentTools, isLedgerMissing,\n LEDGER_MISSING_MESSAGE, occurredAtFor, STOCK_INSTRUCTIONS,\n} from './stock-agent'\n\n// ---------------------------------------------------------------------------\n// Posições — onde estão as unidades deste produto, e a entrada sem sair daqui.\n//\n// A ficha do produto mostrava UM número, o `inventoryCount`, e ele não responde\n// a pergunta que se faz de verdade: quantas na loja, quantas no depósito, e\n// quantas já estão prometidas a um pedido que ninguém enviou. São coisas\n// diferentes e o razão sabe as três desde a 0034.\n//\n// O lançamento aqui passa por `commitMovement`, o MESMO caminho do agente: a\n// regra de sinal, a guarda de saldo negativo e a razão que decide a espécie\n// existem uma vez só. Dois caminhos seriam duas opiniões sobre o sinal, e elas\n// divergem na primeira vez que alguém mexe num.\n// ---------------------------------------------------------------------------\n\nconst stockStore = () => resolveStockStore(getActiveTenantId() ?? '', () => createSupabaseStockStore())\n\n/** Os quatro verbos, na ordem em que se usam. Entrada é o comum e abre escolhida. */\nconst MOVEMENT_TYPES: ReadonlyArray<{ value: string; label: string }> = [\n { value: 'entrada', label: 'Entrada' },\n { value: 'saida', label: 'Saída' },\n { value: 'ajuste', label: 'Ajuste' },\n { value: 'perda', label: 'Perda' },\n]\n\n/** A espécie do razão que cada verbo alcança — só para filtrar as razões. */\nconst KIND_FOR: Record<string, string> = {\n entrada: 'receipt', saida: 'adjustment', ajuste: 'adjustment', perda: 'loss',\n}\n\nconst todayISO = () => new Date().toISOString().slice(0, 10)\n\nconst field = 'mt-1 w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none focus:border-primary'\n\n/** O convite da porta \"Lançar com IA\", dito para quem está com a nota na mão. */\nconst STOCK_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Estoquista',\n pitch: 'Diga o que entrou ou saiu que eu lanço.',\n description:\n 'Lanço entrada, saída, ajuste ou perda no razão deste produto, e respondo quanto tem e onde. '\n + 'Você confirma antes de gravar.',\n suggestions: [\n { label: 'Chegaram 20 unidades' },\n { label: 'Quebraram 2' },\n ],\n}\n\nexport function ProductPositionsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [variants, setVariants] = useState<ProductVariant[]>([])\n const [balances, setBalances] = useState<StockBalance[]>([])\n const [locations, setLocations] = useState<StockLocation[]>([])\n const [movements, setMovements] = useState<StockMovement[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const [variantId, setVariantId] = useState<string>('')\n /** null = fechado. Abrir JÁ escolhe a espécie, então a pergunta que sobra é\n * quantas — que é a única que só o lojista sabe. */\n const [type, setType] = useState<string | null>(null)\n const [quantity, setQuantity] = useState<string>('')\n const [reasonCode, setReasonCode] = useState<string>('')\n const [note, setNote] = useState('')\n const [noteOpen, setNoteOpen] = useState(false)\n /** A nota de sexta lançada na segunda: o razão separa QUANDO a mercadoria se\n * moveu de quando alguém digitou (occurred_at × created_at desde a 0034), e\n * sem expor isso o custo cai no mês errado. */\n const [occurredOn, setOccurredOn] = useState<string>(() => todayISO())\n const [saving, setSaving] = useState(false)\n const quantityRef = React.useRef<HTMLInputElement>(null)\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const set = await getProvider().getProductVariants?.(product.id)\n const list = set?.variants ?? []\n setVariants(list)\n const ids = list.map((v) => v.id)\n setVariantId((current) => current || ids[0] || '')\n\n const store = stockStore()\n const [b, l] = await Promise.all([\n ids.length > 0 ? store.listBalances({ variantIds: ids }) : Promise.resolve([]),\n store.listLocations(),\n ])\n setBalances(b)\n setLocations(l)\n setMovements(ids[0] ? await store.listMovements({ variantId: ids[0], limit: 10 }) : [])\n setError(null)\n } catch (err: unknown) {\n setError(isLedgerMissing(err) ? LEDGER_MISSING_MESSAGE : errorMessage(err))\n } finally {\n setLoading(false)\n }\n }, [getProvider, product.id])\n\n useEffect(() => { void load() }, [load])\n\n const nameOf = useCallback(\n (id: string) => locations.find((l) => l.id === id)?.name ?? id,\n [locations],\n )\n\n const rows = useMemo(() => {\n const mine = variantId ? balances.filter((b) => b.variantId === variantId) : balances\n return mine.map((b) => ({\n key: b.id,\n location: nameOf(b.locationId),\n onHand: b.onHand,\n reserved: b.reserved,\n available: b.available,\n }))\n }, [balances, variantId, nameOf])\n\n const total = useMemo(\n () => rows.reduce(\n (acc, r) => ({\n onHand: acc.onHand + r.onHand,\n reserved: acc.reserved + r.reserved,\n available: acc.available + r.available,\n }),\n { onHand: 0, reserved: 0, available: 0 },\n ),\n [rows],\n )\n\n const reasons = useMemo<StockReasonCode[]>(\n () => listStockReasonCodes().filter(\n (r: StockReasonCode) => !r.movementKind || r.movementKind === KIND_FOR[type ?? 'entrada'],\n ),\n [type],\n )\n\n // A razão escolhida para \"perda\" não faz sentido em \"entrada\": trocar o verbo\n // sem soltar a razão mandaria ao razão um par que ele recusa.\n useEffect(() => { setReasonCode('') }, [type])\n\n /** Abrir é escolher a espécie e já estar com o cursor no número. */\n const open = (next: string) => {\n setType(next)\n setQuantity('')\n setNote('')\n setNoteOpen(false)\n setOccurredOn(todayISO())\n // Depois do render, senão o input ainda não existe.\n window.setTimeout(() => quantityRef.current?.focus(), 0)\n }\n const close = () => {\n setType(null); setQuantity(''); setNote(''); setNoteOpen(false); setOccurredOn(todayISO())\n }\n\n // O resultado ANTES de gravar: \"32 → 52\". Um saldo que só aparece depois faz\n // o lojista lançar, conferir, e desfazer com o movimento contrário.\n const amount = Math.abs(Number(quantity) || 0)\n const outgoing = type === 'saida' || type === 'perda'\n const nextBalance = amount > 0\n ? (outgoing ? total.available - amount : total.available + amount)\n : null\n\n // O produto aberto, entregue ao assistente enquanto esta aba estiver montada.\n // As ferramentas são as mesmas do razão; o que a aba acrescenta é QUAL\n // produto está na tela, para \"chegaram 20\" não precisar dizer de quê.\n const live = React.useRef({ product, variantId, total, getProvider, load })\n live.current = { product, variantId, total, getProvider, load }\n const contribution = useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.product.positions',\n pluginId: 'shop',\n role: 'operations',\n instructions: STOCK_INSTRUCTIONS,\n describe: () => {\n const o = live.current\n return {\n title: `Estoque — ${o.product.name}`,\n record: { entity: 'shop_product', id: o.product.id, label: o.product.name },\n state: {\n screen: '/products/:id#posicoes',\n productId: o.product.id,\n productName: o.product.name,\n variantId: o.variantId || null,\n onHand: o.total.onHand,\n reserved: o.total.reserved,\n available: o.total.available,\n },\n }\n },\n tools: createStockAgentTools({\n getProvider: () => live.current.getProvider(),\n onChanged: () => { void live.current.load() },\n }),\n }), [])\n useAgentSurface(contribution)\n\n const submit = async () => {\n if (!variantId || !type) return\n const amount = Number(quantity)\n if (!amount) { toast.error('Diga quantas unidades.'); return }\n setSaving(true)\n try {\n const answer = await commitMovement({\n variantId,\n movementType: type,\n quantity: amount,\n reasonCode: reasonCode || undefined,\n note: note.trim() || undefined,\n occurredAt: occurredAtFor(occurredOn, todayISO()),\n })\n if (!answer.ok) { toast.error(answer.message ?? answer.error); return }\n toast.success(`Lançado. Saldo agora: ${answer.available}.`)\n close()\n await load()\n } catch (err: unknown) {\n toast.error(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n // Esqueleto, não frase. Uma linha \"Carregando…\" empurra o conteúdo quando\n // ele chega; o esqueleto já reserva o lugar dele (CLS zero) e diz a FORMA do\n // que vem — cabeçalho, posições, lançamento.\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"space-y-2\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-64 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"h-9 w-32 animate-pulse rounded-md bg-muted\" />\n </div>\n <ul className=\"space-y-2\">\n {[0, 1].map((i) => (\n <li key={i} className=\"flex items-center gap-3 rounded-card border bg-card p-3\">\n <div className=\"h-4 flex-1 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-12 animate-pulse rounded bg-muted\" />\n </li>\n ))}\n </ul>\n </div>\n )\n }\n\n if (error) {\n // A falta do razão não é um defeito desta tela, e pintá-la de vermelho de\n // erro faz o lojista abrir um chamado por uma migration que não rodou.\n const missing = error === LEDGER_MISSING_MESSAGE\n return (\n <p className={missing\n ? 'rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground'\n : 'rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive'}>\n {error}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Mesmo cabeçalho de Fotos e Variantes: o que é à esquerda, o que se\n acrescenta à direita. As três abas do produto passam a ter uma porta\n só, no mesmo lugar. */}\n <DetailTabHeader\n title=\"Estoque do produto\"\n description={\n <>\n <span className=\"tabular-nums\">{total.onHand}</span> em mãos ·{' '}\n <span className=\"tabular-nums\">{total.reserved}</span> reservado para pedidos ·{' '}\n <span className=\"font-medium tabular-nums text-foreground\">{total.available}</span> disponível.\n O razão não se edita: um erro se corrige com o movimento contrário.\n </>\n }\n actions={variantId && (\n <>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => askAI({\n intro: STOCK_INTRO,\n hint: 'O que entrou ou saiu…',\n draft: `Entrada de unidades de ${product.name}`,\n })}\n >\n <WandSparkles className=\"mr-1.5 h-3.5 w-3.5\" />\n Com IA\n </Button>\n <Button onClick={() => open('entrada')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Dar entrada\n </Button>\n </>\n )}\n />\n\n {!variantId && (\n // Nunca desabilitar um botão sem dizer por quê. Sem variante o razão não\n // tem onde postar, e um \"Lançar\" apagado sem explicação faz o lojista\n // clicar três vezes e concluir que a tela está quebrada.\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto ainda não tem uma variante para o estoque apontar.\n Crie uma em <span className=\"font-medium text-foreground\">Variantes</span> e volte aqui.\n </p>\n )}\n\n {variants.length > 1 && (\n <label className=\"block max-w-xs\">\n <span className=\"text-xs font-medium text-muted-foreground\">Variante</span>\n <select value={variantId} onChange={(e) => setVariantId(e.target.value)} className={field}>\n {variants.map((v) => (\n <option key={v.id} value={v.id}>\n {Object.values(v.options ?? {}).join(' · ') || v.sku || v.id.slice(0, 8)}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {/* The form is a MODAL, not a card that pushes the page down. Lançar um\n movimento is a decision about the list you are looking at — the list\n should still be there behind it, and closing should not leave the page\n somewhere else than it started. */}\n <Modal open={type !== null} onOpenChange={(o: boolean) => { if (!o) close() }}>\n <ModalContent className=\"sm:max-w-lg\">\n <ModalHeader>\n <ModalTitle>Lançar movimento</ModalTitle>\n <ModalDescription>\n O razão não se edita: um erro se corrige com o movimento contrário.\n </ModalDescription>\n </ModalHeader>\n <div className=\"p-1\">\n {/* Entrada é o caso comum e já vem escolhida; os outros três verbos\n ficam aqui dentro, um toque adiante, em vez de disputarem o\n cabeçalho com a ação principal. */}\n <div className=\"flex flex-wrap gap-1\">\n {MOVEMENT_TYPES.map((t) => (\n <button\n key={t.value}\n type=\"button\"\n onClick={() => setType(t.value)}\n className={`fz-tap rounded-button px-3 py-1.5 text-xs font-medium transition-colors ${\n type === t.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* Every field in this modal stacks label over control. Quantidade used\n to sit on ONE row with its label to the left and the running\n balance beside it — three things on a baseline, in a column the\n other two fields do not share. Same shape as the rest now, and the\n balance became the field's hint, which is what it is. */}\n <div className=\"mt-3 space-y-3\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Quantidade</span>\n <input\n ref={quantityRef}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); void submit() }\n if (e.key === 'Escape') { e.preventDefault(); close() }\n }}\n placeholder=\"0\"\n className={`${field} font-semibold tabular-nums`}\n />\n {/* A consequência, enquanto ele digita. */}\n <span aria-live=\"polite\" className=\"mt-1 block text-xs text-muted-foreground\">\n {nextBalance === null ? (\n <>Fica em <span className=\"font-medium tabular-nums text-foreground\">{total.available}</span></>\n ) : (\n <>\n <span className=\"tabular-nums\">{total.available}</span>\n <span className=\"mx-1.5\">→</span>\n <span className={`text-base font-semibold tabular-nums ${nextBalance < 0 ? 'text-destructive' : 'text-foreground'}`}>\n {nextBalance}\n </span>\n {nextBalance < 0 && <span className=\"ml-2 text-destructive\">não há tudo isso</span>}\n </>\n )}\n </span>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Motivo</span>\n <select value={reasonCode} onChange={(e) => setReasonCode(e.target.value)} className={field}>\n <option value=\"\">Padrão</option>\n {reasons.map((r) => <option key={r.key} value={r.key}>{r.label}</option>)}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {type === 'entrada' ? 'Chegou em' : 'Quando'}\n </span>\n <input\n type=\"date\"\n value={occurredOn}\n max={todayISO()}\n onChange={(e) => setOccurredOn(e.target.value || todayISO())}\n className={field}\n />\n </label>\n </div>\n\n {noteOpen ? (\n <label className=\"mt-3 block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Observação</span>\n <input\n autoFocus\n value={note}\n onChange={(e) => setNote(e.target.value)}\n className={field}\n placeholder=\"Nota fiscal, quem entregou…\"\n />\n </label>\n ) : (\n <button\n type=\"button\"\n onClick={() => setNoteOpen(true)}\n className=\"mt-2 text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n + observação\n </button>\n )}\n\n </div>\n\n <ModalFooter>\n {amount === 0 && (\n // O motivo de o botão estar apagado, ao lado dele.\n <span className=\"mr-auto text-xs text-muted-foreground\">Diga quantas unidades</span>\n )}\n <Button variant=\"ghost\" onClick={close} disabled={saving}>Cancelar</Button>\n <Button onClick={() => void submit()} disabled={saving || amount === 0}>\n {saving ? 'Lançando…' : 'Lançar'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {variantId && (rows.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Nenhuma posição ainda — a primeira entrada abre o saldo.\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {rows.map((r) => (\n <li key={r.key} className=\"flex items-center gap-3 rounded-card border bg-card p-3\">\n <span className=\"flex-1 text-sm font-medium\">{r.location}</span>\n <span className=\"text-xs text-muted-foreground\">{r.reserved} reservado</span>\n <span className=\"w-16 text-right text-sm font-semibold tabular-nums\">{r.available}</span>\n </li>\n ))}\n </ul>\n ))}\n\n {movements.length > 0 && (\n <section className=\"space-y-2 pt-2\">\n <h3 className=\"text-sm font-semibold\">Últimos movimentos</h3>\n <ul className=\"space-y-2\">\n {movements.map((m) => (\n <li key={m.id} className=\"flex items-center gap-3 rounded-card border bg-card px-3 py-2\">\n <span className={`w-14 text-sm font-semibold tabular-nums ${m.quantity < 0 ? 'text-destructive' : 'text-emerald-700'}`}>\n {m.quantity > 0 ? `+${m.quantity}` : m.quantity}\n </span>\n <span className=\"flex-1 text-sm\">{m.reasonCode ?? m.kind}</span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(m.occurredAt ?? m.createdAt).toLocaleDateString('pt-BR')}\n </span>\n </li>\n ))}\n </ul>\n </section>\n )}\n </div>\n )\n}\n","/** The Entrega settings tab id, as the manifest declares it. */\nexport const SHIPPING_SETTINGS_TAB = 'shop-shipping'\n\nexport const SHIPPING_SETTINGS_ROUTE = `/settings/${SHIPPING_SETTINGS_TAB}`\n\n/** The shell's own prefix for a registry inside a plugin settings tab. */\nconst PROPERTIES = '_properties'\n\nexport function shippingRegistryPath(registryId: string): string {\n return `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/${registryId}`\n}\n\n/**\n * Straight to the form of ONE record.\n *\n * A summary row that names a place and then lands on the list of places makes\n * the reader find it again, open it, and click \"editar\" — three steps to reach\n * what the row was already pointing at.\n */\nexport function shippingRecordPath(registryId: string, recordId: string, mode: 'view' | 'edit' = 'edit'): string {\n const base = `${shippingRegistryPath(registryId)}/${recordId}`\n return mode === 'edit' ? `${base}/edit` : base\n}\n\n/**\n * The registry the URL is asking for, or null for the tab's summary.\n *\n * Returns the raw id rather than validating against a list — the registry lookup\n * is the only list, and a second one here is what drifted when `zonas` was\n * renamed.\n */\nexport function shippingRegistryIdFromHash(hash?: string): string | null {\n const raw = hash ?? (typeof window === 'undefined' ? '' : window.location.hash)\n const path = raw.startsWith('#') ? raw.slice(1) : raw\n const marker = `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/`\n if (!path.startsWith(marker)) return null\n return path.slice(marker.length).split('/')[0] || null\n}\n","import React from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingPackage, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo, CrudFormPage } from '@fayz-ai/admin'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Box, ChevronDown, Plus } from 'lucide-react'\nimport { Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { packageMeasureLabel, packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nconst PACKAGES_ROUTE = shippingRegistryPath(PACKAGES_REGISTRY)\n\n/**\n * Em que embalagem ESTE produto vai.\n *\n * A lista de embalagens da loja é a fonte (Configurações → Entrega →\n * Embalagens); aqui o produto só aponta para uma linha dela. Foi a correção do\n * founder sobre o Shopify: lá o produto se ASSOCIA a uma embalagem já\n * cadastrada, em vez de repetir altura e largura no cadastro de cada item — o\n * que ele escolhe não é uma medida, é o pacote em que a loja despacha.\n *\n * Vazio = «padrão da loja», que é um estado legítimo e o de toda loja no dia\n * seguinte à 0046. Não é «não preenchido».\n */\nexport function PackageSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingPackage[] | null>(null)\n const [open, setOpen] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n const load = React.useCallback(() => {\n if (typeof shop.listShippingPackages !== 'function') { setRows([]); return }\n void shop.listShippingPackages().then(setRows).catch(() => setRows([]))\n }, [shop])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!open) return\n const away = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', away)\n return () => document.removeEventListener('mousedown', away)\n }, [open])\n\n const selected = (rows ?? []).find((row) => row.id === value) ?? null\n const storeDefault = (rows ?? []).find((row) => row.isDefault) ?? null\n\n const label = selected\n ? `${selected.name} — ${packageMeasureLabel(selected)}`\n : storeDefault\n ? `Padrão da loja • ${storeDefault.name} — ${packageMeasureLabel(storeDefault)}`\n : 'Padrão da loja'\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 w-full items-center gap-2 rounded-input border border-input bg-background px-3 text-left text-sm shadow-sm\"\n >\n <Box className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n\n {open && (\n <div className=\"absolute z-30 mt-1 w-full overflow-hidden rounded-lg border bg-popover shadow-lg\">\n <button\n type=\"button\"\n onClick={() => { setOpen(false); setCreating(true) }}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-primary hover:bg-muted\"\n >\n <Plus className=\"h-4 w-4\" /> Adicionar embalagem\n </button>\n <div className=\"max-h-64 overflow-y-auto border-t\">\n <Option\n label=\"Padrão da loja\"\n hint={storeDefault ? packageMeasureLabel(storeDefault) : 'Nenhuma marcada — cai no piso da transportadora.'}\n active={value == null}\n onClick={() => { onChange(null); setOpen(false) }}\n />\n {(rows ?? []).map((row) => (\n <Option\n key={row.id}\n label={row.name}\n hint={packageMeasureLabel(row)}\n active={row.id === value}\n onClick={() => { onChange(row.id); setOpen(false) }}\n />\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpen(false); adminNavigateTo(PACKAGES_ROUTE) }}\n className=\"w-full border-t px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted\"\n >\n Gerenciar embalagens\n </button>\n </div>\n )}\n\n {creating && (\n <NewPackageModal\n onClose={() => setCreating(false)}\n onCreated={(id) => { setCreating(false); onChange(id); load() }}\n />\n )}\n </div>\n )\n}\n\n/**\n * Cadastrar uma caixa sem sair do produto.\n *\n * Monta o MESMO EntityDef do registry no `CrudFormPage` genérico e grava pelo\n * MESMO provider — não é um formulário paralelo com os mesmos seis campos\n * digitados de novo, que é como duas telas para uma tabela começam a discordar\n * sobre o que é obrigatório.\n */\nfunction NewPackageModal({ onClose, onCreated }: {\n onClose: () => void\n onCreated: (id: string) => void\n}) {\n const [error, setError] = React.useState<string | null>(null)\n const provider = React.useMemo(\n () => resolveDataProvider(packagesRegistry.entity as EntityDef<{ id: string }>),\n [],\n )\n\n // Pelo Modal da SDK, e não por uma caixa `fixed` solta: o formulário agora\n // mede a PRÓPRIA largura (container query), e um `fixed` dentro dele passaria\n // a cobrir só a coluna do formulário em vez da tela.\n return (\n <Modal open onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Nova embalagem</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n {error && <p className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-xs text-destructive\">{error}</p>}\n <CrudFormPage\n entityDef={packagesRegistry.entity as EntityDef}\n mode=\"create\"\n namePlural=\"Embalagens\"\n embedded\n onCancel={onClose}\n onSubmit={async (data) => {\n try {\n const created = await provider.create(data as never)\n onCreated((created as { id: string }).id)\n } catch (e) {\n setError(errorMessage(e))\n }\n }}\n />\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n\nfunction Option({ label, hint, active, onClick }: {\n label: string\n hint: string\n active: boolean\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`flex w-full flex-col px-3 py-2 text-left hover:bg-muted ${active ? 'bg-muted/60' : ''}`}\n >\n <span className=\"text-sm\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{hint}</span>\n </button>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo } from '@fayz-ai/admin'\nimport { ExternalLink } from 'lucide-react'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Which zones this product ships through — it points at an existing profile, the\n * way it points at a package. Empty is the general profile, a real state, which\n * is why the empty option is named rather than blank.\n */\nexport function ShippingProfileSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n if (typeof shop.listShippingProfiles !== 'function') { setRows([]); return }\n void shop.listShippingProfiles()\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [shop])\n\n const custom = (rows ?? []).filter((row) => !row.isDefault)\n const chosen = custom.find((row) => row.id === value) ?? null\n\n return (\n <div className=\"space-y-1.5\">\n <select\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value || null)}\n disabled={rows == null}\n className=\"flex h-9 w-full rounded-input border border-input bg-background px-3 py-1.5 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <option value=\"\">Geral — as zonas normais da loja</option>\n {custom.map((row) => (\n <option key={row.id} value={row.id}>\n {row.name}\n {row.carrierQuotes === false ? ' — só entrega própria' : ''}\n </option>\n ))}\n </select>\n\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {chosen?.carrierQuotes === false\n ? 'Este produto não é cotado por transportadora: sai só pelas zonas do perfil.'\n : custom.length === 0\n ? 'Nenhum perfil além do geral.'\n : 'Perfil de entrega deste produto.'}\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"inline-flex items-center gap-1 text-primary hover:underline\"\n >\n {custom.length === 0 ? 'Criar um perfil' : 'Gerenciar perfis'}\n <ExternalLink className=\"h-3 w-3\" />\n </button>\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Thumbnail } from '@fayz-ai/ui'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { ProductVariantsTab } from './ProductVariantsTab'\nimport { ProductPositionsTab } from './ProductPositionsTab'\nimport { PackageSelect } from './PackageSelect'\nimport { ShippingProfileSelect } from './ShippingProfileSelect'\n\n/** Tudo o que só faz sentido para algo que entra numa caixa. */\nconst physical = (values: Record<string, unknown>) => values.isPhysical !== false\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// VARIANTES vivem na aba \"Variantes\" e não aqui: os eixos e a matriz são uma\n// COLEÇÃO derivada do produto, não campos dele, do mesmo jeito que as fotos.\n// (Este cabeçalho dizia \"falta plg_shop_variants\" — as tabelas existem desde a\n// 0028 e a vitrine lê delas desde o M5; o que faltava era a tela.)\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return new Intl.NumberFormat('pt-BR', { style: 'currency', currency }).format(n)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {/* Always the square, photo or not: a product without one used to\n render nothing and pull its name back against the rows that had\n one, so the column stopped reading as a column. */}\n <Thumbnail src={row.images?.[0]?.url} icon={Package} />\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n // O \"de\" riscado vai EMBAIXO do preço em vigor, não ao lado: lado a lado\n // as duas quantias competem na mesma linha e o olho lê a maior primeiro.\n renderCell: (v, row: any) => (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n // Não se DIGITA saldo.\n //\n // Este campo era um número editável, e um número editável convida a\n // resposta errada: alguém conta a prateleira, acha 18, escreve 18, e o\n // razão perde POR QUE mudou — se chegaram seis ou se sumiram quatro. É\n // exatamente o que um razão existe para impedir, e a 0036 já tratava a\n // escrita direta aqui como um ajuste às cegas para não perder o movimento.\n //\n // Vira reflexo: mostra o saldo, e o ato acontece em Posições, onde ele tem\n // espécie, motivo e data.\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n // `showInForm: false` e não um campo desabilitado: some do formulário de\n // edição, continua na tabela e na ficha. Mostra-se o saldo; digita-se o\n // movimento.\n showInForm: false,\n hint: 'Saldo do razão. Entrada, saída e perda se lançam na aba Posições.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Busca (SEO) —\n // A coleção já tinha estes dois; o produto — que é a página onde alguém\n // CAI vindo do Google — não tinha nenhum, então cada página herdava o que\n // a vitrine inventasse a partir do nome.\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o nome do produto.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'O trecho que aparece embaixo do título no Google',\n hint: 'Vazio usa a descrição do produto.',\n showInTable: false,\n },\n\n // — Envio —\n // O desenho é o do Shopify e a ordem importa: o interruptor primeiro, e o\n // resto da seção só existe depois dele. Perguntar altura de um e-book não é\n // um campo extra inofensivo — é um convite a preencher e pagar frete de um\n // download.\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping', span: 2,\n hint: 'Desmarque para itens digitais. Eles saem do cálculo da caixa e não entram no frete.',\n showInTable: false, defaultValue: true,\n },\n {\n // Antes da embalagem de propósito: o perfil decide POR QUAIS ZONAS o item\n // sai, e a embalagem, em que caixa. A primeira pergunta é a que muda quem\n // pode levar.\n key: 'shippingProfileId', label: 'Perfil de entrega', type: 'custom', group: 'shipping', span: 2,\n hint: 'Por quais zonas este produto sai. \"Geral\" é o de todo produto que ninguém moveu.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <ShippingProfileSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'packageId', label: 'Embalagem', type: 'custom', group: 'shipping', span: 2,\n hint: 'Em que a loja despacha este produto. \"Padrão da loja\" usa a embalagem marcada em Configurações → Entrega.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <PackageSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0,4',\n hint: 'Do produto, já embalado. As medidas vêm da embalagem escolhida acima.',\n showInTable: false, visibleWhen: (values) => values.isPhysical !== false,\n },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n hint: 'A cotação converte. Até agora ela assumia kg.',\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n visibleWhen: (values) => values.isPhysical !== false,\n },\n // Em centímetros, sem seletor de unidade: a coluna é `*_cm` e a caixa da\n // loja também. Duas unidades para a mesma medida é como o peso passou\n // quatro anos sendo lido errado.\n // A medida é da EMBALAGEM, não do produto.\n //\n // O seletor logo acima já associa o produto a uma embalagem cadastrada da\n // loja (0047) — e é lá que altura, largura e comprimento vivem. Repetir os\n // três aqui pedia a mesma informação duas vezes por caminhos diferentes, e\n // as duas divergiam no dia em que alguém trocasse a caixa: a cotação lê a\n // embalagem, o formulário mostrava outro número.\n //\n // As colunas continuam existindo — um catálogo anterior à 0047 tem produto\n // medido e sem embalagem, e a cotação ainda os lê. O que sai é a pergunta.\n { key: 'heightCm', label: 'Altura (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n { key: 'widthCm', label: 'Largura (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n { key: 'lengthCm', label: 'Comprimento (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n {\n // Declarado aqui para poder viajar — para a transportadora, para o motoboy\n // ou para quem embala. O que a loja FAZ com um carrinho refrigerado é uma\n // decisão dela, em Configurações → Entrega.\n //\n // `visibleWhen: physical` junto com as medidas, e pelo mesmo motivo: um\n // download não tem caixa, e não há como exigir frio de um arquivo.\n key: 'handling', label: 'Exige cuidado especial', type: 'multiselect', group: 'shipping',\n showInTable: false, visibleWhen: physical,\n hint: 'Vai junto com o pedido para quem entrega. Refrigerado ou congelado também limita como a loja pode enviar.',\n options: [\n { label: 'Refrigerado', value: 'refrigerated' },\n { label: 'Congelado', value: 'frozen' },\n { label: 'Frágil', value: 'fragile' },\n ],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n // Qual tabela esta tela É. Sem isto, `deriveEntityKey` cai no rótulo — e a\n // chave da entidade vira `produto`, que muda com uma tradução. Quem avisa\n // \"escrevi aqui\" nomeia a TABELA (é o que emitDataChanged invalida no cache),\n // então sem esta linha o aviso não encontra a lista: o barramento casa\n // tabela-com-tabela, e o lado do assinante estava vazio.\n //\n // Não muda o caminho do dado: o índice do plugin passa um\n // `dataProvider: createShopProductDataProvider(...)` explícito, que vence o\n // provider genérico que `data.table` acionaria — mesma forma da entidade de\n // cliente logo ao lado.\n data: { table: 'plg_shop_products' },\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como este produto aparece nos resultados de busca.', columns: 2 },\n {\n id: 'shipping',\n label: 'Envio',\n description:\n 'Em que caixa este produto sai e quanto ele pesa. A medida é da embalagem; o peso é do produto. Sem embalagem escolhida a transportadora é consultada com a caixa padrão da loja, e o frete cotado pode não ser o frete pago.',\n columns: 3,\n },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [\n {\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n },\n {\n id: 'variants',\n label: 'Variantes',\n icon: 'Layers',\n component: ProductVariantsTab as never,\n props: { getProvider },\n },\n // Separada de Variantes de propósito: aquela edita O QUE se vende,\n // esta responde ONDE estão as unidades — e a ficha só sabia dizer um\n // número só, que não distingue a loja do depósito nem o que já está\n // prometido a um pedido.\n {\n id: 'positions',\n label: 'Posições',\n icon: 'Boxes',\n component: ProductPositionsTab as never,\n props: { getProvider },\n },\n ]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(Number(row.value) || 0)}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'minSubtotal', label: 'Pedido mínimo', type: 'currency', group: 'limits', min: 0,\n currency: 'BRL', currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo',\n hint: 'Valor mínimo do pedido para o cupom valer. Deixe vazio para não exigir mínimo.',\n showInTable: false,\n },\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","// ---------------------------------------------------------------------------\n// Cupom criado por conversa.\n//\n// O que faltava não era ferramenta — a lista já empresta seu store ao\n// assistente (CrudAgentSurface). Faltava dizer que o CÓDIGO é dele: sem isso o\n// assistente parava e pedia \"nome interno, código, status\" para um lojista que\n// já tinha respondido \"pode inventar\". Código de cupom é rótulo, não fato; quem\n// pede a promoção não tem opinião sobre ele até ver.\n//\n// A regra de formato não é estética: o código é ditado por telefone, digitado\n// no celular e colado no Instagram. O que sobra disso é A-Z0-9, curto, sem\n// acento e sem nada que se confunda com espaço.\n// ---------------------------------------------------------------------------\n\nexport const DISCOUNT_CREATE_INSTRUCTIONS = `\nEsta lista é a de Descontos da loja. Um registro aqui é um CUPOM que o comprador digita no carrinho.\n\nO código é seu para escrever:\n· Se o lojista não ditar um, invente a partir da campanha: MAIÚSCULAS, só letras A-Z e números, de 4 a 16 caracteres, sem espaço, acento, hífen ou pontuação.\n· Curto e ditável ao telefone. Evite 0/O e 1/I juntos, evite palavra que o comprador precise soletrar.\n· Nunca repita um código que já aparece em \\`taken.code\\`. Se a criação voltar \\`duplicate_value\\`, escolha outro e chame de novo — sem perguntar nada ao lojista.\n· \\`title\\` é o nome interno, só o lojista vê: escreva a campanha em português (\"Frete grátis fim de semana\"), não repita o código.\n\nA regra:\n· \"frete grátis\" → \\`type: free_shipping\\` e SEM \\`value\\` — frete grátis não desconta o subtotal.\n· \"10%\", \"10 por cento\" → \\`type: percentage\\`, \\`value: 10\\`.\n· \"R$ 50\", \"50 reais de desconto\" → \\`type: fixed_amount\\`, \\`value: 50\\`.\n· \"acima de R$ 200\", \"a partir de 200\" → \\`minSubtotal: 200\\`.\n· \"só a primeira compra\", \"uma vez por cliente\" → \\`oncePerCustomer: true\\`.\n· \"os 100 primeiros\" → \\`usageLimit: 100\\`.\n· Prazo vira data em \\`endsAt\\`: \"até o fim dessa semana\" é o domingo desta semana, \"até o fim do mês\" é o último dia do mês. Sem prazo dito, deixe vazio — cupom sem fim é uma escolha, não um esquecimento.\n\nStatus:\n· \\`active\\` por padrão. O lojista está pedindo uma promoção para divulgar hoje; um cupom que nasce dormindo é um cupom que o cliente tenta usar e não funciona.\n· \\`draft\\` só quando ele disser que é para deixar pronto para depois.\n\nO que você NÃO inventa: o tamanho do desconto. Se ele disser \"desconto para clientes VIP\" sem dizer quanto, essa é a única pergunta a fazer — e faça só ela.\n\nDepois de criar, diga em uma linha o código, o efeito e até quando vale, para ele já poder divulgar.\n`.trim()\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Categoria — onde o produto mora na árvore do catálogo.\n//\n// Uma categoria só, um pai só: é ela que estrutura a navegação da vitrine. Para\n// agrupar produtos de forma editorial (uma vitrine de Natal, os mais vendidos),\n// o que existe é Coleção — o produto entra em quantas quiser.\n//\n// `parentId` fica como texto e não como relação: a lista de categorias é a\n// própria tabela sendo editada, e uma relação declarativa aqui pediria um\n// segundo read-model só para se auto-referenciar.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCategoryEntity(): EntityDef<Category> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Camisetas',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'slug', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'camisetas',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do nome.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'parentId', label: 'Categoria pai', type: 'text', group: 'basic',\n placeholder: 'sem pai — nível principal',\n hint: 'Deixe vazio para uma categoria de primeiro nível.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Descrição opcional',\n showInTable: false,\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro na vitrine.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{Number(v ?? 0)}</span>,\n },\n ]\n\n return {\n name: 'Categoria',\n namePlural: 'Categorias',\n icon: 'FolderTree',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Categoria', columns: 2 },\n ],\n } as EntityDef<Category>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Collection } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Coleção — agrupamento de merchandising (\"Verão 2026\", \"Mais vendidos\").\n//\n// Não é categoria: a categoria diz onde o produto MORA no catálogo (um pai só,\n// estrutura a navegação); a coleção é um conjunto curado e o produto entra em\n// quantas quiser. Sair de uma coleção não muda nada sobre o que o produto é.\n//\n// `productIds` não aparece no formulário: escolher membros é um multiselect com\n// busca sobre o catálogo, que o EntityDef declarativo não expressa. A associação\n// já está pronta no provider — falta só o campo customizado. Até lá a coluna\n// mostra quantos produtos a coleção tem.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCollectionEntity(): EntityDef<Collection> {\n const fields: FieldDef[] = [\n {\n key: 'title', label: 'Título', type: 'text', required: true, group: 'basic',\n placeholder: 'Verão 2026',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'handle', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'verao-2026',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do título.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Como esta coleção é apresentada na loja',\n showInTable: false,\n },\n {\n key: 'productIds', label: 'Produtos', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 produto' : `${count} produtos`}\n </span>\n )\n },\n },\n {\n key: 'published', label: 'Publicada', type: 'boolean', group: 'basic',\n hint: 'Coleção despublicada some da vitrine, mas continua aqui.',\n // Rotula os dois estados para as abas do cabeçalho: \"true\"/\"false\" cru\n // seria o que o lojista leria no topo da própria lista.\n options: [\n { value: 'true', label: 'Publicadas' },\n { value: 'false', label: 'Rascunhos' },\n ],\n showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${\n v ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'\n }`}>\n {v ? 'Publicada' : 'Rascunho'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — SEO —\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o título da coleção.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'Descreva esta coleção para os buscadores',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Coleção',\n namePlural: 'Coleções',\n icon: 'Layers',\n displayField: 'title',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Coleção', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como esta coleção aparece nos resultados de busca.', columns: 2 },\n ],\n // Sem facet de \"publicada\": como booleano ele vira uma tira de abas\n // \"Todas · Sim · Não\", que não diz de QUE é o sim — e uma loja com dez\n // coleções não precisa filtrar por isso; a coluna já mostra o estado.\n\n } as EntityDef<Collection>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { GiftCard } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Vale-presente — dinheiro já pago que ainda não virou pedido.\n//\n// Dois saldos e não um: `initialBalance` é o valor de face, imutável (a prova\n// de quanto entrou) e `balance` é o que sobrou. Só o saldo restante apagaria o\n// valor emitido no primeiro resgate parcial — e é esse número que conciliação e\n// suporte precisam.\n//\n// `initialBalance` só existe no formulário de criação: mudar o valor de face de\n// um cartão já emitido reescreveria o histórico financeiro. Ajuste depois se\n// faz, é no saldo restante.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n redeemed: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo', redeemed: 'Resgatado', expired: 'Expirado', disabled: 'Desativado',\n}\n\nexport function buildShopGiftCardEntity(currencyCode = 'BRL'): EntityDef<GiftCard> {\n const money = (v: unknown) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(Number(v) || 0)\n\n const fields: FieldDef[] = [\n {\n key: 'code', label: 'Código', type: 'text', group: 'card', span: 2,\n placeholder: 'gerado automaticamente',\n hint: 'O que o cliente digita no checkout. Deixe vazio para gerar um código.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs font-medium\">{String(v ?? '')}</span>,\n },\n {\n key: 'initialBalance', label: 'Valor', type: 'currency', required: true, group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Valor de face do cartão. Não muda depois de emitido.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{money(v)}</span>,\n },\n {\n key: 'balance', label: 'Saldo', type: 'currency', group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'O que ainda pode ser gasto. Cai a cada resgate.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', group: 'card', span: 2,\n options: [\n { label: 'Ativo', value: 'active', description: 'Aceito no checkout.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o saldo.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'active')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.active}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n\n // — Destinatário —\n {\n key: 'customerEmail', label: 'E-mail do destinatário', type: 'email', group: 'recipient',\n placeholder: 'opcional',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'expiresAt', label: 'Validade', type: 'date', group: 'recipient',\n hint: 'Vazio = não expira.', showInTable: false,\n },\n {\n key: 'note', label: 'Observação', type: 'textarea', group: 'recipient', span: 2,\n placeholder: 'Só o admin vê.', showInTable: false,\n },\n ]\n\n return {\n name: 'Vale-presente',\n namePlural: 'Gift Cards',\n icon: 'CreditCard',\n displayField: 'code',\n defaultSort: 'createdAt',\n defaultSortDir: 'desc',\n fields,\n fieldGroups: [\n { id: 'card', label: 'Cartão', columns: 2 },\n { id: 'recipient', label: 'Destinatário', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos', display: 'tabs' }],\n } as EntityDef<GiftCard>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerGroup } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Grupo de clientes — associação MANUAL.\n//\n// O lojista põe e tira gente; a associação é estável e não muda porque o\n// cliente comprou (ou parou de comprar). Para \"todo mundo que gastou mais de\n// X\", o que existe é Segmento — lá a associação é a própria regra.\n//\n// `customerIds` fica fora do formulário: escolher membros é um multiselect com\n// busca sobre a base de clientes, que o EntityDef declarativo não expressa. A\n// associação já está pronta no provider — falta o campo customizado.\n// ---------------------------------------------------------------------------\n\nconst SWATCH: Record<string, string> = {\n slate: 'bg-slate-200 text-slate-800',\n emerald: 'bg-emerald-100 text-emerald-800',\n amber: 'bg-amber-100 text-amber-800',\n rose: 'bg-rose-100 text-rose-800',\n violet: 'bg-violet-100 text-violet-800',\n}\n\nexport function buildShopCustomerGroupEntity(): EntityDef<CustomerGroup> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Atacado',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${SWATCH[row.color] ?? SWATCH.slate}`}>\n {row.name}\n </span>\n ),\n },\n {\n key: 'color', label: 'Cor', type: 'select', group: 'basic',\n options: [\n { value: 'slate', label: 'Neutro' },\n { value: 'emerald', label: 'Verde' },\n { value: 'amber', label: 'Âmbar' },\n { value: 'rose', label: 'Rosa' },\n { value: 'violet', label: 'Violeta' },\n ],\n hint: 'Só para reconhecer o grupo de relance na lista.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este grupo',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'customerIds', label: 'Clientes', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 cliente' : `${count} clientes`}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Grupo',\n namePlural: 'Grupos',\n icon: 'UsersRound',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [{ id: 'basic', label: 'Grupo', columns: 2 }],\n } as EntityDef<CustomerGroup>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerSegment } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Segmento de clientes — uma REGRA, não uma lista.\n//\n// A associação é recalculada dos números do próprio cliente, então ninguém é\n// \"adicionado\" a um segmento e sair dele não é uma ação. Para uma lista que o\n// lojista controla à mão, o que existe é Grupo.\n//\n// Os critérios são campos explícitos e não um JSON livre: cada um é uma\n// condição que a lista de clientes sabe avaliar, então um segmento salvo sempre\n// tem associação real e conferível.\n// ---------------------------------------------------------------------------\n\n/** Legenda humana da regra — é o que a lista mostra em vez de seis colunas de\n * números soltos que ninguém lê como uma condição. */\nexport function describeSegment(s: Partial<CustomerSegment>, money: (v: number) => string): string {\n const parts: string[] = []\n if (s.minOrders != null && s.maxOrders != null) parts.push(`${s.minOrders}–${s.maxOrders} pedidos`)\n else if (s.minOrders != null) parts.push(`${s.minOrders}+ pedidos`)\n else if (s.maxOrders != null) parts.push(`até ${s.maxOrders} pedidos`)\n\n if (s.minSpent != null && s.maxSpent != null) parts.push(`gastou ${money(s.minSpent)}–${money(s.maxSpent)}`)\n else if (s.minSpent != null) parts.push(`gastou ${money(s.minSpent)}+`)\n else if (s.maxSpent != null) parts.push(`gastou até ${money(s.maxSpent)}`)\n\n if (s.joinedAfter) parts.push(`entrou após ${new Date(s.joinedAfter).toLocaleDateString('pt-BR')}`)\n if (s.joinedBefore) parts.push(`entrou antes de ${new Date(s.joinedBefore).toLocaleDateString('pt-BR')}`)\n\n return parts.length ? parts.join(' · ') : 'Todos os clientes'\n}\n\n/** The row the list actually shows: the stored rule plus how many customers\n * match it right now. `matchCount` is recomputed on every read (see the data\n * provider) — a segment's size is only true when it is derived. */\nexport type CustomerSegmentRow = CustomerSegment & { matchCount: number }\n\nexport function buildShopCustomerSegmentEntity(currencyCode = 'BRL'): EntityDef<CustomerSegmentRow> {\n const money = (v: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: currencyCode }).format(v)\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic', span: 2,\n placeholder: 'Clientes fiéis',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este segmento',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'minOrders', label: 'Mínimo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxOrders', label: 'Máximo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem máximo', showInTable: false,\n },\n {\n key: 'minSpent', label: 'Gasto mínimo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxSpent', label: 'Gasto máximo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem máximo', showInTable: false,\n },\n { key: 'joinedAfter', label: 'Entrou depois de', type: 'date', group: 'rule', showInTable: false },\n { key: 'joinedBefore', label: 'Entrou antes de', type: 'date', group: 'rule', showInTable: false },\n\n // Coluna derivada: a regra escrita por extenso.\n {\n key: 'minSpent_rule', label: 'Regra', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (_v, row: any) => (\n <span className=\"text-muted-foreground\">{describeSegment(row, money)}</span>\n ),\n },\n {\n key: 'matchCount', label: 'Clientes', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className=\"block text-right font-medium\">\n {v == null ? '—' : Number(v)}\n </span>\n ),\n },\n ]\n\n return {\n name: 'Segmento',\n namePlural: 'Segmentos',\n icon: 'Filter',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Segmento', columns: 2 },\n {\n id: 'rule', label: 'Regra', columns: 2,\n description: 'Todos os critérios preenchidos valem juntos. Deixe vazio o que não quiser exigir.',\n },\n ],\n } as EntityDef<CustomerSegmentRow>\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, invalidateProductLists, listProductsDetailed, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const answer = await listProductsDetailed(\n provider,\n query.search ? { search: query.search } : undefined,\n )\n return {\n ...applyQuery(answer.rows, query, 'status'),\n ...(answer.cached && { cached: true }),\n ...(answer.stale && { stale: true }),\n }\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n const created = await resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n invalidateProductLists()\n return created\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n const updated = await resolve(provider).updateProduct(id, patch as UpdateProductInput)\n invalidateProductLists()\n return updated\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n invalidateProductLists()\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Category, CreateCategoryInput, UpdateCategoryInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCategoryDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Category> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Category>> {\n const rows = await resolve(provider).listCategories()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.name.toLowerCase().includes(term) || (c.slug ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Category> {\n const input = data as unknown as Partial<Category>\n return resolve(provider).createCategory({\n name: String(input.name ?? ''),\n slug: input.slug?.trim() || undefined,\n description: input.description ?? undefined,\n // The form writes '' for \"no parent\"; the column is a nullable FK, and\n // '' is not a uuid — it must go as absent, not as empty text.\n parentId: input.parentId?.trim() || undefined,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCategoryInput)\n },\n\n async update(id: string, data: Partial<Category>): Promise<Category> {\n const patch: UpdateCategoryInput = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.slug !== undefined) patch.slug = data.slug?.trim() || undefined\n if (data.description !== undefined) patch.description = data.description\n if (data.parentId !== undefined) patch.parentId = data.parentId?.trim() || null\n if (data.sortOrder !== undefined) patch.sortOrder = data.sortOrder\n return resolve(provider).updateCategory(id, patch)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCategory(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Collection, CreateCollectionInput, UpdateCollectionInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** Collections are optional on the provider contract. A provider without them\n * should read as \"no collections\", not blow up the list. */\nfunction requireCollections(p: ReturnType<typeof resolve>) {\n if (!p.listCollections) throw new Error('This store provider does not support collections')\n return p\n}\n\nexport function createShopCollectionDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Collection> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Collection>> {\n const p = resolve(provider)\n const rows = (await p.listCollections?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.title.toLowerCase().includes(term) || (c.handle ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n const input = data as unknown as Partial<Collection>\n return p.createCollection!({\n title: String(input.title ?? ''),\n handle: input.handle?.trim() || undefined,\n description: input.description ?? null,\n seoTitle: input.seoTitle ?? null,\n seoDescription: input.seoDescription ?? null,\n published: input.published ?? true,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCollectionInput)\n },\n\n async update(id: string, data: Partial<Collection>): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n // productIds is not on the form (membership needs a product picker the\n // declarative EntityDef can't express), so it must never reach the patch\n // — an undefined there means \"leave the membership alone\", but a stale\n // value from the row would silently rewrite it.\n const { productIds: _members, ...patch } = data\n return p.updateCollection!(id, patch as UpdateCollectionInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireCollections(resolve(provider))\n await p.deleteCollection!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { GiftCard, CreateGiftCardInput, UpdateGiftCardInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGiftCards(p: ReturnType<typeof resolve>) {\n if (!p.listGiftCards) throw new Error('This store provider does not support gift cards')\n return p\n}\n\nexport function createShopGiftCardDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<GiftCard> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<GiftCard>> {\n const rows = (await resolve(provider).listGiftCards?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.code.toLowerCase().includes(term) || (g.customerEmail ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n const input = data as unknown as Partial<GiftCard>\n return p.createGiftCard!({\n code: input.code?.trim() || undefined,\n initialBalance: Number(input.initialBalance) || 0,\n status: input.status ?? 'active',\n expiresAt: input.expiresAt || null,\n customerEmail: input.customerEmail || null,\n note: input.note || null,\n } as CreateGiftCardInput)\n },\n\n async update(id: string, data: Partial<GiftCard>): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n // initialBalance is the card's face value — the record of how much money\n // came in. Editing it after issue would rewrite financial history, so the\n // patch drops it and only the remaining balance is adjustable.\n const { initialBalance: _face, ...patch } = data\n return p.updateGiftCard!(id, patch as UpdateGiftCardInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGiftCards(resolve(provider))\n await p.deleteGiftCard!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGroups(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerGroups) throw new Error('This store provider does not support customer groups')\n return p\n}\n\nexport function createShopCustomerGroupDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<CustomerGroup> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<CustomerGroup>> {\n const rows = (await resolve(provider).listCustomerGroups?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.name.toLowerCase().includes(term) || (g.description ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n const input = data as unknown as Partial<CustomerGroup>\n return p.createCustomerGroup!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n color: input.color ?? null,\n } as CreateCustomerGroupInput)\n },\n\n async update(id: string, data: Partial<CustomerGroup>): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n // customerIds is not on the form (membership needs a customer picker the\n // declarative EntityDef can't express). Passing the row's stale copy would\n // rewrite the membership on every rename; undefined leaves it alone.\n const { customerIds: _members, ...patch } = data\n return p.updateCustomerGroup!(id, patch as UpdateCustomerGroupInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGroups(resolve(provider))\n await p.deleteCustomerGroup!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, ShopCustomer,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** A segment row plus how many customers currently match it. */\ntype SegmentRow = CustomerSegment & { matchCount: number }\n\nfunction requireSegments(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerSegments) throw new Error('This store provider does not support customer segments')\n return p\n}\n\n/**\n * Does this customer satisfy the rule? All criteria AND together, and a null\n * criterion is \"don't check\", NOT zero — a segment with no bounds matches\n * everyone, which is different from one demanding at least R$0.\n */\nexport function customerMatchesSegment(c: ShopCustomer, s: CustomerSegment): boolean {\n const orders = c.ordersCount ?? 0\n const spent = c.totalSpent ?? 0\n if (s.minOrders != null && orders < s.minOrders) return false\n if (s.maxOrders != null && orders > s.maxOrders) return false\n if (s.minSpent != null && spent < s.minSpent) return false\n if (s.maxSpent != null && spent > s.maxSpent) return false\n // Compare on the calendar day: createdAt is a timestamp and the bounds are\n // dates, so a same-day signup must count as \"joined after\" that day.\n const joined = c.createdAt?.slice(0, 10)\n if (s.joinedAfter && (!joined || joined < s.joinedAfter)) return false\n if (s.joinedBefore && (!joined || joined > s.joinedBefore)) return false\n return true\n}\n\nexport function createShopCustomerSegmentDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<SegmentRow> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<SegmentRow>> {\n const p = resolve(provider)\n const rows = (await p.listCustomerSegments?.()) ?? []\n // One customer read for the whole page, then count in memory. A segment\n // is a rule, so its size is only true when it is recomputed — a stored\n // count would be a number that silently goes stale.\n const customers = rows.length ? await p.listCustomers().catch(() => [] as ShopCustomer[]) : []\n const withCounts: SegmentRow[] = rows.map((s) => ({\n ...s,\n matchCount: customers.filter((c) => customerMatchesSegment(c, s)).length,\n }))\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? withCounts.filter((s) =>\n s.name.toLowerCase().includes(term) || (s.description ?? '').toLowerCase().includes(term))\n : withCounts\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n const input = data as unknown as Partial<CustomerSegment>\n const created = await p.createCustomerSegment!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n minOrders: input.minOrders ?? null,\n maxOrders: input.maxOrders ?? null,\n minSpent: input.minSpent ?? null,\n maxSpent: input.maxSpent ?? null,\n joinedAfter: input.joinedAfter || null,\n joinedBefore: input.joinedBefore || null,\n } as CreateCustomerSegmentInput)\n return { ...created, matchCount: 0 }\n },\n\n async update(id: string, data: Partial<SegmentRow>): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n // matchCount is derived, never stored — it must not reach the patch.\n const { matchCount: _count, ...patch } = data\n const updated = await p.updateCustomerSegment!(id, patch as UpdateCustomerSegmentInput)\n return { ...updated, matchCount: 0 }\n },\n\n async remove(id: string): Promise<void> {\n const p = requireSegments(resolve(provider))\n await p.deleteCustomerSegment!(id)\n },\n }\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { StoreSettings, UpdateStoreSettingsInput } from '@fayz-ai/shop'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\n\n// ---------------------------------------------------------------------------\n// useStoreSettings — the store's commercial policy, loaded and saved\n// ---------------------------------------------------------------------------\n// One hook behind all the Commerce settings screens, and the reason they can be\n// five screens instead of one: each renders a slice of the SAME tenant row, and\n// each save sends only the keys it touched (see storeSettingsPayload). Two\n// screens open in two tabs cannot overwrite each other's sections.\n//\n// AUTO-SAVE, no Save button. Every one of these is a single decision with an\n// immediate meaning (\"aceito boleto\"), and a form that batches ten of them\n// behind a button asks the merchant to remember which ones they changed. The\n// write is debounced so a burst of chip clicks collapses into one round trip.\n//\n// `undefined` is load-bearing throughout: it means the merchant has not decided,\n// which every reader treats as \"keep the app's own default\". A screen must\n// therefore never render `value ?? false` into the store — only into the\n// control. `defaults` exists for exactly that: it is what the UI shows while\n// nothing is chosen, and it is never written on its own.\n\nconst DEBOUNCE_MS = 400\n\nexport interface StoreSettingsHandle {\n /** Merged over `defaults`: what the controls render. */\n value: StoreSettings\n /** What is actually stored — `undefined` for anything undecided. */\n stored: StoreSettings | null\n set: (patch: UpdateStoreSettingsInput) => void\n loading: boolean\n /** True while a write is in flight or pending. Drives the \"saving…\" hint. */\n saving: boolean\n /** The provider refused the WRITE. Shown inline; the optimistic value stays\n * on screen so the merchant does not lose what they typed. */\n error: string | null\n /**\n * The provider refused the READ.\n *\n * Kept apart from `error` because the two need opposite copy and imply\n * opposite things. A failed save means \"your change did not stick\"; a failed\n * load means \"everything below is a default, not your settings\" — and showing\n * the save wording for a load failure, which is what this hook did at first,\n * tells the merchant a change was lost when they had not made one.\n */\n loadError: string | null\n /** False when the mounted provider has no store-settings support at all —\n * the screen says so instead of pretending the toggles work. */\n supported: boolean\n}\n\nexport function useStoreSettings(\n provider: ShopProviderResolver | undefined,\n defaults: StoreSettings = {},\n): StoreSettingsHandle {\n const shop = React.useMemo(\n () => (provider ? resolve(provider) : getShopProvider()),\n [provider],\n )\n const supported = typeof shop.getStoreSettings === 'function' && typeof shop.updateStoreSettings === 'function'\n\n const [stored, setStored] = React.useState<StoreSettings | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!supported) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void shop\n .getStoreSettings!()\n .then((settings) => { if (!cancelled) setStored(settings) })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n // The pending patch accumulates across the debounce window, so clicking three\n // chips sends one write with three keys rather than three writes racing to be\n // last. Kept in a ref: a re-render must not restart the timer.\n const pendingRef = React.useRef<UpdateStoreSettingsInput>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback(\n (patch: UpdateStoreSettingsInput) => {\n // Optimistic: the control reflects the click without waiting for a server.\n setStored((current) => ({ ...(current ?? {}), ...patch }))\n if (!supported) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void shop\n .updateStoreSettings!(payload)\n // The server's answer wins over the optimistic guess — it is the row\n // that a CHECK constraint or a trigger may have had an opinion about.\n .then((saved) => setStored(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n },\n [shop, supported],\n )\n\n const value = React.useMemo(() => ({ ...defaults, ...(stored ?? {}) }), [defaults, stored])\n\n return { value, stored, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\n\n/**\n * The three things every Commerce settings screen has to say, said once.\n *\n * Loading, saving and refused are not decoration on a settings screen that\n * writes to a server: without them a merchant cannot tell \"salvo\" from \"não\n * chegou\", and the whole reason these screens exist is that the previous ones\n * silently kept everything in React state. The saving/saved line is what\n * replaces the Save button the auto-save design removes.\n *\n * `supported: false` is its own case, and deliberately loud: it means the\n * mounted shop provider has no store-settings methods at all, so every control\n * below would be a toggle wired to nothing — which is exactly the bug this wave\n * fixes and must not be reintroduced silently by a bespoke provider.\n */\nexport function SettingsState({\n loading,\n saving,\n error,\n loadError,\n supported,\n children,\n}: {\n loading: boolean\n saving: boolean\n error: string | null\n /** The READ failed. Opposite copy from `error`, and shown ABOVE the controls\n * rather than below: what is on screen is defaults, not the store's settings,\n * and that has to be read before anything is clicked. */\n loadError?: string | null\n supported: boolean\n children: React.ReactNode\n}) {\n if (!supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getStoreSettings</code>. As opções\n abaixo não seriam salvas, então não são mostradas.\n </p>\n </div>\n )\n }\n\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria configurações que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {children}\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface StoreGeneralSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Loja — moeda, formatação e as regras de catálogo.\n *\n * O `currency` que o app passa na criação do plugin é o VALOR INICIAL mostrado,\n * não o valor salvo: enquanto o lojista não escolhe, a vitrine segue com o que o\n * app declarou, e é isso que a coluna nula significa. Escolher grava.\n */\nexport function StoreGeneralSettings({ currency, provider }: StoreGeneralSettingsProps) {\n const settings = useStoreSettings(provider, {\n currency: currency?.code ?? 'BRL',\n locale: currency?.locale ?? 'pt-BR',\n showOutOfStock: true,\n requireSku: false,\n notifyNewOrder: true,\n notifyLowStock: false,\n })\n const { value, set } = settings\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={value.currency ?? 'BRL'}\n options={CURRENCIES}\n onChange={(v) => set({ currency: v })}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={value.locale ?? 'pt-BR'}\n options={LOCALES}\n onChange={(v) => set({ locale: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={value.showOutOfStock ?? true}\n onChange={(v) => set({ showOutOfStock: v })}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={value.requireSku ?? false}\n onChange={(v) => set({ requireSku: v })}\n />\n </SettingsGroup>\n\n {/* «Controlar estoque» saiu daqui. Era um interruptor local que não\n governava nada, e a decisão real — quem é dono do número, nosso livro\n ou um ERP — já existe como `stock_ownership` e é escrita pelo conector\n que assume o estoque. Dois controles para a mesma coisa é o caminho\n mais curto para eles discordarem. */}\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={value.notifyNewOrder ?? true}\n onChange={(v) => set({ notifyNewOrder: v })}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={value.notifyLowStock ?? false}\n onChange={(v) => set({ notifyLowStock: v })}\n />\n </SettingsGroup>\n </SettingsState>\n )\n}\n","/**\n * Which gateway should be charging, given what the store stored and what is\n * connected right now. Returns the slug to persist, or null for \"leave it\".\n *\n * The store must always have someone charging: a gateway just connected and\n * nobody named makes every order pending for no reason, and a named gateway\n * that went away makes the checkout promise a charge that cannot open.\n *\n * `''` is the one answer this never overrides — it is the merchant saying \"eu\n * confirmo à mão\", which is a decision. `undefined` is the absence of one.\n */\nexport function resolvePaymentProvider(\n current: string | undefined | null,\n live: readonly string[],\n): string | null {\n if (live.length === 0) return null\n if (current === '') return null\n if (current && live.includes(current)) return null\n return live[0]!\n}\n","import React from 'react'\nimport { ConnectorMark, StateChip, type UnifiedConnector } from '@fayz-ai/admin'\n\n/**\n * One payment gateway, where activating it IS choosing it.\n *\n * Shopify and Nuvemshop have no \"primary provider\" control: a provider is active\n * or it is not, and turning one on is what makes it charge. Ours were two\n * sections, so the gateway was chosen in one place and listed in another with\n * the relationship left to be guessed.\n *\n * The row body ONLY selects, and the named link beside it is the only way into\n * the connection's own screen — a row that sometimes selected and sometimes\n * opened a panel read as broken, which is what it was reported as.\n */\nexport function PaymentProviderRow({ connector, selected, onSelect, onOpen }: {\n connector: UnifiedConnector\n selected: boolean\n onSelect: (connector: UnifiedConnector) => void\n onOpen: (connector: UnifiedConnector) => void\n}) {\n const live = connector.state === 'connected'\n\n return (\n <li className={`flex items-start gap-1 transition-colors ${selected ? 'bg-primary/5' : ''}`}>\n {/* Not connected is not selectable, and the body never opens the panel:\n one row, one meaning. The link beside it is the way in. */}\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={!live}\n onClick={() => onSelect(connector)}\n className={`flex min-w-0 flex-1 items-start gap-3 p-4 text-left ${\n live ? 'hover:bg-muted/40' : 'cursor-default opacity-70'\n }`}\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n } ${live ? '' : 'opacity-30'}`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <ConnectorMark connector={connector} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n <StateChip state={connector.state} />\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {selected\n ? 'Cobra os pedidos desta loja.'\n : live\n ? 'Conectado. Clique para passar a cobrança para ele.'\n : connector.description ?? 'Ainda não conectado.'}\n </span>\n </span>\n </button>\n {/* Named, not a chevron: the arrow said \"there is more here\" and the row\n already means something else now — one of the two had to say what it\n does. */}\n <button\n type=\"button\"\n onClick={() => onOpen(connector)}\n className=\"shrink-0 self-center whitespace-nowrap px-4 text-xs text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground\"\n >\n {live ? 'Configurar conexão' : 'Conectar'}\n </button>\n </li>\n )\n}\n\n/** The absence of a gateway, as a choice in the same list — Shopify's \"manual\n * payment methods only\". A separate section for it made it look like a setting\n * about something else. */\nexport function ManualChargeRow({ selected, onSelect }: {\n selected: boolean\n onSelect: () => void\n}) {\n return (\n <li className={selected ? 'bg-primary/5' : ''}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n onClick={onSelect}\n className=\"flex w-full items-start gap-3 p-4 text-left hover:bg-muted/40\"\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium text-foreground\">Nenhum — eu confirmo os pagamentos à mão</span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n Pix por chave, dinheiro na entrega, combinado com a loja. O pedido nasce pendente e\n espera você confirmar que o dinheiro caiu.\n </span>\n </span>\n </button>\n </li>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, MultiSelectRow,\n useConnectors, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport type { PaymentMethodKind } from '@fayz-ai/shop'\nimport { AlertTriangle } from 'lucide-react'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { resolvePaymentProvider } from './payment-provider'\nimport { ManualChargeRow, PaymentProviderRow } from './PaymentProviderRow'\n\nexport interface PaymentsSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * Every method an order can record — the same list as the CHECK on\n * plg_shop_orders.payment_method_kind, and therefore the same list the trigger\n * from 0045 validates against. One vocabulary, three places, no drift.\n */\nconst METHODS: Array<{ value: PaymentMethodKind; label: string; hint: string }> = [\n { value: 'pix', label: 'Pix', hint: 'Chave ou QR Code' },\n { value: 'credit_card', label: 'Cartão de crédito', hint: 'Gateway ou maquininha' },\n { value: 'debit_card', label: 'Cartão de débito', hint: 'Gateway ou maquininha' },\n { value: 'boleto', label: 'Boleto', hint: 'Enviado por e-mail' },\n { value: 'cash', label: 'Dinheiro', hint: 'Na entrega ou no balcão' },\n { value: 'other', label: 'Combinar com a loja', hint: 'A loja acerta o pagamento' },\n]\n\n/**\n * Pagamentos — quem cobra e o que o comprador pode escolher.\n *\n * Duas coisas diferentes numa tela, e a distinção é o assunto:\n *\n * • QUEM COBRA é uma conexão. Já existe: os conectores de pagamento vêm do\n * manifesto do plugin, a credencial vai para o cofre e o estado é derivado\n * de connections. Esta tela não reimplementa nada disso — ela FILTRA o\n * hub por `category === 'payments'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * • O QUE O COMPRADOR ESCOLHE é política comercial, e muda com a estação. Fica\n * em plg_shop_settings.payment_methods, é lida pela vitrine em runtime e é\n * IMPOSTA no servidor: um pedido nomeando um método fora da lista é\n * recusado, não apenas escondido do formulário.\n *\n * Um método sem gateway ainda é legítimo — dinheiro na entrega, Pix por chave,\n * «combinar com a loja» — então nada aqui exige uma conexão para ser oferecido.\n * O que a tela faz é DIZER quando o pedido vai nascer pendente esperando o\n * lojista confirmar, em vez de deixar o lojista descobrir isso no primeiro\n * pedido.\n */\n/** The categories this screen is about — the same list its own filter uses. */\nconst PAYMENT_CATEGORIES = ['payments']\n\nexport function PaymentsSettings({ provider }: PaymentsSettingsProps) {\n const settings = useStoreSettings(provider)\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n // Same rule as the hub: the assistant's drawer owns the journey when one is\n // mounted, and the sheet is the fallback so the flow is never stranded.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n\n const payment = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && PAYMENT_CATEGORIES.includes(c.category)),\n [connectors],\n )\n const live = React.useMemo(() => payment.filter((c) => c.state === 'connected'), [payment])\n\n const chosen = value.paymentMethods ?? []\n // A gateway went away (disconnected, or the app dropped the plugin) and the\n // store still names it — and there is nothing live to hand the charge to.\n const staleProvider = !!value.paymentProvider\n && !live.some((c) => c.slug === value.paymentProvider)\n && live.length === 0\n\n // Always someone charging — the rule itself is in resolvePaymentProvider, so\n // it can be argued with in a test instead of in a mounted screen.\n const movedFrom = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!settings.supported || settings.loading) return\n const next = resolvePaymentProvider(value.paymentProvider, live.map((c) => c.slug))\n if (!next) return\n // Only a REPLACEMENT is announced; adopting a gateway nobody had chosen is\n // not news.\n if (value.paymentProvider) movedFrom.current = value.paymentProvider\n set({ paymentProvider: next })\n }, [live, value.paymentProvider, settings.supported, settings.loading, set])\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Formas de pagamento\"\n description=\"O que o cliente pode escolher no checkout. Um pedido que chegar com outra forma é recusado pelo servidor.\"\n >\n <MultiSelectRow\n label=\"Aceito na loja\"\n description=\"Nada escolhido = a vitrine oferece o que o app declarou, como hoje.\"\n value={chosen}\n options={METHODS.map((m) => ({ value: m.value, label: m.label }))}\n onChange={(next) => set({ paymentMethods: next as PaymentMethodKind[] })}\n />\n {chosen.length > 0 && !value.paymentProvider && (\n <p className=\"flex items-start gap-2 py-3 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n Sem um gateway cobrando, todo pedido nasce <strong className=\"font-medium\">pendente</strong> e\n espera você confirmar que o dinheiro caiu. Isso funciona — é como as lojas com Pix por\n chave e pagamento na entrega operam — mas a confirmação é sua.\n </p>\n )}\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem cobra</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O provedor marcado é quem abre a cobrança quando o cliente finaliza a compra — só um\n cobra por vez. A credencial vai para o cofre, nunca para o banco da loja.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n {payment.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum provedor de pagamento disponível para este app ainda.\n </p>\n ) : (\n <ul className=\"divide-y\" role=\"radiogroup\" aria-label=\"Quem cobra\">\n {payment.map((connector) => (\n <PaymentProviderRow\n key={connector.id}\n connector={connector}\n selected={value.paymentProvider === connector.slug}\n onSelect={(c) => { movedFrom.current = null; set({ paymentProvider: c.slug }) }}\n onOpen={openJourney}\n />\n ))}\n <ManualChargeRow\n selected={value.paymentProvider === ''}\n onSelect={() => { movedFrom.current = null; set({ paymentProvider: '' }) }}\n />\n </ul>\n )}\n </div>\n {movedFrom.current && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span>\n <strong className=\"font-medium\">{movedFrom.current}</strong> não está mais conectado, então\n a cobrança passou para o provedor marcado acima. Reconecte-o para voltar.\n </span>\n </p>\n )}\n {staleProvider && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-destructive\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n A loja cobra por <strong className=\"font-medium\">{value.paymentProvider}</strong>, que não\n está conectado agora, e não há outro para assumir. Enquanto isso os pedidos nascem\n pendentes.\n </p>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n // The button lives under \"Provedores de pagamento\" and must offer only\n // those: it was listing the ERP and the carrier too.\n categories={PAYMENT_CATEGORIES}\n onSelect={(connector) => {\n setAdding(false)\n openJourney(connector)\n }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { CheckoutFieldKey, CheckoutFieldPolicy } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface CheckoutSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * The fields the checkout form can ask for, and which of them a store may\n * actually turn off.\n *\n * `locked` is not a UI nicety — it is the delivery reality. A courier cannot\n * deliver to a street with no number and no district, and the checkout's own\n * validation refuses those today; offering a switch that promises otherwise\n * would be offering to break deliveries. The order those appear in is the order\n * of the form, so this list reads like the screen the shopper sees.\n */\nconst FIELDS: Array<{ key: CheckoutFieldKey; label: string; locked?: boolean; hint?: string }> = [\n { key: 'name', label: 'Nome completo', locked: true, hint: 'Sempre pedido — é para quem a entrega vai.' },\n { key: 'email', label: 'E-mail', locked: true, hint: 'Sempre pedido — é por onde o pedido é confirmado.' },\n { key: 'phone', label: 'Telefone', hint: 'Vai junto com o endereço — é por onde o entregador liga.' },\n // Back, now that 0050 gives it a column. Deliberately NOT locked: a store that\n // neither charges through a gateway nor issues an invoice has no use for it.\n // The checkout escalates it to required on its own when a gateway is on —\n // that is a fact about the charge, not a preference the merchant can waive.\n { key: 'document', label: 'CPF / CNPJ', hint: 'Obrigatório quando a loja cobra por gateway ou emite nota — nesse caso a vitrine já pede sozinha.' },\n { key: 'postalCode', label: 'CEP', locked: true, hint: 'Sempre pedido — é o que cota o frete.' },\n { key: 'street', label: 'Endereço', locked: true },\n { key: 'number', label: 'Número', locked: true, hint: 'Sem número o entregador não chega.' },\n { key: 'complement', label: 'Complemento' },\n { key: 'district', label: 'Bairro', locked: true },\n { key: 'city', label: 'Cidade', locked: true },\n { key: 'state', label: 'UF', locked: true },\n]\n\nconst REQUIREMENT = [\n { value: 'off', label: 'Não pedir' },\n { value: 'optional', label: 'Pedir (opcional)' },\n { value: 'required', label: 'Pedir (obrigatório)' },\n]\n\nfunction toRequirement(policy: CheckoutFieldPolicy | undefined, locked: boolean): string {\n if (locked) return 'required'\n if (policy?.visible === false) return 'off'\n return policy?.required ? 'required' : 'optional'\n}\n\nfunction fromRequirement(choice: string): CheckoutFieldPolicy {\n // 'off' writes both keys rather than only `visible`: a field nobody can see\n // cannot be required, and leaving a stale `required: true` behind is how a\n // hidden field later reappears as a blocking validation nobody can satisfy.\n if (choice === 'off') return { visible: false, required: false }\n return { visible: true, required: choice === 'required' }\n}\n\n/**\n * Checkout — quem pode comprar e o que é pedido no caminho.\n *\n * A honestidade sobre quem impõe o quê está nas descrições, e não é detalhe:\n * «compra sem cadastro» é recusada pelo SERVIDOR (trigger da 0045), então\n * desligá-la vale mesmo contra um POST direto no RPC. «Exigir e-mail\n * confirmado» e os campos do formulário são de INTERFACE — a vitrine obedece, e\n * um comprador determinado não é impedido pelo banco. Prometer imposição onde\n * ela não existe é pior do que não ter a opção.\n */\nexport function CheckoutSettings({ provider }: CheckoutSettingsProps) {\n const settings = useStoreSettings(provider, {\n guestCheckout: true,\n requireConfirmedEmail: false,\n marketingOptIn: false,\n discountsEnabled: true,\n })\n const { value, set } = settings\n const fields = value.checkoutFields ?? {}\n\n const setField = (key: CheckoutFieldKey, choice: string) =>\n set({ checkoutFields: { ...fields, [key]: fromRequirement(choice) } })\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Contas de cliente\"\n description=\"Se o comprador precisa de uma conta antes de finalizar.\"\n >\n <ToggleRow\n label=\"Permitir compra sem cadastro\"\n description=\"Desligado, o comprador precisa entrar ou criar conta. Esta é imposta no servidor: um pedido sem conta é recusado.\"\n checked={value.guestCheckout ?? true}\n onChange={(v) => set({ guestCheckout: v })}\n />\n <ToggleRow\n label=\"Exigir e-mail confirmado\"\n description=\"O comprador recebe um link ao se cadastrar e só finaliza depois de clicar. Vale na vitrine — confirmar e-mail é um fato da conta, não do pedido.\"\n checked={value.requireConfirmedEmail ?? false}\n onChange={(v) => set({ requireConfirmedEmail: v })}\n disabled={value.guestCheckout !== false}\n />\n {value.guestCheckout !== false && (\n <p className=\"py-3 text-xs text-muted-foreground\">\n «Exigir e-mail confirmado» só faz sentido com o cadastro obrigatório: enquanto a compra\n sem cadastro está liberada, não há conta cujo e-mail confirmar.\n </p>\n )}\n </SettingsGroup>\n\n <SettingsGroup title=\"Carrinho\" description=\"O que o comprador pode aplicar antes de pagar.\">\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Mostrar o campo de código no carrinho e no checkout.\"\n checked={value.discountsEnabled ?? true}\n onChange={(v) => set({ discountsEnabled: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Consentimento de marketing\"\n description=\"Coleta de opt-in para e-mails, no padrão que a LGPD pede: marcado por quem quer, nunca por padrão.\"\n >\n <ToggleRow\n label=\"Mostrar caixa de opt-in\"\n description=\"Exibir a caixa «quero receber novidades» no checkout, desmarcada.\"\n checked={value.marketingOptIn ?? false}\n onChange={(v) => set({ marketingOptIn: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Campos do cliente\"\n description=\"O que o comprador vê e o que ele precisa preencher. Campos travados são os que a entrega não dispensa.\"\n >\n {FIELDS.map((field) => (\n <SelectRow\n key={field.key}\n label={field.label}\n description={field.hint}\n value={toRequirement(fields[field.key], !!field.locked)}\n options={field.locked ? [{ value: 'required', label: 'Pedir (obrigatório)' }] : REQUIREMENT}\n onChange={(choice) => setField(field.key, choice)}\n disabled={field.locked}\n />\n ))}\n </SettingsGroup>\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Embalagens — em que caixas a loja embala.\n *\n * É a metade que faltava do frete real. O produto declara o que ele É (peso e\n * medidas, na seção Envio do cadastro) e para onde ele VAI (a embalagem que\n * aponta); esta tela é o cadastro de onde essa escolha sai. Enquanto ela não\n * existia, a caixa da cotação era uma constante no código — 4×16×20cm e 300g\n * para toda loja da plataforma, que é o piso que a Correios aceita e não a\n * medida de nada que alguém vende. O frete cotado e o frete pago divergiam, e a\n * diferença saía da margem do lojista.\n *\n * A LISTA NÃO É DESTE ARQUIVO, e essa é a correção: era um CRUD escrito à mão,\n * com o seu próprio jeito de listar, criar, validar e apagar. Agora é\n * `PluginRegistryDef` + `RegistryCrudView`, o mesmo par que desenha feriados,\n * locais e categorias — uma interface a menos para o lojista aprender e umas\n * duzentas linhas a menos para manter sincronizadas com o resto do admin.\n */\nexport function PackagesSettings({ basePath = shippingRegistryPath(PACKAGES_REGISTRY) }: {\n basePath?: string\n}) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Embalagens</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{packagesRegistry.description}</p>\n </div>\n {/* Uma seção entre outras nesta aba: as ações ficam aqui, não na barra. */}\n <RegistryCrudView registry={packagesRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, TextRow, adminNavigateTo } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile } from '@fayz-ai/shop'\nimport { ArrowRight, Layers } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport type { StoreSettingsHandle } from './useStoreSettings'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nexport interface HandlingSettingsProps {\n /** The Entrega screen's own settings read, shared rather than repeated. */\n settings: StoreSettingsHandle\n provider?: ShopProviderResolver\n}\n\n/**\n * Shipping profiles, and the handling note that travels with the parcel.\n *\n * Replaces a three-way cold-chain radio: a profile answers refrigerated, fragile,\n * oversized and made-to-order with one mechanism. The note is separate because it\n * does not decide who may carry the box.\n */\nexport function HandlingSettings({ settings, provider }: HandlingSettingsProps) {\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const { value, set, loading, supported } = settings\n const [noteDraft, setNoteDraft] = React.useState<string | null>(null)\n const [profiles, setProfiles] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void shop.listShippingProfiles?.()\n .then((list) => { if (!cancelled) setProfiles(list) })\n // Silent: a provider without profiles reads the same as a store with none.\n .catch(() => { if (!cancelled) setProfiles([]) })\n return () => { cancelled = true }\n }, [shop])\n\n if (!supported) return null\n\n const storedNote = value.handlingNote ?? ''\n // Null draft = not being edited, so a server answer cannot fight the typing.\n const note = noteDraft ?? storedNote\n const custom = (profiles ?? []).filter((p) => !p.isDefault)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n Produtos que vão de outro jeito\n </h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Um perfil é um grupo de produtos com zonas próprias — refrigerados, frágeis, volumosos, sob\n encomenda. Um perfil com só as suas zonas e o gateway desligado é como se diz «isto não vai\n de transportadora». Produto sem perfil usa o geral, que é o de todos hoje.\n </p>\n </div>\n\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {profiles == null\n ? 'Carregando perfis…'\n : custom.length === 0\n ? 'Só o perfil geral'\n : `${custom.length} ${custom.length === 1 ? 'perfil' : 'perfis'} além do geral`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {custom.length === 0\n ? 'Todo produto entrega pelas mesmas zonas. Crie um perfil quando um grupo precisar de zonas diferentes.'\n : custom.slice(0, 3).map((p) => p.name).join(' · ')}\n {custom.length > 3 && ` e ${custom.length - 3} mais`}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n\n <SettingsGroup\n title=\"Recado para quem entrega\"\n description=\"Vai junto com o pedido — para você, para o motoboy, e na observação da etiqueta quando houver gateway. Não aparece para o cliente, e não decide quem pode levar.\"\n >\n <TextRow\n label=\"Instrução de manuseio\"\n description=\"Ex.: caixa térmica com gelo, entregar em até 24h.\"\n value={note}\n onChange={setNoteDraft}\n onBlurCommit={() => {\n const next = note.trim()\n if (next !== storedNote) set({ handlingNote: next })\n setNoteDraft(null)\n }}\n placeholder=\"Sem instrução\"\n disabled={loading}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\n\nexport interface Choice<T extends string> {\n value: T\n label: string\n description: string\n /** Optional lucide icon component, rendered before the label. */\n Icon?: React.ComponentType<{ className?: string }>\n}\n\nexport interface ChoiceCardsProps<T extends string> {\n label: string\n choices: ReadonlyArray<Choice<T>>\n value: T | undefined\n onChange: (value: T) => void\n disabled?: boolean\n}\n\n/**\n * Mutually exclusive policies with a paragraph each — a radio, not a dropdown:\n * choosing between two of these needs both on screen at once.\n */\nexport function ChoiceCards<T extends string>({\n label, choices, value, onChange, disabled,\n}: ChoiceCardsProps<T>) {\n return (\n <div className=\"space-y-2 py-3\" role=\"radiogroup\" aria-label={label}>\n {choices.map((choice) => {\n const chosen = value === choice.value\n const Icon = choice.Icon\n return (\n <button\n key={choice.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={chosen}\n disabled={disabled}\n onClick={() => onChange(choice.value)}\n className={`flex w-full items-start gap-3 rounded-lg border p-3 text-left transition-colors ${\n chosen ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n } ${disabled ? 'opacity-60' : ''}`}\n >\n <span\n aria-hidden\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n chosen ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {chosen && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n {choice.label}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{choice.description}</span>\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { DeliveryOutcome, ZoneMatchKind } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// O rascunho das regras de entrega.\n//\n// Existe porque o cartão de confirmação do assistente mostra parâmetros, não\n// uma tabela editável — e o que a lojista precisa conferir aqui são catorze\n// linhas com preço e prazo, uma a uma. Então o agente não grava direto: ele\n// MONTA o rascunho, a tela desenha o rascunho, e gravar é um clique dela (ou\n// uma última chamada depois que ela disse que está certo).\n//\n// Módulo e não estado de componente: quem escreve são as ferramentas do agente,\n// que vivem fora da árvore React, e quem lê é o painel. Some quando a lojista\n// salva ou descarta — rascunho não é dado, é uma conversa em andamento.\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryDraftRule {\n /** Local ao rascunho. Nada a ver com o id da regra salva. */\n id: string\n matchKind: ZoneMatchKind\n /** Como a lojista lê a regra: \"Angra dos Reis\", \"Copacabana\", \"20000-000 → 23799-999\". */\n label: string\n cityCode?: string | null\n districtKey?: string | null\n postalFrom?: string | null\n postalTo?: string | null\n outcome: DeliveryOutcome\n /** Vazio de propósito quando a mensagem não disse: campo em branco custa\n * menos que campo errado. */\n rate?: number | null\n freeAbove?: number | null\n etaMinDays?: number | null\n etaMaxDays?: number | null\n /** O trecho da mensagem que originou esta linha, para ela conferir a leitura. */\n source?: string\n}\n\nexport interface DeliveryDraftGap {\n query: string\n /** Por que não virou regra, em português, para o agente repetir sem inventar. */\n reason: string\n}\n\nexport interface DeliveryDraft {\n rules: DeliveryDraftRule[]\n gaps: DeliveryDraftGap[]\n}\n\nconst EMPTY: DeliveryDraft = { rules: [], gaps: [] }\n\nlet draft: DeliveryDraft = EMPTY\nconst listeners = new Set<() => void>()\n\n// Um contador só, e não `rules.length`: o agente substitui o rascunho inteiro e\n// o seletor acrescenta linha a linha. Numerar pelo tamanho da lista faria as\n// duas fontes colidirem no mesmo id assim que alguém removesse uma linha.\nlet seq = 0\nconst nextId = () => `rule-${++seq}`\n\n/** Duas regras que casam o mesmo lugar do mesmo jeito são a mesma regra. */\nconst identity = (rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey' | 'postalFrom' | 'postalTo'>) =>\n [rule.matchKind, rule.cityCode ?? '', rule.districtKey ?? '', rule.postalFrom ?? '', rule.postalTo ?? ''].join('|')\n\nfunction emit(): void {\n for (const listener of listeners) listener()\n}\n\nexport function getDeliveryDraft(): DeliveryDraft {\n return draft\n}\n\nexport function setDeliveryDraft(next: DeliveryDraft): void {\n draft = { ...next, rules: next.rules.map((rule) => ({ ...rule, id: rule.id || nextId() })) }\n emit()\n}\n\n/**\n * Acrescenta regras ao rascunho, ignorando as que já estão lá.\n *\n * É por aqui que o SELETOR escreve — e é de propósito que ele escreva no mesmo\n * lugar que o agente: uma lojista que clicou em cinco bairros e depois disse\n * \"e não entrego em Angra\" tem que ver as seis linhas na mesma tabela, e salvar\n * uma vez. Duas listas seriam duas verdades.\n *\n * Devolve quantas entraram de fato.\n */\nexport function addDeliveryDraftRules(incoming: Array<Omit<DeliveryDraftRule, 'id'>>): number {\n const seen = new Set(draft.rules.map(identity))\n const added: DeliveryDraftRule[] = []\n for (const rule of incoming) {\n const key = identity(rule)\n if (seen.has(key)) continue\n seen.add(key)\n added.push({ ...rule, id: nextId() })\n }\n if (added.length === 0) return 0\n draft = { ...draft, rules: [...draft.rules, ...added] }\n emit()\n return added.length\n}\n\n/** Já está no rascunho? O seletor usa para marcar o que foi escolhido. */\nexport function isInDeliveryDraft(rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey'>): boolean {\n const key = identity(rule as DeliveryDraftRule)\n return draft.rules.some((existing) => identity(existing) === key)\n}\n\n/**\n * O mesmo frete em todas as regras que entregam.\n *\n * A economia real da tela: quem escolhe catorze bairros cobra o mesmo nos\n * catorze, e digitar catorze vezes é onde a pessoa desiste.\n */\nexport function setAllDeliveryDraftRates(patch: Pick<DeliveryDraftRule, 'rate' | 'freeAbove'>): number {\n let touched = 0\n const rules = draft.rules.map((rule) => {\n if (rule.outcome === 'refuse') return rule\n touched++\n return { ...rule, ...patch }\n })\n if (touched === 0) return 0\n draft = { ...draft, rules }\n emit()\n return touched\n}\n\nexport function updateDeliveryDraftRule(id: string, patch: Partial<DeliveryDraftRule>): boolean {\n const index = draft.rules.findIndex((rule) => rule.id === id)\n if (index < 0) return false\n const rules = draft.rules.slice()\n rules[index] = { ...rules[index], ...patch, id }\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function removeDeliveryDraftRule(id: string): boolean {\n const rules = draft.rules.filter((rule) => rule.id !== id)\n if (rules.length === draft.rules.length) return false\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function clearDeliveryDraft(): void {\n draft = EMPTY\n emit()\n}\n\nexport function subscribeDeliveryDraft(listener: () => void): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport function useDeliveryDraft(): DeliveryDraft {\n return React.useSyncExternalStore(subscribeDeliveryDraft, getDeliveryDraft, getDeliveryDraft)\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport type {\n AreaCandidate, CreateShippingZoneInput, DeliveryOutcome, ShopProvider, ZoneMatchKind,\n} from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport {\n clearDeliveryDraft, getDeliveryDraft, setDeliveryDraft, updateDeliveryDraftRule,\n type DeliveryDraftGap, type DeliveryDraftRule,\n} from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// Configurar onde a loja entrega, a partir da mensagem da lojista.\n//\n// A mensagem real que originou isto:\n//\n// \"Não entregamos Costa Verde, Angra, Mangaratiba, Itacuruçá, Itaboraí,\n// Região dos Lagos, Região Serrana. Entregamos Zona Norte (evitar Chapadão e\n// Maré), Zona Sul (exceto Rocinha, Vidigal e comunidades), Zona Oeste.\"\n//\n// Traduzir isso à mão dá catorze faixas de CEP, e por isso ninguém traduz — a\n// loja segue entregando onde disse que não entrega. O agente faz a tradução, e\n// o desenho inteiro existe para que ele a faça sem INVENTAR:\n//\n// findDeliveryAreas o único lugar de onde sai um código de município ou uma\n// chave de bairro. Nome que não volta daqui vira PERGUNTA,\n// nunca regra.\n// proposeDeliveryRules monta o rascunho na tela. Não grava nada.\n// setDeliveryRule corrige uma linha do rascunho (preço, prazo, desfecho).\n// commitDeliveryRules grava, depois que ela olhou a tabela.\n// checkDeliveryFor testa um CEP contra o que ficou salvo — o agente usa\n// para conferir antes de dizer que terminou, e a lojista\n// para perguntar \"por que fulano não conseguiu comprar?\".\n//\n// Preço e prazo NASCEM VAZIOS quando a mensagem não os diz. A mensagem acima não\n// diz nenhum dos dois, e um número inventado num campo de frete é pior que um\n// campo em branco: o branco ela vê, o inventado ela cobra.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INSTRUCTIONS = `\nEsta é a tela de Entrega da loja. Aqui você configura ONDE a loja entrega, ONDE ela recusa e onde precisa confirmar antes.\n\nUma regra tem duas partes: a ÁREA (um município ou um bairro) e o DESFECHO:\n· entrego (deliver) · confirmo antes (review) · não entrego (refuse)\nEntre as regras que casam com um endereço, vence a mais estrita. Então \"Zona Norte: entrego\" + \"Maré: não entrego\" são DUAS regras, e a segunda ganha na Maré. Nunca tente recortar uma área grande em pedaços para abrir exceção — declare a exceção.\n\nPREFIRA A ÁREA MAIOR MENOS AS EXCEÇÕES. É assim que o lojista fala, e é o que a regra mais estrita permite. Quando ele lista várias zonas de uma mesma cidade — \"zona norte, zona sul, zona oeste, zona sudoeste\" — isso É a cidade inteira: proponha UMA regra de município e as exceções, não oitenta bairros. Uma whitelist de bairros é pior de duas formas: ela envelhece (bairro que faltar na lista vira venda recusada em silêncio) e ninguém confere oitenta linhas.\n\nQuando a lojista colar uma mensagem descrevendo a operação dela:\n1. Separe cada lugar citado e se ele é entrega, recusa ou dúvida. \"Evitar X\", \"exceto X\" e \"não entregamos X\" são recusa.\n2. Chame \\`findDeliveryAreas\\` UMA vez com todos os nomes juntos.\n · \\`resolved\\` está pronto para virar regra.\n · \\`options\\` é ambíguo: pergunte qual, não escolha.\n · \\`notFound\\` é o caso importante. Muita comunidade não tem bairro nem CEP próprio — divide o do bairro vizinho. NÃO invente faixa de CEP para ela. Diga isso em uma linha e ofereça o que existe: marcar o bairro que a contém como \"confirmo antes\".\n · \\`group\\` (Zona Sul, Região dos Lagos) traz \\`members\\`. Use os membros como regras individuais SÓ quando ele citou uma parte da cidade. Se ele citou zonas que somam a cidade toda, jogue os grupos fora e use o município.\n3. Chame \\`proposeDeliveryRules\\` com o que resolveu. Ele NÃO grava — desenha a tabela na tela dela.\n4. Preço e prazo: só preencha o que a mensagem disse. Se ela não disse, deixe vazio e pergunte UMA vez, junto, no fim: \"quanto você cobra em cada região, e tem frete grátis acima de algum valor?\".\n5. Quando ela confirmar, chame \\`commitDeliveryRules\\`. Depois teste com \\`checkDeliveryFor\\` dois ou três CEPs (um que entrega, um que recusa) e relate o resultado em duas linhas.\n\nRegras:\n· Você NUNCA escreve um CEP ou um código de município que não tenha vindo de \\`findDeliveryAreas\\`.\n· NÃO proponha faixa de CEP. Faixa é como transportadora precifica, não como uma pessoa descreve onde entrega, e ninguém no mercado pede isso ao lojista. Ela existe só para quando a lojista estiver COPIANDO uma tabela de transportadora e disser os números ela mesma. Se você não achar a área pelo nome, pergunte — não caia na faixa.\n· Comunidade que não resolve pelo nome (Chapadão é o caso) não vira recusa inventada: ofereça marcar o bairro que a contém como \"confirmo antes\", que aceita o pedido e deixa a decisão com ele.\n· Não imprima a tabela inteira no texto: ela está na tela. Diga quantas regras entraram, quantas são recusa, e o que ficou em aberto.\n· Português do Brasil, curto.\n`.trim()\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst FIND_AREAS: PluginAITool = {\n id: 'shop.delivery.find-areas',\n name: 'findDeliveryAreas',\n description:\n 'Resolves place names the merchant wrote (\"Angra\", \"Zona Sul\", \"Barra da Tijuca\", \"Itacuruçá\") into real '\n + 'municipalities (IBGE code), neighbourhoods, or curated groups that expand into several of them. '\n + 'Send EVERY name of the message in one call. This is the ONLY source of a municipality code or a '\n + 'neighbourhood key — never write one that did not come from here. A name that answers `notFound` is a '\n + 'question for the merchant, not a rule to invent.',\n icon: 'MapPin',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n queries: {\n type: 'array',\n description: 'The place names as the merchant wrote them, without \"não entrego\" / \"exceto\".',\n items: { type: 'string' },\n },\n },\n required: ['queries'],\n },\n}\n\nconst PROPOSE_RULES: PluginAITool = {\n id: 'shop.delivery.propose-rules',\n name: 'proposeDeliveryRules',\n description:\n 'Draws the delivery rules the message describes as an EDITABLE TABLE on the merchant\\'s screen. '\n + 'Writes nothing. Every area must carry the ids findDeliveryAreas answered. A group is expanded into one '\n + 'rule per member here, so the merchant sees and trims what it covers. Leave rate and ETA out when the '\n + 'message did not state them.',\n icon: 'ListChecks',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n rules: {\n type: 'array',\n description: 'One entry per area named in the message.',\n items: {\n type: 'object',\n properties: {\n kind: {\n type: 'string',\n enum: ['city', 'district', 'group', 'postal_range'],\n description:\n 'The `kind` findDeliveryAreas answered. Use postal_range ONLY when the merchant is copying a '\n + 'carrier freight table and dictated the numbers — never to describe where they deliver.',\n },\n label: { type: 'string', description: 'The place name, as it should read on the table.' },\n cityCode: { type: 'string', description: 'IBGE code from findDeliveryAreas.' },\n districtKey: { type: 'string', description: 'Neighbourhood key from findDeliveryAreas.' },\n postalFrom: { type: 'string', description: 'Only for postal_range.' },\n postalTo: { type: 'string', description: 'Only for postal_range.' },\n outcome: {\n type: 'string',\n enum: ['deliver', 'review', 'refuse'],\n description: 'deliver | review (confirm before dispatch) | refuse.',\n },\n rate: { type: 'number', description: 'Only if the message stated a price. Otherwise omit.' },\n freeAbove: { type: 'number', description: 'Only if the message stated a threshold.' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n source: { type: 'string', description: 'The words of the message this rule came from.' },\n },\n required: ['kind', 'label', 'outcome'],\n },\n },\n gaps: {\n type: 'array',\n description: 'What the message named and you could NOT resolve, so the merchant sees it too.',\n items: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n reason: { type: 'string', description: 'Plain Portuguese, one line.' },\n },\n required: ['query', 'reason'],\n },\n },\n },\n required: ['rules'],\n },\n}\n\nconst SET_RULE: PluginAITool = {\n id: 'shop.delivery.set-rule',\n name: 'setDeliveryRule',\n description:\n 'Corrects one line of the draft table already on screen — its outcome, price, free-above or ETA. '\n + 'Use when the merchant answers a question about the rules you proposed, instead of rebuilding the whole draft.',\n icon: 'Pencil',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'The rule id proposeDeliveryRules answered.' },\n outcome: { type: 'string', enum: ['deliver', 'review', 'refuse'] },\n rate: { type: 'number' },\n freeAbove: { type: 'number' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n },\n required: ['id'],\n },\n}\n\nconst COMMIT_RULES: PluginAITool = {\n id: 'shop.delivery.commit-rules',\n name: 'commitDeliveryRules',\n description:\n 'Saves the draft table as the store\\'s delivery rules. Call ONLY after the merchant said the table is right. '\n + 'It changes who can buy: an address outside every rule cannot check out, and a refused one is blocked '\n + 'server-side. Saves the draft as it stands on screen — the merchant may have edited it, and those edits win.',\n icon: 'Save',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'update' },\n parameters: { type: 'object', properties: {} },\n}\n\nconst CHECK_DELIVERY: PluginAITool = {\n id: 'shop.delivery.check',\n name: 'checkDeliveryFor',\n description:\n 'Answers what the store does with a given postcode right now: deliver, confirm first, refuse, or outside '\n + 'every rule. Use it to CHECK YOUR OWN WORK after saving, and to answer \"why could this customer not buy?\".',\n icon: 'Search',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n postalCodes: {\n type: 'array',\n description: 'One or more CEPs, with or without punctuation.',\n items: { type: 'string' },\n },\n },\n required: ['postalCodes'],\n },\n}\n\nexport const DELIVERY_AREA_TOOL_IDS = [\n FIND_AREAS.id, PROPOSE_RULES.id, SET_RULE.id, COMMIT_RULES.id, CHECK_DELIVERY.id,\n]\n\n// ---------------------------------------------------------------------------\n// Execução\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaDeps {\n getProvider: () => ShopProvider\n /** Chamado depois de gravar, para a tela recarregar as regras. */\n onSaved: () => void\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\nconst number = (value: unknown): number | null =>\n typeof value === 'number' && Number.isFinite(value) ? value : null\n\nconst OUTCOMES: DeliveryOutcome[] = ['deliver', 'review', 'refuse']\n\nconst outcomeOf = (value: unknown): DeliveryOutcome =>\n OUTCOMES.includes(value as DeliveryOutcome) ? (value as DeliveryOutcome) : 'deliver'\n\n/** Um candidato, na forma curta que o modelo lê sem despejar o banco na tela. */\nfunction candidateOut(area: AreaCandidate): Record<string, unknown> {\n return {\n kind: area.kind,\n label: area.label,\n cityCode: area.cityCode ?? undefined,\n cityName: area.cityName ?? undefined,\n state: area.state ?? undefined,\n districtKey: area.districtKey ?? undefined,\n knownPostalCodes: area.knownPostalCodes || undefined,\n members: area.members?.map((m) => ({\n kind: m.kind,\n label: m.label,\n cityCode: m.cityCode ?? undefined,\n districtKey: m.districtKey ?? undefined,\n })),\n }\n}\n\n/**\n * Um candidato é RESOLVIDO quando é o único, ou quando é exato e os outros não.\n * \"Angra\" traz \"Angra dos Reis\" e mais nada; \"Centro\" traz um grupo e trinta\n * bairros, e aí a pergunta é legítima.\n */\nfunction pickCandidate(query: string, areas: AreaCandidate[]): {\n resolved?: AreaCandidate\n options?: AreaCandidate[]\n} {\n if (areas.length === 0) return {}\n if (areas.length === 1) return { resolved: areas[0] }\n const key = query.trim().toLowerCase()\n const exact = areas.filter((a) => a.label.trim().toLowerCase() === key)\n if (exact.length === 1) return { resolved: exact[0] }\n return { options: areas.slice(0, 6) }\n}\n\nfunction ruleFromArgs(raw: Record<string, unknown>, index: number): DeliveryDraftRule | null {\n const kind = text(raw.kind)\n const label = text(raw.label)\n if (!label) return null\n\n const base = {\n id: `draft-${index}`,\n label,\n outcome: outcomeOf(raw.outcome),\n rate: number(raw.rate),\n freeAbove: number(raw.freeAbove),\n etaMinDays: number(raw.etaMinDays),\n etaMaxDays: number(raw.etaMaxDays),\n source: text(raw.source) || undefined,\n }\n\n if (kind === 'city') {\n const cityCode = text(raw.cityCode)\n if (!cityCode) return null\n return { ...base, matchKind: 'city' as ZoneMatchKind, cityCode }\n }\n if (kind === 'district') {\n const districtKey = text(raw.districtKey)\n if (!districtKey) return null\n return {\n ...base,\n matchKind: 'district' as ZoneMatchKind,\n districtKey,\n cityCode: text(raw.cityCode) || null,\n }\n }\n if (kind === 'postal_range') {\n const from = text(raw.postalFrom).replace(/\\D/g, '')\n const to = text(raw.postalTo).replace(/\\D/g, '')\n if (from.length !== 8 || to.length !== 8) return null\n return { ...base, matchKind: 'postal_range' as ZoneMatchKind, postalFrom: from, postalTo: to }\n }\n return null\n}\n\n/** A regra do rascunho, na forma que o provider grava. */\nexport function zoneInputFrom(rule: DeliveryDraftRule): CreateShippingZoneInput {\n return {\n name: rule.label,\n carrier: null,\n matchKind: rule.matchKind,\n cityCode: rule.cityCode ?? null,\n districtKey: rule.districtKey ?? null,\n outcome: rule.outcome,\n postalFrom: rule.postalFrom ?? null,\n postalTo: rule.postalTo ?? null,\n // Uma regra de recusa não cobra nada: o preço dela nunca é lido.\n rate: rule.outcome === 'refuse' ? 0 : (rule.rate ?? 0),\n freeAbove: rule.freeAbove ?? null,\n etaMinDays: rule.etaMinDays ?? null,\n etaMaxDays: rule.etaMaxDays ?? null,\n active: true,\n sortOrder: 0,\n excluded: rule.outcome === 'refuse',\n }\n}\n\nexport function createDeliveryAreaTools({ getProvider, onSaved }: DeliveryAreaDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => ({ ok: false, error: errorMessage(error) })\n\n return [\n {\n tool: FIND_AREAS,\n execute: async (args) => {\n const queries = (Array.isArray(args.queries) ? args.queries : [])\n .map(text).filter(Boolean).slice(0, 30)\n if (queries.length === 0) return { ok: false, error: 'no_queries' }\n try {\n const shop = getProvider()\n if (typeof shop.findAreas !== 'function') {\n return { ok: false, error: 'area_lookup_unavailable' }\n }\n const results = await Promise.all(\n queries.map(async (query) => {\n const areas = await shop.findAreas!(query, 8).catch(() => [])\n const { resolved, options } = pickCandidate(query, areas)\n if (resolved) return { query, resolved: candidateOut(resolved) }\n if (options) return { query, options: options.map(candidateOut) }\n return {\n query,\n notFound: true,\n // Dito aqui e não deixado para o modelo deduzir: é a frase que\n // separa \"não existe\" de \"existe mas não dá para separar por CEP\".\n hint:\n 'Sem município, bairro ou grupo com esse nome. Comunidade normalmente não tem CEP próprio — '\n + 'divide o do bairro vizinho. Pergunte à lojista qual bairro a contém.',\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: PROPOSE_RULES,\n execute: async (args) => {\n const raw = Array.isArray(args.rules) ? args.rules : []\n const rules: DeliveryDraftRule[] = []\n const gaps: DeliveryDraftGap[] = (Array.isArray(args.gaps) ? args.gaps : [])\n .map((g: any) => ({ query: text(g?.query), reason: text(g?.reason) }))\n .filter((g: DeliveryDraftGap) => g.query)\n\n raw.forEach((entry: any, index: number) => {\n const rule = ruleFromArgs(entry ?? {}, rules.length)\n if (rule) {\n rules.push(rule)\n return\n }\n // Recusada, e dito por quê: uma regra sem código de município é\n // exatamente o palpite que este desenho existe para impedir.\n gaps.push({\n query: text(entry?.label) || `regra ${index + 1}`,\n reason:\n 'Faltou o identificador da área. Chame findDeliveryAreas para este nome e use o que ele responder.',\n })\n })\n\n if (rules.length === 0 && gaps.length === 0) return { ok: false, error: 'empty_draft' }\n\n setDeliveryDraft({ rules, gaps })\n return {\n ok: true,\n drafted: rules.length,\n refusing: rules.filter((r) => r.outcome === 'refuse').length,\n reviewing: rules.filter((r) => r.outcome === 'review').length,\n missingPrice: rules.filter((r) => r.outcome !== 'refuse' && r.rate == null).length,\n gaps,\n rules: rules.map((r) => ({ id: r.id, label: r.label, outcome: r.outcome })),\n nextStep: 'commitDeliveryRules',\n }\n },\n },\n\n {\n tool: SET_RULE,\n execute: async (args) => {\n const id = text(args.id)\n if (!id) return { ok: false, error: 'no_id' }\n const patch: Partial<DeliveryDraftRule> = {}\n if (args.outcome !== undefined) patch.outcome = outcomeOf(args.outcome)\n if (args.rate !== undefined) patch.rate = number(args.rate)\n if (args.freeAbove !== undefined) patch.freeAbove = number(args.freeAbove)\n if (args.etaMinDays !== undefined) patch.etaMinDays = number(args.etaMinDays)\n if (args.etaMaxDays !== undefined) patch.etaMaxDays = number(args.etaMaxDays)\n if (Object.keys(patch).length === 0) return { ok: false, error: 'nothing_to_change' }\n if (!updateDeliveryDraftRule(id, patch)) return { ok: false, error: 'rule_not_in_draft' }\n return { ok: true, id, ...patch }\n },\n },\n\n {\n tool: COMMIT_RULES,\n execute: async () => {\n // O rascunho é lido AGORA, da tela, e não dos argumentos: entre propor e\n // confirmar a lojista pode ter corrigido um preço, e é a correção dela\n // que vale.\n const { rules } = getDeliveryDraft()\n if (rules.length === 0) return { ok: false, error: 'nothing_to_save' }\n try {\n const shop = getProvider()\n if (typeof shop.createShippingZone !== 'function') {\n return { ok: false, error: 'zones_unavailable' }\n }\n const saved: string[] = []\n const rejected: Array<{ label: string; error: string }> = []\n for (const rule of rules) {\n try {\n await shop.createShippingZone(zoneInputFrom(rule))\n saved.push(rule.label)\n } catch (error) {\n rejected.push({ label: rule.label, error: errorMessage(error) })\n }\n }\n if (saved.length > 0) {\n clearDeliveryDraft()\n onSaved()\n }\n return { ok: rejected.length === 0, saved: saved.length, rejected }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: CHECK_DELIVERY,\n execute: async (args) => {\n const codes = (Array.isArray(args.postalCodes) ? args.postalCodes : [])\n .map((c) => text(c).replace(/\\D/g, ''))\n .filter((c) => c.length === 8)\n .slice(0, 10)\n if (codes.length === 0) return { ok: false, error: 'no_postal_codes' }\n try {\n const shop = getProvider()\n if (typeof shop.checkDelivery !== 'function') {\n return { ok: false, error: 'delivery_check_unavailable' }\n }\n const results = await Promise.all(\n codes.map(async (code) => {\n const check = await shop.checkDelivery!(code)\n return {\n postalCode: code,\n // null = nenhuma regra casou: fora de área, que não é o mesmo\n // que recusado e o texto para a lojista é outro.\n outcome: check.outcome ?? null,\n rule: check.zoneName ?? check.refusedZone ?? null,\n outsideEveryRule: !check.refused && !check.ownZone,\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n ]\n}\n","import * as React from 'react'\nimport { useAgentSurface, type AgentSurfaceContribution, type AskAIIntro } from '@fayz-ai/admin'\nimport type { ShippingZone, ShopProvider } from '@fayz-ai/shop'\nimport { createDeliveryAreaTools, DELIVERY_AREAS_INSTRUCTIONS } from './delivery-agent'\nimport { getDeliveryDraft } from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// A tela de Entrega, entregue ao assistente.\n//\n// Não desenha nada. Publica o que já está configurado, o rascunho em curso, e\n// as ferramentas de configurar região enquanto a aba estiver montada.\n//\n// O `describe` inclui o rascunho de propósito: sem isso o agente propõe uma\n// tabela e, na mensagem seguinte, não sabe mais o que propôs — e a lojista\n// corrigindo um preço na tela vira uma correção que ele não enxerga.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Entrega',\n pitch: 'Me conte onde você entrega, do seu jeito.',\n description:\n 'Escreva como você falaria com um cliente — \"entrego na Zona Norte menos Chapadão, não vou para Angra\" — '\n + 'que eu resolvo cada região e monto a tabela para você conferir e salvar.',\n suggestions: [\n { label: 'Onde eu entrego hoje?' },\n { label: 'Por que um CEP foi recusado?' },\n ],\n}\n\nexport interface DeliveryAgentSurfaceProps {\n provider: () => ShopProvider\n zones: ShippingZone[]\n onSaved: () => void\n}\n\nexport function DeliveryAgentSurface({ provider, zones, onSaved }: DeliveryAgentSurfaceProps) {\n const live = React.useRef({ provider, zones, onSaved })\n live.current = { provider, zones, onSaved }\n\n const contribution = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.delivery.settings',\n pluginId: 'shop',\n role: 'operations',\n instructions: DELIVERY_AREAS_INSTRUCTIONS,\n describe: () => {\n const { zones: rows } = live.current\n const draft = getDeliveryDraft()\n const byOutcome = (outcome: string) =>\n rows.filter((z) => z.active && (z.outcome ?? (z.excluded ? 'refuse' : 'deliver')) === outcome)\n return {\n title: 'Configuração — Entrega',\n state: {\n screen: '/settings/shop-shipping',\n savedRules: {\n delivering: byOutcome('deliver').length,\n reviewing: byOutcome('review').length,\n refusing: byOutcome('refuse').length,\n // Os nomes, não as faixas: o agente precisa saber o que JÁ existe\n // para não propor a mesma região duas vezes.\n names: rows.filter((z) => z.active).slice(0, 40).map((z) => z.name),\n },\n draft: draft.rules.length === 0 && draft.gaps.length === 0\n ? null\n : {\n rules: draft.rules.map((r) => ({\n id: r.id,\n label: r.label,\n outcome: r.outcome,\n rate: r.rate ?? null,\n freeAbove: r.freeAbove ?? null,\n })),\n gaps: draft.gaps,\n },\n },\n }\n },\n tools: createDeliveryAreaTools({\n getProvider: () => live.current.provider(),\n onSaved: () => live.current.onSaved(),\n }),\n }), [])\n\n useAgentSurface(contribution)\n return null\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { AreaCandidate, DeliveryOutcome } from '@fayz-ai/shop'\nimport { Ban, Building2, Check, Loader2, MapPin, Plus, Search, Sparkles } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { addDeliveryDraftRules, isInDeliveryDraft, useDeliveryDraft } from './delivery-draft'\nimport type { DeliveryDraftRule } from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// \"Onde você entrega?\" e, logo abaixo, \"e onde você NÃO entrega?\".\n//\n// A forma das duas caixas é a forma da frase que a lojista escreveu:\n//\n// \"Entregamos zona norte (evitar Chapadão e Maré), zona sul (exceto Rocinha,\n// Vidigal e comunidades), zona sudoeste e zona oeste.\"\n//\n// As quatro zonas que ela lista SÃO a cidade inteira. Ela não está montando uma\n// whitelist de bairros — está dizendo \"o Rio todo, menos estas exceções\". Um\n// seletor que só soma áreas obriga a escolher cento e sessenta e três bairros\n// para depois tirar quatro, e o que faltar da lista vira venda recusada em\n// silêncio.\n//\n// Então o município aparece como CIDADE INTEIRA, em primeiro lugar, e a segunda\n// caixa só existe depois que há algo a excluir. Duas perguntas, na ordem em que\n// ela fala.\n//\n// O que ela escolhe cai no MESMO RASCUNHO que o agente escreve — quem clicou e\n// depois disse \"ah, e não vou em Angra\" vê tudo na mesma tabela e salva uma vez.\n// ---------------------------------------------------------------------------\n\nconst MIN_QUERY = 2\nconst DEBOUNCE_MS = 250\n\nfunction ruleFor(area: AreaCandidate, outcome: DeliveryOutcome): Omit<DeliveryDraftRule, 'id'> | null {\n if (area.kind === 'city' && area.cityCode) {\n return { matchKind: 'city', label: area.label, cityCode: area.cityCode, outcome }\n }\n if (area.kind === 'district' && area.districtKey) {\n return {\n matchKind: 'district',\n label: area.label,\n districtKey: area.districtKey,\n cityCode: area.cityCode ?? null,\n outcome,\n }\n }\n return null\n}\n\n/** Um grupo vira N regras — e é isso que a lojista confere e poda na tabela. */\nfunction rulesFor(area: AreaCandidate, outcome: DeliveryOutcome): Array<Omit<DeliveryDraftRule, 'id'>> {\n if (area.kind !== 'group') {\n const single = ruleFor(area, outcome)\n return single ? [single] : []\n }\n return (area.members ?? []).flatMap((member) => {\n const rule = ruleFor(\n { kind: member.kind, label: member.label, cityCode: member.cityCode, districtKey: member.districtKey },\n outcome,\n )\n return rule ? [rule] : []\n })\n}\n\nfunction areaMeta(area: AreaCandidate): string {\n // O motivo ganha da categoria: \"Itacuruçá é distrito de Mangaratiba\" explica\n // por que a linha diz Mangaratiba quando ela digitou outra coisa.\n if (area.matchedAs) return area.matchedAs\n if (area.kind === 'group') {\n const n = area.members?.length ?? 0\n return `${n} ${n === 1 ? 'região' : 'regiões'}${area.cityName ? ` · ${area.cityName}` : ''}`\n }\n // \"Cidade inteira\" e não \"Município\": é a diferença entre a lojista entender\n // que uma linha cobre tudo e achar que precisa somar bairro por bairro.\n if (area.kind === 'city') return `Cidade inteira${area.state ? ` · ${area.state}` : ''}`\n return `Bairro${area.cityName ? ` · ${area.cityName}` : ''}`\n}\n\nconst areaKeyOf = (area: AreaCandidate) =>\n `${area.kind}:${area.districtKey ?? area.cityCode ?? area.label}`\n\n// ---------------------------------------------------------------------------\n\ninterface AreaSearchProps {\n provider?: ShopProviderResolver\n outcome: DeliveryOutcome\n placeholder: string\n /** Restringe o resultado às cidades que a loja já cobre. */\n onlyCityCodes?: string[]\n emptyHint: React.ReactNode\n}\n\nfunction AreaSearch({ provider, outcome, placeholder, onlyCityCodes, emptyHint }: AreaSearchProps) {\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<AreaCandidate[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [unavailable, setUnavailable] = React.useState(false)\n const [justAdded, setJustAdded] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n const text = query.trim()\n if (text.length < MIN_QUERY) {\n setResults(null)\n return undefined\n }\n let cancelled = false\n setLoading(true)\n const timer = setTimeout(() => {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.findAreas !== 'function') {\n if (!cancelled) { setUnavailable(true); setLoading(false) }\n return\n }\n void shop\n .findAreas(text, 10)\n .then((list) => { if (!cancelled) { setResults(list); setUnavailable(false) } })\n // Uma busca que não responde é a MESMA coisa que uma busca vazia para\n // quem está olhando — o que não pode acontecer é a tela sugerir que a\n // pessoa digite a faixa de CEP no lugar.\n .catch(() => { if (!cancelled) { setResults([]); setUnavailable(true) } })\n .finally(() => { if (!cancelled) setLoading(false) })\n }, DEBOUNCE_MS)\n return () => { cancelled = true; clearTimeout(timer) }\n }, [query, provider])\n\n const add = (area: AreaCandidate) => {\n const rules = rulesFor(area, outcome)\n if (rules.length === 0) return\n const added = addDeliveryDraftRules(rules)\n setJustAdded(areaKeyOf(area))\n setTimeout(() => setJustAdded(null), 1400)\n if (added > 0) setQuery('')\n }\n\n // Na caixa das exceções, oferecer um bairro de outra cidade é ruído: ela está\n // recortando o que já cobre.\n const visible = (results ?? []).filter((area) => {\n if (!onlyCityCodes || onlyCityCodes.length === 0) return true\n if (area.kind === 'city') return true\n return !area.cityCode || onlyCityCodes.includes(area.cityCode)\n })\n\n return (\n <>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"w-full rounded-lg border border-border bg-background py-2 pl-9 pr-9 text-sm\"\n />\n {loading && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-muted-foreground\" />\n )}\n </div>\n\n {results !== null && (\n <ul className=\"mt-2 max-h-72 divide-y divide-border overflow-y-auto rounded-lg border border-border\">\n {visible.length === 0 && (\n <li className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n {unavailable ? 'A busca de regiões ainda não está disponível neste banco.' : emptyHint}\n </li>\n )}\n {visible.map((area) => {\n const key = areaKeyOf(area)\n const already = area.kind !== 'group' && isInDeliveryDraft({\n matchKind: area.kind === 'city' ? 'city' : 'district',\n cityCode: area.cityCode ?? null,\n districtKey: area.districtKey ?? null,\n })\n return (\n <li key={key}>\n <button\n type=\"button\"\n onClick={() => add(area)}\n disabled={already}\n className=\"flex w-full items-center gap-3 px-3 py-2.5 text-left transition hover:bg-muted/50 disabled:opacity-50\"\n >\n {area.kind === 'city'\n ? <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n : <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{area.label}</span>\n <span className=\"block text-xs text-muted-foreground\">\n {areaMeta(area)}\n {/* Zero CEP visto não é defeito — é o primeiro dia da loja.\n Dizer isso evita que ela ache que o nome está errado. */}\n {area.kind === 'district' && !area.knownPostalCodes && ' · ainda sem CEP visto'}\n </span>\n </span>\n {justAdded === key\n ? <Check className=\"h-4 w-4 shrink-0 text-emerald-600\" />\n : already\n ? <span className=\"shrink-0 text-xs text-muted-foreground\">já escolhido</span>\n : <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n </button>\n </li>\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaPickerProps {\n provider?: ShopProviderResolver\n /** Abre o assistente com a tela de Entrega em foco. */\n onAskAssistant?: () => void\n}\n\nexport function DeliveryAreaPicker({ provider, onAskAssistant }: DeliveryAreaPickerProps) {\n const draft = useDeliveryDraft()\n\n const covered = draft.rules.filter((r) => r.outcome !== 'refuse')\n const coveredCities = covered.filter((r) => r.matchKind === 'city')\n const exceptions = draft.rules.filter((r) => r.outcome === 'refuse')\n const cityCodes = covered.map((r) => r.cityCode).filter(Boolean) as string[]\n\n return (\n <div className=\"rounded-card border bg-card px-5 py-4 shadow-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Onde você entrega?</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Digite uma cidade, um bairro ou uma região — \"Rio de Janeiro\", \"Ipanema\", \"Zona Sul\".\n Se você atende a cidade toda, uma linha só resolve: escolha a cidade.\n </p>\n </div>\n {onAskAssistant && (\n <button\n type=\"button\"\n onClick={onAskAssistant}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-xs font-medium hover:bg-muted\"\n >\n <Sparkles className=\"h-3.5 w-3.5 text-primary\" />\n Prefiro contar por escrito\n </button>\n )}\n </div>\n\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"deliver\"\n placeholder=\"Cidade, bairro ou região…\"\n emptyHint=\"Nada com esse nome. Tente a cidade, ou conte por escrito ao assistente.\"\n />\n </div>\n\n {/*\n A segunda pergunta só existe depois da primeira, porque é literalmente a\n ordem da frase dela: \"entregamos X, evitar Y\". Perguntada antes, ela é\n ruído; perguntada depois, é o passo que a pessoa já ia dar.\n */}\n {covered.length > 0 && (\n <div className=\"mt-5 border-t border-border pt-4\">\n <div className=\"flex items-center gap-2\">\n <Ban className=\"h-4 w-4 text-destructive\" />\n <h4 className=\"text-sm font-semibold\">E onde você não entrega?</h4>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {coveredCities.length > 0\n ? `Recortes dentro do que você já cobre — comunidade, bairro de risco, região distante. A exceção vence a área maior, então ${coveredCities[0].label} continua valendo em todo o resto.`\n : 'Regiões que você quer recusar mesmo estando perto do que já cobre. A exceção vence a área maior.'}\n </p>\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"refuse\"\n placeholder=\"Bairro ou região que você recusa…\"\n onlyCityCodes={cityCodes}\n emptyHint={\n <>\n Nada com esse nome. Comunidade normalmente não tem CEP próprio — divide o do\n bairro vizinho. Escolha o bairro que a contém e marque como “confirmo antes”\n na tabela.\n </>\n }\n />\n </div>\n </div>\n )}\n\n {draft.rules.length > 0 && (\n <p className=\"mt-3 text-xs text-muted-foreground\">\n {covered.length} {covered.length === 1 ? 'região' : 'regiões'} onde você entrega\n {exceptions.length > 0 && `, ${exceptions.length} ${exceptions.length === 1 ? 'exceção' : 'exceções'}`}\n {' '}— confira o preço na tabela abaixo e salve.\n </p>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { DeliveryOutcome } from '@fayz-ai/shop'\nimport { Check, Loader2, ListChecks, Trash2, X } from 'lucide-react'\nimport { errorMessage } from '../settings/error-message'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { zoneInputFrom } from './delivery-agent'\nimport {\n clearDeliveryDraft, removeDeliveryDraftRule, setAllDeliveryDraftRates,\n updateDeliveryDraftRule, useDeliveryDraft, type DeliveryDraftRule,\n} from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// A tabela que o agente monta e a lojista conserta.\n//\n// O cartão de confirmação do assistente mostra parâmetros; catorze regiões com\n// preço e prazo não cabem ali, e \"aprovar\" um JSON não é conferir. Então o\n// rascunho vira TELA: uma linha por regra, o desfecho num select, o preço num\n// campo, e o botão de salvar do lado de fora da conversa — ela pode corrigir\n// tudo e gravar sem dizer mais nada ao agente.\n//\n// Só aparece quando existe rascunho. Sem conversa, a tela de Entrega é a de\n// sempre.\n//\n// drift-allow: raw-table — o DataTable do @fayz-ai/ui apresenta linhas; aqui\n// cada célula é um input que edita o rascunho na hora, e é justamente a edição\n// no lugar que faz esta tabela existir.\n// ---------------------------------------------------------------------------\n\nconst OUTCOME_LABEL: Record<DeliveryOutcome, string> = {\n deliver: 'Entrego',\n review: 'Confirmo antes',\n refuse: 'Não entrego',\n}\n\nconst OUTCOME_TONE: Record<DeliveryOutcome, string> = {\n deliver: 'text-foreground',\n review: 'text-amber-600 dark:text-amber-500',\n refuse: 'text-destructive',\n}\n\n/** '12,50' e '12.50' são o mesmo número para quem está no balcão. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst money = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\nfunction ruleArea(rule: DeliveryDraftRule): string {\n if (rule.matchKind === 'postal_range') {\n const fmt = (c?: string | null) => (c ? `${c.slice(0, 5)}-${c.slice(5)}` : '?')\n return `${fmt(rule.postalFrom)} → ${fmt(rule.postalTo)}`\n }\n return rule.matchKind === 'city' ? 'Município' : 'Bairro'\n}\n\nexport interface DeliveryRulesDraftProps {\n provider?: ShopProviderResolver\n /** Recarrega a lista de zonas depois de gravar. */\n onSaved: () => void\n}\n\nexport function DeliveryRulesDraft({ provider, onSaved }: DeliveryRulesDraftProps) {\n const draft = useDeliveryDraft()\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [bulkRate, setBulkRate] = React.useState('')\n const [bulkFree, setBulkFree] = React.useState('')\n\n if (draft.rules.length === 0 && draft.gaps.length === 0) return null\n\n const refusing = draft.rules.filter((r) => r.outcome === 'refuse').length\n const reviewing = draft.rules.filter((r) => r.outcome === 'review').length\n const delivering = draft.rules.length - refusing - reviewing\n\n const save = async () => {\n setSaving(true)\n setError(null)\n try {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.createShippingZone !== 'function') {\n throw new Error('Este banco ainda não tem as regras de entrega.')\n }\n for (const rule of draft.rules) {\n await shop.createShippingZone(zoneInputFrom(rule))\n }\n clearDeliveryDraft()\n onSaved()\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"rounded-card border border-primary/40 bg-primary/5 shadow-sm\">\n <div className=\"flex flex-wrap items-center gap-3 border-b border-primary/20 px-5 py-4\">\n <ListChecks className=\"h-4 w-4 text-primary\" />\n <div className=\"flex-1\">\n {/* Neutro de propósito: a mesma tabela recebe o que ela escolheu na\n busca e o que o assistente leu da mensagem dela. */}\n <p className=\"text-sm font-medium\">Regras a salvar</p>\n <p className=\"text-xs text-muted-foreground\">\n {delivering} entrega{delivering === 1 ? '' : 's'}\n {reviewing > 0 && `, ${reviewing} a confirmar`}\n {refusing > 0 && `, ${refusing} recusa${refusing === 1 ? '' : 's'}`}\n {' '}— confira e corrija antes de salvar. Nada foi gravado ainda.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={clearDeliveryDraft}\n disabled={saving}\n className=\"rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-muted\"\n >\n Descartar\n </button>\n <button\n type=\"button\"\n onClick={save}\n disabled={saving || draft.rules.length === 0}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3.5 py-2 text-xs font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-50\"\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Check className=\"h-3.5 w-3.5\" />}\n Salvar {draft.rules.length} regra{draft.rules.length === 1 ? '' : 's'}\n </button>\n </div>\n\n {error && (\n <p className=\"px-5 pt-3 text-xs text-destructive\">{error}</p>\n )}\n\n {/* O mesmo frete em todas de uma vez. Quem escolheu catorze bairros cobra\n o mesmo nos catorze, e digitar catorze vezes é exatamente onde a\n configuração é abandonada. Linhas de recusa ficam de fora sozinhas. */}\n {delivering + reviewing > 1 && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-primary/10 px-5 py-3\">\n <span className=\"text-xs text-muted-foreground\">Mesmo preço em todas:</span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">R$</span>\n <input\n value={bulkRate}\n onChange={(e) => setBulkRate(e.target.value)}\n placeholder=\"15,00\"\n aria-label=\"Frete para todas as regiões\"\n className=\"w-20 rounded-md border border-border bg-background px-2 py-1 text-xs\"\n />\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">grátis acima de R$</span>\n <input\n value={bulkFree}\n onChange={(e) => setBulkFree(e.target.value)}\n placeholder=\"opcional\"\n aria-label=\"Frete grátis acima de, para todas as regiões\"\n className=\"w-24 rounded-md border border-border bg-background px-2 py-1 text-xs\"\n />\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setAllDeliveryDraftRates({\n rate: parseMoney(bulkRate),\n freeAbove: parseMoney(bulkFree),\n })\n setBulkRate('')\n setBulkFree('')\n }}\n disabled={!bulkRate.trim() && !bulkFree.trim()}\n className=\"rounded-md border border-border px-2.5 py-1 text-xs font-medium hover:bg-muted disabled:opacity-40\"\n >\n Aplicar\n </button>\n </div>\n )}\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-muted-foreground\">\n <th className=\"px-5 py-2.5 font-medium\">Região</th>\n <th className=\"px-2 py-2.5 font-medium\">O que faço</th>\n <th className=\"px-2 py-2.5 font-medium\">Frete</th>\n <th className=\"px-2 py-2.5 font-medium\">Grátis acima de</th>\n <th className=\"px-2 py-2.5 font-medium\">Prazo (dias)</th>\n <th className=\"px-2 py-2\" />\n </tr>\n </thead>\n <tbody>\n {draft.rules.map((rule) => (\n <tr key={rule.id} className=\"border-t border-primary/10\">\n <td className=\"px-5 py-2.5\">\n <span className=\"font-medium\">{rule.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground\">{ruleArea(rule)}</span>\n {rule.source && (\n <p className=\"text-xs italic text-muted-foreground\">“{rule.source}”</p>\n )}\n </td>\n <td className=\"px-2 py-2.5\">\n <select\n value={rule.outcome}\n onChange={(e) =>\n updateDeliveryDraftRule(rule.id, { outcome: e.target.value as DeliveryOutcome })}\n className={`rounded-md border border-border bg-background px-2 py-1.5 text-xs ${OUTCOME_TONE[rule.outcome]}`}\n >\n {(Object.keys(OUTCOME_LABEL) as DeliveryOutcome[]).map((value) => (\n <option key={value} value={value}>{OUTCOME_LABEL[value]}</option>\n ))}\n </select>\n </td>\n {/* Recusa não cobra: mostrar campo de preço numa linha que nunca\n o lê convida a lojista a preencher e a achar que cobrou. */}\n {rule.outcome === 'refuse' ? (\n <td className=\"px-2 py-2.5 text-xs text-muted-foreground\" colSpan={3}>não se cobra</td>\n ) : (\n <>\n <td className=\"px-2 py-2.5\">\n <span className=\"inline-flex items-center rounded-md border border-border bg-background focus-within:ring-1 focus-within:ring-ring\">\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <input\n value={money(rule.rate)}\n placeholder=\"0,00\"\n aria-label={`Frete para ${rule.label}`}\n onChange={(e) =>\n updateDeliveryDraftRule(rule.id, { rate: parseMoney(e.target.value) })}\n className=\"w-16 bg-transparent px-1.5 py-1.5 text-xs outline-none\"\n />\n </span>\n </td>\n <td className=\"px-2 py-2.5\">\n <span className=\"inline-flex items-center rounded-md border border-border bg-background focus-within:ring-1 focus-within:ring-ring\">\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <input\n value={money(rule.freeAbove)}\n placeholder=\"nunca\"\n aria-label={`Frete grátis acima de, em ${rule.label}`}\n onChange={(e) =>\n updateDeliveryDraftRule(rule.id, { freeAbove: parseMoney(e.target.value) })}\n className=\"w-20 bg-transparent px-1.5 py-1.5 text-xs outline-none\"\n />\n </span>\n </td>\n <td className=\"px-2 py-2.5\">\n <span className=\"inline-flex items-center rounded-md border border-border bg-background focus-within:ring-1 focus-within:ring-ring\">\n <input\n value={rule.etaMinDays ?? ''}\n placeholder=\"0\"\n inputMode=\"numeric\"\n aria-label={`Prazo mínimo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMinDays: e.target.value ? Number(e.target.value) : null,\n })}\n className=\"w-10 bg-transparent py-1.5 pl-2 text-center text-xs outline-none\"\n />\n <span className=\"text-xs text-muted-foreground\">a</span>\n <input\n value={rule.etaMaxDays ?? ''}\n placeholder=\"2\"\n inputMode=\"numeric\"\n aria-label={`Prazo máximo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMaxDays: e.target.value ? Number(e.target.value) : null,\n })}\n className=\"w-10 bg-transparent py-1.5 pr-2 text-center text-xs outline-none\"\n />\n </span>\n </td>\n </>\n )}\n <td className=\"px-5 py-2.5 text-right\">\n <button\n type=\"button\"\n onClick={() => removeDeliveryDraftRule(rule.id)}\n aria-label={`Remover ${rule.label}`}\n className=\"rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {draft.gaps.length > 0 && (\n <div className=\"border-t border-primary/20 px-5 py-3.5\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n O que ficou de fora — e por quê\n </p>\n <ul className=\"mt-1 space-y-1\">\n {draft.gaps.map((gap) => (\n <li key={gap.query} className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <X className=\"mt-0.5 h-3 w-3 shrink-0 text-destructive\" />\n <span><span className=\"font-medium text-foreground\">{gap.query}</span> — {gap.reason}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, TextRow, RegistryCrudView,\n useConnectors, ConnectorRow, ConnectorDetail,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingSettings as ShippingSettingsRow, ShippingZone, StockLocation } from '@fayz-ai/shop'\nimport { AlertTriangle, ArrowRight, Car, Loader2, MapPin, Truck, Warehouse } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\nimport { PackagesSettings } from './PackagesSettings'\nimport {\n buildShopRegistries, locationSummary, LOCATIONS_REGISTRY, SHIPPING_ZONES_REGISTRY,\n} from '../data/registries'\nimport { shippingRecordPath, shippingRegistryIdFromHash, shippingRegistryPath } from '../data/registry-routes'\nimport { HandlingSettings } from './HandlingSettings'\nimport { ChoiceCards } from './ChoiceCards'\nimport { useStoreSettings } from './useStoreSettings'\nimport { DeliveryAgentSurface } from '../views/DeliveryAgentSurface'\nimport { DeliveryAreaPicker } from '../views/DeliveryAreaPicker'\nimport { DeliveryRulesDraft } from '../views/DeliveryRulesDraft'\n\nexport interface ShippingSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/** Money in, as typed: '12,50' and '12.50' are the same number to a shopkeeper. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst formatMoney = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\ntype FreightSource = 'own' | 'gateway'\n\n/** Stored rather than inferred from \"no connection\": connecting a gateway must not\n * start quoting carriers for a store that dispatches by hand. */\nconst FREIGHT_SOURCE: ReadonlyArray<{\n value: FreightSource\n label: string\n description: string\n Icon: React.ComponentType<{ className?: string }>\n}> = [\n {\n value: 'own',\n label: 'Eu mesmo calculo e despacho',\n description:\n 'O frete sai do preço base e das suas faixas de CEP, e você despacha como quiser — carro próprio, motoboy, agência. Nenhum gateway é consultado, mesmo que exista um conectado.',\n Icon: Car,\n },\n {\n value: 'gateway',\n label: 'Perguntar a um gateway de frete',\n description:\n 'O preço e o prazo vêm da transportadora, calculados pelo CEP do comprador. Quando o gateway não responde a tempo, o checkout usa suas faixas — a compra nunca fica sem preço.',\n Icon: Truck,\n },\n]\n\n/**\n * Entrega — o preço base, as zonas e quem coleta.\n *\n * A ORDEM DE PRECEDÊNCIA é o assunto desta tela, e está escrita nela em vez de\n * só no SQL: uma ZONA que cobre o CEP ganha do preço base; o preço base é o que\n * a loja cobra para um endereço que nenhuma zona cobre. Sem isso dito, um\n * lojista que criou uma zona não entende por que o número que ele digitou aqui\n * não aparece no checkout.\n *\n * O preço base vive em public.shipping_settings desde a 0015 e, até agora, só\n * podia ser escrito por SQL à mão — a tabela existia, com RLS e leitura anônima,\n * e nenhuma tela. É este arquivo que fecha isso.\n *\n * ZONAS E EMBALAGENS SÃO CADASTROS, e desde a FAY-1407 são cadastros DAQUI. As\n * zonas moravam numa página de CRUD própria em /store/shipping, então clicar em\n * \"Zonas de entrega\" no meio de configurar a entrega jogava o lojista para fora\n * de Configurações e o trazia de volta pela seta do navegador. Agora as duas\n * abrem em `_properties/<id>` dentro desta mesma tela, pelo `RegistryCrudView`\n * genérico — o mesmo que desenha feriados e locais.\n */\n\nexport function ShippingSettings({ provider }: ShippingSettingsProps) {\n // A rota mais funda ganha: /settings/shop-shipping/_properties/zonas é a\n // mesma aba, mostrando o cadastro em vez do resumo. Sem isso a lista de zonas\n // apareceria inteira embaixo do preço base o tempo todo.\n const [registryId, setRegistryId] = React.useState(shippingRegistryIdFromHash)\n React.useEffect(() => {\n const handler = () => setRegistryId(shippingRegistryIdFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const registries = React.useMemo(\n () => buildShopRegistries(provider ?? getShopProvider),\n [provider],\n )\n // One read of plg_shop_settings for the whole screen: both sections below are\n // slices of the same tenant row.\n const storeSettings = useStoreSettings(provider)\n const supported = typeof shop.getShippingSettings === 'function' && typeof shop.updateShippingSettings === 'function'\n\n const [row, setRow] = React.useState<ShippingSettingsRow | null>(null)\n const [zones, setZones] = React.useState<ShippingZone[] | null>(null)\n const [locations, setLocations] = React.useState<StockLocation[] | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n // Drafts, because these are TEXT inputs over numbers: committing on every\n // keystroke would turn '1' into a R$ 1,00 flat rate on the way to '15'. They\n // commit on blur, which is also when the parse refusal can be shown without\n // fighting the person still typing.\n const [flatDraft, setFlatDraft] = React.useState('')\n const [freeDraft, setFreeDraft] = React.useState('')\n const [flatBad, setFlatBad] = React.useState(false)\n const [freeBad, setFreeBad] = React.useState(false)\n\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n // 'ready' means declared and installed, not connected.\n const carriersConnected = carriers.some((c) => c.state !== 'ready')\n\n // Bumped after the assistant (or the draft panel) writes rules, so the cards\n // below re-read instead of showing the count from before the save.\n const [zonesEpoch, setZonesEpoch] = React.useState(0)\n const reloadZones = React.useCallback(() => setZonesEpoch((n) => n + 1), [])\n\n React.useEffect(() => {\n let cancelled = false\n if (supported) {\n setLoading(true)\n void shop\n .getShippingSettings!()\n .then((settings) => {\n if (cancelled) return\n setRow(settings)\n setFlatDraft(formatMoney(settings?.flatRate ?? 0))\n setFreeDraft(formatMoney(settings?.freeAbove))\n })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n void shop.listShippingZones?.()\n .then((list) => { if (!cancelled) setZones(list) })\n .catch(() => { if (!cancelled) setZones([]) })\n void shop.listStockLocations?.()\n .then((list) => { if (!cancelled) setLocations(list) })\n .catch(() => { if (!cancelled) setLocations([]) })\n return () => { cancelled = true }\n }, [shop, supported, zonesEpoch])\n\n const save = React.useCallback(\n (patch: Partial<ShippingSettingsRow>) => {\n if (!supported) return\n setSaving(true)\n setError(null)\n void shop\n .updateShippingSettings!(patch)\n .then((saved) => setRow(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n },\n [shop, supported],\n )\n\n const commitFlat = () => {\n const parsed = parseMoney(flatDraft)\n // Empty means zero here — \"I charge nothing\" is a decision a store makes, and\n // it is also the column's default, so there is nothing ambiguous to refuse.\n const next = flatDraft.trim() === '' ? 0 : parsed\n if (next == null) { setFlatBad(true); return }\n setFlatBad(false)\n setFlatDraft(formatMoney(next))\n if (next !== (row?.flatRate ?? 0)) save({ flatRate: next })\n }\n\n const commitFree = () => {\n // Empty is NULL, not zero: \"no threshold\" and \"free from R$ 0\" are opposite\n // policies, and a zero here would make every order's delivery free.\n if (freeDraft.trim() === '') {\n setFreeBad(false)\n if (row?.freeAbove != null) save({ freeAbove: null })\n return\n }\n const parsed = parseMoney(freeDraft)\n if (parsed == null) { setFreeBad(true); return }\n setFreeBad(false)\n setFreeDraft(formatMoney(parsed))\n if (parsed !== row?.freeAbove) save({ freeAbove: parsed })\n }\n\n // An exclusion is active and is NOT a delivery zone.\n // `outcome` is 0081's word; `excluded` is 0048's and stays as the fallback for\n // a pool that has not reached 0081 yet.\n const outcomeOf = (z: ShippingZone) => z.outcome ?? (z.excluded ? 'refuse' : 'deliver')\n const activeZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'deliver')\n const reviewZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'review')\n const excludedZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'refuse')\n // undefined = undecided, which asks the gateway if one is connected.\n const usesGateway = storeSettings.value.carrierQuotes !== false\n\n // Only active locations that dispatch: an archived warehouse and one that just\n // holds stock are both irrelevant to what the shopper is quoted.\n const dispatching = (locations ?? []).filter((l) => l.status === 'active' && l.shipsOnline !== false)\n const originCep = dispatching.find((l) => l.postalCode)?.postalCode ?? null\n\n // Looked up, never compared to a literal: a `registryId === 'zonas'` here kept\n // rendering Embalagens after the rename, with nothing visibly broken.\n const activeRegistry = registryId\n ? registries.find((candidate) => candidate.id === registryId) ?? null\n : null\n if (activeRegistry) {\n // No back button of its own: the shell draws the whole trail.\n return (\n <RegistryCrudView\n registry={activeRegistry}\n basePath={shippingRegistryPath(activeRegistry.id)}\n />\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O valor abaixo é o padrão, não o da sua loja. Recarregue antes de alterá-lo — salvar\n agora sobrescreveria um preço que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {!supported ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getShippingSettings</code>.\n </p>\n </div>\n ) : (\n <SettingsGroup\n title=\"Preço base\"\n description=\"O que a loja cobra quando nenhuma zona cobre o endereço. Uma zona que cobre o CEP sempre ganha deste número.\"\n >\n <TextRow\n label=\"Frete padrão\"\n description=\"Em reais. Deixe 0 para entrega grátis.\"\n value={flatDraft}\n onChange={setFlatDraft}\n onBlurCommit={commitFlat}\n placeholder=\"0,00\"\n invalid={flatBad}\n hint={flatBad ? 'Informe um valor em reais (ex.: 19,90).' : undefined}\n disabled={loading}\n />\n <TextRow\n label=\"Frete grátis acima de\"\n description=\"Subtotal, já com desconto, a partir do qual a entrega sai de graça. Vazio = sem regra de frete grátis.\"\n value={freeDraft}\n onChange={setFreeDraft}\n onBlurCommit={commitFree}\n placeholder=\"Sem regra\"\n invalid={freeBad}\n hint={freeBad ? 'Informe um valor em reais, ou deixe vazio.' : undefined}\n disabled={loading}\n />\n </SettingsGroup>\n )}\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">De onde você despacha</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Os locais que guardam estoque e despacham pedidos. O CEP do local padrão é a origem que a\n transportadora usa para cotar o frete — é aqui que ele se cadastra, uma vez. Cada local\n pode ter o seu próprio despachante ou seguir a decisão da loja.\n </p>\n </div>\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n // Named ONE place? Open it. The list is only the answer when there\n // is nothing specific to point at.\n onClick={() => {\n window.location.hash = dispatching.length === 1 && dispatching[0]\n ? shippingRecordPath(LOCATIONS_REGISTRY, dispatching[0].id)\n : shippingRegistryPath(LOCATIONS_REGISTRY)\n }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Warehouse className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {locations == null\n ? 'Carregando locais…'\n : dispatching.length === 0\n ? 'Nenhum local despacha pedidos'\n : dispatching.length === 1\n ? dispatching[0]!.name\n : `${dispatching.length} locais despachando`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {locations == null\n ? ' '\n : dispatching.length === 0\n ? 'Cadastre o local de onde os pedidos saem.'\n : dispatching.slice(0, 2).map((l) => locationSummary(l)).join(' — ')}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n {/* The one failure this screen can predict: a gateway that is asked to\n quote from nowhere answers nothing, and the shopper sees the zone\n price forever without knowing why. */}\n {usesGateway && locations != null && dispatching.length > 0 && !originCep && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Nenhum local tem CEP de origem. Sem ele a transportadora não cota, e o checkout cai nas\n suas zonas — preencha o CEP do local padrão.\n </span>\n </div>\n )}\n </div>\n\n {/* space-y porque esta seção tem QUATRO cards empilhados agora (busca,\n rascunho, o que está salvo) — quando era um só, o div nu bastava e os\n cards nasceram grudados no dia em que os outros entraram. */}\n <div className=\"space-y-3\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Onde você entrega</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n As regiões onde a loja entrega, com preço, prazo e frete grátis próprios. Um endereço\n fora de todas elas cai no preço base acima; se a loja não tiver preço base nem região que\n o cubra, o checkout diz que não entrega ali. Uma região também pode ser uma recusa —\n «não entrego aqui» — e ela vence qualquer outra e qualquer gateway.\n </p>\n </div>\n <DeliveryAgentSurface\n provider={() => shop}\n zones={zones ?? []}\n onSaved={reloadZones}\n />\n <DeliveryAreaPicker provider={provider} />\n <DeliveryRulesDraft provider={provider} onSaved={reloadZones} />\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <button\n type=\"button\"\n onClick={() => { window.location.hash = shippingRegistryPath(SHIPPING_ZONES_REGISTRY) }}\n className=\"flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {zones == null\n ? 'Carregando regiões…'\n : activeZones.length === 0\n ? 'Nenhuma região salva ainda'\n : `${activeZones.length} ${activeZones.length === 1 ? 'região onde entrego' : 'regiões onde entrego'}`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {activeZones.length === 0\n ? 'Sem região salva, toda entrega usa o preço base. Escolha as suas na busca acima.'\n : activeZones.slice(0, 3).map((z) => z.name).join(' · ')}\n {activeZones.length > 3 && ` e ${activeZones.length - 3} mais`}\n {reviewZones.length > 0 && (\n <span className=\"mt-0.5 block text-amber-700 dark:text-amber-500\">\n {reviewZones.length === 1\n ? '1 região a confirmar antes de sair'\n : `${reviewZones.length} regiões a confirmar antes de sair`}\n {' — '}\n {reviewZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n {excludedZones.length > 0 && (\n <span className=\"mt-0.5 block text-red-700 dark:text-red-400\">\n {excludedZones.length === 1\n ? '1 região recusada'\n : `${excludedZones.length} regiões recusadas`}\n {' — '}\n {excludedZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </button>\n </div>\n </div>\n\n <PackagesSettings />\n\n {storeSettings.supported && (\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Quem calcula o frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O Melhor Envio não é uma transportadora: é um gateway, uma conexão só que traz\n Correios, Jadlog, Loggi e outras. Então a escolha aqui não é qual transportadora — é\n se a loja calcula pelas próprias faixas ou se pergunta o preço a um gateway.\n </p>\n </div>\n <ChoiceCards\n label=\"Quem calcula o frete\"\n choices={FREIGHT_SOURCE}\n value={usesGateway ? 'gateway' : 'own'}\n onChange={(choice) => storeSettings.set({ carrierQuotes: choice === 'gateway' })}\n disabled={storeSettings.loading}\n />\n {/* Keeps the screen honest: with a gateway still connected the choice is\n recorded intent, not a guarantee. */}\n {!usesGateway && carriersConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Há um gateway ainda conectado abaixo. Para garantir que nenhum preço de\n transportadora apareça no checkout, desconecte-o — a escolha acima vale para a\n vitrine, a conexão continua existindo.\n </span>\n </div>\n )}\n </div>\n )}\n\n {carriers.length > 0 && (\n <div className={usesGateway ? undefined : 'opacity-60'}>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Gateway de frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Conectado, ele cota o frete para o CEP do comprador em vez de a loja adivinhar. O preço\n cotado é gravado no servidor e é ele que o pedido cobra — o navegador escolhe entre\n opções, nunca informa um valor. Quais transportadoras aparecem vem da conta do\n gateway, não desta lista.\n </p>\n {!carriersConnected && (\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Nenhum conectado — a loja entrega por conta própria, pelo preço base e pelas zonas\n acima. Conectar é opcional e pode ficar para depois.\n </p>\n )}\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n <ul className=\"divide-y\">\n {carriers.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n </div>\n </div>\n )}\n\n <HandlingSettings settings={storeSettings} provider={provider} />\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n 'As alterações são salvas ao sair do campo.'\n )}\n </div>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup } from '@fayz-ai/admin'\nimport { Info } from 'lucide-react'\nimport type { StoreSettings } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { ChoiceCards } from './ChoiceCards'\n\nexport interface FulfillmentSettingsProps {\n provider?: ShopProviderResolver\n}\n\ntype Policy = NonNullable<StoreSettings['autoFulfill']>\n\n/**\n * Three mutually exclusive policies with a paragraph each — a radio, not a\n * dropdown. The difference between them is a sentence long, and a dropdown shows\n * one option at a time: choosing between \"quando o pagamento cair\" and \"sempre\"\n * requires reading both, which means both have to be on screen.\n */\nconst POLICIES: ReadonlyArray<{ value: Policy; label: string; description: string }> = [\n {\n value: 'on_payment',\n label: 'Dar baixa quando o pagamento for confirmado',\n description:\n 'A remessa é criada assim que o pedido é pago — pelo gateway ou por você aqui no admin. É a opção segura: nada sai antes de o dinheiro entrar.',\n },\n {\n value: 'always',\n label: 'Dar baixa em todo pedido, automaticamente',\n description:\n 'A remessa nasce junto com o pedido, pago ou não. Para quem cobra na entrega ou separa antes de receber.',\n },\n {\n value: 'never',\n label: 'Não dar baixa automática',\n description: 'Cada remessa é criada à mão, na tela do pedido. É o padrão.',\n },\n]\n\n/**\n * Fulfillment — se a remessa nasce sozinha.\n *\n * Uma decisão só, e ela é sobre QUANDO um registro de remessa passa a existir —\n * não sobre quem entrega. `public.fulfillments` e `fulfillment_items` já existem\n * desde a 0018, com o `fulfillment_status` do pedido DERIVADO deles por trigger;\n * a política escolhida aqui é lida por um trigger da 0045 que insere a remessa\n * com os itens do pedido, exatamente como a tela do pedido faria à mão. Nada\n * aqui escreve `fulfillment_status`: ele continua derivado, que é o que o impede\n * de divergir da realidade.\n *\n * Pedidos que já existem não são afetados. A política vale para o que vem\n * depois, e isso é dito na tela: um lojista que liga a baixa automática\n * esperando ver os pedidos de ontem despacharem tem uma surpresa pior do que a\n * frase.\n */\nexport function FulfillmentSettings({ provider }: FulfillmentSettingsProps) {\n const settings = useStoreSettings(provider, { autoFulfill: 'never' })\n const { value, set } = settings\n const current: Policy = value.autoFulfill ?? 'never'\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Baixa automática\"\n description=\"Quando um registro de remessa é criado para um pedido novo.\"\n >\n <ChoiceCards\n label=\"Baixa automática\"\n choices={POLICIES}\n value={current}\n onChange={(autoFulfill) => set({ autoFulfill })}\n />\n </SettingsGroup>\n\n <div className=\"flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n A remessa criada aqui nasce <strong className=\"font-medium\">pendente</strong>, com os itens\n do pedido e sem transportadora nem código de rastreio — quem despacha preenche isso na tela\n do pedido. Pedidos que já foram feitos não são afetados.\n </span>\n </div>\n </SettingsState>\n )\n}\n","// Melhor Envio as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The first REQUEST-plane connector: the buyer is on the page waiting for a\n// price, so it declares a latency budget and what to do when the budget is\n// spent. `onFailure: 'degrade'` is the whole point — FAY-1301 says quoting\n// freight never blocks the purchase, and the answer it degrades to is the\n// store's own shipping zones, which is what the store quoted before Melhor\n// Envio existed.\n//\n// It brings no SQL. The connection is a connections row (packages/db 029);\n// the label it buys later is an effect, and effects are ordinary sync_runs\n// rows claimed through plg_claim_effect (030). Quotes are neither.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MELHOR_ENVIO_CONNECTOR_ID = 'melhor-envio'\n\n/**\n * Two and a half seconds, and the number moved because it was MEASURED.\n *\n * It said one second, \"chosen against the funnel, not against the carrier\",\n * with the claim that \"Melhor Envio answers well inside it on a good day\". The\n * first real quote refuted that: the carrier alone takes ~610ms from São Paulo\n * to Rio in the sandbox, before the credential redemption (43ms) and the two\n * database round trips the quote needs. Total ~850ms server-side on a GOOD run,\n * which the browser's own hop pushed past 1000ms — so the budget aborted every\n * real quote and the shopper saw the zone price, forever. A budget that only\n * ever fires is not a safety net, it is the feature being off.\n *\n * The funnel reasoning was still right, which is why this is 2.5s and not 10:\n * past a few seconds \"calculando\" reads as broken, and the zones answer\n * instantly. What changed is the evidence about where the line actually is.\n */\nexport const MELHOR_ENVIO_LATENCY_BUDGET_MS = 2500\n\n/**\n * Where the parcels leave from. The canonical REQUIRED-TO-OPERATE setting:\n * Melhor Envio cannot quote a single price without it, and it is still not what\n * authorizes the connection — that is the OAuth grant, which is asked for on\n * Melhor Envio's own screen and never in this form.\n *\n * It used to be a `ConnectorField`, which meant a merchant had to know which\n * warehouse they ship from before they were allowed to plug the carrier in. Now\n * the connection is made and the store reads \"conectado, falta configurar\"\n * (`connections.status = 'pending'`) until a postcode is chosen — which is\n * true, and is the difference between an integration that is not ready and one\n * that is broken.\n *\n * The `pattern` is what a free-text box never had: eight digits, checked here\n * rather than discovered by the first buyer who gets no price.\n */\n// A agência de postagem NÃO mora aqui: ela é do local de despacho (Entrega ▸\n// Locais), porque uma loja com dois galpões entrega em duas agências e o\n// conector guarda uma conta, não um endereço. O seletor está no cadastro do\n// local, listando o que existe perto DELE.\nexport const MELHOR_ENVIO_SETTINGS: ConnectorSetting[] = [\n {\n key: 'originPostalCode',\n label: 'CEP de origem',\n description: 'De onde os pedidos saem. É o que a transportadora usa para calcular preço e prazo.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '^\\\\d{5}-?\\\\d{3}$',\n patternHint: 'Use 8 dígitos, como 01310-100.',\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(MELHOR_ENVIO_CONNECTOR_ID, {\n settings: MELHOR_ENVIO_SETTINGS,\n settingsKeys: ['services', 'extraDays'],\n})\n\nfunction MelhorEnvioExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n A cotação acontece enquanto o cliente espera, com um limite de 1 segundo. Se a transportadora\n não responder a tempo, o checkout mostra o preço das suas faixas de CEP e a compra continua\n normalmente — o cliente nunca fica sem preço na tela.\n </p>\n <p>\n Não existe histórico de cotações aqui de propósito: cotar não movimenta nada. O que aparece no\n histórico é a compra da etiqueta, feita uma única vez por pedido.\n </p>\n </div>\n )\n}\n\nexport const melhorEnvioConnectorDef: ConnectorDefinition = {\n id: MELHOR_ENVIO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Melhor Envio',\n description:\n 'Frete real no checkout: Correios e Jadlog numa integração só, com prazo e preço calculados pelo CEP do cliente.',\n icon: 'Truck',\n category: 'logistics',\n authKind: 'oauth',\n // Two planes, and they are different jobs: the quote is in the buyer's request\n // path, the label purchase and its tracking are an ordinary outbound sync.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.melhorenvio.com.br',\n // A quote WRITES NOTHING — `createShippingQuoter` says so in as many words,\n // and 029_connections.sql is why: one row per quote would make sync_runs\n // the largest table in the pool within weeks. So `order` is read-only here,\n // and the only write is the label, which is an effect with an idempotency key\n // (`createLabelBuyer`) because a label bought twice is money spent twice.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o CEP de destino e o que está no carrinho para pedir o preço e o prazo à transportadora. A cotação não é guardada.',\n },\n {\n kind: 'data',\n resource: 'shipment',\n actions: ['write'],\n reason: 'Registrar a etiqueta comprada e o código de rastreio no pedido.',\n },\n ],\n latencyBudgetMs: MELHOR_ENVIO_LATENCY_BUDGET_MS,\n // The sale is never blocked by a carrier's API (FAY-1301).\n onFailure: 'degrade',\n /**\n * There is no form. Melhor Envio is OAuth, and the store authorizes on Melhor\n * Envio's own screen exactly as it does with Google Calendar.\n *\n * It got here in two wrong steps. First `fields: []` on the theory that a\n * platform-level token existed — none does, so Conectar wrote `active = true`\n * against an account nobody had linked. Then a pasted `token` password field,\n * as a stopgap to stop that lie. OAuth replaces both: the store's own account\n * is linked, per-merchant by nature (the labels are bought with THIS store's\n * balance), and no credential ever passes through this file.\n *\n * The origin postcode stays where it is — a `ConnectorSetting`, on the\n * Configurações tab. It is what the connection needs to WORK, not what\n * authorizes it, and it must never come back to the connect step.\n */\n // `melhorenvio` without the hyphen, and that is not a typo: the provider key\n // is the path Melhor Envio has registered on our app (`/redirect/melhorenvio`),\n // and changing it would mean editing the registration at their end. The\n // connector's own id keeps the hyphen.\n startOAuth: fayzConnectorOAuth(MELHOR_ENVIO_CONNECTOR_ID, { provider: 'melhorenvio' }),\n settings: MELHOR_ENVIO_SETTINGS,\n // The answer to \"o Melhor Envio é acionado em quais momentos?\". Both calls are\n // real, so both are stated plainly.\n invokedAt: [\n {\n key: 'shop.checkout.shipping_quote',\n label: 'O cliente informa o CEP e pede as opções de frete',\n touches: ['order'],\n },\n {\n key: 'shop.order.label_purchase',\n label: 'O pedido é confirmado e a etiqueta é comprada, uma única vez',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['order', 'shipment'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n MELHOR_ENVIO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: (connection?.settings?.originPostalCode as string) ?? undefined,\n plane: 'request',\n ...settingsStatus(MELHOR_ENVIO_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // This used to say the platform's redirect route writes `active = true`. It\n // does not, and says so itself: \"It does not touch `connections` in the\n // tenant's pool. Per FAY-1388 ... the app writes its own.\" Bling shipped with\n // the same belief and looped — authorize, come back, still \"not connected\",\n // click again, forever.\n //\n // So the two halves are written by their owners: the platform files the\n // credential, and this runs on the way back to say the account is linked. No\n // values — the token is not ours to see, and nothing is configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MelhorEnvioExtraPanel,\n}\n","// AppMax as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The mirror image of Melhor Envio, and the reason `onFailure` is a field\n// instead of a habit: same plane, same budget mechanism, opposite verdict. A\n// carrier that does not answer must not stop a sale; a gateway that does not\n// answer must stop it, because an order that reads as confirmed without a\n// payment is worse than a refused checkout.\n//\n// It lives in plugin-shop rather than plugin-payments because plugin-payments\n// is provider-only — it ships no manifest and no admin surface — and because\n// the store's stack (who charges, who ships) is configured in the store's own\n// settings. commerce-stack.md §0: the admin is the control panel of the stack.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030). Opening a session is\n// neither — it is a quote by another name and files nothing.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const APPMAX_CONNECTOR_ID = 'appmax'\n\n/**\n * Six seconds. Longer than the freight budget on purpose: this one is spent\n * after the buyer pressed \"pagar\", where waiting is expected and a premature\n * refusal costs a sale that was about to happen. It is still a budget — beyond\n * it the buyer is told the payment did not go through, which is true, instead of\n * watching a spinner that resolves into a charge they already gave up on.\n */\nexport const APPMAX_LATENCY_BUDGET_MS = 6000\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential\n * and not an authorization.\n *\n * It used to be a `ConnectorField` labelled \"Formas de pagamento (pix, boleto,\n * credit_card)\": a free-text box on the connect screen, which asked a merchant\n * to decide what they accept before they were allowed to plug the gateway in,\n * and then made \"passei a aceitar boleto\" look like re-authorizing the account.\n * It is a multi-select over the three methods AppMax actually has, so the\n * misspelling that silently offered nothing is not expressible.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a session, so the connection is made and reported as \"conectado,\n * falta configurar\" (`connections.status = 'pending'`).\n */\nexport const APPMAX_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n { value: 'credit_card', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(APPMAX_CONNECTOR_ID, {\n settings: APPMAX_SETTINGS,\n settingsKeys: ['maxInstallments', 'environment'],\n})\n\nconst METHOD_LABELS: Record<string, string> = { pix: 'Pix', boleto: 'Boleto', credit_card: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may still hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AppmaxExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou o código de barras sem sair\n da página. Cartão vai para a página segura da AppMax e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const appmaxConnectorDef: ConnectorDefinition = {\n id: APPMAX_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AppMax',\n description: 'Checkout de verdade: Pix, boleto e cartão parcelado, com o valor recalculado no servidor.',\n icon: 'CreditCard',\n category: 'payments',\n authKind: 'oauth',\n // The session is opened in the buyer's request path; the capture, the refund\n // and the webhook that reports them are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.appmax.com.br',\n // Grounded in the request plane's own code, not in an AppMax data plane —\n // there isn't one in this repo yet (see the header). `createCheckoutStarter`\n // recomputes the order total server-side before opening a session, which is a\n // read of the order and never a write of it; `createPaymentCapturer` files the\n // capture through the effect ledger, which is the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: APPMAX_LATENCY_BUDGET_MS,\n // The order does not confirm. FAY-1300.\n onFailure: 'block',\n /**\n * O lojista NÃO digita chave nenhuma — e essa é a correção.\n *\n * A tela pedia `client_id` e `client_secret` da AppMax, o que estava errado em\n * dois níveis. Primeiro porque é o par do APLICATIVO (nosso, um só para toda a\n * frota) que abre a instalação, e ele não pode passar pelo navegador de\n * lojista nenhum. Segundo porque o par da LOJA nem é mostrado ao lojista para\n * copiar: a AppMax o emite no fim da instalação e o entrega ao aplicativo.\n *\n * Foi exatamente por isso que o campo apareceu preenchido com um e-mail: não\n * havia o que colar ali, então colaram o que tinham.\n *\n * O caminho certo é o consentimento abaixo: o lojista autoriza a conta dele no\n * painel da AppMax e o par sai de lá para o cofre da plataforma sem nunca\n * passar por este pacote.\n */\n fields: [],\n /**\n * Um botão só: \"Conectar\" É o que abre o consentimento.\n *\n * Antes eram dois — um \"Abrir o painel da AppMax\" e um \"Conectar\" que apenas\n * marcava a linha. O segundo mentia: dizia conectado sem credencial atrás.\n *\n * E é consentimento de verdade, apesar do nome estranho na doc deles. O\n * círculo fecha: chamamos `/app/authorize` com o par do APLICATIVO e recebemos\n * um token; o lojista autoriza no painel da AppMax; a AppMax **devolve o\n * navegador dele** para o nosso callback com esse token na URL; e é o nosso\n * servidor que troca o token pelo par da LOJA em `/app/client/generate`.\n *\n * Ida, volta e troca no servidor — a mesma forma do Bling e do Melhor Envio.\n * Por isso passa pelo mesmo `fayzConnectorOAuth` e não por um link solto: o\n * par do aplicativo não pode sair do servidor, e o token que volta não vale\n * nada no navegador.\n */\n startOAuth: fayzConnectorOAuth(APPMAX_CONNECTOR_ID),\n settings: APPMAX_SETTINGS,\n // When the gateway is actually reached. Both are real calls, so both may be\n // stated plainly — see ConnectorPermissions for the events that may not.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AppMax (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AppMax avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n APPMAX_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(APPMAX_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the token — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The token itself never arrives\n // here: the hub splits it out before calling this.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AppmaxExtraPanel,\n}\n","// The back office's side of the AbacatePay catalogue.\n//\n// Same shape as ../bling/data.ts and for the same reason: the edge function\n// cannot derive the two things it needs. The Supabase session proves who is\n// asking, and the runtime token is what the function FORWARDS to redeem this\n// tenant's key — a function cannot mint one.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n/** The edge function that holds every catalogue call this connector makes. */\nexport const ABACATEPAY_FUNCTION = 'abacatepay-sync'\n\nexport interface AbacatePaySyncResult {\n ok: boolean\n /** Products created in the provider's catalogue on this run. */\n pushed: number\n /** Already there and still at the same price. */\n unchanged: number\n /** Refused before sending: no name, or a price of zero. */\n skipped: Array<{ productId: string; reason: string }>\n /** The provider said no. One bad product does not end a run. */\n failed: Array<{ productId: string; error: string }>\n /** Created, but AbacatePay refused the photo, so it went without one. */\n withoutImage: string[]\n /** Linked, but the store's price has moved since. Reported, never repaired. */\n drifted?: Array<{ productId: string; externalId: string }>\n /** The per-run cap stopped it short — press again. */\n hasMore: boolean\n total: number\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com a AbacatePay.')\n return supabase\n}\n\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com a AbacatePay.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(ABACATEPAY_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (!error) return data as T\n\n // supabase-js hides the function's own body inside the error context. Without\n // digging it out, every refusal reads as \"Edge Function returned a non-2xx\n // status code\" — which is what a missing table, a missing credential and a\n // rejected CORS preflight all looked like, while the function was answering\n // each of them with a sentence written for the merchant.\n const status = Number((error as { context?: { status?: number } })?.context?.status ?? 0)\n let message = ''\n try {\n const payload = (await (error as { context?: { json?: () => Promise<unknown> } })\n ?.context?.json?.()) as { message?: string; error?: string } | undefined\n message = String(payload?.message ?? payload?.error ?? '').trim()\n } catch {\n /* no JSON body — fall through to the generic message below */\n }\n if (!message && status === 404) {\n message = 'Esta loja não tem uma conta AbacatePay conectada.'\n }\n throw new Error(message || error.message)\n}\n\n/** Read-only probe: is the key good? Listing an empty catalogue is a success. */\nexport function testAbacatePay(): Promise<{ ok: boolean; remoteProducts?: number; error?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Send the products that have no link yet. Additive — nothing is ever deleted. */\nexport function pushCatalogue(): Promise<AbacatePaySyncResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Push, then report which linked products have drifted from the sent price. */\nexport function reconcileCatalogue(): Promise<AbacatePaySyncResult> {\n return invoke({ action: 'reconcile' })\n}\n","// AbacatePay as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The second gateway, and the one that shows the shelf is not a special case:\n// it declares the same category, the same planes and the same `onFailure` as\n// AppMax, and differs only where the provider differs — how it authorizes.\n//\n// There is no consent screen and no app to install. AbacatePay issues API keys\n// in the merchant's own dashboard (Integrar → API Keys) and every call is\n// `Authorization: Bearer <key>`, so the connect step is a form with one box and\n// the key leaves for the platform vault instead of reaching this file.\n//\n// The same host serves dev and production — the KEY decides which. That is a\n// merchant-facing fact, not a base-URL switch, so it is said on the panel\n// rather than expressed as an `environment` setting nothing would honour.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n pushCatalogue,\n reconcileCatalogue,\n type AbacatePaySyncResult,\n} from './data'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n describeError,\n} from '@fayz-ai/core'\n\nexport const ABACATEPAY_CONNECTOR_ID = 'abacatepay'\n\n/**\n * Six seconds, the same budget AppMax carries and for the same reason: it is\n * spent after the buyer pressed \"pagar\", where waiting is expected and a\n * premature refusal costs a sale that was about to happen.\n *\n * Measured, not guessed — `POST /v2/transparents/create` answered in 640–830ms\n * from São Paulo on the dev key, before credential redemption and the two\n * database round trips the checkout needs. The budget sits far above that so it\n * fires on a gateway that is actually down, never on a slow-but-alive one.\n */\nexport const ABACATEPAY_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type. Either flag alone is enough — both\n * are here because a payment credential is the wrong place to be terse.\n *\n * The key is per-STORE and carries its own permissions and its own environment,\n * so nothing about it can be inferred, defaulted or shared across the fleet.\n */\nexport const ABACATEPAY_FIELDS: ConnectorField[] = [\n {\n key: 'apiKey',\n label: 'Chave de API',\n type: 'password',\n secret: true,\n placeholder: 'AbacatePay → Integrar → API Keys',\n },\n]\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The three the gateway really has, in AbacatePay's own vocabulary (uppercase),\n * because these values travel to it as `method` / `methods`: a translation\n * table between what the merchant picked and what the wire accepts is one more\n * place for a method to silently stop being offered.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a charge, so the connection is made and reported as \"conectado,\n * falta configurar\" (`connections.status = 'pending'`).\n */\nexport const ABACATEPAY_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'PIX', label: 'Pix' },\n { value: 'BOLETO', label: 'Boleto' },\n // Credit card does NOT belong here. AbacatePay discontinued it for new\n // clients and new integrations, so offering the checkbox would let a\n // merchant switch on a method the acquirer refuses — and the first to find\n // out would be a buyer. `CARD` stays in METHOD_LABELS because an older\n // connection may have the option stored and its row still has to describe\n // itself.\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(ABACATEPAY_CONNECTOR_ID, {\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { PIX: 'Pix', BOLETO: 'Boleto', CARD: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\n/**\n * Push the store's catalogue to AbacatePay.\n *\n * It exists because the hosted page bills for PRODUCTS out of the provider's own\n * catalogue, while the transparent checkout (Pix, boleto) has no items field at\n * all. Without this sync, a hosted checkout is refused with\n * `catalogue_not_synced`.\n *\n * It is ADDITIVE, and not by choice: the API offers create, get, list and delete\n * for products, and NO update. A price changed here cannot be pushed, and\n * deleting the product to recreate it breaks any live charge attached to it. So\n * a drifted price is REPORTED instead, with the figure the provider still holds,\n * and recreating it stays the merchant's decision.\n */\nfunction CatalogueSync() {\n const [busy, setBusy] = useState<'push' | 'reconcile' | null>(null)\n const [result, setResult] = useState<AbacatePaySyncResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const run = async (kind: 'push' | 'reconcile') => {\n setBusy(kind)\n setError(null)\n try {\n setResult(await (kind === 'push' ? pushCatalogue() : reconcileCatalogue()))\n } catch (caught) {\n setError(describeError(caught, 'Não conseguimos sincronizar agora.'))\n } finally {\n setBusy(null)\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">Catálogo</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n O link de pagamento é aberto na página da AbacatePay, e ela cobra por produtos que\n precisam existir lá. Envie os seus antes de mandar um link para um cliente.\n </p>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => { void run('push') }}\n disabled={busy !== null}\n className=\"inline-flex min-h-9 items-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-60\"\n >\n {busy === 'push' ? 'Enviando…' : 'Enviar produtos'}\n </button>\n <button\n type=\"button\"\n onClick={() => { void run('reconcile') }}\n disabled={busy !== null}\n className=\"inline-flex min-h-9 items-center rounded-md border px-3 text-xs font-medium transition hover:bg-muted/50 disabled:opacity-60\"\n >\n {busy === 'reconcile' ? 'Conferindo…' : 'Conferir preços'}\n </button>\n </div>\n\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n\n {result && (\n <div className=\"space-y-1.5 rounded-md border bg-muted/30 p-3 text-xs\">\n <p className=\"text-foreground\">\n {result.pushed > 0\n ? `${result.pushed} produto${result.pushed > 1 ? 's' : ''} enviado${result.pushed > 1 ? 's' : ''}.`\n : 'Nenhum produto novo para enviar.'}{' '}\n <span className=\"text-muted-foreground\">\n {result.unchanged} já {result.unchanged === 1 ? 'estava' : 'estavam'} lá, de {result.total}.\n </span>\n </p>\n\n {/* The per-round cap is not an error; it is what stops the function\n dying halfway and leaving the merchant unsure how much landed. */}\n {result.hasMore && (\n <p className=\"text-muted-foreground\">\n Ainda há produtos na fila — clique novamente para continuar.\n </p>\n )}\n\n {result.withoutImage?.length > 0 && (\n <p className=\"text-muted-foreground\">\n {result.withoutImage.length} produto{result.withoutImage.length > 1 ? 's foram enviados' : ' foi enviado'} sem\n foto — a AbacatePay recusou a imagem. O produto vende normalmente; só aparece sem imagem na página dela.\n </p>\n )}\n\n {result.skipped?.length > 0 && (\n <p className=\"text-muted-foreground\">\n {result.skipped.length} ignorado{result.skipped.length > 1 ? 's' : ''} por estar sem nome ou\n com preço zerado.\n </p>\n )}\n\n {result.failed?.length > 0 && (\n <div className=\"text-destructive\">\n <p>{result.failed.length} recusado{result.failed.length > 1 ? 's' : ''} pela AbacatePay:</p>\n <ul className=\"mt-0.5 list-disc pl-4\">\n {result.failed.slice(0, 3).map((f) => <li key={f.productId}>{f.error}</li>)}\n </ul>\n </div>\n )}\n\n {result.drifted && result.drifted.length > 0 && (\n <p className=\"text-amber-600 dark:text-amber-500\">\n {result.drifted.length} produto{result.drifted.length > 1 ? 's mudaram' : ' mudou'} de preço\n aqui depois de enviado. A AbacatePay não permite alterar um produto já criado, então o\n link ainda cobra o preço antigo — refaça o produto lá se o novo valor precisa valer.\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction AbacatePayExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <CatalogueSync />\n <div className=\"space-y-2 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem sair\n da página. Cartão de crédito a AbacatePay encerrou para contas novas — para vender no\n cartão, conecte outro provedor em Pagamentos.\n </p>\n <p>\n Quem decide se a cobrança é de verdade é a chave. Uma chave de teste simula o pagamento e não\n movimenta dinheiro; a de produção cobra o cliente. É a mesma tela para as duas, então confira no\n painel da AbacatePay qual chave você colou aqui.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n </div>\n )\n}\n\nexport const abacatePayConnectorDef: ConnectorDefinition = {\n id: ABACATEPAY_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AbacatePay',\n description: 'Pix e boleto com uma chave só, sem contrato de adquirente e sem tirar o cliente da loja.',\n icon: 'CreditCard',\n category: 'payments',\n // One pasted key, no consent screen: AbacatePay has no OAuth and no app to\n // install, so inventing a `startOAuth` here would ship a button that could\n // never connect anything.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the confirmation webhook\n // and the refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.abacatepay.com',\n // Where the key comes from. The connector declares the address because it is\n // a fact about THIS provider, and the doc names the path inside it\n // (Integrar → API Keys), which the field's placeholder repeats.\n providerInstall: { url: 'https://app.abacatepay.com' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: ABACATEPAY_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. The opposite\n // verdict from the carrier next door, on purpose (FAY-1300/FAY-1301).\n onFailure: 'block',\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n // The two calls that exist. A refund endpoint exists too, but nothing in this\n // repo reaches it yet, and a declared moment that never arrives is a promise\n // the code cannot keep.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AbacatePay (Pix ou boleto)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AbacatePay avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n ABACATEPAY_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(ABACATEPAY_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the key — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The key itself never arrives here:\n // the hub split it out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing, and there is no useful call to make without\n // the key. Testing it belongs to the edge function that holds it.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AbacatePayExtraPanel,\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const STRIPE_CONNECT_CONNECTOR_ID = 'stripe-connect'\n\n/**\n * Six seconds, the same budget the other two gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n */\nexport const STRIPE_CONNECT_LATENCY_BUDGET_MS = 6000\n\n/**\n * Stripe's own vocabulary (lowercase), because these values travel to it as\n * `payment_method_types` — a translation table between what the merchant picked\n * and what the wire accepts is one more place for a method to silently stop\n * being offered.\n */\nexport const STRIPE_CONNECT_SETTINGS: ConnectorSetting[] = [\n {\n key: 'paymentMethods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'card', label: 'Cartão de crédito' },\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n ],\n requiredToOperate: true,\n // Card is the one method every Stripe account can charge the moment it is\n // active; Pix and boleto in BR each need their own approval, so offering\n // them by default would promise a checkout option that may not settle.\n defaultValue: ['card'],\n },\n]\n\n/**\n * The second door, for a merchant who already has a Stripe account and would\n * rather paste its secret key than authorize the platform on it.\n *\n * It is the same credential the OAuth grant yields (an access token for a\n * connected account IS a secret key), so the data plane has one code path and\n * `readSecretKey` in stripe-runtime.js is the only thing that knows there are\n * two sources. The platform's per-charge fee needs the grant, not the key, and\n * is the one thing a pasted key cannot do.\n */\nexport const STRIPE_CONNECT_FIELDS: ConnectorField[] = [\n {\n key: 'secretKey',\n label: 'Chave secreta (sk_…)',\n type: 'password',\n secret: true,\n placeholder: 'Stripe → Developers → API keys → Secret key',\n },\n]\n\nconst store = createConnectionStore(STRIPE_CONNECT_CONNECTOR_ID, {\n settings: STRIPE_CONNECT_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { card: 'Cartão', pix: 'Pix', boleto: 'Boleto' }\n\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : []\n const labels = list.map((v) => METHOD_LABELS[String(v)] ?? String(v)).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction StripeConnectExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n A Stripe pede documentos e dados bancários antes de liberar cobranças. Se você fechou o\n cadastro no meio, a conexão fica de pé mas a loja ainda não cobra — clique em conectar de\n novo para voltar de onde parou, na mesma conta.\n </p>\n <p>\n O dinheiro cai na sua conta Stripe, não na Fayz. O que a Fayz retém é a taxa da\n plataforma, descontada na própria cobrança.\n </p>\n </>\n ) : (\n <p>\n Conectar abre o cadastro da Stripe numa aba. Você pode entrar com uma conta Stripe que já\n tenha ou criar uma na hora — em qualquer caso é sua, e é ela que recebe.\n </p>\n )}\n </div>\n )\n}\n\nexport const stripeConnectConnectorDef: ConnectorDefinition = {\n id: STRIPE_CONNECT_CONNECTOR_ID,\n // The catalogue has one Stripe row and this is not the Financeiro's `stripe`\n // connector, which is the tenant invoicing on their own account. Here Fayz is\n // the platform and the charge is opened on a connected account.\n catalogSlug: 'stripe',\n hostPluginId: 'shop',\n name: 'Stripe · Checkout',\n description: 'Cartão, Pix e boleto pela Stripe. A loja recebe na conta dela e a Fayz retém a taxa na própria cobrança.',\n icon: 'CreditCard',\n category: 'payments',\n // The OAuth grant on an account the merchant already owns (Connect's OAuth\n // flow, served by the vault); nothing secret ever reaches this file.\n authKind: 'oauth',\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.stripe.com/connect',\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: STRIPE_CONNECT_LATENCY_BUDGET_MS,\n // Same verdict as the other two gateways: an order that reads as confirmed\n // without a payment is worse than a refused checkout.\n onFailure: 'block',\n // OAuth-shaped, with a key as the second door: consent is the usual form,\n // and a merchant who already holds the account may paste its secret key\n // instead. Either one lands in the vault under this connector.\n fields: STRIPE_CONNECT_FIELDS,\n settings: STRIPE_CONNECT_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na conta Stripe da loja',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Stripe avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n ...connectionStatus(\n STRIPE_CONNECT_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.paymentMethods),\n plane: 'request',\n ...settingsStatus(STRIPE_CONNECT_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n startOAuth: fayzConnectorOAuth(STRIPE_CONNECT_CONNECTOR_ID),\n // Reached with no values when the browser returns marked `connected`, and\n // with none again after a pasted key (the secret goes to the vault, not\n // here). Required either way: the vault never touches the pool, so this is\n // the only thing that writes the tenant's `connections` row.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: async () => { await store.disconnect() },\n ExtraPanel: StripeConnectExtraPanel,\n}\n","// Vindi as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fourth gateway on the shelf, and the first whose provider name means two\n// different products. This connector is **Vindi Pagamentos** — the gateway, ex-\n// Yapay, `api.intermediador.yapay.com.br`. It is NOT Vindi Recorrência\n// (`app.vindi.com.br/api/v1`), which is subscriptions and invoices and\n// authenticates with HTTP Basic. Nothing here reaches that one.\n//\n// There is no consent screen, and that is a fact about Vindi rather than a\n// shortcut. Their `consumer_key` → CODE → `access_token` chain looks like OAuth\n// from a distance and is not: the authorize URL accepts only `consumer_key` —\n// no `redirect_uri`, no `state`, no scopes — and the instruction is literally to\n// open it in a browser and copy the CODE out of the address bar. That is the\n// account owner fetching their own credential, not a merchant authorizing a\n// platform, and our broker has nothing to sign or register against it. The path\n// that WOULD work is Vindi's Partner Accounts API, which provisions the\n// merchant's subaccount and hands the key straight to us — it needs a commercial\n// relationship with Vindi, and it is phase 2 (FAY-1416).\n//\n// Two hosts, unlike AbacatePay where one host serves both worlds and the key\n// decides. So the environment is a stored decision rather than something the\n// credential implies.\n//\n// ── card, and the shape it forced ───────────────────────────────────────────\n// This connector offers three methods it charges ITSELF (Pix, Bolepix, boleto)\n// and one it does not: credit card, which is paid on Vindi's own page. That is\n// not a limitation to be lifted later — Vindi's transparent card call takes a\n// card number in the request body, and the day this pool accepts one is the day\n// it is in PCI scope. The cart endpoint (`/v1/tmp_transactions/create`) is the\n// answer, and the same cart is what the panel sends as a payment link.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const VINDI_CONNECTOR_ID = 'vindi'\n\n/**\n * Six seconds, the same budget the other three gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Not measured against Vindi yet — no account exists to measure with. It is\n * copied from the two gateways that WERE measured (AbacatePay answered 640–830ms\n * from São Paulo) on the reading that a Brazilian gateway called from a Brazilian\n * pool sits in the same band. If a real sandbox says otherwise, this number moves\n * and this paragraph goes with it.\n */\nexport const VINDI_LATENCY_BUDGET_MS = 6000\n\n/**\n * As URLs onde o dono da conta busca o CODE, uma por ambiente.\n *\n * Não é uma tela de consentimento: a Vindi aceita `consumer_key` e mais nada —\n * sem `redirect_uri`, sem `state`, sem escopos — e devolve o CODE na barra de\n * endereço para ser copiado à mão. É por isso que o conector segue `api-key` e\n * não `oauth`: não há nada que o broker da plataforma possa assinar aqui.\n */\nexport const VINDI_AUTHENTICATION_URLS: Record<string, string> = {\n sandbox: 'https://tc-intermediador-sandbox.yapay.com.br/authentication?consumer_key=',\n production: 'https://tc.intermediador.yapay.com.br/authentication?consumer_key=',\n}\n\n/**\n * O que autoriza a conexão — e são QUATRO coisas, não uma, porque a Vindi tem\n * duas credenciais que abrem portas diferentes.\n *\n * `type: 'password'` é o que roteia cada uma para o cofre da plataforma\n * (packages/admin/.../connect/credentials.ts) em vez do `saveConnection`;\n * `secret: true` diz a mesma coisa no próprio campo, para a intenção sobreviver\n * a uma troca futura do tipo de input.\n *\n * ── o token da conta, e onde ele PARA ───────────────────────────────────────\n *\n * `tokenAccount` abre uma transação e a relê: Pix, boleto e o carrinho de\n * cartão vivem inteiramente dele. O que ele não faz é falar com a v3 — medido,\n * não suposto: `POST /api/v3/charges` respondeu **401** às três formas de\n * mandá-lo (corpo, Bearer, cabeçalho) no pool de produção em 25/08.\n *\n * ── a chave de consumidor, e o que ela compra ──────────────────────────────\n *\n * A v3 é o que emite um LINK DE PAGAMENTO de verdade — `pagar.vindi.com.br/…`,\n * com um `id` que a loja pode consultar depois. O carrinho da v1 devolve um\n * endereço parecido e sem id: ninguém pode perguntar por ele, e a venda só se\n * liquida se um webhook chegar. Era o que a loja tinha antes disto.\n *\n * O preço é uma corrente de três passos, e o do meio é manual:\n * `consumer_key` + `consumer_secret` (painel da Vindi) → abrir\n * {@link VINDI_AUTHENTICATION_URLS} no navegador e copiar o CODE da barra de\n * endereço → `access_token` (24 h) + `refresh_token` (1 ano). A renovação\n * diária é automática e acontece na função de borda; o CODE se digita uma vez\n * por ambiente.\n *\n * Os três são OPCIONAIS de propósito. Uma loja que só vende Pix na própria\n * página nunca precisou deles, e torná-los obrigatórios jogaria toda conexão que\n * funciona hoje para \"falta configurar\". O que falta sem eles é o link — e quem\n * pedir um recebe a frase que diz exatamente isto, em vez de um endereço mudo.\n */\nexport const VINDI_FIELDS: ConnectorField[] = [\n {\n key: 'tokenAccount',\n label: 'Token da conta',\n type: 'password',\n secret: true,\n placeholder: 'Vindi Pagamentos → Minha Conta → Token',\n },\n {\n key: 'consumerKey',\n label: 'Chave de consumidor (para links de pagamento)',\n type: 'password',\n secret: true,\n placeholder: 'consumer_key',\n },\n {\n key: 'consumerSecret',\n label: 'Segredo de consumidor',\n type: 'password',\n secret: true,\n placeholder: 'consumer_secret',\n },\n {\n key: 'authorizationCode',\n label: 'CODE de autorização',\n type: 'password',\n secret: true,\n placeholder: 'copiado da barra de endereço, uma vez por ambiente',\n },\n]\n\n/**\n * Which world the credential is valid against.\n *\n * Deliberately WITHOUT a `defaultValue`. Every other setting on this shelf can\n * afford a sensible default; this one decides whether a charge is real money or a\n * simulation, and a default here is a number nobody chose making that call. Until\n * the merchant answers, the connection reads \"conectado, falta configurar\" — which\n * is true, and is a state the column already has.\n *\n * A `select` and not a toggle: \"produção\" and \"não-sandbox\" are not the same\n * sentence to read at speed.\n */\nexport const VINDI_ENVIRONMENT_SETTING: ConnectorSetting = {\n key: 'environment',\n label: 'Ambiente',\n description: 'Sandbox simula o pagamento e não movimenta dinheiro. Produção cobra o cliente de verdade.',\n type: 'select',\n options: [\n { value: 'sandbox', label: 'Sandbox (teste)' },\n { value: 'production', label: 'Produção' },\n ],\n requiredToOperate: true,\n}\n\n/** Vindi's credit card id — the one method that is not paid on our page. */\nexport const VINDI_CARD_METHOD = '3'\n\n/**\n * Which methods the merchant offers — commercial policy, not a credential.\n *\n * The values are Vindi's own `payment_method_id`, as numbers-in-strings, because\n * that is what travels to it on the wire. A translation table between what the\n * merchant picked and what the API accepts is one more place for a method to\n * silently stop being offered.\n *\n * ── card is here, and it is NOT the same kind of thing as the others ────────\n *\n * Pix, Bolepix and boleto are opened by our own edge function and paid inside\n * the store: a QR code and a barcode are public strings, so nothing sensitive\n * is ever ours to hold.\n *\n * Card cannot work that way. Vindi's transparent card call takes `card_number`,\n * `card_cvv` and the expiry in the request body, and a PAN crossing our edge\n * function drags the whole pool into PCI scope — an audit and an architecture,\n * not a feature. So card is opened as a CART and paid on Vindi's own page: the\n * buyer is redirected, types the number under Vindi's certificate, and comes\n * back. That is the cost, and it is stated to the merchant in the panel below\n * rather than discovered by a buyer.\n */\nexport const VINDI_SETTINGS: ConnectorSetting[] = [\n VINDI_ENVIRONMENT_SETTING,\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher. O cartão é pago na página segura da Vindi.',\n type: 'multi-select',\n options: [\n { value: '27', label: 'Pix' },\n { value: '28', label: 'Bolepix (boleto com QR)' },\n { value: '6', label: 'Boleto' },\n { value: VINDI_CARD_METHOD, label: 'Cartão de crédito (página da Vindi)' },\n ],\n requiredToOperate: true,\n },\n /**\n * The seller's postcode, which Vindi's cart endpoint refuses to open without.\n *\n * NOT `requiredToOperate` in the static list — a store selling Pix has never\n * needed it, and turning it into a requirement would put every working\n * connection into \"falta configurar\" the day this version ships. It becomes\n * required the moment card is enabled: see `requiredSettingsFor`.\n */\n {\n key: 'sellerPostalCode',\n label: 'CEP da loja',\n description: 'De onde a loja vende. A Vindi exige esse dado para abrir a página de cartão.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '\\\\d{5}-?\\\\d{3}',\n patternHint: 'Oito dígitos, com ou sem hífen.',\n },\n /**\n * How many instalments Vindi's page may offer.\n *\n * A `select` rather than free text because it is a number with a ceiling the\n * merchant does not know: Vindi refuses a split above what the account was\n * accredited for, and a typed \"24\" would be a checkout that fails at the last\n * click. The default is 1 — a store that never thought about instalments\n * should not discover it is financing purchases.\n */\n {\n key: 'maxSplit',\n label: 'Parcelas no cartão',\n description: 'Em quantas vezes o cliente pode dividir. Depende do que a Vindi liberou para a conta.',\n type: 'select',\n options: [\n { value: '1', label: 'À vista' },\n { value: '2', label: 'Até 2x' },\n { value: '3', label: 'Até 3x' },\n { value: '6', label: 'Até 6x' },\n { value: '10', label: 'Até 10x' },\n { value: '12', label: 'Até 12x' },\n ],\n defaultValue: '1',\n },\n]\n\n/**\n * The required-to-operate list for THIS connection, which is not a constant.\n *\n * A merchant who enabled card owes us a postcode; one who did not, does not. A\n * static declaration could only choose between nagging every Pix-only store\n * forever and letting a card checkout fail at the moment of paying — and the\n * second is a buyer's problem, which is the one kind we do not get to ship.\n */\nexport function requiredSettingsFor(settings: Record<string, unknown> | undefined): ConnectorSetting[] {\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : String(raw ?? '').split(',')\n const hasCard = list.map((v) => String(v).trim()).includes(VINDI_CARD_METHOD)\n\n return VINDI_SETTINGS.map((setting) =>\n setting.key === 'sellerPostalCode' && hasCard\n ? { ...setting, requiredToOperate: true }\n : setting)\n}\n\nconst store = createConnectionStore(VINDI_CONNECTOR_ID, {\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = {\n '27': 'Pix',\n '28': 'Bolepix',\n '6': 'Boleto',\n [VINDI_CARD_METHOD]: 'Cartão',\n}\nconst ENVIRONMENT_LABELS: Record<string, string> = { sandbox: 'Sandbox', production: 'Produção' }\n\n/**\n * The row's one-line summary — the environment first, because it is the one\n * mistake a merchant needs to catch from across the screen.\n */\nfunction connectionDetail(settings: Record<string, unknown> | undefined): string | undefined {\n const environment = ENVIRONMENT_LABELS[String(settings?.environment ?? '')]\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : typeof raw === 'string' ? raw.split(',') : []\n const methods = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n\n const parts = [environment, methods.length > 0 ? methods.join(', ') : null].filter(Boolean)\n return parts.length > 0 ? parts.join(' · ') : undefined\n}\n\nfunction VindiExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [environment, setEnvironment] = useState('')\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => {\n if (cancelled) return\n setConnected(!!c?.active)\n setEnvironment(String((c?.settings as Record<string, unknown>)?.environment ?? ''))\n })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n // Sem ambiente escolhido não se mostra endereço nenhum: os dois mundos são\n // contas diferentes, e o CODE tirado do errado não abre a certa.\n const authenticationUrl = VINDI_AUTHENTICATION_URLS[environment]\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem\n sair da página. O cartão é diferente — ele é digitado na página segura da Vindi, e o\n cliente volta para a loja em seguida. É assim de propósito: nenhum número de cartão passa\n pelo seu site.\n </p>\n <p>\n Você também pode gerar um <strong>link de pagamento</strong> em Pedidos → Novo e mandar\n no WhatsApp. O cliente escolhe como pagar na página da Vindi, e o pedido aparece aqui\n sozinho quando o dinheiro cair.\n </p>\n <p>\n Sandbox e produção são contas diferentes, com tokens diferentes. Se você trocar o ambiente\n aqui, troque também as credenciais — as de teste não cobram em produção e as de produção\n não funcionam no sandbox.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </>\n ) : (\n <p>\n O token da conta você pega no painel da Vindi Pagamentos, em Minha Conta. Confira se ele é o\n do mesmo ambiente que você vai escolher aqui — o token de sandbox não cobra em produção.\n </p>\n )}\n\n {/* O passo manual da Vindi, escrito onde ele é feito. Escondê-lo atrás de\n um link de documentação transformaria \"o link não sai\" numa conversa. */}\n <div className=\"rounded-md border border-dashed p-3\">\n <p className=\"font-medium text-foreground\">Para gerar links de pagamento</p>\n <p className=\"mt-1\">\n O token da conta não emite link — a Vindi exige uma autorização à parte. Peça a{' '}\n <strong>chave</strong> e o <strong>segredo de consumidor</strong> no painel da Vindi e\n preencha os campos acima. Falta ainda o <strong>CODE</strong>:\n </p>\n <ol className=\"mt-2 list-decimal space-y-1 pl-4\">\n <li>\n {authenticationUrl ? (\n <>\n Abra no navegador{' '}\n <code className=\"break-all rounded bg-muted px-1 py-0.5\">\n {authenticationUrl}SUA_CHAVE\n </code>{' '}\n trocando <code>SUA_CHAVE</code> pela sua chave de consumidor.\n </>\n ) : (\n <>Escolha o ambiente acima e o endereço para buscar o CODE aparece aqui.</>\n )}\n </li>\n <li>A Vindi redireciona. O CODE fica na barra de endereço — copie de lá.</li>\n <li>Cole no campo <strong>CODE de autorização</strong> e salve.</li>\n </ol>\n <p className=\"mt-2\">\n É uma vez por ambiente. A partir daí a renovação diária acontece sozinha.\n </p>\n </div>\n </div>\n )\n}\n\nexport const vindiConnectorDef: ConnectorDefinition = {\n id: VINDI_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Vindi',\n description: 'Pix, boleto e cartão pela Vindi. A loja recebe na conta dela; o cartão é digitado na página segura da Vindi.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, because the catalogue row\n // is a change in another repo that has to be seeded before it exists anywhere:\n // until then `emit-connector-map` warns that `vindi` \"resolves to a slug the\n // platform catalogue does not carry\", and the shelf would render a grey plug.\n // The absolute URL on the assets bucket answers the same from any origin,\n // which a path would not — a tenant app is served from its own domain.\n logoUrl: 'https://assets.fayz.ai/connectors/vindi.png',\n category: 'payments',\n // Pasted keys, no consent screen: Vindi has no merchant-connect OAuth, so a\n // `startOAuth` here would ship a button that could never connect anything. See\n // the file header for why the flow that looks like OAuth is not one.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://developers.vindi.com.br/',\n // Where the token comes from. The consumer pair does NOT come from here — it\n // is requested from Vindi by form — which the fields' placeholders say.\n providerInstall: { url: 'https://app.vindi.com.br' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app — são digitados na página da Vindi.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: VINDI_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other three gateways, opposite to the carrier next door.\n onFailure: 'block',\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na Vindi (Pix, boleto ou a página de cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Vindi avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n VINDI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection?.settings),\n plane: 'request',\n // Judged against what THIS connection needs, not against a constant: a\n // store that ticked card owes a postcode, and one that did not owes\n // nothing. See `requiredSettingsFor`.\n ...settingsStatus(requiredSettingsFor(connection?.settings), connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the three keys — that\n // ordering is what makes `active = true` mean \"credentials were placed for\n // this store\" rather than \"somebody pressed a button\". They never arrive here:\n // the hub split them out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: VindiExtraPanel,\n}\n","// Mercado Pago as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fifth gateway on the shelf, and the first where the CARD is typed inside\n// the store. That is not ambition, it is a different mechanism: AbacatePay's and\n// Vindi's transparent card calls take `card_number` and `card_cvv` in a request\n// body OUR edge function makes, and the day this pool accepts one is the day it\n// is in PCI scope — which is why both of them redirect. Mercado Pago tokenises\n// in the BROWSER, inside their own iframes, and hands the page a single-use\n// token. The store never holds a PAN, so the buyer never has to leave. The\n// guarantee is structural rather than promised: see packages/storefront\n// CardBrick.tsx, where there is no state that could hold a card number because\n// the inputs are not ours to read.\n//\n// ── which API this speaks, and why it matters here ──────────────────────────\n// The Orders API (`POST /v1/orders`), not `/v1/payments`. Their own docs say\n// the payments endpoint \"will no longer receive new features\", and the two do\n// not agree on shapes that a connector cannot paper over: Orders wants money as\n// a STRING (\"27.99\"), an expiry as an ISO-8601 DURATION (\"PT30M\"), and it\n// returns the Pix QR on `transactions.payments[].payment_method` rather than on\n// `point_of_interaction`. Verified end to end against a production seller test\n// user on 2026-08-26 — Pix opened 201 `action_required`/`waiting_transfer`, card\n// opened 201 `processed`/`accredited`.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n getActiveTenantId,\n type ConnectorDefinition,\n} from '@fayz-ai/core'\nimport { describeConnectorAccount, fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MERCADOPAGO_CONNECTOR_ID = 'mercadopago'\n\n/**\n * Six seconds, the budget every gateway on this shelf carries: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Measured, not copied: `POST /v1/orders` answered in 700–1100 ms from São Paulo\n * across the Pix and card runs on 2026-08-26. The budget keeps the same headroom\n * the others were given.\n */\nexport const MERCADOPAGO_LATENCY_BUDGET_MS = 6000\n\n/**\n * There is no form, and that is the point of this connector.\n *\n * The seller authorizes Fayz on Mercado Pago's own screen. No credential ever\n * passes through this file, nobody has to find an access token in a developer\n * panel, and the grant can be revoked from their side without us holding\n * anything that keeps working afterwards.\n *\n * ── what replaced the two pasted fields ────────────────────────────────────\n *\n * This connector first shipped with `accessToken` and `publicKey` as password\n * fields, because that could be tested the same afternoon. It worked, and it\n * could never be a product: `marketplace_fee` — the split that pays Fayz — is\n * \"exclusivo para integrações com OAuth\" in their docs, so a store connected by\n * pasting keys is a store we cannot earn on. The form is gone rather than kept\n * as a fallback, because a shelf offering both would let a merchant choose the\n * one that quietly disables the business model.\n *\n * Stores connected the old way are NOT stranded. The vault is keyed by\n * slug + tenant and the runtime reads `accessToken` and `access_token` alike,\n * so an existing connection keeps charging; pressing Conectar upgrades it in\n * place, and the row gains the refresh token it never had.\n *\n * ── there is still no environment setting ──────────────────────────────────\n *\n * The token itself decides which world a charge lands in — `live_mode` comes\n * back with the grant — so there is no flag here to disagree with it. That is\n * the trap AbacatePay set (migration 0069), where a catalogue pushed with a\n * production key did not exist in sandbox.\n *\n * One caveat that survives from the pasted-key days: the Orders API REFUSES\n * `TEST-` credentials outright. Testing means a test USER authorizing with\n * their own production keys, which is what the panel below says.\n */\nconst store = createConnectionStore(MERCADOPAGO_CONNECTOR_ID)\n\n/**\n * The row's one-line summary.\n *\n * It used to read the pasted `publicKey` out of settings and say Sandbox or\n * Produção from its prefix. Under OAuth there is no pasted key: the whole\n * credential — `live_mode` included — is in the vault, which never hands it\n * back to this file. Saying \"Produção\" from something we can no longer see\n * would be a guess printed as a fact, so the row states only what is certainly\n * true of every connected store.\n */\nfunction connectionDetail(connection: { displayName?: string | null } | null | undefined): string {\n // The account first, because it is the thing a green dot cannot say. A\n // merchant with a personal account and a company one, or an agency holding\n // several clients, otherwise has no way to tell which is taking the money —\n // and connecting the WRONG one looks exactly like connecting the right one.\n const account = String(connection?.displayName ?? '').trim()\n return account ? `${account} · Pix e cartão` : 'Pix e cartão'\n}\n\nfunction MercadoPagoExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [account, setAccount] = useState<{ name: string | null; id: string | null }>({ name: null, id: null })\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => {\n if (cancelled) return\n setConnected(!!c?.active)\n setAccount({\n name: String(c?.displayName ?? '').trim() || null,\n id: String(c?.providerAccountKey ?? '').trim() || null,\n })\n })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected && (account.name || account.id) && (\n /* Named before anything else is explained. \"Conectado\" is not an answer\n to \"connected to WHAT\" — and a store whose money is going to the\n wrong Mercado Pago account looks identical to one whose money is not. */\n <div className=\"rounded-md border bg-muted/40 p-3\">\n <p className=\"font-medium text-foreground\">Conta conectada</p>\n {account.name && <p className=\"mt-1 break-words\">{account.name}</p>}\n {account.id && (\n <p className=\"mt-0.5\">\n ID no Mercado Pago: <code className=\"rounded bg-muted px-1 py-0.5\">{account.id}</code>\n </p>\n )}\n <p className=\"mt-1\">\n Não é esta a conta? Clique em <strong>Desconectar</strong> e conecte de novo, logado na\n conta certa do Mercado Pago.\n </p>\n </div>\n )}\n {connected && !account.name && !account.id && (\n /* An older connection, made before the account was recorded. Saying so\n beats showing nothing and letting it read as \"no account\". */\n <p className=\"rounded-md border border-dashed p-3\">\n Esta conexão foi feita antes de a loja passar a guardar qual conta foi autorizada. Para ver\n o nome da conta aqui, clique em <strong>Desconectar</strong> e conecte novamente.\n </p>\n )}\n {connected ? (\n <>\n <p>\n Pix e cartão acontecem <strong>dentro da sua loja</strong>. O cliente vê o QR Code ou\n digita o cartão sem sair da página, e volta para a confirmação no mesmo lugar. Diferente\n das outras adquirentes, aqui o cartão não redireciona.\n </p>\n <p>\n O número do cartão não passa pelo seu site: ele é digitado dentro de um formulário do\n próprio Mercado Pago e vira um código de uso único antes de chegar até nós. É por isso\n que dá para receber cartão na sua página sem a auditoria que isso normalmente exige.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n <p>\n O Pix vale por 30 minutos. Se o cliente fechar a aba depois de pagar, o pedido aparece\n aqui do mesmo jeito — o Mercado Pago avisa a loja assim que o dinheiro cai.\n </p>\n </>\n ) : (\n <>\n <p>\n Clique em <strong>Conectar</strong> e você vai para o Mercado Pago autorizar a Fayz. É\n na tela deles, com o seu login — nenhuma senha e nenhuma chave passam por aqui.\n </p>\n <p>\n O dinheiro continua caindo na <strong>sua</strong> conta do Mercado Pago. A autorização\n só permite abrir cobranças em nome da sua loja, e você pode cancelá-la quando quiser no\n painel do Mercado Pago.\n </p>\n <p>\n Use uma conta <strong>PJ</strong>, com o CNPJ da loja. Conta pessoa física costuma vir\n com bandeiras de cartão bloqueadas até a verificação terminar — e o bloqueio aparece\n como uma compra recusada, não como um aviso.\n </p>\n </>\n )}\n\n {/* The one thing that surprises everybody who tests this, written where the\n testing happens. Leaving it to the docs turns \"401\" into a conversation. */}\n <div className=\"rounded-md border border-dashed p-3\">\n <p className=\"font-medium text-foreground\">Para testar sem cobrar de verdade</p>\n <p className=\"mt-1\">\n O teste é feito com <strong>usuários de teste</strong>: crie um vendedor e um comprador em\n Suas integrações → Contas de teste, e autorize aqui logado como o vendedor de teste. Não é\n dinheiro real, e é assim que o próprio Mercado Pago recomenda. Credenciais que começam com{' '}\n <code className=\"rounded bg-muted px-1 py-0.5\">TEST-</code> <strong>não funcionam</strong>{' '}\n nesta API — o usuário de teste usa as chaves de produção dele.\n </p>\n </div>\n </div>\n )\n}\n\nexport const mercadoPagoConnectorDef: ConnectorDefinition = {\n id: MERCADOPAGO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Mercado Pago · Checkout',\n description: 'Pix e cartão pelo Mercado Pago, os dois pagos dentro da loja — o cartão é digitado sem o cliente sair da página.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, for the same reason Vindi\n // declares its own: the catalogue row is a change in another repo that has to\n // be seeded before it exists anywhere, and until then the shelf renders a grey\n // plug. The absolute URL answers from any origin — a tenant app is served from\n // its own domain, so a path would not.\n logoUrl: 'https://assets.fayz.ai/connectors/mercadopago.png',\n category: 'payments',\n // A real consent screen, unlike Vindi's — whose flow only LOOKS like OAuth and\n // is a CODE copied out of an address bar. The seller authorizes Fayz once at\n // auth.mercadopago.com, the money keeps landing in their own account, and\n // `marketplace_fee` takes our cut on the way past.\n //\n // That fee is the reason this is not pasted keys: Mercado Pago's docs are\n // explicit that it is \"exclusivo para integrações com OAuth\", so a connection\n // made by copying credentials out of a panel can never earn. The pasted-key\n // version shipped first because it could be tested the same afternoon; this\n // is the one that can be a product.\n //\n // A store connected the old way keeps working and does not have to be\n // migrated by hand: the vault is keyed by slug + tenant, and the runtime reads\n // `accessToken` and `access_token` alike. Reconnecting through the button\n // upgrades it in place — same slug, same row, now with a refresh token.\n authKind: 'oauth',\n // The whole of it. `provider` defaults to the connector id, and both are\n // `mercadopago` — the platform registry keys on that word.\n startOAuth: fayzConnectorOAuth(MERCADOPAGO_CONNECTOR_ID),\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://www.mercadopago.com.br/developers/pt/docs/checkout-api/landing',\n providerInstall: { url: 'https://www.mercadopago.com.br/developers/panel/app' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason:\n 'Registrar aqui a cobrança aberta e a confirmação do pagamento. O número do cartão não passa por este app — ele é digitado num formulário do próprio Mercado Pago.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: MERCADOPAGO_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other four gateways, opposite to the carrier next door.\n onFailure: 'block',\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta no Mercado Pago (QR do Pix ou cartão digitado na própria loja)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'O Mercado Pago avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n //\n // No `settingsStatus`: this connector has nothing to configure, so a\n // connection either has its credential pair or does not. \"Conectado, falta\n // configurar\" would be a state that can never be true here.\n ...connectionStatus(\n MERCADOPAGO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection),\n plane: 'request',\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the pair — that ordering is\n // what makes `active = true` mean \"credentials were placed for this store\"\n // rather than \"somebody pressed a button\". The secret never arrives here: the\n // hub split it out before calling this.\n //\n // No `testConnection`: the probe is handed the non-secret half, and a public\n // key alone cannot open an order. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n // Runs on the way back from the consent screen. `active: true` is the half\n // that has always been written here; the account is the half that was\n // missing, and this is the only place it can be written.\n //\n // The name lives on the PLATFORM's connection row — captured at grant time,\n // because the vault never hands a token back to a screen — while the panel\n // renders from the tenant's own `connections`. Nothing bridged the two,\n // which is why every row in a live pool has `display_name: null`. So the\n // app asks who it just connected to and stores the answer next to the\n // switch, where the panel already looks.\n //\n // Failure is silent by construction: `describeConnectorAccount` returns\n // null rather than throwing, and a connector must not refuse to connect\n // because a label could not be fetched.\n // WITH the tenant, always. The platform mints the runtime token behind this\n // call from a schema where `tenantId` is REQUIRED (`z.string().min(1)`), so\n // omitting it is not \"let the server choose\" — it is a 400 before any\n // choosing happens, and the null that comes back is indistinguishable from\n // \"this connector has no account\". That is how a live pool ends up with\n // every `display_name` null while the connect itself reports success.\n //\n // It reads as harmless because one org hides it: with a single membership\n // there is nothing to select. The bill arrives on the first operator who\n // belongs to two.\n const account = await describeConnectorAccount({\n connectorId: MERCADOPAGO_CONNECTOR_ID,\n tenantId: getActiveTenantId(),\n })\n await store.save({\n active: true,\n ...(account?.displayName ? { displayName: account.displayName } : {}),\n ...(account?.providerAccountKey ? { providerAccountKey: account.providerAccountKey } : {}),\n })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MercadoPagoExtraPanel,\n}\n","import type { MediaFile } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Os dois endereços que a biblioteca de conteúdo precisa saber montar: para\n// onde uma foto leva, e por onde ela desce. Fora do componente porque é o que\n// realmente pode quebrar sem ninguém ver — uma rota que mudou de forma, um\n// arquivo que abre em vez de baixar.\n// ---------------------------------------------------------------------------\n\n/** A tela onde a foto é gerenciada — a aba de fotos do produto, não a lista. */\nexport function recordRoute(reference: NonNullable<MediaFile['reference']>): string {\n return `#/products/${reference.id}/images`\n}\n\n/**\n * O endereço que baixa o arquivo em vez de abri-lo.\n *\n * O storage devolve o arquivo como anexo quando pedimos; o atributo `download`\n * do link sozinho é ignorado quando o arquivo vem de outro domínio — que é o\n * caso de toda foto da loja.\n */\nexport function downloadUrlOf(file: MediaFile): string {\n if (!/^https?:/i.test(file.url)) return file.url\n const separator = file.url.includes('?') ? '&' : '?'\n return `${file.url}${separator}download=${encodeURIComponent(file.name)}`\n}\n","import React from 'react'\nimport {\n ChevronLeft, ChevronRight, Download, Film, FileText, ImageOff,\n Package, RefreshCw, Trash2, Upload,\n} from 'lucide-react'\nimport { Button, Card, ConfirmDialog, Hint, PageHeader, PageHeaderActions, PageTabs, toast } from '@fayz-ai/ui'\nimport { AskAIButton, PageActions, type PageAction } from '@fayz-ai/admin'\nimport type { MediaFile, ShopProvider } from '@fayz-ai/shop'\nimport { getShopProvider, productImageToMediaFile } from '@fayz-ai/shop'\nimport { downloadUrlOf, recordRoute } from './media-links'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Conteúdo — a biblioteca de arquivos da loja.\n//\n// Não é um depósito: é onde o lojista olha as fotos do catálogo todas juntas e\n// vê quais estão ruins. Por isso cada arquivo mostra a que registro pertence e\n// leva até ele — uma parede de miniaturas anônimas mostra o problema e não dá\n// para onde ir —, e por isso abrir uma foto acontece AQUI, com voltar, baixar e\n// trocar à mão: quem veio revisar o catálogo revisa dezenas, e cada ida a outra\n// aba é uma volta que ele não faz.\n//\n// Uma foto de produto é uma linha em plg_shop_product_images (é o provider que\n// junta as duas fontes); o que o lojista sobe aqui não pertence a nada e fica na\n// biblioteca.\n// ---------------------------------------------------------------------------\n\ntype MediaTab = 'all' | 'image' | 'video'\n\nconst TABS: { value: MediaTab; label: string }[] = [\n { value: 'all', label: 'Todos' },\n { value: 'image', label: 'Imagens' },\n { value: 'video', label: 'Vídeos' },\n]\n\n/** Abaixo disso a foto estoura no zoom do storefront e no retina de um celular. */\nconst LOW_RESOLUTION_PX = 800\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1)\n return `${(bytes / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\ninterface Dimensions { width: number; height: number }\n\nexport interface ContentPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ContentPage({ resolveProvider }: ContentPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listMediaFiles === 'function'\n\n const [files, setFiles] = React.useState<MediaFile[] | null>(null)\n const [tab, setTab] = React.useState<MediaTab>('all')\n const [uploading, setUploading] = React.useState(false)\n const [pendingDelete, setPendingDelete] = React.useState<MediaFile | null>(null)\n const [deleting, setDeleting] = React.useState(false)\n const [replacing, setReplacing] = React.useState(false)\n // A foto aberta é guardada por id, não por objeto: a lista recarrega a cada\n // troca e um objeto guardado ficaria mostrando o arquivo antigo.\n const [openId, setOpenId] = React.useState<string | null>(null)\n // Medidas do arquivo real, lidas do <img> depois que ele carrega: o tamanho em\n // bytes não diz se a foto está pequena, e é isso que o lojista veio ver.\n const [dimensions, setDimensions] = React.useState<Record<string, Dimensions>>({})\n // The picker lives on the page, not inside a button: the header action is\n // now declared (PageActions), and a declaration has no DOM to hang an\n // <input type=\"file\"> off. Its `onSelect` clicks this one instead.\n const uploadInputRef = React.useRef<HTMLInputElement>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listMediaFiles) { setFiles([]); return }\n try {\n setFiles(await provider.listMediaFiles())\n } catch (err) {\n console.warn('[content] failed to list media', err)\n setFiles([])\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const measure = React.useCallback((id: string, d: Dimensions) => {\n setDimensions((prev) => prev[id] ? prev : { ...prev, [id]: d })\n }, [])\n\n const handleUpload = async (picked: FileList | null) => {\n if (!picked?.length || !provider.uploadMediaFile) return\n setUploading(true)\n try {\n // Sequential, not Promise.all: a merchant dropping twenty photos on a\n // café connection should not open twenty parallel uploads that all\n // time out together.\n for (const file of Array.from(picked)) {\n await provider.uploadMediaFile(file)\n }\n toast.success(picked.length === 1 ? 'Arquivo enviado' : `${picked.length} arquivos enviados`)\n await reload()\n } catch (err) {\n console.warn('[content] upload failed', err)\n toast.error('Não foi possível enviar o arquivo')\n } finally {\n setUploading(false)\n }\n }\n\n const handleReplace = async (file: MediaFile, picked: File) => {\n setReplacing(true)\n try {\n let nextId: string\n if (file.reference) {\n if (!provider.replaceProductImage) throw new Error('unsupported')\n const image = await provider.replaceProductImage(file.reference.attachmentId, picked)\n // A troca escreve um arquivo novo, então a identidade muda — reabrir a\n // foto pelo id antigo cairia numa tela em branco.\n nextId = productImageToMediaFile(image, file.reference.label).id\n } else {\n if (!provider.uploadMediaFile) throw new Error('unsupported')\n // Sobe primeiro, apaga depois: se a subida falhar, o lojista continua\n // com o arquivo que tinha.\n const uploaded = await provider.uploadMediaFile(picked)\n if (provider.deleteMediaFile) await provider.deleteMediaFile(file.id)\n nextId = uploaded.id\n }\n await reload()\n setOpenId(nextId)\n toast.success('Arquivo trocado')\n } catch (err) {\n console.warn('[content] replace failed', err)\n toast.error('Não foi possível trocar o arquivo')\n } finally {\n setReplacing(false)\n }\n }\n\n const confirmDelete = async () => {\n const file = pendingDelete\n if (!file) return\n setDeleting(true)\n try {\n // Uma foto de produto se apaga desanexando: a linha é o que a torna a foto\n // daquele produto, e é o provider que leva o arquivo junto. Um arquivo da\n // biblioteca não tem linha nenhuma — só o objeto.\n if (file.reference) {\n await provider.deleteProductImage(file.reference.attachmentId)\n } else if (provider.deleteMediaFile) {\n await provider.deleteMediaFile(file.id)\n }\n setFiles((prev) => prev?.filter((f) => f.id !== file.id) ?? null)\n setPendingDelete(null)\n if (openId === file.id) setOpenId(null)\n } catch (err) {\n console.warn('[content] delete failed', err)\n toast.error('Não foi possível excluir o arquivo')\n } finally {\n setDeleting(false)\n }\n }\n\n const visible = (files ?? []).filter((f) => tab === 'all' || f.kind === tab)\n const openIndex = visible.findIndex((f) => f.id === openId)\n const open = openIndex >= 0 ? visible[openIndex]! : null\n\n const canDelete = (file: MediaFile) => Boolean(file.reference) || typeof provider.deleteMediaFile === 'function'\n const canReplace = (file: MediaFile) => file.reference\n ? typeof provider.replaceProductImage === 'function'\n : typeof provider.uploadMediaFile === 'function'\n\n // A foto aberta ocupa a página inteira: a grade atrás dela seria só ruído, e\n // voltar é um clique (ou Esc).\n if (open) {\n return (\n <>\n <MediaDetail\n file={open}\n dimensions={dimensions[open.id]}\n onMeasured={(d) => measure(open.id, d)}\n position={{ index: openIndex, total: visible.length }}\n onNavigate={(delta) => setOpenId(visible[openIndex + delta]?.id ?? open.id)}\n onBack={() => setOpenId(null)}\n onReplace={canReplace(open) ? (picked) => void handleReplace(open, picked) : undefined}\n onDelete={canDelete(open) ? () => setPendingDelete(open) : undefined}\n replacing={replacing}\n />\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </>\n )\n }\n\n const attached = visible.filter((f) => f.reference)\n const loose = visible.filter((f) => !f.reference)\n\n // O NÚMERO VAI NA ABA, não ao lado dela.\n //\n // A contagem saía como texto solto no lado direito da faixa — que é o lugar\n // dos filtros e dos modos de ver em toda tela do produto (ver PageTabs). Era\n // a única tela com prosa ali, e era ela que esticava a faixa. `count` é o\n // slot que a própria aba tem para isso, e ainda responde uma pergunta que a\n // legenda não respondia: quantos vídeos, quantas imagens.\n const countOf = (t: MediaTab) => {\n if (files === null) return undefined\n if (t === 'all') return files.length\n return files.filter((f) => f.kind === t).length\n }\n const tabs = TABS.map((t) => ({ ...t, count: countOf(t.value) }))\n\n // Declared, not drawn: PageActions is what every other list's header uses,\n // so \"Enviar arquivos\" gets the same button on a pointer and the same FAB in\n // the thumb's corner on a phone. Hand-drawn it was a text button squeezed\n // into the phone's top bar, which is the one place a thumb cannot reach.\n const uploadActions: PageAction[] = [{\n id: 'upload',\n label: uploading ? 'Enviando…' : 'Enviar arquivos',\n icon: Upload,\n intent: 'primary',\n // It puts a new file in the library — the FAB is a \"+\", not a \"⋮\".\n creates: true,\n disabled: uploading,\n onSelect: () => uploadInputRef.current?.click(),\n }]\n\n const renderGrid = (list: MediaFile[]) => (\n <div className=\"fz-cards gap-4\">\n {list.map((file) => (\n <MediaCard\n key={file.id}\n file={file}\n dimensions={dimensions[file.id]}\n onMeasured={(d) => measure(file.id, d)}\n onOpen={() => setOpenId(file.id)}\n onDelete={canDelete(file) ? () => setPendingDelete(file) : undefined}\n />\n ))}\n </div>\n )\n\n return (\n <>\n {/* No <h1>: the shell's top bar already names the page — and now it also\n carries the upload, like every other page's primary action. The tabs\n are the page's own band (PageTabs), the same strip every list draws,\n not a row of links floating on the content. */}\n {/* A FAIXA É O PRIMEIRO FILHO, e tem de ser.\n A shell embrulha a página em `space-y-6 pt-4` (AdminShell), e a faixa\n sobe com `-mt-4` para encostar no cabeçalho — as duas coisas só se\n cancelam no PRIMEIRO filho. O seletor de arquivo escondido vinha\n antes: `display:none` não ocupa altura, mas continua sendo um filho,\n então a faixa herdava os 24px do `space-y` E perdia o encaixe do\n `-mt-4`. Era um buraco de ~40px entre \"Conteúdo\" e as abas que\n nenhuma outra tela tinha. O input foi para o fim, onde não empurra\n nada.\n A mesma faixa do Financeiro: abas à esquerda, fio atravessando a\n página, lado direito livre para filtros. */}\n <PageTabs\n tabs={tabs}\n value={tab}\n onChange={setTab}\n aria-label=\"Arquivos\"\n />\n {supported && provider.uploadMediaFile && (\n <PageHeaderActions>\n <PageActions actions={uploadActions} />\n </PageHeaderActions>\n )}\n\n <div className=\"space-y-6\">\n {!supported ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Armazenamento não configurado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n A biblioteca de arquivos precisa do storage da loja, que não está disponível neste modo.\n </p>\n </Card>\n ) : files === null ? (\n <div className=\"fz-cards gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Card key={i} className=\"p-3\">\n <div className=\"aspect-square animate-pulse rounded-md bg-muted\" />\n <div className=\"mt-2 h-3.5 w-2/3 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : visible.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Nenhum arquivo ainda</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n As fotos dos seus produtos e o que você enviar aqui aparecem nesta biblioteca.\n </p>\n </Card>\n ) : attached.length && loose.length ? (\n // Só separa quando há os dois: um título sozinho em cima de tudo é\n // barulho, e a etiqueta em cada cartão já diz de quem é a foto.\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <SectionTitle title=\"Fotos de produtos\" count={attached.length} />\n {renderGrid(attached)}\n </section>\n <section className=\"space-y-3\">\n <SectionTitle title=\"Biblioteca\" count={loose.length} />\n {renderGrid(loose)}\n </section>\n </div>\n ) : (\n renderGrid(visible)\n )}\n\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n {supported && provider.uploadMediaFile && (\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n void handleUpload(e.target.files).finally(() => {\n if (uploadInputRef.current) uploadInputRef.current.value = ''\n })\n }}\n />\n )}\n </div>\n </>\n )\n}\n\nfunction DeleteConfirm({ file, loading, onConfirm, onCancel }: {\n file: MediaFile | null\n loading: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n return (\n <ConfirmDialog\n open={file !== null}\n loading={loading}\n variant=\"destructive\"\n title={file?.reference ? 'Excluir a foto do produto?' : 'Excluir arquivo?'}\n description={file?.reference\n ? `A foto sai de \"${file.reference.label}\" e da loja imediatamente.`\n : 'O arquivo sai da biblioteca. Se ele estiver em uso em algum lugar, o endereço para de funcionar.'}\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n )\n}\n\nfunction SectionTitle({ title, count }: { title: string; count: number }) {\n return (\n <h2 className=\"text-sm font-semibold\">\n {title} <span className=\"font-normal text-muted-foreground\">({count})</span>\n </h2>\n )\n}\n\n/** O ícone que representa um arquivo que não é imagem. */\nfunction KindIcon({ kind, className }: { kind: MediaFile['kind']; className: string }) {\n const Icon = kind === 'video' ? Film : FileText\n return <Icon className={className} />\n}\n\nfunction MediaCard({ file, dimensions, onMeasured, onOpen, onDelete }: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n onOpen: () => void\n onDelete?: () => void\n}) {\n return (\n <Card className=\"group relative overflow-hidden p-3\">\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Abrir ${file.name}`}\n className=\"relative flex aspect-square w-full items-center justify-center overflow-hidden rounded-md bg-muted\"\n >\n {file.kind === 'image' ? (\n <img\n src={file.url}\n alt={file.name}\n loading=\"lazy\"\n className=\"h-full w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <KindIcon kind={file.kind} className=\"h-8 w-8 text-muted-foreground\" />\n )}\n {file.reference?.isCover && (\n <span className=\"absolute left-1.5 top-1.5 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </button>\n\n {onDelete && (\n <Hint label=\"Excluir\">\n <button\n type=\"button\"\n aria-label=\"Excluir\"\n onClick={onDelete}\n className=\"absolute right-4 top-4 rounded-md bg-card/90 p-1.5 text-muted-foreground opacity-0 shadow-button transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </Hint>\n )}\n\n <p className=\"mt-2 truncate text-[13px] font-medium\" title={file.name}>{file.name}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-1 text-[11px] font-medium text-warning\">Baixa resolução</p>\n )}\n\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1.5 text-[11px]\" />\n ) : (\n <p className=\"mt-1.5 text-[11px] text-muted-foreground\">Biblioteca</p>\n )}\n </Card>\n )\n}\n\n/**\n * A foto aberta, dentro de /content.\n *\n * Abrir numa aba nova mostrava o arquivo e mais nada — nem de quem é, nem como\n * trocar. Aqui a revisão inteira acontece no mesmo lugar: olhar, baixar, trocar,\n * ir para a próxima.\n */\nfunction MediaDetail({\n file, dimensions, onMeasured, position, onNavigate, onBack, onReplace, onDelete, replacing,\n}: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n position: { index: number; total: number }\n onNavigate: (delta: number) => void\n onBack: () => void\n onReplace?: (picked: File) => void\n onDelete?: () => void\n replacing: boolean\n}) {\n const replaceRef = React.useRef<HTMLInputElement>(null)\n\n // As setas andam pelo conjunto que está na tela: revisar trinta fotos é uma\n // tarefa de teclado. O Escape não está aqui — o PageHeader já o liga ao\n // mesmo \"voltar\" que desenha na barra.\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowLeft') onNavigate(-1)\n if (e.key === 'ArrowRight') onNavigate(1)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onNavigate])\n\n return (\n // `fz-container` é o ponto de MEDIÇÃO: sem ele a container query de\n // `fz-split` nunca casa e as duas colunas ficam empilhadas para sempre,\n // por mais larga que a janela esteja.\n <div className=\"fz-container space-y-4\">\n {/* A seta mora na barra da shell, como em toda tela de detalhe do app:\n \"← Conteúdo / foto.jpg\". Desenhá-la aqui dentro seria o segundo\n cabeçalho que o PageHeader existe para não deixar acontecer. */}\n <PageHeader title={file.name} parentLabel=\"Conteúdo\" onBack={onBack} />\n\n {position.total > 1 && (\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-label=\"Arquivo anterior\"\n disabled={position.index === 0}\n onClick={() => onNavigate(-1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <span className=\"px-1 tabular-nums\">{position.index + 1} de {position.total}</span>\n <button\n type=\"button\"\n aria-label=\"Próximo arquivo\"\n disabled={position.index === position.total - 1}\n onClick={() => onNavigate(1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n\n <div className=\"fz-split\">\n <Card className=\"flex min-h-[320px] items-center justify-center overflow-hidden bg-muted p-2\">\n {file.kind === 'image' ? (\n <img\n key={file.url}\n src={file.url}\n alt={file.name}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 p-12 text-muted-foreground\">\n <KindIcon kind={file.kind} className=\"h-10 w-10\" />\n <span className=\"text-sm\">Pré-visualização não disponível</span>\n </div>\n )}\n </Card>\n\n <Card className=\"space-y-4 p-4\">\n <div>\n <p className=\"break-words font-medium\" title={file.name}>{file.name}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-2 rounded-md bg-warning/10 px-2 py-1.5 text-xs font-medium text-warning\">\n Baixa resolução — no zoom da loja essa foto fica borrada. Troque por uma\n de pelo menos {LOW_RESOLUTION_PX}px no lado maior.\n </p>\n )}\n </div>\n\n <div>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">Onde é usada</p>\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1 text-sm\" />\n ) : (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Biblioteca — este arquivo não está preso a nenhum registro.\n </p>\n )}\n {file.reference?.isCover && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n É a capa: é ela que aparece no catálogo, no carrinho e no pedido.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n {/* Abre o assistente já sobre ESTA foto: a imagem entra anexada por\n endereço — o modelo busca o original, ninguém converte 100KB em\n base64 — e o pedido já vem escrito. Escrito, não enviado: quem\n está olhando uma foto ruim costuma ter algo a acrescentar (\"e\n deixa o fundo branco\"), e mandar por ele tiraria essa chance. */}\n {file.kind === 'image' && (\n <AskAIButton\n className=\"w-full\"\n size=\"lg\"\n label=\"Melhorar com IA\"\n media={{ url: file.url, name: file.name }}\n draft=\"Melhora essa imagem\"\n hint=\"o que você quer mudar nessa foto\"\n intro={{\n persona: 'Estúdio de imagem',\n pitch: `Vamos melhorar ${file.name}.`,\n description:\n 'Posso limpar o fundo, corrigir luz e cor, e gerar uma versão em resolução maior para o catálogo.',\n suggestions: [\n { label: 'Fundo branco', prompt: 'Remove o fundo e deixa branco' },\n { label: 'Mais nítida', prompt: 'Aumenta a resolução e a nitidez' },\n { label: 'Corrigir a luz', prompt: 'Corrige a iluminação e as cores' },\n ],\n }}\n />\n )}\n\n <Button asChild variant=\"outline\" className=\"w-full\">\n <a href={downloadUrlOf(file)} download={file.name}>\n <Download className=\"mr-2 h-4 w-4\" />\n Baixar\n </a>\n </Button>\n\n {onReplace && (\n <>\n <input\n ref={replaceRef}\n type=\"file\"\n accept={file.kind === 'image' ? 'image/*' : undefined}\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (picked) onReplace(picked)\n }}\n />\n <Button\n variant=\"outline\"\n className=\"w-full\"\n disabled={replacing}\n onClick={() => replaceRef.current?.click()}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${replacing ? 'animate-spin' : ''}`} />\n {replacing ? 'Trocando…' : 'Trocar arquivo'}\n </Button>\n {file.reference && (\n <p className=\"text-[11px] text-muted-foreground\">\n A troca mantém a posição da foto na galeria do produto.\n </p>\n )}\n </>\n )}\n\n {onDelete && (\n <Button variant=\"ghost\" className=\"w-full text-destructive hover:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Excluir\n </Button>\n )}\n </div>\n </Card>\n </div>\n </div>\n )\n}\n\nfunction RecordLink({ reference, className = '' }: {\n reference: NonNullable<MediaFile['reference']>\n /** Quem chama define o tamanho: o mesmo link serve o cartão e o painel. */\n className?: string\n}) {\n return (\n <a\n href={recordRoute(reference)}\n title={`Abrir ${reference.label}`}\n className={`flex items-center gap-1 truncate font-medium text-primary hover:underline ${className}`}\n >\n <Package className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{reference.label}</span>\n </a>\n )\n}\n\nfunction FileMeta({ file, dimensions }: { file: MediaFile; dimensions?: Dimensions }) {\n const parts = [\n file.extension,\n dimensions ? `${dimensions.width}×${dimensions.height}` : '',\n formatSize(file.size),\n ].filter(Boolean)\n return <>{parts.join(' · ')}</>\n}\n\nfunction isLowResolution(file: MediaFile, dimensions?: Dimensions): boolean {\n return file.kind === 'image' && !!dimensions\n && Math.max(dimensions.width, dimensions.height) < LOW_RESOLUTION_PX\n}\n","// ---------------------------------------------------------------------------\n// Bling's constraints. They are shape, not implementation detail.\n// ---------------------------------------------------------------------------\n// Every number here changes what the connector IS, not how it is written:\n//\n// 3 req/s, 120k/day per account, summed across every module\n// → never one request per product, which is what forces the fast `sample`\n// and the background `backfill` apart.\n// a date filter wider than one year answers 400\n// → the window is always sliced; a backfill that reaches back two years is\n// two calls, decided by the client, not one call that fails.\n// authorization_code expires in 60 seconds, and 20 calls to /oauth/token in\n// 60 seconds block the IP for an hour\n// → refresh with days of slack, never in a loop, never at the deadline.\n// the refresh token lives 30 days and rotates on use\n// → scheduled renewal is a requirement; a tenant who does not shop for a\n// month otherwise comes back disconnected.\n// a webhook must be answered 2xx within 5 seconds or Bling DISABLES the\n// configuration\n// → receive, verify, enqueue, answer. No processing on the response path.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const BLING_CONNECTOR_ID = 'bling'\n\n/** Per ACCOUNT, not per tenant: `instance_key` is the Bling company. */\nexport const BLING_RATE_LIMIT: RateLimitBudget = { perSecond: 3, perDay: 120_000 }\n\n/** Widest date filter Bling accepts. Anything longer answers 400. */\nexport const BLING_MAX_WINDOW_MS = 365 * 24 * 60 * 60_000\n\n/**\n * Re-read this much before the last window's end.\n *\n * Bling stamps `dataAlteracao` at second precision, so a product changed in the\n * same second the window closed is invisible for ever without an overlap. The\n * cost is an idempotent upsert; the cost of not having it is a price that never\n * updates and nobody can explain.\n */\nexport const BLING_WINDOW_OVERLAP_MS = 10 * 60_000\n\n/** Renew the token a week early. See the /oauth/token ban above. */\nexport const BLING_TOKEN_LEAD_MS = 7 * 24 * 60 * 60_000\n\n/** Bling's page size for the list endpoints. */\nexport const BLING_PAGE_SIZE = 100\n\n/**\n * A sample is one page, and one page only.\n *\n * At 3 req/s a ten-thousand-product catalogue is close to an hour. A connect\n * screen that waits for it is a connect screen nobody finishes, so the sample\n * answers with enough to design a storefront against and the backfill finishes\n * the mirror behind it.\n */\nexport const BLING_SAMPLE_SIZE = 100\n\n/** Bling signs its webhooks HMAC-SHA256 with the app's client secret. */\nexport const BLING_SIGNATURE_HEADER = 'x-bling-signature-256'\n\n/** Bling must see a 2xx before this, or it disables the tenant's webhook. */\nexport const BLING_WEBHOOK_DEADLINE_MS = 5_000\n","// The one place that names the Bling data plane. Same split as the Kiwify and\n// Stripe connectors: the definition declares WHAT the merchant can do, this file\n// knows how the call is made — and the credential path is what moves.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n// Estes contadores LEEM o arquétipo (v_shop_*), não a cópia do plugin: pedido e\n// cliente pertencem à base desde 0009/0013, e a view é onde os dois lados\n// concordam. Os *_links continuam em plg_shop_* — o vínculo com o provedor\n// externo é genuinamente da loja.\n\n/** The edge function that holds every Bling call this connector makes. */\nexport const BLING_FUNCTION = 'bling-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface BlingPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n stockPending?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface BlingPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o Bling.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o Bling.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(BLING_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testBling(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue down. `sample` is the seconds-long first answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<BlingPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send the products that exist only here. They come back linked — see the def. */\nexport function pushCatalogue(): Promise<BlingPushResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Send the buyers who have ordered, as Bling contacts. */\nexport function pushCustomers(): Promise<BlingPushResult> {\n return invoke({ action: 'push_customers' })\n}\n\n/** Send every paid order not filed yet, as a pedido de venda. */\nexport function pushOrders(): Promise<BlingPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Lança o saldo dos produtos já vinculados. O reparo de um estoque que não subiu. */\nexport function pushStock(): Promise<{ sent: number; considered: number; message: string }> {\n return invoke({ action: 'push_stock' })\n}\n\n/**\n * Quantos registros ainda faltam subir, por fila.\n *\n * As mesmas ausências que a função usa como fila, contadas daqui: produto sem\n * vínculo, cliente que comprou e não virou contato, pedido pago sem pedido de\n * venda. É o que deixa a linha dizer \"em dia\" em vez de oferecer um botão que\n * não enviaria nada.\n */\nasync function countRows(table: string, apply: (q: any) => any): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { count, error } = await apply(\n supabase.from(table).select('id', { count: 'exact', head: true }).eq('tenant_id', tenantId),\n )\n return error ? null : (count ?? 0)\n}\n\nexport function pendingProducts(): Promise<number | null> {\n return countRows('plg_shop_products', (q: any) => q.is('external_source', null))\n}\n\nexport async function pendingCustomers(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_customer_links')\n .select('customer_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n const already = new Set((linked ?? []).map((row: any) => row.customer_id))\n const { data, error } = await supabase\n .from('v_shop_customers')\n .select('id')\n .eq('tenant_id', tenantId)\n .gt('orders_count', 0)\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n const already = new Set((linked ?? []).map((row: any) => row.order_id))\n const { data, error } = await supabase\n .from('v_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\n/**\n * Which paid orders actually reached Bling — what a run's \"12 de 20\" cannot say.\n *\n * Read from the LINK TABLE, the same fact the push queue is built on: the link\n * exists exactly when Bling returned an id, so this screen cannot claim\n * \"enviado\" about something that was not.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('v_shop_orders')\n .select('id,order_number,customer_name,customer_document,paid_at,created_at')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order) => {\n const link = byOrder.get(order.id)\n const name = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n if (link) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n detail: order.customer_name ? String(order.customer_name) : undefined,\n }\n }\n // The one refusal explainable without asking Bling — and one the merchant\n // can fix.\n if (!String(order.customer_document ?? '').trim()) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'failed',\n detail: 'sem CPF/CNPJ no pedido — o Bling não emite nota sem ele',\n at: order.paid_at ?? order.created_at,\n }\n }\n return {\n subject: name,\n subjectId: order.id,\n status: 'pending',\n detail: 'na fila — sobe na próxima sincronização',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n\n/** Both directions, everything pending. What the clock runs every fifteen minutes. */\nexport function reconcile(): Promise<{\n pull: BlingPullResult\n push: Record<string, BlingPushResult | { skipped: string }>\n}> {\n return invoke({ action: 'reconcile' })\n}\n","// Bling as a unified ConnectorDefinition, surfaced in Loja → configurações →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// It ships NO SQL. The connection is a row of connections and the run\n// history is sync_runs, both read through createConnectionStore — which is\n// what the gate in scripts/check-connector-tables.mjs exists to keep true.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n BLING_CONNECTOR_ID,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n} from './limits'\nimport {\n listOrderDeliveries,\n pendingCustomers,\n pendingOrders,\n pendingProducts,\n pullCatalogue,\n pushCatalogue,\n pushCustomers,\n pushOrders,\n pushStock,\n reconcile,\n} from './data'\n\n/**\n * `settingsKeys` and not `fields`: none of these is asked for in a form. Bling\n * authenticates by OAuth, so the connector's own code never sees a credential —\n * the hub routes secrets to the platform, and this connection has no secret\n * field to route in the first place.\n */\nexport const blingConnectionStore = () =>\n createConnectionStore(BLING_CONNECTOR_ID, {\n settingsKeys: ['companyId', 'backfillFrom', 'stockOwner', 'source', 'pushOrdersFrom'],\n })\n\nexport const blingConnectorDef: ConnectorDefinition = {\n id: BLING_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Bling',\n description:\n 'Traz o catálogo e o estoque do Bling para a loja e devolve cada pedido como pedido de venda, pronto para faturar.',\n // Quando sincroniza, em português e sem jargão. É a primeira pergunta de quem\n // conecta, e ela não tinha resposta em lugar nenhum da tela.\n howItSyncs: [\n 'Ao salvar um pedido, cliente ou produto aqui, a sincronização é antecipada e sobe em até um minuto.',\n 'De hora em hora, sozinho: traz do Bling o que mudou lá e envia o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada registro guarda o número que recebeu no Bling.',\n ],\n icon: 'Boxes',\n authKind: 'oauth',\n // The catalogue files bling under `erp`, not `ecommerce`: Bling is the back\n // office, not the storefront. It shipped as 'commerce' — a word the catalogue\n // has never used — and the badge rendered nothing at all.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n docsUrl: 'https://developer.bling.com.br/',\n // The catalogue is a MIRROR, which is why `shop_product` is read as well as\n // written: `reconcileMirror` has to see what is here before it decides what a\n // record missing from a page means. The consent also has to name what LEAVES:\n // the initial load sends the catalogue, the buyers who have ordered, and every\n // paid order up to Bling.\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Enviar ao Bling os produtos que ainda só existem aqui, e depois trazer de lá o catálogo, o preço e o estoque — comparando com o que já está na loja para não duplicar nem apagar produto por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_customer',\n actions: ['read', 'write'],\n // `write` é o vínculo, não o cliente: sem ele cada pedido cria um contato\n // novo no Bling (o defeito que 0063 fecha).\n reason:\n 'Cadastrar como contato no Bling quem já comprou, para o pedido sair com nota. Nome, e-mail, telefone e CPF/CNPJ desse cliente vão para o Bling.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // Idem: grava-se o número que o pedido ganhou lá, que é o que permite\n // reenviar sem duplicar.\n reason:\n 'Ler o pedido pago para lançá-lo no Bling como pedido de venda, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n // Os momentos em que o ERP tem algo a fazer. `order_shipped` e\n // `order_delivered` ficam de fora de propósito: o pedido de venda já está\n // no Bling e o rastreio é outra história.\n {\n kind: 'event',\n // `order_confirmation` é o \"pedido feito\" no catálogo de fatos da loja\n // (packages/shop/src/lib/emails.ts). `shop.order_created` não existe, e\n // declarar um fato que ninguém publica é o bug que já aconteceu aqui.\n resource: 'shop.order_confirmation',\n actions: ['listen'],\n reason: 'Saber que um pedido foi feito, para lançá-lo no Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo ao Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não lançá-lo no Bling.',\n },\n {\n kind: 'event',\n resource: 'shop.customer_welcome',\n actions: ['listen'],\n reason: 'Saber que um cliente foi cadastrado, para virar contato no Bling.',\n },\n ],\n // Declared, so the scheduler owns the clock. A `sleep` inside the connector\n // could not express the daily ceiling and could not be shared between the\n // catalogue pull and the order push running at the same time.\n rateLimit: BLING_RATE_LIMIT,\n // A ten-thousand-product catalogue at 3 req/s is close to an hour, so the\n // first load has two entries: a sample that answers in seconds, and a backfill\n // that finishes behind it.\n firstLoad: { sampleSize: BLING_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // `shop.order_paid`, with an underscore. It shipped as `shop.order.paid`,\n // which is not a key anything publishes — the shop builds its facts as\n // `shop.${def.event}` over SHOP_EMAIL_EVENTS (packages/shop/src/lib/emails.ts),\n // and `eventKeyMatches` is exact for a pattern with no trailing star. The\n // managed automation was declared against a fact that could never arrive.\n subscribesTo: ['shop.order_confirmation', 'shop.order_paid', 'shop.order_cancelled', 'shop.customer_welcome'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Enviar o pedido para o Bling como pedido de venda' },\n { eventKey: 'shop.order_confirmation', label: 'Lançar o pedido novo no Bling como pedido de venda' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de enviar ao Bling um pedido que foi cancelado' },\n { eventKey: 'shop.customer_welcome', label: 'Cadastrar como contato no Bling o cliente que comprou' },\n ],\n // O que ACONTECE, e não o que está declarado. Os dois primeiros são o gatilho\n // de escrita da migration 0064: salvar um pedido antecipa o próximo tique do\n // agendador, então a fila drena em até um minuto em vez de quinze.\n invokedAt: [\n {\n key: 'shop.order.wake',\n label: 'Um pedido é salvo ou pago aqui, e a sincronização é antecipada',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['shop_order'],\n },\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido de venda no Bling',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order', 'shop_customer'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O catálogo, o preço e o estoque do Bling descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n BLING_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const company = connection.settings?.companyId\n return {\n connected: connection.status === 'connected',\n detail: company ? `Empresa ${company}` : undefined,\n plane: 'sync',\n }\n },\n { store: blingConnectionStore },\n ),\n // The whole connect step. Declaring `authKind: 'oauth'` and no `startOAuth`\n // is what rendered the Conectar button DISABLED, with nothing on screen\n // saying why — the defect this connector was reported for. Bling ignores a\n // per-request `redirect_uri` and always uses what is registered on the app,\n // so the page to come back to travels inside the platform's signed state;\n // none of that is spelled here, which is the point of the helper.\n startOAuth: fayzConnectorOAuth(BLING_CONNECTOR_ID),\n // The other half of the consent, and the reason the first live test looped:\n // the platform stores the token and the pool stores \"is it on?\", and with\n // nobody writing the second the connector answered \"not connected\" to a\n // merchant who had just authorized. Called with no values — the credential is\n // not ours to see, and there is nothing to configure yet.\n saveConnection: async () => {\n await blingConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. It does not delete: a shopkeeper who unplugs\n // Bling still has a store, and a connector that empties the catalogue on\n // disconnect is a connector nobody dares to disconnect. `disconnect()` on the\n // shared store flips `active` and clears cursors — it never touches shop data.\n disconnect: async () => { await blingConnectionStore().disconnect() },\n // The one sentence that used to hang below Bling's own history panel, said\n // where the question is actually asked. It is the only thing in that panel\n // that was neither status, nor history, nor an act.\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n // No panel of its own. The history is `sync_runs` read through the shared\n // store, and the shared surface renders it — including the \"first load brings\n // a sample\" sentence, which it derives from `firstLoad` above rather than\n // repeating the number in prose.\n ...connectionRuns(blingConnectionStore),\n // Record by record, for the automations screen: the managed automation says a\n // paid order goes to Bling, and this is what says whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n // The same seam Google Calendar uses, so the two screens are one screen with\n // two sets of words. Before this, Bling's tab was a history with nothing that\n // could put a row in it. Ordered as somebody does them on the first day.\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no Bling e envia o que está pendente daqui — catálogo novo, clientes que compraram e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg: any) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do Bling`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer catálogo do Bling',\n direction: 'inbound',\n description: 'Preço e estoque do Bling passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_products',\n label: 'Enviar catálogo para o Bling',\n direction: 'outbound',\n description:\n 'Sobe só o que ainda não existe lá. Depois de subir, quem manda no preço e no estoque passa a ser o Bling.',\n // Confirmed: a product filed at Bling cannot be taken back from here, and\n // the ownership handover is the part a merchant must agree to knowingly.\n confirm: {\n title: 'Enviar o catálogo para o Bling?',\n body:\n 'Os produtos que só existem aqui serão criados no Bling, com o saldo atual. A partir daí o Bling passa a mandar no preço e no estoque deles, e as mudanças vêm de lá para cá.',\n cta: 'Enviar catálogo',\n },\n pending: pendingProducts,\n run: async () => {\n const result = await pushCatalogue()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_stock',\n label: 'Enviar saldo do estoque',\n direction: 'outbound',\n description:\n 'Lança no Bling o saldo dos produtos já enviados. Use quando um envio disser que o saldo não foi transferido.',\n run: async () => (await pushStock()).message,\n },\n {\n key: 'push_customers',\n label: 'Enviar clientes para o Bling',\n direction: 'outbound',\n description:\n 'Cadastra como contato quem já comprou. Cliente sem CPF/CNPJ fica de fora — o Bling precisa dele para emitir a nota.',\n confirm: {\n title: 'Enviar os clientes para o Bling?',\n body:\n 'Quem já comprou nesta loja será cadastrado como contato no Bling, com nome, e-mail, telefone e CPF/CNPJ. Quem não tem documento cadastrado não é enviado.',\n cta: 'Enviar clientes',\n },\n pending: pendingCustomers,\n run: async () => {\n const result = await pushCustomers()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos',\n direction: 'outbound',\n description:\n 'Cada pedido vira um pedido de venda no Bling, pago ou não — é lá que ele vira nota. Pedido cancelado não sobe.',\n confirm: {\n title: 'Enviar os pedidos para o Bling?',\n body:\n 'Cada pedido que ainda não subiu vira um pedido de venda no Bling, pago ou não. Pedido cancelado fica de fora, e um pedido já enviado não sobe duas vezes.',\n cta: 'Enviar pedidos',\n },\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","// Bling ↔ canonical de-para. Pure, so the field-by-field agreement the brief\n// (docs/integrations/bling-integration-brief.md §5) settles is testable without\n// a Bling account.\nimport type { BlingProduto, MirroredProduct } from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One Bling product as the mirror stores it, or null when it carries no id.\n *\n * `situacao` is Bling's own on/off ('A' = ativo). It maps to archived rather\n * than to a delete: an inactive product in Bling is still a product, and this\n * connector has no vocabulary for deletion at all — see `pullProducts`.\n */\nexport function toMirroredProduct(raw: BlingProduto | null | undefined): MirroredProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n return {\n externalId: String(raw.id),\n sku: raw.codigo ? String(raw.codigo) : null,\n name: String(raw.nome ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.preco),\n // Bling is the source of the stock number. The store mirrors it; it does not\n // decide it. See docs/integrations/bling-integration-brief.md §3.\n inventoryCount: toNumber(raw.estoque?.saldoVirtualTotal),\n status: String(raw.situacao ?? 'A').toUpperCase() === 'A' ? 'active' : 'archived',\n imageUrl: raw.imagemURL ? String(raw.imagemURL) : null,\n // Always null in practice: Bling does not return a change date at all (see\n // BlingProduto.dataAlteracao). Kept rather than deleted because the canonical\n // shape is shared with providers that do, and the run stamps its own\n // watermark either way.\n updatedAt: raw.dataAlteracao ? String(raw.dataAlteracao) : null,\n }\n}\n","// ---------------------------------------------------------------------------\n// Bling → canonical: the pull, and why it may never cancel anything.\n// ---------------------------------------------------------------------------\n// Bling has no memory of what it told us last time. There is no syncToken and\n// no tombstone: the only way to ask \"what changed\" is a date filter this client\n// computes, which is a `window` cursor. So the completeness of every run here is\n// `additive`, and that single word is what stops the engine from archiving a\n// product whose only crime was to fall outside the range.\n//\n// Everything is transport-injected — fetch, clock, sleep and the limiter — so\n// \"3000 SKUs enter without blowing 3 req/s\" is a proof rather than an impression.\n//\n// The import is split by subpath and that is load-bearing, not tidiness: the\n// edge function in ../../functions/bling-sync runs this file under Deno, where\n// `@fayz-ai/core` pulls React and the plugin registry and cannot load at all.\n// `@fayz-ai/core/connector-runtime` is the one entry written to be loadable\n// there, and it is the one specifier the app repos' functions-sync vendors.\n// `SyncResult` stays on the barrel because a type import is erased before Deno\n// ever sees it.\nimport {\n createRateLimiter,\n paginate,\n reconcileMirror,\n serializeCursor,\n sliceWindow,\n advanceWindow,\n type Completeness,\n type Cursor,\n type MirrorRecord,\n type RateLimiter,\n} from '@fayz-ai/core/connector-runtime'\nimport type { SyncResult } from '@fayz-ai/core'\nimport {\n BLING_MAX_WINDOW_MS,\n BLING_PAGE_SIZE,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n BLING_WINDOW_OVERLAP_MS,\n} from './limits'\nimport { toMirroredProduct } from './mapping'\nimport type { BlingProduto, MirroredProduct } from './types'\n\n/** One page of `GET /produtos`, as the caller's transport hands it over. */\nexport interface BlingProductPage {\n items: BlingProduto[]\n /** Bling has no next-page token: a short page is the last page. */\n short?: boolean\n}\n\nexport interface BlingPageRequest {\n pagina: number\n from: string\n to: string\n limite: number\n}\n\nexport interface PullProductsOptions {\n /** Where this run resumes. Absent = the first backfill. */\n cursor?: Cursor\n /** How far back a first run reaches. */\n backfillFrom?: string\n now?: number\n fetchPage(request: BlingPageRequest): Promise<BlingProductPage>\n /** Idempotent upsert into the canonical mirror. Returns whether it wrote. */\n upsert(product: MirroredProduct): Promise<boolean>\n /** Products already mirrored for this connection, for the reconciliation below. */\n linked?: MirrorRecord[]\n limiter?: RateLimiter\n pageSize?: number\n /** Stop after this many records — the `sample` phase. */\n maxRecords?: number\n maxPages?: number\n}\n\nexport interface PullProductsResult extends SyncResult {\n completeness: Completeness\n cursor: Cursor\n /** Local ids the run did NOT see and deliberately did not touch. */\n keptOutOfRange: string[]\n products: MirroredProduct[]\n pages: number\n /** Calls actually spent, so a caller can bill them against the daily budget. */\n calls: number\n}\n\n/** The window a first run asks for: `backfillFrom` (or a year back) until now. */\nexport function firstWindow(now: number, backfillFrom?: string): Extract<Cursor, { kind: 'window' }> {\n const parsed = backfillFrom ? Date.parse(backfillFrom) : NaN\n const from = Number.isFinite(parsed) ? parsed : now - BLING_MAX_WINDOW_MS\n return {\n kind: 'window',\n from: new Date(from).toISOString(),\n to: new Date(now).toISOString(),\n overlapMs: BLING_WINDOW_OVERLAP_MS,\n }\n}\n\n/** The window this run should ask for, given what the last one left behind. */\nexport function windowFor(options: Pick<PullProductsOptions, 'cursor' | 'backfillFrom' | 'now'>): Extract<Cursor, { kind: 'window' }> {\n const now = options.now ?? Date.now()\n const previous = options.cursor\n if (previous?.kind === 'window') return advanceWindow(previous, now)\n // A delta or period cursor arriving here is a connector mix-up, not a\n // recoverable state: starting over is the only honest answer.\n return firstWindow(now, options.backfillFrom)\n}\n\n/**\n * Pull the products Bling changed inside the window.\n *\n * `completeness` is hard-coded `additive` and it is not a default anyone should\n * \"improve\": Bling structurally cannot tell us a product was deleted, because\n * the question we asked was \"what changed between these two dates\". A run that\n * returned `authoritative` here would archive every product the store did not\n * happen to touch this week.\n */\nexport async function pullProducts(options: PullProductsOptions): Promise<PullProductsResult> {\n const now = options.now ?? Date.now()\n const cursor = windowFor({ cursor: options.cursor, backfillFrom: options.backfillFrom, now })\n const limiter = options.limiter ?? createRateLimiter(BLING_RATE_LIMIT)\n const limite = options.pageSize ?? BLING_PAGE_SIZE\n const maxRecords = options.maxRecords ?? Number.POSITIVE_INFINITY\n\n // A window wider than a year is a 400 from Bling, so it is sliced BEFORE the\n // first call. Discovering the cap in production means discovering it as a\n // backfill that never ran.\n const slices = sliceWindow(cursor.from, cursor.to, BLING_MAX_WINDOW_MS)\n\n const products: MirroredProduct[] = []\n const seen = new Set<string>()\n let pages = 0\n let calls = 0\n let written = 0\n let error: string | undefined\n\n try {\n for (const slice of slices) {\n if (products.length >= maxRecords) break\n const walked = await paginate<BlingProduto, BlingPageRequest>({\n first: { pagina: 1, from: slice.from, to: slice.to, limite },\n maxPages: options.maxPages ?? 1_000,\n fetchPage: async (request) => {\n await limiter.take()\n calls += 1\n const page = await options.fetchPage(request)\n pages += 1\n const items = page.items ?? []\n // Bling has no next-page token. The page is the last one when it came\n // back short — which is also why an off-by-one here silently drops a\n // whole page, the exact failure FAY-1377 was.\n const last = page.short === true || items.length < request.limite\n const enough = products.length + items.length >= maxRecords\n return { items, next: last || enough ? null : { ...request, pagina: request.pagina + 1 } }\n },\n })\n\n for (const raw of walked.items) {\n if (products.length >= maxRecords) break\n const mapped = toMirroredProduct(raw)\n if (!mapped) continue\n seen.add(mapped.externalId)\n products.push(mapped)\n if (await options.upsert(mapped)) written += 1\n }\n }\n } catch (caught) {\n error = String((caught as Error)?.message ?? caught)\n }\n\n // The whole point. Under `additive` this returns nothing to cancel and names\n // what it refused to touch, so the refusal is visible in the run rather than\n // being an absence of behaviour.\n const reconciled = reconcileMirror({\n completeness: 'additive',\n observed: seen,\n linked: options.linked ?? [],\n })\n\n const advanced: Cursor = error ? cursor : { ...cursor }\n return {\n status: error ? 'error' : products.length >= maxRecords ? 'partial' : 'success',\n completeness: 'additive',\n fetched: products.length,\n written,\n cursor: advanced,\n keptOutOfRange: reconciled.keptOutOfRange,\n products,\n pages,\n calls,\n error,\n stats: {\n pages,\n calls,\n window_from: cursor.from,\n window_to: cursor.to,\n slices: slices.length,\n kept_out_of_range: reconciled.keptOutOfRange.length,\n cursor: serializeCursor(advanced),\n },\n }\n}\n\n/**\n * The fast half of the first load: one page, seconds, enough to design against.\n *\n * It is a different call and not a flag because it makes a different promise —\n * `partial` by construction, never a basis for deciding anything is missing.\n */\nexport function sampleProducts(\n options: Omit<PullProductsOptions, 'maxRecords' | 'maxPages'> & { sampleSize?: number },\n): Promise<PullProductsResult> {\n return pullProducts({\n ...options,\n maxRecords: options.sampleSize ?? BLING_SAMPLE_SIZE,\n maxPages: 1,\n // A sample never reconciles: it saw one page of one window and knows less\n // about absence than any other run in the system.\n linked: [],\n })\n}\n","// ---------------------------------------------------------------------------\n// The two ways Bling reaches US, and neither of them knows a tenant.\n// ---------------------------------------------------------------------------\n// 1. OAuth started at the PROVIDER. The shopkeeper authorises inside Bling's\n// extension centre, so the callback arrives with no `state` and possibly no\n// Fayz account behind it at all. The ingress presumes a tenant in the URL,\n// which is exactly the premise this breaks. The answer is a connection that\n// exists before a tenant does, keyed by the account Bling DID name, and\n// claimed at signup — this is an acquisition channel, not an edge case.\n//\n// 2. Webhooks. Bling announces an account, never a tenant, and requires a 2xx\n// within 5 seconds or it DISABLES the tenant's configuration. So the\n// response path verifies, routes and enqueues; it processes nothing.\n//\n// Both land on `provider_account_key` and its partial unique index in\n// packages/db/migrations/029_connections.sql. Pure functions, so the routing is\n// provable without a Bling account and without a secret anywhere near a fixture.\nimport { BLING_CONNECTOR_ID } from './limits'\n\n/** What the platform learned from a Bling OAuth callback. */\nexport interface BlingCallback {\n /** Present only when Fayz started the flow. Absent on the Bling-first path. */\n state?: string | null\n /** Bling's own id for the authorising account. The only stable handle we get. */\n companyId?: string | null\n}\n\nexport type CallbackRoute =\n /** Fayz started it: the state names the tenant, and the connection is theirs. */\n | { mode: 'tenant'; state: string; providerAccountKey: string | null }\n /**\n * Bling started it: park the grant against the account, claimable at signup.\n * `source` is what makes the channel measurable instead of anecdotal.\n */\n | { mode: 'orphan'; providerAccountKey: string; source: string }\n /** Nothing identifies the grant. Nothing can be done with it later either. */\n | { mode: 'reject'; reason: string }\n\n/** Where Bling-first connections are attributed from. */\nexport const BLING_MARKETPLACE_SOURCE = 'bling_marketplace'\n\n/**\n * Decide what a callback becomes. A missing `state` is NOT an error — treating\n * it as one throws away the shopkeeper who arrived from Bling's own storefront.\n */\nexport function routeCallback(callback: BlingCallback): CallbackRoute {\n const account = callback.companyId ? String(callback.companyId).trim() : ''\n if (callback.state) return { mode: 'tenant', state: callback.state, providerAccountKey: account || null }\n if (account) return { mode: 'orphan', providerAccountKey: account, source: BLING_MARKETPLACE_SOURCE }\n return { mode: 'reject', reason: 'callback carried neither state nor companyId' }\n}\n\n/** The identity an orphan connection is stored under until someone claims it. */\nexport function orphanConnection(route: Extract<CallbackRoute, { mode: 'orphan' }>) {\n return {\n connectorId: BLING_CONNECTOR_ID,\n // The Bling company is the account, so it is also the instance key: two\n // companies are two connections, not two rows fighting over one.\n instanceKey: route.providerAccountKey,\n providerAccountKey: route.providerAccountKey,\n status: 'pending' as const,\n settings: { companyId: route.providerAccountKey, source: route.source, stockOwner: 'bling' as const },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Webhooks\n// ---------------------------------------------------------------------------\n\nexport interface WebhookRequest {\n /** Raw body. Signed bytes, so it is verified before it is parsed. */\n body: string\n signature: string | null\n /** The account the event belongs to, read after verification. */\n providerAccountKey?: string | null\n}\n\nexport interface AcceptWebhookOptions {\n /**\n * Constant-time HMAC-SHA256 comparison, INJECTED. No key, no crypto import and\n * no fixture in this repo ever holds one — the secret lives in the platform\n * credential store and is handed to the edge function per call.\n */\n verify(body: string, signature: string | null): Promise<boolean> | boolean\n /** Find the tenant behind the account. Backed by uq_plg_connections_account_key. */\n resolve(providerAccountKey: string): Promise<{ tenantId: string; connectionId: string } | null>\n /** Hand the work to the queue. MUST NOT be awaited on the response path. */\n enqueue(job: { tenantId: string; connectionId: string; body: string }): Promise<void> | void\n onError?(error: unknown): void\n}\n\nexport interface WebhookVerdict {\n status: number\n /** Whether work was handed to the queue and is still outstanding. */\n queued: boolean\n reason?: string\n}\n\n/**\n * Answer Bling, then let the work happen.\n *\n * The 200 is not optimism: an unverified body was already rejected and a routed\n * job is already durable. What the 200 declines to wait for is the processing —\n * because a Bling webhook that has not been answered in 5 seconds does not\n * retry, it turns the tenant's integration off, and the tenant finds out weeks\n * later as \"Bling stopped working\".\n *\n * An unroutable account still answers 200. A 4xx there would make Bling disable\n * a configuration over an account we simply have not been given yet — the\n * orphan case above, arriving by webhook instead of by callback.\n */\nexport async function acceptWebhook(request: WebhookRequest, options: AcceptWebhookOptions): Promise<WebhookVerdict> {\n let ok = false\n try {\n ok = await options.verify(request.body, request.signature)\n } catch (error) {\n options.onError?.(error)\n ok = false\n }\n // The one refusal worth making: an unsigned body is not from Bling, and\n // answering 200 to it would let anyone move a tenant's stock.\n if (!ok) return { status: 401, queued: false, reason: 'signature' }\n\n const account = request.providerAccountKey ? String(request.providerAccountKey) : ''\n if (!account) return { status: 200, queued: false, reason: 'no account in payload' }\n\n let target: { tenantId: string; connectionId: string } | null = null\n try {\n target = await options.resolve(account)\n } catch (error) {\n options.onError?.(error)\n }\n if (!target) return { status: 200, queued: false, reason: 'unclaimed account' }\n\n try {\n await options.enqueue({ ...target, body: request.body })\n } catch (error) {\n options.onError?.(error)\n // Bling does not guarantee order and will re-deliver; a 5xx is the honest\n // answer when the job did not become durable, and it does not disable the\n // configuration the way a 4xx does.\n return { status: 500, queued: false, reason: 'enqueue failed' }\n }\n\n return { status: 200, queued: true }\n}\n","// ---------------------------------------------------------------------------\n// NeoChef's constraints — and the short list is itself the finding.\n// ---------------------------------------------------------------------------\n// Bling's limits file is long because a vendor API is a set of rules somebody\n// else chose: 3 req/s, a one-year filter ceiling, a code that dies in sixty\n// seconds, a webhook that must answer inside five. NeoChef is a Fayz app, so\n// the \"provider\" is our own tenant data plane, and almost none of that exists.\n//\n// What remains is real and worth declaring:\n//\n// the data plane is a shared platform, not a private one\n// → a budget, so one store's first sync does not become everyone's latency.\n// the access token lives an hour and refreshes by rotation\n// → renewal is scheduled, never at the deadline, and never in a loop.\n// `updated_at` is stamped at millisecond precision by Postgres\n// → the cursor still overlaps, for the same reason Bling's does: a row\n// changed inside the window's closing instant is otherwise invisible for\n// ever, and the cost of re-reading it is an idempotent upsert.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const NEOCHEF_CONNECTOR_ID = 'neochef'\n\n/**\n * Per connection.\n *\n * Not a limit NeoChef publishes — it is one we choose, because the far side is\n * a platform serving every other tenant too. A connector with no budget is a\n * connector whose worst day is someone else's outage.\n */\nexport const NEOCHEF_RATE_LIMIT: RateLimitBudget = { perSecond: 5, perDay: 50_000 }\n\n/** Rows per page on the data plane's row endpoints. */\nexport const NEOCHEF_PAGE_SIZE = 100\n\n/**\n * The first answer, and why it is one page.\n *\n * The same argument as Bling's, at a different speed: a connect screen must\n * settle in seconds, and a kitchen with a thousand products would otherwise\n * make the merchant watch a spinner to find out whether the connection worked.\n * The backfill finishes the mirror behind it.\n */\nexport const NEOCHEF_SAMPLE_SIZE = 100\n\n/** Re-read this much before the last cursor. See the header. */\nexport const NEOCHEF_CURSOR_OVERLAP_MS = 60_000\n\n/** Renew well before the hour is up — never at the deadline. */\nexport const NEOCHEF_TOKEN_LEAD_MS = 10 * 60_000\n","/**\n * NeoChef's mark, inlined.\n *\n * Same reasoning as `client-marks.ts` in @fayz-ai/admin: a brand a row wears\n * cannot fail to load, on an app served from anywhere. A first-party mark has\n * no reason to depend on a bucket being reachable.\n *\n * It is COMPOSED rather than copied, and that is the part worth knowing. The\n * app's own asset (`public/logo/neochef-icon.png`) is a MASK — the stroke is\n * white and the shape lives in the alpha channel, because the app paints it\n * with `currentColor` so one file serves the ink rail and the login card. Used\n * as an `<img>` that file is invisible on a light surface, which is what a\n * connector row is. So the hat sits on the brand's own turmeric (#e0a906),\n * giving the row a mark that is legible on both themes — the same shape the\n * consent screen shows, in a form a plain image tag can render.\n *\n * Replace with an `assets.fayz.ai/connectors/neochef.png` URL whenever the\n * bucket has one; nothing else has to change.\n */\nexport const NEOCHEF_MARK =\n 'data:image/png;base64,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'\n","// The one place that names the NeoChef data plane. Same split as Bling: the\n// definition declares WHAT the merchant can do, this file knows how the call is\n// made, and neither ever holds the credential.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n// Estes contadores LEEM o arquétipo (v_shop_*), não a cópia do plugin: pedido e\n// cliente pertencem à base desde 0009/0013, e a view é onde os dois lados\n// concordam. Os *_links continuam em plg_shop_* — o vínculo com o provedor\n// externo é genuinamente da loja.\n\n/** The edge function that holds every NeoChef call this connector makes. */\nexport const NEOCHEF_FUNCTION = 'neochef-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface NeoChefPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface NeoChefPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o NeoChef.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o NeoChef.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(NEOCHEF_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testNeoChef(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue and the stock down. `sample` is the first, fast answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<NeoChefPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send every paid order not filed yet, as an order in the kitchen. */\nexport function pushOrders(): Promise<NeoChefPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Both legs, in the order somebody does them on an ordinary day. */\nexport function reconcile(): Promise<{\n pull?: NeoChefPullResult\n push?: Record<string, NeoChefPushResult>\n}> {\n return invoke({ action: 'reconcile' })\n}\n\n/**\n * How many orders still have to go up.\n *\n * The same ABSENCE the function uses as its queue: a paid order with no link\n * row. Counted from here so the row can say \"em dia\" instead of offering a\n * button that would send nothing.\n */\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'neochef')\n .eq('kind', 'kitchen_order')\n const already = new Set(((linked ?? []) as any[]).map((row) => row.order_id))\n\n const { data, error } = await supabase\n .from('v_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return ((data ?? []) as any[]).filter((row) => !already.has(row.id)).length\n}\n\n/**\n * Record by record, for the automations screen.\n *\n * The managed automation says a paid order goes to the kitchen; this is what\n * says whether it arrived. Orders first and links second, so an order that has\n * NOT gone up still appears — a list built from links alone shows only the\n * successes, which reads as health.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('v_shop_orders')\n .select('id,order_number,paid_at,created_at,customer_name,status')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'neochef')\n .eq('kind', 'kitchen_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order): ConnectorDelivery => {\n const subject = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n const link = byOrder.get(order.id)\n if (link) {\n return {\n subject,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n ...(order.customer_name ? { detail: String(order.customer_name) } : {}),\n }\n }\n // A cancelled order is not late, it is excluded — saying \"pendente\" about\n // one would have the merchant waiting for something that will never go.\n if (String(order.status ?? '') === 'cancelled') {\n return {\n subject,\n subjectId: order.id,\n status: 'failed',\n detail: 'Cancelado — não sobe para a cozinha.',\n at: order.created_at,\n }\n }\n return {\n subject,\n subjectId: order.id,\n status: 'pending',\n detail: 'Ainda não subiu — vai na próxima sincronização.',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n","// NeoChef, connected the way any ERP is — and the first connector whose\n// provider is another Fayz app.\n//\n// That changes nothing the merchant can see, and it is worth saying why: the\n// connection still crosses an ORGANIZATION boundary, so it is still a grant a\n// person gives on NeoChef's own screen and can take back from there. Sharing a\n// deployment is not sharing a tenant.\n//\n// It ships no SQL. The connection is a row of connections and the history is\n// sync_runs, both through createConnectionStore.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { NEOCHEF_CONNECTOR_ID, NEOCHEF_RATE_LIMIT, NEOCHEF_SAMPLE_SIZE } from './limits'\nimport { NEOCHEF_MARK } from './mark'\nimport { listOrderDeliveries, pendingOrders, pullCatalogue, pushOrders, reconcile } from './data'\n\n/**\n * `settingsKeys` and not `fields`: nothing here is asked for in a form.\n *\n * The merchant authorizes on NeoChef's consent screen and comes back — which\n * kitchen, and what it is called, are learned from the grant. There is no\n * credential to route either: the platform holds it, and this connection has no\n * secret field to route in the first place.\n */\nexport const neoChefConnectionStore = () =>\n createConnectionStore(NEOCHEF_CONNECTOR_ID, {\n settingsKeys: ['kitchenId', 'backfillFrom', 'stockOwner'],\n })\n\nexport const neoChefConnectorDef: ConnectorDefinition = {\n id: NEOCHEF_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'NeoChef',\n description:\n 'Traz o cardápio, o preço e o estoque do NeoChef para a loja e devolve cada pedido pago como pedido na cozinha.',\n // The first question anyone connecting asks, answered before they connect.\n howItSyncs: [\n 'De tempos em tempos, sozinho: desce do NeoChef o que mudou lá e sobe o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada pedido guarda o número que recebeu na cozinha.',\n 'Produto desativado no NeoChef sai de venda na loja — nenhum produto é apagado.',\n ],\n icon: 'ChefHat',\n // The app's own mark, so the row wears the same face the consent screen does.\n // `icon` stays as the fallback the mark resolver advances to — see mark.ts.\n logoUrl: NEOCHEF_MARK,\n authKind: 'oauth',\n // `erp` and not `ecommerce`: NeoChef is the back office, not the storefront.\n // Same reading of §2 that moved Bling off the word 'commerce'.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://fayz.ai/docs/integrations/neochef',\n /**\n * The consent names these, entity by entity, on NeoChef's own screen — this\n * list is what the STORE says it will do with them, which is the other half\n * of the same sentence.\n *\n * `shop_product` is read as well as written because the catalogue is a\n * MIRROR: `reconcileMirror` has to see what is here before it can decide what\n * a product missing from a page means.\n */\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Trazer do NeoChef o cardápio, o preço e o saldo do estoque, comparando com o que já está na loja para não duplicar nem tirar de venda por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // `write` is the LINK, not the order: without it every sync would file the\n // same sale again.\n reason:\n 'Ler o pedido pago para lançá-lo na cozinha, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo para a cozinha.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não mandá-lo para a cozinha.',\n },\n ],\n // Declared, so the scheduler owns the clock. The budget is ours and not the\n // provider's — see limits.ts.\n rateLimit: NEOCHEF_RATE_LIMIT,\n // A connect screen that waits for a whole catalogue is a connect screen nobody\n // finishes, so the first load answers with a page and the backfill follows.\n firstLoad: { sampleSize: NEOCHEF_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // With underscores. `shop.order.paid` is not a key anything publishes — the\n // shop builds its facts as `shop.${def.event}` over SHOP_EMAIL_EVENTS.\n subscribesTo: ['shop.order_paid', 'shop.order_cancelled'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Mandar o pedido pago para a cozinha do NeoChef' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de mandar para a cozinha um pedido cancelado' },\n ],\n // What HAPPENS, not what is declared. Nothing here names a moment that has no\n // code behind it.\n invokedAt: [\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido na cozinha',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O cardápio, o preço e o estoque do NeoChef descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n NEOCHEF_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const kitchen = connection.settings?.kitchenId\n return {\n connected: connection.status === 'connected',\n detail: kitchen ? `Cozinha ${kitchen}` : undefined,\n plane: 'sync',\n }\n },\n { store: neoChefConnectionStore },\n ),\n // The whole connect step. Declaring `oauth` and no `startOAuth` is what renders\n // the Conectar button disabled with nothing on screen saying why.\n startOAuth: fayzConnectorOAuth(NEOCHEF_CONNECTOR_ID),\n // The other half of the consent: the platform stores the token and the pool\n // stores \"is it on?\". With nobody writing the second, the connector answers\n // \"não conectado\" to a merchant who has just authorized.\n saveConnection: async () => {\n await neoChefConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. A merchant who unplugs the kitchen still has\n // a store, and a connector that empties the catalogue on disconnect is one\n // nobody dares to disconnect.\n disconnect: async () => {\n await neoChefConnectionStore().disconnect()\n },\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n ...connectionRuns(neoChefConnectionStore),\n // The managed automation says a paid order goes to the kitchen; this says\n // whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no NeoChef e envia o que está pendente daqui — cardápio, preço, estoque e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do NeoChef`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer cardápio do NeoChef',\n direction: 'inbound',\n description: 'Preço e estoque do NeoChef passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos para a cozinha',\n direction: 'outbound',\n description:\n 'Cada pedido pago vira um pedido na cozinha. Pedido cancelado não sobe, e um já enviado não sobe duas vezes.',\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","// NeoChef ↔ store, both directions. Pure, so the agreement is testable without\n// a NeoChef tenant, an OAuth grant or a network.\nimport type {\n MirroredNeoChefProduct,\n NeoChefOrderRow,\n NeoChefProductRow,\n ShopOrderForNeoChef,\n} from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One NeoChef product as the mirror stores it, or null when it carries no id.\n *\n * `is_active` maps to archived and never to a delete. An inactive product in\n * the kitchen is still a product, and this connector has no vocabulary for\n * deletion at all — a store that empties its catalogue because a row left a\n * page is the failure `reconcileMirror` exists to prevent.\n */\nexport function toMirroredNeoChefProduct(\n raw: NeoChefProductRow | null | undefined,\n): MirroredNeoChefProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n\n // Two columns can say \"off\" and they disagree in practice: `is_active` is the\n // switch the UI toggles, `status` is the archetype's own word. Either one\n // saying off is off — reading only one is how a product the merchant retired\n // stays for sale in the store.\n const inactive = raw.is_active === false || String(raw.status ?? 'active').toLowerCase() === 'archived'\n\n return {\n externalId: String(raw.id),\n sku: raw.sku ? String(raw.sku) : null,\n name: String(raw.name ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.price),\n // The kitchen owns this number. The store mirrors it; it does not decide it.\n inventoryCount: toNumber(raw.stock),\n status: inactive ? 'archived' : 'active',\n imageUrl: raw.image_url ? String(raw.image_url) : null,\n // Unlike Bling, the far side DOES return its change stamp, so the cursor can\n // advance from the data instead of from the window we asked for.\n updatedAt: raw.updated_at ? String(raw.updated_at) : null,\n }\n}\n\n/**\n * A paid store order as a NeoChef order row.\n *\n * `kind` is the only real decision here: NeoChef's orders are `takeout` or\n * `delivery`, and which one a web order is depends on whether the buyer\n * collects. Guessing one would put every online sale on the wrong board in the\n * kitchen, so it is read from the order and defaults to delivery — the answer\n * that is wrong in the safer direction, since a delivery order nobody drives is\n * visible and a takeout order nobody prepared is not.\n */\nexport function toNeoChefOrder(order: ShopOrderForNeoChef): NeoChefOrderRow {\n return {\n kind: order.pickup === true ? 'takeout' : 'delivery',\n // The store's own number, so a human can match the two screens. Falls back\n // to the id rather than to empty: an order with no reference is unmatchable.\n reference_number: String(order.referenceNumber ?? order.id),\n // It arrives paid and confirmed — the store already took the money, and a\n // kitchen that has to re-confirm it is a kitchen doing the work twice.\n status: 'confirmed',\n total: toNumber(order.total),\n subtotal: toNumber(order.subtotal),\n notes: order.notes ? String(order.notes) : null,\n }\n}\n\n/**\n * The cursor for the next pull.\n *\n * The newest `updated_at` OBSERVED, minus an overlap, and never the clock: the\n * two sides do not share one, and a cursor taken from ours skips whatever the\n * far side stamped in between. Null when nothing carried a stamp, which asks\n * the next run to repeat the window rather than to invent one.\n */\nexport function advanceNeoChefCursor(\n products: MirroredNeoChefProduct[],\n overlapMs: number,\n): string | null {\n const stamps = products\n .map((product) => (product.updatedAt ? Date.parse(product.updatedAt) : NaN))\n .filter((value) => Number.isFinite(value))\n if (stamps.length === 0) return null\n return new Date(Math.max(...stamps) - overlapMs).toISOString()\n}\n","import type { AnalyticsCardDef, AnalyticsFilterDef, AnalyticsMeasure } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The retail analytics pack.\n//\n// Owned by plugin-shop because shop owns the DATA: \"sales by product\" means the\n// same thing whether the tenant is a salon or a storefront, and declaring it\n// once here beats copying it into every vertical's config. A vertical pack\n// curates this list (order, placement, labels); it does not restate it.\n//\n// Every card reads a registered read model from migration 0066 and goes through\n// the generic analytics_run engine — no card needs its own SQL. A card is at\n// the same time a tile on /analytics, a row in /analytics/reports and a full\n// report at /analytics/reports/<id>: one definition, three sizes, which is what\n// stops a headline KPI and the report behind it from disagreeing.\n// ---------------------------------------------------------------------------\n\nconst ORDERS = 'plg_shop_rep_orders'\nconst ITEMS = 'plg_shop_rep_order_items'\nconst CUSTOMERS = 'plg_shop_rep_customers'\nconst PRODUCTS = 'plg_shop_rep_products'\n\nconst CANONICAL = 'public.v_shop_orders'\n\n// --- Categories -------------------------------------------------------------\n// The chip on every report row and the grouping on the list. Declared once:\n// typing 'Vendas' in fourteen places is how a catalogue grows two categories\n// that differ by an accent.\n\nconst CAT = {\n sales: tl('Sales', 'Vendas'),\n orders: tl('Orders', 'Pedidos'),\n products: tl('Products', 'Produtos'),\n customers: tl('Customers', 'Clientes'),\n inventory: tl('Inventory', 'Estoque'),\n fulfillment: tl('Fulfillment', 'Entrega'),\n marketing: tl('Marketing', 'Marketing'),\n}\n\n// --- Shared filters, grouped for the categorized picker ---------------------\n\nconst financialStatus: AnalyticsFilterDef = {\n key: 'financial_status',\n label: tl('Payment status', 'Situação do pagamento'),\n type: 'multiselect',\n group: tl('Finance and payments', 'Financeiro e pagamentos'),\n options: [\n { label: tl('Paid', 'Pago'), value: 'paid' },\n { label: tl('Pending', 'Pendente'), value: 'pending' },\n { label: tl('Partially paid', 'Pago parcialmente'), value: 'partially_paid' },\n { label: tl('Refunded', 'Estornado'), value: 'refunded' },\n { label: tl('Partially refunded', 'Estornado parcialmente'), value: 'partially_refunded' },\n { label: tl('Voided', 'Cancelado'), value: 'voided' },\n ],\n}\n\nconst fulfillmentStatus: AnalyticsFilterDef = {\n key: 'fulfillment_status',\n label: tl('Fulfillment status', 'Situação da entrega'),\n type: 'multiselect',\n group: tl('Fulfillment', 'Entrega'),\n options: [\n { label: tl('Fulfilled', 'Enviado'), value: 'fulfilled' },\n { label: tl('Partially fulfilled', 'Enviado parcialmente'), value: 'partially_fulfilled' },\n { label: tl('Unfulfilled', 'Não enviado'), value: 'unfulfilled' },\n ],\n}\n\nconst orderStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Order status', 'Situação do pedido'),\n type: 'multiselect',\n group: tl('Orders', 'Pedidos'),\n options: [\n { label: tl('Open', 'Aberto'), value: 'open' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n { label: tl('Cancelled', 'Cancelado'), value: 'cancelled' },\n ],\n}\n\n// The items view carries the order's payment state under a prefixed name, so\n// the same picker narrows a line-item card without a second set of options.\nconst itemFinancialStatus: AnalyticsFilterDef = {\n ...financialStatus,\n key: 'order_financial_status',\n}\n\nconst productStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Product status', 'Situação do produto'),\n type: 'multiselect',\n group: tl('Inventory', 'Estoque'),\n options: [\n { label: tl('Active', 'Ativo'), value: 'active' },\n { label: tl('Draft', 'Rascunho'), value: 'draft' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n ],\n}\n\nconst orderFilters = [financialStatus, fulfillmentStatus, orderStatus]\n\n// --- Reusable measure fragments ---------------------------------------------\n\nconst M = {\n grossSales: { key: 'gross_sales', label: tl('Gross sales', 'Vendas brutas'), agg: 'sum', format: 'currency' },\n discounts: { key: 'discounts', label: tl('Discounts', 'Descontos'), agg: 'sum', format: 'currency' },\n netSales: { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), agg: 'sum', format: 'currency' },\n shipping: { key: 'shipping', label: tl('Shipping', 'Frete'), agg: 'sum', format: 'currency' },\n taxes: { key: 'taxes', label: tl('Taxes', 'Impostos'), agg: 'sum', format: 'currency' },\n total: { key: 'total', label: tl('Total sales', 'Vendas totais'), agg: 'sum', format: 'currency' },\n paid: { key: 'paid_total', label: tl('Collected', 'Recebido'), agg: 'sum', format: 'currency' },\n orders: { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count', format: 'number' },\n} satisfies Record<string, AnalyticsMeasure>\n\n/** Average order value — a ratio of two real measures, never an avg of ratios. */\nconst AOV: AnalyticsMeasure = {\n key: 'aov',\n label: tl('Average order value', 'Ticket médio'),\n agg: 'ratio',\n ratioOf: ['total', 'orders'],\n format: 'currency',\n}\n\nexport function buildShopAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'shop', canonicalOwner: CANONICAL, compare: true }\n\n return [\n // =======================================================================\n // Row 1 — the four numbers a merchant opens the page for\n // =======================================================================\n {\n ...base,\n id: 'shop.total-sales',\n name: tl('Total sales', 'Vendas totais'),\n description: tl(\n 'Gross sales less discounts, plus shipping and taxes. What the store billed, paid or not.',\n 'Vendas brutas menos descontos, mais frete e impostos. O que a loja faturou, pago ou não.',\n ),\n icon: 'CircleDollarSign',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 0 },\n },\n {\n // Deliberately beside Total sales and not instead of it. A store on Pix\n // bills long before it is paid, and a merchant reading only the first\n // number sees money they cannot spend.\n ...base,\n id: 'shop.collected',\n name: tl('Collected', 'Recebido'),\n description: tl(\n 'Of everything billed in the period, the part that is actually paid.',\n 'De tudo o que foi faturado no período, a parte que já está paga.',\n ),\n icon: 'Banknote',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.paid],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 1 },\n },\n {\n ...base,\n id: 'shop.orders',\n name: tl('Orders', 'Pedidos'),\n description: tl(\n 'Orders placed in the period, cancellations included.',\n 'Pedidos feitos no período, cancelados inclusive.',\n ),\n icon: 'ShoppingCart',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 2 },\n },\n {\n ...base,\n id: 'shop.aov',\n name: tl('Average order value', 'Ticket médio'),\n description: tl(\n 'Total sales over order count — the ratio of the totals, not the average of each order.',\n 'Vendas totais sobre número de pedidos — a razão dos totais, não a média de cada pedido.',\n ),\n icon: 'Receipt',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['aov'] },\n dashboard: { span: 1, order: 3 },\n },\n\n // =======================================================================\n // Row 2 — basket and loyalty\n // =======================================================================\n {\n ...base,\n id: 'shop.units-per-order',\n name: tl('Items per order', 'Itens por pedido'),\n description: tl(\n 'Units sold over distinct orders. Rises when cross-sell works.',\n 'Unidades vendidas sobre pedidos distintos. Sobe quando a venda casada funciona.',\n ),\n icon: 'Boxes',\n category: CAT.orders,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n measures: [\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n // count_distinct and not count(*): the row here is a LINE, and\n // counting lines would make \"items per order\" always exactly 1.\n { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count_distinct', column: 'order_id', format: 'number' },\n {\n key: 'units_per_order', label: tl('Items per order', 'Itens por pedido'),\n agg: 'ratio', ratioOf: ['units', 'orders'], format: 'number',\n },\n ],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', measures: ['units_per_order'] },\n dashboard: { span: 1, order: 4 },\n },\n {\n ...base,\n id: 'shop.units-sold',\n name: tl('Units sold', 'Unidades vendidas'),\n description: tl('Total units leaving the shelf in the period.', 'Total de unidades que saíram da prateleira no período.'),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' }],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 5 },\n },\n {\n ...base,\n id: 'shop.returning-customer-rate',\n name: tl('Returning customer rate', 'Taxa de recompra'),\n description: tl(\n 'Share of orders placed by someone who had ordered before.',\n 'Fatia dos pedidos feitos por quem já havia comprado antes.',\n ),\n icon: 'Repeat',\n category: CAT.customers,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'returning', label: tl('Returning orders', 'Pedidos de quem já comprou'), agg: 'sum', column: 'is_returning', format: 'number' },\n M.orders,\n {\n key: 'returning_rate', label: tl('Returning customer rate', 'Taxa de recompra'),\n agg: 'ratio', ratioOf: ['returning', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['returning_rate'] },\n dashboard: { span: 1, order: 6 },\n },\n {\n ...base,\n id: 'shop.cancellation-rate',\n name: tl('Cancellation rate', 'Taxa de cancelamento'),\n description: tl(\n 'Share of orders in the period that were cancelled.',\n 'Fatia dos pedidos do período que acabaram cancelados.',\n ),\n icon: 'XCircle',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'cancelled', label: tl('Cancelled orders', 'Pedidos cancelados'), agg: 'sum', column: 'is_cancelled', format: 'number' },\n M.orders,\n {\n key: 'cancellation_rate', label: tl('Cancellation rate', 'Taxa de cancelamento'),\n agg: 'ratio', ratioOf: ['cancelled', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['cancellation_rate'] },\n dashboard: { span: 1, order: 7 },\n },\n\n // =======================================================================\n // Row 3 — operations and what is sitting in the warehouse\n // =======================================================================\n {\n ...base,\n id: 'shop.days-to-fulfillment',\n name: tl('Time to dispatch', 'Tempo até o envio'),\n description: tl(\n 'Average time from order placed to first shipment. Orders never shipped are excluded, not counted as zero.',\n 'Tempo médio do pedido até a primeira remessa. Pedidos que nunca saíram ficam de fora, não entram como zero.',\n ),\n icon: 'Clock',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [{\n key: 'hours_to_fulfillment',\n label: tl('Time to dispatch', 'Tempo até o envio'),\n agg: 'avg',\n format: 'duration',\n }],\n filters: orderFilters,\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 8 },\n },\n {\n ...base,\n id: 'shop.discounts-given',\n name: tl('Discounts given', 'Descontos concedidos'),\n description: tl(\n 'What coupons and promotions cost the store in the period.',\n 'Quanto os cupons e promoções custaram à loja no período.',\n ),\n icon: 'TicketPercent',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.discounts],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 9 },\n },\n {\n // Snapshots: what is in the warehouse now, not what was created in the\n // last 30 days. `dateColumn: null` is what stops the range picker from\n // silently answering a different question.\n ...base,\n compare: false,\n id: 'shop.inventory-value',\n name: tl('Inventory value', 'Valor do estoque'),\n description: tl(\n 'Retail value of stock currently held. A snapshot — the date range does not apply.',\n 'Valor de venda do estoque parado hoje. É uma foto — o período selecionado não se aplica.',\n ),\n icon: 'Warehouse',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'inventory_retail_value', label: tl('Inventory value', 'Valor do estoque'), agg: 'sum', format: 'currency' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 10 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.out-of-stock',\n name: tl('Out of stock', 'Sem estoque'),\n description: tl(\n 'Active products with zero inventory — sales the storefront is turning away.',\n 'Produtos ativos com estoque zerado — vendas que a loja está recusando.',\n ),\n icon: 'PackageX',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'is_out_of_stock', label: tl('Out of stock', 'Sem estoque'), agg: 'sum', format: 'number' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 11 },\n },\n\n // =======================================================================\n // Charts — the shape behind the headline numbers\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-over-time',\n name: tl('Sales over time', 'Vendas ao longo do tempo'),\n description: tl(\n 'Billed against collected, bucketed by day, week or month depending on the range.',\n 'Faturado contra recebido, agrupado por dia, semana ou mês conforme o período.',\n ),\n icon: 'TrendingUp',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'area' },\n dashboard: { span: 2, order: 20 },\n },\n {\n ...base,\n id: 'shop.orders-over-time',\n name: tl('Orders over time', 'Pedidos ao longo do tempo'),\n description: tl('Order volume across the period.', 'Volume de pedidos ao longo do período.'),\n icon: 'Activity',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line' },\n dashboard: { span: 2, order: 21 },\n },\n {\n ...base,\n id: 'shop.sales-by-product',\n name: tl('Sales by product', 'Vendas por produto'),\n description: tl(\n 'Revenue per product at line-item grain, so a multi-product order counts once per line.',\n 'Receita por produto no grão da linha, então um pedido com vários produtos conta uma vez por linha.',\n ),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' },\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n ],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['revenue'], limit: 6 },\n dashboard: { span: 2, order: 22 },\n },\n {\n ...base,\n id: 'shop.sales-by-category',\n name: tl('Sales by category', 'Vendas por categoria'),\n description: tl('Revenue split across catalogue categories.', 'Receita dividida entre as categorias do catálogo.'),\n icon: 'FolderTree',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'category_name', label: tl('Category', 'Categoria') }],\n measures: [{ key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' }],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'donut' },\n dashboard: { span: 2, order: 23 },\n },\n {\n ...base,\n id: 'shop.sales-by-payment-status',\n name: tl('Sales by payment status', 'Vendas por situação do pagamento'),\n description: tl('Where the money sits: paid, pending, refunded.', 'Onde o dinheiro está: pago, pendente, estornado.'),\n icon: 'CreditCard',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'financial_status', label: tl('Payment status', 'Situação do pagamento') }],\n measures: [M.total, M.orders],\n filters: [orderStatus],\n defaultSort: 'total',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['total'] },\n dashboard: { span: 2, order: 24 },\n },\n {\n ...base,\n id: 'shop.orders-by-fulfillment-status',\n name: tl('Orders by fulfillment status', 'Pedidos por situação da entrega'),\n description: tl(\n 'How much of the period is still waiting to leave the warehouse.',\n 'Quanto do período ainda está esperando para sair do estoque.',\n ),\n icon: 'Truck',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'fulfillment_status', label: tl('Fulfillment status', 'Situação da entrega') }],\n measures: [M.orders, M.total],\n filters: [financialStatus, orderStatus],\n defaultSort: 'orders',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['orders'] },\n dashboard: { span: 2, order: 25 },\n },\n {\n ...base,\n id: 'shop.new-customers',\n name: tl('New customers', 'Novos clientes'),\n description: tl('Customers acquired in the period, by signup date.', 'Clientes conquistados no período, pela data de cadastro.'),\n icon: 'UserPlus',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'customers', label: tl('New customers', 'Novos clientes'), agg: 'count', format: 'number' }],\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'bar' },\n dashboard: { span: 2, order: 26 },\n },\n {\n ...base,\n id: 'shop.aov-over-time',\n name: tl('Average order value over time', 'Ticket médio ao longo do tempo'),\n description: tl(\n 'AOV per bucket, computed as that bucket’s total over its own order count.',\n 'Ticket médio por período, calculado como o total daquele período sobre os pedidos dele.',\n ),\n icon: 'LineChart',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line', measures: ['aov'] },\n dashboard: { span: 2, order: 27 },\n },\n\n // =======================================================================\n // Tables on the overview\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-breakdown',\n name: tl('Sales breakdown', 'Composição das vendas'),\n description: tl(\n 'The money chain: gross sales → discounts → net sales → shipping and taxes → total.',\n 'A cadeia do dinheiro: vendas brutas → descontos → vendas líquidas → frete e impostos → total.',\n ),\n icon: 'Layers',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.grossSales, M.discounts, M.netSales, M.shipping, M.taxes, M.total, M.paid],\n filters: orderFilters,\n },\n viz: { type: 'table' },\n dashboard: { span: 2, order: 30 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.low-stock',\n name: tl('Running low', 'Estoque acabando'),\n description: tl(\n 'The products closest to zero, lowest first. A snapshot — the date range does not apply.',\n 'Os produtos mais perto do zero, do menor para o maior. É uma foto — o período não se aplica.',\n ),\n icon: 'PackageMinus',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n ],\n // Active products only by default: a draft with no stock is not a\n // shortage, it is a product that was never put on sale.\n filters: [{ ...productStatus, defaultValue: ['active'] }],\n defaultSort: 'inventory_count',\n defaultSortDir: 'asc',\n },\n viz: { type: 'table', limit: 6 },\n dashboard: { span: 2, order: 31 },\n },\n\n // =======================================================================\n // Report-list only — the long tail, reachable from /analytics/reports\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-by-discount-code',\n name: tl('Sales by discount code', 'Vendas por cupom'),\n description: tl(\n 'Which coupons are actually being used, what they brought in and what they cost.',\n 'Quais cupons estão realmente sendo usados, o que trouxeram e o que custaram.',\n ),\n icon: 'TicketCheck',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'discount_code', label: tl('Discount code', 'Cupom') }],\n measures: [M.orders, M.discounts, M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'discounts',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.sell-through',\n name: tl('Sell-through by product', 'Giro por produto'),\n description: tl(\n 'Units sold as a share of everything ever held — sold plus still on hand. A snapshot; the date range does not apply.',\n 'Unidades vendidas sobre tudo o que já se teve — vendido mais o que está em estoque. É uma foto; o período não se aplica.',\n ),\n icon: 'Percent',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n // The denominator is a column on the read model, not sold+on-hand\n // recomputed here: summing the two separately and dividing is the same\n // arithmetic only while no product is missing from one of them.\n { key: 'units_ever_held', label: tl('Ever held', 'Total já tido'), agg: 'sum', format: 'number' },\n {\n key: 'sell_through', label: tl('Sell-through', 'Giro'),\n agg: 'ratio', ratioOf: ['units_sold', 'units_ever_held'], scale: 100, format: 'percent',\n },\n ],\n filters: [productStatus],\n defaultSort: 'units_sold',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.top-customers',\n name: tl('Top customers by spend', 'Melhores clientes'),\n description: tl(\n 'Lifetime spend per customer. A snapshot of the customer base, not of the period.',\n 'Gasto de vida por cliente. Uma foto da base, não do período.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dateColumn: null,\n dimensions: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n person: { idKey: 'customer_id', kind: 'shop_customer' },\n },\n // Grouped on but never shown. It is what the name links to — and also\n // what stops two customers called \"Silva\" from being reported as one.\n { key: 'customer_id', label: tl('Customer id', 'ID do cliente'), hidden: true },\n ],\n measures: [\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), agg: 'sum', format: 'currency' },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), agg: 'sum', format: 'number' },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), agg: 'avg', format: 'currency' },\n ],\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n\n // --- Detail listings: raw rows, sortable, searchable, exportable --------\n // No dimensions and no measures, which is what routes them past the\n // aggregate engine to a plain paged SELECT over the read model.\n {\n ...base,\n id: 'shop.orders-detail',\n name: tl('Order list', 'Lista de pedidos'),\n description: tl(\n 'Every order in the period with its money breakdown and both statuses.',\n 'Todos os pedidos do período com a composição do valor e as duas situações.',\n ),\n icon: 'ShoppingBag',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'customer_email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'financial_status', label: tl('Payment', 'Pagamento'), type: 'text' },\n { key: 'fulfillment_status', label: tl('Fulfillment', 'Entrega'), type: 'text' },\n { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.order-items-detail',\n name: tl('Sold items', 'Itens vendidos'),\n description: tl(\n 'Every line sold, joined to its product and category.',\n 'Cada linha vendida, ligada ao seu produto e categoria.',\n ),\n icon: 'List',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n filters: [itemFinancialStatus],\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'quantity', label: tl('Qty', 'Qtd'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'unit_price', label: tl('Unit price', 'Preço unit.'), type: 'currency' },\n { key: 'line_total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n compare: false,\n id: 'shop.products-detail',\n name: tl('Catalogue and stock', 'Catálogo e estoque'),\n description: tl(\n 'Every product with price, stock on hand and lifetime sales. A snapshot — the date range does not apply.',\n 'Cada produto com preço, estoque e vendas de vida. É uma foto — o período não se aplica.',\n ),\n icon: 'Boxes',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n filters: [productStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text' },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', sortable: true },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'revenue', label: tl('Revenue', 'Receita'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'inventory_retail_value', label: tl('Stock value', 'Valor em estoque'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.customers-detail',\n name: tl('Customer list', 'Lista de clientes'),\n description: tl(\n 'Customers acquired in the period, with what they have spent since.',\n 'Clientes conquistados no período, com o que gastaram desde então.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'created_at', label: tl('Since', 'Cliente desde'), type: 'date', sortable: true },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), type: 'currency', sortable: true },\n { key: 'last_order_at', label: tl('Last order', 'Último pedido'), type: 'date', sortable: true },\n ],\n },\n ]\n}\n","import React, { useEffect, useState } from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { errorMessage } from '../settings/error-message'\n\n/**\n * The store's content for a CATALOG product: its photos, which one is the\n * cover, and the way to the content library — mounted on the product record of\n * whichever plugin owns the catalog (stock, here), not only on the shop's own.\n *\n * `item.id` is the catalog product; the gallery belongs to the storefront\n * product behind it, which is looked up once.\n */\nexport function ProductContentTab({ item, getProvider, libraryHref = '#/content' }: {\n item: unknown\n getProvider: () => ShopProvider\n /** Where the whole library opens. */\n libraryHref?: string\n}) {\n const catalogId = (item as { id?: string } | null)?.id\n const [product, setProduct] = useState<Product | null | undefined>(undefined)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!catalogId) { setProduct(null); return }\n let alive = true\n setProduct(undefined)\n const provider = getProvider()\n const lookup = provider.getProductByCatalogId\n ? provider.getProductByCatalogId(catalogId)\n : provider.getProduct(catalogId)\n lookup\n .then((found) => { if (alive) setProduct(found) })\n .catch((err: unknown) => { if (alive) { setProduct(null); setError(errorMessage(err)) } })\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [catalogId])\n\n if (product === undefined) {\n return (\n <div className=\"space-y-4\" aria-busy=\"true\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-full max-w-lg\" />\n </div>\n <ul className=\"fz-cards gap-3\">\n {[0, 1, 2, 3].map((i) => (\n <li key={i} className=\"overflow-hidden rounded-lg border\">\n <Skeleton className=\"aspect-square w-full rounded-none\" />\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </li>\n ))}\n </ul>\n </div>\n )\n }\n\n if (!product) {\n return (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n {error ?? 'Este produto ainda não está na loja, então não tem galeria. Publique-o na loja para adicionar fotos.'}\n </p>\n )\n }\n\n return (\n <ProductImagesTab\n item={product}\n getProvider={getProvider}\n footer={(\n <p className=\"text-xs text-muted-foreground\">\n Estas fotos também aparecem em{' '}\n <a href={libraryHref} className=\"font-medium text-primary underline underline-offset-2 hover:opacity-80\">Conteúdo</a>\n , junto com as de todos os produtos.\n </p>\n )}\n />\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { buildShopOnboarding } from './lib/onboarding'\nimport { registerMessageDefaults, registerComponent } from '@fayz-ai/core'\nimport {\n setShopTenantResolver, getShopProvider, registerShippingLabelProvider,\n buildShopDomainEvents, buildShopMessageDefaults,\n} from '@fayz-ai/shop'\nimport { createMelhorEnvioLabelProvider } from './integrations/melhor-envio/labelProvider'\nimport { shopCustomerLookup } from './views/customerLookup'\nimport {\n useOrganizationStore, createCrudPage, registerEntityPath, registerPersonLookup, adminNavigateTo,\n registerCrudNavTabs,\n type CrudNavTab,\n} from '@fayz-ai/admin'\nimport {\n CircleDollarSign, CreditCard, Eye, FileEdit, FolderTree, Layers, Package, PackageX,\n ShoppingBag, Tag, TicketCheck, Users, UsersRound, UserX, Filter,\n} from 'lucide-react'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { DISCOUNT_CREATE_INSTRUCTIONS } from './views/discount-agent'\nimport { buildShopCategoryEntity } from './views/categoryEntity'\nimport { buildShopCollectionEntity } from './views/collectionEntity'\nimport { buildShopGiftCardEntity } from './views/giftCardEntity'\nimport { buildShopCustomerGroupEntity } from './views/customerGroupEntity'\nimport { buildShopCustomerSegmentEntity } from './views/customerSegmentEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopCategoryDataProvider } from './data/categoryDataProvider'\nimport { createShopCollectionDataProvider } from './data/collectionDataProvider'\nimport { createShopGiftCardDataProvider } from './data/giftCardDataProvider'\nimport { createShopCustomerGroupDataProvider } from './data/customerGroupDataProvider'\nimport { createShopCustomerSegmentDataProvider } from './data/customerSegmentDataProvider'\nimport type { ShopProviderResolver } from './views/ShopPage'\nimport {\n StoreGeneralSettings, PaymentsSettings, CheckoutSettings,\n ShippingSettings, FulfillmentSettings,\n} from './settings'\nimport { melhorEnvioConnectorDef } from './integrations/melhor-envio/connectorDef'\nimport { appmaxConnectorDef } from './integrations/appmax/connectorDef'\nimport { abacatePayConnectorDef } from './integrations/abacatepay/connectorDef'\nimport { stripeConnectConnectorDef } from './integrations/stripe-connect/connectorDef'\nimport { vindiConnectorDef } from './integrations/vindi/connectorDef'\nimport { mercadoPagoConnectorDef } from './integrations/mercadopago/connectorDef'\nimport { ContentPage } from './views/ContentPage'\nimport { blingConnectorDef } from './integrations/bling'\nimport { neoChefConnectorDef } from './integrations/neochef'\nimport { SHIPPING_ZONES_REGISTRY } from './data/registries'\nimport { shippingRegistryPath } from './data/registry-routes'\nimport { buildShopAnalyticsCards } from './analytics/cards'\n\nconst ShopPage = React.lazy(() => import('./views/ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Override the nav labels of the store's groups and their children. */\n sectionLabels?: Partial<Record<\n | 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n | 'collections' | 'categories' | 'giftCards' | 'content' | 'store' | 'emails'\n | 'customerGroups' | 'customerSegments' | 'stock', string>>\n /**\n * As partes da loja que este app publica. Só `products` é destacável hoje —\n * é a única que tem um concorrente legítimo em outro plugin.\n */\n modules?: {\n /**\n * O catálogo da vitrine (Produtos · Coleções · Categorias), sobre\n * `plg_shop_products`. Ligado por padrão. DESLIGUE quando o app já registra\n * produto em outro lugar: o Estoque mantém o cadastro-mestre em\n * `public.products`, e dois \"Produtos\" no mesmo rail, sobre duas tabelas,\n * é como o mesmo produto acaba cadastrado duas vezes, diferente.\n * Pedidos, clientes, conteúdo e descontos continuam de pé.\n */\n products?: boolean\n /**\n * The shop's own orders LIST at `/orders`. On by default. Turn it off when\n * the app mounts an orders list that already covers every sale of the\n * account: two plugins drawing `/orders` is one of them never showing.\n * The shop keeps `/orders/new`, `/orders/:id/edit` and its detail page,\n * which it offers through the `orders.detail` component slot.\n */\n orders?: boolean\n }\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n /** Heading the store's settings screens are grouped under in the settings\n * rail. Default 'Commerce'. */\n settingsGroupLabel?: string\n /**\n * Contribute the retail analytics catalogue. Default TRUE — a store that\n * cannot report on its own sales is not a store. Pass false where the host\n * app supplies its own pack, so the two do not stack.\n */\n analyticsCards?: false\n /**\n * Where the storefront is edited now that the app builder owns it. The old\n * \"Canais de venda\" screen pointed here instead of being kept alive as a\n * second, thinner way to type the store's address.\n */\n siteRoute?: string\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst LazyOrderDetail = React.lazy(() =>\n import('./views/ShopPage').then((m) => ({ default: m.ShopOrderDetailSlot })))\n\nfunction ShopOrderDetail(provider?: ShopProviderResolver) {\n const Detail: React.ComponentType<{ orderId: string; onBack: () => void; fallback: React.ReactNode }> = (props) =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(LazyOrderDetail, { ...props, provider }))\n Detail.displayName = 'ShopOrderDetail'\n return Detail\n}\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // O texto sugerido para cada fato. Os FATOS em si são declarados no\n // manifesto (`events`, abaixo): é de lá que webhook e auditoria leem, sem\n // passar por nada de mensageria.\n registerMessageDefaults(buildShopMessageDefaults())\n\n // Who can issue a label. Registered, not hard-coded: the order screen resolves\n // whichever carrier the store connected and calls the same four verbs.\n registerShippingLabelProvider(createMelhorEnvioLabelProvider(() =>\n (typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider())))\n\n // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n // Clientes is the standard registry: a store customer is a person the house\n // already knows, and `plg_shop_customers` hangs off `people` by `person_id`.\n registerEntityPath('shop_customer', '/customers')\n\n // And where to LOAD one from. A surface that only holds an id and a name — an\n // analytics cell — can now render the same card the order screen shows,\n // without every caller having to hand it the shop provider.\n registerPersonLookup('shop_customer', shopCustomerLookup(() => resolveProvider()))\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // Orders keep the bespoke ShopPage rather than a generic CRUD: an order is not\n // a CRUD record — it needs fulfilment, refunds and a line-item view.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const label = (key: keyof NonNullable<ShopPluginOptions['sectionLabels']>, fallback: string) =>\n options?.sectionLabels?.[key] ?? fallback\n\n // The heading the store's five settings screens are filed under. One constant\n // so the rail groups them: the shell keys the run off equal STRINGS, and five\n // hand-typed labels group as five sections the moment one of them is retyped.\n const COMMERCE_GROUP = options?.settingsGroupLabel ?? 'Commerce'\n\n // Each settings tab is a zero-prop component the shell instantiates, so the\n // props it actually needs (provider, currency) are closed over here. Named,\n // because an anonymous arrow makes every one of the five read as the same\n // frame in a React stack trace.\n const settingsTab = (\n name: string,\n render: () => React.ReactElement,\n ): React.ComponentType<unknown> => {\n const Tab: React.ComponentType<unknown> = () => render()\n Tab.displayName = name\n return Tab\n }\n\n // The header tab strip carries the STATUS FILTER of each list (Todos / Ativo /\n // Rascunho / Arquivado), declared per entity as `facets: [{ display: 'tabs' }]`.\n //\n // It deliberately does NOT carry sibling CRUDs here: the sidebar already lists\n // Produtos · Coleções · Categorias under \"Produtos\", and repeating those three\n // as tabs would give the same navigation twice on the same screen — two\n // controls that must be kept in sync and disagree the moment one is used. The\n // CrudListView `navTabs` slot exists for lists whose siblings are NOT in the\n // menu; nothing in this plugin is in that position.\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n // O produto da loja não tem tabela própria — vive atrás do provider de\n // commerce —, então as primitivas de dado do agente não o alcançam. A porta\n // funciona porque a lista empresta o próprio store: ver CrudAgentSurface.\n aiCreate: {\n hint: 'Descreva o produto…',\n description: 'Descreva o produto e eu cadastro.',\n intro: {\n role: 'operations',\n persona: 'Cadastro de produtos',\n pitch: 'Diga o produto que você quer cadastrar.',\n description:\n 'Nome, preço, descrição, estoque — diga o que souber, do jeito que falar, e eu preencho o resto com o que faz sentido. Nasce como rascunho e você confere antes de publicar.',\n suggestions: [\n { label: 'Camiseta preta, R$ 79, estoque 20' },\n { label: 'Cadastre 5 produtos de exemplo para eu testar a loja' },\n { label: 'Um combo com os dois produtos mais vendidos' },\n ],\n },\n },\n stats: (items, total) => [\n { id: 'total', label: 'Produtos', value: total, icon: Package },\n { id: 'active', label: 'Ativos', value: items?.filter((p) => p.status === 'active').length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((p) => p.status === 'draft').length ?? 0, icon: FileEdit },\n { id: 'out-of-stock', label: 'Sem estoque', value: items?.filter((p) => (p.inventoryCount ?? 0) <= 0).length ?? 0, icon: PackageX },\n ],\n })\n\n // Clientes / Grupos / Segmentos are three DIFFERENT CRUDs about the same\n // people, and only \"Clientes\" is in the sidebar — so here the header strip\n // carries siblings rather than a status filter, and duplicates no menu entry.\n const customerTabs = (): CrudNavTab[] => [\n { id: 'customers', label: label('customers', 'Clientes'), icon: Users,\n onSelect: () => adminNavigateTo('/customers') },\n { id: 'groups', label: label('customerGroups', 'Grupos'), icon: UsersRound,\n onSelect: () => adminNavigateTo('/customers/groups') },\n { id: 'segments', label: label('customerSegments', 'Segmentos'), icon: Filter,\n onSelect: () => adminNavigateTo('/customers/segments') },\n ]\n\n // A faixa aparece nas TRÊS telas, e a primeira delas é do cadastro padrão,\n // que é de outro plugin. Por isso o registro: a loja oferece as abas à rota\n // `/customers` sem que o plugin-crm precise conhecer a loja — e onde a loja\n // está desligada, Clientes simplesmente não ganha faixa.\n registerCrudNavTabs('/customers', customerTabs)\n\n const CustomerGroupsCrudPage = createCrudPage(buildShopCustomerGroupEntity(), {\n dataProvider: createShopCustomerGroupDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'groups',\n stats: (items, total) => [\n { id: 'total', label: 'Grupos', value: total, icon: UsersRound },\n {\n id: 'members', label: 'Clientes agrupados', icon: Users,\n // Distinct people, not the sum: someone in two groups is still one\n // customer, and a sum would report more members than the store has.\n value: new Set((items ?? []).flatMap((g) => g.customerIds ?? [])).size,\n },\n {\n id: 'empty', label: 'Grupos vazios', icon: UserX,\n value: items?.filter((g) => (g.customerIds?.length ?? 0) === 0).length ?? 0,\n },\n { id: 'segments', label: 'Segmentos', pending: 'Ver aba', icon: Filter },\n ],\n })\n\n const CustomerSegmentsCrudPage = createCrudPage(buildShopCustomerSegmentEntity(curr.code), {\n dataProvider: createShopCustomerSegmentDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'segments',\n stats: (items, total) => [\n { id: 'total', label: 'Segmentos', value: total, icon: Filter },\n {\n id: 'matched', label: 'Maior segmento', icon: Users,\n value: items?.length ? Math.max(...items.map((s) => s.matchCount ?? 0)) : 0,\n },\n {\n id: 'empty', label: 'Sem ninguém', icon: UserX,\n value: items?.filter((s) => (s.matchCount ?? 0) === 0).length ?? 0,\n },\n { id: 'groups', label: 'Grupos', pending: 'Ver aba', icon: UsersRound },\n ],\n })\n\n // A loja NÃO monta a própria lista de clientes: `/customers` é do cadastro\n // padrão, e `plg_shop_customers` pendura nele por `person_id`. A entidade\n // continua viva — `CustomerModal` a usa para abrir a ficha da loja de dentro\n // de um pedido, que é onde ela tem pergunta.\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n // O cupom vive atrás do provider de commerce, sem tabela que as primitivas\n // de dado do agente alcancem — então a lista empresta o próprio store, como\n // a de produtos faz (ver CrudAgentSurface).\n aiCreate: {\n hint: 'Descreva o cupom…',\n description: 'Descreva a promoção e eu crio o cupom.',\n // O código não se pergunta: ver DISCOUNT_CREATE_INSTRUCTIONS. `code` é\n // único no banco (0001:208), então a lista publica os que já existem e a\n // recusa do índice volta legível se dois turnos escolherem o mesmo.\n instructions: DISCOUNT_CREATE_INSTRUCTIONS,\n uniqueFields: ['code'],\n intro: {\n role: 'operations',\n persona: 'Cupons e promoções',\n pitch: 'Diga a promoção que você quer fazer.',\n description:\n 'Frete grátis, percentual ou valor fixo — diga a regra do jeito que você falaria com um cliente, '\n + 'e eu escrevo o código, o tipo, o mínimo e a validade. Só pergunto o tamanho do desconto quando você não disser.',\n suggestions: [\n { label: 'Frete grátis até o fim da semana' },\n { label: '10% na primeira compra, uma vez por cliente' },\n { label: 'R$ 50 off acima de R$ 300, limite de 100 usos' },\n ],\n },\n },\n stats: (items, total) => [\n { id: 'total', label: 'Total de cupons', value: total, icon: Tag },\n { id: 'active', label: 'Ativos agora', value: items?.filter((d) => d.status === 'active').length ?? 0, icon: Eye },\n { id: 'uses', label: 'Usos', value: items?.reduce((sum, d) => sum + (d.timesUsed ?? 0), 0) ?? 0, icon: TicketCheck },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((d) => d.status === 'draft').length ?? 0, icon: FileEdit },\n ],\n })\n\n // Zonas de entrega NÃO têm mais página própria: viraram registry dentro de\n // Configurações → Entrega (buildShippingZonesRegistry). O EntityDef e o\n // dataProvider continuam os mesmos — só o lugar onde a tela abre mudou, e o\n // que mudou é o que estava errado: clicar em \"Zonas\" no meio de configurar a\n // entrega tirava o lojista de Configurações.\n\n const CategoriesCrudPage = createCrudPage(buildShopCategoryEntity(), {\n dataProvider: createShopCategoryDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CollectionsCrudPage = createCrudPage(buildShopCollectionEntity(), {\n dataProvider: createShopCollectionDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Coleções', value: total, icon: Layers },\n { id: 'published', label: 'Publicadas', value: items?.filter((c) => c.published).length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((c) => !c.published).length ?? 0, icon: FileEdit },\n {\n id: 'members', label: 'Produtos agrupados', icon: Package,\n value: items?.reduce((sum, c) => sum + (c.productIds?.length ?? 0), 0) ?? 0,\n },\n ],\n })\n\n const GiftCardsCrudPage = createCrudPage(buildShopGiftCardEntity(curr.code), {\n dataProvider: createShopGiftCardDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => {\n const money = (v: number) =>\n new Intl.NumberFormat(curr.locale, { style: 'currency', currency: curr.code }).format(v)\n const active = items?.filter((g) => g.status === 'active') ?? []\n return [\n { id: 'total', label: 'Cartões emitidos', value: total, icon: CreditCard },\n { id: 'active', label: 'Ativos', value: active.length, icon: Eye },\n // Saldo em aberto é passivo: dinheiro já recebido que a loja ainda deve\n // em produto. É o número que a conciliação procura aqui.\n {\n id: 'outstanding', label: 'Saldo em aberto', icon: CircleDollarSign,\n value: money(active.reduce((sum, g) => sum + (g.balance ?? 0), 0)),\n },\n {\n id: 'issued', label: 'Valor emitido', icon: TicketCheck,\n value: money(items?.reduce((sum, g) => sum + (g.initialBalance ?? 0), 0) ?? 0),\n },\n ]\n },\n })\n\n const ContentPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ContentPage, { resolveProvider: options?.provider })\n ContentPageWrapped.displayName = 'ContentPage'\n\n\n\n\n\n\n\n\n\n // -------------------------------------------------------------------------\n // Nav + routes\n // -------------------------------------------------------------------------\n // Routes are top-level (/products, /orders, /discounts) rather than nested\n // under /shop, because the shell nests nav by route PREFIX and only one level\n // deep: with everything under /shop the whole store collapsed into a single\n // \"Loja\" accordion. Top-level parents give the store its real shape — Pedidos\n // with Clientes under it, Produtos with Coleções and Categorias under it.\n //\n // `indexChild: false` on a parent means the parent is a plain link with\n // children beside it; leaving it on repeats the parent as its own first child\n // (Pedidos ▸ Pedidos · Clientes), which is what a group whose index IS a\n // destination should do.\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\n const siteRoute = options?.siteRoute ?? '/site'\n\n type NavEntry = {\n route: string\n label: string\n icon: string\n position: number\n indexChild?: boolean\n component: React.ComponentType<unknown>\n }\n\n const NAV: NavEntry[] = [\n // Pedidos ▸ Pedidos · Clientes\n { route: '/orders', label: label('orders', 'Pedidos'), icon: 'ShoppingBag',\n position: navPosition, component: pageFor('orders') },\n // Sem Clientes aqui: o cadastro padrão já tem linha própria no rail, e uma\n // segunda porta para o mesmo assunto dentro da Loja era a duplicação que a\n // faixa de abas existe para evitar. Grupos e Segmentos continuam da loja,\n // agora pendurados em `/customers`.\n // Produtos ▸ Produtos · Coleções · Categorias\n { route: '/products', label: label('products', 'Produtos'), icon: 'Package',\n position: navPosition + 1, component: ProductsCrudPage as React.ComponentType<unknown> },\n { route: '/products/collections', label: label('collections', 'Coleções'), icon: 'Layers',\n position: navPosition + 1.1, component: CollectionsCrudPage as React.ComponentType<unknown> },\n { route: '/products/categories', label: label('categories', 'Categorias'), icon: 'FolderTree',\n position: navPosition + 1.2, component: CategoriesCrudPage as React.ComponentType<unknown> },\n\n\n // Conteúdo — a biblioteca de arquivos (sem filhos).\n { route: '/content', label: label('content', 'Conteúdo'), icon: 'Image',\n position: navPosition + 2, indexChild: false, component: ContentPageWrapped },\n\n // Descontos ▸ Descontos · Gift Cards\n { route: '/discounts', label: label('discounts', 'Descontos'), icon: 'Tag',\n position: navPosition + 3, component: DiscountsCrudPage as React.ComponentType<unknown> },\n { route: '/discounts/gift-cards', label: label('giftCards', 'Gift Cards'), icon: 'CreditCard',\n position: navPosition + 3.1, component: GiftCardsCrudPage as React.ComponentType<unknown> },\n\n ]\n\n // Reachable but not in the nav.\n // `title` + `parentRoute` são a definição de página: a barra da shell escreve\n // o título e desenha o \"←\" a partir daqui. Sem isso, uma tela fora do menu\n // casava só com o prefixo do pai e era rotulada com o nome dele — \"Pedidos\"\n // numa tela que não é a lista de pedidos —, e cada página acabava desenhando\n // a própria seta de voltar.\n const HIDDEN_ROUTES: Array<{\n path: string\n component: React.ComponentType<unknown>\n title?: string\n parentRoute?: string\n }> = [\n // Reached from the Clientes tab strip, deliberately not from the menu:\n // three sidebar entries for one destination is the duplication the tab\n // strip exists to avoid.\n //\n // Penduradas em `/customers`, e não numa Clientes própria da loja: a ficha\n // de quem compra é UMA — `plg_shop_customers` pendura em `people` por\n // `person_id`, e o cadastro padrão já é a lista canônica. Grupo e segmento\n // são recortes DAQUELAS pessoas, então moram ao lado delas; a loja continua\n // dona das duas telas, só não abre uma segunda porta para o mesmo assunto.\n { path: '/customers/groups', component: CustomerGroupsCrudPage as React.ComponentType<unknown>,\n title: label('customerGroups', 'Grupos'), parentRoute: '/customers' },\n { path: '/customers/segments', component: CustomerSegmentsCrudPage as React.ComponentType<unknown>,\n title: label('customerSegments', 'Segmentos'), parentRoute: '/customers' },\n ]\n\n // Where the store used to live. These REDIRECT rather than mounting the page\n // a second time: a generated CRUD page carries ONE `__crudBasePath`, so\n // mounting the same component at two paths left it with whichever was\n // registered last — and /orders/customers/new then resolved against\n // /customers and silently rendered the list instead of the form.\n const redirectTo = (target: string): React.ComponentType<unknown> => {\n const Redirect: React.ComponentType<unknown> = () => {\n React.useEffect(() => { adminNavigateTo(target) }, [])\n return null\n }\n Redirect.displayName = `Redirect(${target})`\n return Redirect\n }\n\n const LEGACY_ROUTES: Array<{ path: string; component: React.ComponentType<unknown> }> = [\n { path: '/shop', component: redirectTo('/products') },\n { path: '/shop/products', component: redirectTo('/products') },\n { path: '/shop/orders', component: redirectTo('/orders') },\n { path: '/shop/discounts', component: redirectTo('/discounts') },\n // As duas rotas antigas das zonas apontam para onde o cadastro passou a\n // viver. Existem em favorito e em link — tirá-las daria 404 para quem já\n // sabia o caminho.\n // Os dois redirects apontavam para `_properties/zonas`, que deixou de existir\n // quando o id virou slug em inglês — um link antigo caía numa aba vazia. A\n // rota vem do mesmo lugar que a tela usa.\n { path: '/shop/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store', component: redirectTo(siteRoute) },\n { path: '/shop/channels', component: redirectTo(siteRoute) },\n // A seta virou: `/customers` é do cadastro padrão, que toda conta tem com\n // ou sem loja. Era a loja que sequestrava a linha Clientes do rail — quem\n // clicava no cadastro de fora aterrissava dentro da loja.\n { path: '/orders/customers', component: redirectTo('/customers') },\n // A mensageria da loja virou parte de Automações — mesmos eventos, agora ao\n // lado dos do CRM e da agenda, e com WhatsApp além do e-mail.\n { path: '/emails', component: redirectTo('/automations') },\n { path: '/emails/:event', component: redirectTo('/automations') },\n ]\n\n // O catálogo da vitrine só entra quando o app não tem outro dono de produto.\n // As rotas saem junto com as linhas do rail: uma rota montada fora do menu\n // continua alcançável pela busca e pelo link antigo, e o cadastro duplicado\n // voltaria por ali.\n const withProducts = options?.modules?.products !== false\n const isProductRoute = (route: string) => route === '/products' || route.startsWith('/products/')\n const withOrders = options?.modules?.orders !== false\n const ACTIVE_NAV = NAV.filter((entry) =>\n (withProducts || !isProductRoute(entry.route)) && (withOrders || entry.route !== '/orders'))\n // Explicit, so they outrank any `/orders/:id` another plugin mounts — \"new\"\n // is a screen, not an order whose id happens to be \"new\".\n const ORDER_FORM_ROUTES = [\n { path: '/orders/new', component: pageFor('orders') },\n { path: '/orders/:id/edit', component: pageFor('orders') },\n ]\n // Plain id on purpose: importing it would make the orders plugin a\n // dependency of every shop.\n registerComponent('orders.detail', ShopOrderDetail(options?.provider))\n const ACTIVE_LEGACY = withProducts\n ? LEGACY_ROUTES\n // `/shop` e `/shop/products` apontavam para um destino que deixou de\n // existir; mandar para Pedidos é onde a loja de fato começa sem catálogo.\n : LEGACY_ROUTES.map((r) =>\n r.path === '/shop' || r.path === '/shop/products'\n ? { path: r.path, component: redirectTo('/orders') }\n : r)\n\n const READ: { feature: 'shop'; action: 'read' } = { feature: 'shop', action: 'read' }\n\n return {\n id: 'shop',\n defaultAgentRole: 'operations',\n // O que a loja pede de um tenant novo, na ordem em que faz diferença.\n // Vira linha de tarefa, aparece no checklist da trilha e é o roteiro que o\n // assistente segue — ver ./lib/onboarding.ts.\n onboarding: { program: buildShopOnboarding(siteRoute, withProducts) },\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: ACTIVE_NAV.map((entry) => ({\n section: navSection,\n position: entry.position,\n label: entry.label,\n route: entry.route,\n icon: entry.icon,\n permission: READ,\n ...(entry.indexChild === false ? { indexChild: false as const } : {}),\n })),\n routes: [\n ...ACTIVE_NAV.map((entry) => ({ path: entry.route, component: entry.component, permission: READ })),\n ...ORDER_FORM_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...HIDDEN_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...ACTIVE_LEGACY.map((r) => ({ ...r, permission: READ })),\n ],\n widgets: [],\n // Os ~28 cards de varejo. Ficam AQUI porque quem é dono do dado é dono do\n // número: \"vendas por produto\" quer dizer a mesma coisa numa loja e num\n // salão, e o plugin de Análises só sabe desenhar — ele não sabe o que é uma\n // venda. Cada card é ao mesmo tempo um bloco do painel, uma linha da lista\n // de relatórios e um relatório inteiro, então o KPI e o relatório atrás dele\n // não têm como discordar.\n analyticsCards: options?.analyticsCards === false ? [] : buildShopAnalyticsCards(),\n // Os fatos que a loja emite. Lidos por três consumidores — automações,\n // integrações e auditoria — e agregados pelo runtime só quando o plugin\n // está ATIVO, para um módulo desligado não anunciar eventos que não vêm.\n events: buildShopDomainEvents(),\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n // A loja não é UM ajuste. Era uma aba só, «Shop», com moeda, catálogo,\n // checkout e notificações empilhados num scroll — e nenhum deles gravava\n // nada. São cinco decisões de naturezas diferentes: quem cobra, quem pode\n // comprar, quanto custa entregar, quando a remessa nasce, e como a vitrine\n // se apresenta. Cada uma é uma tela, e as cinco se agrupam sob COMMERCE\n // (`group`), que é o que a rail de configurações passou a saber desenhar.\n //\n // `id: 'shop'` fica com a tela geral: /settings/shop é uma URL que já\n // existe, em favoritos e em links, e renumerá-la para ganhar simetria de\n // nomes seria quebrar o que funciona por estética.\n settings: [\n {\n id: 'shop',\n label: label('store', 'Loja'),\n icon: 'ShoppingBag',\n group: COMMERCE_GROUP,\n component: settingsTab('StoreGeneralSettings', () =>\n React.createElement(StoreGeneralSettings, { currency: curr, provider: options?.provider })),\n order: 30,\n permission: READ,\n },\n {\n id: 'shop-payments',\n label: 'Pagamentos',\n icon: 'CreditCard',\n group: COMMERCE_GROUP,\n component: settingsTab('PaymentsSettings', () =>\n React.createElement(PaymentsSettings, { provider: options?.provider })),\n order: 31,\n permission: READ,\n },\n {\n id: 'shop-checkout',\n label: 'Checkout',\n icon: 'ShoppingCart',\n group: COMMERCE_GROUP,\n component: settingsTab('CheckoutSettings', () =>\n React.createElement(CheckoutSettings, { provider: options?.provider })),\n order: 32,\n permission: READ,\n },\n {\n id: 'shop-shipping',\n label: label('shipping', 'Entrega'),\n icon: 'Truck',\n group: COMMERCE_GROUP,\n component: settingsTab('ShippingSettings', () =>\n React.createElement(ShippingSettings, { provider: options?.provider })),\n order: 33,\n permission: READ,\n },\n {\n id: 'shop-fulfillment',\n label: 'Fulfillment',\n icon: 'PackageCheck',\n group: COMMERCE_GROUP,\n component: settingsTab('FulfillmentSettings', () =>\n React.createElement(FulfillmentSettings, { provider: options?.provider })),\n order: 34,\n permission: READ,\n },\n ],\n // The store's stack, configured where the store is configured — zero new\n // screens (commerce-stack.md §0). Melhor Envio, AppMax and AbacatePay are\n // REQUEST-plane connectors: the buyer is waiting, so each declares a latency\n // budget and, because the carrier and the gateways want opposite answers to\n // the same failure, its own `onFailure`. Bling and NeoChef are the SYNC-plane\n // ones — nobody is waiting on them, and what they declare instead is a call\n // budget and a cursor.\n //\n // Four gateways on the shelf is the point: the store picks one, and each\n // one arriving changed no contract — only how it authorizes. Mercado Pago\n // pushes that furthest, because it is the first whose CARD is paid inside\n // the store: it tokenises in the browser, so there is no PAN for an edge\n // function to hold and no redirect to send the buyer through. The shelf\n // absorbed that too, as a capability the checkout reads rather than a branch\n // it hard-codes. NeoChef makes the same point about the back office, and one\n // better: its provider is another Fayz app, and it still fits without a\n // special case.\n connectors: [\n melhorEnvioConnectorDef,\n appmaxConnectorDef,\n abacatePayConnectorDef,\n stripeConnectConnectorDef,\n vindiConnectorDef,\n mercadoPagoConnectorDef,\n blingConnectorDef,\n neoChefConnectorDef,\n ],\n // What having a store makes plugable — the ones above plus the ones still\n // to be built. Carried over from the Fayz plugin page's \"Integra com\" row,\n // minus Nuvemshop: the platform catalogue has no row for it, and a slug the\n // directory cannot back is refused rather than shown.\n integrations: ['shopify', 'stripe'],\n }\n}\n\nexport * from './integrations/bling'\nexport * from './integrations/neochef'\n\n// The retail pack, exported so an app can curate it — reorder the overview,\n// relabel a card, drop one — by re-declaring an id in the analytics plugin's\n// `cards`, instead of forking the plugin to change one word.\nexport { ProductContentTab } from './views/ProductContentTab'\nimport type { DetailTab } from '@fayz-ai/core'\nimport type { ShopProvider as ShopProviderForTab } from '@fayz-ai/shop'\nimport { ProductContentTab as ProductContentTabView } from './views/ProductContentTab'\n\n/**\n * The \"Conteúdo\" tab for a product record owned by another plugin: the app\n * hands it to that plugin's own tab option. The shop offers; the app composes.\n */\nexport function shopProductContentTab(options: {\n provider: () => ShopProviderForTab\n /** Where the content library lives in this app. */\n libraryHref?: string\n label?: string\n}): DetailTab {\n return {\n id: 'content',\n label: options.label ?? 'Conteúdo',\n icon: 'Image',\n component: ProductContentTabView as never,\n props: { getProvider: options.provider, libraryHref: options.libraryHref ?? '#/content' },\n }\n}\n\nexport { buildShopAnalyticsCards } from './analytics/cards'\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n\n// The store's stack on the request plane. Exported so an app can offer one and\n// not the other, and so the ConnectorsHub in a bespoke admin can render them.\nexport { melhorEnvioConnectorDef, MELHOR_ENVIO_CONNECTOR_ID, MELHOR_ENVIO_LATENCY_BUDGET_MS } from './integrations/melhor-envio/connectorDef'\nexport { appmaxConnectorDef, APPMAX_CONNECTOR_ID, APPMAX_LATENCY_BUDGET_MS } from './integrations/appmax/connectorDef'\nexport { abacatePayConnectorDef, ABACATEPAY_CONNECTOR_ID, ABACATEPAY_LATENCY_BUDGET_MS } from './integrations/abacatepay/connectorDef'\nexport { stripeConnectConnectorDef, STRIPE_CONNECT_CONNECTOR_ID, STRIPE_CONNECT_LATENCY_BUDGET_MS } from './integrations/stripe-connect/connectorDef'\nexport { vindiConnectorDef, VINDI_CONNECTOR_ID, VINDI_LATENCY_BUDGET_MS } from './integrations/vindi/connectorDef'\nexport { mercadoPagoConnectorDef, MERCADOPAGO_CONNECTOR_ID, MERCADOPAGO_LATENCY_BUDGET_MS } from './integrations/mercadopago/connectorDef'\n"]}
1
+ {"version":3,"sources":["../src/lib/onboarding.ts","../src/integrations/melhor-envio/labelProvider.ts","../src/views/ProductImagesTab.tsx","../src/views/ProductVariantsTab.tsx","../src/views/stock-agent.ts","../src/views/ProductPositionsTab.tsx","../src/data/registry-routes.ts","../src/views/PackageSelect.tsx","../src/views/ShippingProfileSelect.tsx","../src/views/productEntity.tsx","../src/views/discountEntity.tsx","../src/views/discount-agent.ts","../src/views/categoryEntity.tsx","../src/views/collectionEntity.tsx","../src/views/giftCardEntity.tsx","../src/views/customerGroupEntity.tsx","../src/views/customerSegmentEntity.tsx","../src/data/productDataProvider.ts","../src/data/discountDataProvider.ts","../src/data/categoryDataProvider.ts","../src/data/collectionDataProvider.ts","../src/data/giftCardDataProvider.ts","../src/data/customerGroupDataProvider.ts","../src/data/customerSegmentDataProvider.ts","../src/settings/useStoreSettings.ts","../src/settings/SettingsState.tsx","../src/settings/StoreGeneralSettings.tsx","../src/settings/payment-provider.ts","../src/settings/PaymentProviderRow.tsx","../src/settings/PaymentsSettings.tsx","../src/settings/CheckoutSettings.tsx","../src/settings/PackagesSettings.tsx","../src/settings/HandlingSettings.tsx","../src/settings/ChoiceCards.tsx","../src/views/delivery-draft.ts","../src/views/delivery-agent.ts","../src/views/DeliveryAgentSurface.tsx","../src/views/DeliveryAreaPicker.tsx","../src/views/DeliveryRulesDraft.tsx","../src/settings/ShippingSettings.tsx","../src/settings/FulfillmentSettings.tsx","../src/settings/MarketsSettings.tsx","../src/integrations/melhor-envio/connectorDef.tsx","../src/integrations/appmax/connectorDef.tsx","../src/integrations/abacatepay/data.ts","../src/integrations/abacatepay/connectorDef.tsx","../src/integrations/stripe-connect/connectorDef.tsx","../src/integrations/vindi/connectorDef.tsx","../src/integrations/mercadopago/connectorDef.tsx","../src/views/media-links.ts","../src/views/ContentPage.tsx","../src/integrations/bling/limits.ts","../src/integrations/bling/data.ts","../src/integrations/bling/connectorDef.tsx","../src/integrations/neochef/limits.ts","../src/integrations/neochef/mark.ts","../src/integrations/neochef/data.ts","../src/integrations/neochef/connectorDef.tsx","../src/analytics/cards.ts","../src/integrations/bling/mapping.ts","../src/integrations/bling/sync.ts","../src/integrations/bling/inbound.ts","../src/integrations/neochef/mapping.ts","../src/views/ProductContentTab.tsx","../src/views/ProductMarketPricesTab.tsx","../src/index.ts"],"names":["resolve","update","React","jsx","jsxs","DetailTabHeader","Button","Plus","draft","IconButton","field","errorMessage","store","stockStore","resolveStockStore","getActiveTenantId","createSupabaseStockStore","useState","useEffect","listStockReasonCodes","amount","Fragment","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Modal","ModalContent","ModalHeader","ModalTitle","ModalDescription","Input","ModalFooter","getShopProvider","adminNavigateTo","STATUS_TONE","formatCurrency","STATUS_LABEL","money","AlertTriangle","Skeleton","Loader2","SettingsGroup","ToggleRow","SelectRow","React9","text","React10","useAgentSurface","DEBOUNCE_MS","Check","Trash2","X","parseMoney","useConnectors","useConnectorsPanelAvailable","openConnectorsPanel","outcomeOf","RegistryCrudView","TextRow","ArrowRight","MapPin","ConnectorDetail","createConnectionStore","fayzConnectorOAuth","connectionStatus","settingsStatus","connectionSettings","message","METHOD_LABELS","methodsDetail","connectionDetail","toast","nextId","AskAIButton","Package","client","getSupabaseClientOptional","invoke","getShopTenantId","connectorRuntimeToken","CONNECTOR_RUNTIME_TOKEN_HEADER","pushCatalogue","pullCatalogue","pushOrders","reconcile","pendingOrders","listOrderDeliveries","connectionRuns","toNumber","useMemo","Layers"],"mappings":";;;;;;;;;;;;;AAgBO,SAAS,mBAAA,CACd,SAAA,GAAY,OAAA,EAMZ,YAAA,GAAe,IAAA,EACO;AACtB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,6JAAA,CAAA;AAAA,IAOd,KAAA,EAAQ;AAAA,MACN;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,+BAAA;AAAA,QACP,WAAA,EAAa,6EAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA;AAAA;AAAA,QAGV,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EACE,6IAAA;AAAA,QACF,KAAA,EACE,+SAAA;AAAA,QACF,SAAA,EAAW,yBAAA;AAAA;AAAA;AAAA,QAGX,MAAA,EAAQ;AAAA,UACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,qEAAA,EAAgE;AAAA,UACrF,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY;AAAA,UACnC;AAAA,YACE,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA;AAAA;AAAA;AAAA,YAIE,IAAA,EAAM,QAAA;AAAA,YACN,EAAA,EAAI,kBAAA;AAAA,YACJ,QAAA,EAAU,4CAAA;AAAA,YACV,OAAA,EAAS;AAAA,cACP,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,oBAAA,EAAsB,MAAM,yCAAA,EAAuC;AAAA,cAC1F,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,2BAAA,EAAuB,MAAM,qCAAA,EAAmC;AAAA,cACvF;AAAA,gBACE,EAAA,EAAI,SAAA;AAAA,gBACJ,KAAA,EAAO,yBAAA;AAAA,gBACP,IAAA,EAAM;AAAA;AACR;AACF;AACF,SACF;AAAA,QACA,KAAA,EAAO,YAAa,MAAM,aAAA,CAAc,mBAAmB,CAAA,GAAK,CAAA;AAAA,QAChE,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,cAAA;AAAA,UACJ,KAAA,EAAO;AAAA,YACL;AAAA,cACE,MAAA,EAAQ,YAAA;AAAA,cACR,KAAA,EAAO,gCAAA;AAAA,cACP,IAAA,EAAM,gGAAA;AAAA,cACN,KAAA,EAAO,WAAA;AAAA,cACP,WAAA,EAAa;AAAA,aACf;AAAA,YACA;AAAA,cACE,MAAA,EAAQ,eAAA;AAAA,cACR,KAAA,EAAO,0BAAA;AAAA,cACP,IAAA,EAAM;AAAA;AACR;AACF;AACF,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO,2BAAA;AAAA,QACP,WAAA,EAAa,sFAAA;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA;AAAA;AAAA,QAGV,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EACE,mIAAA;AAAA,QACF,KAAA,EACE,yOAAA;AAAA,QACF,SAAA,EAAW,uBAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,wEAAA,EAA8D;AAAA,UACnF,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,UACjC;AAAA,YACE,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,yBAAA;AAAA,QACP,WAAA,EAAa,mEAAA;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,yBAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,SAAA,EACE,0HAAA;AAAA,QACF,KAAA,EACE,wPAAA;AAAA,QACF,SAAA,EAAW,gCAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,yBAAA,EAA0B;AAAA,UACjD;AAAA,YACE,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,qBAAA;AAAA,QACP,WAAA,EAAa,uCAAA;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,yBAAA;AAAA,QACP,SAAA,EACE,+IAAA;AAAA,QACF,KAAA,EACE,kMAAA;AAAA,QACF,SAAA,EAAW,+BAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,yBAAA,EAA0B;AAAA,UACjD;AAAA,YACE,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,MACA;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,2BAAA;AAAA,QACP,WAAA,EAAa,0DAAA;AAAA,QACb,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,KAAA;AAAA,QACV,SAAA,EACE,oIAAA;AAAA,QACF,KAAA,EACE;AAAA,OACJ;AAAA,MACA;AAAA,QACE,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,4BAAA;AAAA,QACP,WAAA,EAAa,yDAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EACE,+HAAA;AAAA,QACF,KAAA,EACE,0PAAA;AAAA,QACF,SAAA,EAAW,yCAAA;AAAA,QACX,MAAA,EAAQ;AAAA,UACN;AAAA,YACE,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACR;AAAA,UACA,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,UACjC;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,MAAA,EAAQ,aAAA;AAAA,YACR,KAAA,EAAO,sBAAA;AAAA,YACP,IAAA,EAAM,mFAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,KAAA,EAAO,YAAa,MAAM,aAAA,CAAc,eAAe,CAAA,GAAK,CAAA;AAAA,QAC5D,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,aAAA;AAAA,UACJ,KAAA,EAAO;AAAA,YACL;AAAA,cACE,MAAA,EAAQ,aAAA;AAAA,cACR,KAAA,EAAO,sBAAA;AAAA,cACP,IAAA,EAAM,mFAAA;AAAA,cACN,KAAA,EAAO;AAAA;AACT;AACF;AACF;AACF,MACkC,MAAA,CAAO,CAAC,MAAM,YAAA,IAAgB,CAAA,CAAE,QAAQ,SAAS;AAAA,GACvF;AACF;;;AChNO,IAAM,oBAAA,GAAuB,cAAA;AAE7B,SAAS,+BACdA,QAAAA,EACuB;AACvB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,IAAI,MAAM,uDAAoD,CAAA;AAAA,EACtE,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,oBAAA;AAAA,IACJ,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,QAAAA,GAAU,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM,WAAA,EAAY;AAAA,IACvF,GAAA,EAAK,OAAO,OAAA,EAAS,SAAA,KAClB,MAAMA,QAAAA,EAAQ,CAAE,gBAAA,GAAmB,OAAA,EAAS,SAAA,EAAW,oBAAoB,CAAA,IAAM,WAAA,EAAY;AAAA,IAChG,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,UAAQ,CAAE,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM,IAAA;AAAA,IAC3E,KAAA,EAAO,OAAO,OAAA,KACX,MAAMA,UAAQ,CAAE,kBAAA,GAAqB,OAAA,EAAS,oBAAoB,CAAA,IAAM;AAAA,GAC7E;AACF;ACTO,SAAS,gBAAA,CAAiB,EAAE,IAAA,EAAM,WAAA,EAAa,QAAO,EAK1D;AACD,EAAA,MAAM,OAAA,GAAU,IAAA;AAEhB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAgC,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAE7C,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,MAAM,QAAQ,MAAM,WAAA,EAAY,CAAE,UAAA,CAAW,QAAQ,EAAE,CAAA;AACvD,IAAA,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,MAAA,IAAU,EAAE,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,KAAK,MAAA,EAAO,CAAE,KAAA,CAAM,CAAC,GAAA,KAAiB;AAAE,MAAA,SAAA,CAAU,EAAE,CAAA;AAAG,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAAE,CAAC,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,OAAA,CAAQ,EAAE,CAAC,CAAA;AAEf,EAAA,eAAe,IAAI,MAAA,EAAgC;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAc;AACrB,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC5B,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,eAAe,OAAO,MAAA,EAAkC;AACtD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA;AACtF,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAInB,IAAA,MAAM,IAAI,YAAY;AACpB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,WAAA,EAAY,CAAE,kBAAA,CAAmB,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,IAAA,CAAK,OAAe,KAAA,EAAe;AAC1C,IAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,OAAO,MAAA,EAAQ;AACtD,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA;AAGvB,IAAA,KAAK,IAAI,YAAY;AACnB,MAAA,MAAMC,OAAAA,GAAS,aAAY,CAAE,kBAAA;AAC7B,MAAA,IAAI,CAACA,OAAAA,EAAQ,MAAM,IAAI,MAAM,iDAA8C,CAAA;AAC3E,MAAA,MAAMA,OAAAA,CAAO,EAAE,EAAA,EAAI,EAAE,WAAW,CAAA,CAAE,SAAA,IAAa,QAAQ,CAAA;AACvD,MAAA,MAAMA,OAAAA,CAAO,EAAE,EAAA,EAAI,EAAE,WAAW,CAAA,CAAE,SAAA,IAAa,OAAO,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,aAAY,CAAE,kBAAA;AAE7B,EAAA;AAAA;AAAA;AAAA,oBAGE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,WAAA;AAAA,QACV,UAAA,EAAY,CAAC,KAAA,KAAU;AAAE,UAAA,IAAI,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAAE,YAAA,KAAA,CAAM,cAAA,EAAe;AAAG,YAAA,WAAA,CAAY,IAAI,CAAA;AAAA,UAAE;AAAA,QAAE,CAAA;AAAA,QACvH,WAAA,EAAa,CAAC,KAAA,KAAU;AAAE,UAAA,IAAI,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,MAAM,aAA4B,CAAA,cAAe,KAAK,CAAA;AAAA,QAAE,CAAA;AAAA,QACpH,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,UAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ;AACtC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,KAAK,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,kBAAA;AAAA,cACN,WAAA,EAAY,qKAAA;AAAA,cACZ,OAAA;AAAA;AAAA;AAAA;AAAA,gCAIE,IAAA,CAAC,UAAO,QAAA,EAAU,IAAA,EAAM,SAAS,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM,EAC5D,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,CAAA;AAAA,kBAChC,OAAO,gBAAA,GAAc;AAAA,iBAAA,EACxB;AAAA;AAAA;AAAA,WAEJ;AAAA,0BAGA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAQ,IAAA;AAAA,cACR,QAAA,EAAU,IAAA;AAAA,cACV,SAAA,EAAU,QAAA;AAAA,cACV,UAAU,CAAC,KAAA,KAAU,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA,WACrD;AAAA,UAEC,KAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6EAA6E,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAGjG,MAAA,KAAW,uBACV,GAAA,CAAC,IAAA,EAAA,EAAG,WAAU,gBAAA,EAAiB,WAAA,EAAU,QACtC,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,sBACjB,IAAA,CAAC,IAAA,EAAA,EAAW,WAAU,mCAAA,EACpB,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,mCAAA,EAAoC,CAAA;AAAA,4BACxD,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,8BAC/B,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,aAAA,EACjC;AAAA,WAAA,EAAA,EALO,CAMT,CACD,CAAA,EACH,IACE,MAAA,CAAO,MAAA,KAAW,KAAK,QAAA,mBACzB,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAAO,OAAA,EAAQ,MAAA;AAAA,cAAO,IAAA,EAAK,MAAA;AAAA,cAC1B,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,IAAA;AAAA,cACV,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAAA,cACtC,SAAA,EAAW,CAAA,uJAAA,EACT,QAAA,GAAW,6CAAA,GAAgD,yCAC7D,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,oCAC5C,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,QAAA,GAAW,sBAAsB,sDAAA,EAAoD,CAAA;AAAA,gBACnH,CAAC,QAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,yHAAA,EAEnC;AAAA;AAAA;AAAA,WAEJ,mBAEA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClB,IAAA,CAAC,IAAA,EAAA,EAAkB,WAAU,mCAAA,EAC3B,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAK,KAAA,CAAM,GAAA,EAAK,KAAK,KAAA,CAAM,OAAA,IAAW,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,cACrF,MAAM,SAAA,oBACL,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2GAA0G,QAAA,EAAA,MAAA,EAE1H;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBAAW,KAAA,EAAM,oBAAA;AAAA,oBAAkB,QAAA,EAAU,QAAQ,KAAA,KAAU,CAAA;AAAA,oBAC9D,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA;AAAA,oBAAG,QAAA,EAAA;AAAA;AAAA,iBAAC;AAAA,gCACnC,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBAAW,KAAA,EAAM,mBAAA;AAAA,oBAAoB,QAAA,EAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,oBAChF,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,oBAAG,QAAA,EAAA;AAAA;AAAA;AAAC,eAAA,EACpC,CAAA;AAAA,8BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,CAAC,KAAA,CAAM,aAAa,MAAA,oBACnB,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBAAO,OAAA,EAAQ,MAAA;AAAA,oBAAO,IAAA,EAAK,MAAA;AAAA,oBAC1B,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,IAAA;AAAA,oBACV,OAAA,EAAS,MAAM,KAAK,GAAA,CAAI,MAAM,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAAA,oBACnE,SAAA,EAAU,4IAAA;AAAA,oBACX,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCAEF,GAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,SAAA;AAAA,oBACR,SAAA,EAAU,kBAAA;AAAA,oBACV,KAAA,EAAM,IAAA;AAAA,oBACN,KAAA,EAAO,EAAE,GAAA,EAAK,KAAA,CAAM,KAAK,IAAA,EAAM,KAAA,CAAM,OAAA,IAAW,OAAA,CAAQ,IAAA,EAAK;AAAA,oBAC7D,KAAA,EAAM,qBAAA;AAAA,oBACN,IAAA,EAAK,qCAAA;AAAA,oBACL,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,sBAAA;AAAA,sBACT,KAAA,EAAO,CAAA,yBAAA,EAA4B,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAA;AAAA,sBAC/C,WAAA,EAAa,8GAAA;AAAA,sBACb,WAAA,EAAa;AAAA,wBACX,EAAE,KAAA,EAAO,cAAA,EAAgB,MAAA,EAAQ,+BAAA,EAAgC;AAAA,wBACjE,EAAE,KAAA,EAAO,gBAAA,EAAe,MAAA,EAAQ,uCAAA;AAAkC;AACpE;AACF;AAAA,iBACF;AAAA,gCACA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBAAO,OAAA,EAAQ,MAAA;AAAA,oBAAO,IAAA,EAAK,MAAA;AAAA,oBAC1B,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,IAAA;AAAA,oBACV,OAAA,EAAS,MAAM,KAAK,GAAA,CAAI,MAAM,aAAY,CAAE,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,oBACxE,SAAA,EAAU,4FAAA;AAAA,oBACX,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF;AAAA,aAAA,EACF;AAAA,WAAA,EAAA,EAtDO,KAAA,CAAM,EAuDf,CACD,CAAA,EACH,CAAA;AAAA,UAED;AAAA;AAAA;AAAA;AACH;AAEJ;AAEA,SAAS,WAAW,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAKtD;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAAO,OAAA,EAAQ,MAAA;AAAA,MAAO,IAAA,EAAK,MAAA;AAAA,MAC1B,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAU,yKAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAGA,SAAS,WAAW,MAAA,EAAwC;AAC1D,EAAA,OAAO,CAAC,GAAG,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChC,IAAA,IAAI,EAAE,SAAA,KAAc,CAAA,CAAE,WAAW,OAAO,CAAA,CAAE,YAAY,EAAA,GAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,CAAA,CAAE,SAAA,IAAa,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH;AC7NO,SAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,WAAA,EAAY,EAGpD;AACD,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,OAAO,WAAA,EAAY;AAGzB,EAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,kBAAA,KAAuB,cACnC,OAAO,IAAA,CAAK,kBAAA,KAAuB,UAAA,IACnC,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,IACrC,OAAO,KAAK,oBAAA,KAAyB,UAAA;AAEvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIC,gBAAAA,CAAM,QAAA,CAA6B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAIA,gBAAAA,CAAM,QAAA,CAA2B,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAG5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,iBAAM,QAAA,iBAAsB,IAAI,KAAK,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,MAAA,GAASA,gBAAAA,CAAM,WAAA,CAAY,YAAY;AAI3C,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY,CAAE,kBAAA,CAAoB,QAAQ,EAAA,EAAI,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AACzF,IAAA,OAAA,CAAQ,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA;AACpC,IAAA,WAAA,CAAY,IAAI,QAAQ,CAAA;AACxB,IAAA,WAAA,iBAAY,IAAI,KAAK,CAAA;AACrB,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE5B,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,KAAK,MAAA,GAAS,KAAA,CAAM,CAAC,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAA,eAAe,IAAI,MAAA,EAAgC;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACrB,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAOA,gBAAAA,CAAM,OAAA,CAAQ,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AACpF,EAAA,MAAM,SAAA,GAAY,oBAAoB,IAAI,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,sBAAsB,QAAQ,CAAA;AAClD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,EAAA,SAAS,UAAU,IAAA,EAA0B;AAC3C,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,MAAM,kBAAA,CAAmB,WAAA,EAAY,EAAG,OAAA,CAAQ,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAC,CAAA;AAE1F,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAOC,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAA,oDAAA,EAA+C,CAAA;AAAA,EAChE;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAACE,eAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,cAAA;AAAA,UACN,WAAA,EAAY,uKAAA;AAAA,UACZ,OAAA;AAAA;AAAA;AAAA;AAAA,4BAIED,IAAAA;AAAA,cAACE,MAAAA;AAAA,cAAA;AAAA,gBACC,QAAA,EAAU,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,gBAAA;AAAA,gBACjC,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,gBAE7B,QAAA,EAAA;AAAA,kCAAAH,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA;AACrC;AAAA;AAAA,OAEJ;AAAA,sBAEAJ,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,UAC9B,QAAA,EAAU,CAAC,IAAA,KAAS;AAAE,YAAA,SAAA,CAAU,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAAG,YAAA,SAAA,CAAU,KAAK,CAAA;AAAA,UAAE;AAAA;AAAA,OACrE;AAAA,MAEC,IAAA,CAAK,WAAW,CAAA,mBACfA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uFAAsF,QAAA,EAAA,8GAAA,EAEnG,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,WAAA,EACX,QAAA,EAAA,IAAA,CAAK,IAAI,CAAC,IAAA,EAAM,0BACfA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAO,IAAA,CAAK,MAAA;AAAA,UACZ,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAE,CAAC,CAAA;AAAA,UAC1E,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,YAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvB,YAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ;AACzC,YAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,YAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACpC,YAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,KAAM,CAAA;AAC7B,YAAA,SAAA,CAAU,IAAI,CAAA;AAAA,UAChB,CAAA;AAAA,UACA,QAAA,EAAU,MAAM,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC;AAAA,SAAA;AAAA,QAdvD;AAAA,OAgBR,CAAA,EACH,CAAA;AAAA,MAGD,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,SAAS,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MAC7C,CAAC,SAAA,IAAa,qBAAA,CAAsB,IAAI,CAAA,oBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,QAAA,EAAA,8KAAA,EAGrB,CAAA;AAAA,MAGD,KAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACV,QAAA,EAAA,YAAA,CAAa,IAAI,CAAA,EACpB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAAO,IAAA,EAAK,QAAA;AAAA,YAAS,QAAA,EAAU,IAAA;AAAA,YAAM,OAAA,EAAS,MAAM,KAAK,MAAA,EAAO;AAAA,YAC1F,SAAA,EAAU,qGAAA;AAAA,YAAsG,QAAA,EAAA;AAAA;AAAA,SAElH;AAAA,wBACAF,IAAAA;AAAA,UAACE,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,IAAA,IAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,YACnC,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAU,oIAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,IAAA,oBAAQH,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,cAAG;AAAA;AAAA;AAAA;AAE5D,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,yBAASA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,SAAS,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAGrC,IAAA,CAAK,MAAA,GAAS,CAAA,oBACbA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ,CAAC,SAAA,EAAW,KAAA,KAAU,GAAA,CAAI,MAAM,WAAA,EAAY,CAAE,oBAAA,CAAsB,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,QAC7F,OAAA,EAAS,CAAC,SAAA,EAAW,KAAA,KAAU,GAAA,CAAI,MAAM,WAAA,EAAY,CAAE,eAAA,CAAiB,SAAA,EAAW,KAAK,CAAC;AAAA;AAAA,KAC3F;AAAA,IAGD,IAAA,CAAK,WAAW,CAAA,IAAK,WAAA,oBACpBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,qEAAA,EAE7C;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAMA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS,EAQ5E;AACD,EAAA,MAAM,CAACK,MAAAA,EAAO,QAAQ,CAAA,GAAIN,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAE3C,EAAA,SAAS,OAAO,GAAA,EAAa;AAG3B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,IAAI,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC1E,IAAA,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACpC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb;AAEA,EAAA,uBACEE,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAO,IAAA,CAAK,IAAA;AAAA,UACZ,QAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UAC3D,WAAA,EAAY,SAAA;AAAA,UACZ,YAAA,EAAY,CAAA,oBAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,UACtC,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACzBA,GAAAA,CAACM,WAAAA,EAAA,EAAW,OAAM,iBAAA,EAAkB,QAAA,EAAU,QAAA,IAAY,KAAA,KAAU,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,EAAE,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACnGN,GAAAA,CAACM,WAAAA,EAAA,EAAW,KAAA,EAAM,oBAAmB,QAAA,EAAU,QAAA,IAAY,KAAA,KAAU,KAAA,GAAQ,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC3GN,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,qBAAA;AAAA,UACX,QAAA;AAAA,UACA,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,2FAAA;AAAA,UAEV,QAAA,kBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAC9B,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,KAAA,EAAO,6BACvBA,IAAAA,CAAC,MAAA,EAAA,EAAiB,SAAA,EAAU,0EAAA,EACzB,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,wBACDD,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAY,WAAW,KAAK,CAAA,CAAA;AAAA,YAC5B,QAAA;AAAA,YACA,SAAS,MAAM,QAAA,CAAS,EAAE,GAAG,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,QAAQ,GAAG,CAAA;AAAA,YACzF,SAAA,EAAU,kEAAA;AAAA,YAEV,QAAA,kBAAAH,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,OAAA,EAAA,EAVS,KAWX,CACD,CAAA;AAAA,sBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAOK,MAAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,MAAA,CAAOA,MAAK,CAAA;AAAA,YAAE;AAAA,UAC7D,CAAA;AAAA,UACA,MAAA,EAAQ,MAAM,MAAA,CAAOA,MAAK,CAAA;AAAA,UAC1B,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAI,SAAA,GAAY,WAAA;AAAA,UACpD,YAAA,EAAY,CAAA,uBAAA,EAAoB,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,UACzC,SAAA,EAAU;AAAA;AAAA,OACZ,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,IAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAE9B,IAAM,OAAA,GAAU,aAAA;AAChB,IAAM,KAAA,GAAQ,WAAA;AACd,IAAM,aAAA,GAAgB,4CAAA;AACtB,IAAM,cAAA,GAAiB,2DAAA;AAEvB,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ,EAU1F;AACD,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,IAAI,OAAO,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,OAAA,CAAS,EAAE,CAAC,CAAA;AAE1F,EAAA,SAAS,OAAO,EAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,SAC3B,IAAA,CAAK,IAAI,EAAE,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf;AAEA,EAAA,uBACEJ,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAACE,eAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,WAAA;AAAA,QACN,WAAA,kBACED,IAAAA,CAAA,QAAA,EAAA,EAAE,QAAA,EAAA;AAAA,UAAA,qIAAA;AAAA,UAEkB,IAAA,CAAK,MAAA;AAAA,UAAO;AAAA,SAAA,EAChC;AAAA;AAAA,KAEJ;AAAA,IAEC,KAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAA,mHAAA,EAER,CAAA;AAAA,IAGD,QAAA,CAAS,IAAA,GAAO,CAAA,oBACfA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAO,QAAA,CAAS,IAAA;AAAA,QAChB,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,KAAA,MAAW,EAAA,IAAM,QAAA,EAAU,MAAA,CAAO,EAAA,EAAI,KAAK,CAAA;AAAA,QAC7C,CAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,iBAAS,IAAI,KAAK;AAAA;AAAA,KACnC;AAAA,oBAGFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCACb,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8BAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EACf,QAAA,kBAAAC,KAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eAAA,EACZ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,kBAAA;AAAA,YACX,OAAA,EAAS,WAAA;AAAA,YACT,QAAA,EAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA;AAAA,YACnC,UAAU,MAAM,QAAA,CAAS,WAAA,mBAAc,IAAI,KAAI,GAAI,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,OAAA,CAAS,EAAE,CAAC,CAAC;AAAA;AAAA,SAC7F,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAC9CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,UAAA,EAAK,CAAA;AAAA,wBAC3CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACjDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBACzCA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,sBAAA,EAAc,CAAA;AAAA,wBACpDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,OAAA,EAAK;AAAA,OAAA,EAC7C,CAAA,EACF,CAAA;AAAA,sBACAA,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,YACd,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,GAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,IAAI,OAAA,GAAU,QAAA,CAAS,IAAI,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,GAAI,KAAA;AAAA,UACtD,UAAU,MAAM,GAAA,CAAI,WAAW,MAAA,CAAO,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,UACpD,MAAA;AAAA,UACA;AAAA,SAAA;AAAA,QARK,IAAI,OAAA,EAAS,EAAA,IAAM,wBAAA,CAAyB,GAAA,CAAI,SAAS,IAAI;AAAA,OAUrE,CAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAM,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAQ,EAShF;AACD,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,EAAA,MAAM,UAAU,CAAC,OAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAKxD,EAAA,MAAM,MAAA,GAAS,CAACO,MAAAA,EAAe,KAAA,EAAgB,QAAA,KAAsB;AACnE,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,MAAA,CAAO,QAAQ,EAAA,EAAI,EAAE,CAACA,MAAK,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,uBACEN,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,OAAA,GAAU,sCAAsC,MAAA,EAC7D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAS,YAAA,EAAY,cAAc,KAAK,CAAA,CAAA;AAAA,QAAI,OAAA;AAAA,QAC3C,UAAU,IAAA,IAAQ,OAAA;AAAA,QAAS,QAAA,EAAU;AAAA;AAAA,KAAU,EACnD,CAAA;AAAA,oBACAC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,2BAAWD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA2C,QAAA,EAAA,SAAA,EAAO;AAAA,KAAA,EAChF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAAW,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,QAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,QAC3D,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAAG,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,SAAS,CAAA,EAAG,OAAA,EAAS,SAAS,IAAI;AAAA;AAAA,KAAG,EACrG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAAW,KAAA,EAAO,SAAS,cAAA,IAAkB,IAAA;AAAA,QAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,QACpE,WAAA,EAAY,QAAA;AAAA,QAAI,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,kBAAkB,CAAA,EAAG,OAAA,EAAS,kBAAkB,IAAI;AAAA;AAAA,KAAG,EACnG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAAS,KAAA,EAAO,SAAS,GAAA,IAAO,EAAA;AAAA,QAAI,UAAU,IAAA,IAAQ,OAAA;AAAA,QACrD,WAAA,EAAa,QAAQ,GAAA,IAAO,KAAA;AAAA,QAAO,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,OAAO,CAAA,IAAK,IAAA,EAAM,OAAA,EAAS,GAAA,IAAO,IAAI;AAAA;AAAA,KAAG,EACxG,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAS,cAAA,IAAkB,IAAA;AAAA,QAClC,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,WAAA,EAAY,GAAA;AAAA,QACZ,OAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,UAAA,IAAI,CAAC,OAAA,IAAW,CAAA,IAAK,IAAA,IAAQ,CAAA,KAAM,QAAQ,cAAA,EAAgB;AAC3D,UAAA,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,QACvB;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAAW,KAAA,EAAO,SAAS,MAAA,IAAU,IAAA;AAAA,UAAM,UAAU,IAAA,IAAQ,OAAA;AAAA,UAC5D,aAAa,OAAA,CAAQ,MAAA,IAAU,OAAO,QAAA,GAAM,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,UAAG,KAAA,EAAM,MAAA;AAAA,UAC1E,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,EAAS,UAAU,IAAI;AAAA;AAAA,OAAG;AAAA,sBACjEC,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,SAAS,UAAA,IAAc,OAAA;AAAA,UAC9B,UAAU,IAAA,IAAQ,OAAA;AAAA,UAClB,aAAA,EAAe,CAAC,CAAA,KAAM,MAAA,CAAO,YAAA,EAAc,CAAA,KAAM,OAAA,GAAU,IAAA,GAAO,CAAA,EAAG,OAAA,EAAS,UAAA,IAAc,IAAI,CAAA;AAAA,UAEhG,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,aAAA,EAAA,EAAc,YAAA,EAAY,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAA,EAAI,SAAA,EAAW,cAAA,EAAgB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EAAE,CAAA;AAAA,4BACpGC,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,OAAA,EAAU,kBAAQ,UAAA,EAAW,CAAA;AAAA,cAC/C,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAASA,GAAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,IAAA,EAAO,QAAA,EAAA,IAAA,EAAA,EAApB,IAAyB,CAAa;AAAA,aAAA,EAC9E;AAAA;AAAA;AAAA;AACF,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,aAAA,EACZ,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA,CAAC,YAAY,SAAA,EAAW,UAAU,EAAY,GAAA,CAAI,CAAC,wBACnDA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO,OAAA,GAAU,GAAG,CAAA,IAAK,IAAA;AAAA,QACzB,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,KAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,QAAQ,GAAG,CAAA,IAAK,OAAO,QAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,QAC7D,QAAA,EAAU,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,GAAU,GAAG,CAAA,IAAK,IAAI;AAAA,OAAA;AAAA,MALjD;AAAA,KAOR,GACH,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAS,OAAA,IAAW,KAAA;AAAA,QAC3B,QAAA,EAAU,IAAA,IAAQ,OAAA,IAAW,OAAA,CAAQ,OAAO,MAAA,KAAW,CAAA;AAAA,QACvD,aAAA,EAAe,CAAC,CAAA,KAAM,MAAA,CAAO,SAAA,EAAW,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAA,EAAG,OAAA,EAAS,OAAA,IAAW,IAAI,CAAA;AAAA,QAExF,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,aAAA,EAAA,EAAc,YAAA,EAAY,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,EAAI,SAAA,EAAW,CAAA,EAAG,cAAc,CAAA,KAAA,CAAA,EAAS,QAAA,kBAAAA,GAAAA,CAAC,eAAY,CAAA,EAAE,CAAA;AAAA,0BACnGC,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAA,EAAO,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,YAC7B,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC1BC,IAAAA,CAAC,UAAA,EAAA,EAA0B,KAAA,EAAO,KAAA,CAAM,EAAA,EAAI,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cAAM,KAAA,GAAQ;AAAA,aAAA,EAAA,EAAzC,KAAA,CAAM,EAAqC,CAC7D;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACZ,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAY,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACpB,OAAA,EAAS,SAAS,MAAA,KAAW,QAAA;AAAA,QAC7B,UAAU,IAAA,IAAQ,OAAA;AAAA,QAClB,QAAA,EAAU,CAAC,EAAA,KAAO,MAAA,CAAO,UAAU,EAAA,GAAK,QAAA,GAAW,UAAA,EAAY,OAAA,EAAS,MAAM;AAAA;AAAA,KAChF,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,QAAQ,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,SAAQ,EAKlD;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAEzC,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM,cAAA;AAAA,MAAa,KAAA,GAAQ,IAAI,GAAA,GAAM;AAAA,KAAA,EAAG,CAAA;AAAA,oBACvED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBACzCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAAM,KAAA,EAAO,KAAA;AAAA,QAAO,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAAG,WAAA,EAAY,UAAA;AAAA,QAC1E,YAAA,EAAW,qBAAA;AAAA,QAAmB,SAAA,EAAW;AAAA;AAAA,KAAe,EAC5D,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAAO,IAAA,EAAK,QAAA;AAAA,QAAS,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,KAAK,CAAA,IAAK,IAAA;AAAA,QAC3F,SAAS,MAAM;AAAE,UAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,WAAA,CAAY,KAAK,GAAG,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAA,QAAE,CAAA;AAAA,QACtE,SAAA,EAAU,oFAAA;AAAA,QAAqF,QAAA,EAAA;AAAA;AAAA,KAEjG;AAAA,oBACAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,oBACzCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAAM,KAAA,EAAO,MAAA;AAAA,QAAQ,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAAG,WAAA,EAAY,MAAA;AAAA,QAC5E,YAAA,EAAW,iBAAA;AAAA,QAAkB,SAAA,EAAW;AAAA;AAAA,KAAe,EAC3D,CAAA;AAAA,oBACAC,IAAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,QAAQ,OAAA,EAAS,aAAA,EAAe,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,KAAM,OAAA,GAAU,EAAA,GAAK,CAAC,CAAA,EAClF,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,iBAAc,YAAA,EAAW,oBAAA,EAAqB,WAAW,cAAA,EAAgB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EAAE,CAAA;AAAA,sBACzFC,KAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,OAAA,EAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,QACjC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,UAAA,EAAA,EAAmB,KAAA,EAAO,CAAA,EAAI,QAAA,EAAA,CAAA,EAAA,EAAd,CAAgB,CAAa;AAAA,OAAA,EAClE;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAAO,IAAA,EAAK,QAAA;AAAA,QAAS,QAAA,EAAU,QAAA,IAAY,WAAA,CAAY,MAAM,CAAA,IAAK,IAAA;AAAA,QAC5F,SAAS,MAAM;AAAE,UAAA,OAAA,CAAQ,EAAE,QAAQ,WAAA,CAAY,MAAM,GAAG,UAAA,EAAY,IAAA,IAAQ,MAAM,CAAA;AAAG,UAAA,SAAA,CAAU,EAAE,CAAA;AAAA,QAAE,CAAA;AAAA,QACnG,SAAA,EAAU,oFAAA;AAAA,QAAqF,QAAA,EAAA;AAAA;AAAA,KAEjG;AAAA,oBACAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACzBA,GAAAA,CAACG,MAAAA,EAAA,EAAO,SAAQ,MAAA,EAAO,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAA,EAAU,mEAAkE,QAAA,EAAA,sBAAA,EAE/I;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,IAAI,CAAA,GAAI,IAAA;AAC5C;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAU,aAAa,QAAA,EAAU,KAAA,GAAQ,MAAA,EAAQ,OAAA,EAAQ,EAOnF;AACD,EAAA,MAAM,CAACE,MAAAA,EAAO,QAAQ,CAAA,GAAIN,gBAAAA,CAAM,QAAA,CAAS,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC/E,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OACd,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAOK,MAAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,QAAQ,MAAM;AACZ,QAAA,MAAM,MAAA,GAAS,YAAYA,MAAK,CAAA;AAChC,QAAA,QAAA,CAAS,MAAA,IAAU,OAAO,IAAA,GAAO,OAAA,GAAU,KAAK,KAAA,CAAM,MAAM,IAAI,MAAM,CAAA;AAAA,MACxE,CAAA;AAAA,MACA,SAAA,EAAW,GAAG,aAAa,CAAA,aAAA;AAAA;AAAA,GAC7B,EACF,CAAA;AAEJ;AAEA,SAAS,SAAS,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,UAAS,EAKxD;AACD,EAAA,MAAM,CAACA,MAAAA,EAAO,QAAQ,CAAA,GAAIN,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAC9C,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAClD,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAOK,MAAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,MAAA,EAAQ,MAAM,QAAA,CAASA,MAAAA,CAAM,MAAM,CAAA;AAAA,MACnC,SAAA,EAAW;AAAA;AAAA,GACb,EACF,CAAA;AAEJ;AAEA,SAASC,YAAW,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAS,EAKtD;AACD,EAAA,uBACEN,GAAAA;AAAA,IAACG,MAAAA;AAAA,IAAA;AAAA,MAAO,OAAA,EAAQ,MAAA;AAAA,MAAO,IAAA,EAAK,MAAA;AAAA,MAC1B,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAU,yKAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,IAAA,EAAK,EAAkD;AACjF,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,OAAA,GACjB,yDAAA,GACA,iDAAA;AACJ,EAAA,uBACEF,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,2DAAA,EAA8D,GAAG,CAAA,CAAA,EAC5E,QAAA,EAAA;AAAA,IAAA,IAAA,KAAS,OAAA,oBAAWD,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAU,6BAAA,EAA8B,CAAA;AAAA,oBAC5EA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAS;AAAA,GAAA,EAClB,CAAA;AAEJ;AAEA,SAAS,aAAa,IAAA,EAAoD;AACxE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,QAAA,CAAU,CAAA;AAClE,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,WAAA,CAAa,CAAA;AAC7E,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,WAAA,CAAa,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,gCAAA;AAG/B,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,oHAAA,CAAA;AAC5B;AAEA,SAAS,QAAQ,KAAA,EAAwB;AACvC,EAAA,OAAOQ,eAAa,KAAK,CAAA;AAC3B;AAWA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,UAAS,EAI7C;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIT,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAQzC,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAIA,iBAAM,QAAA,CAAmB,CAAC,EAAE,CAAC,CAAA;AAEzD,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,IAAI,IAAA,EAAM;AAAE,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,EAAE,CAAC,CAAA;AAAA,IAAE;AAAA,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAE5E,EAAA,SAAS,QAAA,CAAS,OAAe,IAAA,EAAc;AAC7C,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,MAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAI,CAAA;AACpB,MAAA,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA;AAEb,MAAA,IAAI,KAAA,KAAU,IAAI,MAAA,GAAS,CAAA,IAAK,KAAK,IAAA,EAAK,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACxD,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,YAAY,KAAA,EAAe;AAClC,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AAC7C,MAAA,OAAO,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,IAAI,MAAA,GAAS,CAAC,CAAA,CAAG,IAAA,EAAK,GAAI,CAAC,GAAG,GAAA,EAAK,EAAE,CAAA,GAAI,GAAA;AAAA,IAC1E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAEzD,EAAA,MAAM,SAAS,CAAC,GAAG,IAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,MAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,SAAS,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,CAAC,YAAA;AAE9D,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAY,YAAA,EAAc,CAAC,CAAA,KAAe;AAAE,IAAA,IAAI,CAAC,GAAG,OAAA,EAAQ;AAAA,EAAE,CAAA,EACnE,QAAA,kBAAAC,IAAAA,CAAC,YAAA,EAAA,EAAa,WAAU,aAAA,EACtB,QAAA,EAAA;AAAA,oBAAAA,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,cAAW,QAAA,EAAA,kBAAA,EAAU,CAAA;AAAA,sBACtBA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAA,kGAAA,EAElB;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAChEA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACvC,WAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAEAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,wBACnEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClBC,IAAAA,CAAC,IAAA,EAAA,EAAe,WAAU,2BAAA,EACxB,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,UAAU,CAAC,CAAA,KAAM,SAAS,KAAA,EAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC/C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,IAAI,KAAA,KAAU,OAAO,MAAA,GAAS,CAAA,IAAK,MAAM,IAAA,EAAK,EAAG,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AAEtE,kBAAA,MAAM,OAAO,CAAA,CAAE,aAAA,CAAc,QAAQ,IAAI,CAAA,EAAG,iBAAiB,OAAO,CAAA;AACpE,kBAAA,MAAA,CAAO,UAAA,CAAW,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,IAAS,CAAC,CAAA;AAAA,gBACvD;AAAA,cACF,CAAA;AAAA,cACA,WAAA,EAAa,KAAA,KAAU,MAAA,CAAO,MAAA,GAAS,IAAI,iBAAA,GAAoB,EAAA;AAAA,cAC/D,YAAA,EAAY,CAAA,MAAA,EAAS,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,cAC9B,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,UAGC,KAAA,GAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,oBACvBA,GAAAA;AAAA,YAACG,MAAAA;AAAA,YAAA;AAAA,cAAO,OAAA,EAAQ,MAAA;AAAA,cAAO,IAAA,EAAK,MAAA;AAAA,cAC1B,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,cAChC,YAAA,EAAY,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,cACtC,SAAA,EAAU,yGAAA;AAAA,cAEV,QAAA,kBAAAH,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,SAAA,EAAA,EA3BK,KA6BT,CACD,CAAA,EACH,CAAA;AAAA,QACC,gCACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAA0C,QAAA,EAAA,iGAAA,EAE1D;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAC,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,IAACG,MAAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,OAAA,EAAS,SAAS,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAClDH,GAAAA,CAACG,MAAAA,EAAA,EAAO,QAAA,EAAU,CAAC,OAAO,OAAA,EAAS,MAAM,SAAS,EAAE,IAAA,EAAM,KAAK,IAAA,EAAK,EAAG,QAAQ,MAAA,EAAQ,GAAG,QAAA,EAAA,WAAA,EAE1F;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC1vBA,IAAM,OAAA,GAAoF;AAAA;AAAA,EAExF,OAAO,EAAE,IAAA,EAAM,WAAW,IAAA,EAAM,CAAA,EAAG,QAAQ,UAAA,EAAW;AAAA,EACtD,MAAM,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,EAAA,EAAI,QAAQ,YAAA,EAAa;AAAA,EAC3D,YAAY,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,CAAA,EAAG,QAAQ,YAAA,EAAa;AAAA,EAChE,MAAM,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,EAAA,EAAI,QAAQ,UAAA,EAAW;AAAA;AAAA;AAAA,EAGnD,UAAU,EAAE,IAAA,EAAM,gBAAgB,IAAA,EAAM,EAAA,EAAI,QAAQ,UAAA;AACtD,CAAA;AAgBO,SAAS,YAAA,CACd,OAAA,EACA,QAAA,EACA,UAAA,EACmD;AACnD,EAAA,MAAM,IAAA,GAAO,sBAAsB,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,KAAA,EAAO,uBAAA,EAAyB,OAAA,EAAS,yCAAA,EAAuC;AAAA,EAC3F;AACA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAK,CAAC,CAAA;AAChD,EAAA,IAAI,cAAc,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,SAAS,0CAAA,EAAqC;AAEpG,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,UAAA,GACb,oBAAA,EAAqB,CAAE,IAAA,CAAK,CAAC,CAAA,KAAuB,CAAA,CAAE,GAAA,KAAQ,UAAU,CAAA,GACxE,MAAA;AACJ,EAAA,MAAM,IAAA,GAAO,QAAA,EAAU,YAAA,IAAgB,QAAA,CAAS,IAAA;AAEhD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,KAAS,CAAA,GAAK,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAK,QAAA,CAAS,IAAA;AAC9E,EAAA,OAAO,EAAE,MAAM,QAAA,EAAU,SAAA,GAAY,MAAM,UAAA,EAAY,QAAA,EAAU,GAAA,IAAO,QAAA,CAAS,MAAA,EAAO;AAC1F;AAMA,IAAM,QAAA,GAAyB;AAAA,EAC7B,EAAA,EAAI,qBAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EACE,sTAAA;AAAA,EAGF,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,yCAAyC,EAAE;AAAA,IAC9F,QAAA,EAAU,CAAC,MAAM;AAAA;AAErB,CAAA;AAEA,IAAM,MAAA,GAAuB;AAAA,EAC3B,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EACE,mdAAA;AAAA,EAIF,IAAA,EAAM,iBAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAChD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAyB;AAAA,MACnE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6CAAA,EAA8C;AAAA,MAC1F,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,qCAAA;AAAA,QACb,IAAA,EAAM,CAAC,SAAA,EAAW,OAAA,EAAS,UAAU,OAAO;AAAA,OAC9C;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iCAAA,EAAkC;AAAA,MAC3E,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kFAAA,EAA8E;AAAA,MACzH,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kDAAA,EAAmD;AAAA,MAC9F,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0FAAA,EAAsF;AAAA,MAC3H,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qDAAA;AAAsD,KACnG;AAAA,IACA,QAAA,EAAU,CAAC,WAAA,EAAa,aAAA,EAAe,gBAAgB,UAAU;AAAA;AAErE,CAAA;AAcO,SAAS,gBAAgB,KAAA,EAAyB;AACvD,EAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAQ,KAAA,EAAiC,WAAW,KAAK,CAAA;AAC9G,EAAA,OAAO,+CAAA,CAAgD,KAAK,GAAG,CAAA;AACjE;AAEO,IAAM,sBAAA,GACX,wIAAA;AAaK,SAAS,aAAA,CAAc,WAAmB,KAAA,EAAmC;AAClF,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,KAAA,EAAO,OAAO,MAAA;AAC9C,EAAA,MAAM,MAAA,mBAAS,IAAI,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,SAAA,CAAW,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,MAAM,MAAA,CAAO,OAAA,EAAS,CAAA,GAAI,MAAA,GAAY,OAAO,WAAA,EAAY;AACzE;AAmCA,eAAsB,eAAe,IAAA,EAAwE;AAC3G,EAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,cAAc,IAAA,CAAK,QAAA,EAAU,KAAK,UAAU,CAAA;AAC3E,EAAA,IAAI,WAAW,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAG,IAAA,EAAK;AAEjD,EAAA,MAAMM,SAAQ,UAAA,EAAW;AAMzB,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,SAAA,GAAY,MAAMA,MAAAA,CAAM,YAAA,CAAa,KAAK,SAAS,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,IAAI,SAAA,EAAW;AACvC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO,oBAAA;AAAA,QACP,SAAA;AAAA,QACA,OAAA,EAAS,eAAS,SAAS,CAAA,iCAAA,EAA4B,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,mBAAA;AAAA,OAChF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAMA,MAAAA,CAAM,cAAA,CAAe;AAAA,IAC1C,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,IACzD,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,IACvC,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe;AAAC,GAC1D,CAAA;AAYD,EAAA,KAAA,MAAW,KAAA,IAAS;AAAA,IAClB,mBAAA;AAAA;AAAA,IACA,2BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,gBAAA;AAAA;AAAA,IACA,+BAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF,EAAG;AACD,IAAA,eAAA,CAAgB,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAA,EAAW,MAAMA,MAAAA,CAAM,YAAA,CAAa,KAAK,SAAS;AAAA,GACpD;AACF;AAOA,IAAM,IAAA,GAAO,CAAC,KAAA,KAA4B,OAAO,UAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAUrF,IAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,iBAAA,MAAuB,EAAA,EAAI,MAAM,0BAA0B,CAAA;AAGtG,SAAS,SAAA,CAAU,UAA0B,SAAA,EAA4B;AACvE,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAe,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAqB,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG,IAAA,IAAQ,EAAA;AAC1F,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAAA,IACrB,CAAC,KAAK,CAAA,MAAO;AAAA,MACX,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,MAAA;AAAA,MACvB,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,CAAA,CAAE,QAAA;AAAA,MAC3B,SAAA,EAAW,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE;AAAA,KAC/B,CAAA;AAAA,IACA,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA;AAAE,GACzC;AACA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAqE;AAC5F,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA,IAClC,EAAE,QAAA,EAAU,MAAA,CAAO,EAAE,UAAU,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,EAAE;AAC/D,IAAA,GAAA,CAAI,UAAU,CAAA,CAAE,MAAA;AAChB,IAAA,GAAA,CAAI,aAAa,CAAA,CAAE,SAAA;AACnB,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,GAAG,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,EAAE,OAAO,UAAA,EAAY,CAAC,GAAG,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAE;AACvD;AAEO,SAAS,qBAAA,CAAsB,EAAE,WAAA,EAAa,SAAA,EAAU,EAAuC;AACpG,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KACd,eAAA,CAAgB,KAAK,CAAA,GACjB,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,wBAAwB,OAAA,EAAS,sBAAA,KACrD,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAE;AAI9C,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,KAAwC;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,WAAA,EAAY,CAAE,kBAAA,GAAqB,QAAQ,EAAE,CAAA;AAC/D,MAAA,MAAM,GAAA,GAAA,CAAO,KAAK,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AACjD,MAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,GAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA;AAEA,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC3B,QAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,SAAA,EAAU;AAChD,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,WAAA,EAAa,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,CAAA;AACtF,UAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AACxC,UAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,YAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AACrE,YAAA,OAAO;AAAA,cACL,EAAA,EAAI,IAAA;AAAA,cACJ,IAAA,EAAM,eAAA;AAAA,cACN,SAAS,CAAC;AAAA,gBACR,EAAA,EAAI,eAAA;AAAA,gBACJ,QAAA,EAAU,SAAS,IAAI,CAAA,EAAA,CAAA;AAAA,gBACvB,SAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA,CAAE,IAAA,EAAM,MAAM,aAAA,CAAc,CAAC,GAAE,CAAE;AAAA,eAChG,CAAA;AAAA,cACD,IAAA;AAAA,cACA,WAAA,EAAa;AAAA,aACf;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,QAAA,CAAU,SAAS,CAAA;AACvE,UAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,OAAO,CAAA;AAC3C,UAAA,MAAMA,SAAQ,UAAA,EAAW;AACzB,UAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,YAC9CA,MAAAA,CAAM,aAAa,UAAA,CAAW,MAAA,GAAS,IAAI,EAAE,UAAA,EAAW,GAAI,EAAE,CAAA;AAAA,YAC9DA,OAAM,aAAA;AAAc,WACrB,CAAA;AACD,UAAA,MAAM,IAAA,GAAO,WAAW,MAAA,GAAS,CAAA,GAC7B,WACA,QAAA,CAAS,MAAA,CAAO,MAAM,KAAK,CAAA;AAC/B,UAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,SAAA,CAAU,MAAM,SAAS,CAAA;AACvD,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,IAAA;AAAA,YACJ,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI;AAAA;AAAA;AAAA,YAGvE,SAAA,EAAW,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA;AAAA,YAC5B,QAAA,EAAU,UAAA;AAAA,YACV,KAAA;AAAA,YACA,UAAA;AAAA,YACA,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,OAAsB,EAAE,UAAA,EAAY,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,WAAU,CAAE;AAAA,WAC7G;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACrC,QAAA,IAAI,CAAC,WAAW,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,+DAAA,EAAqD;AACvH,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,YAClC,SAAA;AAAA,YACA,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAAA,YACpC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,YAC9B,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,IAAK,KAAA,CAAA;AAAA,YACrC,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,IAAK,KAAA,CAAA;AAAA,YACrC,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAA;AAAA,YACzB,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,IAAK,KAAA;AAAA,WACtC,CAAA;AACD,UAAA,IAAI,MAAA,CAAO,IAAI,SAAA,IAAY;AAC3B,UAAA,OAAO,MAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA;AACF,GACF;AACF;AAEO,IAAM,kBAAA,GAAqB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAShC,IAAA,EAAK;ACvYP,IAAMC,WAAAA,GAAa,MAAMC,iBAAAA,CAAkBC,iBAAAA,MAAuB,EAAA,EAAI,MAAMC,0BAA0B,CAAA;AAGtG,IAAM,cAAA,GAAkE;AAAA,EACtE,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,EACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,UAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAC3B,CAAA;AAGA,IAAM,QAAA,GAAmC;AAAA,EACvC,OAAA,EAAS,SAAA;AAAA,EAAW,KAAA,EAAO,YAAA;AAAA,EAAc,MAAA,EAAQ,YAAA;AAAA,EAAc,KAAA,EAAO;AACxE,CAAA;AAEA,IAAM,QAAA,GAAW,uBAAM,IAAI,IAAA,IAAO,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAE3D,IAAM,KAAA,GAAQ,aAAA;AAEd,IAAM,cAAA,GAAiB,aAAA;AAGvB,IAAM,WAAA,GAA0B;AAAA,EAC9B,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,KAAA,EAAO,4CAAA;AAAA,EACP,WAAA,EACE,wIAAA;AAAA,EAEF,WAAA,EAAa;AAAA,IACX,EAAE,OAAO,sBAAA,EAAuB;AAAA,IAChC,EAAE,OAAO,aAAA;AAAc;AAE3B,CAAA;AAEO,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAM,WAAA,EAAY,EAGrD;AACD,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,QAAAA,CAA2B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAyB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAA0B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAA0B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAiB,EAAE,CAAA;AAGrD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAiB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAiB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAI9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,QAAAA,CAAiB,MAAM,UAAU,CAAA;AACrE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAcf,gBAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAEvD,EAAA,MAAM,IAAA,GAAO,YAAY,YAAY;AACnC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,WAAA,EAAY,CAAE,kBAAA,GAAqB,QAAQ,EAAE,CAAA;AAC/D,MAAA,MAAM,IAAA,GAAO,GAAA,EAAK,QAAA,IAAY,EAAC;AAC/B,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAChC,MAAA,YAAA,CAAa,CAAC,OAAA,KAAY,OAAA,IAAW,GAAA,CAAI,CAAC,KAAK,EAAE,CAAA;AAEjD,MAAA,MAAMU,SAAQC,WAAAA,EAAW;AACzB,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC/B,GAAA,CAAI,MAAA,GAAS,CAAA,GAAID,MAAAA,CAAM,YAAA,CAAa,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,QAC7EA,OAAM,aAAA;AAAc,OACrB,CAAA;AACD,MAAA,WAAA,CAAY,CAAC,CAAA;AACb,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,YAAA,CAAa,IAAI,CAAC,CAAA,GAAI,MAAMA,MAAAA,CAAM,cAAc,EAAE,SAAA,EAAW,GAAA,CAAI,CAAC,GAAG,KAAA,EAAO,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA;AACtF,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,SAAS,GAAA,EAAc;AACrB,MAAA,QAAA,CAAS,gBAAgB,GAAG,CAAA,GAAI,sBAAA,GAAyB,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC5E,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,EAAE,CAAC,CAAA;AAE5B,EAAAM,UAAU,MAAM;AAAE,IAAA,KAAK,IAAA,EAAK;AAAA,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAEvC,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACb,CAAC,EAAA,KAAe,SAAA,CAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG,IAAA,IAAQ,EAAA;AAAA,IAC5D,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM;AACzB,IAAA,MAAM,IAAA,GAAO,YAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA,GAAI,QAAA;AAC7E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACtB,KAAK,CAAA,CAAE,EAAA;AAAA,MACP,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AAAA,MAC7B,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,WAAW,CAAA,CAAE;AAAA,KACf,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,SAAA,EAAW,MAAM,CAAC,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MAAM,IAAA,CAAK,MAAA;AAAA,MACT,CAAC,KAAK,CAAA,MAAO;AAAA,QACX,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,MAAA;AAAA,QACvB,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,CAAA,CAAE,QAAA;AAAA,QAC3B,SAAA,EAAW,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE;AAAA,OAC/B,CAAA;AAAA,MACA,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,WAAW,CAAA;AAAE,KACzC;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,MAAMC,sBAAqB,CAAE,MAAA;AAAA,MAC3B,CAAC,MAAuB,CAAC,CAAA,CAAE,gBAAgB,CAAA,CAAE,YAAA,KAAiB,QAAA,CAAS,IAAA,IAAQ,SAAS;AAAA,KAC1F;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAIA,EAAAD,UAAU,MAAM;AAAE,IAAA,aAAA,CAAc,EAAE,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAG7C,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC7B,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,EAAE,CAAA;AACV,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,aAAA,CAAc,UAAU,CAAA;AAExB,IAAA,MAAA,CAAO,WAAW,MAAM,WAAA,CAAY,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAAA,EACzD,CAAA;AACA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,IAAA,WAAA,CAAY,EAAE,CAAA;AAAG,IAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,IAAA,WAAA,CAAY,KAAK,CAAA;AAAG,IAAA,aAAA,CAAc,UAAU,CAAA;AAAA,EAC3F,CAAA;AAIA,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAK,CAAC,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,OAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,SAAS,CAAA,GACxB,QAAA,GAAW,MAAM,SAAA,GAAY,MAAA,GAAS,KAAA,CAAM,SAAA,GAAY,MAAA,GACzD,IAAA;AAKJ,EAAA,MAAM,IAAA,GAAOhB,iBAAM,MAAA,CAAO,EAAE,SAAS,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,CAAA;AAC1E,EAAA,IAAA,CAAK,UAAU,EAAE,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,aAAa,IAAA,EAAK;AAC9D,EAAA,MAAM,YAAA,GAAe,QAAkC,OAAO;AAAA,IAC5D,EAAA,EAAI,wBAAA;AAAA,IACJ,QAAA,EAAU,MAAA;AAAA,IACV,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,kBAAA;AAAA,IACd,UAAU,MAAM;AACd,MAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA,eAAA,EAAa,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,QAClC,MAAA,EAAQ,EAAE,MAAA,EAAQ,cAAA,EAAgB,EAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAK;AAAA,QAC1E,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,wBAAA;AAAA,UACR,SAAA,EAAW,EAAE,OAAA,CAAQ,EAAA;AAAA,UACrB,WAAA,EAAa,EAAE,OAAA,CAAQ,IAAA;AAAA,UACvB,SAAA,EAAW,EAAE,SAAA,IAAa,IAAA;AAAA,UAC1B,MAAA,EAAQ,EAAE,KAAA,CAAM,MAAA;AAAA,UAChB,QAAA,EAAU,EAAE,KAAA,CAAM,QAAA;AAAA,UAClB,SAAA,EAAW,EAAE,KAAA,CAAM;AAAA;AACrB,OACF;AAAA,IACF,CAAA;AAAA,IACA,OAAO,qBAAA,CAAsB;AAAA,MAC3B,WAAA,EAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAAA,MAC5C,WAAW,MAAM;AAAE,QAAA,KAAK,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,MAAE;AAAA,KAC7C;AAAA,GACH,CAAA,EAAI,EAAE,CAAA;AACN,EAAA,eAAA,CAAgB,YAAY,CAAA;AAE5B,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM;AACzB,IAAA,MAAMkB,OAAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,IAAA,IAAI,CAACA,OAAAA,EAAQ;AAAE,MAAA,KAAA,CAAM,MAAM,wBAAwB,CAAA;AAAG,MAAA;AAAA,IAAO;AAC7D,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,QAClC,SAAA;AAAA,QACA,YAAA,EAAc,IAAA;AAAA,QACd,QAAA,EAAUA,OAAAA;AAAA,QACV,YAAY,UAAA,IAAc,KAAA,CAAA;AAAA,QAC1B,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,QACrB,UAAA,EAAY,aAAA,CAAc,UAAA,EAAY,QAAA,EAAU;AAAA,OACjD,CAAA;AACD,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AAAE,QAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAAG,QAAA;AAAA,MAAO;AACtE,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,yBAAA,EAAyB,MAAA,CAAO,SAAS,CAAA,CAAA,CAAG,CAAA;AAC1D,MAAA,KAAA,EAAM;AACN,MAAA,MAAM,IAAA,EAAK;AAAA,IACb,SAAS,GAAA,EAAc;AACrB,MAAA,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC/B,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAKA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEhB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,0BACzDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA0C;AAAA,SAAA,EAC3D,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,WAAC,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACXC,IAAAA,CAAC,IAAA,EAAA,EAAW,WAAU,yDAAA,EACpB,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAA4C,CAAA;AAAA,wBAC3DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA0C;AAAA,OAAA,EAAA,EAFlD,CAGT,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AAGT,IAAA,MAAM,UAAU,KAAA,KAAU,sBAAA;AAC1B,IAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,OAAA,GACV,qFAAA,GACA,yFACD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAIb,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAACE,eAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,oBAAA;AAAA,QACN,WAAA,kBACED,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAlB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,gBAAM,MAAA,EAAO,CAAA;AAAA,UAAO,kBAAA;AAAA,UAAW,GAAA;AAAA,0BAC/DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,gBAAM,QAAA,EAAS,CAAA;AAAA,UAAO,8BAAA;AAAA,UAA0B,GAAA;AAAA,0BAChFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,gBAAM,SAAA,EAAU,CAAA;AAAA,UAAO;AAAA,SAAA,EAErF,CAAA;AAAA,QAEF,OAAA,EAAS,SAAA,oBACPC,IAAAA,CAAAiB,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAjB,IAAAA;AAAA,YAACE,MAAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cAAQ,IAAA,EAAK,IAAA;AAAA,cACrB,OAAA,EAAS,MAAM,KAAA,CAAM;AAAA,gBACnB,KAAA,EAAO,WAAA;AAAA,gBACP,IAAA,EAAM,4BAAA;AAAA,gBACN,KAAA,EAAO,CAAA,wBAAA,EAA2B,OAAA,CAAQ,IAAI,CAAA;AAAA,eAC/C,CAAA;AAAA,cAED,QAAA,EAAA;AAAA,gCAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAEjD;AAAA,0BACAC,KAACE,MAAAA,EAAA,EAAO,SAAS,MAAM,IAAA,CAAK,SAAS,CAAA,EACnC,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,YAAE;AAAA,WAAA,EAErC;AAAA,SAAA,EACF;AAAA;AAAA,KAEJ;AAAA,IAEC,CAAC,SAAA;AAAA;AAAA;AAAA,oBAIAH,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFAAA,EAAsF,QAAA,EAAA;AAAA,MAAA,iFAAA;AAAA,sBAErFD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAA8B,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,MAAO;AAAA,KAAA,EAC5E,CAAA;AAAA,IAGD,SAAS,MAAA,GAAS,CAAA,oBACjBC,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,gBAAA,EACf,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBACpEC,IAAAA,CAACkB,MAAAA,EAAA,EAAO,KAAA,EAAO,SAAA,EAAW,eAAe,YAAA,EACvC,QAAA,EAAA;AAAA,wBAAAnB,GAAAA,CAACoB,eAAA,EAAc,SAAA,EAAW,OAAO,QAAA,kBAAApB,GAAAA,CAACqB,WAAAA,EAAA,EAAY,CAAA,EAAE,CAAA;AAAA,wBAChDrB,GAAAA,CAACsB,aAAAA,EAAA,EACE,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,CAAA,qBACbtB,GAAAA,CAACuB,YAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,EAAA,EAC7B,iBAAO,MAAA,CAAO,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA,IAAK,EAAE,GAAA,IAAO,CAAA,CAAE,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAA,EADxD,CAAA,CAAE,EAEnB,CACD,CAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAOFvB,IAACwB,KAAAA,EAAA,EAAM,MAAM,IAAA,KAAS,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA,KAAe;AAAE,MAAA,IAAI,CAAC,GAAG,KAAA,EAAM;AAAA,IAAE,GAC1E,QAAA,kBAAAvB,IAAAA,CAACwB,YAAAA,EAAA,EAAa,WAAU,aAAA,EACtB,QAAA,EAAA;AAAA,sBAAAxB,IAAAA,CAACyB,aAAA,EACC,QAAA,EAAA;AAAA,wBAAA1B,GAAAA,CAAC2B,UAAAA,EAAA,EAAW,QAAA,EAAA,qBAAA,EAAgB,CAAA;AAAA,wBAC5B3B,GAAAA,CAAC4B,gBAAAA,EAAA,EAAiB,QAAA,EAAA,8EAAA,EAElB;AAAA,OAAA,EACF,CAAA;AAAA,sBACF3B,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAIb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,sBAAA,EACZ,yBAAe,GAAA,CAAI,CAAC,sBACnBA,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAE1B,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA;AAAA,YAC9B,WAAW,CAAA,wEAAA,EACT,IAAA,KAAS,CAAA,CAAE,KAAA,GACP,uCACA,4DACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UATE,CAAA,CAAE;AAAA,SAWV,CAAA,EACH,CAAA;AAAA,wBAOAF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BACtEA,GAAAA;AAAA,cAAC6B,KAAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,WAAA;AAAA,gBACL,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,SAAA;AAAA,gBACV,GAAA,EAAK,CAAA;AAAA,gBACL,KAAA,EAAO,QAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC3C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,oBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,oBAAA,KAAK,MAAA,EAAO;AAAA,kBAAE;AAC3D,kBAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,oBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,oBAAA,KAAA,EAAM;AAAA,kBAAE;AAAA,gBACxD,CAAA;AAAA,gBACA,WAAA,EAAY,GAAA;AAAA,gBACZ,SAAA,EAAW,GAAG,KAAK,CAAA,2BAAA;AAAA;AAAA,aACrB;AAAA,4BAEA7B,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,QAAA,EAAS,SAAA,EAAU,0CAAA,EAClC,QAAA,EAAA,WAAA,KAAgB,IAAA,mBACfC,IAAAA,CAAAiB,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,8BAAQlB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,gBAAM,SAAA,EAAU;AAAA,aAAA,EAAO,CAAA,mBAE7FC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAlB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,gBAAM,SAAA,EAAU,CAAA;AAAA,8BAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAS,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,8BAC1BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,qCAAA,EAAwC,cAAc,CAAA,GAAI,kBAAA,GAAqB,iBAAiB,CAAA,CAAA,EAC9G,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,cACC,cAAc,CAAA,oBAAKA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,wBAAA,EAAgB;AAAA,aAAA,EAC9E,CAAA,EAEF;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAC,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAClEC,IAAAA,CAACkB,MAAAA,EAAA,EAAO,OAAO,UAAA,IAAc,cAAA,EAAgB,aAAA,EAAe,CAAC,MAAM,aAAA,CAAc,CAAA,KAAM,cAAA,GAAiB,EAAA,GAAK,CAAC,CAAA,EAC5G,QAAA,EAAA;AAAA,8BAAAnB,GAAAA,CAACoB,eAAA,EAAc,SAAA,EAAW,OAAO,QAAA,kBAAApB,GAAAA,CAACqB,WAAAA,EAAA,EAAY,CAAA,EAAE,CAAA;AAAA,8BAChDpB,IAAAA,CAACqB,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAtB,GAAAA,CAACuB,UAAAA,EAAA,EAAW,KAAA,EAAO,gBAAgB,QAAA,EAAA,WAAA,EAAM,CAAA;AAAA,gBACxC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBAAMvB,GAAAA,CAACuB,UAAAA,EAAA,EAAuB,KAAA,EAAO,EAAE,GAAA,EAAM,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EAAxB,CAAA,CAAE,GAA4B,CAAa;AAAA,eAAA,EAClF;AAAA,aAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAtB,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,OAAA,EACf,QAAA,EAAA;AAAA,4BAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CACb,QAAA,EAAA,IAAA,KAAS,SAAA,GAAY,cAAc,QAAA,EACtC,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC6B,KAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,UAAA;AAAA,gBACP,KAAK,QAAA,EAAS;AAAA,gBACd,QAAA,EAAU,CAAC,CAAA,KAAM,aAAA,CAAc,EAAE,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AAAA,gBAC3D,SAAA,EAAW;AAAA;AAAA;AACb,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,QAAA,mBACC5B,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,YAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,kBAAA,EAAU,CAAA;AAAA,0BACtEA,GAAAA;AAAA,YAAC6B,KAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAS,IAAA;AAAA,cACT,KAAA,EAAO,IAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACvC,SAAA,EAAW,KAAA;AAAA,cACX,WAAA,EAAY;AAAA;AAAA;AACd,SAAA,EACF,oBAEA7B,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,YAC/B,SAAA,EAAU,yGAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAGJ,CAAA;AAAA,sBAEAF,IAAAA,CAAC6B,WAAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,MAAA,KAAW,CAAA;AAAA,wBAEV9B,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAwC,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,wBAE/EA,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAQ,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAClEH,GAAAA,CAACG,MAAAA,EAAA,EAAO,SAAS,MAAM,KAAK,MAAA,EAAO,EAAG,UAAU,MAAA,IAAU,MAAA,KAAW,CAAA,EAClE,QAAA,EAAA,MAAA,GAAS,sBAAc,WAAA,EAC1B;AAAA,OAAA,EACF;AAAA,KAAA,EACA,CAAA,EACF,CAAA;AAAA,IAEC,SAAA,KAAc,IAAA,CAAK,MAAA,KAAW,CAAA,mBAC7BH,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qFAAA,EAAsF,QAAA,EAAA,qEAAA,EAEnG,CAAA,mBAEAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,sBACTC,IAAAA,CAAC,IAAA,EAAA,EAAe,SAAA,EAAU,yDAAA,EACxB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,YAAE,QAAA,EAAS,CAAA;AAAA,sBACzDC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,QAAA;AAAA,QAAS;AAAA,OAAA,EAAU,CAAA;AAAA,sBACtED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,YAAE,SAAA,EAAU;AAAA,KAAA,EAAA,EAH3E,CAAA,CAAE,GAIX,CACD,CAAA,EACH,CAAA,CAAA;AAAA,IAGD,UAAU,MAAA,GAAS,CAAA,oBAClBC,IAAAA,CAAC,SAAA,EAAA,EAAQ,WAAU,gBAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,uBAAA,EAAkB,CAAA;AAAA,sBACxDA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACX,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,qBACdC,IAAAA,CAAC,IAAA,EAAA,EAAc,WAAU,+DAAA,EACvB,QAAA,EAAA;AAAA,wBAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,2CAA2C,CAAA,CAAE,QAAA,GAAW,IAAI,kBAAA,GAAqB,kBAAkB,CAAA,CAAA,EACjH,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,GAAI,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA,GAAK,EAAE,QAAA,EACzC,CAAA;AAAA,wBACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAkB,QAAA,EAAA,CAAA,CAAE,UAAA,IAAc,EAAE,IAAA,EAAK,CAAA;AAAA,wBACzDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCACb,QAAA,EAAA,IAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,SAAS,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAA,EACnE;AAAA,OAAA,EAAA,EAPO,CAAA,CAAE,EAQX,CACD,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AC/fO,IAAM,qBAAA,GAAwB,eAAA;AAE9B,IAAM,uBAAA,GAA0B,aAAa,qBAAqB,CAAA,CAAA;AAGzE,IAAM,UAAA,GAAa,aAAA;AAEZ,SAAS,qBAAqB,UAAA,EAA4B;AAC/D,EAAA,OAAO,CAAA,EAAG,uBAAuB,CAAA,CAAA,EAAI,UAAU,IAAI,UAAU,CAAA,CAAA;AAC/D;AASO,SAAS,kBAAA,CAAmB,UAAA,EAAoB,QAAA,EAAkB,IAAA,GAAwB,MAAA,EAAgB;AAC/G,EAAA,MAAM,OAAO,CAAA,EAAG,oBAAA,CAAqB,UAAU,CAAC,IAAI,QAAQ,CAAA,CAAA;AAC5D,EAAA,OAAO,IAAA,KAAS,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA,GAAU,IAAA;AAC5C;AASO,SAAS,2BAA2B,IAAA,EAA8B;AACvE,EAAA,MAAM,MAAM,IAAA,KAAS,OAAO,WAAW,WAAA,GAAc,EAAA,GAAK,OAAO,QAAA,CAAS,IAAA,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAClD,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,uBAAuB,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AACrC,EAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AACpD;ACzBA,IAAM,cAAA,GAAiB,qBAAqB,iBAAiB,CAAA;AActD,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAU,aAAY,EAI1D;AACD,EAAA,MAAM,IAAA,GAAOD,gBAAAA,CAAM,OAAA,CAAQ,MAAM,WAAA,QAAmB,eAAA,EAAgB,EAAG,CAAC,WAAW,CAAC,CAAA;AACpF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAAAA,CAAM,SAAmC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAMA,gBAAAA,CAAM,MAAA,CAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAOA,gBAAAA,CAAM,WAAA,CAAY,MAAM;AACnC,IAAA,IAAI,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,EAAY;AAAE,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AAC3E,IAAA,KAAK,IAAA,CAAK,oBAAA,EAAqB,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAAA,gBAAAA,CAAM,SAAA,CAAU,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAE5B,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAsB;AAClC,MAAA,IAAI,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAc,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC/E,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC3C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAI,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,QAAA,GAAA,CAAY,IAAA,IAAQ,EAAC,EAAG,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,KAAO,KAAK,CAAA,IAAK,IAAA;AACjE,EAAA,MAAM,YAAA,GAAA,CAAgB,QAAQ,EAAC,EAAG,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAElE,EAAA,MAAM,QAAQ,QAAA,GACV,CAAA,EAAG,SAAS,IAAI,CAAA,QAAA,EAAM,oBAAoB,QAAQ,CAAC,CAAA,CAAA,GACnD,YAAA,GACE,4BAAoB,YAAA,CAAa,IAAI,WAAM,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA,GAC5E,mBAAA;AAEN,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,GAAA,EACxB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACE,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAU,iKAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,0BACxDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACjDA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,KAClE;AAAA,IAEC,IAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kFAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,WAAA,CAAY,IAAI,CAAA;AAAA,UAAE,CAAA;AAAA,UACnD,SAAA,EAAU,iJAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAC9B;AAAA,sBACAH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,IAAA,EAAM,YAAA,GAAe,mBAAA,CAAoB,YAAY,CAAA,GAAI,uDAAA;AAAA,YACzD,QAAQ,KAAA,IAAS,IAAA;AAAA,YACjB,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,IAAI,CAAA;AAAG,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YAAE;AAAA;AAAA,SAClD;AAAA,QAAA,CACE,QAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,wBACjBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,OAAO,GAAA,CAAI,IAAA;AAAA,YACX,IAAA,EAAM,oBAAoB,GAAG,CAAA;AAAA,YAC7B,MAAA,EAAQ,IAAI,EAAA,KAAO,KAAA;AAAA,YACnB,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AAAG,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YAAE;AAAA,WAAA;AAAA,UAJ7C,GAAA,CAAI;AAAA,SAMZ;AAAA,OAAA,EACH,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,eAAA,CAAgB,cAAc,CAAA;AAAA,UAAE,CAAA;AAAA,UACjE,SAAA,EAAU,2IAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAGD,4BACCH,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,QAChC,SAAA,EAAW,CAAC,EAAA,KAAO;AAAE,UAAA,WAAA,CAAY,KAAK,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAG,UAAA,IAAA,EAAK;AAAA,QAAE;AAAA;AAAA;AAChE,GAAA,EAEJ,CAAA;AAEJ;AAUA,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,SAAA,EAAU,EAG3C;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,WAAWA,gBAAAA,CAAM,OAAA;AAAA,IACrB,MAAM,mBAAA,CAAoB,gBAAA,CAAiB,MAAmC,CAAA;AAAA,IAC9E;AAAC,GACH;AAKA,EAAA,uBACEC,IAACwB,KAAAA,EAAA,EAAM,MAAI,IAAA,EAAC,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,IAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,EAAE,GACzD,QAAA,kBAAAvB,IAAAA,CAACwB,YAAAA,EAAA,EAAa,MAAK,KAAA,EACjB,QAAA,EAAA;AAAA,oBAAAzB,GAAAA,CAAC0B,aAAA,EACC,QAAA,kBAAA1B,IAAC2B,UAAAA,EAAA,EAAW,4BAAc,CAAA,EAC5B,CAAA;AAAA,oBACA1B,IAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,WAAA,EAClB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+FAA+F,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC5HA,GAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAW,gBAAA,CAAiB,MAAA;AAAA,UAC5B,IAAA,EAAK,QAAA;AAAA,UACL,UAAA,EAAW,YAAA;AAAA,UACX,QAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,OAAO,IAAA,KAAS;AACxB,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA,CAAO,IAAa,CAAA;AACnD,cAAA,SAAA,CAAW,QAA2B,EAAE,CAAA;AAAA,YAC1C,SAAS,CAAA,EAAG;AACV,cAAA,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,YAC1B;AAAA,UACF;AAAA;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAQ,EAK5C;AACD,EAAA,uBACEC,IAAAA;AAAA,IAACE,MAAAA;AAAA,IAAA;AAAA,MAAO,OAAA,EAAQ,MAAA;AAAA,MAAO,IAAA,EAAK,MAAA;AAAA,MAC1B,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW,CAAA,qIAAA,EAAwI,MAAA,GAAS,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,MAE9K,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAiC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,GACxD;AAEJ;AChLA,IAAM,OAAA,GAAU,aAAA;AAOT,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAU,aAAY,EAIlE;AACD,EAAA,MAAM,IAAA,GAAOD,gBAAAA,CAAM,OAAA,CAAQ,MAAM,WAAA,QAAmBgC,eAAAA,EAAgB,EAAG,CAAC,WAAW,CAAC,CAAA;AACpF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIhC,gBAAAA,CAAM,SAAmC,IAAI,CAAA;AAErE,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,OAAO,IAAA,CAAK,oBAAA,KAAyB,UAAA,EAAY;AAAE,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AAC3E,IAAA,KAAK,IAAA,CAAK,oBAAA,EAAqB,CAC5B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CAChD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAC9C,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,MAAA,GAAA,CAAU,QAAQ,EAAC,EAAG,OAAO,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,SAAS,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,KAAK,CAAA,IAAK,IAAA;AAEzD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAACkB,MAAAA,EAAA,EAAO,KAAA,EAAO,KAAA,IAAS,SAAS,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,MAAM,OAAA,GAAU,IAAA,GAAO,CAAC,CAAA,EAAG,QAAA,EAAU,QAAQ,IAAA,EAC3G,QAAA,EAAA;AAAA,sBAAAnB,IAACoB,aAAAA,EAAA,EAAc,0BAAApB,GAAAA,CAACqB,WAAAA,EAAA,EAAY,CAAA,EAAE,CAAA;AAAA,sBAC9BpB,IAAAA,CAACqB,aAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAtB,GAAAA,CAACuB,UAAAA,EAAA,EAAW,KAAA,EAAO,SAAS,QAAA,EAAA,uCAAA,EAAgC,CAAA;AAAA,QAC3D,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qBACXtB,KAACsB,UAAAA,EAAA,EAAwB,KAAA,EAAO,GAAA,CAAI,EAAA,EACjC,QAAA,EAAA;AAAA,UAAA,GAAA,CAAI,IAAA;AAAA,UACJ,GAAA,CAAI,aAAA,KAAkB,KAAA,GAAQ,kCAAA,GAA0B;AAAA,SAAA,EAAA,EAF1C,GAAA,CAAI,EAGrB,CACD;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAtB,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAA,EACV,QAAA,EAAA;AAAA,MAAA,MAAA,EAAQ,kBAAkB,KAAA,GACvB,sFAAA,GACA,MAAA,CAAO,MAAA,KAAW,IAChB,iCAAA,GACA,kCAAA;AAAA,sBACNA,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM6B,eAAAA,CAAgB,oBAAA,CAAqB,0BAA0B,CAAC,CAAA;AAAA,UAC/E,SAAA,EAAU,iFAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,MAAA,KAAW,IAAI,iBAAA,GAAoB,kBAAA;AAAA,4BAC3ChC,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAAA;AACpC,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACxDA,IAAM,QAAA,GAAW,CAAC,MAAA,KAAoC,MAAA,CAAO,UAAA,KAAe,KAAA;AAuB5E,IAAM,WAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,KAAA,EAAO,2BAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,KAAA,CAAM,KAAA,EAAgB,QAAA,GAAW,KAAA,EAAO;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,QAAA;AAChC,EAAA,OAAO,cAAA,CAAe,GAAG,QAAQ,CAAA;AACnC;AAGO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,MACJ,SAAA,CAAU,KAAK,EACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,WAAA,EAAY,CACZ,IAAA,GACA,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAC3B;AAOA,SAAS,aAAa,WAAA,EAAoD;AACxE,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,SAAU,GAAA,CAAyB,MAAA;AACzC,MAAA,OAAO,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,EAAG,GAAA,IAAO,MAAA,GAAS,CAAC,CAAA,EAAG,GAAA;AAAA,IAC/D,CAAA;AAAA,IACA,MAAA,EAAQ,OAAO,IAAA,EAAM,GAAA,KAAQ;AAC3B,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,2CAA2C,CAAA;AACxE,MAAA,MAAM,QAAQ,MAAM,WAAA,GAAc,kBAAA,CAAmB,GAAA,CAAI,IAAI,IAAI,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACf,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,sBAAA,CACd,YAAA,GAAe,KAAA,EACf,WAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,iBAAA;AAAA,MAAmB,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAC/D,KAAA,EAAO,SAAA;AAAA,MAAW,WAAA,EAAa,8BAAA;AAAA,MAC/B,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EAIb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,aAAU,GAAA,EAAK,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,wBACrDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,cAAI,IAAA,EAAK,CAAA;AAAA,UAC7C,GAAA,CAAI,uBAAOA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,cAAI,GAAA,EAAI;AAAA,SAAA,EACpE;AAAA,OAAA,EACF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,SAAA;AAAA,MAChD,WAAA,EAAa,yBAAA;AAAA,MACb,IAAA,EAAM,6EAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,CAAA;AAAA,MAClF,WAAA,EAAa,uDAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,mBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,QAAA,EAAU,IAAA;AAAA,MACnE,KAAA,EAAO,SAAA;AAAA,MAAW,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAChF,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA,MAG7B,UAAA,EAAY,CAAC,CAAA,EAAG,GAAA,qBACdC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,gBAAM,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAE,CAAA;AAAA,QACrD,GAAA,CAAI,cAAA,GAAiB,GAAA,CAAI,KAAA,oBACxBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,QAAQ,CAAA,EACzC;AAAA,OAAA,EAEJ;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAC5E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,yEAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAAW,WAAA,EAAa,KAAA;AAAA,MACrF,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,IAAK,CAAA;AAC/C,QAAA,IAAI,WAAW,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,OAAA,IAAW,OAAO,OAAO,IAAA;AAC3D,QAAA,MAAM,GAAA,GAAA,CAAQ,OAAA,GAAU,KAAA,IAAS,OAAA,GAAW,GAAA;AAC5C,QAAA,OAAO,EAAE,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,IAAA,EAAM,UAAA,EAAW;AAAA,MAC5D;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,KAAA;AAAA,MAAO,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAC/C,WAAA,EAAa,SAAA;AAAA,MAAW,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,WAAA;AAAA,MAAa,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA,MAIlF,UAAA,EAAY,KAAA;AAAA,MACZ,IAAA,EAAM,kFAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACvB,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,iBAAA,EAAoB,CAAA,KAAM,CAAA,GAAI,8BAAA,GAAiC,CAAA,IAAK,CAAA,GAAI,iBAAA,GAAoB,EAAE,IAC5G,QAAA,EAAA,CAAA,EACH,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAC7D,KAAA,EAAO,YAAA;AAAA,MAAc,IAAA,EAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,aAAa,8CAAA,EAAmC;AAAA,QACrF,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,yBAAA,EAAuB;AAAA,QACvE,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,UAAA,EAAY,aAAa,wCAAA;AAAsC,OAC9F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA;AAC7B,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6E,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,KAAK,CAAA,CAAA,EAC9H,QAAA,EAAA,YAAA,CAAa,CAAC,KAAK,CAAA,EACtB,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,kBAAA;AAAA,MAAoB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,YAAA;AAAA,MACpE,WAAA,EAAa,GAAA;AAAA,MAAK,IAAA,EAAM,yBAAA;AAAA,MAA2B,WAAA,EAAa;AAAA,KAClE;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,wBAAA;AAAA,MAAoB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MAC9E,WAAA,EAAa,2CAAA;AAAA,MACb,IAAA,EAAM,8BAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,sBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MACtF,WAAA,EAAa,qDAAA;AAAA,MACb,IAAA,EAAM,yCAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,mBAAA;AAAA,MAAkB,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MACtF,IAAA,EAAM,2FAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MAAO,YAAA,EAAc;AAAA,KACpC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAA,EAAK,mBAAA;AAAA,MAAqB,KAAA,EAAO,mBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC/F,IAAA,EAAM,wFAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe,KAAA;AAAA,MAC/C,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,OAAQ,KAAA,IAA2B,IAAA;AAAA,UACnC,QAAA;AAAA,UACA;AAAA;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC/E,IAAA,EAAM,yHAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MACb,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe,KAAA;AAAA,MAC/C,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,OAAQ,KAAA,IAA2B,IAAA;AAAA,UACnC,QAAA;AAAA,UACA;AAAA;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,GAAA,EAAK,CAAA;AAAA,MAAG,WAAA,EAAa,KAAA;AAAA,MACtF,IAAA,EAAM,6EAAA;AAAA,MACN,WAAA,EAAa,KAAA;AAAA,MAAO,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe;AAAA,KACrE;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,SAAA;AAAA,MAAW,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,UAAA;AAAA,MAAY,WAAA,EAAa,KAAA;AAAA,MACrF,IAAA,EAAM,wDAAA;AAAA,MACN,SAAS,CAAC,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,MAAK,EAAG,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,KAAI,EAAG,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAChG,WAAA,EAAa,CAAC,MAAA,KAAW,MAAA,CAAO,UAAA,KAAe;AAAA,KACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,eAAe,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,IAC1H,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,gBAAgB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,IAC1H,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,oBAAoB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,IAC/H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,wBAAA;AAAA,MAA0B,IAAA,EAAM,aAAA;AAAA,MAAe,KAAA,EAAO,UAAA;AAAA,MAC9E,WAAA,EAAa,KAAA;AAAA,MAAO,WAAA,EAAa,QAAA;AAAA,MACjC,IAAA,EAAM,8GAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,cAAA,EAAe;AAAA,QAC9C,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,QAAA,EAAS;AAAA,QACtC,EAAE,KAAA,EAAO,WAAA,EAAU,KAAA,EAAO,SAAA;AAAU;AACtC;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWd,IAAA,EAAM,EAAE,KAAA,EAAO,mBAAA,EAAoB;AAAA,IACnC,MAAA;AAAA,IACA,WAAA,EAAa;AAAA;AAAA,MAEX,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,qBAAe,OAAA,EAAS,CAAA,EAAG,WAAW,IAAA,EAAK;AAAA,MACnE,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,YAAS,WAAA,EAAa,wDAAA,EAAuD,SAAS,CAAA,EAAE;AAAA,MAChH,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA,EAAE;AAAA,MAChD,EAAE,IAAI,YAAA,EAAc,KAAA,EAAO,oBAAc,WAAA,EAAa,wCAAA,EAA0C,SAAS,CAAA,EAAE;AAAA,MAC3G,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,eAAe,WAAA,EAAa,oDAAA,EAAsD,SAAS,CAAA,EAAE;AAAA,MACjH;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EACE,6OAAA;AAAA,QACF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAAA,IAC/C,KAAA,EAAO,WAAA,GAAc,YAAA,CAAa,WAAW,CAAA,GAAI,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,YAAY,WAAA,GACR;AAAA,MACE;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,gBAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA;AAAY,OACvB;AAAA,MACA;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,WAAA;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW,kBAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA;AAAY,OACvB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA;AAAA,QACE,EAAA,EAAI,WAAA;AAAA,QACJ,KAAA,EAAO,gBAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,mBAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA;AAAY;AACvB,KACF,GACA;AAAA,GACN;AACF;AC5WA,IAAMiC,YAAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,KAAA,EAAO,2BAAA;AAAA,EACP,OAAA,EAAS,+BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,uBAAA,GAA+C;AAC7D,EAAA,MAAM,MAAA,GAAqB;AAAA;AAAA,IAEzB;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,cAAA;AAAA,MAAgB,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAC7D,KAAA,EAAO,QAAA;AAAA,MAAU,WAAA,EAAa,eAAA;AAAA,MAC9B,IAAA,EAAM,iEAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfhC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sBAAA,EAAwB,cAAI,KAAA,EAAM,CAAA;AAAA,QAC9C,GAAA,CAAI,wBAAQA,GAAAA,CAAC,OAAE,SAAA,EAAU,yCAAA,EAA2C,cAAI,IAAA,EAAK;AAAA,OAAA,EAChF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,QAAA;AAAA,MACnD,WAAA,EAAa,YAAA;AAAA,MACb,IAAA,EAAM,oFAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACjC;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACpF,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,aAAa,6BAAA,EAA8B;AAAA,QACvF,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,aAAa,6BAAA,EAA8B;AAAA,QACzF,EAAE,KAAA,EAAO,iBAAA,EAAgB,KAAA,EAAO,eAAA,EAAiB,aAAa,yBAAA;AAA0B,OAC1F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,MAAA,GAAiC;AAAA,UACrC,UAAA,EAAY,YAAA;AAAA,UAAc,YAAA,EAAc,YAAA;AAAA,UAAc,aAAA,EAAe,iBAAA;AAAA,UAAgB,WAAA,EAAa;AAAA,SACpG;AACA,QAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAE,CAAA;AAAA,MACjF;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClE,WAAA,EAAa,IAAA;AAAA,MACb,IAAA,EAAM,qFAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA,GAAA,CAAI,IAAA,KAAS,YAAA,GACV,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GACZ,GAAA,CAAI,IAAA,KAAS,eAAA,GACX,QAAA,GACAkC,cAAAA,CAAe,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EACpD;AAAA,KAEJ;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,kBAAA;AAAA,MAAiB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,QAAA;AAAA,MAAU,GAAA,EAAK,CAAA;AAAA,MACpF,QAAA,EAAU,KAAA;AAAA,MAAO,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MACvD,WAAA,EAAa,eAAA;AAAA,MACb,IAAA,EAAM,yFAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,gBAAA;AAAA,MAAkB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,YAAA;AAAA,MAAc,IAAA,EAAM,iCAAA;AAAA,MAAmC,WAAA,EAAa;AAAA,KACnF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MAAmB,KAAA,EAAO,qBAAA;AAAA,MAAuB,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,QAAA;AAAA,MAC9E,IAAA,EAAM,oGAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,QAAA;AAAA,MACvC,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACfjC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,SAAA;AAAA,QAAW,GAAA,CAAI,UAAA,GAAa,CAAA,GAAA,EAAM,GAAA,CAAI,UAAU,CAAA,CAAA,GAAK;AAAA,OAAA,EAC5D;AAAA,KAEJ;AAAA;AAAA,IAGA,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,WAAA,EAAU,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,KAAA,EAAM;AAAA,IACxF;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,UAAA;AAAA,MAClD,IAAA,EAAM,sCAAA;AAAA,MAAkC,WAAA,EAAa;AAAA,KACvD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,CAAA;AAAA,MAC5F,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,aAAa,4BAAA,EAA0B;AAAA,QAC5E,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,gBAAA,EAAiB;AAAA,QACjE,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,aAAa,qCAAA;AAAmC,OAC5F;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,OAAO,CAAA;AAC7B,QAAA,uBACED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0EAAA,EAA6EiC,YAAAA,CAAY,CAAC,CAAA,IAAKA,YAAAA,CAAY,KAAK,CAAA,CAAA,EAC9H,QAAA,EAAA,CAAA,EACH,CAAA;AAAA,MAEJ;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,IAAA,EAAM,KAAA;AAAA,IACN,YAAA,EAAc,OAAA;AAAA,IACd,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,SAAS,CAAA,EAAE;AAAA,MAC3C,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,SAAS,WAAA,EAAa,wDAAA,EAAuD,SAAS,CAAA,EAAE;AAAA,MAC7G,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,gBAAA,EAAkB,SAAS,CAAA,EAAE;AAAA,MACpD,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,aAAA,EAAY,SAAS,CAAA;AAAE,KAClD;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,QAAA,EAAU,SAAS;AAAA,GACjD;AACF;;;AClIO,IAAM,4BAAA,GAA+B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA,CAyB1C,IAAA,EAAK;ACvBA,SAAS,uBAAA,GAA+C;AAC7D,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACjE,WAAA,EAAa,WAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC1D,WAAA,EAAa,WAAA;AAAA,MACb,IAAA,EAAM,sEAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMjC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KAChG;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC9D,WAAA,EAAa,mCAAA;AAAA,MACb,IAAA,EAAM,sDAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,0BAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MAAS,GAAA,EAAK,CAAA;AAAA,MACvE,IAAA,EAAM,oCAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAE;AAAA;AAC9F,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,SAAS,CAAA;AAAE;AAChD,GACF;AACF;AC3CO,SAAS,yBAAA,GAAmD;AACjE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACpE,WAAA,EAAa,eAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,eAAA;AAAA,MAAiB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,OAAA;AAAA,MAC5D,WAAA,EAAa,YAAA;AAAA,MACb,IAAA,EAAM,2EAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KAChG;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,kDAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,oBAAU,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,SAAA,CAAA,EACvC,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,SAAA;AAAA,MAAW,KAAA,EAAO,OAAA;AAAA,MAC9D,IAAA,EAAM,gEAAA;AAAA;AAAA;AAAA,MAGN,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAa;AAAA,QACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAA;AAAY,OACvC;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBACXA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0EAAA,EACf,CAAA,GAAI,iCAAA,GAAoC,2BAC1C,CAAA,CAAA,EACG,QAAA,EAAA,CAAA,GAAI,cAAc,UAAA,EACrB;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MAAS,GAAA,EAAK,CAAA;AAAA,MACvE,IAAA,EAAM,yBAAA;AAAA,MAA2B,WAAA,EAAa;AAAA,KAChD;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,wBAAA;AAAA,MAAoB,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MAC9E,WAAA,EAAa,2CAAA;AAAA,MACb,IAAA,EAAM,yCAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,sBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,CAAA;AAAA,MACtF,WAAA,EAAa,gDAAA;AAAA,MACb,WAAA,EAAa;AAAA;AACf,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,gBAAA;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,OAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,eAAA,EAAW,SAAS,CAAA,EAAE;AAAA,MAC5C,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,eAAe,WAAA,EAAa,0DAAA,EAAsD,SAAS,CAAA;AAAE;AACnH;AAAA;AAAA;AAAA,GAKF;AACF;ACnFA,IAAMiC,YAAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,iCAAA;AAAA,EACR,QAAA,EAAU,2BAAA;AAAA,EACV,OAAA,EAAS,+BAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,IAAME,aAAAA,GAAuC;AAAA,EAC3C,MAAA,EAAQ,OAAA;AAAA,EAAS,QAAA,EAAU,WAAA;AAAA,EAAa,OAAA,EAAS,UAAA;AAAA,EAAY,QAAA,EAAU;AACzE,CAAA;AAEO,SAAS,uBAAA,CAAwB,eAAe,KAAA,EAA4B;AACjF,EAAA,MAAMC,MAAAA,GAAQ,CAAC,CAAA,KAAeF,cAAAA,CAAe,OAAO,CAAC,CAAA,IAAK,GAAG,YAAY,CAAA;AAEzE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACjE,WAAA,EAAa,wBAAA;AAAA,MACb,IAAA,EAAM,0EAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMlC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,EAAE,CAAA,EAAE;AAAA,KACtF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MAAkB,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,UAAA;AAAA,MAAY,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC7F,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,4DAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAAoC,MAAAA,CAAM,CAAC,CAAA,EAAE;AAAA,KACxF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,SAAA;AAAA,MAAW,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MACtE,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,IAAA,EAAM,iDAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,qBAAMpC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAAoC,MAAAA,CAAM,CAAC,CAAA,EAAE;AAAA,KAC9E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MAAU,KAAA,EAAO,QAAA;AAAA,MAAU,IAAA,EAAM,WAAA;AAAA,MAAa,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,CAAA;AAAA,MACxE,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,QACtE,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,aAAa,8BAAA;AAA+B,OACxF;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC7B,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,IAAK,QAAQ,CAAA;AAC9B,QAAA,uBACEpC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,6EAA6EiC,YAAAA,CAAY,CAAC,CAAA,IAAKA,YAAAA,CAAY,MAAM,CAAA,CAAA,EAC/H,QAAA,EAAAE,aAAAA,CAAa,CAAC,KAAK,CAAA,EACtB,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MAAiB,KAAA,EAAO,2BAAA;AAAA,MAA0B,IAAA,EAAM,OAAA;AAAA,MAAS,KAAA,EAAO,WAAA;AAAA,MAC7E,WAAA,EAAa,UAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMnC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,QAAG,CAAA,EAAE;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAAQ,KAAA,EAAO,WAAA;AAAA,MAC1D,IAAA,EAAM,wBAAA;AAAA,MAAuB,WAAA,EAAa;AAAA,KAC5C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,kBAAA;AAAA,MAAc,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,WAAA;AAAA,MAAa,IAAA,EAAM,CAAA;AAAA,MAC9E,WAAA,EAAa,sBAAA;AAAA,MAAkB,WAAA,EAAa;AAAA;AAC9C,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,WAAA;AAAA,IACb,cAAA,EAAgB,MAAA;AAAA,IAChB,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAU,SAAS,CAAA,EAAE;AAAA,MAC1C,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,iBAAA,EAAgB,SAAS,CAAA;AAAE,KACvD;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ;AAAA,GAClE;AACF;ACtFA,IAAM,MAAA,GAAiC;AAAA,EACrC,KAAA,EAAO,6BAAA;AAAA,EACP,OAAA,EAAS,iCAAA;AAAA,EACT,KAAA,EAAO,6BAAA;AAAA,EACP,IAAA,EAAM,2BAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,4BAAA,GAAyD;AACvE,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MACjE,WAAA,EAAa,SAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAC/C,YAAY,CAAC,EAAA,EAAI,GAAA,qBACfA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,sEAAA,EAAyE,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,OAAO,KAAK,CAAA,CAAA,EACxH,cAAI,IAAA,EACP;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MAAS,KAAA,EAAO,KAAA;AAAA,MAAO,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,OAAA;AAAA,MACnD,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,QAClC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAAA,QACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,UAAA,EAAQ;AAAA,QACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA;AAAU,OACtC;AAAA,MACA,IAAA,EAAM,oDAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,2BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,CAAA,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,MAAA,CAAO,CAAA,IAAK,QAAG,CAAA,EAAE;AAAA,KAC/E;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,MAAA;AAAA,MAC7C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,MAAA,GAAS,CAAA;AAC5C,QAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,oBAAU,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,SAAA,CAAA,EACvC,CAAA;AAAA,MAEJ;AAAA;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,UAAA,EAAY,QAAA;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,CAAA,EAAG;AAAA,GAC3D;AACF;AC1DO,SAAS,eAAA,CAAgB,GAA6BoC,MAAAA,EAAsC;AACjG,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,CAAE,SAAA,IAAa,IAAA,IAAQ,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,MAAA,EAAI,CAAA,CAAE,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,OAAA,IACzF,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,SAAA,CAAW,CAAA;AAAA,OAAA,IACzD,CAAA,CAAE,aAAa,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,OAAA,EAAO,CAAA,CAAE,SAAS,CAAA,QAAA,CAAU,CAAA;AAErE,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,EAAE,QAAA,IAAY,IAAA,QAAY,IAAA,CAAK,CAAA,OAAA,EAAUA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,MAAA,EAAIA,OAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,OAAA,IAClG,CAAA,CAAE,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,UAAUA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,OAAA,IAC7D,CAAA,CAAE,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,iBAAcA,MAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,CAAA;AAEzE,EAAA,IAAI,CAAA,CAAE,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAe,IAAI,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAClG,EAAA,IAAI,CAAA,CAAE,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CAAE,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AAExG,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,mBAAA;AAC5C;AAOO,SAAS,8BAAA,CAA+B,eAAe,KAAA,EAAsC;AAClG,EAAA,MAAMA,MAAAA,GAAQ,CAAC,CAAA,KAAcF,cAAAA,CAAe,GAAG,YAAY,CAAA;AAE3D,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,mBAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjD;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MAAe,KAAA,EAAO,iBAAA;AAAA,MAAa,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,CAAA;AAAA,MAChF,WAAA,EAAa,8BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MAAM,WAAA,EAAa;AAAA,KACjC;AAAA;AAAA,IAGA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MAAa,KAAA,EAAO,sBAAA;AAAA,MAAqB,IAAA,EAAM,QAAA;AAAA,MAAU,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAClF,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,iBAAA;AAAA,MAAgB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC9E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,iBAAA;AAAA,MAAgB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,GAAA,EAAK,CAAA;AAAA,MAC9E,QAAA,EAAU,YAAA;AAAA,MAAc,cAAA,EAAgB,IAAA;AAAA,MAAM,cAAA,EAAgB,OAAA;AAAA,MAC9D,WAAA,EAAa,eAAA;AAAA,MAAc,WAAA,EAAa;AAAA,KAC1C;AAAA,IACA,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,kBAAA,EAAoB,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAM;AAAA,IACjG,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,iBAAA,EAAmB,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAM;AAAA;AAAA,IAGjG;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MAAiB,KAAA,EAAO,OAAA;AAAA,MAAS,IAAA,EAAM,MAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,KAAA;AAAA,MAChD,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,qBACflC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,eAAA,CAAgB,GAAA,EAAKoC,MAAK,CAAA,EAAE;AAAA,KAEzE;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MAAc,KAAA,EAAO,UAAA;AAAA,MAAY,IAAA,EAAM,QAAA;AAAA,MAC5C,UAAA,EAAY,KAAA;AAAA,MAAO,WAAA,EAAa,IAAA;AAAA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChD,UAAA,EAAY,CAAC,CAAA,qBACXpC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA,CAAA,IAAK,IAAA,GAAO,QAAA,GAAM,MAAA,CAAO,CAAC,CAAA,EAC7B;AAAA;AAEJ,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,UAAA,EAAY,WAAA;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA,EAAE;AAAA,MAC7C;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QAAQ,KAAA,EAAO,OAAA;AAAA,QAAS,OAAA,EAAS,CAAA;AAAA,QACrC,WAAA,EAAa;AAAA;AACf;AACF,GACF;AACF;;;AC3FO,SAAS,8BAA8B,QAAA,EAAuD;AACnG,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAgD;AACzD,MAAA,MAAM,SAAS,MAAM,oBAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAM,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAO,GAAI;AAAA,OAC5C;AACA,MAAA,OAAO;AAAA,QACL,GAAG,UAAA,CAAW,MAAA,CAAO,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,QAC1C,GAAI,MAAA,CAAO,MAAA,IAAU,EAAE,QAAQ,IAAA,EAAK;AAAA,QACpC,GAAI,MAAA,CAAO,KAAA,IAAS,EAAE,OAAO,IAAA;AAAK,OACpC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAwB;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAA;AAGd,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,QAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AACnE,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,QAAQ,EAAE,aAAA,CAAc;AAAA,QACpD,GAAI,KAAA;AAAA,QACJ;AAAA,OACqB,CAAA;AACvB,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA0C;AACjE,MAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,IAAA,EAAK;AACxB,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAa,CAAC,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,EAAG;AAE1D,QAAA,KAAA,CAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,CAAc,IAAI,KAA2B,CAAA;AACrF,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,CAAc,EAAE,CAAA;AACxC,MAAA,sBAAA,EAAuB;AAAA,IACzB;AAAA,GACF;AACF;;;AC3DO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,EAAE,aAAA,EAAc;AACnD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,IAAA,IAAQ,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACrF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe;AAAA,QACtC,GAAI,KAAA;AAAA;AAAA;AAAA,QAGJ,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,GAAI;AAAA,OACvC,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AAEnE,MAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,OAAM,GAAI,IAAA;AACvC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,QAAA,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,GAAI,IAAA;AAAA,MACtE;AACA,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAI,KAA4B,CAAA;AAAA,IAC1E,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;ACrCO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,EAAE,cAAA,EAAe;AACpD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,IAAA,IAAQ,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACpF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe;AAAA,QACtC,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,MAAA;AAAA,QAC5B,WAAA,EAAa,MAAM,WAAA,IAAe,MAAA;AAAA;AAAA;AAAA,QAGlC,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK,IAAK,MAAA;AAAA,QACpC,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,OACR,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AACnE,MAAA,MAAM,QAA6B,EAAC;AACpC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA,EAAM,MAAK,IAAK,MAAA;AAC/D,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,EAAW,KAAA,CAAM,cAAc,IAAA,CAAK,WAAA;AAC7D,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW,KAAA,CAAM,WAAW,IAAA,CAAK,QAAA,EAAU,MAAK,IAAK,IAAA;AAC3E,MAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AACzD,MAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,IAAI,KAAK,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,cAAA,CAAe,EAAE,CAAA;AAAA,IAC3C;AAAA,GACF;AACF;;;ACvCA,SAAS,mBAAmB,CAAA,EAA+B;AACzD,EAAA,IAAI,CAAC,CAAA,CAAE,eAAA,EAAiB,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAC1F,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,iCACd,QAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAmD;AAC5D,MAAA,MAAM,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAQ,MAAM,CAAA,CAAE,eAAA,QAAwB,EAAC;AAC/C,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,MAAA,IAAU,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GACvF,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,gBAAA,CAAkB;AAAA,QACzB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAAA,QAC/B,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAK,IAAK,MAAA;AAAA,QAChC,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,cAAA,EAAgB,MAAM,cAAA,IAAkB,IAAA;AAAA,QACxC,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,OACN,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAgD;AACvE,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAK9C,MAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,GAAG,OAAM,GAAI,IAAA;AAC3C,MAAA,OAAO,CAAA,CAAE,gBAAA,CAAkB,EAAA,EAAI,KAA8B,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAM,CAAA,CAAE,iBAAkB,EAAE,CAAA;AAAA,IAC9B;AAAA,GACF;AACF;;;ACnDA,SAAS,iBAAiB,CAAA,EAA+B;AACvD,EAAA,IAAI,CAAC,CAAA,CAAE,aAAA,EAAe,MAAM,IAAI,MAAM,iDAAiD,CAAA;AACvF,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,+BACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAiD;AAC1D,MAAA,MAAM,OAAQ,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,aAAA,QAAsB,EAAC;AAC7D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,aAAA,IAAiB,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC7F,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAyB;AACpC,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,cAAA,CAAgB;AAAA,QACvB,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAK,IAAK,MAAA;AAAA,QAC5B,cAAA,EAAgB,MAAA,CAAO,KAAA,CAAM,cAAc,CAAA,IAAK,CAAA;AAAA,QAChD,MAAA,EAAQ,MAAM,MAAA,IAAU,QAAA;AAAA,QACxB,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,aAAA,EAAe,MAAM,aAAA,IAAiB,IAAA;AAAA,QACtC,IAAA,EAAM,MAAM,IAAA,IAAQ;AAAA,OACE,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAA4C;AACnE,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAI5C,MAAA,MAAM,EAAE,cAAA,EAAgB,KAAA,EAAO,GAAG,OAAM,GAAI,IAAA;AAC5C,MAAA,OAAO,CAAA,CAAE,cAAA,CAAgB,EAAA,EAAI,KAA4B,CAAA;AAAA,IAC3D,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC5C,MAAA,MAAM,CAAA,CAAE,eAAgB,EAAE,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;;;AC5CA,SAAS,cAAc,CAAA,EAA+B;AACpD,EAAA,IAAI,CAAC,CAAA,CAAE,kBAAA,EAAoB,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACjG,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,oCACd,QAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAsD;AAC/D,MAAA,MAAM,OAAQ,MAAM,OAAA,CAAQ,QAAQ,CAAA,CAAE,kBAAA,QAA2B,EAAC;AAClE,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KACX,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,WAAA,IAAe,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC3F,IAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA8B;AACzC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,OAAO,EAAE,mBAAA,CAAqB;AAAA,QAC5B,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,OACK,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAsD;AAC7E,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAIzC,MAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,GAAG,OAAM,GAAI,IAAA;AAC5C,MAAA,OAAO,CAAA,CAAE,mBAAA,CAAqB,EAAA,EAAI,KAAiC,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACzC,MAAA,MAAM,CAAA,CAAE,oBAAqB,EAAE,CAAA;AAAA,IACjC;AAAA,GACF;AACF;;;ACxCA,SAAS,gBAAgB,CAAA,EAA+B;AACtD,EAAA,IAAI,CAAC,CAAA,CAAE,oBAAA,EAAsB,MAAM,IAAI,MAAM,wDAAwD,CAAA;AACrG,EAAA,OAAO,CAAA;AACT;AAOO,SAAS,sBAAA,CAAuB,GAAiB,CAAA,EAA6B;AACnF,EAAA,MAAM,MAAA,GAAS,EAAE,WAAA,IAAe,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,EAAE,UAAA,IAAc,CAAA;AAC9B,EAAA,IAAI,EAAE,SAAA,IAAa,IAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,OAAO,KAAA;AACxD,EAAA,IAAI,EAAE,SAAA,IAAa,IAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,OAAO,KAAA;AACxD,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,KAAA,GAAQ,CAAA,CAAE,UAAU,OAAO,KAAA;AACrD,EAAA,IAAI,EAAE,QAAA,IAAY,IAAA,IAAQ,KAAA,GAAQ,CAAA,CAAE,UAAU,OAAO,KAAA;AAGrD,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,EAAW,KAAA,CAAM,GAAG,EAAE,CAAA;AACvC,EAAA,IAAI,EAAE,WAAA,KAAgB,CAAC,UAAU,MAAA,GAAS,CAAA,CAAE,cAAc,OAAO,KAAA;AACjE,EAAA,IAAI,EAAE,YAAA,KAAiB,CAAC,UAAU,MAAA,GAAS,CAAA,CAAE,eAAe,OAAO,KAAA;AACnE,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sCACd,QAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAmD;AAC5D,MAAA,MAAM,CAAA,GAAI,QAAQ,QAAQ,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAQ,MAAM,CAAA,CAAE,oBAAA,QAA6B,EAAC;AAIpD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,MAAM,CAAA,CAAE,aAAA,EAAc,CAAE,KAAA,CAAM,MAAM,EAAoB,CAAA,GAAI,EAAC;AAC7F,MAAA,MAAM,UAAA,GAA2B,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChD,GAAG,CAAA;AAAA,QACH,UAAA,EAAY,UAAU,MAAA,CAAO,CAAC,MAAM,sBAAA,CAAuB,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE;AAAA,OACpE,CAAE,CAAA;AACF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,WAAA,EAAY;AAC9C,MAAA,MAAM,QAAA,GAAW,OACb,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KACjB,CAAA,CAAE,KAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA,IAAA,CAAM,EAAE,WAAA,IAAe,EAAA,EAAI,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,GAC3F,UAAA;AACJ,MAAA,OAAO,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,IAAA;AACd,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,qBAAA,CAAuB;AAAA,QAC7C,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC7B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,SAAA,EAAW,MAAM,SAAA,IAAa,IAAA;AAAA,QAC9B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,YAAA,EAAc,MAAM,YAAA,IAAgB;AAAA,OACP,CAAA;AAC/B,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,CAAA,EAAE;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAgD;AACvE,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAE3C,MAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,GAAG,OAAM,GAAI,IAAA;AACzC,MAAA,MAAM,OAAA,GAAU,MAAM,CAAA,CAAE,qBAAA,CAAuB,IAAI,KAAmC,CAAA;AACtF,MAAA,OAAO,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,CAAA,EAAE;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC3C,MAAA,MAAM,CAAA,CAAE,sBAAuB,EAAE,CAAA;AAAA,IACnC;AAAA,GACF;AACF;AC7DA,IAAM,WAAA,GAAc,GAAA;AA6Bb,SAAS,gBAAA,CACd,QAAA,EACA,QAAA,GAA0B,EAAC,EACN;AACrB,EAAA,MAAM,OAAOD,gBAAAA,CAAM,OAAA;AAAA,IACjB,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,IAAIgC,eAAAA,EAAgB;AAAA,IACtD,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,MAAM,YAAY,OAAO,IAAA,CAAK,qBAAqB,UAAA,IAAc,OAAO,KAAK,mBAAA,KAAwB,UAAA;AAErG,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhC,gBAAAA,CAAM,SAA+B,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAS,SAAS,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAEpE,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,KAAK,IAAA,CACF,gBAAA,EAAkB,CAClB,IAAA,CAAK,CAAC,QAAA,KAAa;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,QAAQ,CAAA;AAAA,IAAE,CAAC,CAAA,CAC1D,KAAA,CAAM,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAAE,CAAC,CAAA,CAC9D,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAAE,CAAC,CAAA;AACtD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAKpB,EAAA,MAAM,UAAA,GAAaA,gBAAAA,CAAM,MAAA,CAAiC,EAAE,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAWA,gBAAAA,CAAM,MAAA,CAA6C,IAAI,CAAA;AAExE,EAAAA,gBAAAA,CAAM,SAAA,CAAU,MAAM,MAAM;AAAE,IAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,EAAE,CAAA,EAAG,EAAE,CAAA;AAExF,EAAA,MAAM,MAAMA,gBAAAA,CAAM,WAAA;AAAA,IAChB,CAAC,KAAA,KAAoC;AAEnC,MAAA,SAAA,CAAU,CAAC,aAAa,EAAE,GAAI,WAAW,EAAC,EAAI,GAAG,KAAA,EAAM,CAAE,CAAA;AACzD,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,UAAU,EAAE,GAAG,UAAA,CAAW,OAAA,EAAS,GAAG,KAAA,EAAM;AACvD,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,MAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,QAAA,UAAA,CAAW,UAAU,EAAC;AACtB,QAAA,KAAK,IAAA,CACF,mBAAA,CAAqB,OAAO,CAAA,CAG5B,IAAA,CAAK,CAAC,KAAA,KAAU,SAAA,CAAU,KAAK,CAAC,CAAA,CAChC,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAC,EACtC,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACnC,GAAG,WAAW,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQA,gBAAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,GAAG,QAAA,EAAU,GAAI,MAAA,IAAU,EAAC,EAAG,CAAA,EAAI,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAE1F,EAAA,OAAO,EAAE,OAAO,MAAA,EAAQ,GAAA,EAAK,SAAS,MAAA,EAAQ,KAAA,EAAO,WAAW,SAAA,EAAU;AAC5E;ACpGO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAUG;AACD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACApC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,oDAAA;AAAA,wBACOD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,QAAO;AAAA,OAAA,EAE9E;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACsC,QAAAA,EAAA,EAAS,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,sBAC7CtC,GAAAA,CAACsC,QAAAA,EAAA,EAAS,WAAU,wBAAA,EAAyB;AAAA,KAAA,EAC/C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACErC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACArC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,4MAAA,EAG1C,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/D,CAAA;AAAA,IAED,QAAA;AAAA,oBACDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACZ,kCACCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE,iCAAA;AAAA,MACxB;AAAA,KAAA,EAC5B,CAAA,GACE,MAAA,mBACFpC,IAAAA,CAAAiB,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAlB,GAAAA,CAACuC,OAAAA,EAAA,EAAQ,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,MAAE;AAAA,KAAA,EAE3D,CAAA,mBAEAtC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAlB,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE;AAAA,KAAA,EAE5C,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACrFA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAY;AAAA,EACnC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA,EAAgB;AAAA,EACvC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,eAAA,EAAW;AAAA,EAClC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sBAAA;AACzB,CAAA;AAEA,IAAM,OAAA,GAAU;AAAA,EACd,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,uBAAA,EAAqB;AAAA,EAC9C,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,cAAA,EAAe;AAAA,EACxC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA;AAC3B,CAAA;AASO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAU,QAAA,EAAS,EAA8B;AACtF,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAA,EAAU;AAAA,IAC1C,QAAA,EAAU,UAAU,IAAA,IAAQ,KAAA;AAAA,IAC5B,MAAA,EAAQ,UAAU,MAAA,IAAU,OAAA;AAAA,IAC5B,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY,KAAA;AAAA,IACZ,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AAEvB,EAAA,uBACEC,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,MAAA,EAAO,aAAY,sCAAA,EACtC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAY,4CAAA;AAAA,UACZ,KAAA,EAAO,MAAM,QAAA,IAAY,KAAA;AAAA,UACzB,OAAA,EAAS,UAAA;AAAA,UACT,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,QAAA,EAAU,GAAG;AAAA;AAAA,OACtC;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,kBAAA;AAAA,UACN,WAAA,EAAY,oDAAA;AAAA,UACZ,KAAA,EAAO,MAAM,MAAA,IAAU,OAAA;AAAA,UACvB,OAAA,EAAS,OAAA;AAAA,UACT,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,MAAA,EAAQ,GAAG;AAAA;AAAA;AACpC,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,aAAA,EAAW,aAAY,iDAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,4BAAA;AAAA,UACN,WAAA,EAAY,sCAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,IAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA,OAC5C;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,YAAA;AAAA,UACN,WAAA,EAAY,gDAAA;AAAA,UACZ,OAAA,EAAS,MAAM,UAAA,IAAc,KAAA;AAAA,UAC7B,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,UAAA,EAAY,GAAG;AAAA;AAAA;AACxC,KAAA,EACF,CAAA;AAAA,oBAQAC,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,oBAAA,EAAe,aAAY,4BAAA,EAC9C,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,uBAAA;AAAA,UACN,WAAA,EAAY,wCAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,IAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA,OAC5C;AAAA,sBACAA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,yBAAA;AAAA,UACN,WAAA,EAAY,+CAAA;AAAA,UACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,KAAA;AAAA,UACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA;AAC5C,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACvFO,SAAS,sBAAA,CACd,SACA,IAAA,EACe;AACf,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,IAAA;AAC3B,EAAA,IAAI,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,OAAO,IAAA;AAC9C,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;ACHO,SAAS,mBAAmB,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,QAAO,EAKxE;AACD,EAAA,MAAM,IAAA,GAAO,UAAU,KAAA,KAAU,WAAA;AAEjC,EAAA,uBACEC,KAAC,IAAA,EAAA,EAAG,SAAA,EAAW,4CAA4C,QAAA,GAAW,cAAA,GAAiB,EAAE,CAAA,CAAA,EAGvF,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACE,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAc,QAAA;AAAA,QACd,UAAU,CAAC,IAAA;AAAA,QACX,OAAA,EAAS,MAAM,QAAA,CAAS,SAAS,CAAA;AAAA,QACjC,SAAA,EAAW,CAAA,gGAAA,EACT,IAAA,GAAO,mBAAA,GAAsB,oCAC/B,CAAA,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,gFACT,QAAA,GAAW,gBAAA,GAAmB,4BAChC,CAAA,CAAA,EAAI,IAAA,GAAO,KAAK,YAAY,CAAA,CAAA;AAAA,cAE3B,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,WACjE;AAAA,0BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAsB,CAAA;AAAA,0BACrCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,oBAAU,IAAA,EAAK,CAAA;AAAA,8BAC9DA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO;AAAA,aAAA,EACrC,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,QAAA,GACG,8BAAA,GACA,IAAA,GACE,uDAAA,GACA,SAAA,CAAU,WAAA,IAAe,yBAAA,EACjC;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,oBAIAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,CAAO,SAAS,CAAA;AAAA,QAC/B,SAAA,EAAU,4JAAA;AAAA,QAET,iBAAO,uBAAA,GAAuB;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAKO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,QAAA,EAAS,EAGlD;AACD,EAAA,uBACEH,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,QAAA,GAAW,cAAA,GAAiB,IACzC,QAAA,kBAAAC,IAAAA;AAAA,IAACE,MAAAA;AAAA,IAAA;AAAA,MAAO,OAAA,EAAQ,MAAA;AAAA,MAAO,IAAA,EAAK,MAAA;AAAA,MAC1B,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAU,wHAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW,CAAA,6EAAA,EACT,QAAA,GAAW,gBAAA,GAAmB,4BAChC,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,QAAA,oBAAYA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,SACjE;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,qDAAA,EAAwC,CAAA;AAAA,0BACtFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAA6C,QAAA,EAAA,mIAAA,EAG7D;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;ACrFA,IAAM,OAAA,GAA4E;AAAA,EAChF,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,kBAAA,EAAmB;AAAA,EACvD,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,yBAAA,EAAqB,MAAM,uBAAA,EAAwB;AAAA,EAClF,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,wBAAA,EAAoB,MAAM,uBAAA,EAAwB;AAAA,EAChF,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,oBAAA,EAAqB;AAAA,EAC/D,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,MAAM,4BAAA,EAA0B;AAAA,EACpE,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,qBAAA,EAAuB,MAAM,2BAAA;AACxD,CAAA;AA0BA,IAAM,kBAAA,GAAqB,CAAC,UAAU,CAAA;AAE/B,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAQ,CAAA;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,EAAE,YAAW,GAAI,aAAA,CAAc,EAAE,YAAA,EAAc,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,CAAA;AACnF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAkC,IAAI,CAAA;AAC5E,EAAA,MAAM,iBAAiB,2BAAA,EAA4B;AAEnD,EAAA,MAAM,cAAcA,gBAAAA,CAAM,WAAA;AAAA,IACxB,CAAC,SAAA,KAAgC;AAG/B,MAAA,IAAI,cAAA,sBAAoC,SAAS,CAAA;AAAA,uBAChC,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,UAAUA,gBAAAA,CAAM,OAAA;AAAA,IACpB,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,kBAAA,CAAmB,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,IAC5F,CAAC,UAAU;AAAA,GACb;AACA,EAAA,MAAM,IAAA,GAAOA,gBAAAA,CAAM,OAAA,CAAQ,MAAM,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAW,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAE1F,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,cAAA,IAAkB,EAAC;AAGxC,EAAA,MAAM,gBAAgB,CAAC,CAAC,KAAA,CAAM,eAAA,IACzB,CAAC,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,KAAA,CAAM,eAAe,CAAA,IAClD,KAAK,MAAA,KAAW,CAAA;AAIrB,EAAA,MAAM,SAAA,GAAYA,gBAAAA,CAAM,MAAA,CAAsB,IAAI,CAAA;AAClD,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,OAAA,EAAS;AAC7C,IAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAClF,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,SAAA,CAAU,OAAA,GAAU,KAAA,CAAM,eAAA;AACrD,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,CAAM,eAAA,EAAiB,SAAS,SAAA,EAAW,QAAA,CAAS,OAAA,EAAS,GAAG,CAAC,CAAA;AAE3E,EAAA,uBACEE,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACuC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EAAY,8GAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAxC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,gBAAA;AAAA,cACN,WAAA,EAAY,qEAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AAAA,cAChE,UAAU,CAAC,IAAA,KAAS,IAAI,EAAE,cAAA,EAAgB,MAA6B;AAAA;AAAA,WACzE;AAAA,UACC,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,mCAC3BC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EACX,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,YAAE,6CAAA;AAAA,4BACdrC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YAAS;AAAA,WAAA,EAG9F;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAEAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,0BAChDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,8KAAA,EAGxD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAS,MAAM,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,OAAA,EACtD,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACZ,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAoC,QAAA,EAAA,iEAAA,EAEjD,CAAA,mBAEAC,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,UAAA,EAAW,IAAA,EAAK,YAAA,EAAa,YAAA,EAAW,YAAA,EACnD,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,qBACZD,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YAEC,SAAA;AAAA,YACA,QAAA,EAAU,KAAA,CAAM,eAAA,KAAoB,SAAA,CAAU,IAAA;AAAA,YAC9C,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,cAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAM,cAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,YAAE,CAAA;AAAA,YAC9E,MAAA,EAAQ;AAAA,WAAA;AAAA,UAJH,SAAA,CAAU;AAAA,SAMlB,CAAA;AAAA,wBACDA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,MAAM,eAAA,KAAoB,EAAA;AAAA,YACpC,UAAU,MAAM;AAAE,cAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAM,cAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,EAAA,EAAI,CAAA;AAAA,YAAE;AAAA;AAAA;AAC3E,OAAA,EACF,CAAA,EAEJ,CAAA;AAAA,MACC,UAAU,OAAA,oBACTC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,gEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtEpC,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAe,oBAAU,OAAA,EAAQ,CAAA;AAAA,UAAS;AAAA,SAAA,EAE9D;AAAA,OAAA,EACF,CAAA;AAAA,MAED,aAAA,oBACCC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2DAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,QAAE,mBAAA;AAAA,wBACxCrC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAe,gBAAM,eAAA,EAAgB,CAAA;AAAA,QAAS;AAAA,OAAA,EAGnF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,MAAA;AAAA,QACN,YAAA,EAAc,SAAA;AAAA,QACd,UAAA;AAAA,QAGA,UAAA,EAAY,kBAAA;AAAA,QACZ,QAAA,EAAU,CAAC,SAAA,KAAc;AACvB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,WAAA,CAAY,SAAS,CAAA;AAAA,QACvB;AAAA;AAAA,KACF;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,CAAC,CAAC,QAAA;AAAA,QACR,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,UAAA,IAAI,CAAC,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAAE;AAAA;AAAA;AACzD,GAAA,EACF,CAAA;AAEJ;ACjLA,IAAM,MAAA,GAA2F;AAAA,EAC/F,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,iBAAiB,MAAA,EAAQ,IAAA,EAAM,MAAM,oDAAA,EAA6C;AAAA,EACxG,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,UAAU,MAAA,EAAQ,IAAA,EAAM,MAAM,8DAAA,EAAoD;AAAA,EACzG,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,MAAM,qEAAA,EAA2D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpG,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,MAAM,8GAAA,EAAoG;AAAA,EAClJ,EAAE,KAAK,YAAA,EAAc,KAAA,EAAO,OAAO,MAAA,EAAQ,IAAA,EAAM,MAAM,+CAAA,EAAwC;AAAA,EAC/F,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,aAAA,EAAY,QAAQ,IAAA,EAAK;AAAA,EACjD,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,aAAU,MAAA,EAAQ,IAAA,EAAM,MAAM,0CAAA,EAAqC;AAAA,EAC3F,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EACjD,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAQ,IAAA,EAAK;AAAA,EAC7C,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA;AACvC,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAY;AAAA,EACnC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,kBAAA,EAAmB;AAAA,EAC/C,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,wBAAA;AAC9B,CAAA;AAEA,SAAS,aAAA,CAAc,QAAyC,MAAA,EAAyB;AACvF,EAAA,IAAI,QAAQ,OAAO,UAAA;AACnB,EAAA,IAAI,MAAA,EAAQ,OAAA,KAAY,KAAA,EAAO,OAAO,KAAA;AACtC,EAAA,OAAO,MAAA,EAAQ,WAAW,UAAA,GAAa,UAAA;AACzC;AAEA,SAAS,gBAAgB,MAAA,EAAqC;AAI5D,EAAA,IAAI,WAAW,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAM;AAC/D,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,WAAW,UAAA,EAAW;AAC1D;AAYO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AACpE,EAAA,MAAM,QAAA,GAAW,iBAAiB,QAAA,EAAU;AAAA,IAC1C,aAAA,EAAe,IAAA;AAAA,IACf,qBAAA,EAAuB,KAAA;AAAA,IACvB,cAAA,EAAgB,KAAA;AAAA,IAChB,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,cAAA,IAAkB,EAAC;AAExC,EAAA,MAAM,WAAW,CAAC,GAAA,EAAuB,MAAA,KACvC,GAAA,CAAI,EAAE,cAAA,EAAgB,EAAE,GAAG,MAAA,EAAQ,CAAC,GAAG,GAAG,gBAAgB,MAAM,CAAA,IAAK,CAAA;AAEvE,EAAA,uBACEC,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACuC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,mBAAA;AAAA,QACN,WAAA,EAAY,yDAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAxC,GAAAA;AAAA,YAACyC,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,8BAAA;AAAA,cACN,WAAA,EAAY,yHAAA;AAAA,cACZ,OAAA,EAAS,MAAM,aAAA,IAAiB,IAAA;AAAA,cAChC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,aAAA,EAAe,GAAG;AAAA;AAAA,WAC3C;AAAA,0BACAzC,GAAAA;AAAA,YAACyC,SAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,0BAAA;AAAA,cACN,WAAA,EAAY,gKAAA;AAAA,cACZ,OAAA,EAAS,MAAM,qBAAA,IAAyB,KAAA;AAAA,cACxC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,qBAAA,EAAuB,GAAG,CAAA;AAAA,cACjD,QAAA,EAAU,MAAM,aAAA,KAAkB;AAAA;AAAA,WACpC;AAAA,UACC,KAAA,CAAM,kBAAkB,KAAA,oBACvBzC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,8KAAA,EAGlD;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAEAA,IAACwC,aAAAA,EAAA,EAAc,OAAM,UAAA,EAAW,WAAA,EAAY,kDAC1C,QAAA,kBAAAxC,GAAAA;AAAA,MAACyC,SAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,oBAAA;AAAA,QACN,WAAA,EAAY,yDAAA;AAAA,QACZ,OAAA,EAAS,MAAM,gBAAA,IAAoB,IAAA;AAAA,QACnC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,gBAAA,EAAkB,GAAG;AAAA;AAAA,KAC9C,EACF,CAAA;AAAA,oBAEAzC,GAAAA;AAAA,MAACwC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,4BAAA;AAAA,QACN,WAAA,EAAY,0GAAA;AAAA,QAEZ,QAAA,kBAAAxC,GAAAA;AAAA,UAACyC,SAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,yBAAA;AAAA,YACN,WAAA,EAAY,yEAAA;AAAA,YACZ,OAAA,EAAS,MAAM,cAAA,IAAkB,KAAA;AAAA,YACjC,UAAU,CAAC,CAAA,KAAM,IAAI,EAAE,cAAA,EAAgB,GAAG;AAAA;AAAA;AAC5C;AAAA,KACF;AAAA,oBAEAzC,GAAAA;AAAA,MAACwC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,mBAAA;AAAA,QACN,WAAA,EAAY,iHAAA;AAAA,QAEX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAACjC,MAAAA,qBACXP,GAAAA;AAAA,UAAC0C,SAAAA;AAAA,UAAA;AAAA,YAEC,OAAOnC,MAAAA,CAAM,KAAA;AAAA,YACb,aAAaA,MAAAA,CAAM,IAAA;AAAA,YACnB,KAAA,EAAO,cAAc,MAAA,CAAOA,MAAAA,CAAM,GAAG,CAAA,EAAG,CAAC,CAACA,MAAAA,CAAM,MAAM,CAAA;AAAA,YACtD,OAAA,EAASA,MAAAA,CAAM,MAAA,GAAS,CAAC,EAAE,OAAO,UAAA,EAAY,KAAA,EAAO,wBAAA,EAAuB,CAAA,GAAI,WAAA;AAAA,YAChF,UAAU,CAAC,MAAA,KAAW,QAAA,CAASA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA,YAChD,UAAUA,MAAAA,CAAM;AAAA,WAAA;AAAA,UANXA,MAAAA,CAAM;AAAA,SAQd;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AC9HO,SAAS,iBAAiB,EAAE,QAAA,GAAW,oBAAA,CAAqB,iBAAiB,GAAE,EAEnF;AACD,EAAA,uBACEN,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,sBAChDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAwC,2BAAiB,WAAA,EAAY;AAAA,KAAA,EACpF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,UAAU,gBAAA,EAAkB,QAAA,EAAoB,UAAQ,IAAA,EAAC;AAAA,GAAA,EAC7E,CAAA;AAEJ;ACXO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,QAAA,EAAS,EAA0B;AAC9E,EAAA,MAAM,IAAA,GAAOD,gBAAAA,CAAM,OAAA,CAAQ,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,CAAA,GAAIgC,eAAAA,EAAgB,EAAI,CAAC,QAAQ,CAAC,CAAA;AAC/F,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,WAAU,GAAI,QAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIhC,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAmC,IAAI,CAAA;AAE7E,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,IAAA,CAAK,oBAAA,IAAuB,CAC9B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAY,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CAEpD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,WAAA,CAAY,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAClD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,IAAgB,EAAA;AAEzC,EAAA,MAAM,OAAO,SAAA,IAAa,UAAA;AAC1B,EAAA,MAAM,MAAA,GAAA,CAAU,YAAY,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAS,CAAA;AAE1D,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,QAAE;AAAA,OAAA,EAE/D,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,oSAAA,EAIxD;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACb,QAAA,kBAAAC,IAAAA;AAAA,MAACE,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM6B,eAAAA,CAAgB,oBAAA,CAAqB,0BAA0B,CAAC,CAAA;AAAA,QAC/E,SAAA,EAAU,6FAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAhC,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,0BAC3DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,sBAAY,IAAA,GACT,yBAAA,GACA,OAAO,MAAA,KAAW,CAAA,GAChB,yBACA,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,CAAA,GAAI,QAAA,GAAW,QAAQ,CAAA,iBAAA,CAAA,EACrE,CAAA;AAAA,4BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,MAAA,KAAW,CAAA,GACf,uGAAA,GACA,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,QAAK,CAAA;AAAA,cACnD,OAAO,MAAA,GAAS,CAAA,IAAK,CAAA,GAAA,EAAM,MAAA,CAAO,SAAS,CAAC,CAAA,KAAA;AAAA,aAAA,EAC/C;AAAA,WAAA,EACF,CAAA;AAAA,0BACAD,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,KACjE,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAACwC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,0BAAA;AAAA,QACN,WAAA,EAAY,sLAAA;AAAA,QAEZ,QAAA,kBAAAxC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,6BAAA;AAAA,YACN,WAAA,EAAY,yDAAA;AAAA,YACZ,KAAA,EAAO,IAAA;AAAA,YACP,QAAA,EAAU,YAAA;AAAA,YACV,cAAc,MAAM;AAClB,cAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,cAAA,IAAI,SAAS,UAAA,EAAY,GAAA,CAAI,EAAE,YAAA,EAAc,MAAM,CAAA;AACnD,cAAA,YAAA,CAAa,IAAI,CAAA;AAAA,YACnB,CAAA;AAAA,YACA,WAAA,EAAY,qBAAA;AAAA,YACZ,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACnFO,SAAS,WAAA,CAA8B;AAAA,EAC5C,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU;AACnC,CAAA,EAAwB;AACtB,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,IAAA,EAAK,YAAA,EAAa,YAAA,EAAY,KAAA,EAC3D,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,IAAA,MAAM,MAAA,GAAS,UAAU,MAAA,CAAO,KAAA;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,uBACEC,IAAAA;AAAA,MAACE,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAE1B,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,OAAA;AAAA,QACL,cAAA,EAAc,MAAA;AAAA,QACd,QAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,QACpC,SAAA,EAAW,CAAA,4HAAA,EACT,MAAA,GAAS,6BAAA,GAAgC,iCAC3C,CAAA,oBAAA,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,CAAA,6EAAA,EACT,MAAA,GAAS,gBAAA,GAAmB,4BAC9B,CAAA,CAAA;AAAA,cAEC,QAAA,EAAA,MAAA,oBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iCAAA,EAAkC;AAAA;AAAA,WAC/D;AAAA,0BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,cAAA,IAAA,oBAAQD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,cACjE,MAAA,CAAO;AAAA,aAAA,EACV,CAAA;AAAA,4BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA8C,iBAAO,WAAA,EAAY;AAAA,WAAA,EACnF;AAAA;AAAA,OAAA;AAAA,MAxBK,MAAA,CAAO;AAAA,KAyBd;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACdA,IAAM,QAAuB,EAAE,KAAA,EAAO,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AAEnD,IAAI,KAAA,GAAuB,KAAA;AAC3B,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AAKtC,IAAI,GAAA,GAAM,CAAA;AACV,IAAM,MAAA,GAAS,MAAM,CAAA,KAAA,EAAQ,EAAE,GAAG,CAAA,CAAA;AAGlC,IAAM,QAAA,GAAW,CAAC,IAAA,KAChB,CAAC,KAAK,SAAA,EAAW,IAAA,CAAK,YAAY,EAAA,EAAI,IAAA,CAAK,eAAe,EAAA,EAAI,IAAA,CAAK,cAAc,EAAA,EAAI,IAAA,CAAK,YAAY,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAEpH,SAAS,IAAA,GAAa;AACpB,EAAA,KAAA,MAAW,QAAA,IAAY,WAAW,QAAA,EAAS;AAC7C;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,iBAAiB,IAAA,EAA2B;AAC1D,EAAA,KAAA,GAAQ,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,IAAA,MAAU,EAAE,GAAG,MAAM,EAAA,EAAI,IAAA,CAAK,MAAM,MAAA,EAAO,GAAI,CAAA,EAAE;AAC3F,EAAA,IAAA,EAAK;AACP;AAYO,SAAS,sBAAsB,QAAA,EAAwD;AAC5F,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAC,CAAA;AAC9C,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA;AACzB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,KAAA,CAAM,KAAK,EAAE,GAAG,MAAM,EAAA,EAAI,MAAA,IAAU,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAA,EAAO,GAAG,KAAK,CAAA,EAAE;AACtD,EAAA,IAAA,EAAK;AACL,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAGO,SAAS,kBAAkB,IAAA,EAAkF;AAClH,EAAA,MAAM,GAAA,GAAM,SAAS,IAAyB,CAAA;AAC9C,EAAA,OAAO,KAAA,CAAM,MAAM,IAAA,CAAK,CAAC,aAAa,QAAA,CAAS,QAAQ,MAAM,GAAG,CAAA;AAClE;AAQO,SAAS,yBAAyB,KAAA,EAA8D;AACrG,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACtC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACtC,IAAA,OAAA,EAAA;AACA,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B,CAAC,CAAA;AACD,EAAA,IAAI,OAAA,KAAY,GAAG,OAAO,CAAA;AAC1B,EAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,KAAA,EAAM;AAC1B,EAAA,IAAA,EAAK;AACL,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,uBAAA,CAAwB,IAAY,KAAA,EAA4C;AAC9F,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AAC5D,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,KAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,EAAM;AAChC,EAAA,KAAA,CAAM,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,CAAA,EAAG,GAAG,KAAA,EAAO,EAAA,EAAG;AAC/C,EAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,KAAA,EAAM;AAC1B,EAAA,IAAA,EAAK;AACL,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,wBAAwB,EAAA,EAAqB;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,EAAE,CAAA;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,KAAA;AAChD,EAAA,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,KAAA,EAAM;AAC1B,EAAA,IAAA,EAAK;AACL,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,GAA2B;AACzC,EAAA,KAAA,GAAQ,KAAA;AACR,EAAA,IAAA,EAAK;AACP;AAEO,SAAS,uBAAuB,QAAA,EAAkC;AACvE,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,EAC3B,CAAA;AACF;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,OAAa2C,OAAA,CAAA,oBAAA,CAAqB,sBAAA,EAAwB,gBAAA,EAAkB,gBAAgB,CAAA;AAC9F;;;ACxHO,IAAM,2BAAA,GAA8B;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CA0BzC,IAAA,EAAK;AAMP,IAAM,UAAA,GAA2B;AAAA,EAC/B,EAAA,EAAI,0BAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,WAAA,EACE,0cAAA;AAAA,EAKF,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,kFAAA;AAAA,QACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAS;AAAA;AAExB,CAAA;AAEA,IAAM,aAAA,GAA8B;AAAA,EAClC,EAAA,EAAI,6BAAA;AAAA,EACJ,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EACE,uUAAA;AAAA,EAIF,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,0CAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,QAAA;AAAA,cACN,IAAA,EAAM,CAAC,MAAA,EAAQ,UAAA,EAAY,SAAS,cAAc,CAAA;AAAA,cAClD,WAAA,EACE;AAAA,aAEJ;AAAA,YACA,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iDAAA,EAAkD;AAAA,YACxF,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,YAC7E,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2CAAA,EAA4C;AAAA,YACxF,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAyB;AAAA,YACpE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAyB;AAAA,YAClE,OAAA,EAAS;AAAA,cACP,IAAA,EAAM,QAAA;AAAA,cACN,IAAA,EAAM,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,cACpC,WAAA,EAAa;AAAA,aACf;AAAA,YACA,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qDAAA,EAAsD;AAAA,YAC3F,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yCAAA,EAA0C;AAAA,YACpF,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC7B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC7B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA;AAAgD,WACzF;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS;AAAA;AACvC,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,gFAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6BAAA;AAA8B,WACvE;AAAA,UACA,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ;AAAA;AAC9B;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAO;AAAA;AAEtB,CAAA;AAEA,IAAM,QAAA,GAAyB;AAAA,EAC7B,EAAA,EAAI,wBAAA;AAAA,EACJ,IAAA,EAAM,iBAAA;AAAA,EACN,WAAA,EACE,oNAAA;AAAA,EAEF,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4CAAA,EAA6C;AAAA,MAChF,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,MACjE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC7B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,KAC/B;AAAA,IACA,QAAA,EAAU,CAAC,IAAI;AAAA;AAEnB,CAAA;AAEA,IAAM,YAAA,GAA6B;AAAA,EACjC,EAAA,EAAI,4BAAA;AAAA,EACJ,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EACE,kUAAA;AAAA,EAGF,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAChD,YAAY,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC;AAC7C,CAAA;AAEA,IAAM,cAAA,GAA+B;AAAA,EACnC,EAAA,EAAI,qBAAA;AAAA,EACJ,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EACE,mNAAA;AAAA,EAEF,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,gDAAA;AAAA,QACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAE5B,CAAA;AAEsC;AAAA,EACpC,UAAA,CAAW,EAAA;AAAA,EAAI,aAAA,CAAc,EAAA;AAAA,EAAI,QAAA,CAAS,EAAA;AAAA,EAAI,YAAA,CAAa,EAAA;AAAA,EAAI,cAAA,CAAe;AAChF;AAYA,IAAMC,KAAAA,GAAO,CAAC,KAAA,KAA4B,OAAO,UAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAErF,IAAM,MAAA,GAAS,CAAC,KAAA,KACd,OAAO,KAAA,KAAU,YAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA;AAEhE,IAAM,QAAA,GAA8B,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAElE,IAAM,YAAY,CAAC,KAAA,KACjB,SAAS,QAAA,CAAS,KAAwB,IAAK,KAAA,GAA4B,SAAA;AAG7E,SAAS,aAAa,IAAA,EAA8C;AAClE,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAA,EAAU,KAAK,QAAA,IAAY,MAAA;AAAA,IAC3B,QAAA,EAAU,KAAK,QAAA,IAAY,MAAA;AAAA,IAC3B,KAAA,EAAO,KAAK,KAAA,IAAS,MAAA;AAAA,IACrB,WAAA,EAAa,KAAK,WAAA,IAAe,MAAA;AAAA,IACjC,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,MAAA;AAAA,IAC3C,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAA,EAAU,EAAE,QAAA,IAAY,MAAA;AAAA,MACxB,WAAA,EAAa,EAAE,WAAA,IAAe;AAAA,KAChC,CAAE;AAAA,GACJ;AACF;AAOA,SAAS,aAAA,CAAc,OAAe,KAAA,EAGpC;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAE;AACpD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACrC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,GAAG,CAAA;AACtE,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAE;AACpD,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAE;AACtC;AAEA,SAAS,YAAA,CAAa,KAA8B,KAAA,EAAyC;AAC3F,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,EAAA,EAAI,SAAS,KAAK,CAAA,CAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAA,EAAS,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAAA,IAC9B,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,IACrB,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,IAC/B,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,IACjC,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAAA,IACjC,MAAA,EAAQA,KAAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,GAC9B;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,QAAyB,QAAA,EAAS;AAAA,EACjE;AACA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AACxC,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,UAAA;AAAA,MACX,WAAA;AAAA,MACA,QAAA,EAAUA,KAAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,IAAK;AAAA,KAClC;AAAA,EACF;AACA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,MAAM,OAAOA,KAAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnD,IAAA,MAAM,KAAKA,KAAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,IAAA;AACjD,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,gBAAiC,UAAA,EAAY,IAAA,EAAM,UAAU,EAAA,EAAG;AAAA,EAC/F;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,cAAc,IAAA,EAAkD;AAC9E,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,KAAA;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,IAC3B,WAAA,EAAa,KAAK,WAAA,IAAe,IAAA;AAAA,IACjC,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA;AAAA,IAE3B,MAAM,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,CAAA,GAAK,KAAK,IAAA,IAAQ,CAAA;AAAA,IACpD,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,IAC7B,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,QAAA,EAAU,KAAK,OAAA,KAAY;AAAA,GAC7B;AACF;AAEO,SAAS,uBAAA,CAAwB,EAAE,WAAA,EAAa,OAAA,EAAQ,EAAyC;AACtG,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,MAAoB,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAE,CAAA;AAE5E,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA,GAAI,KAAK,OAAA,GAAU,EAAC,EAC5D,GAAA,CAAIA,KAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACxC,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,YAAA,EAAa;AAClE,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,WAAA,EAAY;AACzB,UAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,UAAA,EAAY;AACxC,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,UACvD;AACA,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,YAC5B,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,KAAU;AAC3B,cAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAW,KAAA,EAAO,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5D,cAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,aAAA,CAAc,OAAO,KAAK,CAAA;AACxD,cAAA,IAAI,UAAU,OAAO,EAAE,OAAO,QAAA,EAAU,YAAA,CAAa,QAAQ,CAAA,EAAE;AAC/D,cAAA,IAAI,OAAA,SAAgB,EAAE,KAAA,EAAO,SAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAE;AAChE,cAAA,OAAO;AAAA,gBACL,KAAA;AAAA,gBACA,QAAA,EAAU,IAAA;AAAA;AAAA;AAAA,gBAGV,IAAA,EACE;AAAA,eAEJ;AAAA,YACF,CAAC;AAAA,WACH;AACA,UAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC7B,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,KACF;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AACtD,QAAA,MAAM,QAA6B,EAAC;AACpC,QAAA,MAAM,IAAA,GAAA,CAA4B,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,GAAO,EAAC,EACvE,GAAA,CAAI,CAAC,OAAY,EAAE,KAAA,EAAOA,KAAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAG,MAAA,EAAQA,KAAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAE,CAAE,CAAA,CACpE,MAAA,CAAO,CAAC,CAAA,KAAwB,EAAE,KAAK,CAAA;AAE1C,QAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,KAAA,EAAY,KAAA,KAAkB;AACzC,UAAA,MAAM,OAAO,YAAA,CAAa,KAAA,IAAS,EAAC,EAAG,MAAM,MAAM,CAAA;AACnD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,YAAA;AAAA,UACF;AAGA,UAAA,IAAA,CAAK,IAAA,CAAK;AAAA,YACR,OAAOA,KAAAA,CAAK,KAAA,EAAO,KAAK,CAAA,IAAK,CAAA,MAAA,EAAS,QAAQ,CAAC,CAAA,CAAA;AAAA,YAC/C,MAAA,EACE;AAAA,WACH,CAAA;AAAA,QACH,CAAC,CAAA;AAED,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAA,EAAc;AAEtF,QAAA,gBAAA,CAAiB,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAChC,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA;AAAA,UACJ,SAAS,KAAA,CAAM,MAAA;AAAA,UACf,QAAA,EAAU,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,QAAQ,CAAA,CAAE,MAAA;AAAA,UACtD,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,QAAQ,CAAA,CAAE,MAAA;AAAA,UACvD,YAAA,EAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAA,CAAE,IAAA,IAAQ,IAAI,CAAA,CAAE,MAAA;AAAA,UAC5E,IAAA;AAAA,UACA,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAAA,UAC1E,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,KACF;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,EAAA,GAAKA,KAAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACvB,QAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,OAAA,EAAQ;AAC5C,QAAA,MAAM,QAAoC,EAAC;AAC3C,QAAA,IAAI,KAAK,OAAA,KAAY,MAAA,QAAiB,OAAA,GAAU,SAAA,CAAU,KAAK,OAAO,CAAA;AACtE,QAAA,IAAI,KAAK,IAAA,KAAS,MAAA,QAAiB,IAAA,GAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAC1D,QAAA,IAAI,KAAK,SAAA,KAAc,MAAA,QAAiB,SAAA,GAAY,MAAA,CAAO,KAAK,SAAS,CAAA;AACzE,QAAA,IAAI,KAAK,UAAA,KAAe,MAAA,QAAiB,UAAA,GAAa,MAAA,CAAO,KAAK,UAAU,CAAA;AAC5E,QAAA,IAAI,KAAK,UAAA,KAAe,MAAA,QAAiB,UAAA,GAAa,MAAA,CAAO,KAAK,UAAU,CAAA;AAC5E,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AACpF,QAAA,IAAI,CAAC,uBAAA,CAAwB,EAAA,EAAI,KAAK,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AACxF,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,GAAG,KAAA,EAAM;AAAA,MAClC;AAAA,KACF;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,SAAS,YAAY;AAInB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,gBAAA,EAAiB;AACnC,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,iBAAA,EAAkB;AACrE,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,WAAA,EAAY;AACzB,UAAA,IAAI,OAAO,IAAA,CAAK,kBAAA,KAAuB,UAAA,EAAY;AACjD,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,UACjD;AACA,UAAA,MAAM,QAAkB,EAAC;AACzB,UAAA,MAAM,WAAoD,EAAC;AAC3D,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI;AACF,cAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,aAAA,CAAc,IAAI,CAAC,CAAA;AACjD,cAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,YACvB,SAAS,KAAA,EAAO;AACd,cAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,CAAA;AAAA,YACjE;AAAA,UACF;AACA,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,YAAA,kBAAA,EAAmB;AACnB,YAAA,OAAA,EAAQ;AAAA,UACV;AACA,UAAA,OAAO,EAAE,IAAI,QAAA,CAAS,MAAA,KAAW,GAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,QAAA,EAAS;AAAA,QACpE,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,KACF;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,QAAA,MAAM,KAAA,GAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA,GAAc,EAAC,EAClE,GAAA,CAAI,CAAC,MAAMA,KAAAA,CAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CACrC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA,CAC5B,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,iBAAA,EAAkB;AACrE,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,WAAA,EAAY;AACzB,UAAA,IAAI,OAAO,IAAA,CAAK,aAAA,KAAkB,UAAA,EAAY;AAC5C,YAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,UAC1D;AACA,UAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,YAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACxB,cAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAe,IAAI,CAAA;AAC5C,cAAA,OAAO;AAAA,gBACL,UAAA,EAAY,IAAA;AAAA;AAAA;AAAA,gBAGZ,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,gBAC1B,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,WAAA,IAAe,IAAA;AAAA,gBAC7C,gBAAA,EAAkB,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM;AAAA,eAC7C;AAAA,YACF,CAAC;AAAA,WACH;AACA,UAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC7B,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,OAAO,KAAK,CAAA;AAAA,QACrB;AAAA,MACF;AAAA;AACF,GACF;AACF;;;AC7dO,SAAS,oBAAA,CAAqB,EAAE,QAAA,EAAU,KAAA,EAAO,SAAQ,EAA8B;AAC5F,EAAA,MAAM,OAAaC,OAAA,CAAA,MAAA,CAAO,EAAE,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AACtD,EAAA,IAAA,CAAK,OAAA,GAAU,EAAE,QAAA,EAAU,KAAA,EAAO,OAAA,EAAQ;AAE1C,EAAA,MAAM,YAAA,GAAqBA,gBAAkC,OAAO;AAAA,IAClE,EAAA,EAAI,wBAAA;AAAA,IACJ,QAAA,EAAU,MAAA;AAAA,IACV,IAAA,EAAM,YAAA;AAAA,IACN,YAAA,EAAc,2BAAA;AAAA,IACd,UAAU,MAAM;AACd,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,IAAA,CAAK,OAAA;AAC7B,MAAA,MAAMxC,SAAQ,gBAAA,EAAiB;AAC/B,MAAA,MAAM,SAAA,GAAY,CAAC,OAAA,KACjB,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAA,CAAW,EAAE,OAAA,KAAY,CAAA,CAAE,QAAA,GAAW,QAAA,GAAW,gBAAgB,OAAO,CAAA;AAC/F,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,mCAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,yBAAA;AAAA,UACR,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,SAAA,CAAU,SAAS,CAAA,CAAE,MAAA;AAAA,YACjC,SAAA,EAAW,SAAA,CAAU,QAAQ,CAAA,CAAE,MAAA;AAAA,YAC/B,QAAA,EAAU,SAAA,CAAU,QAAQ,CAAA,CAAE,MAAA;AAAA;AAAA;AAAA,YAG9B,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,WACpE;AAAA,UACA,KAAA,EAAOA,OAAM,KAAA,CAAM,MAAA,KAAW,KAAKA,MAAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAA,GACrD,IAAA,GACA;AAAA,YACE,KAAA,EAAOA,MAAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC7B,IAAI,CAAA,CAAE,EAAA;AAAA,cACN,OAAO,CAAA,CAAE,KAAA;AAAA,cACT,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,IAAA,EAAM,EAAE,IAAA,IAAQ,IAAA;AAAA,cAChB,SAAA,EAAW,EAAE,SAAA,IAAa;AAAA,aAC5B,CAAE,CAAA;AAAA,YACF,MAAMA,MAAAA,CAAM;AAAA;AACd;AACN,OACF;AAAA,IACF,CAAA;AAAA,IACA,OAAO,uBAAA,CAAwB;AAAA,MAC7B,WAAA,EAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAS;AAAA,MACzC,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAQ,KACrC;AAAA,GACH,CAAA,EAAI,EAAE,CAAA;AAEN,EAAAyC,gBAAgB,YAAY,CAAA;AAC5B,EAAA,OAAO,IAAA;AACT;ACtDA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAMC,YAAAA,GAAc,GAAA;AAEpB,SAAS,OAAA,CAAQ,MAAqB,OAAA,EAAgE;AACpG,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,QAAA,EAAU;AACzC,IAAA,OAAO,EAAE,WAAW,MAAA,EAAQ,KAAA,EAAO,KAAK,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,OAAA,EAAQ;AAAA,EAClF;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AAChD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,UAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,MAC3B;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,QAAA,CAAS,MAAqB,OAAA,EAAgE;AACrG,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACpC,IAAA,OAAO,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAAA,EAC9B;AACA,EAAA,OAAA,CAAQ,KAAK,OAAA,IAAW,EAAC,EAAG,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC9C,IAAA,MAAM,IAAA,GAAO,OAAA;AAAA,MACX,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY;AAAA,MACrG;AAAA,KACF;AACA,IAAA,OAAO,IAAA,GAAO,CAAC,IAAI,CAAA,GAAI,EAAC;AAAA,EAC1B,CAAC,CAAA;AACH;AAEA,SAAS,SAAS,IAAA,EAA6B;AAG7C,EAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAChC,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU,CAAA;AAClC,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAA,KAAM,IAAI,WAAA,GAAW,YAAS,CAAA,EAAG,IAAA,CAAK,QAAA,GAAW,CAAA,MAAA,EAAM,IAAA,CAAK,QAAQ,KAAK,EAAE,CAAA,CAAA;AAAA,EAC5F;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAA,GAAQ,CAAA,MAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACtF,EAAA,OAAO,SAAS,IAAA,CAAK,QAAA,GAAW,SAAM,IAAA,CAAK,QAAQ,KAAK,EAAE,CAAA,CAAA;AAC5D;AAEA,IAAM,SAAA,GAAY,CAAC,IAAA,KACjB,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAK,CAAA,CAAA;AAajE,SAAS,WAAW,EAAE,QAAA,EAAU,SAAS,WAAA,EAAa,aAAA,EAAe,WAAU,EAAoB;AACjG,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIhD,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAiC,IAAI,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAEpE,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM6C,KAAAA,GAAO,MAAM,IAAA,EAAK;AACxB,IAAA,IAAIA,KAAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,MAAM,IAAA,GAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,IAAIb,eAAAA,EAAgB;AAC5D,MAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,UAAA,EAAY;AACxC,QAAA,IAAI,CAAC,SAAA,EAAW;AAAE,UAAA,cAAA,CAAe,IAAI,CAAA;AAAG,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAAE;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,KAAK,KACF,SAAA,CAAUa,KAAAA,EAAM,EAAE,CAAA,CAClB,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW;AAAE,UAAA,UAAA,CAAW,IAAI,CAAA;AAAG,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QAAE;AAAA,MAAE,CAAC,CAAA,CAI9E,KAAA,CAAM,MAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW;AAAE,UAAA,UAAA,CAAW,EAAE,CAAA;AAAG,UAAA,cAAA,CAAe,IAAI,CAAA;AAAA,QAAE;AAAA,MAAE,CAAC,CAAA,CACxE,OAAA,CAAQ,MAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE,CAAC,CAAA;AAAA,IACxD,GAAGG,YAAW,CAAA;AACd,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAM,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IAAE,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAwB;AACnC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AACpC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,sBAAsB,KAAK,CAAA;AACzC,IAAA,YAAA,CAAa,SAAA,CAAU,IAAI,CAAC,CAAA;AAC5B,IAAA,UAAA,CAAW,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,IAAI,CAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AAAA,EAC5B,CAAA;AAIA,EAAA,MAAM,WAAW,OAAA,IAAW,EAAC,EAAG,MAAA,CAAO,CAAC,IAAA,KAAS;AAC/C,IAAA,IAAI,CAAC,aAAA,IAAiB,aAAA,CAAc,MAAA,KAAW,GAAG,OAAO,IAAA;AACzD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA;AACjC,IAAA,OAAO,CAAC,IAAA,CAAK,QAAA,IAAY,aAAA,CAAc,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,EAC/D,CAAC,CAAA;AAED,EAAA,uBACE9C,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAjB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,4FAAA,EAA6F,CAAA;AAAA,sBAC/GA,GAAAA;AAAA,QAAC6B,KAAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA;AAAA,UACA,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MACC,2BACC7B,GAAAA,CAACuC,OAAAA,EAAA,EAAQ,WAAU,sFAAA,EAAuF;AAAA,KAAA,EAE9G,CAAA;AAAA,IAEC,YAAY,IAAA,oBACXtC,IAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,sFAAA,EACX,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,MAAA,KAAW,qBAClBD,GAAAA,CAAC,QAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,WAAA,GAAc,uEAAA,GAA8D,SAAA,EAC/E,CAAA;AAAA,MAED,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AACrB,QAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,iBAAA,CAAkB;AAAA,UACzD,SAAA,EAAW,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,UAAA;AAAA,UAC3C,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,UAC3B,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,SAClC,CAAA;AACD,QAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA;AAAA,UAACE,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,GAAA,CAAI,IAAI,CAAA;AAAA,YACvB,QAAA,EAAU,OAAA;AAAA,YACV,SAAA,EAAU,gKAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,IAAA,KAAS,MAAA,mBACXH,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA,mBAC9DA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,8BAC/DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAsC,eAAK,KAAA,EAAM,CAAA;AAAA,gCACjEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,kBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,kBAGb,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,CAAC,KAAK,gBAAA,IAAoB;AAAA,iBAAA,EACzD;AAAA,eAAA,EACF,CAAA;AAAA,cACC,SAAA,KAAc,sBACXD,GAAAA,CAACgD,OAAA,EAAM,SAAA,EAAU,mCAAA,EAAoC,CAAA,GACrD,OAAA,mBACEhD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAyC,QAAA,EAAA,iBAAA,EAAY,CAAA,mBACrEA,GAAAA,CAACI,IAAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,aAvB1D,GAyBT,CAAA;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAUO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,cAAA,EAAe,EAA4B;AACxF,EAAA,MAAMC,SAAQ,gBAAA,EAAiB;AAE/B,EAAA,MAAM,OAAA,GAAUA,OAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,QAAQ,CAAA;AAChE,EAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAM,CAAA;AAClE,EAAA,MAAM,UAAA,GAAaA,OAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,QAAQ,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAE/D,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,uBAAA,EAAkB,CAAA;AAAA,wBACxDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAuC,QAAA,EAAA,2KAAA,EAGpD;AAAA,OAAA,EACF,CAAA;AAAA,MACC,kCACCC,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,cAAA;AAAA,UACT,SAAA,EAAU,iHAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AAEnD,KAAA,EAEJ,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,OAAA,EAAQ,SAAA;AAAA,QACR,WAAA,EAAY,mCAAA;AAAA,QACZ,SAAA,EAAU;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,IAOC,QAAQ,MAAA,GAAS,CAAA,oBAChBC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBAAwB,QAAA,EAAA,gCAAA,EAAwB;AAAA,OAAA,EAChE,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCACV,QAAA,EAAA,aAAA,CAAc,MAAA,GAAS,CAAA,GACpB,CAAA,mJAAA,EAA4H,aAAA,CAAc,CAAC,CAAA,CAAE,KAAK,uCAClJ,oHAAA,EACN,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,OAAA,EAAQ,QAAA;AAAA,UACR,WAAA,EAAY,8CAAA;AAAA,UACZ,aAAA,EAAe,SAAA;AAAA,UACf,SAAA,kBACEA,GAAAA,CAAAkB,QAAAA,EAAA,EAAE,QAAA,EAAA,8LAAA,EAIF;AAAA;AAAA,OAEJ,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGDb,MAAAA,CAAM,MAAM,MAAA,GAAS,CAAA,oBACpBJ,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oCAAA,EACV,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,MAAA;AAAA,MAAO,GAAA;AAAA,MAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,WAAA,GAAW,YAAA;AAAA,MAAU,uBAAA;AAAA,MAC7D,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,eAAA,GAAY,gBAAU,CAAA,CAAA;AAAA,MACnG,GAAA;AAAA,MAAI;AAAA,KAAA,EACP;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC9QA,IAAM,aAAA,GAAiD;AAAA,EACrD,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAAgD;AAAA,EACpD,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,oCAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAGA,SAAS,WAAW,GAAA,EAA4B;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AACpE;AAEA,IAAMmC,MAAAA,GAAQ,CAAC,CAAA,KACb,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAE7C,IAAM,UAAA,GAAa,6EAAA;AACnB,IAAM,WAAA,GAAc,mHAAA;AACpB,IAAM,YAAA,GAAe,yHAAA;AAErB,SAAS,SAAS,IAAA,EAAiC;AACjD,EAAA,IAAI,IAAA,CAAK,cAAc,cAAA,EAAgB;AACrC,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAuB,CAAA,GAAI,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,GAAA;AAC3E,IAAA,OAAO,CAAA,EAAG,IAAI,IAAA,CAAK,UAAU,CAAC,CAAA,QAAA,EAAM,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,IAAA,CAAK,SAAA,KAAc,MAAA,GAAS,cAAA,GAAc,QAAA;AACnD;AAQO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAU,OAAA,EAAQ,EAA4B;AACjF,EAAA,MAAM/B,SAAQ,gBAAA,EAAiB;AAC/B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AAEjD,EAAA,IAAIM,MAAAA,CAAM,MAAM,MAAA,KAAW,CAAA,IAAKA,OAAM,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAEhE,EAAA,MAAM,QAAA,GAAWA,OAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,QAAQ,CAAA,CAAE,MAAA;AACnE,EAAA,MAAM,SAAA,GAAYA,OAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,QAAQ,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,QAAA,GAAW,SAAA;AAEnD,EAAA,MAAM,OAAA,GAA0C;AAAA,IAC9C;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MAAU,MAAA,EAAQ,WAAA;AAAA,MAAU,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,MACjE,IAAA,EAAM,CAAC,EAAE,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,EAAK,EAAE,qBAC/BJ,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAlB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,eAAK,KAAA,EAAM,CAAA;AAAA,wBAC1CA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAsC,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,EAAE,CAAA;AAAA,QACpE,KAAK,MAAA,oBACJC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sCAAA,EAAuC,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,IAAA,CAAK,MAAA;AAAA,UAAO;AAAA,SAAA,EAAC;AAAA,OAAA,EAEvE;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,EAAA,EAAI,SAAA;AAAA,MAAW,MAAA,EAAQ,eAAA;AAAA,MAAc,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,MACtE,IAAA,EAAM,CAAC,EAAE,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,EAAK,EAAE,qBAC/BA,IAAAA;AAAA,QAACkB,MAAAA;AAAA,QAAA;AAAA,UACC,OAAO,IAAA,CAAK,OAAA;AAAA,UACZ,aAAA,EAAe,CAAC,CAAA,KAAM,uBAAA,CAAwB,KAAK,EAAA,EAAI,EAAE,OAAA,EAAS,CAAA,EAAsB,CAAA;AAAA,UAExF,QAAA,EAAA;AAAA,4BAAAnB,GAAAA,CAACoB,aAAAA,EAAA,EAAc,SAAA,EAAW,gGAAgG,YAAA,CAAa,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAClJ,QAAA,kBAAApB,GAAAA,CAACqB,WAAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,4BACArB,IAACsB,aAAAA,EAAA,EACG,iBAAO,IAAA,CAAK,aAAa,EAAwB,GAAA,CAAI,CAAC,0BACtDtB,GAAAA,CAACuB,YAAA,EAAuB,KAAA,EAAe,wBAAc,KAAK,CAAA,EAAA,EAAzC,KAA2C,CAC7D,CAAA,EACH;AAAA;AAAA;AAAA;AACF,KAEJ;AAAA;AAAA;AAAA,IAGA;AAAA,MACE,EAAA,EAAI,MAAA;AAAA,MAAQ,MAAA,EAAQ,OAAA;AAAA,MAAS,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,MAC9D,IAAA,EAAM,CAAC,EAAE,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,EAAK,EAAE,KAAM,IAAA,CAAK,OAAA,KAAY,2BACpDvB,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,iBAAA,EAAY,oBAE5DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,WAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,wBACvDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAOO,MAAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,YACtB,WAAA,EAAY,MAAA;AAAA,YACZ,YAAA,EAAY,CAAA,WAAA,EAAc,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACpC,QAAA,EAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,IAAA,CAAK,EAAA,EAAI,EAAE,IAAA,EAAM,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,YACtF,SAAA,EAAW,GAAG,YAAY,CAAA,OAAA;AAAA;AAAA,SAC5B,EACF;AAAA,OAAA,EACF;AAAA,KAEN;AAAA,IACA;AAAA,MACE,EAAA,EAAI,WAAA;AAAA,MAAa,MAAA,EAAQ,oBAAA;AAAA,MAAmB,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,MAC7E,MAAM,CAAC,EAAE,GAAA,EAAK,EAAE,UAAU,IAAA,EAAK,EAAE,KAAM,IAAA,CAAK,YAAY,QAAA,GAAW,IAAA,mBACjEnC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,WAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,wBACvDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAOO,MAAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,YAC3B,WAAA,EAAY,OAAA;AAAA,YACZ,YAAA,EAAY,CAAA,6BAAA,EAA6B,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACnD,QAAA,EAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,IAAA,CAAK,EAAA,EAAI,EAAE,SAAA,EAAW,UAAA,CAAW,CAAA,CAAE,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,YAC3F,SAAA,EAAW,GAAG,YAAY,CAAA,OAAA;AAAA;AAAA,SAC5B,EACF;AAAA,OAAA,EACF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,EAAA,EAAI,KAAA;AAAA,MAAO,MAAA,EAAQ,cAAA;AAAA,MAAgB,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,MACpE,MAAM,CAAC,EAAE,GAAA,EAAK,EAAE,UAAU,IAAA,EAAK,EAAE,KAAM,IAAA,CAAK,YAAY,QAAA,GAAW,IAAA,mBACjEnC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,WAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,KAAK,UAAA,IAAc,EAAA;AAAA,YAC1B,WAAA,EAAY,GAAA;AAAA,YACZ,SAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAY,CAAA,mBAAA,EAAmB,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACzC,QAAA,EAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,KAAK,EAAA,EAAI;AAAA,cAChD,UAAA,EAAY,EAAE,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,aACvD,CAAA;AAAA,YACD,SAAA,EAAW,GAAG,YAAY,CAAA,sBAAA;AAAA;AAAA,SAC5B,EACF,CAAA;AAAA,wBACA7B,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACjDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,KAAK,UAAA,IAAc,EAAA;AAAA,YAC1B,WAAA,EAAY,GAAA;AAAA,YACZ,SAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAY,CAAA,mBAAA,EAAmB,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACzC,QAAA,EAAU,CAAC,CAAA,KAAM,uBAAA,CAAwB,KAAK,EAAA,EAAI;AAAA,cAChD,UAAA,EAAY,EAAE,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,aACvD,CAAA;AAAA,YACD,SAAA,EAAW,GAAG,YAAY,CAAA,sBAAA;AAAA;AAAA,SAC5B,EACF;AAAA,OAAA,EACF;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,EAAA,EAAI,QAAA;AAAA,MAAU,MAAA,EAAQ,EAAA;AAAA,MAAI,IAAA,EAAM,EAAE,SAAA,EAAW,wBAAA,EAAyB;AAAA,MACtE,IAAA,EAAM,CAAC,EAAE,GAAA,EAAK,EAAE,QAAA,EAAU,IAAA,EAAK,EAAE,qBAC/B7B,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,uBAAA,CAAwB,IAAA,CAAK,EAAE,CAAA;AAAA,UAC9C,YAAA,EAAY,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UACjC,SAAA,EAAU,4EAAA;AAAA,UAEV,QAAA,kBAAAH,GAAAA,CAACiD,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc;AAAA;AAAA;AAClC;AAEJ,GACF;AAEA,EAAA,MAAM,OAAO,YAAY;AACvB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,IAAIlB,eAAAA,EAAgB;AAC5D,MAAA,IAAI,OAAO,IAAA,CAAK,kBAAA,KAAuB,UAAA,EAAY;AACjD,QAAA,MAAM,IAAI,MAAM,mDAAgD,CAAA;AAAA,MAClE;AACA,MAAA,KAAA,MAAW,IAAA,IAAQ1B,OAAM,KAAA,EAAO;AAC9B,QAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,MACnD;AACA,MAAA,kBAAA,EAAmB;AACnB,MAAA,OAAA,EAAQ;AAAA,IACV,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC5B,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAC7CC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAGb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,wBAClDC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,UAAW,UAAA;AAAA,UAAS,UAAA,KAAe,IAAI,EAAA,GAAK,GAAA;AAAA,UAC5C,SAAA,GAAY,CAAA,IAAK,CAAA,EAAA,EAAK,SAAS,CAAA,YAAA,CAAA;AAAA,UAC/B,QAAA,GAAW,KAAK,CAAA,EAAA,EAAK,QAAQ,UAAU,QAAA,KAAa,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,UAChE,GAAA;AAAA,UAAI;AAAA,SAAA,EACP;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,kBAAA;AAAA,UACT,QAAA,EAAU,MAAA;AAAA,UACV,SAAA,EAAU,+EAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAF,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,MAAA,IAAUE,MAAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA;AAAA,UAC3C,SAAA,EAAU,gKAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,MAAA,mBAASL,GAAAA,CAACuC,OAAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA,mBAAKvC,GAAAA,CAACgD,KAAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAAG,SAAA;AAAA,YACvF3C,OAAM,KAAA,CAAM,MAAA;AAAA,YAAO,QAAA;AAAA,YAAOA,MAAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK;AAAA;AAAA;AAAA;AACpE,KAAA,EACF,CAAA;AAAA,IAEC,yBACCL,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAM1D,aAAa,SAAA,GAAY,CAAA,oBACxBC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,0BAAA,EAAqB,CAAA;AAAA,sBACrEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,wBAClDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,WAAA,EAAY,OAAA;AAAA,YACZ,YAAA,EAAW,gCAAA;AAAA,YACX,SAAA,EAAW;AAAA;AAAA,SACb,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACA5B,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,uBAAA,EAAkB,CAAA;AAAA,wBAClEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC6B,KAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,QAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC3C,WAAA,EAAY,UAAA;AAAA,YACZ,YAAA,EAAW,oDAAA;AAAA,YACX,SAAA,EAAW;AAAA;AAAA,SACb,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACA7B,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,wBAAA,CAAyB;AAAA,cACvB,IAAA,EAAM,WAAW,QAAQ,CAAA;AAAA,cACzB,SAAA,EAAW,WAAW,QAAQ;AAAA,aAC/B,CAAA;AACD,YAAA,WAAA,CAAY,EAAE,CAAA;AACd,YAAA,WAAA,CAAY,EAAE,CAAA;AAAA,UAChB,CAAA;AAAA,UACA,UAAU,CAAC,QAAA,CAAS,MAAK,IAAK,CAAC,SAAS,IAAA,EAAK;AAAA,UAC7C,SAAA,EAAU,oGAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAGDE,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,oBAAKL,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAQ,MAAA,EAAO,OAAA,EAAkB,IAAA,EAAMK,MAAAA,CAAM,KAAA,EAAO,CAAA;AAAA,IAEzFA,MAAAA,CAAM,KAAK,MAAA,GAAS,CAAA,oBACnBJ,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,yCAAA,EAEzD,CAAA;AAAA,sBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBACX,QAAA,EAAAK,MAAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACfJ,IAAAA,CAAC,IAAA,EAAA,EAAmB,WAAU,sDAAA,EAC5B,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACkD,CAAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,wBACxDjD,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,cAAI,KAAA,EAAM,CAAA;AAAA,UAAO,UAAA;AAAA,UAAI,GAAA,CAAI;AAAA,SAAA,EAAO;AAAA,OAAA,EAAA,EAF9E,GAAA,CAAI,KAGb,CACD,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpSA,SAASmD,YAAW,GAAA,EAA4B;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AACpE;AAEA,IAAM,WAAA,GAAc,CAAC,CAAA,KACnB,CAAA,IAAK,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAM7C,IAAM,cAAA,GAKD;AAAA,EACH;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,6BAAA;AAAA,IACP,WAAA,EACE,oMAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,iCAAA;AAAA,IACP,WAAA,EACE,gMAAA;AAAA,IACF,IAAA,EAAM;AAAA;AAEV,CAAA;AAuBO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA0B;AAIpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIpD,gBAAAA,CAAM,SAAS,0BAA0B,CAAA;AAC7E,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,0BAAA,EAA4B,CAAA;AAChE,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC7C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,gBAAAA,CAAM,OAAA,CAAQ,MAAO,QAAA,GAAW,OAAA,CAAQ,QAAQ,CAAA,GAAIgC,eAAAA,EAAgB,EAAI,CAAC,QAAQ,CAAC,CAAA;AAC/F,EAAA,MAAM,aAAahC,gBAAAA,CAAM,OAAA;AAAA,IACvB,MAAM,mBAAA,CAAoB,QAAA,IAAYgC,eAAe,CAAA;AAAA,IACrD,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,QAAQ,CAAA;AAC/C,EAAA,MAAM,YAAY,OAAO,IAAA,CAAK,wBAAwB,UAAA,IAAc,OAAO,KAAK,sBAAA,KAA2B,UAAA;AAE3G,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIhC,gBAAAA,CAAM,SAAqC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAgC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAiC,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAS,SAAS,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAMpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,EAAE,YAAW,GAAIqD,aAAAA,CAAc,EAAE,YAAA,EAAc,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,CAAA;AACnF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIrD,gBAAAA,CAAM,SAAkC,IAAI,CAAA;AAC5E,EAAA,MAAM,iBAAiBsD,2BAAAA,EAA4B;AACnD,EAAA,MAAM,cAActD,gBAAAA,CAAM,WAAA;AAAA,IACxB,CAAC,SAAA,KAAgC;AAC/B,MAAA,IAAI,cAAA,EAAgBuD,mBAAAA,CAAoB,SAAS,CAAA;AAAA,uBAChC,SAAS,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AACA,EAAA,MAAM,WAAWvD,gBAAAA,CAAM,OAAA;AAAA,IACrB,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,WAAA,IAAe,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA;AAAA,IAC9F,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,oBAAoB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA;AAIlE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAAA,CAAM,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcA,gBAAAA,CAAM,WAAA,CAAY,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAE3E,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,KAAK,IAAA,CACF,mBAAA,EAAqB,CACrB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,QAAQ,CAAA;AACf,QAAA,YAAA,CAAa,WAAA,CAAY,QAAA,EAAU,QAAA,IAAY,CAAC,CAAC,CAAA;AACjD,QAAA,YAAA,CAAa,WAAA,CAAY,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,MAC/C,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,MAAE,CAAC,CAAA,CAC9D,OAAA,CAAQ,MAAM;AAAE,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MAAE,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,KAAK,IAAA,CAAK,iBAAA,IAAoB,CAC3B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CACjD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AAC/C,IAAA,KAAK,IAAA,CAAK,kBAAA,IAAqB,CAC5B,IAAA,CAAK,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA,CACrD,KAAA,CAAM,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,EAAE,CAAA;AAAA,IAAE,CAAC,CAAA;AACnD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,CAAA;AAEhC,EAAA,MAAM,OAAOA,gBAAAA,CAAM,WAAA;AAAA,IACjB,CAAC,KAAA,KAAwC;AACvC,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,KAAK,IAAA,CACF,sBAAA,CAAwB,KAAK,CAAA,CAC7B,IAAA,CAAK,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAC7B,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,YAAA,CAAa,CAAC,CAAC,CAAC,EACtC,OAAA,CAAQ,MAAM,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,MAAA,GAASoD,YAAW,SAAS,CAAA;AAGnC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,EAAK,KAAM,KAAK,CAAA,GAAI,MAAA;AAC3C,IAAA,IAAI,QAAQ,IAAA,EAAM;AAAE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AAC7C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,CAAa,WAAA,CAAY,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,IAAA,MAAU,KAAK,QAAA,IAAY,CAAA,CAAA,OAAS,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAGvB,IAAA,IAAI,SAAA,CAAU,IAAA,EAAK,KAAM,EAAA,EAAI;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,IAAI,KAAK,SAAA,IAAa,IAAA,OAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAASA,YAAW,SAAS,CAAA;AACnC,IAAA,IAAI,UAAU,IAAA,EAAM;AAAE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AAC/C,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,CAAa,WAAA,CAAY,MAAM,CAAC,CAAA;AAChC,IAAA,IAAI,WAAW,GAAA,EAAK,SAAA,OAAgB,EAAE,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC3D,CAAA;AAKA,EAAA,MAAMI,aAAY,CAAC,CAAA,KAAoB,EAAE,OAAA,KAAY,CAAA,CAAE,WAAW,QAAA,GAAW,SAAA,CAAA;AAC7E,EAAA,MAAM,WAAA,GAAA,CAAe,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAUA,UAAAA,CAAU,CAAC,CAAA,KAAM,SAAS,CAAA;AACtF,EAAA,MAAM,WAAA,GAAA,CAAe,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAUA,UAAAA,CAAU,CAAC,CAAA,KAAM,QAAQ,CAAA;AACrF,EAAA,MAAM,aAAA,GAAA,CAAiB,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAUA,UAAAA,CAAU,CAAC,CAAA,KAAM,QAAQ,CAAA;AAEvF,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,aAAA,KAAkB,KAAA;AAI1D,EAAA,MAAM,WAAA,GAAA,CAAe,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,QAAA,IAAY,CAAA,CAAE,WAAA,KAAgB,KAAK,CAAA;AACpG,EAAA,MAAM,SAAA,GAAY,YAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAU,GAAG,UAAA,IAAc,IAAA;AAIvE,EAAA,MAAM,cAAA,GAAiB,UAAA,GACnB,UAAA,CAAW,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,EAAA,KAAO,UAAU,CAAA,IAAK,IAAA,GAC/D,IAAA;AACJ,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,uBACEvD,GAAAA;AAAA,MAACwD,gBAAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,oBAAA,CAAqB,cAAA,CAAe,EAAE;AAAA;AAAA,KAClD;AAAA,EAEJ;AAEA,EAAA,uBACEvD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACArC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAA6B,QAAA,EAAA,oKAAA,EAG1C,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/D,CAAA;AAAA,IAED,CAAC,SAAA,mBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEhD,CAAA;AAAA,sBACApC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,QAAA,oDAAA;AAAA,wBACOD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,QAAO;AAAA,OAAA,EACjF;AAAA,KAAA,EACF,oBAEAC,IAAAA;AAAA,MAACuC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAY,oHAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAxC,GAAAA;AAAA,YAACyD,OAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,iBAAA;AAAA,cACN,WAAA,EAAY,2CAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAU,YAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,WAAA,EAAY,MAAA;AAAA,cACZ,OAAA,EAAS,OAAA;AAAA,cACT,IAAA,EAAM,UAAU,yCAAA,GAA4C,MAAA;AAAA,cAC5D,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAzD,GAAAA;AAAA,YAACyD,OAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,0BAAA;AAAA,cACN,WAAA,EAAY,iHAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP,QAAA,EAAU,YAAA;AAAA,cACV,YAAA,EAAc,UAAA;AAAA,cACd,WAAA,EAAY,WAAA;AAAA,cACZ,OAAA,EAAS,OAAA;AAAA,cACT,IAAA,EAAM,UAAU,4CAAA,GAA+C,MAAA;AAAA,cAC/D,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KACF;AAAA,oBAGFxD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,0BAAA,EAAqB,CAAA;AAAA,wBAC3DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,uQAAA,EAIxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACb,QAAA,kBAAAC,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UAGL,SAAS,MAAM;AACb,YAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA,CAAY,MAAA,KAAW,CAAA,IAAK,YAAY,CAAC,CAAA,GAC5D,kBAAA,CAAmB,kBAAA,EAAoB,YAAY,CAAC,CAAA,CAAE,EAAE,CAAA,GACxD,qBAAqB,kBAAkB,CAAA;AAAA,UAC7C,CAAA;AAAA,UACA,SAAA,EAAU,6FAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BAC9DC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,uBAAa,IAAA,GACV,yBAAA,GACA,YAAY,MAAA,KAAW,CAAA,GACrB,kCACA,WAAA,CAAY,MAAA,KAAW,IACrB,WAAA,CAAY,CAAC,EAAG,IAAA,GAChB,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,mBAAA,CAAA,EAC/B,CAAA;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA,SAAA,IAAa,IAAA,GACV,GAAA,GACA,WAAA,CAAY,MAAA,KAAW,CAAA,GACrB,2CAAA,GACA,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,UAAK,CAAA,EACzE;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC0D,UAAAA,EAAA,EAAW,WAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,OACjE,EACF,CAAA;AAAA,MAIC,WAAA,IAAe,SAAA,IAAa,IAAA,IAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,CAAC,SAAA,oBAC9DzD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtErC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,iJAAA,EAGxC;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAKAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAiB,CAAA;AAAA,wBACvDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,iYAAA,EAKxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,UAAU,MAAM,IAAA;AAAA,UAChB,KAAA,EAAO,SAAS,EAAC;AAAA,UACjB,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,sBACAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAA,EAAoB,CAAA;AAAA,sBACxCA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAA,EAAoB,SAAS,WAAA,EAAa,CAAA;AAAA,sBAC9DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CACb,QAAA,kBAAAC,IAAAA;AAAA,QAACE,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,oBAAA,CAAqB,uBAAuB,CAAA;AAAA,UAAE,CAAA;AAAA,UACtF,SAAA,EAAU,6FAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC2D,MAAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BAC3D1D,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,2BAAA,EACb,mBAAS,IAAA,GACN,6BAAA,GACA,YAAY,MAAA,KAAW,CAAA,GACrB,kCACA,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,CAAA,EAAI,WAAA,CAAY,WAAW,CAAA,GAAI,wBAAA,GAAwB,yBAAsB,CAAA,CAAA,EAC1G,CAAA;AAAA,8BACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACb,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,MAAA,KAAW,CAAA,GACpB,wFAAA,GACA,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,KAAK,QAAK,CAAA;AAAA,gBACxD,YAAY,MAAA,GAAS,CAAA,IAAK,CAAA,GAAA,EAAM,WAAA,CAAY,SAAS,CAAC,CAAA,KAAA,CAAA;AAAA,gBACtD,YAAY,MAAA,GAAS,CAAA,oBACpBA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iDAAA,EACb,QAAA,EAAA;AAAA,kBAAA,WAAA,CAAY,MAAA,KAAW,CAAA,GACpB,uCAAA,GACA,CAAA,EAAG,YAAY,MAAM,CAAA,qCAAA,CAAA;AAAA,kBACxB,UAAA;AAAA,kBACA,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK;AAAA,iBAAA,EACxD,CAAA;AAAA,gBAED,cAAc,MAAA,GAAS,CAAA,oBACtBA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6CAAA,EACb,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,MAAA,KAAW,CAAA,GACtB,sBAAA,GACA,CAAA,EAAG,cAAc,MAAM,CAAA,qBAAA,CAAA;AAAA,kBAC1B,UAAA;AAAA,kBACA,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK;AAAA,iBAAA,EAC1D;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF,CAAA;AAAA,4BACAD,GAAAA,CAAC0D,UAAAA,EAAA,EAAW,WAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,OACjE,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA1D,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,IAEjB,aAAA,CAAc,SAAA,oBACbC,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBAC1DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,wRAAA,EAIxD;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,sBAAA;AAAA,UACN,OAAA,EAAS,cAAA;AAAA,UACT,KAAA,EAAO,cAAc,SAAA,GAAY,KAAA;AAAA,UACjC,QAAA,EAAU,CAAC,MAAA,KAAW,aAAA,CAAc,IAAI,EAAE,aAAA,EAAe,MAAA,KAAW,SAAA,EAAW,CAAA;AAAA,UAC/E,UAAU,aAAA,CAAc;AAAA;AAAA,OAC1B;AAAA,MAGC,CAAC,WAAA,IAAe,iBAAA,oBACfC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8FAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,wBACtErC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,gNAAA,EAIxC;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGD,QAAA,CAAS,SAAS,CAAA,oBACjBC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAA,GAAc,MAAA,GAAY,YAAA,EACxC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACtDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,6SAAA,EAKxD,CAAA;AAAA,QACC,CAAC,iBAAA,oBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAyC,QAAA,EAAA,uJAAA,EAGtD;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,SAAA,qBACbA,GAAAA,CAAC,YAAA,EAAA,EAAgC,SAAA,EAAsB,MAAA,EAAQ,eAA5C,SAAA,CAAU,EAA+C,CAC7E,CAAA,EACH,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,eAAe,QAAA,EAAoB,CAAA;AAAA,oBAE/DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACZ,kCACCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACqC,aAAAA,EAAA,EAAc,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,MAAE,iCAAA;AAAA,MACxB;AAAA,KAAA,EAC5B,CAAA,GACE,MAAA,mBACFpC,IAAAA,CAAAiB,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAlB,GAAAA,CAACuC,OAAAA,EAAA,EAAQ,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,MAAE;AAAA,KAAA,EAE3D,IAEA,qDAAA,EAEJ,CAAA;AAAA,oBAEAvC,GAAAA;AAAA,MAAC4D,eAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,CAAC,CAAC,QAAA;AAAA,QACR,YAAA,EAAc,CAAC,IAAA,KAAS;AAAE,UAAA,IAAI,CAAC,IAAA,EAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAAE;AAAA;AAAA;AACzD,GAAA,EACF,CAAA;AAEJ;ACneA,IAAM,QAAA,GAAiF;AAAA,EACrF;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,6CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,2CAAA;AAAA,IACP,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,gCAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAkBO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA6B;AAC1E,EAAA,MAAM,WAAW,gBAAA,CAAiB,QAAA,EAAU,EAAE,WAAA,EAAa,SAAS,CAAA;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,QAAA;AACvB,EAAA,MAAM,OAAA,GAAkB,MAAM,WAAA,IAAe,OAAA;AAE7C,EAAA,uBACE3D,IAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAACwC,aAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EAAY,gEAAA;AAAA,QAEZ,QAAA,kBAAAxC,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,qBAAA;AAAA,YACN,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,CAAC,WAAA,KAAgB,GAAA,CAAI,EAAE,aAAa;AAAA;AAAA;AAChD;AAAA,KACF;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,sBAC9CC,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,8BAAA;AAAA,wBACwBD,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,QAAS;AAAA,OAAA,EAG/E;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC3EO,SAAS,eAAA,CAAgB,EAAE,QAAA,GAAW,wBAAA,EAAyB,EAA0B;AAC9F,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAC9CA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EAAwC,0BAAgB,WAAA,EAAY;AAAA,KAAA,EACnF,CAAA;AAAA,oBACAA,IAACwD,gBAAAA,EAAA,EAAiB,UAAU,eAAA,EAAiB,QAAA,EAAoB,UAAQ,IAAA,EAAC;AAAA,GAAA,EAC5E,CAAA;AAEJ;ACGO,IAAM,yBAAA,GAA4B;AAkBlC,IAAM,8BAAA,GAAiC;AAsBvC,IAAM,qBAAA,GAA4C;AAAA,EACvD;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,WAAA,EAAa,0FAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,WAAA;AAAA,IACb,OAAA,EAAS,kBAAA;AAAA,IACT,WAAA,EAAa,mCAAA;AAAA,IACb,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAM,KAAA,GAAQ,sBAAsB,yBAAA,EAA2B;AAAA,EAC7D,QAAA,EAAU,qBAAA;AAAA,EACV,YAAA,EAAc,CAAC,UAAA,EAAY,WAAW;AACxC,CAAC,CAAA;AAED,SAAS,qBAAA,GAAwB;AAC/B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI1C,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,KAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACEd,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,qQAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,6LAAA,EAGH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,uBAAA,GAA+C;AAAA,EAC1D,EAAA,EAAI,yBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,6HAAA;AAAA,EACF,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,eAAA,EAAiB,8BAAA;AAAA;AAAA,EAEjB,SAAA,EAAW,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBX,YAAY,kBAAA,CAAmB,yBAAA,EAA2B,EAAE,QAAA,EAAU,eAAe,CAAA;AAAA,EACrF,QAAA,EAAU,qBAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,8BAAA;AAAA,MACL,KAAA,EAAO,yDAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAO;AAAA,KACnB;AAAA,IACA;AAAA,MACE,GAAA,EAAK,2BAAA;AAAA,MACL,KAAA,EAAO,uEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS,CAAC,OAAA,EAAS,UAAU;AAAA;AAC/B,GACF;AAAA;AAAA,EAEA,GAAG,gBAAA;AAAA,IACD,yBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAS,UAAA,EAAY,QAAA,EAAU,gBAAA,IAA+B,MAAA;AAAA,MAC9D,KAAA,EAAO,SAAA;AAAA,MACP,GAAG,cAAA,CAAe,qBAAA,EAAuB,UAAU;AAAA,KACrD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAM,KAAA;AAAM,GACvB;AAAA,EACA,GAAG,mBAAmB,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU3B,gBAAgB,YAAY;AAC1B,IAAA,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;ACzLO,IAAM,mBAAA,GAAsB;AAS5B,IAAM,wBAAA,GAA2B;AAiBjC,IAAM,eAAA,GAAsC;AAAA,EACjD;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MACnC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,yBAAA;AAAoB,KACrD;AAAA,IACA,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAMS,MAAAA,GAAQoD,sBAAsB,mBAAA,EAAqB;AAAA,EACvD,QAAA,EAAU,eAAA;AAAA,EACV,YAAA,EAAc,CAAC,iBAAA,EAAmB,aAAa;AACjD,CAAC,CAAA;AAED,IAAM,gBAAwC,EAAE,GAAA,EAAK,OAAO,MAAA,EAAQ,QAAA,EAAU,aAAa,WAAA,EAAS;AAGpG,SAAS,cAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,IAAI,EAAC;AAC5F,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClG,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI/C,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKN,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,8PAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,kBAAA,GAA0C;AAAA,EACrD,EAAA,EAAI,mBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,8FAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,4BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,wBAAA;AAAA;AAAA,EAEjB,SAAA,EAAW,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBX,QAAQ,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,UAAA,EAAY8D,mBAAmB,mBAAmB,CAAA;AAAA,EAClD,QAAA,EAAU,eAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,8FAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8DAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAGC,gBAAAA;AAAA,IACD,mBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQ,aAAA,CAAc,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,MACnD,KAAA,EAAO,SAAA;AAAA,MACP,GAAGC,cAAAA,CAAe,eAAA,EAAiB,UAAU;AAAA,KAC/C,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMvD,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGwD,mBAAmBxD,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;ACpNO,IAAM,mBAAA,GAAsB,iBAAA;AA8BnC,SAAS,MAAA,GAAwB;AAC/B,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,yDAAsD,CAAA;AACrF,EAAA,OAAO,QAAA;AACT;AAEA,eAAe,OAAU,IAAA,EAA2C;AAClE,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,yDAAyD,CAAA;AACxF,EAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,EAAE,UAAU,CAAA;AAE7D,EAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,MAAA,EAAO,CAAE,SAAA,CAAU,MAAA,CAAO,mBAAA,EAAqB;AAAA,IAC3E,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,OAAA,EAAS,EAAE,CAAC,8BAA8B,GAAG,YAAA;AAAa,GAC3D,CAAA;AACD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAOnB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAQ,KAAA,EAA6C,OAAA,EAAS,UAAU,CAAC,CAAA;AACxF,EAAA,IAAIyD,QAAAA,GAAU,EAAA;AACd,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAW,MAAO,KAAA,EACpB,OAAA,EAAS,IAAA,IAAO;AACpB,IAAAA,QAAAA,GAAU,OAAO,OAAA,EAAS,OAAA,IAAW,SAAS,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAAA,EAClE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,CAACA,QAAAA,IAAW,MAAA,KAAW,GAAA,EAAK;AAC9B,IAAAA,QAAAA,GAAU,sDAAA;AAAA,EACZ;AACA,EAAA,MAAM,IAAI,KAAA,CAAMA,QAAAA,IAAW,KAAA,CAAM,OAAO,CAAA;AAC1C;AAQO,SAAS,aAAA,GAA+C;AAC7D,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,CAAA;AAC3C;AAGO,SAAS,kBAAA,GAAoD;AAClE,EAAA,OAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AACvC;AC1DO,IAAM,uBAAA,GAA0B;AAYhC,IAAM,4BAAA,GAA+B;AAcrC,IAAM,iBAAA,GAAsC;AAAA,EACjD;AAAA,IACE,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAcO,IAAM,mBAAA,GAA0C;AAAA,EACrD;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOrC;AAAA,IACA,iBAAA,EAAmB;AAAA;AAEvB,CAAA;AAEA,IAAMzD,MAAAA,GAAQoD,sBAAsB,uBAAA,EAAyB;AAAA,EAC3D,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMM,iBAAwC,EAAE,GAAA,EAAK,OAAO,MAAA,EAAQ,QAAA,EAAU,MAAM,WAAA,EAAS;AAG7F,SAASC,eAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,GAAG,IAAI,EAAC;AAC5F,EAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAMD,cAAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAClG,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAgBA,SAAS,aAAA,GAAgB;AACvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIrD,SAAsC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAsC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,KAA+B;AAChD,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,OAAO,IAAA,KAAS,MAAA,GAAS,aAAA,EAAc,GAAI,oBAAmB,CAAE,CAAA;AAAA,IAC5E,SAAS,MAAA,EAAQ;AACf,MAAA,QAAA,CAAS,aAAA,CAAc,MAAA,EAAQ,uCAAoC,CAAC,CAAA;AAAA,IACtE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,uBACEb,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,aAAA,EAAQ,CAAA;AAAA,sBAC3DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAuC,QAAA,EAAA,yKAAA,EAGpD;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,KAAK,IAAI,MAAM,CAAA;AAAA,UAAE,CAAA;AAAA,UAClC,UAAU,IAAA,KAAS,IAAA;AAAA,UACnB,SAAA,EAAU,yJAAA;AAAA,UAET,QAAA,EAAA,IAAA,KAAS,SAAS,gBAAA,GAAc;AAAA;AAAA,OACnC;AAAA,sBACAH,GAAAA;AAAA,QAACG,MAAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAQ,MAAA;AAAA,UAAO,IAAA,EAAK,MAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AAAE,YAAA,KAAK,IAAI,WAAW,CAAA;AAAA,UAAE,CAAA;AAAA,UACvC,UAAU,IAAA,KAAS,IAAA;AAAA,UACnB,SAAA,EAAU,8HAAA;AAAA,UAET,QAAA,EAAA,IAAA,KAAS,cAAc,kBAAA,GAAgB;AAAA;AAAA;AAC1C,KAAA,EACF,CAAA;AAAA,IAEC,yBAASH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAExD,MAAA,oBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAA,EACV,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,SAAS,CAAA,GACb,CAAA,EAAG,MAAA,CAAO,MAAM,WAAW,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,QAAA,EAAW,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAA,CAAA,GAC9F,kCAAA;AAAA,QAAoC,GAAA;AAAA,wBACxCA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,SAAA;AAAA,UAAU,SAAA;AAAA,UAAK,MAAA,CAAO,SAAA,KAAc,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,UAAU,aAAA;AAAA,UAAS,MAAA,CAAO,KAAA;AAAA,UAAM;AAAA,SAAA,EAC7F;AAAA,OAAA,EACF,CAAA;AAAA,MAIC,OAAO,OAAA,oBACND,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAwB,QAAA,EAAA,sEAAA,EAErC,CAAA;AAAA,MAGD,MAAA,CAAO,cAAc,MAAA,GAAS,CAAA,oBAC7BC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EACV,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,YAAA,CAAa,MAAA;AAAA,QAAO,UAAA;AAAA,QAAS,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,kBAAA,GAAqB,cAAA;AAAA,QAAe;AAAA,OAAA,EAE5G,CAAA;AAAA,MAGD,MAAA,CAAO,SAAS,MAAA,GAAS,CAAA,oBACxBA,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uBAAA,EACV,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAA;AAAA,QAAO,WAAA;AAAA,QAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,QAAG;AAAA,OAAA,EAExE,CAAA;AAAA,MAGD,MAAA,CAAO,QAAQ,MAAA,GAAS,CAAA,oBACvBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,KAAC,GAAA,EAAA,EAAG,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,UAAO,WAAA;AAAA,UAAU,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,UAAG;AAAA,SAAA,EAAiB,CAAA;AAAA,wBACxFD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yBACX,QAAA,EAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,IAAA,EAAA,EAAsB,YAAE,KAAA,EAAA,EAAhB,CAAA,CAAE,SAAoB,CAAK,CAAA,EAC5E;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,qBACzCC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,OAAA,CAAQ,MAAA;AAAA,QAAO,UAAA;AAAA,QAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,QAAA;AAAA,QAAS;AAAA,OAAA,EAGrF;AAAA,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIa,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKN,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,IAAA;AAElC,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACjBC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,OAAE,QAAA,EAAA,4PAAA,EAIH,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4QAAA,EAIH,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEF;AAEO,IAAM,sBAAA,GAA8C;AAAA,EACzD,EAAA,EAAI,uBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,YAAA;AAAA,EACN,WAAA,EAAa,6FAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,SAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,6BAAA;AAAA;AAAA;AAAA;AAAA,EAIT,eAAA,EAAiB,EAAE,GAAA,EAAK,4BAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrD,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,4BAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU,mBAAA;AAAA;AAAA;AAAA;AAAA,EAIV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,uFAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,kEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAG+D,gBAAAA;AAAA,IACD,uBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQK,cAAAA,CAAc,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAAA,MACnD,KAAA,EAAO,SAAA;AAAA,MACP,GAAGJ,cAAAA,CAAe,mBAAA,EAAqB,UAAU;AAAA,KACnD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMvD,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGwD,mBAAmBxD,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;ACjWO,IAAM,2BAAA,GAA8B;AAOpC,IAAM,gCAAA,GAAmC;AAQzC,IAAM,uBAAA,GAA8C;AAAA,EACzD;AAAA,IACE,GAAA,EAAK,gBAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,4CAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,yBAAA,EAAoB;AAAA,MAC5C,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,MAC7B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACrC;AAAA,IACA,iBAAA,EAAmB,IAAA;AAAA;AAAA;AAAA;AAAA,IAInB,YAAA,EAAc,CAAC,MAAM;AAAA;AAEzB,CAAA;AAYO,IAAM,qBAAA,GAA0C;AAAA,EACrD;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,IAAMA,MAAAA,GAAQoD,sBAAsB,2BAAA,EAA6B;AAAA,EAC/D,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMM,iBAAwC,EAAE,IAAA,EAAM,aAAU,GAAA,EAAK,KAAA,EAAO,QAAQ,QAAA,EAAS;AAE7F,SAASC,eAAc,KAAA,EAAoC;AACzD,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,EAAC;AAC7C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,MAAMD,cAAAA,CAAc,MAAA,CAAO,CAAC,CAAC,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AACpF,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,uBAAA,GAA0B;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIrD,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKN,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,GAAG,MAAM,CAAA;AAAA,IAAE,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACET,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,SAAA,mBACCC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAlB,GAAAA,CAAC,OAAE,QAAA,EAAA,0PAAA,EAIH,CAAA;AAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4IAAA,EAGH;AAAA,GAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,iMAGH,CAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,yBAAA,GAAiD;AAAA,EAC5D,EAAA,EAAI,2BAAA;AAAA;AAAA;AAAA;AAAA,EAIJ,WAAA,EAAa,QAAA;AAAA,EACb,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,sHAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA,EAGV,QAAA,EAAU,OAAA;AAAA,EACV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA,EACT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,wHAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,gCAAA;AAAA;AAAA;AAAA,EAGjB,SAAA,EAAW,OAAA;AAAA;AAAA;AAAA;AAAA,EAIX,MAAA,EAAQ,qBAAA;AAAA,EACR,QAAA,EAAU,uBAAA;AAAA,EACV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,iFAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8DAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA,EACA,GAAG+D,gBAAAA;AAAA,IACD,2BAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQK,cAAAA,CAAc,UAAA,EAAY,QAAA,EAAU,cAAc,CAAA;AAAA,MAC1D,KAAA,EAAO,SAAA;AAAA,MACP,GAAGJ,cAAAA,CAAe,uBAAA,EAAyB,UAAU;AAAA,KACvD,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMvD,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGwD,mBAAmBxD,MAAK,CAAA;AAAA,EAC3B,UAAA,EAAYqD,mBAAmB,2BAA2B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D,gBAAgB,YAAY;AAC1B,IAAA,MAAMrD,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,YAAY,YAAY;AAAE,IAAA,MAAMA,OAAM,UAAA,EAAW;AAAA,EAAE,CAAA;AAAA,EACnD,UAAA,EAAY;AACd;ACvJO,IAAM,kBAAA,GAAqB;AAa3B,IAAM,uBAAA,GAA0B;AAUhC,IAAM,yBAAA,GAAoD;AAAA,EAC/D,OAAA,EAAS,4EAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAqCO,IAAM,YAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,+CAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gBAAA;AAAA,IACL,KAAA,EAAO,uBAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mBAAA;AAAA,IACL,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAcO,IAAM,yBAAA,GAA8C;AAAA,EACzD,GAAA,EAAK,aAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,WAAA,EAAa,oGAAA;AAAA,EACb,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAkB;AAAA,IAC7C,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,gBAAA;AAAW,GAC3C;AAAA,EACA,iBAAA,EAAmB;AACrB,CAAA;AAGO,IAAM,iBAAA,GAAoB,GAAA;AAwB1B,IAAM,cAAA,GAAqC;AAAA,EAChD,yBAAA;AAAA,EACA;AAAA,IACE,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,oFAAA;AAAA,IACb,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,MAC5B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,yBAAA,EAA0B;AAAA,MAChD,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,QAAA,EAAS;AAAA,MAC9B,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,8CAAA;AAAsC,KAC3E;AAAA,IACA,iBAAA,EAAmB;AAAA,GACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa,oFAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,WAAA;AAAA,IACb,OAAA,EAAS,gBAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA,IACE,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,uBAAA;AAAA,IACP,WAAA,EAAa,uFAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,YAAA,EAAU;AAAA,MAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,WAAA,EAAS;AAAA,MAC9B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,WAAA,EAAS;AAAA,MAC9B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,WAAA,EAAS;AAAA,MAC9B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,YAAA,EAAU;AAAA,MAChC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,YAAA;AAAU,KAClC;AAAA,IACA,YAAA,EAAc;AAAA;AAElB,CAAA;AAUO,SAAS,oBAAoB,QAAA,EAAmE;AACrG,EAAA,MAAM,MAAM,QAAA,EAAU,OAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA;AAE5E,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,OAAA,KACzB,QAAQ,GAAA,KAAQ,kBAAA,IAAsB,OAAA,GAClC,EAAE,GAAG,OAAA,EAAS,iBAAA,EAAmB,IAAA,KACjC,OAAO,CAAA;AACf;AAEA,IAAMA,MAAAA,GAAQoD,sBAAsB,kBAAA,EAAoB;AAAA,EACtD,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAC,CAAA;AAED,IAAMM,cAAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,QAAA;AAAA,EACL,CAAC,iBAAiB,GAAG;AACvB,CAAA;AACA,IAAM,kBAAA,GAA6C,EAAE,OAAA,EAAS,SAAA,EAAW,YAAY,gBAAA,EAAW;AAMhG,SAAS,iBAAiB,QAAA,EAAmE;AAC3F,EAAA,MAAM,cAAc,kBAAA,CAAmB,MAAA,CAAO,QAAA,EAAU,WAAA,IAAe,EAAE,CAAC,CAAA;AAC1E,EAAA,MAAM,MAAM,QAAA,EAAU,OAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,IAAI,EAAC;AACpF,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAMA,cAAAA,CAAc,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAEnG,EAAA,MAAM,KAAA,GAAQ,CAAC,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1F,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,MAAA;AAChD;AAEA,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIrD,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKN,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,YAAA,CAAa,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA;AACxB,MAAA,cAAA,CAAe,MAAA,CAAQ,CAAA,EAAG,QAAA,EAAsC,WAAA,IAAe,EAAE,CAAC,CAAA;AAAA,IACpF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAIpB,EAAA,MAAM,iBAAA,GAAoB,0BAA0B,WAAW,CAAA;AAE/D,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCA,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAlB,GAAAA,CAAC,OAAE,QAAA,EAAA,gUAAA,EAKH,CAAA;AAAA,sBACAC,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,kCAAA;AAAA,wBACyBD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,QAAS;AAAA,OAAA,EAG9D,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,qPAAA,EAIH,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH;AAAA,KAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,8MAAA,EAGH,CAAA;AAAA,oBAKFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,+BAAA,EAA6B,CAAA;AAAA,sBACxEC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA;AAAA,QAAA,qGAAA;AAAA,QAC8D,GAAA;AAAA,wBAChFD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,QAAS,OAAA;AAAA,wBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,QAAS,gEAAA;AAAA,wBACzBA,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QAAS;AAAA,OAAA,EAC/D,CAAA;AAAA,sBACAC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,wBAAAD,IAAC,IAAA,EAAA,EACE,QAAA,EAAA,iBAAA,mBACCC,IAAAA,CAAAiB,UAAA,EAAE,QAAA,EAAA;AAAA,UAAA,mBAAA;AAAA,UACkB,GAAA;AAAA,0BAClBjB,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,YAAA,iBAAA;AAAA,YAAkB;AAAA,WAAA,EACrB,CAAA;AAAA,UAAQ,GAAA;AAAA,UAAI,WAAA;AAAA,0BACHD,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,UAAO;AAAA,SAAA,EACjC,oBAEAA,GAAAA,CAAAkB,QAAAA,EAAA,EAAE,uFAAsE,CAAA,EAE5E,CAAA;AAAA,wBACAlB,GAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,iFAAA,EAAoE,CAAA;AAAA,wBACxEC,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,UAAA,gBAAA;AAAA,0BAAcD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,2BAAA,EAAmB,CAAA;AAAA,UAAS;AAAA,SAAA,EAAS;AAAA,OAAA,EACjE,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,QAAO,QAAA,EAAA,0FAAA,EAEpB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,iBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EAAa,0HAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAON,OAAA,EAAS,6CAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,SAAA;AAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,kCAAA;AAAA;AAAA;AAAA,EAGT,eAAA,EAAiB,EAAE,GAAA,EAAK,0BAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EAAQ,sKAAA;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,OAAA;AAAA,EACX,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,4GAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,8FAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA,EAGA,GAAG+D,gBAAAA;AAAA,IACD,kBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQ,gBAAA,CAAiB,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC7C,KAAA,EAAO,SAAA;AAAA;AAAA;AAAA;AAAA,MAIP,GAAGC,cAAAA,CAAe,mBAAA,CAAoB,UAAA,EAAY,QAAQ,GAAG,UAAU;AAAA,KACzE,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAMvD,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGwD,mBAAmBxD,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,gBAAgB,YAAY;AAC1B,IAAA,MAAMA,MAAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;AC5bO,IAAM,wBAAA,GAA2B;AAWjC,IAAM,6BAAA,GAAgC;AAoC7C,IAAMA,MAAAA,GAAQoD,sBAAsB,wBAAwB,CAAA;AAY5D,SAASQ,kBAAiB,UAAA,EAAwE;AAKhG,EAAA,MAAM,UAAU,MAAA,CAAO,UAAA,EAAY,WAAA,IAAe,EAAE,EAAE,IAAA,EAAK;AAC3D,EAAA,OAAO,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,qBAAA,CAAA,GAAoB,iBAAA;AACjD;AAEA,SAAS,qBAAA,GAAwB;AAC/B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIvD,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAqD,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA;AAC3G,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAKN,MAAAA,CACF,GAAA,EAAI,CACJ,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,YAAA,CAAa,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA;AACxB,MAAA,UAAA,CAAW;AAAA,QACT,MAAM,MAAA,CAAO,CAAA,EAAG,eAAe,EAAE,CAAA,CAAE,MAAK,IAAK,IAAA;AAAA,QAC7C,IAAI,MAAA,CAAO,CAAA,EAAG,sBAAsB,EAAE,CAAA,CAAE,MAAK,IAAK;AAAA,OACnD,CAAA;AAAA,IACH,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,SAAA,CAAU,IAAI,CAAA;AAAA,IAAE,CAAC,CAAA;AACpD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAK,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACER,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,KAAc,OAAA,CAAQ,QAAQ,OAAA,CAAQ,EAAA,CAAA;AAAA;AAAA;AAAA,oBAIrCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,MACzD,OAAA,CAAQ,wBAAQA,GAAAA,CAAC,OAAE,SAAA,EAAU,kBAAA,EAAoB,kBAAQ,IAAA,EAAK,CAAA;AAAA,MAC9D,QAAQ,EAAA,oBACPC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,QAAA,EAAS,QAAA,EAAA;AAAA,QAAA,sBAAA;AAAA,wBACAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EAAgC,kBAAQ,EAAA,EAAG;AAAA,OAAA,EACjF,CAAA;AAAA,sBAEFC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA;AAAA,QAAA,sCAAA;AAAA,wBACYD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,QAAS;AAAA,OAAA,EAE5D;AAAA,KAAA,EACF,CAAA;AAAA,IAED,SAAA,IAAa,CAAC,OAAA,CAAQ,IAAA,IAAQ,CAAC,OAAA,CAAQ,EAAA;AAAA;AAAA,oBAGtCC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA;AAAA,MAAA,iIAAA;AAAA,sBAEjBD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,MAAS;AAAA,KAAA,EAC9D,CAAA;AAAA,IAED,SAAA,mBACCC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAjB,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,4BAAA;AAAA,wBACsBD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,QAAS;AAAA,OAAA,EAG5D,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,6SAAA,EAIH,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,4LAAA,EAGH,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,yKAAA,EAGH;AAAA,KAAA,EACF,CAAA,mBAEAC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAjB,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,wBACSD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,QAAS;AAAA,OAAA,EAErC,CAAA;AAAA,sBACAC,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,gCAAA;AAAA,wBAC6BD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,QAAS;AAAA,OAAA,EAGpD,CAAA;AAAA,sBACAC,KAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,wBACaD,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,QAAS;AAAA,OAAA,EAGnC;AAAA,KAAA,EACF,CAAA;AAAA,oBAKFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,mCAAA,EAAiC,CAAA;AAAA,sBAC5EC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA;AAAA,QAAA,yBAAA;AAAA,wBACED,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,sBAAA,EAAiB,CAAA;AAAA,QAAS,sPAAA;AAAA,QAEqC,GAAA;AAAA,wBAC3FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAA+B,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,QAAO,GAAA;AAAA,wBAACA,GAAAA,CAAC,QAAA,EAAA,EAAO,QAAA,EAAA,kBAAA,EAAa,CAAA;AAAA,QAAU,GAAA;AAAA,QAAI;AAAA,OAAA,EAEjG;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,uBAAA,GAA+C;AAAA,EAC1D,EAAA,EAAI,wBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,4BAAA;AAAA,EACN,WAAA,EAAa,mIAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMN,OAAA,EAAS,mDAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBV,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,UAAA,EAAY8D,mBAAmB,wBAAwB,CAAA;AAAA;AAAA;AAAA,EAGvD,MAAA,EAAQ,CAAC,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1B,SAAA,EAAW,UAAA;AAAA,EACX,OAAA,EAAS,wEAAA;AAAA,EACT,eAAA,EAAiB,EAAE,GAAA,EAAK,qDAAA,EAAsD;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9E,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,MAChB,MAAA,EACE,iIAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,MAAA,EACE,mMAAA;AAAA,MACF,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,eAAA,EAAiB,6BAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,OAAA;AAAA,EACX,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,4BAAA;AAAA,MACL,KAAA,EAAO,8HAAA;AAAA,MACP,OAAA,EAAS,CAAC,OAAA,EAAS,SAAS;AAAA,KAC9B;AAAA,IACA;AAAA,MACE,GAAA,EAAK,sBAAA;AAAA,MACL,KAAA,EAAO,qGAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,CAAC,SAAS;AAAA;AACrB,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAGC,gBAAAA;AAAA,IACD,wBAAA;AAAA,IACA,CAAC,UAAA,MAAgB;AAAA,MACf,SAAA,EAAW,CAAC,CAAC,UAAA,EAAY,MAAA;AAAA,MACzB,MAAA,EAAQM,kBAAiB,UAAU,CAAA;AAAA,MACnC,KAAA,EAAO;AAAA,KACT,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAM5D,MAAAA;AAAM,GACvB;AAAA,EACA,GAAGwD,mBAAmBxD,MAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,gBAAgB,YAAY;AAyB1B,IAAA,MAAM,OAAA,GAAU,MAAM,wBAAA,CAAyB;AAAA,MAC7C,WAAA,EAAa,wBAAA;AAAA,MACb,UAAUG,iBAAAA;AAAkB,KAC7B,CAAA;AACD,IAAA,MAAMH,OAAM,IAAA,CAAK;AAAA,MACf,MAAA,EAAQ,IAAA;AAAA,MACR,GAAI,SAAS,WAAA,GAAc,EAAE,aAAa,OAAA,CAAQ,WAAA,KAAgB,EAAC;AAAA,MACnE,GAAI,SAAS,kBAAA,GAAqB,EAAE,oBAAoB,OAAA,CAAQ,kBAAA,KAAuB;AAAC,KACzF,CAAA;AAAA,EACH,CAAA;AAAA,EACA,UAAA,EAAY,MAAMA,MAAAA,CAAM,UAAA,EAAW;AAAA,EACnC,UAAA,EAAY;AACd;;;ACtVO,SAAS,YAAY,SAAA,EAAwD;AAClF,EAAA,OAAO,CAAA,WAAA,EAAc,UAAU,EAAE,CAAA,OAAA,CAAA;AACnC;AASO,SAAS,cAAc,IAAA,EAAyB;AACrD,EAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,GAAG,CAAA,SAAU,IAAA,CAAK,GAAA;AAC7C,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACjD,EAAA,OAAO,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG,SAAS,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACzE;ACIA,IAAM,IAAA,GAA6C;AAAA,EACjD,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,EAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAA;AAC3B,CAAA;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAASZ,SAAQ,QAAA,EAA+C;AAC9D,EAAA,OAAO,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,EAAS,GAAI,YAAYkC,eAAAA,EAAgB;AACnF;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAI,CAAC,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AACjF,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,IAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE;AAQO,SAAS,WAAA,CAAY,EAAE,eAAA,EAAgB,EAAqB;AACjE,EAAA,MAAM,QAAA,GAAWhC,iBAAM,OAAA,CAAQ,MAAMF,SAAQ,eAAe,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAChF,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,cAAA,KAAmB,UAAA;AAErD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,gBAAAA,CAAM,SAA6B,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,gBAAAA,CAAM,SAAmB,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAAA,CAAM,SAA2B,IAAI,CAAA;AAC/E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAAA,CAAM,SAAS,KAAK,CAAA;AAGtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAAAA,CAAM,SAAwB,IAAI,CAAA;AAG9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,gBAAAA,CAAM,QAAA,CAAqC,EAAE,CAAA;AAIjF,EAAA,MAAM,cAAA,GAAiBA,gBAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAE1D,EAAA,MAAM,MAAA,GAASA,gBAAAA,CAAM,WAAA,CAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAAE,MAAA,QAAA,CAAS,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AACrD,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,MAAM,QAAA,CAAS,cAAA,EAAgB,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,GAAG,CAAA;AAClD,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AAAE,IAAA,KAAK,MAAA,EAAO;AAAA,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAUA,gBAAAA,CAAM,WAAA,CAAY,CAAC,IAAY,CAAA,KAAkB;AAC/D,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,CAAC,EAAE,GAAG,GAAG,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,OAAO,MAAA,KAA4B;AACtD,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,IAAU,CAAC,SAAS,eAAA,EAAiB;AAClD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AAIF,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,QAAA,MAAM,QAAA,CAAS,gBAAgB,IAAI,CAAA;AAAA,MACrC;AACA,MAAAuE,KAAAA,CAAM,QAAQ,MAAA,CAAO,MAAA,KAAW,IAAI,iBAAA,GAAoB,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAC5F,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,2BAA2B,GAAG,CAAA;AAC3C,MAAAA,KAAAA,CAAM,MAAM,yCAAmC,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,EAAiB,MAAA,KAAiB;AAC7D,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,IAAIC,OAAAA;AACJ,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAI,CAAC,QAAA,CAAS,mBAAA,EAAqB,MAAM,IAAI,MAAM,aAAa,CAAA;AAChE,QAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,oBAAoB,IAAA,CAAK,SAAA,CAAU,cAAc,MAAM,CAAA;AAGpF,QAAAA,UAAS,uBAAA,CAAwB,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,EAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,QAAA,CAAS,eAAA,EAAiB,MAAM,IAAI,MAAM,aAAa,CAAA;AAG5D,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,eAAA,CAAgB,MAAM,CAAA;AACtD,QAAA,IAAI,SAAS,eAAA,EAAiB,MAAM,QAAA,CAAS,eAAA,CAAgB,KAAK,EAAE,CAAA;AACpE,QAAAA,UAAS,QAAA,CAAS,EAAA;AAAA,MACpB;AACA,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,SAAA,CAAUA,OAAM,CAAA;AAChB,MAAAD,KAAAA,CAAM,QAAQ,iBAAiB,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,GAAG,CAAA;AAC5C,MAAAA,KAAAA,CAAM,MAAM,yCAAmC,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,MAAM,IAAA,GAAO,aAAA;AACb,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI;AAIF,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,MAAM,QAAA,CAAS,kBAAA,CAAmB,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,QAAA,CAAS,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA;AAAA,MACxC;AACA,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,IAAI,CAAA;AAChE,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,IAAI,MAAA,KAAW,IAAA,CAAK,EAAA,EAAI,SAAA,CAAU,IAAI,CAAA;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,2BAA2B,GAAG,CAAA;AAC3C,MAAAA,KAAAA,CAAM,MAAM,0CAAoC,CAAA;AAAA,IAClD,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAA,CAAW,KAAA,IAAS,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,KAAQ,KAAA,IAAS,CAAA,CAAE,IAAA,KAAS,GAAG,CAAA;AAC3E,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,SAAA,IAAa,CAAA,GAAI,OAAA,CAAQ,SAAS,CAAA,GAAK,IAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAAoB,OAAA,CAAQ,KAAK,SAAS,CAAA,IAAK,OAAO,QAAA,CAAS,eAAA,KAAoB,UAAA;AACtG,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAoB,IAAA,CAAK,SAAA,GACzC,OAAO,QAAA,CAAS,mBAAA,KAAwB,UAAA,GACxC,OAAO,QAAA,CAAS,eAAA,KAAoB,UAAA;AAIxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,uBACErE,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAlB,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,IAAA;AAAA,UACN,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,UAC9B,YAAY,CAAC,CAAA,KAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACrC,UAAU,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,QAAQ,MAAA,EAAO;AAAA,UACpD,UAAA,EAAY,CAAC,KAAA,KAAU,SAAA,CAAU,OAAA,CAAQ,YAAY,KAAK,CAAA,EAAG,EAAA,IAAM,IAAA,CAAK,EAAE,CAAA;AAAA,UAC1E,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UAC5B,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA,GAAI,CAAC,WAAW,KAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA,GAAI,MAAA;AAAA,UAC7E,UAAU,SAAA,CAAU,IAAI,IAAI,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI,MAAA;AAAA,UAC3D;AAAA;AAAA,OACF;AAAA,sBACAA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAW,MAAM,KAAK,aAAA,EAAc;AAAA,UACpC,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAI;AAAA;AAAA;AACvC,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAClD,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAS,CAAA;AAShD,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAgB;AAC/B,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,IAAA,IAAI,CAAA,KAAM,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAC9B,IAAA,OAAO,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,CAAC,CAAA,CAAE,MAAA;AAAA,EAC3C,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,CAAA,CAAE,KAAK,GAAE,CAAE,CAAA;AAMhE,EAAA,MAAM,gBAA8B,CAAC;AAAA,IACnC,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,YAAY,gBAAA,GAAc,iBAAA;AAAA,IACjC,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA;AAAA,IAER,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,MAAM,cAAA,CAAe,OAAA,EAAS,KAAA;AAAM,GAC/C,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,qBAClBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,qBACTA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAEC,IAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,MAC9B,YAAY,CAAC,CAAA,KAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACrC,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,MAC/B,UAAU,SAAA,CAAU,IAAI,IAAI,MAAM,gBAAA,CAAiB,IAAI,CAAA,GAAI;AAAA,KAAA;AAAA,IALtD,IAAA,CAAK;AAAA,GAOb,CAAA,EACH,CAAA;AAGF,EAAA,uBACEC,IAAAA,CAAAiB,QAAAA,EAAA,EAgBE,QAAA,EAAA;AAAA,oBAAAlB,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAW;AAAA;AAAA,KACb;AAAA,IACC,SAAA,IAAa,QAAA,CAAS,eAAA,oBACrBA,GAAAA,CAAC,iBAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAS,aAAA,EAAe,CAAA,EACvC,CAAA;AAAA,oBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,MAAA,CAAC,SAAA,mBACAA,IAAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,wBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,QAAA,EAAA,kCAAA,EAA6B,CAAA;AAAA,wBAC7DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,mGAAA,EAElD;AAAA,OAAA,EACF,CAAA,GACE,UAAU,IAAA,mBACZA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACjCC,IAAAA,CAAC,IAAA,EAAA,EAAa,SAAA,EAAU,KAAA,EACtB,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD,CAAA;AAAA,wBACjEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD;AAAA,OAAA,EAAA,EAFxD,CAGX,CACD,CAAA,EACH,CAAA,GACE,OAAA,CAAQ,MAAA,KAAW,CAAA,mBACrBC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,wBAC5DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oBAAmB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBACpDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,mFAAA,EAElD;AAAA,OAAA,EACF,CAAA,GACE,QAAA,CAAS,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA;AAAA;AAAA,wBAG3BC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,4BAAAD,IAAC,YAAA,EAAA,EAAa,KAAA,EAAM,mBAAA,EAAoB,KAAA,EAAO,SAAS,MAAA,EAAQ,CAAA;AAAA,YAC/D,WAAW,QAAQ;AAAA,WAAA,EACtB,CAAA;AAAA,0BACAC,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EACjB,QAAA,EAAA;AAAA,4BAAAD,IAAC,YAAA,EAAA,EAAa,KAAA,EAAM,YAAA,EAAa,KAAA,EAAO,MAAM,MAAA,EAAQ,CAAA;AAAA,YACrD,WAAW,KAAK;AAAA,WAAA,EACnB;AAAA,SAAA,EACF;AAAA,UAEA,WAAW,OAAO,CAAA;AAAA,sBAGpBA,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAW,MAAM,KAAK,aAAA,EAAc;AAAA,UACpC,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAI;AAAA;AAAA,OACvC;AAAA,MACC,SAAA,IAAa,QAAA,CAAS,eAAA,oBACrBA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,cAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,KAAK,aAAa,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,QAAQ,MAAM;AAC9C,cAAA,IAAI,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,YAC7D,CAAC,CAAA;AAAA,UACH;AAAA;AAAA;AACF,KAAA,EAEF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,cAAc,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,UAAS,EAKzD;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,KAAS,IAAA;AAAA,MACf,OAAA;AAAA,MACA,OAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,IAAA,EAAM,SAAA,GAAY,4BAAA,GAA+B,kBAAA;AAAA,MACxD,aAAa,IAAA,EAAM,SAAA,GACf,kBAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,0BAAA,CAAA,GACtC,qGAAA;AAAA,MACJ,YAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAY,UAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,KAAA,EAAM,EAAqC;AACxE,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IAAM,GAAA;AAAA,oBAACA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,KAAA;AAAA,MAAM;AAAA,KAAA,EAAC;AAAA,GAAA,EACvE,CAAA;AAEJ;AAGA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAU,EAAmD;AACrF,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAA,GAAU,IAAA,GAAO,QAAA;AACvC,EAAA,uBAAOD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAsB,CAAA;AACrC;AAEA,SAAS,UAAU,EAAE,IAAA,EAAM,YAAY,UAAA,EAAY,MAAA,EAAQ,UAAS,EAMjE;AACD,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACd,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACE,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAY,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,QAC9B,SAAA,EAAU,wIAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,KAAS,0BACbH,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAK,IAAA,CAAK,GAAA;AAAA,cACV,KAAK,IAAA,CAAK,IAAA;AAAA,cACV,OAAA,EAAQ,MAAA;AAAA,cACR,SAAA,EAAU,8BAAA;AAAA,cACV,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,gBAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AACd,gBAAA,IAAI,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,EAAE,KAAA,EAAO,IAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,aAAA,EAAe,CAAA;AAAA,cACzF;AAAA;AAAA,WACF,mBAEAA,GAAAA,CAAC,QAAA,EAAA,EAAS,MAAM,IAAA,CAAK,IAAA,EAAM,WAAU,+BAAA,EAAgC,CAAA;AAAA,UAEtE,IAAA,CAAK,WAAW,OAAA,oBACfA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+GAA8G,QAAA,EAAA,MAAA,EAE9H;AAAA;AAAA;AAAA,KAEJ;AAAA,IAEC,4BACCA,GAAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,WACV,QAAA,kBAAAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QAAO,OAAA,EAAQ,MAAA;AAAA,QAAO,IAAA,EAAK,MAAA;AAAA,QAC1B,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,SAAA;AAAA,QACX,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,oKAAA;AAAA,QAEV,QAAA,kBAAAH,GAAAA,CAACiD,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc;AAAA;AAAA,KAClC,EACF,CAAA;AAAA,oBAGFjD,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAwC,KAAA,EAAO,IAAA,CAAK,IAAA,EAAO,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,oBAClFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EACX,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY,UAAA,EAAwB,CAAA,EAChD,CAAA;AAAA,IAEC,eAAA,CAAgB,MAAM,UAAU,CAAA,oBAC/BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,uBAAA,EAAe,CAAA;AAAA,IAGzE,KAAK,SAAA,mBACJA,GAAAA,CAAC,UAAA,EAAA,EAAW,WAAW,IAAA,CAAK,SAAA,EAAW,SAAA,EAAU,oBAAA,EAAqB,oBAEtEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA2C,QAAA,EAAA,YAAA,EAAU;AAAA,GAAA,EAEtE,CAAA;AAEJ;AASA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU;AACnF,CAAA,EAUG;AACD,EAAA,MAAM,UAAA,GAAaD,gBAAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAKtD,EAAAA,gBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,UAAA,CAAW,EAAE,CAAA;AACxC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,UAAA,CAAW,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA;AAAA;AAAA;AAAA;AAAA,oBAIEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAIb,QAAA,EAAA;AAAA,sBAAAD,IAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,IAAA,EAAM,WAAA,EAAY,eAAW,MAAA,EAAgB,CAAA;AAAA,MAEpE,QAAA,CAAS,KAAA,GAAQ,CAAA,oBAChBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,kBAAA;AAAA,YACX,QAAA,EAAU,SAAS,KAAA,KAAU,CAAA;AAAA,YAC7B,OAAA,EAAS,MAAM,UAAA,CAAW,EAAE,CAAA;AAAA,YAC5B,SAAA,EAAU,qEAAA;AAAA,YAEV,QAAA,kBAAAH,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,wBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,KAAA,GAAQ,CAAA;AAAA,UAAE,MAAA;AAAA,UAAK,QAAA,CAAS;AAAA,SAAA,EAAM,CAAA;AAAA,wBAC5ED,GAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAQ,MAAA;AAAA,YAAO,IAAA,EAAK,MAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,oBAAA;AAAA,YACX,QAAA,EAAU,QAAA,CAAS,KAAA,KAAU,QAAA,CAAS,KAAA,GAAQ,CAAA;AAAA,YAC9C,OAAA,EAAS,MAAM,UAAA,CAAW,CAAC,CAAA;AAAA,YAC3B,SAAA,EAAU,qEAAA;AAAA,YAEV,QAAA,kBAAAH,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACpC,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBAGFC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,IAAC,IAAA,EAAA,EAAK,SAAA,EAAU,+EACb,QAAA,EAAA,IAAA,CAAK,IAAA,KAAS,0BACbA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,KAAK,IAAA,CAAK,GAAA;AAAA,YACV,KAAK,IAAA,CAAK,IAAA;AAAA,YACV,SAAA,EAAU,+CAAA;AAAA,YACV,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,cAAA,MAAM,MAAM,CAAA,CAAE,aAAA;AACd,cAAA,IAAI,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,EAAE,KAAA,EAAO,IAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,aAAA,EAAe,CAAA;AAAA,YACzF;AAAA,WAAA;AAAA,UAPK,IAAA,CAAK;AAAA,SAQZ,mBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,IAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,WAAU,WAAA,EAAY,CAAA;AAAA,0BACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,gDAAA,EAA+B;AAAA,SAAA,EAC3D,CAAA,EAEJ,CAAA;AAAA,wBAEAC,IAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EACd,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,OAAE,SAAA,EAAU,yBAAA,EAA0B,OAAO,IAAA,CAAK,IAAA,EAAO,eAAK,IAAA,EAAK,CAAA;AAAA,4BACpEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACX,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY,UAAA,EAAwB,CAAA,EAChD,CAAA;AAAA,YACC,eAAA,CAAgB,MAAM,UAAU,CAAA,oBAC/BC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,4EAAA,EAA6E,QAAA,EAAA;AAAA,cAAA,oGAAA;AAAA,cAEzE,iBAAA;AAAA,cAAkB;AAAA,aAAA,EACnC;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2DAAA,EAA4D,QAAA,EAAA,iBAAA,EAAY,CAAA;AAAA,YACpF,KAAK,SAAA,mBACJA,GAAAA,CAAC,UAAA,EAAA,EAAW,WAAW,IAAA,CAAK,SAAA,EAAW,SAAA,EAAU,cAAA,EAAe,oBAEhEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,wEAAA,EAElD,CAAA;AAAA,YAED,IAAA,CAAK,WAAW,OAAA,oBACfA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,4EAAA,EAElD;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAMZ,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,IAAA,KAAS,2BACbD,GAAAA;AAAA,cAACwE,WAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,QAAA;AAAA,gBACV,IAAA,EAAK,IAAA;AAAA,gBACL,KAAA,EAAM,iBAAA;AAAA,gBACN,OAAO,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,gBACxC,KAAA,EAAM,qBAAA;AAAA,gBACN,IAAA,EAAK,qCAAA;AAAA,gBACL,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,sBAAA;AAAA,kBACT,KAAA,EAAO,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAAA,kBAClC,WAAA,EACE,8GAAA;AAAA,kBACF,WAAA,EAAa;AAAA,oBACX,EAAE,KAAA,EAAO,cAAA,EAAgB,MAAA,EAAQ,+BAAA,EAAgC;AAAA,oBACjE,EAAE,KAAA,EAAO,gBAAA,EAAe,MAAA,EAAQ,uCAAA,EAAkC;AAAA,oBAClE,EAAE,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ,uCAAA;AAAkC;AACvE;AACF;AAAA,aACF;AAAA,4BAGFxE,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAO,IAAA,EAAC,SAAQ,SAAA,EAAU,SAAA,EAAU,UAC1C,QAAA,kBAAAF,IAAAA,CAAC,OAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAG,QAAA,EAAU,KAAK,IAAA,EAC3C,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,cAAE;AAAA,aAAA,EAEvC,CAAA,EACF,CAAA;AAAA,YAEC,SAAA,oBACCC,IAAAA,CAAAiB,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAlB,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,UAAA;AAAA,kBACL,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAQ,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,MAAA;AAAA,kBAC5C,SAAA,EAAU,QAAA;AAAA,kBACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,oBAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACjC,oBAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AACjB,oBAAA,IAAI,MAAA,YAAkB,MAAM,CAAA;AAAA,kBAC9B;AAAA;AAAA,eACF;AAAA,8BACAC,IAAAA;AAAA,gBAACE,MAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,SAAA;AAAA,kBACR,SAAA,EAAU,QAAA;AAAA,kBACV,QAAA,EAAU,SAAA;AAAA,kBACV,OAAA,EAAS,MAAM,UAAA,CAAW,OAAA,EAAS,KAAA,EAAM;AAAA,kBAEzC,QAAA,EAAA;AAAA,oCAAAH,IAAC,SAAA,EAAA,EAAU,SAAA,EAAW,gBAAgB,SAAA,GAAY,cAAA,GAAiB,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,oBACxE,YAAY,gBAAA,GAAc;AAAA;AAAA;AAAA,eAC7B;AAAA,cACC,KAAK,SAAA,oBACJA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,kEAAA,EAEjD;AAAA,aAAA,EAEJ,CAAA;AAAA,YAGD,QAAA,oBACCC,IAAAA,CAACE,MAAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,SAAA,EAAU,gDAAA,EAAiD,OAAA,EAAS,QAAA,EAC1F,QAAA,EAAA;AAAA,8BAAAH,GAAAA,CAACiD,MAAAA,EAAA,EAAO,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,cAAE;AAAA,aAAA,EAErC;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,SAAA,GAAY,IAAG,EAI7C;AACD,EAAA,uBACEhD,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,YAAY,SAAS,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAA,MAAA,EAAS,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,MAC/B,SAAA,EAAW,6EAA6E,SAAS,CAAA,CAAA;AAAA,MAEjG,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACyE,OAAAA,EAAA,EAAQ,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,wBACtCzE,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,oBAAU,KAAA,EAAM;AAAA;AAAA;AAAA,GAC9C;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,UAAA,EAAW,EAAiD;AACpF,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,IAAA,CAAK,SAAA;AAAA,IACL,aAAa,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,IAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,IAC1D,UAAA,CAAW,KAAK,IAAI;AAAA,GACtB,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,uBAAOA,GAAAA,CAAAkB,QAAAA,EAAA,EAAG,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,EAAE,CAAA;AAC9B;AAEA,SAAS,eAAA,CAAgB,MAAiB,UAAA,EAAkC;AAC1E,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,CAAC,CAAC,UAAA,IAC7B,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,UAAA,CAAW,MAAM,CAAA,GAAI,iBAAA;AACvD;;;AC7oBO,IAAM,kBAAA,GAAqB;AAG3B,IAAM,gBAAA,GAAoC,EAAE,SAAA,EAAW,CAAA,EAAG,QAAQ,IAAA;AAGlE,IAAM,mBAAA,GAAsB,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK;AAU5C,IAAM,0BAA0B,EAAA,GAAK;AAGrC,IAAM,mBAAA,GAAsB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK;AAG1C,IAAM,eAAA,GAAkB;AAUxB,IAAM,iBAAA,GAAoB;AAG1B,IAAM,sBAAA,GAAyB;AAG/B,IAAM,yBAAA,GAA4B;AC3ClC,IAAM,cAAA,GAAiB,YAAA;AAkC9B,SAASwD,OAAAA,GAAwB;AAC/B,EAAA,MAAM,WAAWC,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oDAAiD,CAAA;AAChF,EAAA,OAAO,QAAA;AACT;AAQA,eAAeC,QAAU,IAAA,EAA2C;AAClE,EAAA,MAAM,WAAWC,eAAAA,EAAgB;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACnF,EAAA,MAAM,YAAA,GAAe,MAAMC,qBAAAA,CAAsB,EAAE,UAAU,CAAA;AAE7D,EAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAMJ,OAAAA,EAAO,CAAE,SAAA,CAAU,MAAA,CAAO,cAAA,EAAgB;AAAA,IACtE,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,OAAA,EAAS,EAAE,CAACK,8BAA8B,GAAG,YAAA;AAAa,GAC3D,CAAA;AACD,EAAA,IAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,MAAM,OAAO,CAAA;AACxC,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,cAAc,IAAA,EAAoD;AAChF,EAAA,OAAOH,OAAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,GAAW,EAAE,IAAA,EAAK,CAAK,EAAI,CAAA;AACtE;AAGO,SAASI,cAAAA,GAA0C;AACxD,EAAA,OAAOJ,OAAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,CAAA;AAC3C;AAGO,SAAS,aAAA,GAA0C;AACxD,EAAA,OAAOA,OAAAA,CAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,CAAA;AAC5C;AAGO,SAAS,UAAA,GAAuC;AACrD,EAAA,OAAOA,OAAAA,CAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA;AACzC;AAGO,SAAS,SAAA,GAA4E;AAC1F,EAAA,OAAOA,OAAAA,CAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA;AACxC;AAUA,eAAe,SAAA,CAAU,OAAe,KAAA,EAAgD;AACtF,EAAA,MAAM,WAAWC,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAM,KAAA;AAAA,IAC7B,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,CAAE,OAAO,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,IAAA,EAAM,CAAA,CAAE,EAAA,CAAG,aAAa,QAAQ;AAAA,GAC5F;AACA,EAAA,OAAO,KAAA,GAAQ,OAAQ,KAAA,IAAS,CAAA;AAClC;AAEO,SAAS,eAAA,GAA0C;AACxD,EAAA,OAAO,SAAA,CAAU,qBAAqB,CAAC,CAAA,KAAW,EAAE,EAAA,CAAG,iBAAA,EAAmB,IAAI,CAAC,CAAA;AACjF;AAEA,eAAsB,gBAAA,GAA2C;AAC/D,EAAA,MAAM,WAAWE,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,MAAM,QAAA,CAC5B,KAAK,yBAAyB,CAAA,CAC9B,MAAA,CAAO,aAAa,EACpB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,UAAU,OAAO,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,WAAW,CAAC,CAAA;AACzE,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,kBAAkB,CAAA,CACvB,MAAA,CAAO,IAAI,EACX,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,gBAAgB,CAAC,CAAA;AACvB,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,KAAa,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AACjE;AAEA,eAAsB,aAAA,GAAwC;AAC5D,EAAA,MAAM,WAAWE,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,QAAA,CAC5B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,UAAU,EACjB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,UAAU,OAAO,CAAA,CACpB,EAAA,CAAG,MAAA,EAAQ,aAAa,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,KAAa,GAAA,CAAI,QAAQ,CAAC,CAAA;AACtE,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,eAAe,CAAA,CACpB,MAAA,CAAO,IAAI,EACX,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,GAAA,CAAI,UAAU,WAAW,CAAA;AAC5B,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,MAAA,CAAO,CAAC,GAAA,KAAa,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AACjE;AASA,eAAsB,mBAAA,CAAoB,QAAQ,EAAA,EAAkC;AAClF,EAAA,MAAM,WAAWE,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,SAAiB,EAAC;AAEpC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,QAAA,CAC5B,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO,oEAAoE,CAAA,CAC3E,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,GAAA,CAAI,QAAA,EAAU,WAAW,CAAA,CACzB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,KAAK,CAAA;AAEd,EAAA,MAAM,IAAA,GAAQ,UAAU,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE/B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,gDAAgD,CAAA,CACvD,EAAA,CAAG,aAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,QAAA,EAAU,OAAO,CAAA,CACpB,EAAA,CAAG,MAAA,EAAQ,aAAa,CAAA,CACxB,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAE3C,EAAA,MAAM,UAAU,IAAI,GAAA;AAAA,IAAA,CAChB,KAAA,IAAS,EAAC,EAAkC,GAAA,CAAI,CAAC,QAAQ,CAAC,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC;AAAA,GAChF;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,KAAU;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACjC,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA,GAAe,CAAA,OAAA,EAAU,KAAA,CAAM,YAAY,CAAA,CAAA,GAAK,QAAA;AACnE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA;AAAA,QACzC,EAAA,EAAI,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,OAAA;AAAA,QAC5B,QAAQ,KAAA,CAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,GAAI;AAAA,OAC9D;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,qBAAqB,EAAE,CAAA,CAAE,MAAK,EAAG;AACjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,iEAAA;AAAA,QACR,EAAA,EAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,KAAA,CAAM,EAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,uDAAA;AAAA,MACR,EAAA,EAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF,CAAC,CAAA;AACH;AAGO,SAAS,SAAA,GAGb;AACD,EAAA,OAAOC,OAAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AACvC;;;ACjNO,IAAM,oBAAA,GAAuB,MAClCf,qBAAAA,CAAsB,kBAAA,EAAoB;AAAA,EACxC,cAAc,CAAC,WAAA,EAAa,cAAA,EAAgB,YAAA,EAAc,UAAU,gBAAgB;AACtF,CAAC;AAEI,IAAM,iBAAA,GAAyC;AAAA,EACpD,EAAA,EAAI,kBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,WAAA,EACE,sHAAA;AAAA;AAAA;AAAA,EAGF,UAAA,EAAY;AAAA,IACV,iHAAA;AAAA,IACA,iGAAA;AAAA,IACA,oDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,IAAA,EAAM,OAAA;AAAA,EACN,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA;AAAA,EAIV,QAAA,EAAU,KAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW,SAAA;AAAA,EACX,OAAA,EAAS,iCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,cAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzB,MAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,eAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA;AAAA,MAGzB,MAAA,EACE,uJAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,YAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA;AAAA,MAGzB,MAAA,EACE,sKAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA;AAAA;AAAA;AAAA,MAIN,QAAA,EAAU,yBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,uBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA,EAAW,gBAAA;AAAA;AAAA;AAAA;AAAA,EAIX,WAAW,EAAE,UAAA,EAAY,mBAAmB,WAAA,EAAa,CAAA,EAAG,QAAQ,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/E,YAAA,EAAc,CAAC,yBAAA,EAA2B,iBAAA,EAAmB,wBAAwB,uBAAuB,CAAA;AAAA,EAC5G,kBAAA,EAAoB;AAAA,IAClB,EAAE,QAAA,EAAU,iBAAA,EAAmB,KAAA,EAAO,mDAAA,EAAoD;AAAA,IAC1F,EAAE,QAAA,EAAU,yBAAA,EAA2B,KAAA,EAAO,uDAAA,EAAqD;AAAA,IACnG,EAAE,QAAA,EAAU,sBAAA,EAAwB,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClG,EAAE,QAAA,EAAU,uBAAA,EAAyB,KAAA,EAAO,uDAAA;AAAwD,GACtG;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,4EAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,kDAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,YAAA,EAAc,eAAe;AAAA,KACzC;AAAA,IACA;AAAA,MACE,GAAA,EAAK,qBAAA;AAAA,MACL,KAAA,EAAO,mEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,cAAc;AAAA;AAC1B,GACF;AAAA;AAAA,EAEA,GAAGE,gBAAAA;AAAA,IACD,kBAAA;AAAA,IACA,CAAC,UAAA,KAAe;AACd,MAAA,IAAI,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,EAAE,WAAW,KAAA,EAAM;AACnD,MAAA,MAAM,OAAA,GAAU,WAAW,QAAA,EAAU,SAAA;AACrC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,WAAW,MAAA,KAAW,WAAA;AAAA,QACjC,MAAA,EAAQ,OAAA,GAAU,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,GAAK,MAAA;AAAA,QACzC,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAA;AAAA,IACA,EAAE,OAAO,oBAAA;AAAqB,GAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,EAAYD,mBAAmB,kBAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjD,gBAAgB,YAAY;AAC1B,IAAA,MAAM,sBAAqB,CAAE,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAY;AAAE,IAAA,MAAM,oBAAA,GAAuB,UAAA,EAAW;AAAA,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,EAIpE,cAAA,EACE,gGAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,GAAG,eAAe,oBAAoB,CAAA;AAAA;AAAA;AAAA,EAGtC,gBAAgB,CAAC,OAAA,KAAY,mBAAA,CAAoB,OAAA,EAAS,SAAS,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,EAIrE,WAAA,EAAa;AAAA,IACX;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,mBAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA;AAAA,MAEX,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EACE,iIAAA;AAAA,MACF,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,EAAE,EACzC,GAAA,CAAI,CAAC,QAAc,GAAA,EAAK,OAAA,GAAU,OAAO,GAAA,CAAI,OAAO,IAAI,IAAK,CAAA,CAC7D,OAAO,OAAO,CAAA;AACjB,QAAA,OAAO,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,CAAC,CAAA,0BAAA,CAAA,EAA8B,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAAA,MACvF;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MACL,KAAA,EAAO,6BAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA,MACX,WAAA,EAAa,6EAAA;AAAA,MACb,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AACzC,QAAA,OAAO,CAAA,EAAG,OAAO,OAAO,CAAA,mBAAA,EAAsB,OAAO,QAAQ,CAAA,YAAA,EAAe,OAAO,OAAO,CAAA,cAAA,CAAA;AAAA,MAC5F;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MACL,KAAA,EAAO,iCAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,uHAAA;AAAA;AAAA;AAAA,MAGF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,oCAAA;AAAA,QACP,IAAA,EACE,sMAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,eAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAMkB,cAAAA,EAAc;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MACL,KAAA,EAAO,yBAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,uHAAA;AAAA,MACF,GAAA,EAAK,YAAA,CAAa,MAAM,SAAA,EAAU,EAAG;AAAA,KACvC;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MACL,KAAA,EAAO,8BAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,6HAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,kCAAA;AAAA,QACP,IAAA,EACE,0KAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MACL,KAAA,EAAO,gBAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,iIAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,iCAAA;AAAA,QACP,IAAA,EACE,uKAAA;AAAA,QACF,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA;AACF;AAEJ;;;ACtSO,IAAM,oBAAA,GAAuB;AAS7B,IAAM,kBAAA,GAAsC,EAAE,SAAA,EAAW,CAAA,EAAG,QAAQ,GAAA;AAGpE,IAAM,iBAAA,GAAoB;AAU1B,IAAM,mBAAA,GAAsB;AAG5B,IAAM,yBAAA,GAA4B;AAGlC,IAAM,wBAAwB,EAAA,GAAK;;;AC7BnC,IAAM,YAAA,GACX;ACHK,IAAM,gBAAA,GAAmB;AAiChC,SAASN,OAAAA,GAAwB;AAC/B,EAAA,MAAM,WAAWC,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sDAAmD,CAAA;AAClF,EAAA,OAAO,QAAA;AACT;AAQA,eAAeC,QAAU,IAAA,EAA2C;AAClE,EAAA,MAAM,WAAWC,eAAAA,EAAgB;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sDAAsD,CAAA;AACrF,EAAA,MAAM,YAAA,GAAe,MAAMC,qBAAAA,CAAsB,EAAE,UAAU,CAAA;AAE7D,EAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAMJ,OAAAA,EAAO,CAAE,SAAA,CAAU,MAAA,CAAO,gBAAA,EAAkB;AAAA,IACxE,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,OAAA,EAAS,EAAE,CAACK,8BAA8B,GAAG,YAAA;AAAa,GAC3D,CAAA;AACD,EAAA,IAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,MAAM,OAAO,CAAA;AACxC,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,WAAA,GAA0D;AACxE,EAAA,OAAOH,OAAAA,CAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAClC;AAGO,SAASK,eAAc,IAAA,EAAsD;AAClF,EAAA,OAAOL,OAAAA,CAAO,EAAE,MAAA,EAAQ,eAAA,EAAiB,GAAI,IAAA,GAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAI,CAAA;AACtE;AAGO,SAASM,WAAAA,GAAyC;AACvD,EAAA,OAAON,OAAAA,CAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA;AACzC;AAGO,SAASO,UAAAA,GAGb;AACD,EAAA,OAAOP,OAAAA,CAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AACvC;AASA,eAAsBQ,cAAAA,GAAwC;AAC5D,EAAA,MAAM,WAAWP,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AAEnC,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,QAAA,CAC5B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,UAAU,EACjB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,UAAU,SAAS,CAAA,CACtB,EAAA,CAAG,MAAA,EAAQ,eAAe,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAA,CAAM,MAAA,IAAU,EAAC,EAAa,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAE5E,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,eAAe,CAAA,CACpB,MAAA,CAAO,IAAI,EACX,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,GAAA,CAAI,UAAU,WAAW,CAAA;AAC5B,EAAA,IAAI,OAAO,OAAO,IAAA;AAClB,EAAA,OAAA,CAAS,IAAA,IAAQ,EAAC,EAAa,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA;AACvE;AAUA,eAAsBU,oBAAAA,CAAoB,QAAQ,EAAA,EAAkC;AAClF,EAAA,MAAM,WAAWR,eAAAA,EAAgB;AACjC,EAAA,MAAM,WAAWF,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,SAAiB,EAAC;AAEpC,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,SAC5B,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO,yDAAyD,CAAA,CAChE,GAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,KAAA,CAAM,YAAA,EAAc,EAAE,WAAW,KAAA,EAAO,CAAA,CACxC,KAAA,CAAM,KAAK,CAAA;AAEd,EAAA,MAAM,IAAA,GAAQ,UAAU,EAAC;AACzB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE/B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,sBAAsB,CAAA,CAC3B,MAAA,CAAO,gDAAgD,CAAA,CACvD,EAAA,CAAG,aAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,CACtB,EAAA,CAAG,MAAA,EAAQ,eAAe,CAAA,CAC1B,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAE3C,EAAA,MAAM,UAAU,IAAI,GAAA;AAAA,IAAA,CAChB,KAAA,IAAS,EAAC,EAAkC,GAAA,CAAI,CAAC,QAAQ,CAAC,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC;AAAA,GAChF;AAEA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,KAA6B;AAC5C,IAAA,MAAM,UAAU,KAAA,CAAM,YAAA,GAAe,CAAA,OAAA,EAAU,KAAA,CAAM,YAAY,CAAA,CAAA,GAAK,QAAA;AACtE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACjC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA;AAAA,QACzC,EAAA,EAAI,IAAA,CAAK,SAAA,IAAa,KAAA,CAAM,OAAA;AAAA,QAC5B,GAAI,KAAA,CAAM,aAAA,GAAgB,EAAE,MAAA,EAAQ,OAAO,KAAA,CAAM,aAAa,CAAA,EAAE,GAAI;AAAC,OACvE;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,EAAE,MAAM,WAAA,EAAa;AAC9C,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,WAAW,KAAA,CAAM,EAAA;AAAA,QACjB,MAAA,EAAQ,QAAA;AAAA,QACR,MAAA,EAAQ,8CAAA;AAAA,QACR,IAAI,KAAA,CAAM;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,WAAW,KAAA,CAAM,EAAA;AAAA,MACjB,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,kEAAA;AAAA,MACR,EAAA,EAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM;AAAA,KAC7B;AAAA,EACF,CAAC,CAAA;AACH;;;ACzKO,IAAM,sBAAA,GAAyB,MACpCd,qBAAAA,CAAsB,oBAAA,EAAsB;AAAA,EAC1C,YAAA,EAAc,CAAC,WAAA,EAAa,cAAA,EAAgB,YAAY;AAC1D,CAAC;AAEI,IAAM,mBAAA,GAA2C;AAAA,EACtD,EAAA,EAAI,oBAAA;AAAA,EACJ,YAAA,EAAc,MAAA;AAAA,EACd,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EACE,sHAAA;AAAA;AAAA,EAEF,UAAA,EAAY;AAAA,IACV,uGAAA;AAAA,IACA,oDAAA;AAAA,IACA,8EAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,IAAA,EAAM,SAAA;AAAA;AAAA;AAAA,EAGN,OAAA,EAAS,YAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA;AAAA;AAAA,EAGV,QAAA,EAAU,KAAA;AAAA;AAAA;AAAA,EAGV,SAAA,EAAW,SAAA;AAAA,EACX,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,EACf,OAAA,EAAS,2CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUT,WAAA,EAAa;AAAA,IACX;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,cAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzB,MAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,YAAA;AAAA,MACV,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA;AAAA,MAGzB,MAAA,EACE,mJAAA;AAAA,MACF,SAAA,EAAW;AAAA,KACb;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,MAAA,EAAQ;AAAA;AACV,GACF;AAAA;AAAA;AAAA,EAGA,SAAA,EAAW,kBAAA;AAAA;AAAA;AAAA,EAGX,WAAW,EAAE,UAAA,EAAY,qBAAqB,WAAA,EAAa,CAAA,EAAG,QAAQ,UAAA,EAAW;AAAA;AAAA;AAAA,EAGjF,YAAA,EAAc,CAAC,iBAAA,EAAmB,sBAAsB,CAAA;AAAA,EACxD,kBAAA,EAAoB;AAAA,IAClB,EAAE,QAAA,EAAU,iBAAA,EAAmB,KAAA,EAAO,gDAAA,EAAiD;AAAA,IACvF,EAAE,QAAA,EAAU,sBAAA,EAAwB,KAAA,EAAO,oDAAA;AAAqD,GAClG;AAAA;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,GAAA,EAAK,iBAAA;AAAA,MACL,KAAA,EAAO,2CAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,GAAA,EAAK,qBAAA;AAAA,MACL,KAAA,EAAO,qEAAA;AAAA,MACP,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,CAAC,cAAc;AAAA;AAC1B,GACF;AAAA;AAAA,EAEA,GAAGE,gBAAAA;AAAA,IACD,oBAAA;AAAA,IACA,CAAC,UAAA,KAAe;AACd,MAAA,IAAI,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,EAAE,WAAW,KAAA,EAAM;AACnD,MAAA,MAAM,OAAA,GAAU,WAAW,QAAA,EAAU,SAAA;AACrC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,WAAW,MAAA,KAAW,WAAA;AAAA,QACjC,MAAA,EAAQ,OAAA,GAAU,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,GAAK,MAAA;AAAA,QACzC,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAA;AAAA,IACA,EAAE,OAAO,sBAAA;AAAuB,GAClC;AAAA;AAAA;AAAA,EAGA,UAAA,EAAYD,mBAAmB,oBAAoB,CAAA;AAAA;AAAA;AAAA;AAAA,EAInD,gBAAgB,YAAY;AAC1B,IAAA,MAAM,wBAAuB,CAAE,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACtD,CAAA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,YAAY;AACtB,IAAA,MAAM,sBAAA,GAAyB,UAAA,EAAW;AAAA,EAC5C,CAAA;AAAA,EACA,cAAA,EACE,gGAAA;AAAA,EACF,GAAGwB,eAAe,sBAAsB,CAAA;AAAA;AAAA;AAAA,EAGxC,gBAAgB,CAAC,OAAA,KAAYD,oBAAAA,CAAoB,OAAA,EAAS,SAAS,EAAE,CAAA;AAAA,EACrE,WAAA,EAAa;AAAA,IACX;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,mBAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA;AAAA,MAEX,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EACE,yHAAA;AAAA,MACF,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAMF,UAAAA,EAAU;AAC/B,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,EAAE,EACzC,GAAA,CAAI,CAAC,QAAS,GAAA,EAAK,OAAA,GAAU,OAAO,GAAA,CAAI,OAAO,IAAI,IAAK,CAAA,CACxD,OAAO,OAAO,CAAA;AACjB,QAAA,OAAO,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,CAAC,CAAA,4BAAA,CAAA,EAAgC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAAA,MACzF;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,eAAA;AAAA,MACL,KAAA,EAAO,+BAAA;AAAA,MACP,SAAA,EAAW,SAAA;AAAA,MACX,WAAA,EAAa,+EAAA;AAAA,MACb,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAMF,cAAAA,CAAc,MAAM,CAAA;AACzC,QAAA,OAAO,CAAA,EAAG,OAAO,OAAO,CAAA,mBAAA,EAAsB,OAAO,QAAQ,CAAA,YAAA,EAAe,OAAO,OAAO,CAAA,cAAA,CAAA;AAAA,MAC5F;AAAA,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MACL,KAAA,EAAO,+BAAA;AAAA,MACP,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EACE,sHAAA;AAAA,MACF,OAAA,EAASG,cAAAA;AAAA,MACT,KAAK,YAAY;AACf,QAAA,MAAM,MAAA,GAAS,MAAMF,WAAAA,EAAW;AAChC,QAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC1D;AAAA;AACF;AAEJ;ACxLA,IAAM,MAAA,GAAS,qBAAA;AACf,IAAM,KAAA,GAAQ,0BAAA;AACd,IAAM,SAAA,GAAY,wBAAA;AAClB,IAAM,QAAA,GAAW,uBAAA;AAEjB,IAAM,SAAA,GAAY,sBAAA;AAOlB,IAAM,GAAA,GAAM;AAAA,EACV,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,EAC9B,QAAA,EAAU,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAAA,EACnC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA;AAAA,EACrC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA;AAAA,EACpC,WAAA,EAAa,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,EACxC,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,WAAW;AACxC,CAAA;AAIA,IAAM,eAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,kBAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,gBAAA,EAAkB,6BAAuB,CAAA;AAAA,EACnD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,sBAAA,EAAwB,yBAAyB,CAAA;AAAA,EAC3D,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,QAAQ,MAAM,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,IAC3C,EAAE,KAAA,EAAO,EAAA,CAAG,WAAW,UAAU,CAAA,EAAG,OAAO,SAAA,EAAU;AAAA,IACrD,EAAE,KAAA,EAAO,EAAA,CAAG,kBAAkB,mBAAmB,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,IAC5E,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA,EAAW;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,sBAAsB,wBAAwB,CAAA,EAAG,OAAO,oBAAA,EAAqB;AAAA,IACzF,EAAE,KAAA,EAAO,EAAA,CAAG,UAAU,WAAW,CAAA,EAAG,OAAO,QAAA;AAAS;AAExD,CAAA;AAEA,IAAM,iBAAA,GAAwC;AAAA,EAC5C,GAAA,EAAK,oBAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,oBAAA,EAAsB,2BAAqB,CAAA;AAAA,EACrD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA;AAAA,EAClC,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,aAAa,SAAS,CAAA,EAAG,OAAO,WAAA,EAAY;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,uBAAuB,sBAAsB,CAAA,EAAG,OAAO,qBAAA,EAAsB;AAAA,IACzF,EAAE,KAAA,EAAO,EAAA,CAAG,eAAe,gBAAa,CAAA,EAAG,OAAO,aAAA;AAAc;AAEpE,CAAA;AAEA,IAAM,WAAA,GAAkC;AAAA,EACtC,GAAA,EAAK,QAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,0BAAoB,CAAA;AAAA,EAC9C,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,QAAQ,QAAQ,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,IAC7C,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA,EAAW;AAAA,IACxD,EAAE,KAAA,EAAO,EAAA,CAAG,aAAa,WAAW,CAAA,EAAG,OAAO,WAAA;AAAY;AAE9D,CAAA;AAIA,IAAM,mBAAA,GAA0C;AAAA,EAC9C,GAAG,eAAA;AAAA,EACH,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,aAAA,GAAoC;AAAA,EACxC,GAAA,EAAK,QAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,gBAAA,EAAkB,2BAAqB,CAAA;AAAA,EACjD,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA;AAAA,EAChC,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,EAAA,CAAG,UAAU,OAAO,CAAA,EAAG,OAAO,QAAA,EAAS;AAAA,IAChD,EAAE,KAAA,EAAO,EAAA,CAAG,SAAS,UAAU,CAAA,EAAG,OAAO,OAAA,EAAQ;AAAA,IACjD,EAAE,KAAA,EAAO,EAAA,CAAG,YAAY,WAAW,CAAA,EAAG,OAAO,UAAA;AAAW;AAE5D,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,eAAA,EAAiB,iBAAA,EAAmB,WAAW,CAAA;AAIrE,IAAM,CAAA,GAAI;AAAA,EACR,UAAA,EAAY,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC5G,SAAA,EAAW,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,WAAW,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACnG,QAAA,EAAU,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,oBAAiB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACxG,QAAA,EAAU,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC5F,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACtF,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EACjG,IAAA,EAAM,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC9F,MAAA,EAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,QAAA;AACjF,CAAA;AAGA,IAAM,GAAA,GAAwB;AAAA,EAC5B,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,EAAA,CAAG,qBAAA,EAAuB,iBAAc,CAAA;AAAA,EAC/C,GAAA,EAAK,OAAA;AAAA,EACL,OAAA,EAAS,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,uBAAA,GAA8C;AAC5D,EAAA,MAAM,OAAO,EAAE,MAAA,EAAQ,QAAQ,cAAA,EAAgB,SAAA,EAAW,SAAS,IAAA,EAAK;AAExE,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,kBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,eAAe,CAAA;AAAA,MACvC,WAAA,EAAa,EAAA;AAAA,QACX,0FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,kBAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,KAAK,CAAA;AAAA,QAClB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,WAAA,EAAa,UAAU,CAAA;AAAA,MAChC,WAAA,EAAa,EAAA;AAAA,QACX,qEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,IAAI,CAAA;AAAA,QACjB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,aAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAC5B,WAAA,EAAa,EAAA;AAAA,QACX,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,cAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,QACnB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,qBAAA,EAAuB,iBAAc,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,6FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAU,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,QACjC,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,KAAK,CAAA,EAAE;AAAA,MACtC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,+DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA,EAAS;AAAA;AAAA;AAAA,UAGjG,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,gBAAA,EAAkB,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA,EAAS;AAAA,UAC7G;AAAA,YACE,GAAA,EAAK,iBAAA;AAAA,YAAmB,KAAA,EAAO,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,YACvE,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,YAAG,MAAA,EAAQ;AAAA;AACtD,SACF;AAAA,QACA,OAAA,EAAS,CAAC,mBAAmB;AAAA,OAC/B;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,iBAAiB,CAAA,EAAE;AAAA,MAClD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,iBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,mBAAmB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA,CAAG,8CAAA,EAAgD,8DAAwD,CAAA;AAAA,MACxH,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,UAAU,CAAC,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,KAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,OAAA,EAAS,CAAC,mBAAmB;AAAA,OAC/B;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,8BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,+BAA4B,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,UACtI,CAAA,CAAE,MAAA;AAAA,UACF;AAAA,YACE,GAAA,EAAK,gBAAA;AAAA,YAAkB,KAAA,EAAO,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,YAC9E,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AACtE,SACF;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,gBAAgB,CAAA,EAAE;AAAA,MACjD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,wBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA;AAAA,QACX,oDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,oBAAoB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,QAAQ,QAAA,EAAS;AAAA,UAC9H,CAAA,CAAE,MAAA;AAAA,UACF;AAAA,YACE,GAAA,EAAK,mBAAA;AAAA,YAAqB,KAAA,EAAO,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,YAC/E,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AACtE,SACF;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,OAAO,QAAA,EAAU,CAAC,mBAAmB,CAAA,EAAE;AAAA,MACpD,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,0BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,sBAAmB,CAAA;AAAA,MAChD,WAAA,EAAa,EAAA;AAAA,QACX,2GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,WAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAU,CAAC;AAAA,UACT,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,kBAAA,EAAoB,sBAAmB,CAAA;AAAA,UACjD,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,QACD,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,sBAAsB,CAAA;AAAA,MAClD,WAAA,EAAa,EAAA;AAAA,QACX,2DAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,eAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,SAAS,CAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MAChC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAAE,KACjC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,MAIE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA;AAAA,MAC9C,WAAA,EAAa,EAAA;AAAA,QACX,wFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,0BAA0B,KAAA,EAAO,EAAA,CAAG,iBAAA,EAAmB,kBAAkB,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAY,CAAA;AAAA,QAC9H,OAAA,EAAS,CAAC,aAAa;AAAA,OACzB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,mBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,cAAA,EAAgB,aAAa,CAAA;AAAA,MACtC,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,mBAAmB,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,aAAa,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,OAAA,EAAS,CAAC,aAAa;AAAA,OACzB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,0BAA0B,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACpB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,2BAA2B,CAAA;AAAA,MACxD,WAAA,EAAa,EAAA,CAAG,iCAAA,EAAmC,2CAAwC,CAAA;AAAA,MAC3F,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,QACnB,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACpB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,kBAAA,EAAoB,oBAAoB,CAAA;AAAA,MACjD,WAAA,EAAa,EAAA;AAAA,QACX,wFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,QAAQ,UAAA,EAAW;AAAA,UACxG,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAA;AAAS,SACnG;AAAA,QACA,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,CAAC,SAAS,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,MAC1D,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,wBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,mBAAA,EAAqB,sBAAsB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA,CAAG,4CAAA,EAA8C,sDAAmD,CAAA;AAAA,MACjH,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,EAAA,CAAG,UAAA,EAAY,WAAW,CAAA,EAAG,CAAA;AAAA,QACzE,UAAU,CAAC,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,KAAK,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,YAAY,CAAA;AAAA,QACpH,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,8BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,wCAAkC,CAAA;AAAA,MACtE,WAAA,EAAa,EAAA,CAAG,gDAAA,EAAkD,qDAAkD,CAAA;AAAA,MACpH,IAAA,EAAM,YAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,kBAAA,EAAoB,OAAO,EAAA,CAAG,gBAAA,EAAkB,6BAAuB,CAAA,EAAG,CAAA;AAAA,QAC9F,QAAA,EAAU,CAAC,CAAA,CAAE,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,QAC5B,OAAA,EAAS,CAAC,WAAW,CAAA;AAAA,QACrB,WAAA,EAAa,OAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,aAAa,QAAA,EAAU,CAAC,OAAO,CAAA,EAAE;AAAA,MAC9C,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,mCAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,8BAAA,EAAgC,uCAAiC,CAAA;AAAA,MAC1E,WAAA,EAAa,EAAA;AAAA,QACX,iEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,WAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,oBAAA,EAAsB,OAAO,EAAA,CAAG,oBAAA,EAAsB,2BAAqB,CAAA,EAAG,CAAA;AAAA,QAClG,QAAA,EAAU,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,KAAK,CAAA;AAAA,QAC5B,OAAA,EAAS,CAAC,eAAA,EAAiB,WAAW,CAAA;AAAA,QACtC,WAAA,EAAa,QAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,aAAa,QAAA,EAAU,CAAC,QAAQ,CAAA,EAAE;AAAA,MAC/C,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,eAAA,EAAiB,gBAAgB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA,CAAG,mDAAA,EAAqD,6DAA0D,CAAA;AAAA,MAC/H,IAAA,EAAM,UAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,QAAA,EAAU,CAAC,EAAE,GAAA,EAAK,aAAa,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,gBAAgB,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,QAC7G,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,+BAAA,EAAiC,mCAAgC,CAAA;AAAA,MAC1E,WAAA,EAAa,EAAA;AAAA,QACX,gFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,QAC5E,UAAU,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,QACjC,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAK,EAAE,IAAA,EAAM,QAAQ,QAAA,EAAU,CAAC,KAAK,CAAA,EAAE;AAAA,MACvC,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,iBAAA,EAAmB,6BAAuB,CAAA;AAAA,MACnD,WAAA,EAAa,EAAA;AAAA,QACX,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,UAAU,GAAA,CAAI,KAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,QAAA,EAAU,CAAC,CAAA,CAAE,UAAA,EAAY,EAAE,SAAA,EAAW,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AAAA,QACtF,OAAA,EAAS;AAAA,OACX;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,gBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,aAAA,EAAe,kBAAkB,CAAA;AAAA,MAC1C,WAAA,EAAa,EAAA;AAAA,QACX,8FAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,cAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UAC3F,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA;AAAS,SACzF;AAAA;AAAA;AAAA,QAGA,OAAA,EAAS,CAAC,EAAE,GAAG,eAAe,YAAA,EAAc,CAAC,QAAQ,CAAA,EAAG,CAAA;AAAA,QACxD,WAAA,EAAa,iBAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAC/B,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,EAAA;AAAG,KAClC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,6BAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,wBAAA,EAA0B,kBAAkB,CAAA;AAAA,MACrD,WAAA,EAAa,EAAA;AAAA,QACX,iFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,aAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,EAAA,CAAG,eAAA,EAAiB,OAAO,CAAA,EAAG,CAAA;AAAA,QAC1E,QAAA,EAAU,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA;AAAA,QACjD,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,WAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,mBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,yBAAA,EAA2B,kBAAkB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,0HAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,CAAA;AAAA,QACrE,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UACvF,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,UAI3F,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,kBAAe,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UAChG;AAAA,YACE,GAAA,EAAK,cAAA;AAAA,YAAgB,KAAA,EAAO,EAAA,CAAG,cAAA,EAAgB,MAAM,CAAA;AAAA,YACrD,GAAA,EAAK,OAAA;AAAA,YAAS,OAAA,EAAS,CAAC,YAAA,EAAc,iBAAiB,CAAA;AAAA,YAAG,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ;AAAA;AAChF,SACF;AAAA,QACA,OAAA,EAAS,CAAC,aAAa,CAAA;AAAA,QACvB,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,wBAAA,EAA0B,mBAAmB,CAAA;AAAA,MACtD,WAAA,EAAa,EAAA;AAAA,QACX,kFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,UAAA,EAAY,IAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV;AAAA,YACE,GAAA,EAAK,eAAA;AAAA,YAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,YACrD,MAAA,EAAQ,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,eAAA;AAAgB,WACxD;AAAA;AAAA;AAAA,UAGA,EAAE,KAAK,aAAA,EAAe,KAAA,EAAO,GAAG,aAAA,EAAe,eAAe,CAAA,EAAG,MAAA,EAAQ,IAAA;AAAK,SAChF;AAAA,QACA,QAAA,EAAU;AAAA,UACR,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,aAAa,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,UAC9F,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,UACpF,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,iBAAc,CAAA,EAAG,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAA;AAAW,SACvG;AAAA,QACA,WAAA,EAAa,aAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA;AAAQ,KACvB;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,oBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,kBAAkB,CAAA;AAAA,MACzC,WAAA,EAAa,EAAA;AAAA,QACX,uEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,aAAA;AAAA,MACN,UAAU,GAAA,CAAI,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrC,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7E,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAK;AAAA,QACpF;AAAA,UACE,GAAA,EAAK,eAAA;AAAA,UAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,UACrD,IAAA,EAAM,QAAA;AAAA,UAAU,KAAA,EAAO,aAAA;AAAA,UAAe,UAAA,EAAY;AAAA,SACpD;AAAA,QACA,EAAE,KAAK,gBAAA,EAAkB,KAAA,EAAO,GAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrE,EAAE,KAAK,kBAAA,EAAoB,KAAA,EAAO,GAAG,SAAA,EAAW,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC3E,EAAE,KAAK,oBAAA,EAAsB,KAAA,EAAO,GAAG,aAAA,EAAe,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC/E,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,EAAA,CAAG,WAAA,EAAa,oBAAiB,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAClH,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AAClG,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,yBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,YAAA,EAAc,gBAAgB,CAAA;AAAA,MACvC,WAAA,EAAa,EAAA;AAAA,QACX,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,QACpC,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,QAC7B,WAAA,EAAa,YAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7E,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,EAAK;AAAA,QACpF,EAAE,KAAK,cAAA,EAAgB,KAAA,EAAO,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACrE,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,QACzC,EAAE,KAAK,eAAA,EAAiB,KAAA,EAAO,GAAG,UAAA,EAAY,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACzE,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC7F,EAAE,KAAK,YAAA,EAAc,KAAA,EAAO,GAAG,YAAA,EAAc,gBAAa,CAAA,EAAG,IAAA,EAAM,UAAA,EAAW;AAAA,QAC9E,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AACvG,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,sBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,qBAAA,EAAuB,uBAAoB,CAAA;AAAA,MACpD,WAAA,EAAa,EAAA;AAAA,QACX,8GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,QACvC,UAAA,EAAY,IAAA;AAAA,QACZ,OAAA,EAAS,CAAC,aAAa,CAAA;AAAA,QACvB,WAAA,EAAa,SAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP,EAAE,KAAK,cAAA,EAAgB,KAAA,EAAO,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACrE,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,QACzC,EAAE,KAAK,eAAA,EAAiB,KAAA,EAAO,GAAG,UAAA,EAAY,WAAW,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QACzE,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,GAAG,QAAA,EAAU,gBAAU,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,QAC/D,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,UAAO,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,IAAA,EAAK;AAAA,QAC9E,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,YAAY,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC/G,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAC3G,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAA,CAAG,SAAA,EAAW,SAAS,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QACtG,EAAE,GAAA,EAAK,wBAAA,EAA0B,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,kBAAkB,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA;AAAK;AACpI,KACF;AAAA,IACA;AAAA,MACE,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,uBAAA;AAAA,MACJ,IAAA,EAAM,EAAA,CAAG,eAAA,EAAiB,mBAAmB,CAAA;AAAA,MAC7C,WAAA,EAAa,EAAA;AAAA,QACX,oEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,QACxC,WAAA,EAAa,aAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,GAAA,EAAK,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,MACrB,OAAA,EAAS;AAAA,QACP;AAAA,UACE,GAAA,EAAK,eAAA;AAAA,UAAiB,KAAA,EAAO,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,UACrD,IAAA,EAAM,QAAA;AAAA,UAAU,KAAA,EAAO,aAAA;AAAA,UAAe,UAAA,EAAY;AAAA,SACpD;AAAA,QACA,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,GAAG,OAAA,EAAS,QAAQ,CAAA,EAAG,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC5D,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAA,CAAG,OAAA,EAAS,eAAe,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,QACvF,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QACxG,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAA,CAAG,aAAA,EAAe,aAAa,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,UAAU,IAAA,EAAK;AAAA,QAClH,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,EAAA,CAAG,eAAA,EAAiB,iBAAc,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,IAAA,EAAK;AAAA,QACvG,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,EAAA,CAAG,YAAA,EAAc,kBAAe,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA;AAAK;AACjG;AACF,GACF;AACF;;;AC70BA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AACpF,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AASO,SAAS,kBAAkB,GAAA,EAA8D;AAC9F,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,EAAA,KAAO,IAAA,IAAQ,GAAA,CAAI,EAAA,KAAO,MAAA,IAAa,GAAA,CAAI,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC7E,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACzB,KAAK,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AAAA,IACvC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,EAAE,IAAA,EAAK,IAAK,CAAA,QAAA,EAAW,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,IACxD,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA;AAAA;AAAA,IAGzB,cAAA,EAAgB,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,iBAAiB,CAAA;AAAA,IACvD,MAAA,EAAQ,OAAO,GAAA,CAAI,QAAA,IAAY,GAAG,CAAA,CAAE,WAAA,EAAY,KAAM,GAAA,GAAM,QAAA,GAAW,UAAA;AAAA,IACvE,UAAU,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlD,WAAW,GAAA,CAAI,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GAAI;AAAA,GAC7D;AACF;ACkDO,SAAS,WAAA,CAAY,KAAa,YAAA,EAA4D;AACnG,EAAA,MAAM,MAAA,GAAS,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,GAAI,GAAA;AACzD,EAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,SAAS,GAAA,GAAM,mBAAA;AACtD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,IAAI,IAAA,CAAK,IAAI,EAAE,WAAA,EAAY;AAAA,IACjC,EAAA,EAAI,IAAI,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AAAA,IAC9B,SAAA,EAAW;AAAA,GACb;AACF;AAGO,SAAS,UAAU,OAAA,EAA4G;AACpI,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AACpC,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA;AACzB,EAAA,IAAI,UAAU,IAAA,KAAS,QAAA,EAAU,OAAO,aAAA,CAAc,UAAU,GAAG,CAAA;AAGnE,EAAA,OAAO,WAAA,CAAY,GAAA,EAAK,OAAA,CAAQ,YAAY,CAAA;AAC9C;AAWA,eAAsB,aAAa,OAAA,EAA2D;AAC5F,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AACpC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAc,GAAA,EAAK,CAAA;AAC5F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,iBAAA,CAAkB,gBAAgB,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,IAAY,eAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,iBAAA;AAKhD,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI,mBAAmB,CAAA;AAEtE,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,KAAA;AAEJ,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,QAAA,CAAS,UAAU,UAAA,EAAY;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAyC;AAAA,QAC5D,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAA,EAAO;AAAA,QAC3D,QAAA,EAAU,QAAQ,QAAA,IAAY,GAAA;AAAA,QAC9B,SAAA,EAAW,OAAO,OAAA,KAAY;AAC5B,UAAA,MAAM,QAAQ,IAAA,EAAK;AACnB,UAAA,KAAA,IAAS,CAAA;AACT,UAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA;AAC5C,UAAA,KAAA,IAAS,CAAA;AACT,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAI7B,UAAA,MAAM,OAAO,IAAA,CAAK,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,SAAS,OAAA,CAAQ,MAAA;AAC3D,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,UAAA;AACjD,UAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,MAAA,GAAS,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,GAAE,EAAE;AAAA,QAC3F;AAAA,OACD,CAAA;AAED,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,KAAA,EAAO;AAC9B,QAAA,IAAI,QAAA,CAAS,UAAU,UAAA,EAAY;AACnC,QAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,UAAU,CAAA;AAC1B,QAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,QAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,OAAA,IAAW,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,SAAS,MAAA,EAAQ;AACf,IAAA,KAAA,GAAQ,MAAA,CAAQ,MAAA,EAAkB,OAAA,IAAW,MAAM,CAAA;AAAA,EACrD;AAKA,EAAA,MAAM,aAAa,eAAA,CAAgB;AAAA,IACjC,YAAA,EAAc,UAAA;AAAA,IACd,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU;AAAC,GAC5B,CAAA;AAED,EAAA,MAAM,QAAA,GAAmB,KAAA,GAAQ,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AACtD,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,GAAQ,OAAA,GAAU,QAAA,CAAS,MAAA,IAAU,aAAa,SAAA,GAAY,SAAA;AAAA,IACtE,YAAA,EAAc,UAAA;AAAA,IACd,SAAS,QAAA,CAAS,MAAA;AAAA,IAClB,OAAA;AAAA,IACA,MAAA,EAAQ,QAAA;AAAA,IACR,gBAAgB,UAAA,CAAW,cAAA;AAAA,IAC3B,QAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAa,MAAA,CAAO,IAAA;AAAA,MACpB,WAAW,MAAA,CAAO,EAAA;AAAA,MAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,iBAAA,EAAmB,WAAW,cAAA,CAAe,MAAA;AAAA,MAC7C,MAAA,EAAQ,gBAAgB,QAAQ;AAAA;AAClC,GACF;AACF;AAQO,SAAS,eACd,OAAA,EAC6B;AAC7B,EAAA,OAAO,YAAA,CAAa;AAAA,IAClB,GAAG,OAAA;AAAA,IACH,UAAA,EAAY,QAAQ,UAAA,IAAc,iBAAA;AAAA,IAClC,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA,IAGV,QAAQ;AAAC,GACV,CAAA;AACH;;;ACpLO,IAAM,wBAAA,GAA2B;AAMjC,SAAS,cAAc,QAAA,EAAwC;AACpE,EAAA,MAAM,OAAA,GAAU,SAAS,SAAA,GAAY,MAAA,CAAO,SAAS,SAAS,CAAA,CAAE,MAAK,GAAI,EAAA;AACzE,EAAA,IAAI,QAAA,CAAS,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,kBAAA,EAAoB,OAAA,IAAW,IAAA,EAAK;AACxG,EAAA,IAAI,OAAA,SAAgB,EAAE,IAAA,EAAM,UAAU,kBAAA,EAAoB,OAAA,EAAS,QAAQ,wBAAA,EAAyB;AACpG,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,8CAAA,EAA+C;AAClF;AAGO,SAAS,iBAAiB,KAAA,EAAmD;AAClF,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,kBAAA;AAAA;AAAA;AAAA,IAGb,aAAa,KAAA,CAAM,kBAAA;AAAA,IACnB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,IAC1B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA,CAAM,oBAAoB,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,UAAA,EAAY,OAAA;AAAiB,GACtG;AACF;AAgDA,eAAsB,aAAA,CAAc,SAAyB,OAAA,EAAwD;AACnH,EAAA,IAAI,EAAA,GAAK,KAAA;AACT,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,QAAQ,SAAS,CAAA;AAAA,EAC3D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AACvB,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AAGA,EAAA,IAAI,CAAC,IAAI,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAY;AAElE,EAAA,MAAM,UAAU,OAAA,CAAQ,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,GAAI,EAAA;AAClF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,uBAAA,EAAwB;AAEnF,EAAA,IAAI,MAAA,GAA4D,IAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,EACxC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,QAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,mBAAA,EAAoB;AAE9E,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,QAAQ,EAAE,GAAG,QAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,EACzD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,UAAU,KAAK,CAAA;AAIvB,IAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,gBAAA,EAAiB;AAAA,EAChE;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAK;AACrC;;;ACxIA,SAASK,UAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,CAAA,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AACpF,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AAUO,SAAS,yBACd,GAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,EAAA,KAAO,IAAA,IAAQ,GAAA,CAAI,EAAA,KAAO,MAAA,IAAa,GAAA,CAAI,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAM7E,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,KAAc,KAAA,IAAS,MAAA,CAAO,IAAI,MAAA,IAAU,QAAQ,CAAA,CAAE,WAAA,EAAY,KAAM,UAAA;AAE7F,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACzB,KAAK,GAAA,CAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA;AAAA,IACjC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,EAAE,IAAA,EAAK,IAAK,CAAA,QAAA,EAAW,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,IACxD,KAAA,EAAOA,SAAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA;AAAA,IAEzB,cAAA,EAAgBA,SAAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,IAClC,MAAA,EAAQ,WAAW,UAAA,GAAa,QAAA;AAAA,IAChC,UAAU,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AAAA;AAAA;AAAA,IAGlD,WAAW,GAAA,CAAI,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,GAAI;AAAA,GACvD;AACF;AAYO,SAAS,eAAe,KAAA,EAA6C;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,CAAM,MAAA,KAAW,IAAA,GAAO,SAAA,GAAY,UAAA;AAAA;AAAA;AAAA,IAG1C,gBAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,eAAA,IAAmB,MAAM,EAAE,CAAA;AAAA;AAAA;AAAA,IAG1D,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAOA,SAAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAAA,IAC3B,QAAA,EAAUA,SAAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAAA,IACjC,OAAO,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI;AAAA,GAC7C;AACF;AAUO,SAAS,oBAAA,CACd,UACA,SAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,SACZ,GAAA,CAAI,CAAC,YAAa,OAAA,CAAQ,SAAA,GAAY,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,GAAI,EAC1E,MAAA,CAAO,CAAC,UAAU,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,OAAO,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA,GAAI,SAAS,CAAA,CAAE,WAAA,EAAY;AAC/D;AC7EO,SAAS,kBAAkB,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,GAAc,aAAY,EAK9E;AACD,EAAA,MAAM,YAAa,IAAA,EAAiC,EAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIzE,SAAqC,MAAS,CAAA;AAC5E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAAE,MAAA,UAAA,CAAW,IAAI,CAAA;AAAG,MAAA;AAAA,IAAO;AAC3C,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,UAAA,CAAW,MAAS,CAAA;AACpB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAS,qBAAA,GACpB,QAAA,CAAS,sBAAsB,SAAS,CAAA,GACxC,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AACjC,IAAA,MAAA,CACG,IAAA,CAAK,CAAC,KAAA,KAAU;AAAE,MAAA,IAAI,KAAA,aAAkB,KAAK,CAAA;AAAA,IAAE,CAAC,CAAA,CAChD,KAAA,CAAM,CAAC,GAAA,KAAiB;AAAE,MAAA,IAAI,KAAA,EAAO;AAAE,QAAA,UAAA,CAAW,IAAI,CAAA;AAAG,QAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAAE;AAAA,IAAE,CAAC,CAAA;AAC3F,IAAA,OAAO,MAAM;AAAE,MAAA,KAAA,GAAQ,KAAA;AAAA,IAAM,CAAA;AAAA,EAE/B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uBACEd,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,aAAU,MAAA,EACnC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACsC,QAAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BtC,GAAAA,CAACsC,QAAAA,EAAA,EAAS,WAAU,qBAAA,EAAsB;AAAA,OAAA,EAC5C,CAAA;AAAA,sBACAtC,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,gBAAA,EACX,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,qBACjBC,IAAAA,CAAC,IAAA,EAAA,EAAW,WAAU,mCAAA,EACpB,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAACsC,QAAAA,EAAA,EAAS,SAAA,EAAU,mCAAA,EAAoC,CAAA;AAAA,wBACxDrC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAACsC,QAAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,0BAC/BtC,GAAAA,CAACsC,QAAAA,EAAA,EAAS,WAAU,UAAA,EAAW;AAAA,SAAA,EACjC;AAAA,OAAA,EAAA,EALO,CAMT,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEtC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sFAAA,EACV,mBAAS,kHAAA,EACZ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,OAAA;AAAA,MACN,WAAA;AAAA,MACA,MAAA,kBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,mCAAA;AAAA,QACZ,GAAA;AAAA,wBAC/BD,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,WAAA,EAAa,SAAA,EAAU,0EAAyE,QAAA,EAAA,aAAA,EAAQ,CAAA;AAAA,QAAI;AAAA,OAAA,EAEvH;AAAA;AAAA,GAEJ;AAEJ;AC7EA,IAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,QAAA,EAAK,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,MAAA,EAAK,GAAA,EAAK,KAAA,EAAO,KAAK,KAAA,EAAM;AAarG,SAAS,uBAAuB,EAAE,IAAA,EAAM,WAAA,EAAa,YAAA,GAAe,2BAA0B,EAIlG;AACD,EAAA,MAAM,YAAa,IAAA,EAAiC,EAAA;AACpD,EAAA,MAAM,YAAY,MAAA,CAAQ,IAAA,EAAwD,SAAA,IAC5E,IAAA,EAAoC,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIc,SAAwC,MAAS,CAAA;AAC/E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAwC,EAAE,CAAA;AACpE,EAAA,MAAM,CAACT,MAAAA,EAAO,QAAQ,CAAA,GAAIS,QAAAA,CAAwC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,QAAA,CAAS,gBAAA,IAAoB,CAAC,SAAS,sBAAA,EAAwB;AAClE,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,CAAC,QAAA,CAAS,gBAAA,EAAiB,EAAG,SAAS,sBAAA,CAAuB,SAAS,CAAC,CAAC,EAClF,IAAA,CAAK,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACxB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAC5E,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,IACnB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AAAE,MAAA,IAAI,KAAA,EAAO;AAAE,QAAA,UAAA,CAAW,EAAE,CAAA;AAAG,QAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAAE;AAAA,IAAE,CAAC,CAAA;AACzF,IAAA,OAAO,MAAM;AAAE,MAAA,KAAA,GAAQ,KAAA;AAAA,IAAM,CAAA;AAAA,EAE/B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,KAAA,GAAQyE,OAAAA;AAAA,IACZ,MAAM,MAAA,CAAO,IAAA,CAAKnF,MAAK,EAAE,IAAA,CAAK,CAAC,EAAA,KAAA,CAAQA,MAAAA,CAAM,EAAE,CAAA,IAAK,IAAA,OAAW,KAAA,CAAM,EAAE,KAAK,IAAA,CAAK,CAAA;AAAA,IACjF,CAACA,QAAO,KAAK;AAAA,GACf;AAEA,EAAA,eAAe,IAAA,GAAO;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,SAAS,qBAAA,EAAuB;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAKA,MAAK,CAAA,EAAG;AACnC,QAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,EAAE,CAAA,IAAK,IAAA;AAC1B,QAAA,IAAI,IAAA,MAAU,KAAA,CAAM,EAAE,CAAA,IAAK,IAAA,CAAA,QAAa,QAAA,CAAS,qBAAA,CAAsB,SAAA,EAAW,EAAA,EAAI,IAAI,CAAA;AAAA,MAC5F;AACA,MAAA,QAAA,CAAS,EAAE,GAAGA,MAAAA,EAAO,CAAA;AACrB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IAC5B,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,aAAU,MAAA,EACnC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACsC,QAAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,MAC9B,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,qBAAMtC,GAAAA,CAACsC,QAAAA,EAAA,EAAiB,SAAA,EAAU,aAAA,EAAA,EAAb,CAA2B,CAAE;AAAA,KAAA,EACjE,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACEtC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFACZ,QAAA,EAAA,KAAA,oBACCC,IAAAA,CAAAiB,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,MAAA,yFAAA;AAAA,MAC4E,GAAA;AAAA,sBAC5ElB,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,YAAA,EAAc,SAAA,EAAU,yDAAwD,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,MAAI;AAAA,KAAA,EAC/G,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,uBAAA,EAAkB,CAAA;AAAA,sBACxDA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAuC,QAAA,EAAA,gMAAA,EAGpD;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,MAAA,MAAM,KAAA,GAAQK,MAAAA,CAAM,MAAA,CAAO,EAAE,CAAA,IAAK,IAAA;AAClC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,QAAA;AAClD,MAAA,uBACEJ,IAAAA,CAAC,IAAA,EAAA,EAAmB,SAAA,EAAU,6CAAA,EAC5B,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,IAAA;AAAA,4BACRD,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAa,iBAAO,QAAA,EAAS,CAAA;AAAA,YAC3C,OAAO,SAAA,oBAAaA,IAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAU,QAAA,EAAA,WAAA,EAAM,CAAA;AAAA,YACnD,CAAC,OAAO,QAAA,oBAAYA,IAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAU,QAAA,EAAA,SAAA,EAAO;AAAA,WAAA,EACvD,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACV,QAAA,EAAA,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,IAAI,IAAI,sCAAA,EAC3D;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAA,IAAS,CAAA;AAAA,YAChB,QAAA,EAAU,CAAC,IAAA,KAAS;AAAE,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,cAAA,QAAA,CAAS,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,CAAC,MAAA,CAAO,EAAE,GAAG,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,MAAK,CAAE,CAAA;AAAA,YAAE,CAAA;AAAA,YACvG,MAAA;AAAA,YACA,cAAc,MAAA,CAAO,QAAA;AAAA,YACrB,MAAA,EAAQ,OAAO,MAAA,IAAU,OAAA;AAAA,YACzB,aAAa,MAAA,CAAO,SAAA,IAAa,SAAA,GAAY,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA;AAAA,SACnE,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAA,EACV,QAAA,EAAA,KAAA,IAAS,IAAA,mBACRA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,oCAAA,EAA4B,CAAA,GAClE,MAAA,CAAO,SAAA,mBACTA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,qCAAA,EAAgC,CAAA,mBAExEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,0EAA8C,CAAA,EAEnF;AAAA,OAAA,EAAA,EA9BO,OAAO,EA+BhB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAEC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAEzDC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAS,MAAM;AAAE,QAAA,KAAK,IAAA,EAAK;AAAA,MAAE,GAAG,QAAA,EAAU,CAAC,SAAS,MAAA,EACzD,QAAA,EAAA,MAAA,GAAS,mBAAc,kBAAA,EAC1B,CAAA;AAAA,MACC,IAAA,IAAQ,CAAC,KAAA,oBAASH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA2B,QAAA,EAAA,mBAAA,EAAc,CAAA;AAAA,sBAC5EA,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,YAAA,EAAc,SAAA,EAAU,sEAAqE,QAAA,EAAA,oBAAA,EAAkB;AAAA,KAAA,EAC1H;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC7GA,IAAM,QAAA,GAAWD,gBAAAA,CAAM,IAAA,CAAK,MAAM,OAAO,wBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA;AA+DnG,IAAM,eAAA,GAAkBA,gBAAAA,CAAM,IAAA,CAAK,MACjC,OAAO,wBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,mBAAA,GAAsB,CAAC,CAAA;AAE9E,SAAS,gBAAgB,QAAA,EAAiC;AACxD,EAAA,MAAM,MAAA,GAAkG,CAAC,KAAA,KACvGA,gBAAAA,CAAM,aAAA;AAAA,IAAcA,gBAAAA,CAAM,QAAA;AAAA,IAAU,EAAE,UAAU,IAAA,EAAK;AAAA,IACnDA,iBAAM,aAAA,CAAc,eAAA,EAAiB,EAAE,GAAG,KAAA,EAAO,UAAU;AAAA,GAAC;AAChE,EAAA,MAAA,CAAO,WAAA,GAAc,iBAAA;AACrB,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAiB,OAAA,EAA6C;AAC5E,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAQ,IAAA,EAAM,GAAG,OAAA,EAAS,QAAA,EAAS;AAIhF,EAAA,qBAAA,CAAsB,MAAM,oBAAA,CAAqB,QAAA,EAAS,CAAE,YAAY,EAAE,CAAA;AAK1E,EAAA,uBAAA,CAAwB,0BAA0B,CAAA;AAIlD,EAAA,6BAAA,CAA8B,8BAAA,CAA+B,MAC1D,OAAO,OAAA,EAAS,QAAA,KAAa,UAAA,GAC1B,OAAA,CAAQ,QAAA,EAAS,GACjB,OAAA,EAAS,QAAA,IAAYgC,eAAAA,EAAkB,CAAC,CAAA;AAO9C,EAAA,kBAAA,CAAmB,iBAAiB,YAAY,CAAA;AAKhD,EAAA,oBAAA,CAAqB,eAAA,EAAiB,kBAAA,CAAmB,MAAM,eAAA,EAAiB,CAAC,CAAA;AAMjF,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAAwD;AACvE,IAAA,MAAM,OAAA,GAAwC,MAC5ChC,gBAAAA,CAAM,aAAA;AAAA,MAAcA,gBAAAA,CAAM,QAAA;AAAA,MAAU,EAAE,UAAU,IAAA,EAAK;AAAA,MACnDA,gBAAAA,CAAM,aAAA;AAAA,QACJ,QAAA;AAAA,QACA,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,OAAA;AAAQ;AACzC,KACF;AACF,IAAA,OAAA,CAAQ,WAAA,GAAwB,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,CAAK;AACxD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAOA,EAAA,MAAM,eAAA,GAAkB,MACtB,OAAO,OAAA,EAAS,QAAA,KAAa,UAAA,GACzB,OAAA,CAAQ,QAAA,EAAS,GACjB,OAAA,EAAS,QAAA,IAAYgC,eAAAA,EAAgB;AAE3C,EAAA,MAAM,QAAQ,CAAC,GAAA,EAA4D,aACzE,OAAA,EAAS,aAAA,GAAgB,GAAG,CAAA,IAAK,QAAA;AAKnC,EAAA,MAAM,cAAA,GAAiB,SAAS,kBAAA,IAAsB,UAAA;AAMtD,EAAA,MAAM,WAAA,GAAc,CAClB,IAAA,EACA,MAAA,KACiC;AACjC,IAAA,MAAM,GAAA,GAAoC,MAAM,MAAA,EAAO;AACvD,IAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAYA,EAAA,MAAM,mBAAmB,cAAA,CAAe,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,eAAe,CAAA,EAAG;AAAA,IAC1F,YAAA,EAAc,8BAA8B,eAAe,CAAA;AAAA,IAC3D,OAAA,EAAS,MAAA;AAAA;AAAA;AAAA;AAAA,IAIT,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,0BAAA;AAAA,MACN,WAAA,EAAa,mCAAA;AAAA,MACb,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,sBAAA;AAAA,QACT,KAAA,EAAO,4CAAA;AAAA,QACP,WAAA,EACE,8LAAA;AAAA,QACF,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,mCAAA,EAAoC;AAAA,UAC7C,EAAE,OAAO,sDAAA,EAAuD;AAAA,UAChE,EAAE,OAAO,6CAAA;AAA8C;AACzD;AACF,KACF;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,YAAY,KAAA,EAAO,KAAA,EAAO,MAAM0C,OAAAA,EAAQ;AAAA,MAC9D,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,QAAQ,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MAC3G,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,OAAO,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA,EAAS;AAAA,MACjH,EAAE,EAAA,EAAI,cAAA,EAAgB,OAAO,aAAA,EAAe,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,kBAAkB,CAAA,KAAM,CAAC,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA;AAAS;AACpI,GACD,CAAA;AAKD,EAAA,MAAM,eAAe,MAAoB;AAAA,IACvC;AAAA,MAAE,EAAA,EAAI,WAAA;AAAA,MAAa,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAAG,IAAA,EAAM,KAAA;AAAA,MAC9D,QAAA,EAAU,MAAMzC,eAAAA,CAAgB,YAAY;AAAA,KAAE;AAAA,IAChD;AAAA,MAAE,EAAA,EAAI,QAAA;AAAA,MAAU,KAAA,EAAO,KAAA,CAAM,gBAAA,EAAkB,QAAQ,CAAA;AAAA,MAAG,IAAA,EAAM,UAAA;AAAA,MAC9D,QAAA,EAAU,MAAMA,eAAAA,CAAgB,mBAAmB;AAAA,KAAE;AAAA,IACvD;AAAA,MAAE,EAAA,EAAI,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAAA,MAAG,IAAA,EAAM,MAAA;AAAA,MACrE,QAAA,EAAU,MAAMA,eAAAA,CAAgB,qBAAqB;AAAA;AAAE,GAC3D;AAMA,EAAA,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAE9C,EAAA,MAAM,sBAAA,GAAyB,cAAA,CAAe,4BAAA,EAA6B,EAAG;AAAA,IAC5E,YAAA,EAAc,oCAAoC,eAAe,CAAA;AAAA,IACjE,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,QAAA;AAAA,IACd,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,MAC/D;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,oBAAA;AAAA,QAAsB,IAAA,EAAM,KAAA;AAAA;AAAA;AAAA,QAGlD,KAAA,EAAO,IAAI,GAAA,CAAA,CAAK,KAAA,IAAS,EAAC,EAAG,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,EAAE,CAAC,CAAA,CAAE;AAAA,OACpE;AAAA,MACA;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QAAS,KAAA,EAAO,eAAA;AAAA,QAAiB,IAAA,EAAM,KAAA;AAAA,QAC3C,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,WAAA,EAAa,MAAA,IAAU,CAAA,MAAO,CAAC,CAAA,CAAE,MAAA,IAAU;AAAA,OAC5E;AAAA,MACA,EAAE,IAAI,UAAA,EAAY,KAAA,EAAO,aAAa,OAAA,EAAS,SAAA,EAAW,MAAM,MAAA;AAAO;AACzE,GACD,CAAA;AAED,EAAA,MAAM,wBAAA,GAA2B,cAAA,CAAe,8BAAA,CAA+B,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,IACzF,YAAA,EAAc,sCAAsC,eAAe,CAAA;AAAA,IACnE,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,UAAA;AAAA,IACd,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,aAAa,KAAA,EAAO,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,MAC9D;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,gBAAA;AAAA,QAAkB,IAAA,EAAM,KAAA;AAAA,QAC9C,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAC,CAAC,CAAA,GAAI;AAAA,OAC5E;AAAA,MACA;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QAAS,KAAA,EAAO,gBAAA;AAAA,QAAe,IAAA,EAAM,KAAA;AAAA,QACzC,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,EAAE,UAAA,IAAc,CAAA,MAAO,CAAC,CAAA,CAAE,MAAA,IAAU;AAAA,OACnE;AAAA,MACA,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,OAAA,EAAS,SAAA,EAAW,MAAM,UAAA;AAAW;AACxE,GACD,CAAA;AAOD,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,uBAAA,EAAwB,EAAG;AAAA,IAClE,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS,MAAA;AAAA;AAAA;AAAA;AAAA,IAIT,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,wBAAA;AAAA,MACN,WAAA,EAAa,8CAAA;AAAA;AAAA;AAAA;AAAA,MAIb,YAAA,EAAc,4BAAA;AAAA,MACd,YAAA,EAAc,CAAC,MAAM,CAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,0BAAA;AAAA,QACT,KAAA,EAAO,+CAAA;AAAA,QACP,WAAA,EACE,2OAAA;AAAA,QAEF,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,wCAAA,EAAmC;AAAA,UAC5C,EAAE,OAAO,6CAAA,EAA8C;AAAA,UACvD,EAAE,OAAO,+CAAA;AAAgD;AAC3D;AACF,KACF;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,mBAAmB,KAAA,EAAO,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,MACjE,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,cAAA,EAAgB,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,QAAQ,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MACjH,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAO,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,IAAO,EAAE,SAAA,IAAa,CAAA,CAAA,EAAI,CAAC,CAAA,IAAK,CAAA,EAAG,MAAM,WAAA,EAAY;AAAA,MACnH,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,OAAO,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA;AAAS;AACnH,GACD,CAAA;AAQD,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,uBAAA,EAAwB,EAAG;AAAA,IACnE,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,yBAAA,EAA0B,EAAG;AAAA,IACtE,YAAA,EAAc,iCAAiC,eAAe,CAAA;AAAA,IAC9D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AAAA,MACvB,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,kBAAY,KAAA,EAAO,KAAA,EAAO,MAAMyD,MAAAA,EAAO;AAAA,MAC7D,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,MACxG,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAS,EAAE,MAAA,IAAU,CAAA,EAAG,MAAM,QAAA,EAAS;AAAA,MACzG;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,KAAA,EAAO,oBAAA;AAAA,QAAsB,IAAA,EAAMhB,OAAAA;AAAA,QAClD,KAAA,EAAO,KAAA,EAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,UAAA,EAAY,MAAA,IAAU,CAAA,CAAA,EAAI,CAAC,CAAA,IAAK;AAAA;AAC5E;AACF,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,IAC3E,YAAA,EAAc,+BAA+B,eAAe,CAAA;AAAA,IAC5D,OAAA,EAAS,MAAA;AAAA,IACT,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,MAAA,MAAMrC,SAAQ,CAAC,CAAA,KAAcF,cAAAA,CAAe,CAAA,EAAG,KAAK,IAAI,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA,IAAK,EAAC;AAC/D,MAAA,OAAO;AAAA,QACL,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,uBAAoB,KAAA,EAAO,KAAA,EAAO,MAAM,UAAA,EAAW;AAAA,QACzE,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA;AAAA;AAAA,QAGjE;AAAA,UACE,EAAA,EAAI,aAAA;AAAA,UAAe,KAAA,EAAO,iBAAA;AAAA,UAAmB,IAAA,EAAM,gBAAA;AAAA,UACnD,KAAA,EAAOE,MAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,OAAA,IAAW,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,SACnE;AAAA,QACA;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UAAU,KAAA,EAAO,eAAA;AAAA,UAAiB,IAAA,EAAM,WAAA;AAAA,UAC5C,KAAA,EAAOA,MAAAA,CAAM,KAAA,EAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,cAAA,IAAkB,CAAA,CAAA,EAAI,CAAC,KAAK,CAAC;AAAA;AAC/E,OACF;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,MAAM,kBAAA,GAAmD,MACvDrC,gBAAAA,CAAM,aAAA,CAAc,aAAa,EAAE,eAAA,EAAiB,OAAA,EAAS,QAAA,EAAU,CAAA;AACzE,EAAA,kBAAA,CAAmB,WAAA,GAAc,aAAA;AAuBjC,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,MAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,OAAA;AAWxC,EAAA,MAAM,GAAA,GAAkB;AAAA;AAAA,IAEtB;AAAA,MAAE,KAAA,EAAO,SAAA;AAAA,MAAW,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,SAAS,CAAA;AAAA,MAAG,IAAA,EAAM,aAAA;AAAA,MAC3D,QAAA,EAAU,WAAA;AAAA,MAAa,SAAA,EAAW,QAAQ,QAAQ;AAAA,KAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtD;AAAA,MAAE,KAAA,EAAO,WAAA;AAAA,MAAa,KAAA,EAAO,KAAA,CAAM,UAAA,EAAY,UAAU,CAAA;AAAA,MAAG,IAAA,EAAM,SAAA;AAAA,MAChE,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,SAAA,EAAW;AAAA,KAAiD;AAAA,IACzF;AAAA,MAAE,KAAA,EAAO,uBAAA;AAAA,MAAyB,KAAA,EAAO,KAAA,CAAM,aAAA,EAAe,gBAAU,CAAA;AAAA,MAAG,IAAA,EAAM,QAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA,KAAoD;AAAA,IAC9F;AAAA,MAAE,KAAA,EAAO,sBAAA;AAAA,MAAwB,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,YAAY,CAAA;AAAA,MAAG,IAAA,EAAM,YAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA,KAAmD;AAAA;AAAA,IAI7F;AAAA,MAAE,KAAA,EAAO,UAAA;AAAA,MAAY,KAAA,EAAO,KAAA,CAAM,SAAA,EAAW,aAAU,CAAA;AAAA,MAAG,IAAA,EAAM,OAAA;AAAA,MAC9D,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,UAAA,EAAY,KAAA;AAAA,MAAO,SAAA,EAAW;AAAA,KAAmB;AAAA;AAAA,IAG9E;AAAA,MAAE,KAAA,EAAO,YAAA;AAAA,MAAc,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,WAAW,CAAA;AAAA,MAAG,IAAA,EAAM,KAAA;AAAA,MACnE,UAAU,WAAA,GAAc,CAAA;AAAA,MAAG,SAAA,EAAW;AAAA,KAAkD;AAAA,IAC1F;AAAA,MAAE,KAAA,EAAO,uBAAA;AAAA,MAAyB,KAAA,EAAO,KAAA,CAAM,WAAA,EAAa,YAAY,CAAA;AAAA,MAAG,IAAA,EAAM,YAAA;AAAA,MAC/E,UAAU,WAAA,GAAc,GAAA;AAAA,MAAK,SAAA,EAAW;AAAA;AAAkD,GAE9F;AAQA,EAAA,MAAM,aAAA,GAKD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUH;AAAA,MAAE,IAAA,EAAM,mBAAA;AAAA,MAAqB,SAAA,EAAW,sBAAA;AAAA,MACtC,KAAA,EAAO,KAAA,CAAM,gBAAA,EAAkB,QAAQ,CAAA;AAAA,MAAG,WAAA,EAAa;AAAA,KAAa;AAAA,IACtE;AAAA,MAAE,IAAA,EAAM,qBAAA;AAAA,MAAuB,SAAA,EAAW,wBAAA;AAAA,MACxC,KAAA,EAAO,KAAA,CAAM,kBAAA,EAAoB,WAAW,CAAA;AAAA,MAAG,WAAA,EAAa;AAAA;AAAa,GAC7E;AAOA,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAiD;AACnE,IAAA,MAAM,WAAyC,MAAM;AACnD,MAAAA,gBAAAA,CAAM,UAAU,MAAM;AAAE,QAAAiC,gBAAgB,MAAM,CAAA;AAAA,MAAE,CAAA,EAAG,EAAE,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,QAAA,CAAS,WAAA,GAAc,YAAY,MAAM,CAAA,CAAA,CAAA;AACzC,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAA,GAAkF;AAAA,IACtF,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,UAAA,CAAW,WAAW,CAAA,EAAE;AAAA,IACpD,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,WAAW,CAAA,EAAE;AAAA,IAC7D,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA,EAAE;AAAA,IACzD,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAA,EAAW,UAAA,CAAW,YAAY,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO/D,EAAE,MAAM,gBAAA,EAAkB,SAAA,EAAW,WAAW,oBAAA,CAAqB,uBAAuB,CAAC,CAAA,EAAE;AAAA,IAC/F,EAAE,MAAM,iBAAA,EAAmB,SAAA,EAAW,WAAW,oBAAA,CAAqB,uBAAuB,CAAC,CAAA,EAAE;AAAA,IAChG,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA,EAAE;AAAA,IACnD,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,SAAS,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,IAI3D,EAAE,IAAA,EAAM,mBAAA,EAAqB,SAAA,EAAW,UAAA,CAAW,YAAY,CAAA,EAAE;AAAA;AAAA;AAAA,IAGjE,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,UAAA,CAAW,cAAc,CAAA,EAAE;AAAA,IACzD,EAAE,IAAA,EAAM,gBAAA,EAAkB,SAAA,EAAW,UAAA,CAAW,cAAc,CAAA;AAAE,GAClE;AAMA,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,OAAA,EAAS,QAAA,KAAa,KAAA;AACpD,EAAA,MAAM,iBAAiB,CAAC,KAAA,KAAkB,UAAU,WAAA,IAAe,KAAA,CAAM,WAAW,YAAY,CAAA;AAChG,EAAA,MAAM,UAAA,GAAa,OAAA,EAAS,OAAA,EAAS,MAAA,KAAW,KAAA;AAChD,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,CAAC,WAC5B,YAAA,IAAgB,CAAC,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA,MAAO,UAAA,IAAc,KAAA,CAAM,UAAU,SAAA,CAAU,CAAA;AAG7F,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,EAAE,IAAA,EAAM,aAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,QAAQ,CAAA,EAAE;AAAA,IACpD,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAA,EAAW,OAAA,CAAQ,QAAQ,CAAA;AAAE,GAC3D;AAGA,EAAA,iBAAA,CAAkB,eAAA,EAAiB,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,eAClB,aAAA,GAGA,aAAA,CAAc,IAAI,CAAC,CAAA,KACjB,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,SAAS,gBAAA,GAC7B,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,WAAW,UAAA,CAAW,SAAS,CAAA,EAAE,GACjD,CAAC,CAAA;AAEX,EAAA,MAAM,IAAA,GAA4C,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAEpF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,gBAAA,EAAkB,YAAA;AAAA;AAAA;AAAA;AAAA,IAIlB,YAAY,EAAE,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA,EAAE;AAAA,IACpE,IAAA,EAAM,SAAS,QAAA,IAAY,MAAA;AAAA,IAC3B,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,SAAS,KAAA,IAAS,UAAA;AAAA,IACzB,YAAY,OAAA,EAAS,UAAA;AAAA;AAAA;AAAA,IAGrB,SAAA,EAAW,CAAC,WAAW,CAAA;AAAA,IACvB,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IACf,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrC,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,GAAI,MAAM,UAAA,KAAe,KAAA,GAAQ,EAAE,UAAA,EAAY,KAAA,KAAmB;AAAC,KACrE,CAAE,CAAA;AAAA,IACF,MAAA,EAAQ;AAAA,MACN,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,WAAW,EAAE,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,UAAA,EAAY,MAAK,CAAE,CAAA;AAAA,MAClG,GAAG,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,CAAE,CAAA;AAAA,MAC5D,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,CAAE,CAAA;AAAA,MACxD,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAK,CAAE;AAAA,KAC1D;AAAA,IACA,SAAS,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOV,gBAAgB,OAAA,EAAS,cAAA,KAAmB,KAAA,GAAQ,KAAK,uBAAA,EAAwB;AAAA;AAAA;AAAA;AAAA,IAIjF,QAAQ,qBAAA,EAAsB;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP;AAAA,QACE,EAAA,EAAI,oBAAA;AAAA,QACJ,IAAA,EAAM,cAAA;AAAA,QACN,WAAA,EAAa,qCAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,aAAa,gBAAA,EAAiB;AAAA,YACjE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAE;AAC3E,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,8BAAA,EAA+B;AAAA,UACxC,EAAE,OAAO,kCAAA;AAAmC;AAC9C,OACF;AAAA,MACA;AAAA,QACE,EAAA,EAAI,kBAAA;AAAA,QACJ,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,2BAAA;AAAA,QACb,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAmB,IAAA,EAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,YAC5F,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAmB,MAAM,CAAC,aAAA,EAAe,qBAAA,EAAuB,WAAW,CAAA;AAAE;AAC1G,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,wBAAA,EAAyB;AAAA,UAClC,EAAE,OAAO,kCAAA;AAAmC;AAC9C;AACF,KACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AAAA,QAC5B,IAAA,EAAM,aAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,sBAAA,EAAwB,MAC7CjC,iBAAM,aAAA,CAAc,oBAAA,EAAsB,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QAC5F,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA;AAAA,QAEE,EAAA,EAAI,cAAA;AAAA,QACJ,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,YAAY,iBAAA,EAAmB,MAAMA,iBAAM,aAAA,CAAc,eAAA,EAAiB,EAAE,CAAC,CAAA;AAAA,QACxF,KAAA,EAAO,IAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,YAAA;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,gBAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,gBAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,KAAA,EAAO,KAAA,CAAM,UAAA,EAAY,SAAS,CAAA;AAAA,QAClC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,kBAAA,EAAoB,MACzCA,gBAAAA,CAAM,aAAA,CAAc,gBAAA,EAAkB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QACxE,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,QACE,EAAA,EAAI,kBAAA;AAAA,QACJ,KAAA,EAAO,aAAA;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,WAAA,CAAY,qBAAA,EAAuB,MAC5CA,gBAAAA,CAAM,aAAA,CAAc,mBAAA,EAAqB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,CAAC,CAAA;AAAA,QAC3E,KAAA,EAAO,EAAA;AAAA,QACP,UAAA,EAAY;AAAA;AACd,KACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBA,UAAA,EAAY;AAAA,MACV,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA,sBAAA;AAAA,MACA,yBAAA;AAAA,MACA,iBAAA;AAAA,MACA,uBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,YAAA,EAAc,CAAC,SAAA,EAAW,QAAQ;AAAA,GACpC;AACF;AA+EO,SAAS,sBAAsB,OAAA,EAKxB;AACZ,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,KAAA,EAAO,QAAQ,KAAA,IAAS,aAAA;AAAA,IACxB,IAAA,EAAM,OAAA;AAAA,IACN,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA,EAAO,EAAE,WAAA,EAAa,OAAA,CAAQ,UAAU,WAAA,EAAa,OAAA,CAAQ,eAAe,WAAA;AAAY,GAC1F;AACF;AASO,SAAS,2BAA2B,OAAA,EAK7B;AACZ,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,eAAA;AAAA,IACJ,KAAA,EAAO,QAAQ,KAAA,IAAS,uBAAA;AAAA,IACxB,IAAA,EAAM,OAAA;AAAA,IACN,SAAA,EAAW,sBAAA;AAAA,IACX,KAAA,EAAO,EAAE,WAAA,EAAa,OAAA,CAAQ,UAAU,YAAA,EAAc,OAAA,CAAQ,gBAAgB,yBAAA;AAA0B,GAC1G;AACF","file":"index.js","sourcesContent":["import { countByTenant, type OnboardingProgramDef } from '@fayz-ai/core'\n\n/**\n * Implantação da loja — o que \"no ar\" quer dizer para uma loja.\n *\n * O checklist genérico da plataforma (marca, equipe, recebimento, site) vale\n * para qualquer negócio e não sabe o que é um pedido. Esta lista sabe: uma loja\n * não está viva porque tem logo, está viva quando alguém consegue comprar e o\n * dinheiro cai. É por isso que a ordem é catálogo → pagamento → vitrine →\n * primeiro pedido, e não a ordem em que as telas aparecem no menu.\n *\n * Cada passo carrega três coisas além do título: a ROTA (para o agente levar a\n * pessoa até lá em vez de descrever onde clicar), o SENSOR (para o passo se\n * fechar sozinho quando a coisa já é verdade no dado) e o TOUR (para o agente\n * apontar o controle na tela). O `agentHint` é a intenção — não é fala pronta.\n */\nexport function buildShopOnboarding(\n siteRoute = '/site',\n // O passo do catálogo só é desta lista quando o catálogo é desta loja. Com o\n // módulo de produtos desligado (o host registra produto noutro lugar), a rota\n // `/products` não existe — o passo levaria a pessoa a lugar nenhum e ainda\n // ficaria com `replaces: 'catalog'`, calando o passo genérico da plataforma\n // que voltou a ser o certo.\n withProducts = true,\n): OnboardingProgramDef {\n return {\n id: 'shop',\n title: 'Sua loja no ar',\n order: 10,\n role: 'operations',\n instructions: `Você está implantando uma LOJA. A pessoa não quer aprender um sistema: ela quer vender.\n\n- A ordem importa e é esta: ter o que vender → onde vender → como receber → como entregar → um motivo para comprar → a primeira venda. Não pule para \"divulgue\" antes de a loja aceitar um pedido.\n- Importar catálogo é o passo que trava mais gente. Ofereça planilha, integração (Bling, Nuvemshop) ou cadastrar um produto à mão para destravar — um produto já é o suficiente para seguir.\n- Em pagamento, pergunte COMO ela recebe hoje (Pix, cartão, maquininha) antes de falar de gateway. O nome do provedor é detalhe nosso, não dela.\n- Antes de dizer que a loja está pronta, confira: tem produto ativo, tem forma de pagamento, e a vitrine está publicada. Se faltar uma, diga qual falta.\n- Quando estiver pronta para receber pedidos, chame o colega de growth para a primeira campanha — não invente plano de mídia por conta própria.`,\n steps: ([\n {\n key: 'catalog',\n title: 'Cadastre seu primeiro produto',\n description: 'Seu catálogo é o que a loja vende. Um produto já destrava o resto.',\n icon: 'Package',\n route: '/products',\n priority: 'high',\n // O passo genérico da plataforma (\"cadastre seu primeiro produto\") e\n // este são o mesmo recado — a loja é dona dele.\n replaces: 'catalog',\n agentHint:\n 'Pergunte onde o catálogo está hoje (planilha, ERP, Instagram). Ofereça importar; se travar, um produto à mão já destrava.',\n howTo:\n 'Produtos › Adicionar. Nome, preço e uma foto já bastam para o produto aparecer na loja — estoque e variações dá para completar depois. Se você já tem uma planilha, use Adicionar › Importar: colunas de nome, preço e estoque viram o catálogo inteiro de uma vez.',\n celebrate: 'Produto no ar 🎉',\n // A coreografia, como dado: nenhuma dessas quatro falas varia, e cada\n // uma delas custava um turno de modelo para ser escrita de novo.\n script: [\n { kind: 'say', text: 'Vamos começar pelo que a loja vende. Te levo até os Produtos.' },\n { kind: 'goto', route: '/products' },\n {\n kind: 'say',\n text: 'Esta é a sua lista de produtos — hoje vazia. Tudo que entrar aqui aparece na vitrine.',\n },\n {\n // Três caminhos, e \"cadastre um produto\" assumia que só existia um.\n // A pergunta é o passo: quem tem planilha não quer digitar, e quem\n // não tem nada quer que alguém comece por ele.\n kind: 'choose',\n id: 'shop.catalog.how',\n question: 'Como você prefere trazer seus produtos?',\n options: [\n { id: 'import', label: 'Tenho uma planilha', meta: 'Importo e mapeio as colunas com você' },\n { id: 'manual', label: 'Vou cadastrar à mão', meta: 'Te mostro onde, começando por um' },\n {\n id: 'suggest',\n label: 'Me sugira o catálogo',\n meta: 'Monto uma lista a partir do que já sei do seu negócio',\n },\n ],\n },\n ],\n check: async () => (await countByTenant('plg_shop_products')) > 0,\n tour: {\n id: 'shop.catalog',\n stops: [\n {\n anchor: 'action.new',\n title: 'É aqui que nasce um produto',\n body: 'Nome, preço e uma foto já bastam. Pode cadastrar agora — eu vejo quando ele entrar.',\n route: '/products',\n waitForUser: true,\n },\n {\n anchor: 'action.import',\n title: 'Ou traga tudo de uma vez',\n body: 'Uma planilha com nome, preço e estoque vira o catálogo inteiro.',\n },\n ],\n },\n },\n {\n key: 'storefront',\n title: 'Configure sua loja online',\n description: 'O endereço que você manda para o cliente — e como a vitrine está hoje.',\n icon: 'Store',\n route: siteRoute,\n priority: 'high',\n // A plataforma chama de \"publique seu site\"; numa loja é a vitrine, e\n // quem sabe configurá-la é este módulo.\n replaces: 'publish',\n agentHint:\n 'Confira como a vitrine está e o endereço dela. Publicar sem frete configurado gera pedido que ninguém consegue entregar.',\n howTo:\n 'O construtor do site (o \"Editar\" no item \"Sua loja\", na barra lateral). Veja como a vitrine está, ajuste o que precisar conversando com o assistente e publique. Esse link é o que vai para a bio do Instagram e para o WhatsApp.',\n celebrate: 'Vitrine pronta ✨',\n script: [\n { kind: 'say', text: 'Agora a vitrine — o endereço que você manda para o cliente.' },\n { kind: 'goto', route: siteRoute },\n {\n kind: 'ask',\n text: 'Estou vendo o site da loja. Confira comigo como ele está e me diga o que falta para publicar.',\n },\n ],\n },\n {\n key: 'payments',\n title: 'Decida como vai receber',\n description: 'Pix, cartão ou boleto — o dinheiro precisa de um caminho.',\n icon: 'CreditCard',\n route: '/settings/shop-payments',\n priority: 'high',\n replaces: 'payments',\n agentHint:\n 'Comece por como ela já recebe hoje. Pix costuma ser o caminho mais curto para a primeira venda; cartão vem depois.',\n howTo:\n 'Configurações › Pagamentos. Ligue as formas que você aceita e conecte o provedor de cada uma. Para Pix você precisa da chave ou das credenciais do provedor; sem isso o pedido entra, mas o pagamento não é confirmado sozinho.',\n celebrate: 'Recebimento no lugar 💳',\n script: [\n { kind: 'goto', route: '/settings/shop-payments' },\n {\n kind: 'ask',\n text: 'Estamos em Pagamentos. Pergunte como a pessoa recebe hoje (Pix, cartão, maquininha) antes de falar de provedor, e ligue a forma que ela usar.',\n },\n ],\n },\n {\n key: 'shipping',\n title: 'Configure a entrega',\n description: 'Zonas, prazos e quanto custa o frete.',\n icon: 'Truck',\n route: '/settings/shop-shipping',\n agentHint:\n 'Pergunte até onde entregam e como (carro próprio, transportadora, retirada). Frete errado é o motivo nº 1 de carrinho abandonado.',\n howTo:\n 'Configurações › Entrega. Crie uma zona (por CEP ou por cidade), diga o prazo e o preço — pode ser valor fixo para começar. Retirada no local é uma zona com frete zero.',\n celebrate: 'Entrega configurada 🚚',\n script: [\n { kind: 'goto', route: '/settings/shop-shipping' },\n {\n kind: 'ask',\n text: 'Estamos em Entrega. Pergunte até onde a pessoa entrega e como, e monte a primeira zona junto com ela.',\n },\n ],\n },\n {\n key: 'discount',\n title: 'Crie um cupom de desconto',\n description: 'Dê um motivo para o cliente fechar a primeira compra.',\n icon: 'Tag',\n route: '/discounts',\n priority: 'low',\n agentHint:\n 'Este é passo de growth: sugira um cupom de primeira compra e ajude a decidir o valor. Se houver colega de growth, passe a bola.',\n howTo:\n 'Descontos › Adicionar. Escolha o código (algo curto, tipo BEMVINDO10), o tipo (percentual ou valor) e até quando vale. O cliente digita esse código no checkout.',\n },\n {\n key: 'first-order',\n title: 'Receba seu primeiro pedido',\n description: 'Faça um pedido de teste e veja ele cair aqui dentro.',\n icon: 'ShoppingBag',\n route: '/orders',\n agentHint:\n 'Um pedido de teste é o que transforma \"acho que está no ar\" em \"está no ar\". Acompanhe até ele aparecer na lista.',\n howTo:\n 'Abra sua vitrine como se fosse um cliente, escolha um produto e finalize a compra. O pedido aparece em Pedidos em segundos — e é assim que você confere que preço, frete e pagamento estão certos antes do primeiro cliente de verdade.',\n celebrate: 'Primeiro pedido na casa 🛍️',\n script: [\n {\n kind: 'say',\n text: 'Último: um pedido de teste. Abra sua vitrine como se fosse um cliente e finalize uma compra — eu aviso aqui quando ele cair.',\n },\n { kind: 'goto', route: '/orders' },\n {\n kind: 'point',\n anchor: 'nav./orders',\n title: 'Todo pedido cai aqui',\n body: 'Pago, em separação, enviado — o estado de cada venda vive nesta lista.',\n waitForUser: true,\n },\n ],\n check: async () => (await countByTenant('v_shop_orders')) > 0,\n tour: {\n id: 'shop.orders',\n stops: [\n {\n anchor: 'nav./orders',\n title: 'Todo pedido cai aqui',\n body: 'Pago, em separação, enviado — o estado de cada venda vive nesta lista.',\n route: '/orders',\n },\n ],\n },\n },\n ] as OnboardingProgramDef['steps']).filter((s) => withProducts || s.key !== 'catalog'),\n }\n}\n","import type { ShippingLabelProvider, ShopProvider } from '@fayz-ai/shop'\n\n// The Melhor Envio implementation of the label port. It knows its own connector\n// slug and nothing else the panel needs: every screen goes through\n// resolveShippingLabelProvider, so a second carrier is a second file like this\n// one and no change anywhere else.\n\nexport const MELHOR_ENVIO_CARRIER = 'melhor-envio'\n\nexport function createMelhorEnvioLabelProvider(\n resolve: () => ShopProvider,\n): ShippingLabelProvider {\n const unsupported = () => {\n throw new Error('Este painel não sabe comprar etiquetas nesta loja.')\n }\n\n return {\n id: MELHOR_ENVIO_CARRIER,\n label: 'Melhor Envio',\n quote: async (orderId) =>\n (await resolve().quoteShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n buy: async (orderId, serviceId) =>\n (await resolve().buyShippingLabel?.(orderId, serviceId, MELHOR_ENVIO_CARRIER)) ?? unsupported(),\n print: async (orderId) =>\n (await resolve().printShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n track: async (orderId) =>\n (await resolve().trackShippingLabel?.(orderId, MELHOR_ENVIO_CARRIER)) ?? null,\n }\n}\n","import { AskAIButton, DetailTabHeader } from '@fayz-ai/admin'\nimport { Button, Skeleton } from '@fayz-ai/ui'\nimport { Plus, UploadCloud } from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport type { Product, ProductImage, ShopProvider } from '@fayz-ai/shop'\n\n/**\n * The product's whole gallery, not just its cover.\n *\n * plg_shop_product_images has always been a collection — sort_order, is_primary\n * — but the admin only ever exposed the single `EntityImageConfig` slot on the\n * form, so a merchant could set one photo and no more, and the storefront had\n * nothing to build a carousel from. This is the missing half.\n *\n * Deliberately not drag-and-drop: ordering is done with arrows because a\n * keyboard and a screen reader can use them, and because reordering four\n * photos of a rib is not worth a drag library.\n */\nexport function ProductImagesTab({ item, getProvider, footer }: {\n item: unknown\n getProvider: () => ShopProvider\n /** Under the gallery: where else this content lives. */\n footer?: React.ReactNode\n}) {\n const product = item as Product\n // `null` until the first read: an empty gallery and a gallery still loading are not the same screen.\n const [images, setImages] = useState<ProductImage[] | null>(null)\n const [dragging, setDragging] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const fileRef = useRef<HTMLInputElement>(null)\n\n async function reload() {\n const fresh = await getProvider().getProduct(product.id)\n setImages(sortImages(fresh?.images ?? []))\n }\n\n useEffect(() => {\n setImages(null)\n void reload().catch((err: unknown) => { setImages([]); setError(errorMessage(err)) })\n }, [product.id])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (err: unknown) {\n setError(errorMessage(err))\n } finally {\n setBusy(false)\n }\n }\n\n async function upload(picked: FileList | File[] | null) {\n const files = Array.from(picked ?? []).filter((file) => file.type.startsWith('image/'))\n if (!files.length) return\n // Sequential, not Promise.all: each upload reads the current max sort_order\n // to place itself last, and running them together makes them all read the\n // same value and land on the same position.\n await run(async () => {\n for (const file of files) {\n await getProvider().uploadProductImage(product.id, file)\n }\n if (fileRef.current) fileRef.current.value = ''\n })\n }\n\n function move(index: number, delta: number) {\n const target = index + delta\n if (!images || target < 0 || target >= images.length) return\n const a = images[index]!\n const b = images[target]!\n // Swap the two positions rather than renumbering the list: fewer writes, and\n // a failure halfway leaves an order that is still coherent.\n void run(async () => {\n const update = getProvider().updateProductImage\n if (!update) throw new Error('Este provider não suporta reordenar imagens.')\n await update(a.id, { sortOrder: b.sortOrder ?? target })\n await update(b.id, { sortOrder: a.sortOrder ?? index })\n })\n }\n\n const update = getProvider().updateProductImage\n\n return (\n // The whole tab takes a drop: aiming at a small box with six files in hand\n // is the part of uploading that goes wrong.\n <div\n className=\"space-y-4\"\n onDragOver={(event) => { if (event.dataTransfer.types.includes('Files')) { event.preventDefault(); setDragging(true) } }}\n onDragLeave={(event) => { if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setDragging(false) }}\n onDrop={(event) => {\n if (!event.dataTransfer.files.length) return\n event.preventDefault()\n setDragging(false)\n void upload(event.dataTransfer.files)\n }}\n >\n <DetailTabHeader\n title=\"Fotos do produto\"\n description=\"A capa é a foto do produto em todo lugar: no cadastro, no estoque, no catálogo, no carrinho e no pedido. As demais viram o carrossel na página do produto.\"\n actions={\n // The same Button as every other tab. It used to be a <label> hand-\n // painted to look like one, which drifted the moment the real button\n // changed — different height, no icon, no disabled state.\n <Button disabled={busy} onClick={() => fileRef.current?.click()}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n {busy ? 'Enviando…' : 'Adicionar fotos'}\n </Button>\n }\n />\n\n {/* The picker itself: opened by the button, never shown. */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n disabled={busy}\n className=\"hidden\"\n onChange={(event) => void upload(event.target.files)}\n />\n\n {error && (\n <p className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800\">{error}</p>\n )}\n\n {images === null ? (\n <ul className=\"fz-cards gap-3\" aria-busy=\"true\">\n {[0, 1, 2, 3].map((i) => (\n <li key={i} className=\"overflow-hidden rounded-lg border\">\n <Skeleton className=\"aspect-square w-full rounded-none\" />\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </li>\n ))}\n </ul>\n ) : images.length === 0 || dragging ? (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={busy}\n onClick={() => fileRef.current?.click()}\n className={`font-normal whitespace-normal flex w-full flex-col items-center gap-2 rounded-lg border border-dashed px-4 py-10 text-center text-sm transition-colors ${\n dragging ? 'border-primary bg-primary/5 text-foreground' : 'text-muted-foreground hover:bg-muted/40'\n }`}\n >\n <UploadCloud className=\"h-6 w-6\" aria-hidden />\n <span className=\"font-medium\">{dragging ? 'Solte para enviar' : 'Arraste as fotos para cá, ou clique para escolher'}</span>\n {!dragging && (\n <span className=\"max-w-md text-xs\">\n Produtos com mais de uma foto vendem melhor — mostre a embalagem, o produto pronto e uma referência de tamanho.\n </span>\n )}\n </Button>\n ) : (\n <ul className=\"fz-cards gap-3\">\n {images.map((image, index) => (\n <li key={image.id} className=\"overflow-hidden rounded-lg border\">\n <div className=\"relative aspect-square bg-muted\">\n <img src={image.url} alt={image.altText ?? ''} className=\"h-full w-full object-cover\" />\n {image.isPrimary && (\n <span className=\"absolute left-2 top-2 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-x-1 gap-y-1.5 px-2 py-1.5\">\n <div className=\"flex gap-1\">\n <IconButton label=\"Mover para trás\" disabled={busy || index === 0}\n onClick={() => move(index, -1)}>←</IconButton>\n <IconButton label=\"Mover para frente\" disabled={busy || index === images.length - 1}\n onClick={() => move(index, 1)}>→</IconButton>\n </div>\n <div className=\"flex items-center gap-1\">\n {!image.isPrimary && update && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => update(image.id, { isPrimary: true }))}\n className=\"font-normal whitespace-nowrap rounded px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n Usar como capa\n </Button>\n )}\n <AskAIButton\n size=\"sm\"\n variant=\"outline\"\n className=\"h-6 px-2 text-xs\"\n label=\"IA\"\n media={{ url: image.url, name: image.altText ?? product.name }}\n draft=\"Melhora essa imagem\"\n hint=\"o que você quer mudar nessa foto\"\n intro={{\n persona: 'Estúdio de imagem',\n pitch: `Vamos melhorar a foto de ${product.name}.`,\n description: 'Posso limpar o fundo, corrigir luz e cor, e gerar uma versão em resolução maior para o catálogo.',\n suggestions: [\n { label: 'Fundo branco', prompt: 'Remove o fundo e deixa branco' },\n { label: 'Mais nítida', prompt: 'Aumenta a resolução e a nitidez' },\n ],\n }}\n />\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={busy}\n onClick={() => void run(() => getProvider().deleteProductImage(image.id))}\n className=\"font-normal rounded px-1.5 py-0.5 text-xs text-red-600 hover:bg-red-50 disabled:opacity-50\"\n >\n Excluir\n </Button>\n </div>\n </div>\n </li>\n ))}\n </ul>\n )}\n {footer}\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"font-normal disabled:pointer-events-auto rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </Button>\n )\n}\n\n/** Cover first, then the merchant's order — the same rule the storefront uses. */\nfunction sortImages(images: ProductImage[]): ProductImage[] {\n return [...images].sort((a, b) => {\n if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1\n return (a.sortOrder ?? 0) - (b.sortOrder ?? 0)\n })\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React from 'react'\nimport type { Product, ProductVariant, ShopProvider, VariantAxisInput, VariantMatrixRow } from '@fayz-ai/shop'\nimport {\n applyVariantMatrix, axesFromOptions, formatVariantCombination, hasOnlyDefaultVariant,\n leavesNothingSellable, MAX_VARIANT_AXES, planVariantMatrix, validateVariantAxes,\n} from '@fayz-ai/shop'\nimport { AlertTriangle, Loader2, Plus, Trash2, X } from 'lucide-react'\nimport { Button, Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, Checkbox, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\nimport { DetailTabHeader } from '@fayz-ai/admin'\n\n/**\n * Variantes — os eixos de opção e a matriz que eles geram.\n *\n * A tela que faltava. As tabelas existem desde a 0028, a vitrine monta o\n * seletor a partir delas desde o M5 e o `shop_place_order` cobra por elas desde\n * a 0029 — mas nenhuma tela do admin sabia criá-las. Na prática, ou o lojista\n * chamava alguém com acesso ao banco, ou vendia P, M e G contra o mesmo\n * contador, que é exatamente o defeito que o cabeçalho da 0028 descreve.\n *\n * DUAS COISAS AQUI NÃO SÃO ESCOLHA DE TELA, e é por isso que elas moram no\n * @fayz-ai/shop e não neste arquivo:\n *\n * • A VARIANTE PADRÃO (0037). Todo produto tem uma, ela não aparece em lugar\n * nenhum, e sumir com o último eixo tem que trazê-la de volta — senão o\n * produto fica esgotado para sempre e ninguém vê erro. `applyVariantMatrix`\n * é quem sabe disso.\n * • O ESTOQUE. Desde a 0034 ele é razão, não coluna: quem digita 12 aqui não\n * escreve 12 em lugar nenhum, gera o movimento da DIFERENÇA e deixa a 0036\n * espelhar de volta. `setVariantStock` é quem sabe disso.\n */\nexport function ProductVariantsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const shop = getProvider()\n // Os quatro verbos que esta tela chama. Checar só um deixaria a aba abrir e\n // quebrar no primeiro clique — que é pior do que não abrir.\n const supported =\n typeof shop.getProductVariants === 'function' &&\n typeof shop.saveProductOptions === 'function' &&\n typeof shop.createProductVariant === 'function' &&\n typeof shop.updateProductVariant === 'function'\n\n const [axes, setAxes] = React.useState<VariantAxisInput[]>([])\n const [variants, setVariants] = React.useState<ProductVariant[]>([])\n const [busy, setBusy] = React.useState(false)\n // Nova opção nasce num modal e chega pronta. Appending an empty axis put a\n // half-built row in the list — a name-less option the matrix already counted.\n const [adding, setAdding] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [selected, setSelected] = React.useState<Set<string>>(new Set())\n const [dirty, setDirty] = React.useState(false)\n\n const reload = React.useCallback(async () => {\n // includeArchived: uma combinação removida e recolocada tem que REVIVER a\n // linha antiga — a 0028 tem UNIQUE (product_id, options) e um INSERT novo\n // bateria nela.\n const set = await getProvider().getProductVariants!(product.id, { includeArchived: true })\n setAxes(axesFromOptions(set.options))\n setVariants(set.variants)\n setSelected(new Set())\n setDirty(false)\n }, [getProvider, product.id])\n\n React.useEffect(() => {\n if (!supported) return\n void reload().catch((e) => setError(message(e)))\n }, [reload, supported])\n\n async function run(action: () => Promise<unknown>) {\n setBusy(true)\n setError(null)\n try {\n await action()\n await reload()\n } catch (e) {\n setError(message(e))\n } finally {\n setBusy(false)\n }\n }\n\n const plan = React.useMemo(() => planVariantMatrix(axes, variants), [axes, variants])\n const axisError = validateVariantAxes(axes)\n const onlyDefault = hasOnlyDefaultVariant(variants)\n const rows = plan.rows\n\n function patchAxes(next: VariantAxisInput[]) {\n setAxes(next)\n setDirty(true)\n }\n\n const save = () => run(() => applyVariantMatrix(getProvider(), product.id, axes, variants))\n\n if (!supported) {\n return <Notice>Este provedor de loja não administra variantes.</Notice>\n }\n\n return (\n <div className=\"space-y-6\">\n {/* — Eixos — */}\n <section className=\"space-y-3\">\n <DetailTabHeader\n title=\"Opções\"\n description=\"Tamanho, cor, sabor. Cada combinação vira uma variante com preço, SKU e estoque próprios — é assim que P e GG deixam de dividir o mesmo contador.\"\n actions={\n // Same Button as the other two tabs. It used to be a bare <button>\n // at text-xs with its own border, which read as a lesser control\n // than \"Dar entrada\" one tab over, for no reason anybody chose.\n <Button\n disabled={busy || axes.length >= MAX_VARIANT_AXES}\n onClick={() => setAdding(true)}\n >\n <Plus className=\"mr-1.5 h-4 w-4\" /> Adicionar opção\n </Button>\n }\n />\n\n <NewAxisModal\n open={adding}\n onClose={() => setAdding(false)}\n onCreate={(axis) => { patchAxes([...axes, axis]); setAdding(false) }}\n />\n\n {axes.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto é vendido de um jeito só. Adicione uma opção se ele tem tamanhos, cores ou sabores.\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {axes.map((axis, index) => (\n <AxisEditor\n key={index}\n axis={axis}\n index={index}\n count={axes.length}\n disabled={busy}\n onChange={(next) => patchAxes(axes.map((a, i) => (i === index ? next : a)))}\n onMove={(delta) => {\n const target = index + delta\n if (target < 0 || target >= axes.length) return\n const next = [...axes]\n const [moved] = next.splice(index, 1)\n next.splice(target, 0, moved!)\n patchAxes(next)\n }}\n onRemove={() => patchAxes(axes.filter((_, i) => i !== index))}\n />\n ))}\n </ul>\n )}\n\n {axisError && <Notice tone=\"error\">{axisError}</Notice>}\n {!axisError && leavesNothingSellable(plan) && (\n <Notice tone=\"error\">\n Sem nenhuma opção este produto ficaria sem nada vendável — ele não tem a variante padrão\n que a plataforma cria hoje. Fale com o suporte antes de salvar.\n </Notice>\n )}\n\n {dirty && (\n <div className=\"flex flex-wrap items-center gap-3 rounded-lg border bg-muted/30 px-4 py-3\">\n <p className=\"flex-1 text-xs text-muted-foreground\">\n {describePlan(plan)}\n </p>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" disabled={busy} onClick={() => void reload()}\n className=\"font-normal rounded-md px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted disabled:opacity-40\">\n Descartar\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n disabled={busy || Boolean(axisError)}\n onClick={save}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground disabled:opacity-50\"\n >\n {busy && <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />}\n Salvar variantes\n </Button>\n </div>\n )}\n </section>\n\n {error && <Notice tone=\"error\">{error}</Notice>}\n\n {/* — Matriz — */}\n {rows.length > 0 && (\n <VariantGrid\n rows={rows}\n axes={axes}\n product={product}\n busy={busy}\n dirty={dirty}\n selected={selected}\n onSelect={setSelected}\n onSave={(variantId, patch) => run(() => getProvider().updateProductVariant!(variantId, patch))}\n onStock={(variantId, count) => run(() => getProvider().setVariantStock!(variantId, count))}\n />\n )}\n\n {rows.length === 0 && onlyDefault && (\n <p className=\"text-xs text-muted-foreground\">\n Preço, SKU e estoque deste produto continuam na aba de cadastro.\n </p>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Eixo\n// ---------------------------------------------------------------------------\n\nfunction AxisEditor({ axis, index, count, disabled, onChange, onMove, onRemove }: {\n axis: VariantAxisInput\n index: number\n count: number\n disabled: boolean\n onChange: (next: VariantAxisInput) => void\n onMove: (delta: number) => void\n onRemove: () => void\n}) {\n const [draft, setDraft] = React.useState('')\n\n function commit(raw: string) {\n // Vírgula separa: colar \"P, M, G\" é como um lojista digita uma grade, e\n // pedir três enters para isso é atrito sem motivo.\n const values = raw.split(',').map((v) => v.trim()).filter(Boolean)\n if (values.length === 0) return\n const merged = [...axis.values]\n for (const value of values) if (!merged.includes(value)) merged.push(value)\n onChange({ ...axis, values: merged })\n setDraft('')\n }\n\n return (\n <li className=\"rounded-card border bg-card p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"w-40\">\n <Input\n value={axis.name}\n disabled={disabled}\n onChange={(e) => onChange({ ...axis, name: e.target.value })}\n placeholder=\"Tamanho\"\n aria-label={`Nome da opção ${index + 1}`}\n className=\"h-8 bg-background px-2 font-medium shadow-none\"\n />\n </div>\n <span className=\"flex-1\" />\n <IconButton label=\"Mover para cima\" disabled={disabled || index === 0} onClick={() => onMove(-1)}>↑</IconButton>\n <IconButton label=\"Mover para baixo\" disabled={disabled || index === count - 1} onClick={() => onMove(1)}>↓</IconButton>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Remover opção\"\n disabled={disabled}\n onClick={onRemove}\n className=\"rounded p-1.5 text-muted-foreground transition hover:text-destructive disabled:opacity-40\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <div className=\"mt-2 flex flex-wrap items-center gap-1.5\">\n {axis.values.map((value, position) => (\n <span key={value} className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs\">\n {value}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label={`Remover ${value}`}\n disabled={disabled}\n onClick={() => onChange({ ...axis, values: axis.values.filter((_, i) => i !== position) })}\n className=\"text-muted-foreground hover:text-destructive disabled:opacity-40\"\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </span>\n ))}\n <div className=\"min-w-28 flex-1\">\n <Input\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(draft) }\n }}\n onBlur={() => commit(draft)}\n placeholder={axis.values.length === 0 ? 'P, M, G' : 'adicionar'}\n aria-label={`Valores da opção ${index + 1}`}\n className=\"h-7 border-dashed bg-transparent px-2 text-xs shadow-none\"\n />\n </div>\n </div>\n </li>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Matriz\n// ---------------------------------------------------------------------------\n\nconst UNITS = ['kg', 'g', 'lb']\n// Radix Select reserves the empty string for \"nothing chosen\".\nconst INHERIT = '__inherit__'\nconst COVER = '__cover__'\nconst COMPACT_INPUT = 'h-7 bg-background px-2 text-xs shadow-none'\nconst COMPACT_SELECT = 'h-7 w-auto gap-1 bg-background px-1.5 text-xs shadow-none'\n\nfunction VariantGrid({ rows, axes, product, busy, dirty, selected, onSelect, onSave, onStock }: {\n rows: VariantMatrixRow[]\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n dirty: boolean\n selected: Set<string>\n onSelect: (next: Set<string>) => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const saved = rows.filter((row) => row.variant)\n const allSelected = saved.length > 0 && saved.every((row) => selected.has(row.variant!.id))\n\n function toggle(id: string) {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelect(next)\n }\n\n return (\n <section className=\"space-y-3\">\n <DetailTabHeader\n title=\"Variantes\"\n description={\n <>\n Preço vazio herda o preço do produto — o catálogo em que todo tamanho custa igual não precisa\n repetir o número {rows.length} vezes. Medida vazia herda a do produto, do mesmo jeito.\n </>\n }\n />\n\n {dirty && (\n <Notice>\n As linhas abaixo ainda refletem o que está salvo. Salve as opções para gerar as novas combinações.\n </Notice>\n )}\n\n {selected.size > 0 && (\n <BulkBar\n count={selected.size}\n disabled={busy}\n onApply={(patch) => {\n for (const id of selected) onSave(id, patch)\n }}\n onClear={() => onSelect(new Set())}\n />\n )}\n\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full min-w-[62rem] text-sm\">\n <thead className=\"bg-muted/40 text-left text-xs text-muted-foreground\">\n <tr>\n <th className=\"w-9 px-2 py-2\">\n <Checkbox\n aria-label=\"Selecionar todas\"\n checked={allSelected}\n disabled={busy || saved.length === 0}\n onChange={() => onSelect(allSelected ? new Set() : new Set(saved.map((r) => r.variant!.id)))}\n />\n </th>\n <th className=\"px-2 py-2 font-medium\">Variante</th>\n <th className=\"px-2 py-2 font-medium\">Preço</th>\n <th className=\"px-2 py-2 font-medium\">Comparativo</th>\n <th className=\"px-2 py-2 font-medium\">SKU</th>\n <th className=\"px-2 py-2 font-medium\">Estoque</th>\n <th className=\"px-2 py-2 font-medium\">Peso</th>\n <th className=\"px-2 py-2 font-medium\">A × L × C (cm)</th>\n <th className=\"px-2 py-2 font-medium\">Foto</th>\n <th className=\"px-2 py-2 font-medium\">Ativa</th>\n </tr>\n </thead>\n <tbody className=\"divide-y\">\n {rows.map((row) => (\n <VariantRow\n key={row.variant?.id ?? formatVariantCombination(row.options, axes)}\n row={row}\n axes={axes}\n product={product}\n busy={busy}\n checked={row.variant ? selected.has(row.variant.id) : false}\n onToggle={() => row.variant && toggle(row.variant.id)}\n onSave={onSave}\n onStock={onStock}\n />\n ))}\n </tbody>\n </table>\n </div>\n </section>\n )\n}\n\nfunction VariantRow({ row, axes, product, busy, checked, onToggle, onSave, onStock }: {\n row: VariantMatrixRow\n axes: VariantAxisInput[]\n product: Product\n busy: boolean\n checked: boolean\n onToggle: () => void\n onSave: (variantId: string, patch: Record<string, unknown>) => void\n onStock: (variantId: string, count: number) => void\n}) {\n const variant = row.variant\n const pending = !variant\n const label = formatVariantCombination(row.options, axes)\n\n // Só grava no blur, e só quando mudou: cada campo é um UPDATE e o estoque é\n // um movimento no razão — disparar a cada tecla encheria o histórico de\n // ajustes de um dígito.\n const commit = (field: string, value: unknown, previous: unknown) => {\n if (!variant || value === previous) return\n onSave(variant.id, { [field]: value })\n }\n\n return (\n <tr className={pending ? 'bg-muted/20 text-muted-foreground' : undefined}>\n <td className=\"px-2 py-1.5\">\n <Checkbox aria-label={`Selecionar ${label}`} checked={checked}\n disabled={busy || pending} onChange={onToggle} />\n </td>\n <td className=\"px-2 py-1.5 font-medium\">\n {label}\n {pending && <span className=\"ml-2 text-[10px] uppercase tracking-wide\">a criar</span>}\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.price ?? null} disabled={busy || pending}\n placeholder={String(product.price)} onCommit={(v) => commit('price', v, variant?.price ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell value={variant?.compareAtPrice ?? null} disabled={busy || pending}\n placeholder=\"—\" onCommit={(v) => commit('compareAtPrice', v, variant?.compareAtPrice ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <TextCell value={variant?.sku ?? ''} disabled={busy || pending}\n placeholder={product.sku ?? 'SKU'} onCommit={(v) => commit('sku', v || null, variant?.sku ?? null)} />\n </td>\n <td className=\"px-2 py-1.5\">\n <NumberCell\n value={variant?.inventoryCount ?? null}\n disabled={busy || pending}\n placeholder=\"0\"\n integer\n onCommit={(v) => {\n if (!variant || v == null || v === variant.inventoryCount) return\n onStock(variant.id, v)\n }}\n />\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <NumberCell value={variant?.weight ?? null} disabled={busy || pending}\n placeholder={product.weight == null ? '—' : String(product.weight)} width=\"w-16\"\n onCommit={(v) => commit('weight', v, variant?.weight ?? null)} />\n <Select\n value={variant?.weightUnit ?? INHERIT}\n disabled={busy || pending}\n onValueChange={(v) => commit('weightUnit', v === INHERIT ? null : v, variant?.weightUnit ?? null)}\n >\n <SelectTrigger aria-label={`Unidade de peso de ${label}`} className={COMPACT_SELECT}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={INHERIT}>{product.weightUnit}</SelectItem>\n {UNITS.map((unit) => <SelectItem key={unit} value={unit}>{unit}</SelectItem>)}\n </SelectContent>\n </Select>\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n {(['heightCm', 'widthCm', 'lengthCm'] as const).map((key) => (\n <NumberCell\n key={key}\n value={variant?.[key] ?? null}\n disabled={busy || pending}\n width=\"w-14\"\n placeholder={product[key] == null ? '—' : String(product[key])}\n onCommit={(v) => commit(key, v, variant?.[key] ?? null)}\n />\n ))}\n </div>\n </td>\n <td className=\"px-2 py-1.5\">\n <Select\n value={variant?.imageId ?? COVER}\n disabled={busy || pending || product.images.length === 0}\n onValueChange={(v) => commit('imageId', v === COVER ? null : v, variant?.imageId ?? null)}\n >\n <SelectTrigger aria-label={`Foto de ${label}`} className={`${COMPACT_SELECT} w-24`}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={COVER}>capa</SelectItem>\n {product.images.map((image, index) => (\n <SelectItem key={image.id} value={image.id}>Foto {index + 1}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </td>\n <td className=\"px-2 py-1.5\">\n <Checkbox\n aria-label={`${label} ativa`}\n checked={variant?.status === 'active'}\n disabled={busy || pending}\n onChange={(on) => commit('status', on ? 'active' : 'archived', variant?.status)}\n />\n </td>\n </tr>\n )\n}\n\n/** Preço e peso em massa — os dois que o Shopify tem, e os dois que uma grade\n * inteira costuma compartilhar. */\nfunction BulkBar({ count, disabled, onApply, onClear }: {\n count: number\n disabled: boolean\n onApply: (patch: Record<string, unknown>) => void\n onClear: () => void\n}) {\n const [price, setPrice] = React.useState('')\n const [weight, setWeight] = React.useState('')\n const [unit, setUnit] = React.useState('')\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 rounded-lg border bg-muted/30 px-3 py-2 text-xs\">\n <span className=\"font-medium\">{count} selecionada{count > 1 ? 's' : ''}</span>\n <span className=\"text-muted-foreground\">·</span>\n <div className=\"w-24\">\n <Input value={price} onChange={(e) => setPrice(e.target.value)} placeholder=\"Preço\"\n aria-label=\"Preço para todas\" className={COMPACT_INPUT} />\n </div>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" disabled={disabled || parseNumber(price) == null}\n onClick={() => { onApply({ price: parseNumber(price) }); setPrice('') }}\n className=\"rounded-md border px-2 py-1 text-xs font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar preço\n </Button>\n <span className=\"text-muted-foreground\">·</span>\n <div className=\"w-20\">\n <Input value={weight} onChange={(e) => setWeight(e.target.value)} placeholder=\"Peso\"\n aria-label=\"Peso para todas\" className={COMPACT_INPUT} />\n </div>\n <Select value={unit || INHERIT} onValueChange={(v) => setUnit(v === INHERIT ? '' : v)}>\n <SelectTrigger aria-label=\"Unidade para todas\" className={COMPACT_SELECT}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={INHERIT}>herdar</SelectItem>\n {UNITS.map((u) => <SelectItem key={u} value={u}>{u}</SelectItem>)}\n </SelectContent>\n </Select>\n <Button variant=\"bare\" size=\"bare\" type=\"button\" disabled={disabled || parseNumber(weight) == null}\n onClick={() => { onApply({ weight: parseNumber(weight), weightUnit: unit || null }); setWeight('') }}\n className=\"rounded-md border px-2 py-1 text-xs font-medium hover:bg-muted disabled:opacity-40\">\n Aplicar peso\n </Button>\n <span className=\"flex-1\" />\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onClear} className=\"text-xs font-normal text-muted-foreground hover:text-foreground\">\n limpar seleção\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Peças\n// ---------------------------------------------------------------------------\n\n/** '2,5' e '2.5' são a mesma medida — o lojista digita como o teclado dele manda. */\nexport function parseNumber(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nfunction NumberCell({ value, disabled, placeholder, onCommit, width = 'w-20', integer }: {\n value: number | null\n disabled?: boolean\n placeholder?: string\n onCommit: (value: number | null) => void\n width?: string\n integer?: boolean\n}) {\n const [draft, setDraft] = React.useState(value == null ? '' : String(value))\n React.useEffect(() => { setDraft(value == null ? '' : String(value)) }, [value])\n return (\n <div className={width}>\n <Input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => {\n const parsed = parseNumber(draft)\n onCommit(parsed == null ? null : integer ? Math.trunc(parsed) : parsed)\n }}\n className={`${COMPACT_INPUT} tabular-nums`}\n />\n </div>\n )\n}\n\nfunction TextCell({ value, disabled, placeholder, onCommit }: {\n value: string\n disabled?: boolean\n placeholder?: string\n onCommit: (value: string) => void\n}) {\n const [draft, setDraft] = React.useState(value)\n React.useEffect(() => { setDraft(value) }, [value])\n return (\n <div className=\"w-28\">\n <Input\n value={draft}\n disabled={disabled}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => onCommit(draft.trim())}\n className={COMPACT_INPUT}\n />\n </div>\n )\n}\n\nfunction IconButton({ label, disabled, onClick, children }: {\n label: string\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className=\"font-normal disabled:pointer-events-auto rounded border px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-muted hover:text-foreground disabled:opacity-40\"\n >\n {children}\n </Button>\n )\n}\n\nfunction Notice({ children, tone }: { children: React.ReactNode; tone?: 'error' }) {\n const cls = tone === 'error'\n ? 'border-destructive/30 bg-destructive/5 text-destructive'\n : 'border-border bg-muted/30 text-muted-foreground'\n return (\n <p className={`flex items-start gap-2 rounded-md border px-3 py-2 text-xs ${cls}`}>\n {tone === 'error' && <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />}\n <span>{children}</span>\n </p>\n )\n}\n\nfunction describePlan(plan: ReturnType<typeof planVariantMatrix>): string {\n const parts: string[] = []\n if (plan.create.length) parts.push(`${plan.create.length} a criar`)\n if (plan.reactivate.length) parts.push(`${plan.reactivate.length} a reativar`)\n if (plan.archive.length) parts.push(`${plan.archive.length} a arquivar`)\n if (parts.length === 0) return 'Nenhuma combinação muda.'\n // Arquivar e não excluir: a 0034 apaga o saldo junto com a variante, e o\n // estoque que sobrou é de mercadoria que o lojista ainda tem na prateleira.\n return `${parts.join(', ')}. Combinações removidas são arquivadas, nunca excluídas — o estoque delas continua no histórico.`\n}\n\nfunction message(error: unknown): string {\n return errorMessage(error)\n}\n\n\n/**\n * Nova opção, num modal com a mesma anatomia do resto: cabeçalho diz o que é,\n * corpo pergunta, rodapé decide.\n *\n * It creates a COMPLETE axis. The old button appended `{ name: '', values: [] }`\n * straight into the list, so an option existed — and was counted by the matrix\n * planner — before it had a name or a single value.\n */\nfunction NewAxisModal({ open, onClose, onCreate }: {\n open: boolean\n onClose: () => void\n onCreate: (axis: VariantAxisInput) => void\n}) {\n const [name, setName] = React.useState('')\n // A LIST, one value per row — the shape Shopify uses, and the shape the thing\n // itself has. A comma-separated box asks the shopkeeper to encode a list into\n // a string and hides the count until they get the separator right; a value\n // containing a comma was simply unrepresentable.\n //\n // The last row is always empty: typing in it grows the list, so \"add another\"\n // is not a button you have to find.\n const [values, setValues] = React.useState<string[]>([''])\n\n React.useEffect(() => { if (open) { setName(''); setValues(['']) } }, [open])\n\n function setValue(index: number, next: string) {\n setValues((prev) => {\n const out = [...prev]\n out[index] = next\n // Grow when the last row starts being used; never leave two empties.\n if (index === out.length - 1 && next.trim()) out.push('')\n return out\n })\n }\n\n function removeValue(index: number) {\n setValues((prev) => {\n const out = prev.filter((_, i) => i !== index)\n return out.length === 0 || out[out.length - 1]!.trim() ? [...out, ''] : out\n })\n }\n\n const filled = values.map((v) => v.trim()).filter(Boolean)\n // Duplicates would silently collapse into one column of the matrix.\n const unique = [...new Set(filled)]\n const hasDuplicate = unique.length !== filled.length\n const ready = name.trim().length > 0 && unique.length > 0 && !hasDuplicate\n\n return (\n <Modal open={open} onOpenChange={(o: boolean) => { if (!o) onClose() }}>\n <ModalContent className=\"sm:max-w-md\">\n <ModalHeader>\n <ModalTitle>Nova opção</ModalTitle>\n <ModalDescription>\n Cada combinação de opções vira uma variante com preço, SKU e estoque próprios.\n </ModalDescription>\n </ModalHeader>\n\n <div className=\"space-y-3 py-2\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Nome</span>\n <Input\n autoFocus\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Tamanho\"\n className=\"mt-1 px-2.5\"\n />\n </label>\n\n <div>\n <span className=\"text-xs font-medium text-muted-foreground\">Valores</span>\n <ul className=\"mt-1 space-y-1.5\">\n {values.map((value, index) => (\n <li key={index} className=\"flex items-center gap-1.5\">\n <Input\n value={value}\n onChange={(e) => setValue(index, e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n if (index === values.length - 1 && value.trim()) setValue(index, value)\n // Focus follows the row that was just created.\n const rows = e.currentTarget.closest('ul')?.querySelectorAll('input')\n window.setTimeout(() => rows?.[index + 1]?.focus(), 0)\n }\n }}\n placeholder={index === values.length - 1 ? 'Adicionar valor' : ''}\n aria-label={`Valor ${index + 1}`}\n className=\"px-2.5\"\n />\n {/* No remove on the trailing empty row: there is nothing to\n remove, and a dead button beside every list is noise. */}\n {index < values.length - 1 && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => removeValue(index)}\n aria-label={`Remover valor ${index + 1}`}\n className=\"fz-tap shrink-0 rounded-md p-1.5 text-muted-foreground transition hover:bg-muted hover:text-destructive\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </li>\n ))}\n </ul>\n {hasDuplicate && (\n <span className=\"mt-1 block text-[11px] text-destructive\">\n Há valores repetidos — cada um vira uma variante, então dois iguais viram uma só.\n </span>\n )}\n </div>\n </div>\n\n <ModalFooter>\n <Button variant=\"ghost\" onClick={onClose}>Cancelar</Button>\n <Button disabled={!ready} onClick={() => onCreate({ name: name.trim(), values: unique })}>\n Adicionar\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n )\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport { normalizeMovementType, type MovementType } from '@fayz-ai/inventory/domain/movement'\nimport { getActiveTenantId, emitDataChanged } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\n// O razão inteiro vive no subpath, que é onde StockEntryModal já busca o\n// vocabulário — a raiz do pacote carrega só o que a vitrine precisa.\nimport {\n createSupabaseStockStore, listStockReasonCodes, resolveStockStore,\n type StockBalance, type StockLocation, type StockReasonCode,\n} from '@fayz-ai/shop/inventory'\nimport { errorMessage } from '../settings/error-message'\nimport { listProductsCached } from '../data/shared'\nimport { candidateMeta, resolveTerm } from './product-matching'\n\n// ---------------------------------------------------------------------------\n// Entrada e saída pela conversa — o razão de estoque com uma porta de balcão.\n//\n// A loja já tem o razão de verdade desde a 0034: movimento IMUTÁVEL, saldo\n// projetado por gatilho, reserva, lote e local, com o vocabulário guardado como\n// LINHA (o lojista acrescenta \"quebra de vitrine\" sem migration) e um validador\n// só, compartilhado entre o TypeScript e o SQL. Nada disso se reescreve aqui —\n// este arquivo só abre a porta que faltava: a de quem fala.\n//\n// O verbo vem do @fayz-ai/inventory de propósito. Ele é quem já sabe que\n// \"entrada\", \"saída\", \"ajuste\", \"perda\" e \"transferência\" são as cinco coisas\n// que um humano diz, e ele já normaliza as grafias (com acento, sem acento) que\n// beauty e resto importaram de sistemas velhos. O razão da loja tem OITO\n// espécies porque também registra o que a venda faz; as cinco humanas são um\n// recorte dele, não um segundo vocabulário.\n//\n// A regra de sinal é do razão e não se negocia: `in` exige positivo, `out`\n// exige negativo, `either` aceita qualquer coisa diferente de zero. O lojista\n// diz \"saída de 3\" — quem põe o sinal é este arquivo, nunca o modelo.\n// ---------------------------------------------------------------------------\n\n/** Como cada verbo humano cai no razão da loja. */\nconst KIND_OF: Record<MovementType, { kind: string; sign: -1 | 1 | 0; reason: string }> = {\n // `sign: 0` = o razão aceita os dois lados (ajuste corrige para cima e para baixo).\n entry: { kind: 'receipt', sign: 1, reason: 'purchase' },\n exit: { kind: 'adjustment', sign: -1, reason: 'correction' },\n adjustment: { kind: 'adjustment', sign: 0, reason: 'correction' },\n loss: { kind: 'loss', sign: -1, reason: 'breakage' },\n // Transferência é DOIS movimentos amarrados, com origem e destino. Metade de\n // uma transferência é estoque sumindo de um lugar e não aparecendo no outro.\n transfer: { kind: 'transfer_out', sign: -1, reason: 'transfer' },\n}\n\nexport interface MovementPlan {\n kind: string\n quantity: number\n reasonCode: string\n}\n\n/**\n * O que o lojista disse, traduzido para uma linha do razão.\n *\n * A razão manda na espécie quando ela implica uma: \"saída por quebra\" não é um\n * ajuste com uma observação, é uma PERDA — e o relatório de perdas do mês\n * depende dessa diferença. Por isso a tabela de razões é consultada antes de a\n * espécie do verbo valer.\n */\nexport function planMovement(\n rawType: string,\n quantity: number,\n reasonCode?: string,\n): MovementPlan | { error: string; message: string } {\n const type = normalizeMovementType(rawType)\n if (!type) {\n return { error: 'unknown_movement_type', message: 'Use entrada, saída, ajuste ou perda.' }\n }\n if (type === 'transfer') {\n return {\n error: 'transfer_unsupported',\n message: 'Transferência entre locais precisa de origem e destino — ainda não faço por aqui.',\n }\n }\n const magnitude = Math.abs(Number(quantity) || 0)\n if (magnitude === 0) return { error: 'zero_quantity', message: 'Movimento de zero não é movimento.' }\n\n const fallback = KIND_OF[type]\n const declared = reasonCode\n ? listStockReasonCodes().find((r: StockReasonCode) => r.key === reasonCode)\n : undefined\n const kind = declared?.movementKind ?? fallback.kind\n // Um ajuste explícito pode ir para os dois lados; o sinal vem do que veio.\n const sign = fallback.sign === 0 ? (Number(quantity) < 0 ? -1 : 1) : fallback.sign\n return { kind, quantity: magnitude * sign, reasonCode: declared?.key ?? fallback.reason }\n}\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst WHERE_IS: PluginAITool = {\n id: 'shop.stock.position',\n name: 'getStockPosition',\n description:\n 'Answers \"where is my X\" for a product the merchant names in words: how many are on hand, how many are held for orders, '\n + 'and how that splits across locations and lots. Resolves the words itself — send the term as the merchant said it. '\n + 'When two products fit equally it asks with a card instead of guessing.',\n icon: 'Boxes',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: { term: { type: 'string', description: 'The product, in the merchant\\'s words.' } },\n required: ['term'],\n },\n}\n\nconst RECORD: PluginAITool = {\n id: 'shop.stock.record',\n name: 'recordStockMovement',\n description:\n 'Writes one line in the stock ledger: entrada, saída, ajuste or perda. Takes the `variantId` from getStockPosition — never a name. '\n + 'Send the quantity as a plain positive number and say which movement it is; the sign belongs to the ledger, not to you. '\n + 'The ledger is append-only: a mistake is corrected by an opposing movement, never by editing. '\n + '`occurredAt` is WHEN the goods moved, which is not when they were typed — Friday\\'s delivery entered on Monday.',\n icon: 'ArrowDownToLine',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'update' },\n parameters: {\n type: 'object',\n properties: {\n variantId: { type: 'string', description: 'From getStockPosition.' },\n productName: { type: 'string', description: 'So the merchant reads the card without ids.' },\n movementType: {\n type: 'string',\n description: 'entrada | saída | ajuste | perda',\n enum: ['entrada', 'saida', 'ajuste', 'perda'],\n },\n quantity: { type: 'number', description: 'How many, as a positive number.' },\n reasonCode: { type: 'string', description: 'Reason key when the merchant gave one (purchase, breakage, expiry, theft…).' },\n locationId: { type: 'string', description: 'Which location. Omitted means the store default.' },\n note: { type: 'string', description: 'Anything the merchant said that is not a field — the invoice number, who delivered.' },\n occurredAt: { type: 'string', description: 'ISO date when it actually moved. Omitted means now.' },\n },\n required: ['variantId', 'productName', 'movementType', 'quantity'],\n },\n}\n\n/**\n * O razão não está NESTA loja.\n *\n * O ledger inteiro — `plg_shop_stock_balances`, `plg_shop_stock_movements`, e a\n * coluna `tracking` na variante — nasce na migration 0034, e um pool que nunca\n * a aplicou responde com o erro cru do PostgREST: \"Could not find the table\" ou\n * \"column ... does not exist\". Isso é verdade e é ilegível para quem está\n * tentando lançar uma nota, e pior: parece defeito da tela.\n *\n * Reconhecer a falta e dizer o nome dela é a diferença entre \"o app quebrou\" e\n * \"falta aplicar o estoque nesta loja\".\n */\nexport function isLedgerMissing(error: unknown): boolean {\n const raw = error instanceof Error ? error.message : String((error as { message?: unknown })?.message ?? error)\n return /plg_shop_stock_|\\btracking\\b.*does not exist/i.test(raw)\n}\n\nexport const LEDGER_MISSING_MESSAGE =\n 'O controle de estoque ainda não foi aplicado nesta loja (migration 0034). '\n + 'Enquanto isso o saldo vive só no número do produto.'\n\n/**\n * A data que o lojista escolheu, virada em instante — ou nada.\n *\n * Duas armadilhas de uma vez. A primeira: mandar a data de HOJE é trocar o\n * relógio do servidor pelo do navegador sem ganhar nada, então um dia não\n * alterado devolve `undefined` e o razão carimba o próprio `now()`. A segunda:\n * `new Date('2026-08-21')` é meia-noite UTC, que no Brasil é o dia 20 às 21h —\n * uma nota lançada retroativa cairia um dia antes do que foi digitado. Meio-dia\n * local sobrevive a qualquer fuso.\n */\nexport function occurredAtFor(chosenDay: string, today: string): string | undefined {\n if (!chosenDay || chosenDay === today) return undefined\n const parsed = new Date(`${chosenDay}T12:00:00`)\n return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString()\n}\n\nexport interface CommitMovementArgs {\n variantId: string\n movementType: string\n quantity: number\n reasonCode?: string\n locationId?: string\n note?: string\n occurredAt?: string\n}\n\nexport interface CommittedMovement {\n ok: true\n movementId: string\n kind: string\n quantity: number\n reasonCode: string\n available: number\n}\n\nexport interface RefusedMovement {\n ok: false\n error: string\n message?: string\n available?: number\n}\n\n/**\n * O único caminho de gravação do razão — do formulário e do agente.\n *\n * Ter dois seria ter duas opiniões sobre o sinal, sobre a guarda de negativo e\n * sobre qual razão implica qual espécie, e elas divergiriam na primeira vez que\n * alguém mexesse num só. A porta é a mesma; o que muda é quem digita.\n */\nexport async function commitMovement(args: CommitMovementArgs): Promise<CommittedMovement | RefusedMovement> {\n const plan = planMovement(args.movementType, args.quantity, args.reasonCode)\n if ('error' in plan) return { ok: false, ...plan }\n\n const store = stockStore()\n // O razão aceita saldo negativo — quem recusa a falta é `allocate`, e ele só\n // protege a VENDA. Aqui a origem é um humano digitando: \"saída 999\" com 10 na\n // prateleira é dedo gordo, e deixar o saldo em -989 estraga o inventário de um\n // jeito que ninguém percebe até a contagem. Recusar dizendo o saldo custa uma\n // frase.\n if (plan.quantity < 0) {\n const available = await store.getAvailable(args.variantId)\n if (Math.abs(plan.quantity) > available) {\n return {\n ok: false,\n error: 'insufficient_stock',\n available,\n message: `Só há ${available} em estoque — a saída de ${Math.abs(plan.quantity)} deixaria negativo.`,\n }\n }\n }\n\n const movement = await store.recordMovement({\n variantId: args.variantId,\n kind: plan.kind,\n quantity: plan.quantity,\n reasonCode: plan.reasonCode,\n ...(args.locationId ? { locationId: args.locationId } : {}),\n ...(args.note ? { note: args.note } : {}),\n ...(args.occurredAt ? { occurredAt: args.occurredAt } : {}),\n })\n\n // UM MOVIMENTO MUDA QUATRO TABELAS, e o escritor é o único que sabe disso.\n // O razão recebe a linha e o banco faz o resto em cascata: saldo, contagem da\n // variante, contagem do produto e — quando a loja é a dona (146) —\n // products.stock. Nenhuma dessas escritas passa por um provider daqui, então\n // nada invalida o cache delas: a Lista de produtos seguia mostrando o valor\n // anterior até alguém recarregar a página à mão.\n //\n // emitDataChanged invalida o cache da tabela nomeada E avisa quem a estiver\n // renderizando, então uma chamada por tabela afetada é o que fecha a volta.\n // As quatro são batidas numa só rajada (o bus acumula por 120ms).\n for (const table of [\n 'plg_shop_products', // a Lista, e é a que o usuário estava vendo\n 'plg_shop_product_variants', // a matriz de variantes\n // O saldo mudou de livro: quem move o número agora é o razão do\n // plugin-inventory, e o saldo compartilhado é `public.stock_balances`.\n // Invalidar a tabela antiga deixava as Posições mostrando o valor anterior\n // até alguém recarregar — o cache apontando para onde ninguém mais escreve.\n 'stock_balances', // as Posições\n 'plg_inventory_stock_movements', // o histórico de movimentos\n 'products', // o arquétipo, que as telas de Estoque leem\n ]) {\n emitDataChanged({ table, op: 'update' })\n }\n\n return {\n ok: true,\n movementId: movement.id,\n kind: plan.kind,\n quantity: plan.quantity,\n reasonCode: plan.reasonCode,\n available: await store.getAvailable(args.variantId),\n }\n}\n\nexport interface StockAgentDeps {\n getProvider: () => ShopProvider\n onChanged?: () => void\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\n/**\n * O razão desta loja.\n *\n * Mesma resolução que `setVariantStock` faz do outro lado: o mapa de override\n * primeiro (um ERP que assumiu o estoque), a implementação Supabase depois. Sem\n * tenant resolvido a chave é '' — nenhum override é registrado sob branco, então\n * cai no padrão em vez de encontrar o razão de outra pessoa.\n */\nconst stockStore = () => resolveStockStore(getActiveTenantId() ?? '', () => createSupabaseStockStore())\n\n/** Saldo somado, e o mesmo saldo aberto por local — que é a pergunta real. */\nfunction summarize(balances: StockBalance[], locations: StockLocation[]) {\n const nameOf = (id: string) => locations.find((l: StockLocation) => l.id === id)?.name ?? id\n const total = balances.reduce(\n (acc, b) => ({\n onHand: acc.onHand + b.onHand,\n reserved: acc.reserved + b.reserved,\n available: acc.available + b.available,\n }),\n { onHand: 0, reserved: 0, available: 0 },\n )\n const byLocation = new Map<string, { location: string; onHand: number; available: number }>()\n for (const b of balances) {\n const row = byLocation.get(b.locationId)\n ?? { location: nameOf(b.locationId), onHand: 0, available: 0 }\n row.onHand += b.onHand\n row.available += b.available\n byLocation.set(b.locationId, row)\n }\n return { total, byLocation: [...byLocation.values()] }\n}\n\nexport function createStockAgentTools({ getProvider, onChanged }: StockAgentDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => (\n isLedgerMissing(error)\n ? { ok: false, error: 'ledger_not_installed', message: LEDGER_MISSING_MESSAGE }\n : { ok: false, error: errorMessage(error) }\n )\n\n /** As variantes vendáveis de um produto — o razão fala em variante, o lojista em produto. */\n const variantsOf = async (product: Product): Promise<string[]> => {\n try {\n const set = await getProvider().getProductVariants?.(product.id)\n const ids = (set?.variants ?? []).map((v) => v.id)\n if (ids.length > 0) return ids\n } catch {\n /* catálogo sem tabela de variação é o caso comum */\n }\n return []\n }\n\n return [\n {\n tool: WHERE_IS,\n execute: async (args) => {\n const term = text(args.term)\n if (!term) return { ok: false, error: 'no_term' }\n try {\n const catalog = await listProductsCached(getProvider, { status: 'active', limit: 500 })\n const answer = resolveTerm(term, catalog)\n if (!answer.resolved) {\n if (!answer.options?.length) return { ok: true, term, notFound: true }\n return {\n ok: true,\n kind: 'record_choice',\n choices: [{\n id: 'stock-product',\n question: `Qual \"${term}\"?`,\n options: answer.options.map((c) => ({ id: c.productId, label: c.name, meta: candidateMeta(c) })),\n }],\n term,\n needsChoice: true,\n }\n }\n\n const product = catalog.find((p) => p.id === answer.resolved!.productId)!\n const variantIds = await variantsOf(product)\n const store = stockStore()\n const [balances, locations] = await Promise.all([\n store.listBalances(variantIds.length > 0 ? { variantIds } : {}),\n store.listLocations(),\n ])\n const mine = variantIds.length > 0\n ? balances\n : balances.filter(() => false)\n const { total, byLocation } = summarize(mine, locations)\n return {\n ok: true,\n product: { productId: product.id, name: product.name, sku: product.sku },\n // A variante é o que o lançamento precisa; sem ela o razão não tem\n // onde postar, e é melhor dizer isso do que gravar no lugar errado.\n variantId: variantIds[0] ?? null,\n variants: variantIds,\n total,\n byLocation,\n locations: locations.map((l: StockLocation) => ({ locationId: l.id, name: l.name, isDefault: l.isDefault })),\n }\n } catch (error) {\n return failed(error)\n }\n },\n },\n {\n tool: RECORD,\n execute: async (args) => {\n const variantId = text(args.variantId)\n if (!variantId) return { ok: false, error: 'no_variant', message: 'Preciso da variante — pergunte a posição primeiro.' }\n try {\n const answer = await commitMovement({\n variantId,\n movementType: text(args.movementType),\n quantity: Number(args.quantity),\n reasonCode: text(args.reasonCode) || undefined,\n locationId: text(args.locationId) || undefined,\n note: text(args.note) || undefined,\n occurredAt: text(args.occurredAt) || undefined,\n })\n if (answer.ok) onChanged?.()\n return answer\n } catch (error) {\n return failed(error)\n }\n },\n },\n ]\n}\n\nexport const STOCK_INSTRUCTIONS = `\nEsta tela é o estoque da loja. O lojista lança o que entrou e o que saiu, e pergunta onde estão as coisas.\n\n· \"Cadê minha costela\", \"quanto tem de X\": \\`getStockPosition\\` com as palavras dele. Ela resolve o produto sozinha e devolve o saldo por local. Responda com o número e o local, uma linha.\n· Lançar entrada ou saída: pegue o \\`variantId\\` na posição e chame \\`recordStockMovement\\`. Quantidade sempre positiva — o sinal é do razão, não seu.\n· A espécie vem do que ele disse: \"chegaram 20\" é entrada, \"quebrou 3\" é perda com razão \\`breakage\\`, \"vencerem 2\" é perda com \\`expiry\\`, \"contei e tem 18\" é ajuste.\n· A nota de sexta lançada na segunda: se ele disser QUANDO chegou, mande em \\`occurredAt\\`. Sem isso o razão registra hoje, e o custo cai no mês errado.\n· O razão não se edita. Errou, lança o movimento contrário — nunca prometa \"corrigir\" o lançamento.\n· Nunca invente produto nem variante. Termo ambíguo já virou pergunta com botões: não repita as opções no texto.\n`.trim()\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n Button, Modal, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, toast, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@fayz-ai/ui'\nimport { Plus, WandSparkles } from 'lucide-react'\nimport {\n DetailTabHeader, askAI, useAgentSurface,\n type AgentSurfaceContribution, type AskAIIntro,\n} from '@fayz-ai/admin'\nimport { getActiveTenantId } from '@fayz-ai/core'\nimport {\n createSupabaseStockStore, listStockReasonCodes, resolveStockStore,\n type StockBalance, type StockLocation, type StockMovement, type StockReasonCode,\n} from '@fayz-ai/shop/inventory'\nimport type { Product, ProductVariant, ShopProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport {\n commitMovement, createStockAgentTools, isLedgerMissing,\n LEDGER_MISSING_MESSAGE, occurredAtFor, STOCK_INSTRUCTIONS,\n} from './stock-agent'\n\n// ---------------------------------------------------------------------------\n// Posições — onde estão as unidades deste produto, e a entrada sem sair daqui.\n//\n// A ficha do produto mostrava UM número, o `inventoryCount`, e ele não responde\n// a pergunta que se faz de verdade: quantas na loja, quantas no depósito, e\n// quantas já estão prometidas a um pedido que ninguém enviou. São coisas\n// diferentes e o razão sabe as três desde a 0034.\n//\n// O lançamento aqui passa por `commitMovement`, o MESMO caminho do agente: a\n// regra de sinal, a guarda de saldo negativo e a razão que decide a espécie\n// existem uma vez só. Dois caminhos seriam duas opiniões sobre o sinal, e elas\n// divergem na primeira vez que alguém mexe num.\n// ---------------------------------------------------------------------------\n\nconst stockStore = () => resolveStockStore(getActiveTenantId() ?? '', () => createSupabaseStockStore())\n\n/** Os quatro verbos, na ordem em que se usam. Entrada é o comum e abre escolhida. */\nconst MOVEMENT_TYPES: ReadonlyArray<{ value: string; label: string }> = [\n { value: 'entrada', label: 'Entrada' },\n { value: 'saida', label: 'Saída' },\n { value: 'ajuste', label: 'Ajuste' },\n { value: 'perda', label: 'Perda' },\n]\n\n/** A espécie do razão que cada verbo alcança — só para filtrar as razões. */\nconst KIND_FOR: Record<string, string> = {\n entrada: 'receipt', saida: 'adjustment', ajuste: 'adjustment', perda: 'loss',\n}\n\nconst todayISO = () => new Date().toISOString().slice(0, 10)\n\nconst field = 'mt-1 px-2.5'\n// Radix Select reserves the empty string for \"nothing chosen\".\nconst DEFAULT_REASON = '__default__'\n\n/** O convite da porta \"Lançar com IA\", dito para quem está com a nota na mão. */\nconst STOCK_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Estoquista',\n pitch: 'Diga o que entrou ou saiu que eu lanço.',\n description:\n 'Lanço entrada, saída, ajuste ou perda no razão deste produto, e respondo quanto tem e onde. '\n + 'Você confirma antes de gravar.',\n suggestions: [\n { label: 'Chegaram 20 unidades' },\n { label: 'Quebraram 2' },\n ],\n}\n\nexport function ProductPositionsTab({ item, getProvider }: {\n item: unknown\n getProvider: () => ShopProvider\n}) {\n const product = item as Product\n const [variants, setVariants] = useState<ProductVariant[]>([])\n const [balances, setBalances] = useState<StockBalance[]>([])\n const [locations, setLocations] = useState<StockLocation[]>([])\n const [movements, setMovements] = useState<StockMovement[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const [variantId, setVariantId] = useState<string>('')\n /** null = fechado. Abrir JÁ escolhe a espécie, então a pergunta que sobra é\n * quantas — que é a única que só o lojista sabe. */\n const [type, setType] = useState<string | null>(null)\n const [quantity, setQuantity] = useState<string>('')\n const [reasonCode, setReasonCode] = useState<string>('')\n const [note, setNote] = useState('')\n const [noteOpen, setNoteOpen] = useState(false)\n /** A nota de sexta lançada na segunda: o razão separa QUANDO a mercadoria se\n * moveu de quando alguém digitou (occurred_at × created_at desde a 0034), e\n * sem expor isso o custo cai no mês errado. */\n const [occurredOn, setOccurredOn] = useState<string>(() => todayISO())\n const [saving, setSaving] = useState(false)\n const quantityRef = React.useRef<HTMLInputElement>(null)\n\n const load = useCallback(async () => {\n setLoading(true)\n try {\n const set = await getProvider().getProductVariants?.(product.id)\n const list = set?.variants ?? []\n setVariants(list)\n const ids = list.map((v) => v.id)\n setVariantId((current) => current || ids[0] || '')\n\n const store = stockStore()\n const [b, l] = await Promise.all([\n ids.length > 0 ? store.listBalances({ variantIds: ids }) : Promise.resolve([]),\n store.listLocations(),\n ])\n setBalances(b)\n setLocations(l)\n setMovements(ids[0] ? await store.listMovements({ variantId: ids[0], limit: 10 }) : [])\n setError(null)\n } catch (err: unknown) {\n setError(isLedgerMissing(err) ? LEDGER_MISSING_MESSAGE : errorMessage(err))\n } finally {\n setLoading(false)\n }\n }, [getProvider, product.id])\n\n useEffect(() => { void load() }, [load])\n\n const nameOf = useCallback(\n (id: string) => locations.find((l) => l.id === id)?.name ?? id,\n [locations],\n )\n\n const rows = useMemo(() => {\n const mine = variantId ? balances.filter((b) => b.variantId === variantId) : balances\n return mine.map((b) => ({\n key: b.id,\n location: nameOf(b.locationId),\n onHand: b.onHand,\n reserved: b.reserved,\n available: b.available,\n }))\n }, [balances, variantId, nameOf])\n\n const total = useMemo(\n () => rows.reduce(\n (acc, r) => ({\n onHand: acc.onHand + r.onHand,\n reserved: acc.reserved + r.reserved,\n available: acc.available + r.available,\n }),\n { onHand: 0, reserved: 0, available: 0 },\n ),\n [rows],\n )\n\n const reasons = useMemo<StockReasonCode[]>(\n () => listStockReasonCodes().filter(\n (r: StockReasonCode) => !r.movementKind || r.movementKind === KIND_FOR[type ?? 'entrada'],\n ),\n [type],\n )\n\n // A razão escolhida para \"perda\" não faz sentido em \"entrada\": trocar o verbo\n // sem soltar a razão mandaria ao razão um par que ele recusa.\n useEffect(() => { setReasonCode('') }, [type])\n\n /** Abrir é escolher a espécie e já estar com o cursor no número. */\n const open = (next: string) => {\n setType(next)\n setQuantity('')\n setNote('')\n setNoteOpen(false)\n setOccurredOn(todayISO())\n // Depois do render, senão o input ainda não existe.\n window.setTimeout(() => quantityRef.current?.focus(), 0)\n }\n const close = () => {\n setType(null); setQuantity(''); setNote(''); setNoteOpen(false); setOccurredOn(todayISO())\n }\n\n // O resultado ANTES de gravar: \"32 → 52\". Um saldo que só aparece depois faz\n // o lojista lançar, conferir, e desfazer com o movimento contrário.\n const amount = Math.abs(Number(quantity) || 0)\n const outgoing = type === 'saida' || type === 'perda'\n const nextBalance = amount > 0\n ? (outgoing ? total.available - amount : total.available + amount)\n : null\n\n // O produto aberto, entregue ao assistente enquanto esta aba estiver montada.\n // As ferramentas são as mesmas do razão; o que a aba acrescenta é QUAL\n // produto está na tela, para \"chegaram 20\" não precisar dizer de quê.\n const live = React.useRef({ product, variantId, total, getProvider, load })\n live.current = { product, variantId, total, getProvider, load }\n const contribution = useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.product.positions',\n pluginId: 'shop',\n role: 'operations',\n instructions: STOCK_INSTRUCTIONS,\n describe: () => {\n const o = live.current\n return {\n title: `Estoque — ${o.product.name}`,\n record: { entity: 'shop_product', id: o.product.id, label: o.product.name },\n state: {\n screen: '/products/:id#posicoes',\n productId: o.product.id,\n productName: o.product.name,\n variantId: o.variantId || null,\n onHand: o.total.onHand,\n reserved: o.total.reserved,\n available: o.total.available,\n },\n }\n },\n tools: createStockAgentTools({\n getProvider: () => live.current.getProvider(),\n onChanged: () => { void live.current.load() },\n }),\n }), [])\n useAgentSurface(contribution)\n\n const submit = async () => {\n if (!variantId || !type) return\n const amount = Number(quantity)\n if (!amount) { toast.error('Diga quantas unidades.'); return }\n setSaving(true)\n try {\n const answer = await commitMovement({\n variantId,\n movementType: type,\n quantity: amount,\n reasonCode: reasonCode || undefined,\n note: note.trim() || undefined,\n occurredAt: occurredAtFor(occurredOn, todayISO()),\n })\n if (!answer.ok) { toast.error(answer.message ?? answer.error); return }\n toast.success(`Lançado. Saldo agora: ${answer.available}.`)\n close()\n await load()\n } catch (err: unknown) {\n toast.error(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n // Esqueleto, não frase. Uma linha \"Carregando…\" empurra o conteúdo quando\n // ele chega; o esqueleto já reserva o lugar dele (CLS zero) e diz a FORMA do\n // que vem — cabeçalho, posições, lançamento.\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"space-y-2\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-64 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"h-9 w-32 animate-pulse rounded-md bg-muted\" />\n </div>\n <ul className=\"space-y-2\">\n {[0, 1].map((i) => (\n <li key={i} className=\"flex items-center gap-3 rounded-card border bg-card p-3\">\n <div className=\"h-4 flex-1 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-12 animate-pulse rounded bg-muted\" />\n </li>\n ))}\n </ul>\n </div>\n )\n }\n\n if (error) {\n // A falta do razão não é um defeito desta tela, e pintá-la de vermelho de\n // erro faz o lojista abrir um chamado por uma migration que não rodou.\n const missing = error === LEDGER_MISSING_MESSAGE\n return (\n <p className={missing\n ? 'rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground'\n : 'rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive'}>\n {error}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Mesmo cabeçalho de Fotos e Variantes: o que é à esquerda, o que se\n acrescenta à direita. As três abas do produto passam a ter uma porta\n só, no mesmo lugar. */}\n <DetailTabHeader\n title=\"Estoque do produto\"\n description={\n <>\n <span className=\"tabular-nums\">{total.onHand}</span> em mãos ·{' '}\n <span className=\"tabular-nums\">{total.reserved}</span> reservado para pedidos ·{' '}\n <span className=\"font-medium tabular-nums text-foreground\">{total.available}</span> disponível.\n O razão não se edita: um erro se corrige com o movimento contrário.\n </>\n }\n actions={variantId && (\n <>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => askAI({\n intro: STOCK_INTRO,\n hint: 'O que entrou ou saiu…',\n draft: `Entrada de unidades de ${product.name}`,\n })}\n >\n <WandSparkles className=\"mr-1.5 h-3.5 w-3.5\" />\n Com IA\n </Button>\n <Button onClick={() => open('entrada')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Dar entrada\n </Button>\n </>\n )}\n />\n\n {!variantId && (\n // Nunca desabilitar um botão sem dizer por quê. Sem variante o razão não\n // tem onde postar, e um \"Lançar\" apagado sem explicação faz o lojista\n // clicar três vezes e concluir que a tela está quebrada.\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Este produto ainda não tem uma variante para o estoque apontar.\n Crie uma em <span className=\"font-medium text-foreground\">Variantes</span> e volte aqui.\n </p>\n )}\n\n {variants.length > 1 && (\n <label className=\"block max-w-xs\">\n <span className=\"text-xs font-medium text-muted-foreground\">Variante</span>\n <Select value={variantId} onValueChange={setVariantId}>\n <SelectTrigger className={field}><SelectValue /></SelectTrigger>\n <SelectContent>\n {variants.map((v) => (\n <SelectItem key={v.id} value={v.id}>\n {Object.values(v.options ?? {}).join(' · ') || v.sku || v.id.slice(0, 8)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n )}\n\n {/* The form is a MODAL, not a card that pushes the page down. Lançar um\n movimento is a decision about the list you are looking at — the list\n should still be there behind it, and closing should not leave the page\n somewhere else than it started. */}\n <Modal open={type !== null} onOpenChange={(o: boolean) => { if (!o) close() }}>\n <ModalContent className=\"sm:max-w-lg\">\n <ModalHeader>\n <ModalTitle>Lançar movimento</ModalTitle>\n <ModalDescription>\n O razão não se edita: um erro se corrige com o movimento contrário.\n </ModalDescription>\n </ModalHeader>\n <div className=\"p-1\">\n {/* Entrada é o caso comum e já vem escolhida; os outros três verbos\n ficam aqui dentro, um toque adiante, em vez de disputarem o\n cabeçalho com a ação principal. */}\n <div className=\"flex flex-wrap gap-1\">\n {MOVEMENT_TYPES.map((t) => (\n <Button variant=\"bare\" size=\"bare\"\n key={t.value}\n type=\"button\"\n onClick={() => setType(t.value)}\n className={`fz-tap rounded-button px-3 py-1.5 text-xs font-medium transition-colors ${\n type === t.value\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {t.label}\n </Button>\n ))}\n </div>\n\n {/* Every field in this modal stacks label over control. Quantidade used\n to sit on ONE row with its label to the left and the running\n balance beside it — three things on a baseline, in a column the\n other two fields do not share. Same shape as the rest now, and the\n balance became the field's hint, which is what it is. */}\n <div className=\"mt-3 space-y-3\">\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Quantidade</span>\n <Input\n ref={quantityRef}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); void submit() }\n if (e.key === 'Escape') { e.preventDefault(); close() }\n }}\n placeholder=\"0\"\n className={`${field} font-semibold tabular-nums`}\n />\n {/* A consequência, enquanto ele digita. */}\n <span aria-live=\"polite\" className=\"mt-1 block text-xs text-muted-foreground\">\n {nextBalance === null ? (\n <>Fica em <span className=\"font-medium tabular-nums text-foreground\">{total.available}</span></>\n ) : (\n <>\n <span className=\"tabular-nums\">{total.available}</span>\n <span className=\"mx-1.5\">→</span>\n <span className={`text-base font-semibold tabular-nums ${nextBalance < 0 ? 'text-destructive' : 'text-foreground'}`}>\n {nextBalance}\n </span>\n {nextBalance < 0 && <span className=\"ml-2 text-destructive\">não há tudo isso</span>}\n </>\n )}\n </span>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Motivo</span>\n <Select value={reasonCode || DEFAULT_REASON} onValueChange={(v) => setReasonCode(v === DEFAULT_REASON ? '' : v)}>\n <SelectTrigger className={field}><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={DEFAULT_REASON}>Padrão</SelectItem>\n {reasons.map((r) => <SelectItem key={r.key} value={r.key}>{r.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </label>\n\n <label className=\"block\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {type === 'entrada' ? 'Chegou em' : 'Quando'}\n </span>\n <Input\n type=\"date\"\n value={occurredOn}\n max={todayISO()}\n onChange={(e) => setOccurredOn(e.target.value || todayISO())}\n className={field}\n />\n </label>\n </div>\n\n {noteOpen ? (\n <label className=\"mt-3 block\">\n <span className=\"text-xs font-medium text-muted-foreground\">Observação</span>\n <Input\n autoFocus\n value={note}\n onChange={(e) => setNote(e.target.value)}\n className={field}\n placeholder=\"Nota fiscal, quem entregou…\"\n />\n </label>\n ) : (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setNoteOpen(true)}\n className=\"mt-2 text-xs font-medium text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n + observação\n </Button>\n )}\n\n </div>\n\n <ModalFooter>\n {amount === 0 && (\n // O motivo de o botão estar apagado, ao lado dele.\n <span className=\"mr-auto text-xs text-muted-foreground\">Diga quantas unidades</span>\n )}\n <Button variant=\"ghost\" onClick={close} disabled={saving}>Cancelar</Button>\n <Button onClick={() => void submit()} disabled={saving || amount === 0}>\n {saving ? 'Lançando…' : 'Lançar'}\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n\n {variantId && (rows.length === 0 ? (\n <p className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n Nenhuma posição ainda — a primeira entrada abre o saldo.\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {rows.map((r) => (\n <li key={r.key} className=\"flex items-center gap-3 rounded-card border bg-card p-3\">\n <span className=\"flex-1 text-sm font-medium\">{r.location}</span>\n <span className=\"text-xs text-muted-foreground\">{r.reserved} reservado</span>\n <span className=\"w-16 text-right text-sm font-semibold tabular-nums\">{r.available}</span>\n </li>\n ))}\n </ul>\n ))}\n\n {movements.length > 0 && (\n <section className=\"space-y-2 pt-2\">\n <h3 className=\"text-sm font-semibold\">Últimos movimentos</h3>\n <ul className=\"space-y-2\">\n {movements.map((m) => (\n <li key={m.id} className=\"flex items-center gap-3 rounded-card border bg-card px-3 py-2\">\n <span className={`w-14 text-sm font-semibold tabular-nums ${m.quantity < 0 ? 'text-destructive' : 'text-emerald-700'}`}>\n {m.quantity > 0 ? `+${m.quantity}` : m.quantity}\n </span>\n <span className=\"flex-1 text-sm\">{m.reasonCode ?? m.kind}</span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(m.occurredAt ?? m.createdAt).toLocaleDateString('pt-BR')}\n </span>\n </li>\n ))}\n </ul>\n </section>\n )}\n </div>\n )\n}\n","/** The Entrega settings tab id, as the manifest declares it. */\nexport const SHIPPING_SETTINGS_TAB = 'shop-shipping'\n\nexport const SHIPPING_SETTINGS_ROUTE = `/settings/${SHIPPING_SETTINGS_TAB}`\n\n/** The shell's own prefix for a registry inside a plugin settings tab. */\nconst PROPERTIES = '_properties'\n\nexport function shippingRegistryPath(registryId: string): string {\n return `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/${registryId}`\n}\n\n/**\n * Straight to the form of ONE record.\n *\n * A summary row that names a place and then lands on the list of places makes\n * the reader find it again, open it, and click \"editar\" — three steps to reach\n * what the row was already pointing at.\n */\nexport function shippingRecordPath(registryId: string, recordId: string, mode: 'view' | 'edit' = 'edit'): string {\n const base = `${shippingRegistryPath(registryId)}/${recordId}`\n return mode === 'edit' ? `${base}/edit` : base\n}\n\n/**\n * The registry the URL is asking for, or null for the tab's summary.\n *\n * Returns the raw id rather than validating against a list — the registry lookup\n * is the only list, and a second one here is what drifted when `zonas` was\n * renamed.\n */\nexport function shippingRegistryIdFromHash(hash?: string): string | null {\n const raw = hash ?? (typeof window === 'undefined' ? '' : window.location.hash)\n const path = raw.startsWith('#') ? raw.slice(1) : raw\n const marker = `${SHIPPING_SETTINGS_ROUTE}/${PROPERTIES}/`\n if (!path.startsWith(marker)) return null\n return path.slice(marker.length).split('/')[0] || null\n}\n","import React from 'react'\nimport { errorMessage } from '../settings/error-message'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingPackage, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo, CrudFormPage } from '@fayz-ai/admin'\nimport { resolveDataProvider } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { Box, ChevronDown, Plus } from 'lucide-react'\nimport { Button, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody } from '@fayz-ai/ui'\nimport { packageMeasureLabel, packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\nconst PACKAGES_ROUTE = shippingRegistryPath(PACKAGES_REGISTRY)\n\n/**\n * Em que embalagem ESTE produto vai.\n *\n * A lista de embalagens da loja é a fonte (Configurações → Entrega →\n * Embalagens); aqui o produto só aponta para uma linha dela. Foi a correção do\n * founder sobre o Shopify: lá o produto se ASSOCIA a uma embalagem já\n * cadastrada, em vez de repetir altura e largura no cadastro de cada item — o\n * que ele escolhe não é uma medida, é o pacote em que a loja despacha.\n *\n * Vazio = «padrão da loja», que é um estado legítimo e o de toda loja no dia\n * seguinte à 0046. Não é «não preenchido».\n */\nexport function PackageSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingPackage[] | null>(null)\n const [open, setOpen] = React.useState(false)\n const [creating, setCreating] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n const load = React.useCallback(() => {\n if (typeof shop.listShippingPackages !== 'function') { setRows([]); return }\n void shop.listShippingPackages().then(setRows).catch(() => setRows([]))\n }, [shop])\n\n React.useEffect(load, [load])\n\n React.useEffect(() => {\n if (!open) return\n const away = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', away)\n return () => document.removeEventListener('mousedown', away)\n }, [open])\n\n const selected = (rows ?? []).find((row) => row.id === value) ?? null\n const storeDefault = (rows ?? []).find((row) => row.isDefault) ?? null\n\n const label = selected\n ? `${selected.name} — ${packageMeasureLabel(selected)}`\n : storeDefault\n ? `Padrão da loja • ${storeDefault.name} — ${packageMeasureLabel(storeDefault)}`\n : 'Padrão da loja'\n\n return (\n <div className=\"relative\" ref={ref}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"font-normal justify-start whitespace-normal flex h-9 w-full items-center gap-2 rounded-input border border-input bg-background px-3 text-left text-sm shadow-sm\"\n >\n <Box className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n\n {open && (\n <div className=\"absolute z-30 mt-1 w-full overflow-hidden rounded-lg border bg-popover shadow-lg\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { setOpen(false); setCreating(true) }}\n className=\"font-normal justify-start rounded-none whitespace-normal flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-primary hover:bg-muted\"\n >\n <Plus className=\"h-4 w-4\" /> Adicionar embalagem\n </Button>\n <div className=\"max-h-64 overflow-y-auto border-t\">\n <Option\n label=\"Padrão da loja\"\n hint={storeDefault ? packageMeasureLabel(storeDefault) : 'Nenhuma marcada — cai no piso da transportadora.'}\n active={value == null}\n onClick={() => { onChange(null); setOpen(false) }}\n />\n {(rows ?? []).map((row) => (\n <Option\n key={row.id}\n label={row.name}\n hint={packageMeasureLabel(row)}\n active={row.id === value}\n onClick={() => { onChange(row.id); setOpen(false) }}\n />\n ))}\n </div>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { setOpen(false); adminNavigateTo(PACKAGES_ROUTE) }}\n className=\"font-normal justify-start rounded-none whitespace-normal w-full border-t px-3 py-2 text-left text-xs text-muted-foreground hover:bg-muted\"\n >\n Gerenciar embalagens\n </Button>\n </div>\n )}\n\n {creating && (\n <NewPackageModal\n onClose={() => setCreating(false)}\n onCreated={(id) => { setCreating(false); onChange(id); load() }}\n />\n )}\n </div>\n )\n}\n\n/**\n * Cadastrar uma caixa sem sair do produto.\n *\n * Monta o MESMO EntityDef do registry no `CrudFormPage` genérico e grava pelo\n * MESMO provider — não é um formulário paralelo com os mesmos seis campos\n * digitados de novo, que é como duas telas para uma tabela começam a discordar\n * sobre o que é obrigatório.\n */\nfunction NewPackageModal({ onClose, onCreated }: {\n onClose: () => void\n onCreated: (id: string) => void\n}) {\n const [error, setError] = React.useState<string | null>(null)\n const provider = React.useMemo(\n () => resolveDataProvider(packagesRegistry.entity as EntityDef<{ id: string }>),\n [],\n )\n\n // Pelo Modal da SDK, e não por uma caixa `fixed` solta: o formulário agora\n // mede a PRÓPRIA largura (container query), e um `fixed` dentro dele passaria\n // a cobrir só a coluna do formulário em vez da tela.\n return (\n <Modal open onOpenChange={(next) => { if (!next) onClose() }}>\n <ModalContent size=\"2xl\">\n <ModalHeader>\n <ModalTitle>Nova embalagem</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"space-y-3\">\n {error && <p className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-xs text-destructive\">{error}</p>}\n <CrudFormPage\n entityDef={packagesRegistry.entity as EntityDef}\n mode=\"create\"\n namePlural=\"Embalagens\"\n embedded\n onCancel={onClose}\n onSubmit={async (data) => {\n try {\n const created = await provider.create(data as never)\n onCreated((created as { id: string }).id)\n } catch (e) {\n setError(errorMessage(e))\n }\n }}\n />\n </ModalBody>\n </ModalContent>\n </Modal>\n )\n}\n\nfunction Option({ label, hint, active, onClick }: {\n label: string\n hint: string\n active: boolean\n onClick: () => void\n}) {\n return (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onClick}\n className={`font-normal justify-start items-stretch gap-0 rounded-none whitespace-normal flex w-full flex-col px-3 py-2 text-left hover:bg-muted ${active ? 'bg-muted/60' : ''}`}\n >\n <span className=\"text-sm\">{label}</span>\n <span className=\"text-xs text-muted-foreground\">{hint}</span>\n </Button>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile, ShopProvider } from '@fayz-ai/shop'\nimport { adminNavigateTo } from '@fayz-ai/admin'\nimport { ExternalLink } from 'lucide-react'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\nimport { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\n\n// Radix Select reserves the empty string for \"nothing chosen\".\nconst GENERAL = '__general__'\n\n/**\n * Which zones this product ships through — it points at an existing profile, the\n * way it points at a package. Empty is the general profile, a real state, which\n * is why the empty option is named rather than blank.\n */\nexport function ShippingProfileSelect({ value, onChange, getProvider }: {\n value: string | null\n onChange: (next: string | null) => void\n getProvider?: () => ShopProvider\n}) {\n const shop = React.useMemo(() => getProvider?.() ?? getShopProvider(), [getProvider])\n const [rows, setRows] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n if (typeof shop.listShippingProfiles !== 'function') { setRows([]); return }\n void shop.listShippingProfiles()\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [shop])\n\n const custom = (rows ?? []).filter((row) => !row.isDefault)\n const chosen = custom.find((row) => row.id === value) ?? null\n\n return (\n <div className=\"space-y-1.5\">\n <Select value={value ?? GENERAL} onValueChange={(v) => onChange(v === GENERAL ? null : v)} disabled={rows == null}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value={GENERAL}>Geral — as zonas normais da loja</SelectItem>\n {custom.map((row) => (\n <SelectItem key={row.id} value={row.id}>\n {row.name}\n {row.carrierQuotes === false ? ' — só entrega própria' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <p className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n {chosen?.carrierQuotes === false\n ? 'Este produto não é cotado por transportadora: sai só pelas zonas do perfil.'\n : custom.length === 0\n ? 'Nenhum perfil além do geral.'\n : 'Perfil de entrega deste produto.'}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"inline-flex items-center gap-1 text-xs font-normal text-primary hover:underline\"\n >\n {custom.length === 0 ? 'Criar um perfil' : 'Gerenciar perfis'}\n <ExternalLink className=\"h-3 w-3\" />\n </Button>\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Package } from 'lucide-react'\nimport { Thumbnail } from '@fayz-ai/ui'\nimport type { EntityDef, EntityImageConfig, FieldDef } from '@fayz-ai/core'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { ProductVariantsTab } from './ProductVariantsTab'\nimport { ProductPositionsTab } from './ProductPositionsTab'\nimport { PackageSelect } from './PackageSelect'\nimport { ShippingProfileSelect } from './ShippingProfileSelect'\nimport { formatCurrency } from '@fayz-ai/core'\n\n/** Tudo o que só faz sentido para algo que entra numa caixa. */\nconst physical = (values: Record<string, unknown>) => values.isPhysical !== false\n\n// ---------------------------------------------------------------------------\n// Storefront Product — the single source of truth for the shop product CRUD.\n// Drives the list columns AND the form sections via the generic CRUD scaffolding\n// (createCrudPage → CrudListView + CrudFormPage), same pattern plugin-inventory\n// uses for its ERP product.\n//\n// This is deliberately the STOREFRONT shape (what a shopper sees: name, price,\n// compare-at, images, publication status), not the ERP shape plugin-inventory\n// models (cost, margin, min/max levels). They are different products in\n// different tables — see the shop/inventory bridge note in the roadmap.\n//\n// VARIANTES vivem na aba \"Variantes\" e não aqui: os eixos e a matriz são uma\n// COLEÇÃO derivada do produto, não campos dele, do mesmo jeito que as fotos.\n// (Este cabeçalho dizia \"falta plg_shop_variants\" — as tabelas existem desde a\n// 0028 e a vitrine lê delas desde o M5; o que faltava era a tela.)\n//\n// Not modelled here because the schema has nowhere to put them yet:\n// • SEO title/description — needs columns on plg_shop_products\n// • multi-category — the column is a single category_id\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n archived: 'bg-orange-100 text-orange-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo',\n draft: 'Rascunho',\n archived: 'Arquivado',\n}\n\nfunction money(value: unknown, currency = 'BRL') {\n const n = Number(value)\n if (!Number.isFinite(n)) return '—'\n return formatCurrency(n, currency)\n}\n\n/** `name` → `name-do-produto`, so the storefront URL is filled in for you. */\nexport function slugify(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\n/**\n * Wires the form's image slot to the product's own images. `uploadProductImage`\n * has existed on the provider all along with nothing calling it — the slot was a\n * decorative square, so a product with a photo still showed an empty placeholder.\n */\nfunction productImage(getProvider: () => ShopProvider): EntityImageConfig {\n return {\n get: (row) => {\n const images = (row as Partial<Product>).images\n return images?.find((i) => i.isPrimary)?.url ?? images?.[0]?.url\n },\n upload: async (file, row) => {\n if (!row.id) throw new Error('Salve o produto antes de enviar a imagem.')\n const image = await getProvider().uploadProductImage(row.id, file)\n return image.url\n },\n accept: 'image/*',\n }\n}\n\nexport function buildShopProductEntity(\n currencyCode = 'BRL',\n getProvider?: () => ShopProvider,\n): EntityDef<Product> {\n const fields: FieldDef[] = [\n // — Geral —\n {\n key: 'name', label: 'Nome do produto', type: 'text', required: true,\n group: 'general', placeholder: 'Costela Bovina Defumada 400g',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"flex items-center gap-3\">\n {/* Always the square, photo or not: a product without one used to\n render nothing and pull its name back against the rows that had\n one, so the column stopped reading as a column. */}\n <Thumbnail src={row.images?.[0]?.url} icon={Package} />\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.name}</p>\n {row.sku && <p className=\"text-xs text-muted-foreground\">{row.sku}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'slug', label: 'URL', type: 'text', group: 'general',\n placeholder: 'gerado a partir do nome',\n hint: 'Endereço do produto na loja. Deixe em branco para gerar automaticamente.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'general', span: 2,\n placeholder: 'Como é feito, como preparar, o que acompanha…',\n showInTable: false,\n },\n\n // — Preço —\n {\n key: 'price', label: 'Preço de venda', type: 'currency', required: true,\n group: 'pricing', currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n showInTable: true, sortable: true,\n // O \"de\" riscado vai EMBAIXO do preço em vigor, não ao lado: lado a lado\n // as duas quantias competem na mesma linha e o olho lê a maior primeiro.\n renderCell: (v, row: any) => (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"font-medium\">{money(v, row.currency)}</span>\n {row.compareAtPrice > row.price && (\n <span className=\"text-xs text-muted-foreground line-through\">\n {money(row.compareAtPrice, row.currency)}\n </span>\n )}\n </div>\n ),\n },\n {\n key: 'compareAtPrice', label: 'Preço comparativo', type: 'currency', group: 'pricing',\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Preço \"de\" riscado. Deixe vazio se não estiver em promoção.',\n showInTable: false,\n },\n {\n key: 'discount', label: 'Desconto', type: 'computed', group: 'pricing', showInTable: false,\n compute: (vals) => {\n const price = Number(vals.price) || 0\n const compare = Number(vals.compareAtPrice) || 0\n if (compare <= 0 || price <= 0 || compare <= price) return null\n const pct = ((compare - price) / compare) * 100\n return { display: `-${pct.toFixed(0)}%`, tone: 'positive' }\n },\n },\n\n // — Estoque —\n {\n key: 'sku', label: 'SKU', type: 'text', group: 'inventory',\n placeholder: 'ART-001', searchable: true, showInTable: false,\n },\n // Não se DIGITA saldo.\n //\n // Este campo era um número editável, e um número editável convida a\n // resposta errada: alguém conta a prateleira, acha 18, escreve 18, e o\n // razão perde POR QUE mudou — se chegaram seis ou se sumiram quatro. É\n // exatamente o que um razão existe para impedir, e a 0036 já tratava a\n // escrita direta aqui como um ajuste às cegas para não perder o movimento.\n //\n // Vira reflexo: mostra o saldo, e o ato acontece em Posições, onde ele tem\n // espécie, motivo e data.\n {\n key: 'inventoryCount', label: 'Estoque', type: 'number', group: 'inventory', min: 0,\n // `showInForm: false` e não um campo desabilitado: some do formulário de\n // edição, continua na tabela e na ficha. Mostra-se o saldo; digita-se o\n // movimento.\n showInForm: false,\n hint: 'Saldo do razão. Entrada, saída e perda se lançam na aba Posições.',\n showInTable: true, sortable: true,\n renderCell: (v) => {\n const n = Number(v) || 0\n return (\n <span className={`block text-right ${n === 0 ? 'font-medium text-destructive' : n <= 3 ? 'text-orange-600' : ''}`}>\n {n}\n </span>\n )\n },\n },\n\n // — Publicação —\n {\n key: 'status', label: 'Status', type: 'segmented', required: true,\n group: 'publishing', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Só você vê. Não aparece na loja.' },\n { label: 'Ativo', value: 'active', description: 'Publicado e à venda.' },\n { label: 'Arquivado', value: 'archived', description: 'Fora da loja, histórico preservado.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n {\n key: 'sortOrder', label: 'Ordem na vitrine', type: 'number', group: 'publishing',\n placeholder: '0', hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — Busca (SEO) —\n // A coleção já tinha estes dois; o produto — que é a página onde alguém\n // CAI vindo do Google — não tinha nenhum, então cada página herdava o que\n // a vitrine inventasse a partir do nome.\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o nome do produto.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'O trecho que aparece embaixo do título no Google',\n hint: 'Vazio usa a descrição do produto.',\n showInTable: false,\n },\n\n // — Envio —\n // O desenho é o do Shopify e a ordem importa: o interruptor primeiro, e o\n // resto da seção só existe depois dele. Perguntar altura de um e-book não é\n // um campo extra inofensivo — é um convite a preencher e pagar frete de um\n // download.\n {\n key: 'isPhysical', label: 'Produto físico', type: 'boolean', group: 'shipping', span: 2,\n hint: 'Desmarque para itens digitais. Eles saem do cálculo da caixa e não entram no frete.',\n showInTable: false, defaultValue: true,\n },\n {\n // Antes da embalagem de propósito: o perfil decide POR QUAIS ZONAS o item\n // sai, e a embalagem, em que caixa. A primeira pergunta é a que muda quem\n // pode levar.\n key: 'shippingProfileId', label: 'Perfil de entrega', type: 'custom', group: 'shipping', span: 2,\n hint: 'Por quais zonas este produto sai. \"Geral\" é o de todo produto que ninguém moveu.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <ShippingProfileSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'packageId', label: 'Embalagem', type: 'custom', group: 'shipping', span: 2,\n hint: 'Em que a loja despacha este produto. \"Padrão da loja\" usa a embalagem marcada em Configurações → Entrega.',\n showInTable: false,\n visibleWhen: (values) => values.isPhysical !== false,\n renderInput: ({ value, onChange }) => (\n <PackageSelect\n value={(value as string | null) ?? null}\n onChange={onChange}\n getProvider={getProvider}\n />\n ),\n },\n {\n key: 'weight', label: 'Peso', type: 'number', group: 'shipping', min: 0, placeholder: '0,4',\n hint: 'Do produto, já embalado. As medidas vêm da embalagem escolhida acima.',\n showInTable: false, visibleWhen: (values) => values.isPhysical !== false,\n },\n {\n key: 'weightUnit', label: 'Unidade', type: 'select', group: 'shipping', showInTable: false,\n hint: 'A cotação converte. Até agora ela assumia kg.',\n options: [{ label: 'kg', value: 'kg' }, { label: 'g', value: 'g' }, { label: 'lb', value: 'lb' }],\n visibleWhen: (values) => values.isPhysical !== false,\n },\n // Em centímetros, sem seletor de unidade: a coluna é `*_cm` e a caixa da\n // loja também. Duas unidades para a mesma medida é como o peso passou\n // quatro anos sendo lido errado.\n // A medida é da EMBALAGEM, não do produto.\n //\n // O seletor logo acima já associa o produto a uma embalagem cadastrada da\n // loja (0047) — e é lá que altura, largura e comprimento vivem. Repetir os\n // três aqui pedia a mesma informação duas vezes por caminhos diferentes, e\n // as duas divergiam no dia em que alguém trocasse a caixa: a cotação lê a\n // embalagem, o formulário mostrava outro número.\n //\n // As colunas continuam existindo — um catálogo anterior à 0047 tem produto\n // medido e sem embalagem, e a cotação ainda os lê. O que sai é a pergunta.\n { key: 'heightCm', label: 'Altura (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n { key: 'widthCm', label: 'Largura (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n { key: 'lengthCm', label: 'Comprimento (cm)', type: 'number', group: 'shipping', min: 0, showInForm: false, showInTable: false },\n {\n // Declarado aqui para poder viajar — para a transportadora, para o motoboy\n // ou para quem embala. O que a loja FAZ com um carrinho refrigerado é uma\n // decisão dela, em Configurações → Entrega.\n //\n // `visibleWhen: physical` junto com as medidas, e pelo mesmo motivo: um\n // download não tem caixa, e não há como exigir frio de um arquivo.\n key: 'handling', label: 'Exige cuidado especial', type: 'multiselect', group: 'shipping',\n showInTable: false, visibleWhen: physical,\n hint: 'Vai junto com o pedido para quem entrega. Refrigerado ou congelado também limita como a loja pode enviar.',\n options: [\n { label: 'Refrigerado', value: 'refrigerated' },\n { label: 'Congelado', value: 'frozen' },\n { label: 'Frágil', value: 'fragile' },\n ],\n },\n ]\n\n return {\n name: 'Produto',\n namePlural: 'Produtos',\n icon: 'Package',\n displayField: 'name',\n // Qual tabela esta tela É. Sem isto, `deriveEntityKey` cai no rótulo — e a\n // chave da entidade vira `produto`, que muda com uma tradução. Quem avisa\n // \"escrevi aqui\" nomeia a TABELA (é o que emitDataChanged invalida no cache),\n // então sem esta linha o aviso não encontra a lista: o barramento casa\n // tabela-com-tabela, e o lado do assinante estava vazio.\n //\n // Não muda o caminho do dado: o índice do plugin passa um\n // `dataProvider: createShopProductDataProvider(...)` explícito, que vence o\n // provider genérico que `data.table` acionaria — mesma forma da entidade de\n // cliente logo ao lado.\n data: { table: 'plg_shop_products' },\n fields,\n fieldGroups: [\n // imageSlot renders the scaffolding's image uploader alongside the group.\n { id: 'general', label: 'Informações', columns: 2, imageSlot: true },\n { id: 'pricing', label: 'Preço', description: 'O preço comparativo vira o \"de\" riscado na vitrine.', columns: 3 },\n { id: 'inventory', label: 'Estoque', columns: 2 },\n { id: 'publishing', label: 'Publicação', description: 'Controla se o produto aparece na loja.', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como este produto aparece nos resultados de busca.', columns: 2 },\n {\n id: 'shipping',\n label: 'Envio',\n description:\n 'Em que caixa este produto sai e quanto ele pesa. A medida é da embalagem; o peso é do produto. Sem embalagem escolhida a transportadora é consultada com a caixa padrão da loja, e o frete cotado pode não ser o frete pago.',\n columns: 3,\n },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n image: getProvider ? productImage(getProvider) : undefined,\n // The form's image slot sets the COVER; this tab manages the rest of the\n // gallery. plg_shop_product_images has always held a collection, and until\n // now nothing in the admin could add a second row to it — so the storefront\n // carousel had exactly one slide for every product in the pool.\n detailTabs: getProvider\n ? [\n {\n id: 'images',\n label: 'Fotos',\n icon: 'Image',\n component: ProductImagesTab as never,\n props: { getProvider },\n },\n {\n id: 'variants',\n label: 'Variantes',\n icon: 'Layers',\n component: ProductVariantsTab as never,\n props: { getProvider },\n },\n // Separada de Variantes de propósito: aquela edita O QUE se vende,\n // esta responde ONDE estão as unidades — e a ficha só sabia dizer um\n // número só, que não distingue a loja do depósito nem o que já está\n // prometido a um pedido.\n {\n id: 'positions',\n label: 'Posições',\n icon: 'Boxes',\n component: ProductPositionsTab as never,\n props: { getProvider },\n },\n ]\n : undefined,\n } as EntityDef<Product>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Discount } from '@fayz-ai/shop'\nimport { formatCurrency } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Discount — declarative CRUD, same contract as products and customers.\n//\n// `timesUsed` is read-only: shop_place_order increments it inside the same\n// transaction that validates the coupon, so the admin must never write it.\n//\n// `buy_x_get_y` is deliberately absent from the type options: the enum value\n// exists in the database but shop_place_order records the code and applies no\n// monetary effect (0003:116), so offering it would create coupons that silently\n// do nothing.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n draft: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nexport function buildShopDiscountEntity(): EntityDef<Discount> {\n const fields: FieldDef[] = [\n // — Cupom —\n {\n key: 'title', label: 'Nome interno', type: 'text', required: true,\n group: 'coupon', placeholder: 'Bem-vindo 10%',\n hint: 'Só o admin vê. Serve para você identificar a campanha.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium\">{row.title}</p>\n {row.code && <p className=\"font-mono text-xs text-muted-foreground\">{row.code}</p>}\n </div>\n ),\n },\n {\n key: 'code', label: 'Código', type: 'text', group: 'coupon',\n placeholder: 'ARTORIUS10',\n hint: 'O que o cliente digita no carrinho. Maiúsculas e minúsculas não importam.',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'type', label: 'Tipo', type: 'segmented', required: true, group: 'rule', span: 2,\n options: [\n { label: 'Percentual', value: 'percentage', description: 'Desconta uma % do subtotal.' },\n { label: 'Valor fixo', value: 'fixed_amount', description: 'Desconta um valor em reais.' },\n { label: 'Frete grátis', value: 'free_shipping', description: 'Zera o frete do pedido.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const labels: Record<string, string> = {\n percentage: 'Percentual', fixed_amount: 'Valor fixo', free_shipping: 'Frete grátis', buy_x_get_y: 'Leve X pague Y',\n }\n return <span className=\"text-muted-foreground\">{labels[String(v)] ?? String(v)}</span>\n },\n },\n {\n key: 'value', label: 'Valor', type: 'number', group: 'rule', min: 0,\n placeholder: '10',\n hint: 'Percentual: 10 = 10%. Valor fixo: 10 = R$ 10,00. Frete grátis ignora este campo.',\n showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right font-medium\">\n {row.type === 'percentage'\n ? `${row.value}%`\n : row.type === 'free_shipping'\n ? '—'\n : formatCurrency(Number(row.value) || 0, 'BRL')}\n </span>\n ),\n },\n\n // — Limites —\n {\n key: 'minSubtotal', label: 'Pedido mínimo', type: 'currency', group: 'limits', min: 0,\n currency: 'BRL', currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo',\n hint: 'Valor mínimo do pedido para o cupom valer. Deixe vazio para não exigir mínimo.',\n showInTable: false,\n },\n {\n key: 'usageLimit', label: 'Limite de usos', type: 'number', group: 'limits', min: 0,\n placeholder: 'sem limite', hint: 'Deixe vazio para uso ilimitado.', showInTable: false,\n },\n {\n key: 'oncePerCustomer', label: 'Uma vez por cliente', type: 'boolean', group: 'limits',\n hint: 'Só vale para quem se identifica no checkout — compra como visitante não é rastreada.',\n showInTable: false,\n },\n {\n key: 'timesUsed', label: 'Usos', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className=\"block text-right text-muted-foreground\">\n {row.timesUsed}{row.usageLimit ? ` / ${row.usageLimit}` : ''}\n </span>\n ),\n },\n\n // — Vigência —\n { key: 'startsAt', label: 'Início', type: 'date', group: 'schedule', showInTable: false },\n {\n key: 'endsAt', label: 'Fim', type: 'date', group: 'schedule',\n hint: 'Vazio = sem data de expiração.', showInTable: false,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', required: true, group: 'schedule', span: 2,\n options: [\n { label: 'Rascunho', value: 'draft', description: 'Não aceito no carrinho.' },\n { label: 'Ativo', value: 'active', description: 'Valendo agora.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o histórico.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'draft')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.draft}`}>\n {s}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Desconto',\n namePlural: 'Descontos',\n icon: 'Tag',\n displayField: 'title',\n fields,\n fieldGroups: [\n { id: 'coupon', label: 'Cupom', columns: 2 },\n { id: 'rule', label: 'Regra', description: 'O desconto é recalculado no servidor a cada pedido.', columns: 2 },\n { id: 'limits', label: 'Limites de uso', columns: 2 },\n { id: 'schedule', label: 'Vigência', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos' }],\n } as EntityDef<Discount>\n}\n","// ---------------------------------------------------------------------------\n// Cupom criado por conversa.\n//\n// O que faltava não era ferramenta — a lista já empresta seu store ao\n// assistente (CrudAgentSurface). Faltava dizer que o CÓDIGO é dele: sem isso o\n// assistente parava e pedia \"nome interno, código, status\" para um lojista que\n// já tinha respondido \"pode inventar\". Código de cupom é rótulo, não fato; quem\n// pede a promoção não tem opinião sobre ele até ver.\n//\n// A regra de formato não é estética: o código é ditado por telefone, digitado\n// no celular e colado no Instagram. O que sobra disso é A-Z0-9, curto, sem\n// acento e sem nada que se confunda com espaço.\n// ---------------------------------------------------------------------------\n\nexport const DISCOUNT_CREATE_INSTRUCTIONS = `\nEsta lista é a de Descontos da loja. Um registro aqui é um CUPOM que o comprador digita no carrinho.\n\nO código é seu para escrever:\n· Se o lojista não ditar um, invente a partir da campanha: MAIÚSCULAS, só letras A-Z e números, de 4 a 16 caracteres, sem espaço, acento, hífen ou pontuação.\n· Curto e ditável ao telefone. Evite 0/O e 1/I juntos, evite palavra que o comprador precise soletrar.\n· Nunca repita um código que já aparece em \\`taken.code\\`. Se a criação voltar \\`duplicate_value\\`, escolha outro e chame de novo — sem perguntar nada ao lojista.\n· \\`title\\` é o nome interno, só o lojista vê: escreva a campanha em português (\"Frete grátis fim de semana\"), não repita o código.\n\nA regra:\n· \"frete grátis\" → \\`type: free_shipping\\` e SEM \\`value\\` — frete grátis não desconta o subtotal.\n· \"10%\", \"10 por cento\" → \\`type: percentage\\`, \\`value: 10\\`.\n· \"R$ 50\", \"50 reais de desconto\" → \\`type: fixed_amount\\`, \\`value: 50\\`.\n· \"acima de R$ 200\", \"a partir de 200\" → \\`minSubtotal: 200\\`.\n· \"só a primeira compra\", \"uma vez por cliente\" → \\`oncePerCustomer: true\\`.\n· \"os 100 primeiros\" → \\`usageLimit: 100\\`.\n· Prazo vira data em \\`endsAt\\`: \"até o fim dessa semana\" é o domingo desta semana, \"até o fim do mês\" é o último dia do mês. Sem prazo dito, deixe vazio — cupom sem fim é uma escolha, não um esquecimento.\n\nStatus:\n· \\`active\\` por padrão. O lojista está pedindo uma promoção para divulgar hoje; um cupom que nasce dormindo é um cupom que o cliente tenta usar e não funciona.\n· \\`draft\\` só quando ele disser que é para deixar pronto para depois.\n\nO que você NÃO inventa: o tamanho do desconto. Se ele disser \"desconto para clientes VIP\" sem dizer quanto, essa é a única pergunta a fazer — e faça só ela.\n\nDepois de criar, diga em uma linha o código, o efeito e até quando vale, para ele já poder divulgar.\n`.trim()\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Category } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Categoria — onde o produto mora na árvore do catálogo.\n//\n// Uma categoria só, um pai só: é ela que estrutura a navegação da vitrine. Para\n// agrupar produtos de forma editorial (uma vitrine de Natal, os mais vendidos),\n// o que existe é Coleção — o produto entra em quantas quiser.\n//\n// `parentId` fica como texto e não como relação: a lista de categorias é a\n// própria tabela sendo editada, e uma relação declarativa aqui pediria um\n// segundo read-model só para se auto-referenciar.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCategoryEntity(): EntityDef<Category> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Camisetas',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'slug', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'camisetas',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do nome.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'parentId', label: 'Categoria pai', type: 'text', group: 'basic',\n placeholder: 'sem pai — nível principal',\n hint: 'Deixe vazio para uma categoria de primeiro nível.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Descrição opcional',\n showInTable: false,\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro na vitrine.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{Number(v ?? 0)}</span>,\n },\n ]\n\n return {\n name: 'Categoria',\n namePlural: 'Categorias',\n icon: 'FolderTree',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Categoria', columns: 2 },\n ],\n } as EntityDef<Category>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { Collection } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Coleção — agrupamento de merchandising (\"Verão 2026\", \"Mais vendidos\").\n//\n// Não é categoria: a categoria diz onde o produto MORA no catálogo (um pai só,\n// estrutura a navegação); a coleção é um conjunto curado e o produto entra em\n// quantas quiser. Sair de uma coleção não muda nada sobre o que o produto é.\n//\n// `productIds` não aparece no formulário: escolher membros é um multiselect com\n// busca sobre o catálogo, que o EntityDef declarativo não expressa. A associação\n// já está pronta no provider — falta só o campo customizado. Até lá a coluna\n// mostra quantos produtos a coleção tem.\n// ---------------------------------------------------------------------------\n\nexport function buildShopCollectionEntity(): EntityDef<Collection> {\n const fields: FieldDef[] = [\n {\n key: 'title', label: 'Título', type: 'text', required: true, group: 'basic',\n placeholder: 'Verão 2026',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'handle', label: 'Identificador', type: 'text', group: 'basic',\n placeholder: 'verao-2026',\n hint: 'Segmento de URL na vitrine. Deixe vazio para gerar a partir do título.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs text-muted-foreground\">{String(v ?? '')}</span>,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Como esta coleção é apresentada na loja',\n showInTable: false,\n },\n {\n key: 'productIds', label: 'Produtos', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 produto' : `${count} produtos`}\n </span>\n )\n },\n },\n {\n key: 'published', label: 'Publicada', type: 'boolean', group: 'basic',\n hint: 'Coleção despublicada some da vitrine, mas continua aqui.',\n // Rotula os dois estados para as abas do cabeçalho: \"true\"/\"false\" cru\n // seria o que o lojista leria no topo da própria lista.\n options: [\n { value: 'true', label: 'Publicadas' },\n { value: 'false', label: 'Rascunhos' },\n ],\n showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${\n v ? 'bg-emerald-100 text-emerald-800' : 'bg-gray-100 text-gray-700'\n }`}>\n {v ? 'Publicada' : 'Rascunho'}\n </span>\n ),\n },\n {\n key: 'sortOrder', label: 'Ordem', type: 'number', group: 'basic', min: 0,\n hint: 'Menor aparece primeiro.', showInTable: false,\n },\n\n // — SEO —\n {\n key: 'seoTitle', label: 'Título da página', type: 'text', group: 'seo', span: 2,\n placeholder: 'Título exibido nos resultados de busca',\n hint: 'Vazio usa o título da coleção.',\n showInTable: false,\n },\n {\n key: 'seoDescription', label: 'Meta descrição', type: 'textarea', group: 'seo', span: 2,\n placeholder: 'Descreva esta coleção para os buscadores',\n showInTable: false,\n },\n ]\n\n return {\n name: 'Coleção',\n namePlural: 'Coleções',\n icon: 'Layers',\n displayField: 'title',\n defaultSort: 'sortOrder',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Coleção', columns: 2 },\n { id: 'seo', label: 'Busca (SEO)', description: 'Como esta coleção aparece nos resultados de busca.', columns: 2 },\n ],\n // Sem facet de \"publicada\": como booleano ele vira uma tira de abas\n // \"Todas · Sim · Não\", que não diz de QUE é o sim — e uma loja com dez\n // coleções não precisa filtrar por isso; a coluna já mostra o estado.\n\n } as EntityDef<Collection>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { GiftCard } from '@fayz-ai/shop'\nimport { formatCurrency } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Vale-presente — dinheiro já pago que ainda não virou pedido.\n//\n// Dois saldos e não um: `initialBalance` é o valor de face, imutável (a prova\n// de quanto entrou) e `balance` é o que sobrou. Só o saldo restante apagaria o\n// valor emitido no primeiro resgate parcial — e é esse número que conciliação e\n// suporte precisam.\n//\n// `initialBalance` só existe no formulário de criação: mudar o valor de face de\n// um cartão já emitido reescreveria o histórico financeiro. Ajuste depois se\n// faz, é no saldo restante.\n// ---------------------------------------------------------------------------\n\nconst STATUS_TONE: Record<string, string> = {\n active: 'bg-emerald-100 text-emerald-800',\n redeemed: 'bg-gray-100 text-gray-700',\n expired: 'bg-orange-100 text-orange-700',\n disabled: 'bg-red-100 text-red-700',\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n active: 'Ativo', redeemed: 'Resgatado', expired: 'Expirado', disabled: 'Desativado',\n}\n\nexport function buildShopGiftCardEntity(currencyCode = 'BRL'): EntityDef<GiftCard> {\n const money = (v: unknown) => formatCurrency(Number(v) || 0, currencyCode)\n\n const fields: FieldDef[] = [\n {\n key: 'code', label: 'Código', type: 'text', group: 'card', span: 2,\n placeholder: 'gerado automaticamente',\n hint: 'O que o cliente digita no checkout. Deixe vazio para gerar um código.',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"font-mono text-xs font-medium\">{String(v ?? '')}</span>,\n },\n {\n key: 'initialBalance', label: 'Valor', type: 'currency', required: true, group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'Valor de face do cartão. Não muda depois de emitido.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right text-muted-foreground\">{money(v)}</span>,\n },\n {\n key: 'balance', label: 'Saldo', type: 'currency', group: 'card', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n hint: 'O que ainda pode ser gasto. Cai a cada resgate.',\n showInTable: true, sortable: true,\n renderCell: (v) => <span className=\"block text-right font-medium\">{money(v)}</span>,\n },\n {\n key: 'status', label: 'Status', type: 'segmented', group: 'card', span: 2,\n options: [\n { label: 'Ativo', value: 'active', description: 'Aceito no checkout.' },\n { label: 'Desativado', value: 'disabled', description: 'Suspenso sem apagar o saldo.' },\n ],\n showInTable: true, sortable: false,\n renderCell: (v) => {\n const s = String(v ?? 'active')\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${STATUS_TONE[s] ?? STATUS_TONE.active}`}>\n {STATUS_LABEL[s] ?? s}\n </span>\n )\n },\n },\n\n // — Destinatário —\n {\n key: 'customerEmail', label: 'E-mail do destinatário', type: 'email', group: 'recipient',\n placeholder: 'opcional',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'expiresAt', label: 'Validade', type: 'date', group: 'recipient',\n hint: 'Vazio = não expira.', showInTable: false,\n },\n {\n key: 'note', label: 'Observação', type: 'textarea', group: 'recipient', span: 2,\n placeholder: 'Só o admin vê.', showInTable: false,\n },\n ]\n\n return {\n name: 'Vale-presente',\n namePlural: 'Gift Cards',\n icon: 'CreditCard',\n displayField: 'code',\n defaultSort: 'createdAt',\n defaultSortDir: 'desc',\n fields,\n fieldGroups: [\n { id: 'card', label: 'Cartão', columns: 2 },\n { id: 'recipient', label: 'Destinatário', columns: 2 },\n ],\n facets: [{ field: 'status', allLabel: 'Todos', display: 'tabs' }],\n } as EntityDef<GiftCard>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerGroup } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Grupo de clientes — associação MANUAL.\n//\n// O lojista põe e tira gente; a associação é estável e não muda porque o\n// cliente comprou (ou parou de comprar). Para \"todo mundo que gastou mais de\n// X\", o que existe é Segmento — lá a associação é a própria regra.\n//\n// `customerIds` fica fora do formulário: escolher membros é um multiselect com\n// busca sobre a base de clientes, que o EntityDef declarativo não expressa. A\n// associação já está pronta no provider — falta o campo customizado.\n// ---------------------------------------------------------------------------\n\nconst SWATCH: Record<string, string> = {\n slate: 'bg-slate-200 text-slate-800',\n emerald: 'bg-emerald-100 text-emerald-800',\n amber: 'bg-amber-100 text-amber-800',\n rose: 'bg-rose-100 text-rose-800',\n violet: 'bg-violet-100 text-violet-800',\n}\n\nexport function buildShopCustomerGroupEntity(): EntityDef<CustomerGroup> {\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic',\n placeholder: 'Atacado',\n searchable: true, showInTable: true, sortable: true,\n renderCell: (_v, row: any) => (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${SWATCH[row.color] ?? SWATCH.slate}`}>\n {row.name}\n </span>\n ),\n },\n {\n key: 'color', label: 'Cor', type: 'select', group: 'basic',\n options: [\n { value: 'slate', label: 'Neutro' },\n { value: 'emerald', label: 'Verde' },\n { value: 'amber', label: 'Âmbar' },\n { value: 'rose', label: 'Rosa' },\n { value: 'violet', label: 'Violeta' },\n ],\n hint: 'Só para reconhecer o grupo de relance na lista.',\n showInTable: false,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este grupo',\n searchable: true, showInTable: true, sortable: false,\n renderCell: (v) => <span className=\"text-muted-foreground\">{String(v ?? '—')}</span>,\n },\n {\n key: 'customerIds', label: 'Clientes', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (v) => {\n const count = Array.isArray(v) ? v.length : 0\n return (\n <span className=\"block text-right text-muted-foreground\">\n {count === 1 ? '1 cliente' : `${count} clientes`}\n </span>\n )\n },\n },\n ]\n\n return {\n name: 'Grupo',\n namePlural: 'Grupos',\n icon: 'UsersRound',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [{ id: 'basic', label: 'Grupo', columns: 2 }],\n } as EntityDef<CustomerGroup>\n}\n","import React from 'react'\nimport type { EntityDef, FieldDef } from '@fayz-ai/core'\nimport type { CustomerSegment } from '@fayz-ai/shop'\nimport { formatCurrency } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Segmento de clientes — uma REGRA, não uma lista.\n//\n// A associação é recalculada dos números do próprio cliente, então ninguém é\n// \"adicionado\" a um segmento e sair dele não é uma ação. Para uma lista que o\n// lojista controla à mão, o que existe é Grupo.\n//\n// Os critérios são campos explícitos e não um JSON livre: cada um é uma\n// condição que a lista de clientes sabe avaliar, então um segmento salvo sempre\n// tem associação real e conferível.\n// ---------------------------------------------------------------------------\n\n/** Legenda humana da regra — é o que a lista mostra em vez de seis colunas de\n * números soltos que ninguém lê como uma condição. */\nexport function describeSegment(s: Partial<CustomerSegment>, money: (v: number) => string): string {\n const parts: string[] = []\n if (s.minOrders != null && s.maxOrders != null) parts.push(`${s.minOrders}–${s.maxOrders} pedidos`)\n else if (s.minOrders != null) parts.push(`${s.minOrders}+ pedidos`)\n else if (s.maxOrders != null) parts.push(`até ${s.maxOrders} pedidos`)\n\n if (s.minSpent != null && s.maxSpent != null) parts.push(`gastou ${money(s.minSpent)}–${money(s.maxSpent)}`)\n else if (s.minSpent != null) parts.push(`gastou ${money(s.minSpent)}+`)\n else if (s.maxSpent != null) parts.push(`gastou até ${money(s.maxSpent)}`)\n\n if (s.joinedAfter) parts.push(`entrou após ${new Date(s.joinedAfter).toLocaleDateString('pt-BR')}`)\n if (s.joinedBefore) parts.push(`entrou antes de ${new Date(s.joinedBefore).toLocaleDateString('pt-BR')}`)\n\n return parts.length ? parts.join(' · ') : 'Todos os clientes'\n}\n\n/** The row the list actually shows: the stored rule plus how many customers\n * match it right now. `matchCount` is recomputed on every read (see the data\n * provider) — a segment's size is only true when it is derived. */\nexport type CustomerSegmentRow = CustomerSegment & { matchCount: number }\n\nexport function buildShopCustomerSegmentEntity(currencyCode = 'BRL'): EntityDef<CustomerSegmentRow> {\n const money = (v: number) => formatCurrency(v, currencyCode)\n\n const fields: FieldDef[] = [\n {\n key: 'name', label: 'Nome', type: 'text', required: true, group: 'basic', span: 2,\n placeholder: 'Clientes fiéis',\n searchable: true, showInTable: true, sortable: true,\n },\n {\n key: 'description', label: 'Descrição', type: 'textarea', group: 'basic', span: 2,\n placeholder: 'Para que serve este segmento',\n searchable: true, showInTable: false,\n },\n\n // — Regra —\n {\n key: 'minOrders', label: 'Mínimo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxOrders', label: 'Máximo de pedidos', type: 'number', group: 'rule', min: 0,\n placeholder: 'sem máximo', showInTable: false,\n },\n {\n key: 'minSpent', label: 'Gasto mínimo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem mínimo', showInTable: false,\n },\n {\n key: 'maxSpent', label: 'Gasto máximo', type: 'currency', group: 'rule', min: 0,\n currency: currencyCode, currencySymbol: 'R$', currencyLocale: 'pt-BR',\n placeholder: 'sem máximo', showInTable: false,\n },\n { key: 'joinedAfter', label: 'Entrou depois de', type: 'date', group: 'rule', showInTable: false },\n { key: 'joinedBefore', label: 'Entrou antes de', type: 'date', group: 'rule', showInTable: false },\n\n // Coluna derivada: a regra escrita por extenso.\n {\n key: 'minSpent_rule', label: 'Regra', type: 'text',\n showInForm: false, showInTable: true, sortable: false,\n renderCell: (_v, row: any) => (\n <span className=\"text-muted-foreground\">{describeSegment(row, money)}</span>\n ),\n },\n {\n key: 'matchCount', label: 'Clientes', type: 'number',\n showInForm: false, showInTable: true, sortable: true,\n renderCell: (v) => (\n <span className=\"block text-right font-medium\">\n {v == null ? '—' : Number(v)}\n </span>\n ),\n },\n ]\n\n return {\n name: 'Segmento',\n namePlural: 'Segmentos',\n icon: 'Filter',\n displayField: 'name',\n defaultSort: 'name',\n fields,\n fieldGroups: [\n { id: 'basic', label: 'Segmento', columns: 2 },\n {\n id: 'rule', label: 'Regra', columns: 2,\n description: 'Todos os critérios preenchidos valem juntos. Deixe vazio o que não quiser exigir.',\n },\n ],\n } as EntityDef<CustomerSegmentRow>\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateProductInput, Product, UpdateProductInput } from '@fayz-ai/shop'\nimport { slugify } from '../views/productEntity'\nimport { applyQuery, invalidateProductLists, listProductsDetailed, resolve, type ShopProviderResolver } from './shared'\n\nexport type { ShopProviderResolver }\n\n// ---------------------------------------------------------------------------\n// Bridges the generic CRUD scaffolding (DataProvider) to the shop provider, so\n// the product screens are the same createCrudPage machinery every other module\n// uses instead of a bespoke form.\n//\n// Which shop provider is injected decides whether writes work at all:\n// • createSupabaseShopProvider — authenticates as the merchant (their JWT),\n// full CRUD, subject to the tenant-member RLS policies.\n// • createFayzShopProvider — the storefront's anonymous REST client. Reads\n// work; every write throws FayzShopError 501 by design. The form surfaces\n// that message rather than pretending the save succeeded.\n// ---------------------------------------------------------------------------\n\nexport function createShopProductDataProvider(provider: ShopProviderResolver): DataProvider<Product> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Product>> {\n const answer = await listProductsDetailed(\n provider,\n query.search ? { search: query.search } : undefined,\n )\n return {\n ...applyQuery(answer.rows, query, 'status'),\n ...(answer.cached && { cached: true }),\n ...(answer.stale && { stale: true }),\n }\n },\n\n async create(data): Promise<Product> {\n const input = data as unknown as Partial<Product>\n // The storefront URL is required by the table's UNIQUE(tenant_id, slug);\n // deriving it from the name keeps the merchant from having to know that.\n const slug = input.slug?.trim() || slugify(String(input.name ?? ''))\n const created = await resolve(provider).createProduct({\n ...(input as CreateProductInput),\n slug,\n } as CreateProductInput)\n invalidateProductLists()\n return created\n },\n\n async update(id: string, data: Partial<Product>): Promise<Product> {\n const patch = { ...data }\n if (patch.slug !== undefined && !String(patch.slug).trim()) {\n // Cleared on purpose → regenerate rather than write an empty slug.\n patch.slug = slugify(String(patch.name ?? ''))\n }\n const updated = await resolve(provider).updateProduct(id, patch as UpdateProductInput)\n invalidateProductLists()\n return updated\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteProduct(id)\n invalidateProductLists()\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { CreateDiscountInput, Discount, UpdateDiscountInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopDiscountDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Discount> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Discount>> {\n const rows = await resolve(provider).listDiscounts()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((d) =>\n d.title.toLowerCase().includes(term) || (d.code ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<Discount> {\n const input = data as unknown as Partial<Discount>\n return resolve(provider).createDiscount({\n ...(input as CreateDiscountInput),\n // Codes are matched case-insensitively server-side; store them upper so\n // the admin list reads consistently.\n code: input.code ? String(input.code).trim().toUpperCase() : undefined,\n } as CreateDiscountInput)\n },\n\n async update(id: string, data: Partial<Discount>): Promise<Discount> {\n // timesUsed is incremented by shop_place_order inside the order transaction.\n const { timesUsed: _used, ...patch } = data\n if (patch.code !== undefined) {\n patch.code = patch.code ? String(patch.code).trim().toUpperCase() : null\n }\n return resolve(provider).updateDiscount(id, patch as UpdateDiscountInput)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteDiscount(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Category, CreateCategoryInput, UpdateCategoryInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nexport function createShopCategoryDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Category> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Category>> {\n const rows = await resolve(provider).listCategories()\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.name.toLowerCase().includes(term) || (c.slug ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Category> {\n const input = data as unknown as Partial<Category>\n return resolve(provider).createCategory({\n name: String(input.name ?? ''),\n slug: input.slug?.trim() || undefined,\n description: input.description ?? undefined,\n // The form writes '' for \"no parent\"; the column is a nullable FK, and\n // '' is not a uuid — it must go as absent, not as empty text.\n parentId: input.parentId?.trim() || undefined,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCategoryInput)\n },\n\n async update(id: string, data: Partial<Category>): Promise<Category> {\n const patch: UpdateCategoryInput = {}\n if (data.name !== undefined) patch.name = data.name\n if (data.slug !== undefined) patch.slug = data.slug?.trim() || undefined\n if (data.description !== undefined) patch.description = data.description\n if (data.parentId !== undefined) patch.parentId = data.parentId?.trim() || null\n if (data.sortOrder !== undefined) patch.sortOrder = data.sortOrder\n return resolve(provider).updateCategory(id, patch)\n },\n\n async remove(id: string): Promise<void> {\n await resolve(provider).deleteCategory(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { Collection, CreateCollectionInput, UpdateCollectionInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** Collections are optional on the provider contract. A provider without them\n * should read as \"no collections\", not blow up the list. */\nfunction requireCollections(p: ReturnType<typeof resolve>) {\n if (!p.listCollections) throw new Error('This store provider does not support collections')\n return p\n}\n\nexport function createShopCollectionDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<Collection> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<Collection>> {\n const p = resolve(provider)\n const rows = (await p.listCollections?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((c) =>\n c.title.toLowerCase().includes(term) || (c.handle ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n const input = data as unknown as Partial<Collection>\n return p.createCollection!({\n title: String(input.title ?? ''),\n handle: input.handle?.trim() || undefined,\n description: input.description ?? null,\n seoTitle: input.seoTitle ?? null,\n seoDescription: input.seoDescription ?? null,\n published: input.published ?? true,\n sortOrder: input.sortOrder ?? undefined,\n } as CreateCollectionInput)\n },\n\n async update(id: string, data: Partial<Collection>): Promise<Collection> {\n const p = requireCollections(resolve(provider))\n // productIds is not on the form (membership needs a product picker the\n // declarative EntityDef can't express), so it must never reach the patch\n // — an undefined there means \"leave the membership alone\", but a stale\n // value from the row would silently rewrite it.\n const { productIds: _members, ...patch } = data\n return p.updateCollection!(id, patch as UpdateCollectionInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireCollections(resolve(provider))\n await p.deleteCollection!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type { GiftCard, CreateGiftCardInput, UpdateGiftCardInput } from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGiftCards(p: ReturnType<typeof resolve>) {\n if (!p.listGiftCards) throw new Error('This store provider does not support gift cards')\n return p\n}\n\nexport function createShopGiftCardDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<GiftCard> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<GiftCard>> {\n const rows = (await resolve(provider).listGiftCards?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.code.toLowerCase().includes(term) || (g.customerEmail ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query, 'status')\n },\n\n async create(data): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n const input = data as unknown as Partial<GiftCard>\n return p.createGiftCard!({\n code: input.code?.trim() || undefined,\n initialBalance: Number(input.initialBalance) || 0,\n status: input.status ?? 'active',\n expiresAt: input.expiresAt || null,\n customerEmail: input.customerEmail || null,\n note: input.note || null,\n } as CreateGiftCardInput)\n },\n\n async update(id: string, data: Partial<GiftCard>): Promise<GiftCard> {\n const p = requireGiftCards(resolve(provider))\n // initialBalance is the card's face value — the record of how much money\n // came in. Editing it after issue would rewrite financial history, so the\n // patch drops it and only the remaining balance is adjustable.\n const { initialBalance: _face, ...patch } = data\n return p.updateGiftCard!(id, patch as UpdateGiftCardInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGiftCards(resolve(provider))\n await p.deleteGiftCard!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerGroup, CreateCustomerGroupInput, UpdateCustomerGroupInput,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\nfunction requireGroups(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerGroups) throw new Error('This store provider does not support customer groups')\n return p\n}\n\nexport function createShopCustomerGroupDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<CustomerGroup> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<CustomerGroup>> {\n const rows = (await resolve(provider).listCustomerGroups?.()) ?? []\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? rows.filter((g) =>\n g.name.toLowerCase().includes(term) || (g.description ?? '').toLowerCase().includes(term))\n : rows\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n const input = data as unknown as Partial<CustomerGroup>\n return p.createCustomerGroup!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n color: input.color ?? null,\n } as CreateCustomerGroupInput)\n },\n\n async update(id: string, data: Partial<CustomerGroup>): Promise<CustomerGroup> {\n const p = requireGroups(resolve(provider))\n // customerIds is not on the form (membership needs a customer picker the\n // declarative EntityDef can't express). Passing the row's stale copy would\n // rewrite the membership on every rename; undefined leaves it alone.\n const { customerIds: _members, ...patch } = data\n return p.updateCustomerGroup!(id, patch as UpdateCustomerGroupInput)\n },\n\n async remove(id: string): Promise<void> {\n const p = requireGroups(resolve(provider))\n await p.deleteCustomerGroup!(id)\n },\n }\n}\n","import type { CrudQuery, CrudResult, DataProvider } from '@fayz-ai/core'\nimport type {\n CustomerSegment, CreateCustomerSegmentInput, UpdateCustomerSegmentInput, ShopCustomer,\n} from '@fayz-ai/shop'\nimport { applyQuery, resolve, type ShopProviderResolver } from './shared'\n\n/** A segment row plus how many customers currently match it. */\ntype SegmentRow = CustomerSegment & { matchCount: number }\n\nfunction requireSegments(p: ReturnType<typeof resolve>) {\n if (!p.listCustomerSegments) throw new Error('This store provider does not support customer segments')\n return p\n}\n\n/**\n * Does this customer satisfy the rule? All criteria AND together, and a null\n * criterion is \"don't check\", NOT zero — a segment with no bounds matches\n * everyone, which is different from one demanding at least R$0.\n */\nexport function customerMatchesSegment(c: ShopCustomer, s: CustomerSegment): boolean {\n const orders = c.ordersCount ?? 0\n const spent = c.totalSpent ?? 0\n if (s.minOrders != null && orders < s.minOrders) return false\n if (s.maxOrders != null && orders > s.maxOrders) return false\n if (s.minSpent != null && spent < s.minSpent) return false\n if (s.maxSpent != null && spent > s.maxSpent) return false\n // Compare on the calendar day: createdAt is a timestamp and the bounds are\n // dates, so a same-day signup must count as \"joined after\" that day.\n const joined = c.createdAt?.slice(0, 10)\n if (s.joinedAfter && (!joined || joined < s.joinedAfter)) return false\n if (s.joinedBefore && (!joined || joined > s.joinedBefore)) return false\n return true\n}\n\nexport function createShopCustomerSegmentDataProvider(\n provider: ShopProviderResolver,\n): DataProvider<SegmentRow> {\n return {\n async list(query: CrudQuery): Promise<CrudResult<SegmentRow>> {\n const p = resolve(provider)\n const rows = (await p.listCustomerSegments?.()) ?? []\n // One customer read for the whole page, then count in memory. A segment\n // is a rule, so its size is only true when it is recomputed — a stored\n // count would be a number that silently goes stale.\n const customers = rows.length ? await p.listCustomers().catch(() => [] as ShopCustomer[]) : []\n const withCounts: SegmentRow[] = rows.map((s) => ({\n ...s,\n matchCount: customers.filter((c) => customerMatchesSegment(c, s)).length,\n }))\n const term = query.search?.trim().toLowerCase()\n const filtered = term\n ? withCounts.filter((s) =>\n s.name.toLowerCase().includes(term) || (s.description ?? '').toLowerCase().includes(term))\n : withCounts\n return applyQuery(filtered, query)\n },\n\n async create(data): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n const input = data as unknown as Partial<CustomerSegment>\n const created = await p.createCustomerSegment!({\n name: String(input.name ?? ''),\n description: input.description ?? null,\n minOrders: input.minOrders ?? null,\n maxOrders: input.maxOrders ?? null,\n minSpent: input.minSpent ?? null,\n maxSpent: input.maxSpent ?? null,\n joinedAfter: input.joinedAfter || null,\n joinedBefore: input.joinedBefore || null,\n } as CreateCustomerSegmentInput)\n return { ...created, matchCount: 0 }\n },\n\n async update(id: string, data: Partial<SegmentRow>): Promise<SegmentRow> {\n const p = requireSegments(resolve(provider))\n // matchCount is derived, never stored — it must not reach the patch.\n const { matchCount: _count, ...patch } = data\n const updated = await p.updateCustomerSegment!(id, patch as UpdateCustomerSegmentInput)\n return { ...updated, matchCount: 0 }\n },\n\n async remove(id: string): Promise<void> {\n const p = requireSegments(resolve(provider))\n await p.deleteCustomerSegment!(id)\n },\n }\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { StoreSettings, UpdateStoreSettingsInput } from '@fayz-ai/shop'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\n\n// ---------------------------------------------------------------------------\n// useStoreSettings — the store's commercial policy, loaded and saved\n// ---------------------------------------------------------------------------\n// One hook behind all the Commerce settings screens, and the reason they can be\n// five screens instead of one: each renders a slice of the SAME tenant row, and\n// each save sends only the keys it touched (see storeSettingsPayload). Two\n// screens open in two tabs cannot overwrite each other's sections.\n//\n// AUTO-SAVE, no Save button. Every one of these is a single decision with an\n// immediate meaning (\"aceito boleto\"), and a form that batches ten of them\n// behind a button asks the merchant to remember which ones they changed. The\n// write is debounced so a burst of chip clicks collapses into one round trip.\n//\n// `undefined` is load-bearing throughout: it means the merchant has not decided,\n// which every reader treats as \"keep the app's own default\". A screen must\n// therefore never render `value ?? false` into the store — only into the\n// control. `defaults` exists for exactly that: it is what the UI shows while\n// nothing is chosen, and it is never written on its own.\n\nconst DEBOUNCE_MS = 400\n\nexport interface StoreSettingsHandle {\n /** Merged over `defaults`: what the controls render. */\n value: StoreSettings\n /** What is actually stored — `undefined` for anything undecided. */\n stored: StoreSettings | null\n set: (patch: UpdateStoreSettingsInput) => void\n loading: boolean\n /** True while a write is in flight or pending. Drives the \"saving…\" hint. */\n saving: boolean\n /** The provider refused the WRITE. Shown inline; the optimistic value stays\n * on screen so the merchant does not lose what they typed. */\n error: string | null\n /**\n * The provider refused the READ.\n *\n * Kept apart from `error` because the two need opposite copy and imply\n * opposite things. A failed save means \"your change did not stick\"; a failed\n * load means \"everything below is a default, not your settings\" — and showing\n * the save wording for a load failure, which is what this hook did at first,\n * tells the merchant a change was lost when they had not made one.\n */\n loadError: string | null\n /** False when the mounted provider has no store-settings support at all —\n * the screen says so instead of pretending the toggles work. */\n supported: boolean\n}\n\nexport function useStoreSettings(\n provider: ShopProviderResolver | undefined,\n defaults: StoreSettings = {},\n): StoreSettingsHandle {\n const shop = React.useMemo(\n () => (provider ? resolve(provider) : getShopProvider()),\n [provider],\n )\n const supported = typeof shop.getStoreSettings === 'function' && typeof shop.updateStoreSettings === 'function'\n\n const [stored, setStored] = React.useState<StoreSettings | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n if (!supported) return\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void shop\n .getStoreSettings!()\n .then((settings) => { if (!cancelled) setStored(settings) })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [shop, supported])\n\n // The pending patch accumulates across the debounce window, so clicking three\n // chips sends one write with three keys rather than three writes racing to be\n // last. Kept in a ref: a re-render must not restart the timer.\n const pendingRef = React.useRef<UpdateStoreSettingsInput>({})\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n\n React.useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current) }, [])\n\n const set = React.useCallback(\n (patch: UpdateStoreSettingsInput) => {\n // Optimistic: the control reflects the click without waiting for a server.\n setStored((current) => ({ ...(current ?? {}), ...patch }))\n if (!supported) return\n setError(null)\n setSaving(true)\n pendingRef.current = { ...pendingRef.current, ...patch }\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n const payload = pendingRef.current\n pendingRef.current = {}\n void shop\n .updateStoreSettings!(payload)\n // The server's answer wins over the optimistic guess — it is the row\n // that a CHECK constraint or a trigger may have had an opinion about.\n .then((saved) => setStored(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n }, DEBOUNCE_MS)\n },\n [shop, supported],\n )\n\n const value = React.useMemo(() => ({ ...defaults, ...(stored ?? {}) }), [defaults, stored])\n\n return { value, stored, set, loading, saving, error, loadError, supported }\n}\n","import React from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport { AlertTriangle, Check, Loader2 } from 'lucide-react'\n\n/**\n * The three things every Commerce settings screen has to say, said once.\n *\n * Loading, saving and refused are not decoration on a settings screen that\n * writes to a server: without them a merchant cannot tell \"salvo\" from \"não\n * chegou\", and the whole reason these screens exist is that the previous ones\n * silently kept everything in React state. The saving/saved line is what\n * replaces the Save button the auto-save design removes.\n *\n * `supported: false` is its own case, and deliberately loud: it means the\n * mounted shop provider has no store-settings methods at all, so every control\n * below would be a toggle wired to nothing — which is exactly the bug this wave\n * fixes and must not be reintroduced silently by a bespoke provider.\n */\nexport function SettingsState({\n loading,\n saving,\n error,\n loadError,\n supported,\n children,\n}: {\n loading: boolean\n saving: boolean\n error: string | null\n /** The READ failed. Opposite copy from `error`, and shown ABOVE the controls\n * rather than below: what is on screen is defaults, not the store's settings,\n * and that has to be read before anything is clicked. */\n loadError?: string | null\n supported: boolean\n children: React.ReactNode\n}) {\n if (!supported) {\n return (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getStoreSettings</code>. As opções\n abaixo não seriam salvas, então não são mostradas.\n </p>\n </div>\n )\n }\n\n if (loading) {\n return (\n <div className=\"space-y-4\">\n <Skeleton className=\"h-28 w-full rounded-lg\" />\n <Skeleton className=\"h-40 w-full rounded-lg\" />\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar as configurações da loja\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O que aparece abaixo são os valores padrão, não as suas escolhas. Recarregue a página\n antes de alterar algo — salvar agora sobrescreveria configurações que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {children}\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n <>\n <Check className=\"h-3.5 w-3.5 shrink-0\" />\n As alterações são salvas automaticamente.\n </>\n )}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface StoreGeneralSettingsProps {\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n}\n\nconst CURRENCIES = [\n { value: 'BRL', label: 'Real (R$)' },\n { value: 'USD', label: 'US Dollar ($)' },\n { value: 'EUR', label: 'Euro (€)' },\n { value: 'GBP', label: 'British Pound (£)' },\n]\n\nconst LOCALES = [\n { value: 'pt-BR', label: 'Português (Brasil)' },\n { value: 'en-US', label: 'English (US)' },\n { value: 'es-ES', label: 'Español' },\n]\n\n/**\n * Loja — moeda, formatação e as regras de catálogo.\n *\n * O `currency` que o app passa na criação do plugin é o VALOR INICIAL mostrado,\n * não o valor salvo: enquanto o lojista não escolhe, a vitrine segue com o que o\n * app declarou, e é isso que a coluna nula significa. Escolher grava.\n */\nexport function StoreGeneralSettings({ currency, provider }: StoreGeneralSettingsProps) {\n const settings = useStoreSettings(provider, {\n currency: currency?.code ?? 'BRL',\n locale: currency?.locale ?? 'pt-BR',\n showOutOfStock: true,\n requireSku: false,\n notifyNewOrder: true,\n notifyLowStock: false,\n })\n const { value, set } = settings\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup title=\"Loja\" description=\"Moeda e formatação da vitrine.\">\n <SelectRow\n label=\"Moeda\"\n description=\"Moeda padrão para preços e checkout.\"\n value={value.currency ?? 'BRL'}\n options={CURRENCIES}\n onChange={(v) => set({ currency: v })}\n />\n <SelectRow\n label=\"Idioma / formato\"\n description=\"Formatação de números, preços e datas.\"\n value={value.locale ?? 'pt-BR'}\n options={LOCALES}\n onChange={(v) => set({ locale: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup title=\"Catálogo\" description=\"Como os produtos aparecem e são gerenciados.\">\n <ToggleRow\n label=\"Mostrar produtos esgotados\"\n description=\"Exibir itens sem estoque na vitrine.\"\n checked={value.showOutOfStock ?? true}\n onChange={(v) => set({ showOutOfStock: v })}\n />\n <ToggleRow\n label=\"Exigir SKU\"\n description=\"Tornar o SKU obrigatório ao criar produtos.\"\n checked={value.requireSku ?? false}\n onChange={(v) => set({ requireSku: v })}\n />\n </SettingsGroup>\n\n {/* «Controlar estoque» saiu daqui. Era um interruptor local que não\n governava nada, e a decisão real — quem é dono do número, nosso livro\n ou um ERP — já existe como `stock_ownership` e é escrita pelo conector\n que assume o estoque. Dois controles para a mesma coisa é o caminho\n mais curto para eles discordarem. */}\n\n <SettingsGroup title=\"Notificações\" description=\"Avisos por e-mail da loja.\">\n <ToggleRow\n label=\"E-mail de novo pedido\"\n description=\"Notificar a equipe a cada novo pedido.\"\n checked={value.notifyNewOrder ?? true}\n onChange={(v) => set({ notifyNewOrder: v })}\n />\n <ToggleRow\n label=\"Alerta de estoque baixo\"\n description=\"Avisar quando produtos atingirem o mínimo.\"\n checked={value.notifyLowStock ?? false}\n onChange={(v) => set({ notifyLowStock: v })}\n />\n </SettingsGroup>\n </SettingsState>\n )\n}\n","/**\n * Which gateway should be charging, given what the store stored and what is\n * connected right now. Returns the slug to persist, or null for \"leave it\".\n *\n * The store must always have someone charging: a gateway just connected and\n * nobody named makes every order pending for no reason, and a named gateway\n * that went away makes the checkout promise a charge that cannot open.\n *\n * `''` is the one answer this never overrides — it is the merchant saying \"eu\n * confirmo à mão\", which is a decision. `undefined` is the absence of one.\n */\nexport function resolvePaymentProvider(\n current: string | undefined | null,\n live: readonly string[],\n): string | null {\n if (live.length === 0) return null\n if (current === '') return null\n if (current && live.includes(current)) return null\n return live[0]!\n}\n","import React from 'react'\nimport { ConnectorMark, StateChip, type UnifiedConnector } from '@fayz-ai/admin'\nimport { Button } from '@fayz-ai/ui'\n\n/**\n * One payment gateway, where activating it IS choosing it.\n *\n * Shopify and Nuvemshop have no \"primary provider\" control: a provider is active\n * or it is not, and turning one on is what makes it charge. Ours were two\n * sections, so the gateway was chosen in one place and listed in another with\n * the relationship left to be guessed.\n *\n * The row body ONLY selects, and the named link beside it is the only way into\n * the connection's own screen — a row that sometimes selected and sometimes\n * opened a panel read as broken, which is what it was reported as.\n */\nexport function PaymentProviderRow({ connector, selected, onSelect, onOpen }: {\n connector: UnifiedConnector\n selected: boolean\n onSelect: (connector: UnifiedConnector) => void\n onOpen: (connector: UnifiedConnector) => void\n}) {\n const live = connector.state === 'connected'\n\n return (\n <li className={`flex items-start gap-1 transition-colors ${selected ? 'bg-primary/5' : ''}`}>\n {/* Not connected is not selectable, and the body never opens the panel:\n one row, one meaning. The link beside it is the way in. */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={!live}\n onClick={() => onSelect(connector)}\n className={`font-normal justify-start whitespace-normal flex min-w-0 flex-1 items-start gap-3 p-4 text-left ${\n live ? 'hover:bg-muted/40' : 'cursor-default disabled:opacity-70'\n }`}\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n } ${live ? '' : 'opacity-30'}`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <ConnectorMark connector={connector} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-foreground\">{connector.name}</span>\n <StateChip state={connector.state} />\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {selected\n ? 'Cobra os pedidos desta loja.'\n : live\n ? 'Conectado. Clique para passar a cobrança para ele.'\n : connector.description ?? 'Ainda não conectado.'}\n </span>\n </span>\n </Button>\n {/* Named, not a chevron: the arrow said \"there is more here\" and the row\n already means something else now — one of the two had to say what it\n does. */}\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => onOpen(connector)}\n className=\"font-normal shrink-0 self-center whitespace-nowrap px-4 text-xs text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground\"\n >\n {live ? 'Configurar conexão' : 'Conectar'}\n </Button>\n </li>\n )\n}\n\n/** The absence of a gateway, as a choice in the same list — Shopify's \"manual\n * payment methods only\". A separate section for it made it look like a setting\n * about something else. */\nexport function ManualChargeRow({ selected, onSelect }: {\n selected: boolean\n onSelect: () => void\n}) {\n return (\n <li className={selected ? 'bg-primary/5' : ''}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n onClick={onSelect}\n className=\"font-normal justify-start rounded-none whitespace-normal flex w-full items-start gap-3 p-4 text-left hover:bg-muted/40\"\n >\n <span\n aria-hidden\n className={`mt-1.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n selected ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {selected && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium text-foreground\">Nenhum — eu confirmo os pagamentos à mão</span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n Pix por chave, dinheiro na entrega, combinado com a loja. O pedido nasce pendente e\n espera você confirmar que o dinheiro caiu.\n </span>\n </span>\n </Button>\n </li>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, MultiSelectRow,\n useConnectors, ConnectorDetail, AddConnectorPanel, AddConnectorButton,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport type { PaymentMethodKind } from '@fayz-ai/shop'\nimport { AlertTriangle } from 'lucide-react'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { resolvePaymentProvider } from './payment-provider'\nimport { ManualChargeRow, PaymentProviderRow } from './PaymentProviderRow'\n\nexport interface PaymentsSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * Every method an order can record — the same list as the CHECK on\n * plg_shop_orders.payment_method_kind, and therefore the same list the trigger\n * from 0045 validates against. One vocabulary, three places, no drift.\n */\nconst METHODS: Array<{ value: PaymentMethodKind; label: string; hint: string }> = [\n { value: 'pix', label: 'Pix', hint: 'Chave ou QR Code' },\n { value: 'credit_card', label: 'Cartão de crédito', hint: 'Gateway ou maquininha' },\n { value: 'debit_card', label: 'Cartão de débito', hint: 'Gateway ou maquininha' },\n { value: 'boleto', label: 'Boleto', hint: 'Enviado por e-mail' },\n { value: 'cash', label: 'Dinheiro', hint: 'Na entrega ou no balcão' },\n { value: 'other', label: 'Combinar com a loja', hint: 'A loja acerta o pagamento' },\n]\n\n/**\n * Pagamentos — quem cobra e o que o comprador pode escolher.\n *\n * Duas coisas diferentes numa tela, e a distinção é o assunto:\n *\n * • QUEM COBRA é uma conexão. Já existe: os conectores de pagamento vêm do\n * manifesto do plugin, a credencial vai para o cofre e o estado é derivado\n * de connections. Esta tela não reimplementa nada disso — ela FILTRA o\n * hub por `category === 'payments'` e reusa a mesma linha, a mesma marca e a\n * mesma jornada de conectar. Um cartão próprio aqui divergiria do hub na\n * primeira vez que qualquer um dos três mudasse.\n *\n * • O QUE O COMPRADOR ESCOLHE é política comercial, e muda com a estação. Fica\n * em plg_shop_settings.payment_methods, é lida pela vitrine em runtime e é\n * IMPOSTA no servidor: um pedido nomeando um método fora da lista é\n * recusado, não apenas escondido do formulário.\n *\n * Um método sem gateway ainda é legítimo — dinheiro na entrega, Pix por chave,\n * «combinar com a loja» — então nada aqui exige uma conexão para ser oferecido.\n * O que a tela faz é DIZER quando o pedido vai nascer pendente esperando o\n * lojista confirmar, em vez de deixar o lojista descobrir isso no primeiro\n * pedido.\n */\n/** The categories this screen is about — the same list its own filter uses. */\nconst PAYMENT_CATEGORIES = ['payments']\n\nexport function PaymentsSettings({ provider }: PaymentsSettingsProps) {\n const settings = useStoreSettings(provider)\n const { value, set } = settings\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [adding, setAdding] = React.useState(false)\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n // Same rule as the hub: the assistant's drawer owns the journey when one is\n // mounted, and the sheet is the fallback so the flow is never stranded.\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n\n const payment = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category && PAYMENT_CATEGORIES.includes(c.category)),\n [connectors],\n )\n const live = React.useMemo(() => payment.filter((c) => c.state === 'connected'), [payment])\n\n const chosen = value.paymentMethods ?? []\n // A gateway went away (disconnected, or the app dropped the plugin) and the\n // store still names it — and there is nothing live to hand the charge to.\n const staleProvider = !!value.paymentProvider\n && !live.some((c) => c.slug === value.paymentProvider)\n && live.length === 0\n\n // Always someone charging — the rule itself is in resolvePaymentProvider, so\n // it can be argued with in a test instead of in a mounted screen.\n const movedFrom = React.useRef<string | null>(null)\n React.useEffect(() => {\n if (!settings.supported || settings.loading) return\n const next = resolvePaymentProvider(value.paymentProvider, live.map((c) => c.slug))\n if (!next) return\n // Only a REPLACEMENT is announced; adopting a gateway nobody had chosen is\n // not news.\n if (value.paymentProvider) movedFrom.current = value.paymentProvider\n set({ paymentProvider: next })\n }, [live, value.paymentProvider, settings.supported, settings.loading, set])\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Formas de pagamento\"\n description=\"O que o cliente pode escolher no checkout. Um pedido que chegar com outra forma é recusado pelo servidor.\"\n >\n <MultiSelectRow\n label=\"Aceito na loja\"\n description=\"Nada escolhido = a vitrine oferece o que o app declarou, como hoje.\"\n value={chosen}\n options={METHODS.map((m) => ({ value: m.value, label: m.label }))}\n onChange={(next) => set({ paymentMethods: next as PaymentMethodKind[] })}\n />\n {chosen.length > 0 && !value.paymentProvider && (\n <p className=\"flex items-start gap-2 py-3 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n Sem um gateway cobrando, todo pedido nasce <strong className=\"font-medium\">pendente</strong> e\n espera você confirmar que o dinheiro caiu. Isso funciona — é como as lojas com Pix por\n chave e pagamento na entrega operam — mas a confirmação é sua.\n </p>\n )}\n </SettingsGroup>\n\n <div>\n <div className=\"flex items-start justify-between gap-4 px-1 pb-1 pt-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Quem cobra</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O provedor marcado é quem abre a cobrança quando o cliente finaliza a compra — só um\n cobra por vez. A credencial vai para o cofre, nunca para o banco da loja.\n </p>\n </div>\n <AddConnectorButton onClick={() => setAdding(true)} />\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n {payment.length === 0 ? (\n <p className=\"p-4 text-sm text-muted-foreground\">\n Nenhum provedor de pagamento disponível para este app ainda.\n </p>\n ) : (\n <ul className=\"divide-y\" role=\"radiogroup\" aria-label=\"Quem cobra\">\n {payment.map((connector) => (\n <PaymentProviderRow\n key={connector.id}\n connector={connector}\n selected={value.paymentProvider === connector.slug}\n onSelect={(c) => { movedFrom.current = null; set({ paymentProvider: c.slug }) }}\n onOpen={openJourney}\n />\n ))}\n <ManualChargeRow\n selected={value.paymentProvider === ''}\n onSelect={() => { movedFrom.current = null; set({ paymentProvider: '' }) }}\n />\n </ul>\n )}\n </div>\n {movedFrom.current && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-muted-foreground\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span>\n <strong className=\"font-medium\">{movedFrom.current}</strong> não está mais conectado, então\n a cobrança passou para o provedor marcado acima. Reconecte-o para voltar.\n </span>\n </p>\n )}\n {staleProvider && (\n <p className=\"flex items-start gap-2 px-1 pt-2 text-xs text-destructive\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n A loja cobra por <strong className=\"font-medium\">{value.paymentProvider}</strong>, que não\n está conectado agora, e não há outro para assumir. Enquanto isso os pedidos nascem\n pendentes.\n </p>\n )}\n </div>\n\n <AddConnectorPanel\n open={adding}\n onOpenChange={setAdding}\n connectors={connectors}\n // The button lives under \"Provedores de pagamento\" and must offer only\n // those: it was listing the ERP and the carrier too.\n categories={PAYMENT_CATEGORIES}\n onSelect={(connector) => {\n setAdding(false)\n openJourney(connector)\n }}\n />\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, SelectRow, ToggleRow } from '@fayz-ai/admin'\nimport type { CheckoutFieldKey, CheckoutFieldPolicy } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\n\nexport interface CheckoutSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/**\n * The fields the checkout form can ask for, and which of them a store may\n * actually turn off.\n *\n * `locked` is not a UI nicety — it is the delivery reality. A courier cannot\n * deliver to a street with no number and no district, and the checkout's own\n * validation refuses those today; offering a switch that promises otherwise\n * would be offering to break deliveries. The order those appear in is the order\n * of the form, so this list reads like the screen the shopper sees.\n */\nconst FIELDS: Array<{ key: CheckoutFieldKey; label: string; locked?: boolean; hint?: string }> = [\n { key: 'name', label: 'Nome completo', locked: true, hint: 'Sempre pedido — é para quem a entrega vai.' },\n { key: 'email', label: 'E-mail', locked: true, hint: 'Sempre pedido — é por onde o pedido é confirmado.' },\n { key: 'phone', label: 'Telefone', hint: 'Vai junto com o endereço — é por onde o entregador liga.' },\n // Back, now that 0050 gives it a column. Deliberately NOT locked: a store that\n // neither charges through a gateway nor issues an invoice has no use for it.\n // The checkout escalates it to required on its own when a gateway is on —\n // that is a fact about the charge, not a preference the merchant can waive.\n { key: 'document', label: 'CPF / CNPJ', hint: 'Obrigatório quando a loja cobra por gateway ou emite nota — nesse caso a vitrine já pede sozinha.' },\n { key: 'postalCode', label: 'CEP', locked: true, hint: 'Sempre pedido — é o que cota o frete.' },\n { key: 'street', label: 'Endereço', locked: true },\n { key: 'number', label: 'Número', locked: true, hint: 'Sem número o entregador não chega.' },\n { key: 'complement', label: 'Complemento' },\n { key: 'district', label: 'Bairro', locked: true },\n { key: 'city', label: 'Cidade', locked: true },\n { key: 'state', label: 'UF', locked: true },\n]\n\nconst REQUIREMENT = [\n { value: 'off', label: 'Não pedir' },\n { value: 'optional', label: 'Pedir (opcional)' },\n { value: 'required', label: 'Pedir (obrigatório)' },\n]\n\nfunction toRequirement(policy: CheckoutFieldPolicy | undefined, locked: boolean): string {\n if (locked) return 'required'\n if (policy?.visible === false) return 'off'\n return policy?.required ? 'required' : 'optional'\n}\n\nfunction fromRequirement(choice: string): CheckoutFieldPolicy {\n // 'off' writes both keys rather than only `visible`: a field nobody can see\n // cannot be required, and leaving a stale `required: true` behind is how a\n // hidden field later reappears as a blocking validation nobody can satisfy.\n if (choice === 'off') return { visible: false, required: false }\n return { visible: true, required: choice === 'required' }\n}\n\n/**\n * Checkout — quem pode comprar e o que é pedido no caminho.\n *\n * A honestidade sobre quem impõe o quê está nas descrições, e não é detalhe:\n * «compra sem cadastro» é recusada pelo SERVIDOR (trigger da 0045), então\n * desligá-la vale mesmo contra um POST direto no RPC. «Exigir e-mail\n * confirmado» e os campos do formulário são de INTERFACE — a vitrine obedece, e\n * um comprador determinado não é impedido pelo banco. Prometer imposição onde\n * ela não existe é pior do que não ter a opção.\n */\nexport function CheckoutSettings({ provider }: CheckoutSettingsProps) {\n const settings = useStoreSettings(provider, {\n guestCheckout: true,\n requireConfirmedEmail: false,\n marketingOptIn: false,\n discountsEnabled: true,\n })\n const { value, set } = settings\n const fields = value.checkoutFields ?? {}\n\n const setField = (key: CheckoutFieldKey, choice: string) =>\n set({ checkoutFields: { ...fields, [key]: fromRequirement(choice) } })\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Contas de cliente\"\n description=\"Se o comprador precisa de uma conta antes de finalizar.\"\n >\n <ToggleRow\n label=\"Permitir compra sem cadastro\"\n description=\"Desligado, o comprador precisa entrar ou criar conta. Esta é imposta no servidor: um pedido sem conta é recusado.\"\n checked={value.guestCheckout ?? true}\n onChange={(v) => set({ guestCheckout: v })}\n />\n <ToggleRow\n label=\"Exigir e-mail confirmado\"\n description=\"O comprador recebe um link ao se cadastrar e só finaliza depois de clicar. Vale na vitrine — confirmar e-mail é um fato da conta, não do pedido.\"\n checked={value.requireConfirmedEmail ?? false}\n onChange={(v) => set({ requireConfirmedEmail: v })}\n disabled={value.guestCheckout !== false}\n />\n {value.guestCheckout !== false && (\n <p className=\"py-3 text-xs text-muted-foreground\">\n «Exigir e-mail confirmado» só faz sentido com o cadastro obrigatório: enquanto a compra\n sem cadastro está liberada, não há conta cujo e-mail confirmar.\n </p>\n )}\n </SettingsGroup>\n\n <SettingsGroup title=\"Carrinho\" description=\"O que o comprador pode aplicar antes de pagar.\">\n <ToggleRow\n label=\"Cupons de desconto\"\n description=\"Mostrar o campo de código no carrinho e no checkout.\"\n checked={value.discountsEnabled ?? true}\n onChange={(v) => set({ discountsEnabled: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Consentimento de marketing\"\n description=\"Coleta de opt-in para e-mails, no padrão que a LGPD pede: marcado por quem quer, nunca por padrão.\"\n >\n <ToggleRow\n label=\"Mostrar caixa de opt-in\"\n description=\"Exibir a caixa «quero receber novidades» no checkout, desmarcada.\"\n checked={value.marketingOptIn ?? false}\n onChange={(v) => set({ marketingOptIn: v })}\n />\n </SettingsGroup>\n\n <SettingsGroup\n title=\"Campos do cliente\"\n description=\"O que o comprador vê e o que ele precisa preencher. Campos travados são os que a entrega não dispensa.\"\n >\n {FIELDS.map((field) => (\n <SelectRow\n key={field.key}\n label={field.label}\n description={field.hint}\n value={toRequirement(fields[field.key], !!field.locked)}\n options={field.locked ? [{ value: 'required', label: 'Pedir (obrigatório)' }] : REQUIREMENT}\n onChange={(choice) => setField(field.key, choice)}\n disabled={field.locked}\n />\n ))}\n </SettingsGroup>\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { packagesRegistry, PACKAGES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\n\n/**\n * Embalagens — em que caixas a loja embala.\n *\n * É a metade que faltava do frete real. O produto declara o que ele É (peso e\n * medidas, na seção Envio do cadastro) e para onde ele VAI (a embalagem que\n * aponta); esta tela é o cadastro de onde essa escolha sai. Enquanto ela não\n * existia, a caixa da cotação era uma constante no código — 4×16×20cm e 300g\n * para toda loja da plataforma, que é o piso que a Correios aceita e não a\n * medida de nada que alguém vende. O frete cotado e o frete pago divergiam, e a\n * diferença saía da margem do lojista.\n *\n * A LISTA NÃO É DESTE ARQUIVO, e essa é a correção: era um CRUD escrito à mão,\n * com o seu próprio jeito de listar, criar, validar e apagar. Agora é\n * `PluginRegistryDef` + `RegistryCrudView`, o mesmo par que desenha feriados,\n * locais e categorias — uma interface a menos para o lojista aprender e umas\n * duzentas linhas a menos para manter sincronizadas com o resto do admin.\n */\nexport function PackagesSettings({ basePath = shippingRegistryPath(PACKAGES_REGISTRY) }: {\n basePath?: string\n}) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Embalagens</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{packagesRegistry.description}</p>\n </div>\n {/* Uma seção entre outras nesta aba: as ações ficam aqui, não na barra. */}\n <RegistryCrudView registry={packagesRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup, TextRow, adminNavigateTo } from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingProfile } from '@fayz-ai/shop'\nimport { ArrowRight, Layers } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport type { StoreSettingsHandle } from './useStoreSettings'\nimport { SHIPPING_PROFILES_REGISTRY } from '../data/registries'\nimport { shippingRegistryPath } from '../data/registry-routes'\nimport { Button } from '@fayz-ai/ui'\n\nexport interface HandlingSettingsProps {\n /** The Entrega screen's own settings read, shared rather than repeated. */\n settings: StoreSettingsHandle\n provider?: ShopProviderResolver\n}\n\n/**\n * Shipping profiles, and the handling note that travels with the parcel.\n *\n * Replaces a three-way cold-chain radio: a profile answers refrigerated, fragile,\n * oversized and made-to-order with one mechanism. The note is separate because it\n * does not decide who may carry the box.\n */\nexport function HandlingSettings({ settings, provider }: HandlingSettingsProps) {\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const { value, set, loading, supported } = settings\n const [noteDraft, setNoteDraft] = React.useState<string | null>(null)\n const [profiles, setProfiles] = React.useState<ShippingProfile[] | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void shop.listShippingProfiles?.()\n .then((list) => { if (!cancelled) setProfiles(list) })\n // Silent: a provider without profiles reads the same as a store with none.\n .catch(() => { if (!cancelled) setProfiles([]) })\n return () => { cancelled = true }\n }, [shop])\n\n if (!supported) return null\n\n const storedNote = value.handlingNote ?? ''\n // Null draft = not being edited, so a server answer cannot fight the typing.\n const note = noteDraft ?? storedNote\n const custom = (profiles ?? []).filter((p) => !p.isDefault)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n Produtos que vão de outro jeito\n </h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Um perfil é um grupo de produtos com zonas próprias — refrigerados, frágeis, volumosos, sob\n encomenda. Um perfil com só as suas zonas e o gateway desligado é como se diz «isto não vai\n de transportadora». Produto sem perfil usa o geral, que é o de todos hoje.\n </p>\n </div>\n\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => adminNavigateTo(shippingRegistryPath(SHIPPING_PROFILES_REGISTRY))}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {profiles == null\n ? 'Carregando perfis…'\n : custom.length === 0\n ? 'Só o perfil geral'\n : `${custom.length} ${custom.length === 1 ? 'perfil' : 'perfis'} além do geral`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {custom.length === 0\n ? 'Todo produto entrega pelas mesmas zonas. Crie um perfil quando um grupo precisar de zonas diferentes.'\n : custom.slice(0, 3).map((p) => p.name).join(' · ')}\n {custom.length > 3 && ` e ${custom.length - 3} mais`}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n\n <SettingsGroup\n title=\"Recado para quem entrega\"\n description=\"Vai junto com o pedido — para você, para o motoboy, e na observação da etiqueta quando houver gateway. Não aparece para o cliente, e não decide quem pode levar.\"\n >\n <TextRow\n label=\"Instrução de manuseio\"\n description=\"Ex.: caixa térmica com gelo, entregar em até 24h.\"\n value={note}\n onChange={setNoteDraft}\n onBlurCommit={() => {\n const next = note.trim()\n if (next !== storedNote) set({ handlingNote: next })\n setNoteDraft(null)\n }}\n placeholder=\"Sem instrução\"\n disabled={loading}\n />\n </SettingsGroup>\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from '@fayz-ai/ui'\n\nexport interface Choice<T extends string> {\n value: T\n label: string\n description: string\n /** Optional lucide icon component, rendered before the label. */\n Icon?: React.ComponentType<{ className?: string }>\n}\n\nexport interface ChoiceCardsProps<T extends string> {\n label: string\n choices: ReadonlyArray<Choice<T>>\n value: T | undefined\n onChange: (value: T) => void\n disabled?: boolean\n}\n\n/**\n * Mutually exclusive policies with a paragraph each — a radio, not a dropdown:\n * choosing between two of these needs both on screen at once.\n */\nexport function ChoiceCards<T extends string>({\n label, choices, value, onChange, disabled,\n}: ChoiceCardsProps<T>) {\n return (\n <div className=\"space-y-2 py-3\" role=\"radiogroup\" aria-label={label}>\n {choices.map((choice) => {\n const chosen = value === choice.value\n const Icon = choice.Icon\n return (\n <Button variant=\"bare\" size=\"bare\"\n key={choice.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={chosen}\n disabled={disabled}\n onClick={() => onChange(choice.value)}\n className={`font-normal justify-start whitespace-normal flex w-full items-start gap-3 rounded-lg border p-3 text-left transition-colors ${\n chosen ? 'border-primary bg-primary/5' : 'border-border hover:bg-muted/40'\n } disabled:opacity-60`}\n >\n <span\n aria-hidden\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n chosen ? 'border-primary' : 'border-muted-foreground/40'\n }`}\n >\n {chosen && <span className=\"h-2 w-2 rounded-full bg-primary\" />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {Icon && <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n {choice.label}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">{choice.description}</span>\n </span>\n </Button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport type { DeliveryOutcome, ZoneMatchKind } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// O rascunho das regras de entrega.\n//\n// Existe porque o cartão de confirmação do assistente mostra parâmetros, não\n// uma tabela editável — e o que a lojista precisa conferir aqui são catorze\n// linhas com preço e prazo, uma a uma. Então o agente não grava direto: ele\n// MONTA o rascunho, a tela desenha o rascunho, e gravar é um clique dela (ou\n// uma última chamada depois que ela disse que está certo).\n//\n// Módulo e não estado de componente: quem escreve são as ferramentas do agente,\n// que vivem fora da árvore React, e quem lê é o painel. Some quando a lojista\n// salva ou descarta — rascunho não é dado, é uma conversa em andamento.\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryDraftRule {\n /** Local ao rascunho. Nada a ver com o id da regra salva. */\n id: string\n matchKind: ZoneMatchKind\n /** Como a lojista lê a regra: \"Angra dos Reis\", \"Copacabana\", \"20000-000 → 23799-999\". */\n label: string\n cityCode?: string | null\n districtKey?: string | null\n postalFrom?: string | null\n postalTo?: string | null\n outcome: DeliveryOutcome\n /** Vazio de propósito quando a mensagem não disse: campo em branco custa\n * menos que campo errado. */\n rate?: number | null\n freeAbove?: number | null\n etaMinDays?: number | null\n etaMaxDays?: number | null\n /** O trecho da mensagem que originou esta linha, para ela conferir a leitura. */\n source?: string\n}\n\nexport interface DeliveryDraftGap {\n query: string\n /** Por que não virou regra, em português, para o agente repetir sem inventar. */\n reason: string\n}\n\nexport interface DeliveryDraft {\n rules: DeliveryDraftRule[]\n gaps: DeliveryDraftGap[]\n}\n\nconst EMPTY: DeliveryDraft = { rules: [], gaps: [] }\n\nlet draft: DeliveryDraft = EMPTY\nconst listeners = new Set<() => void>()\n\n// Um contador só, e não `rules.length`: o agente substitui o rascunho inteiro e\n// o seletor acrescenta linha a linha. Numerar pelo tamanho da lista faria as\n// duas fontes colidirem no mesmo id assim que alguém removesse uma linha.\nlet seq = 0\nconst nextId = () => `rule-${++seq}`\n\n/** Duas regras que casam o mesmo lugar do mesmo jeito são a mesma regra. */\nconst identity = (rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey' | 'postalFrom' | 'postalTo'>) =>\n [rule.matchKind, rule.cityCode ?? '', rule.districtKey ?? '', rule.postalFrom ?? '', rule.postalTo ?? ''].join('|')\n\nfunction emit(): void {\n for (const listener of listeners) listener()\n}\n\nexport function getDeliveryDraft(): DeliveryDraft {\n return draft\n}\n\nexport function setDeliveryDraft(next: DeliveryDraft): void {\n draft = { ...next, rules: next.rules.map((rule) => ({ ...rule, id: rule.id || nextId() })) }\n emit()\n}\n\n/**\n * Acrescenta regras ao rascunho, ignorando as que já estão lá.\n *\n * É por aqui que o SELETOR escreve — e é de propósito que ele escreva no mesmo\n * lugar que o agente: uma lojista que clicou em cinco bairros e depois disse\n * \"e não entrego em Angra\" tem que ver as seis linhas na mesma tabela, e salvar\n * uma vez. Duas listas seriam duas verdades.\n *\n * Devolve quantas entraram de fato.\n */\nexport function addDeliveryDraftRules(incoming: Array<Omit<DeliveryDraftRule, 'id'>>): number {\n const seen = new Set(draft.rules.map(identity))\n const added: DeliveryDraftRule[] = []\n for (const rule of incoming) {\n const key = identity(rule)\n if (seen.has(key)) continue\n seen.add(key)\n added.push({ ...rule, id: nextId() })\n }\n if (added.length === 0) return 0\n draft = { ...draft, rules: [...draft.rules, ...added] }\n emit()\n return added.length\n}\n\n/** Já está no rascunho? O seletor usa para marcar o que foi escolhido. */\nexport function isInDeliveryDraft(rule: Pick<DeliveryDraftRule, 'matchKind' | 'cityCode' | 'districtKey'>): boolean {\n const key = identity(rule as DeliveryDraftRule)\n return draft.rules.some((existing) => identity(existing) === key)\n}\n\n/**\n * O mesmo frete em todas as regras que entregam.\n *\n * A economia real da tela: quem escolhe catorze bairros cobra o mesmo nos\n * catorze, e digitar catorze vezes é onde a pessoa desiste.\n */\nexport function setAllDeliveryDraftRates(patch: Pick<DeliveryDraftRule, 'rate' | 'freeAbove'>): number {\n let touched = 0\n const rules = draft.rules.map((rule) => {\n if (rule.outcome === 'refuse') return rule\n touched++\n return { ...rule, ...patch }\n })\n if (touched === 0) return 0\n draft = { ...draft, rules }\n emit()\n return touched\n}\n\nexport function updateDeliveryDraftRule(id: string, patch: Partial<DeliveryDraftRule>): boolean {\n const index = draft.rules.findIndex((rule) => rule.id === id)\n if (index < 0) return false\n const rules = draft.rules.slice()\n rules[index] = { ...rules[index], ...patch, id }\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function removeDeliveryDraftRule(id: string): boolean {\n const rules = draft.rules.filter((rule) => rule.id !== id)\n if (rules.length === draft.rules.length) return false\n draft = { ...draft, rules }\n emit()\n return true\n}\n\nexport function clearDeliveryDraft(): void {\n draft = EMPTY\n emit()\n}\n\nexport function subscribeDeliveryDraft(listener: () => void): () => void {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport function useDeliveryDraft(): DeliveryDraft {\n return React.useSyncExternalStore(subscribeDeliveryDraft, getDeliveryDraft, getDeliveryDraft)\n}\n","import type { PluginAITool } from '@fayz-ai/core'\nimport type { AgentSurfaceTool } from '@fayz-ai/admin'\nimport type {\n AreaCandidate, CreateShippingZoneInput, DeliveryOutcome, ShopProvider, ZoneMatchKind,\n} from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\nimport {\n clearDeliveryDraft, getDeliveryDraft, setDeliveryDraft, updateDeliveryDraftRule,\n type DeliveryDraftGap, type DeliveryDraftRule,\n} from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// Configurar onde a loja entrega, a partir da mensagem da lojista.\n//\n// A mensagem real que originou isto:\n//\n// \"Não entregamos Costa Verde, Angra, Mangaratiba, Itacuruçá, Itaboraí,\n// Região dos Lagos, Região Serrana. Entregamos Zona Norte (evitar Chapadão e\n// Maré), Zona Sul (exceto Rocinha, Vidigal e comunidades), Zona Oeste.\"\n//\n// Traduzir isso à mão dá catorze faixas de CEP, e por isso ninguém traduz — a\n// loja segue entregando onde disse que não entrega. O agente faz a tradução, e\n// o desenho inteiro existe para que ele a faça sem INVENTAR:\n//\n// findDeliveryAreas o único lugar de onde sai um código de município ou uma\n// chave de bairro. Nome que não volta daqui vira PERGUNTA,\n// nunca regra.\n// proposeDeliveryRules monta o rascunho na tela. Não grava nada.\n// setDeliveryRule corrige uma linha do rascunho (preço, prazo, desfecho).\n// commitDeliveryRules grava, depois que ela olhou a tabela.\n// checkDeliveryFor testa um CEP contra o que ficou salvo — o agente usa\n// para conferir antes de dizer que terminou, e a lojista\n// para perguntar \"por que fulano não conseguiu comprar?\".\n//\n// Preço e prazo NASCEM VAZIOS quando a mensagem não os diz. A mensagem acima não\n// diz nenhum dos dois, e um número inventado num campo de frete é pior que um\n// campo em branco: o branco ela vê, o inventado ela cobra.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INSTRUCTIONS = `\nEsta é a tela de Entrega da loja. Aqui você configura ONDE a loja entrega, ONDE ela recusa e onde precisa confirmar antes.\n\nUma regra tem duas partes: a ÁREA (um município ou um bairro) e o DESFECHO:\n· entrego (deliver) · confirmo antes (review) · não entrego (refuse)\nEntre as regras que casam com um endereço, vence a mais estrita. Então \"Zona Norte: entrego\" + \"Maré: não entrego\" são DUAS regras, e a segunda ganha na Maré. Nunca tente recortar uma área grande em pedaços para abrir exceção — declare a exceção.\n\nPREFIRA A ÁREA MAIOR MENOS AS EXCEÇÕES. É assim que o lojista fala, e é o que a regra mais estrita permite. Quando ele lista várias zonas de uma mesma cidade — \"zona norte, zona sul, zona oeste, zona sudoeste\" — isso É a cidade inteira: proponha UMA regra de município e as exceções, não oitenta bairros. Uma whitelist de bairros é pior de duas formas: ela envelhece (bairro que faltar na lista vira venda recusada em silêncio) e ninguém confere oitenta linhas.\n\nQuando a lojista colar uma mensagem descrevendo a operação dela:\n1. Separe cada lugar citado e se ele é entrega, recusa ou dúvida. \"Evitar X\", \"exceto X\" e \"não entregamos X\" são recusa.\n2. Chame \\`findDeliveryAreas\\` UMA vez com todos os nomes juntos.\n · \\`resolved\\` está pronto para virar regra.\n · \\`options\\` é ambíguo: pergunte qual, não escolha.\n · \\`notFound\\` é o caso importante. Muita comunidade não tem bairro nem CEP próprio — divide o do bairro vizinho. NÃO invente faixa de CEP para ela. Diga isso em uma linha e ofereça o que existe: marcar o bairro que a contém como \"confirmo antes\".\n · \\`group\\` (Zona Sul, Região dos Lagos) traz \\`members\\`. Use os membros como regras individuais SÓ quando ele citou uma parte da cidade. Se ele citou zonas que somam a cidade toda, jogue os grupos fora e use o município.\n3. Chame \\`proposeDeliveryRules\\` com o que resolveu. Ele NÃO grava — desenha a tabela na tela dela.\n4. Preço e prazo: só preencha o que a mensagem disse. Se ela não disse, deixe vazio e pergunte UMA vez, junto, no fim: \"quanto você cobra em cada região, e tem frete grátis acima de algum valor?\".\n5. Quando ela confirmar, chame \\`commitDeliveryRules\\`. Depois teste com \\`checkDeliveryFor\\` dois ou três CEPs (um que entrega, um que recusa) e relate o resultado em duas linhas.\n\nRegras:\n· Você NUNCA escreve um CEP ou um código de município que não tenha vindo de \\`findDeliveryAreas\\`.\n· NÃO proponha faixa de CEP. Faixa é como transportadora precifica, não como uma pessoa descreve onde entrega, e ninguém no mercado pede isso ao lojista. Ela existe só para quando a lojista estiver COPIANDO uma tabela de transportadora e disser os números ela mesma. Se você não achar a área pelo nome, pergunte — não caia na faixa.\n· Comunidade que não resolve pelo nome (Chapadão é o caso) não vira recusa inventada: ofereça marcar o bairro que a contém como \"confirmo antes\", que aceita o pedido e deixa a decisão com ele.\n· Não imprima a tabela inteira no texto: ela está na tela. Diga quantas regras entraram, quantas são recusa, e o que ficou em aberto.\n· Português do Brasil, curto.\n`.trim()\n\n// ---------------------------------------------------------------------------\n// Ferramentas\n// ---------------------------------------------------------------------------\n\nconst FIND_AREAS: PluginAITool = {\n id: 'shop.delivery.find-areas',\n name: 'findDeliveryAreas',\n description:\n 'Resolves place names the merchant wrote (\"Angra\", \"Zona Sul\", \"Barra da Tijuca\", \"Itacuruçá\") into real '\n + 'municipalities (IBGE code), neighbourhoods, or curated groups that expand into several of them. '\n + 'Send EVERY name of the message in one call. This is the ONLY source of a municipality code or a '\n + 'neighbourhood key — never write one that did not come from here. A name that answers `notFound` is a '\n + 'question for the merchant, not a rule to invent.',\n icon: 'MapPin',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n queries: {\n type: 'array',\n description: 'The place names as the merchant wrote them, without \"não entrego\" / \"exceto\".',\n items: { type: 'string' },\n },\n },\n required: ['queries'],\n },\n}\n\nconst PROPOSE_RULES: PluginAITool = {\n id: 'shop.delivery.propose-rules',\n name: 'proposeDeliveryRules',\n description:\n 'Draws the delivery rules the message describes as an EDITABLE TABLE on the merchant\\'s screen. '\n + 'Writes nothing. Every area must carry the ids findDeliveryAreas answered. A group is expanded into one '\n + 'rule per member here, so the merchant sees and trims what it covers. Leave rate and ETA out when the '\n + 'message did not state them.',\n icon: 'ListChecks',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n rules: {\n type: 'array',\n description: 'One entry per area named in the message.',\n items: {\n type: 'object',\n properties: {\n kind: {\n type: 'string',\n enum: ['city', 'district', 'group', 'postal_range'],\n description:\n 'The `kind` findDeliveryAreas answered. Use postal_range ONLY when the merchant is copying a '\n + 'carrier freight table and dictated the numbers — never to describe where they deliver.',\n },\n label: { type: 'string', description: 'The place name, as it should read on the table.' },\n cityCode: { type: 'string', description: 'IBGE code from findDeliveryAreas.' },\n districtKey: { type: 'string', description: 'Neighbourhood key from findDeliveryAreas.' },\n postalFrom: { type: 'string', description: 'Only for postal_range.' },\n postalTo: { type: 'string', description: 'Only for postal_range.' },\n outcome: {\n type: 'string',\n enum: ['deliver', 'review', 'refuse'],\n description: 'deliver | review (confirm before dispatch) | refuse.',\n },\n rate: { type: 'number', description: 'Only if the message stated a price. Otherwise omit.' },\n freeAbove: { type: 'number', description: 'Only if the message stated a threshold.' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n source: { type: 'string', description: 'The words of the message this rule came from.' },\n },\n required: ['kind', 'label', 'outcome'],\n },\n },\n gaps: {\n type: 'array',\n description: 'What the message named and you could NOT resolve, so the merchant sees it too.',\n items: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n reason: { type: 'string', description: 'Plain Portuguese, one line.' },\n },\n required: ['query', 'reason'],\n },\n },\n },\n required: ['rules'],\n },\n}\n\nconst SET_RULE: PluginAITool = {\n id: 'shop.delivery.set-rule',\n name: 'setDeliveryRule',\n description:\n 'Corrects one line of the draft table already on screen — its outcome, price, free-above or ETA. '\n + 'Use when the merchant answers a question about the rules you proposed, instead of rebuilding the whole draft.',\n icon: 'Pencil',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'The rule id proposeDeliveryRules answered.' },\n outcome: { type: 'string', enum: ['deliver', 'review', 'refuse'] },\n rate: { type: 'number' },\n freeAbove: { type: 'number' },\n etaMinDays: { type: 'number' },\n etaMaxDays: { type: 'number' },\n },\n required: ['id'],\n },\n}\n\nconst COMMIT_RULES: PluginAITool = {\n id: 'shop.delivery.commit-rules',\n name: 'commitDeliveryRules',\n description:\n 'Saves the draft table as the store\\'s delivery rules. Call ONLY after the merchant said the table is right. '\n + 'It changes who can buy: an address outside every rule cannot check out, and a refused one is blocked '\n + 'server-side. Saves the draft as it stands on screen — the merchant may have edited it, and those edits win.',\n icon: 'Save',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n permission: { feature: 'shop', action: 'update' },\n parameters: { type: 'object', properties: {} },\n}\n\nconst CHECK_DELIVERY: PluginAITool = {\n id: 'shop.delivery.check',\n name: 'checkDeliveryFor',\n description:\n 'Answers what the store does with a given postcode right now: deliver, confirm first, refuse, or outside '\n + 'every rule. Use it to CHECK YOUR OWN WORK after saving, and to answer \"why could this customer not buy?\".',\n icon: 'Search',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Shop',\n role: 'operations',\n parameters: {\n type: 'object',\n properties: {\n postalCodes: {\n type: 'array',\n description: 'One or more CEPs, with or without punctuation.',\n items: { type: 'string' },\n },\n },\n required: ['postalCodes'],\n },\n}\n\nexport const DELIVERY_AREA_TOOL_IDS = [\n FIND_AREAS.id, PROPOSE_RULES.id, SET_RULE.id, COMMIT_RULES.id, CHECK_DELIVERY.id,\n]\n\n// ---------------------------------------------------------------------------\n// Execução\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaDeps {\n getProvider: () => ShopProvider\n /** Chamado depois de gravar, para a tela recarregar as regras. */\n onSaved: () => void\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value.trim() : '')\n\nconst number = (value: unknown): number | null =>\n typeof value === 'number' && Number.isFinite(value) ? value : null\n\nconst OUTCOMES: DeliveryOutcome[] = ['deliver', 'review', 'refuse']\n\nconst outcomeOf = (value: unknown): DeliveryOutcome =>\n OUTCOMES.includes(value as DeliveryOutcome) ? (value as DeliveryOutcome) : 'deliver'\n\n/** Um candidato, na forma curta que o modelo lê sem despejar o banco na tela. */\nfunction candidateOut(area: AreaCandidate): Record<string, unknown> {\n return {\n kind: area.kind,\n label: area.label,\n cityCode: area.cityCode ?? undefined,\n cityName: area.cityName ?? undefined,\n state: area.state ?? undefined,\n districtKey: area.districtKey ?? undefined,\n knownPostalCodes: area.knownPostalCodes || undefined,\n members: area.members?.map((m) => ({\n kind: m.kind,\n label: m.label,\n cityCode: m.cityCode ?? undefined,\n districtKey: m.districtKey ?? undefined,\n })),\n }\n}\n\n/**\n * Um candidato é RESOLVIDO quando é o único, ou quando é exato e os outros não.\n * \"Angra\" traz \"Angra dos Reis\" e mais nada; \"Centro\" traz um grupo e trinta\n * bairros, e aí a pergunta é legítima.\n */\nfunction pickCandidate(query: string, areas: AreaCandidate[]): {\n resolved?: AreaCandidate\n options?: AreaCandidate[]\n} {\n if (areas.length === 0) return {}\n if (areas.length === 1) return { resolved: areas[0] }\n const key = query.trim().toLowerCase()\n const exact = areas.filter((a) => a.label.trim().toLowerCase() === key)\n if (exact.length === 1) return { resolved: exact[0] }\n return { options: areas.slice(0, 6) }\n}\n\nfunction ruleFromArgs(raw: Record<string, unknown>, index: number): DeliveryDraftRule | null {\n const kind = text(raw.kind)\n const label = text(raw.label)\n if (!label) return null\n\n const base = {\n id: `draft-${index}`,\n label,\n outcome: outcomeOf(raw.outcome),\n rate: number(raw.rate),\n freeAbove: number(raw.freeAbove),\n etaMinDays: number(raw.etaMinDays),\n etaMaxDays: number(raw.etaMaxDays),\n source: text(raw.source) || undefined,\n }\n\n if (kind === 'city') {\n const cityCode = text(raw.cityCode)\n if (!cityCode) return null\n return { ...base, matchKind: 'city' as ZoneMatchKind, cityCode }\n }\n if (kind === 'district') {\n const districtKey = text(raw.districtKey)\n if (!districtKey) return null\n return {\n ...base,\n matchKind: 'district' as ZoneMatchKind,\n districtKey,\n cityCode: text(raw.cityCode) || null,\n }\n }\n if (kind === 'postal_range') {\n const from = text(raw.postalFrom).replace(/\\D/g, '')\n const to = text(raw.postalTo).replace(/\\D/g, '')\n if (from.length !== 8 || to.length !== 8) return null\n return { ...base, matchKind: 'postal_range' as ZoneMatchKind, postalFrom: from, postalTo: to }\n }\n return null\n}\n\n/** A regra do rascunho, na forma que o provider grava. */\nexport function zoneInputFrom(rule: DeliveryDraftRule): CreateShippingZoneInput {\n return {\n name: rule.label,\n carrier: null,\n matchKind: rule.matchKind,\n cityCode: rule.cityCode ?? null,\n districtKey: rule.districtKey ?? null,\n outcome: rule.outcome,\n postalFrom: rule.postalFrom ?? null,\n postalTo: rule.postalTo ?? null,\n // Uma regra de recusa não cobra nada: o preço dela nunca é lido.\n rate: rule.outcome === 'refuse' ? 0 : (rule.rate ?? 0),\n freeAbove: rule.freeAbove ?? null,\n etaMinDays: rule.etaMinDays ?? null,\n etaMaxDays: rule.etaMaxDays ?? null,\n active: true,\n sortOrder: 0,\n excluded: rule.outcome === 'refuse',\n }\n}\n\nexport function createDeliveryAreaTools({ getProvider, onSaved }: DeliveryAreaDeps): AgentSurfaceTool[] {\n const failed = (error: unknown) => ({ ok: false, error: errorMessage(error) })\n\n return [\n {\n tool: FIND_AREAS,\n execute: async (args) => {\n const queries = (Array.isArray(args.queries) ? args.queries : [])\n .map(text).filter(Boolean).slice(0, 30)\n if (queries.length === 0) return { ok: false, error: 'no_queries' }\n try {\n const shop = getProvider()\n if (typeof shop.findAreas !== 'function') {\n return { ok: false, error: 'area_lookup_unavailable' }\n }\n const results = await Promise.all(\n queries.map(async (query) => {\n const areas = await shop.findAreas!(query, 8).catch(() => [])\n const { resolved, options } = pickCandidate(query, areas)\n if (resolved) return { query, resolved: candidateOut(resolved) }\n if (options) return { query, options: options.map(candidateOut) }\n return {\n query,\n notFound: true,\n // Dito aqui e não deixado para o modelo deduzir: é a frase que\n // separa \"não existe\" de \"existe mas não dá para separar por CEP\".\n hint:\n 'Sem município, bairro ou grupo com esse nome. Comunidade normalmente não tem CEP próprio — '\n + 'divide o do bairro vizinho. Pergunte à lojista qual bairro a contém.',\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: PROPOSE_RULES,\n execute: async (args) => {\n const raw = Array.isArray(args.rules) ? args.rules : []\n const rules: DeliveryDraftRule[] = []\n const gaps: DeliveryDraftGap[] = (Array.isArray(args.gaps) ? args.gaps : [])\n .map((g: any) => ({ query: text(g?.query), reason: text(g?.reason) }))\n .filter((g: DeliveryDraftGap) => g.query)\n\n raw.forEach((entry: any, index: number) => {\n const rule = ruleFromArgs(entry ?? {}, rules.length)\n if (rule) {\n rules.push(rule)\n return\n }\n // Recusada, e dito por quê: uma regra sem código de município é\n // exatamente o palpite que este desenho existe para impedir.\n gaps.push({\n query: text(entry?.label) || `regra ${index + 1}`,\n reason:\n 'Faltou o identificador da área. Chame findDeliveryAreas para este nome e use o que ele responder.',\n })\n })\n\n if (rules.length === 0 && gaps.length === 0) return { ok: false, error: 'empty_draft' }\n\n setDeliveryDraft({ rules, gaps })\n return {\n ok: true,\n drafted: rules.length,\n refusing: rules.filter((r) => r.outcome === 'refuse').length,\n reviewing: rules.filter((r) => r.outcome === 'review').length,\n missingPrice: rules.filter((r) => r.outcome !== 'refuse' && r.rate == null).length,\n gaps,\n rules: rules.map((r) => ({ id: r.id, label: r.label, outcome: r.outcome })),\n nextStep: 'commitDeliveryRules',\n }\n },\n },\n\n {\n tool: SET_RULE,\n execute: async (args) => {\n const id = text(args.id)\n if (!id) return { ok: false, error: 'no_id' }\n const patch: Partial<DeliveryDraftRule> = {}\n if (args.outcome !== undefined) patch.outcome = outcomeOf(args.outcome)\n if (args.rate !== undefined) patch.rate = number(args.rate)\n if (args.freeAbove !== undefined) patch.freeAbove = number(args.freeAbove)\n if (args.etaMinDays !== undefined) patch.etaMinDays = number(args.etaMinDays)\n if (args.etaMaxDays !== undefined) patch.etaMaxDays = number(args.etaMaxDays)\n if (Object.keys(patch).length === 0) return { ok: false, error: 'nothing_to_change' }\n if (!updateDeliveryDraftRule(id, patch)) return { ok: false, error: 'rule_not_in_draft' }\n return { ok: true, id, ...patch }\n },\n },\n\n {\n tool: COMMIT_RULES,\n execute: async () => {\n // O rascunho é lido AGORA, da tela, e não dos argumentos: entre propor e\n // confirmar a lojista pode ter corrigido um preço, e é a correção dela\n // que vale.\n const { rules } = getDeliveryDraft()\n if (rules.length === 0) return { ok: false, error: 'nothing_to_save' }\n try {\n const shop = getProvider()\n if (typeof shop.createShippingZone !== 'function') {\n return { ok: false, error: 'zones_unavailable' }\n }\n const saved: string[] = []\n const rejected: Array<{ label: string; error: string }> = []\n for (const rule of rules) {\n try {\n await shop.createShippingZone(zoneInputFrom(rule))\n saved.push(rule.label)\n } catch (error) {\n rejected.push({ label: rule.label, error: errorMessage(error) })\n }\n }\n if (saved.length > 0) {\n clearDeliveryDraft()\n onSaved()\n }\n return { ok: rejected.length === 0, saved: saved.length, rejected }\n } catch (error) {\n return failed(error)\n }\n },\n },\n\n {\n tool: CHECK_DELIVERY,\n execute: async (args) => {\n const codes = (Array.isArray(args.postalCodes) ? args.postalCodes : [])\n .map((c) => text(c).replace(/\\D/g, ''))\n .filter((c) => c.length === 8)\n .slice(0, 10)\n if (codes.length === 0) return { ok: false, error: 'no_postal_codes' }\n try {\n const shop = getProvider()\n if (typeof shop.checkDelivery !== 'function') {\n return { ok: false, error: 'delivery_check_unavailable' }\n }\n const results = await Promise.all(\n codes.map(async (code) => {\n const check = await shop.checkDelivery!(code)\n return {\n postalCode: code,\n // null = nenhuma regra casou: fora de área, que não é o mesmo\n // que recusado e o texto para a lojista é outro.\n outcome: check.outcome ?? null,\n rule: check.zoneName ?? check.refusedZone ?? null,\n outsideEveryRule: !check.refused && !check.ownZone,\n }\n }),\n )\n return { ok: true, results }\n } catch (error) {\n return failed(error)\n }\n },\n },\n ]\n}\n","import * as React from 'react'\nimport { useAgentSurface, type AgentSurfaceContribution, type AskAIIntro } from '@fayz-ai/admin'\nimport type { ShippingZone, ShopProvider } from '@fayz-ai/shop'\nimport { createDeliveryAreaTools, DELIVERY_AREAS_INSTRUCTIONS } from './delivery-agent'\nimport { getDeliveryDraft } from './delivery-draft'\n\n// ---------------------------------------------------------------------------\n// A tela de Entrega, entregue ao assistente.\n//\n// Não desenha nada. Publica o que já está configurado, o rascunho em curso, e\n// as ferramentas de configurar região enquanto a aba estiver montada.\n//\n// O `describe` inclui o rascunho de propósito: sem isso o agente propõe uma\n// tabela e, na mensagem seguinte, não sabe mais o que propôs — e a lojista\n// corrigindo um preço na tela vira uma correção que ele não enxerga.\n// ---------------------------------------------------------------------------\n\nexport const DELIVERY_AREAS_INTRO: AskAIIntro = {\n role: 'operations',\n persona: 'Entrega',\n pitch: 'Me conte onde você entrega, do seu jeito.',\n description:\n 'Escreva como você falaria com um cliente — \"entrego na Zona Norte menos Chapadão, não vou para Angra\" — '\n + 'que eu resolvo cada região e monto a tabela para você conferir e salvar.',\n suggestions: [\n { label: 'Onde eu entrego hoje?' },\n { label: 'Por que um CEP foi recusado?' },\n ],\n}\n\nexport interface DeliveryAgentSurfaceProps {\n provider: () => ShopProvider\n zones: ShippingZone[]\n onSaved: () => void\n}\n\nexport function DeliveryAgentSurface({ provider, zones, onSaved }: DeliveryAgentSurfaceProps) {\n const live = React.useRef({ provider, zones, onSaved })\n live.current = { provider, zones, onSaved }\n\n const contribution = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'shop.delivery.settings',\n pluginId: 'shop',\n role: 'operations',\n instructions: DELIVERY_AREAS_INSTRUCTIONS,\n describe: () => {\n const { zones: rows } = live.current\n const draft = getDeliveryDraft()\n const byOutcome = (outcome: string) =>\n rows.filter((z) => z.active && (z.outcome ?? (z.excluded ? 'refuse' : 'deliver')) === outcome)\n return {\n title: 'Configuração — Entrega',\n state: {\n screen: '/settings/shop-shipping',\n savedRules: {\n delivering: byOutcome('deliver').length,\n reviewing: byOutcome('review').length,\n refusing: byOutcome('refuse').length,\n // Os nomes, não as faixas: o agente precisa saber o que JÁ existe\n // para não propor a mesma região duas vezes.\n names: rows.filter((z) => z.active).slice(0, 40).map((z) => z.name),\n },\n draft: draft.rules.length === 0 && draft.gaps.length === 0\n ? null\n : {\n rules: draft.rules.map((r) => ({\n id: r.id,\n label: r.label,\n outcome: r.outcome,\n rate: r.rate ?? null,\n freeAbove: r.freeAbove ?? null,\n })),\n gaps: draft.gaps,\n },\n },\n }\n },\n tools: createDeliveryAreaTools({\n getProvider: () => live.current.provider(),\n onSaved: () => live.current.onSaved(),\n }),\n }), [])\n\n useAgentSurface(contribution)\n return null\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { AreaCandidate, DeliveryOutcome } from '@fayz-ai/shop'\nimport { Ban, Building2, Check, Loader2, MapPin, Plus, Search, Sparkles } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { addDeliveryDraftRules, isInDeliveryDraft, useDeliveryDraft } from './delivery-draft'\nimport type { DeliveryDraftRule } from './delivery-draft'\nimport { Button, Input } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// \"Onde você entrega?\" e, logo abaixo, \"e onde você NÃO entrega?\".\n//\n// A forma das duas caixas é a forma da frase que a lojista escreveu:\n//\n// \"Entregamos zona norte (evitar Chapadão e Maré), zona sul (exceto Rocinha,\n// Vidigal e comunidades), zona sudoeste e zona oeste.\"\n//\n// As quatro zonas que ela lista SÃO a cidade inteira. Ela não está montando uma\n// whitelist de bairros — está dizendo \"o Rio todo, menos estas exceções\". Um\n// seletor que só soma áreas obriga a escolher cento e sessenta e três bairros\n// para depois tirar quatro, e o que faltar da lista vira venda recusada em\n// silêncio.\n//\n// Então o município aparece como CIDADE INTEIRA, em primeiro lugar, e a segunda\n// caixa só existe depois que há algo a excluir. Duas perguntas, na ordem em que\n// ela fala.\n//\n// O que ela escolhe cai no MESMO RASCUNHO que o agente escreve — quem clicou e\n// depois disse \"ah, e não vou em Angra\" vê tudo na mesma tabela e salva uma vez.\n// ---------------------------------------------------------------------------\n\nconst MIN_QUERY = 2\nconst DEBOUNCE_MS = 250\n\nfunction ruleFor(area: AreaCandidate, outcome: DeliveryOutcome): Omit<DeliveryDraftRule, 'id'> | null {\n if (area.kind === 'city' && area.cityCode) {\n return { matchKind: 'city', label: area.label, cityCode: area.cityCode, outcome }\n }\n if (area.kind === 'district' && area.districtKey) {\n return {\n matchKind: 'district',\n label: area.label,\n districtKey: area.districtKey,\n cityCode: area.cityCode ?? null,\n outcome,\n }\n }\n return null\n}\n\n/** Um grupo vira N regras — e é isso que a lojista confere e poda na tabela. */\nfunction rulesFor(area: AreaCandidate, outcome: DeliveryOutcome): Array<Omit<DeliveryDraftRule, 'id'>> {\n if (area.kind !== 'group') {\n const single = ruleFor(area, outcome)\n return single ? [single] : []\n }\n return (area.members ?? []).flatMap((member) => {\n const rule = ruleFor(\n { kind: member.kind, label: member.label, cityCode: member.cityCode, districtKey: member.districtKey },\n outcome,\n )\n return rule ? [rule] : []\n })\n}\n\nfunction areaMeta(area: AreaCandidate): string {\n // O motivo ganha da categoria: \"Itacuruçá é distrito de Mangaratiba\" explica\n // por que a linha diz Mangaratiba quando ela digitou outra coisa.\n if (area.matchedAs) return area.matchedAs\n if (area.kind === 'group') {\n const n = area.members?.length ?? 0\n return `${n} ${n === 1 ? 'região' : 'regiões'}${area.cityName ? ` · ${area.cityName}` : ''}`\n }\n // \"Cidade inteira\" e não \"Município\": é a diferença entre a lojista entender\n // que uma linha cobre tudo e achar que precisa somar bairro por bairro.\n if (area.kind === 'city') return `Cidade inteira${area.state ? ` · ${area.state}` : ''}`\n return `Bairro${area.cityName ? ` · ${area.cityName}` : ''}`\n}\n\nconst areaKeyOf = (area: AreaCandidate) =>\n `${area.kind}:${area.districtKey ?? area.cityCode ?? area.label}`\n\n// ---------------------------------------------------------------------------\n\ninterface AreaSearchProps {\n provider?: ShopProviderResolver\n outcome: DeliveryOutcome\n placeholder: string\n /** Restringe o resultado às cidades que a loja já cobre. */\n onlyCityCodes?: string[]\n emptyHint: React.ReactNode\n}\n\nfunction AreaSearch({ provider, outcome, placeholder, onlyCityCodes, emptyHint }: AreaSearchProps) {\n const [query, setQuery] = React.useState('')\n const [results, setResults] = React.useState<AreaCandidate[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n const [unavailable, setUnavailable] = React.useState(false)\n const [justAdded, setJustAdded] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n const text = query.trim()\n if (text.length < MIN_QUERY) {\n setResults(null)\n return undefined\n }\n let cancelled = false\n setLoading(true)\n const timer = setTimeout(() => {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.findAreas !== 'function') {\n if (!cancelled) { setUnavailable(true); setLoading(false) }\n return\n }\n void shop\n .findAreas(text, 10)\n .then((list) => { if (!cancelled) { setResults(list); setUnavailable(false) } })\n // Uma busca que não responde é a MESMA coisa que uma busca vazia para\n // quem está olhando — o que não pode acontecer é a tela sugerir que a\n // pessoa digite a faixa de CEP no lugar.\n .catch(() => { if (!cancelled) { setResults([]); setUnavailable(true) } })\n .finally(() => { if (!cancelled) setLoading(false) })\n }, DEBOUNCE_MS)\n return () => { cancelled = true; clearTimeout(timer) }\n }, [query, provider])\n\n const add = (area: AreaCandidate) => {\n const rules = rulesFor(area, outcome)\n if (rules.length === 0) return\n const added = addDeliveryDraftRules(rules)\n setJustAdded(areaKeyOf(area))\n setTimeout(() => setJustAdded(null), 1400)\n if (added > 0) setQuery('')\n }\n\n // Na caixa das exceções, oferecer um bairro de outra cidade é ruído: ela está\n // recortando o que já cobre.\n const visible = (results ?? []).filter((area) => {\n if (!onlyCityCodes || onlyCityCodes.length === 0) return true\n if (area.kind === 'city') return true\n return !area.cityCode || onlyCityCodes.includes(area.cityCode)\n })\n\n return (\n <>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className=\"h-auto rounded-lg border-border bg-background py-2 pl-9 pr-9\"\n />\n {loading && (\n <Loader2 className=\"absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-muted-foreground\" />\n )}\n </div>\n\n {results !== null && (\n <ul className=\"mt-2 max-h-72 divide-y divide-border overflow-y-auto rounded-lg border border-border\">\n {visible.length === 0 && (\n <li className=\"px-3 py-6 text-center text-xs text-muted-foreground\">\n {unavailable ? 'A busca de regiões ainda não está disponível neste banco.' : emptyHint}\n </li>\n )}\n {visible.map((area) => {\n const key = areaKeyOf(area)\n const already = area.kind !== 'group' && isInDeliveryDraft({\n matchKind: area.kind === 'city' ? 'city' : 'district',\n cityCode: area.cityCode ?? null,\n districtKey: area.districtKey ?? null,\n })\n return (\n <li key={key}>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => add(area)}\n disabled={already}\n className=\"font-normal justify-start rounded-none whitespace-normal flex w-full items-center gap-3 px-3 py-2.5 text-left transition hover:bg-muted/50 disabled:opacity-50\"\n >\n {area.kind === 'city'\n ? <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n : <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{area.label}</span>\n <span className=\"block text-xs text-muted-foreground\">\n {areaMeta(area)}\n {/* Zero CEP visto não é defeito — é o primeiro dia da loja.\n Dizer isso evita que ela ache que o nome está errado. */}\n {area.kind === 'district' && !area.knownPostalCodes && ' · ainda sem CEP visto'}\n </span>\n </span>\n {justAdded === key\n ? <Check className=\"h-4 w-4 shrink-0 text-emerald-600\" />\n : already\n ? <span className=\"shrink-0 text-xs text-muted-foreground\">já escolhido</span>\n : <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n </Button>\n </li>\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport interface DeliveryAreaPickerProps {\n provider?: ShopProviderResolver\n /** Abre o assistente com a tela de Entrega em foco. */\n onAskAssistant?: () => void\n}\n\nexport function DeliveryAreaPicker({ provider, onAskAssistant }: DeliveryAreaPickerProps) {\n const draft = useDeliveryDraft()\n\n const covered = draft.rules.filter((r) => r.outcome !== 'refuse')\n const coveredCities = covered.filter((r) => r.matchKind === 'city')\n const exceptions = draft.rules.filter((r) => r.outcome === 'refuse')\n const cityCodes = covered.map((r) => r.cityCode).filter(Boolean) as string[]\n\n return (\n <div className=\"rounded-card border bg-card px-5 py-4 shadow-sm\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold\">Onde você entrega?</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n Digite uma cidade, um bairro ou uma região — \"Rio de Janeiro\", \"Ipanema\", \"Zona Sul\".\n Se você atende a cidade toda, uma linha só resolve: escolha a cidade.\n </p>\n </div>\n {onAskAssistant && (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onAskAssistant}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-xs font-medium hover:bg-muted\"\n >\n <Sparkles className=\"h-3.5 w-3.5 text-primary\" />\n Prefiro contar por escrito\n </Button>\n )}\n </div>\n\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"deliver\"\n placeholder=\"Cidade, bairro ou região…\"\n emptyHint=\"Nada com esse nome. Tente a cidade, ou conte por escrito ao assistente.\"\n />\n </div>\n\n {/*\n A segunda pergunta só existe depois da primeira, porque é literalmente a\n ordem da frase dela: \"entregamos X, evitar Y\". Perguntada antes, ela é\n ruído; perguntada depois, é o passo que a pessoa já ia dar.\n */}\n {covered.length > 0 && (\n <div className=\"mt-5 border-t border-border pt-4\">\n <div className=\"flex items-center gap-2\">\n <Ban className=\"h-4 w-4 text-destructive\" />\n <h4 className=\"text-sm font-semibold\">E onde você não entrega?</h4>\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {coveredCities.length > 0\n ? `Recortes dentro do que você já cobre — comunidade, bairro de risco, região distante. A exceção vence a área maior, então ${coveredCities[0].label} continua valendo em todo o resto.`\n : 'Regiões que você quer recusar mesmo estando perto do que já cobre. A exceção vence a área maior.'}\n </p>\n <div className=\"mt-3\">\n <AreaSearch\n provider={provider}\n outcome=\"refuse\"\n placeholder=\"Bairro ou região que você recusa…\"\n onlyCityCodes={cityCodes}\n emptyHint={\n <>\n Nada com esse nome. Comunidade normalmente não tem CEP próprio — divide o do\n bairro vizinho. Escolha o bairro que a contém e marque como “confirmo antes”\n na tabela.\n </>\n }\n />\n </div>\n </div>\n )}\n\n {draft.rules.length > 0 && (\n <p className=\"mt-3 text-xs text-muted-foreground\">\n {covered.length} {covered.length === 1 ? 'região' : 'regiões'} onde você entrega\n {exceptions.length > 0 && `, ${exceptions.length} ${exceptions.length === 1 ? 'exceção' : 'exceções'}`}\n {' '}— confira o preço na tabela abaixo e salve.\n </p>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { DeliveryOutcome } from '@fayz-ai/shop'\nimport { Check, Loader2, ListChecks, Trash2, X } from 'lucide-react'\nimport { errorMessage } from '../settings/error-message'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { zoneInputFrom } from './delivery-agent'\nimport {\n clearDeliveryDraft, removeDeliveryDraftRule, setAllDeliveryDraftRates,\n updateDeliveryDraftRule, useDeliveryDraft, type DeliveryDraftRule,\n} from './delivery-draft'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Button, DataTable, Input, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@fayz-ai/ui'\n\n// ---------------------------------------------------------------------------\n// A tabela que o agente monta e a lojista conserta.\n//\n// O cartão de confirmação do assistente mostra parâmetros; catorze regiões com\n// preço e prazo não cabem ali, e \"aprovar\" um JSON não é conferir. Então o\n// rascunho vira TELA: uma linha por regra, o desfecho num select, o preço num\n// campo, e o botão de salvar do lado de fora da conversa — ela pode corrigir\n// tudo e gravar sem dizer mais nada ao agente.\n//\n// Só aparece quando existe rascunho. Sem conversa, a tela de Entrega é a de\n// sempre.\n// ---------------------------------------------------------------------------\n\nconst OUTCOME_LABEL: Record<DeliveryOutcome, string> = {\n deliver: 'Entrego',\n review: 'Confirmo antes',\n refuse: 'Não entrego',\n}\n\nconst OUTCOME_TONE: Record<DeliveryOutcome, string> = {\n deliver: 'text-foreground',\n review: 'text-amber-600 dark:text-amber-500',\n refuse: 'text-destructive',\n}\n\n/** '12,50' e '12.50' são o mesmo número para quem está no balcão. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst money = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\nconst BULK_INPUT = 'h-auto rounded-md border-border bg-background px-2 py-1 text-xs shadow-none'\nconst FIELD_FRAME = 'inline-flex items-center rounded-md border border-border bg-background focus-within:ring-1 focus-within:ring-ring'\nconst FRAMED_INPUT = 'h-auto rounded-none border-0 bg-transparent py-1.5 text-xs shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'\n\nfunction ruleArea(rule: DeliveryDraftRule): string {\n if (rule.matchKind === 'postal_range') {\n const fmt = (c?: string | null) => (c ? `${c.slice(0, 5)}-${c.slice(5)}` : '?')\n return `${fmt(rule.postalFrom)} → ${fmt(rule.postalTo)}`\n }\n return rule.matchKind === 'city' ? 'Município' : 'Bairro'\n}\n\nexport interface DeliveryRulesDraftProps {\n provider?: ShopProviderResolver\n /** Recarrega a lista de zonas depois de gravar. */\n onSaved: () => void\n}\n\nexport function DeliveryRulesDraft({ provider, onSaved }: DeliveryRulesDraftProps) {\n const draft = useDeliveryDraft()\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [bulkRate, setBulkRate] = React.useState('')\n const [bulkFree, setBulkFree] = React.useState('')\n\n if (draft.rules.length === 0 && draft.gaps.length === 0) return null\n\n const refusing = draft.rules.filter((r) => r.outcome === 'refuse').length\n const reviewing = draft.rules.filter((r) => r.outcome === 'review').length\n const delivering = draft.rules.length - refusing - reviewing\n\n const columns: ColumnDef<DeliveryDraftRule>[] = [\n {\n id: 'region', header: 'Região', meta: { className: 'px-5 py-2.5' },\n cell: ({ row: { original: rule } }) => (\n <>\n <span className=\"font-medium\">{rule.label}</span>\n <span className=\"ml-2 text-xs text-muted-foreground\">{ruleArea(rule)}</span>\n {rule.source && (\n <p className=\"text-xs italic text-muted-foreground\">“{rule.source}”</p>\n )}\n </>\n ),\n },\n {\n id: 'outcome', header: 'O que faço', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => (\n <Select\n value={rule.outcome}\n onValueChange={(v) => updateDeliveryDraftRule(rule.id, { outcome: v as DeliveryOutcome })}\n >\n <SelectTrigger className={`h-auto w-auto gap-1.5 rounded-md border-border bg-background px-2 py-1.5 text-xs shadow-none ${OUTCOME_TONE[rule.outcome]}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {(Object.keys(OUTCOME_LABEL) as DeliveryOutcome[]).map((value) => (\n <SelectItem key={value} value={value}>{OUTCOME_LABEL[value]}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ),\n },\n // Recusa não cobra: mostrar campo de preço numa linha que nunca o lê\n // convida a lojista a preencher e a achar que cobrou.\n {\n id: 'rate', header: 'Frete', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse'\n ? <span className=\"text-xs text-muted-foreground\">não se cobra</span>\n : (\n <span className={FIELD_FRAME}>\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <div className=\"w-16\">\n <Input\n value={money(rule.rate)}\n placeholder=\"0,00\"\n aria-label={`Frete para ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, { rate: parseMoney(e.target.value) })}\n className={`${FRAMED_INPUT} px-1.5`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'freeAbove', header: 'Grátis acima de', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse' ? null : (\n <span className={FIELD_FRAME}>\n <span className=\"pl-2 text-xs text-muted-foreground\">R$</span>\n <div className=\"w-20\">\n <Input\n value={money(rule.freeAbove)}\n placeholder=\"nunca\"\n aria-label={`Frete grátis acima de, em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, { freeAbove: parseMoney(e.target.value) })}\n className={`${FRAMED_INPUT} px-1.5`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'eta', header: 'Prazo (dias)', meta: { className: 'px-2 py-2.5' },\n cell: ({ row: { original: rule } }) => rule.outcome === 'refuse' ? null : (\n <span className={FIELD_FRAME}>\n <div className=\"w-10\">\n <Input\n value={rule.etaMinDays ?? ''}\n placeholder=\"0\"\n inputMode=\"numeric\"\n aria-label={`Prazo mínimo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMinDays: e.target.value ? Number(e.target.value) : null,\n })}\n className={`${FRAMED_INPUT} pl-2 pr-0 text-center`}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">a</span>\n <div className=\"w-10\">\n <Input\n value={rule.etaMaxDays ?? ''}\n placeholder=\"2\"\n inputMode=\"numeric\"\n aria-label={`Prazo máximo em ${rule.label}`}\n onChange={(e) => updateDeliveryDraftRule(rule.id, {\n etaMaxDays: e.target.value ? Number(e.target.value) : null,\n })}\n className={`${FRAMED_INPUT} pl-0 pr-2 text-center`}\n />\n </div>\n </span>\n ),\n },\n {\n id: 'remove', header: '', meta: { className: 'px-5 py-2.5 text-right' },\n cell: ({ row: { original: rule } }) => (\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => removeDeliveryDraftRule(rule.id)}\n aria-label={`Remover ${rule.label}`}\n className=\"rounded-md p-1 text-muted-foreground hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n ),\n },\n ]\n\n const save = async () => {\n setSaving(true)\n setError(null)\n try {\n const shop = provider ? resolve(provider) : getShopProvider()\n if (typeof shop.createShippingZone !== 'function') {\n throw new Error('Este banco ainda não tem as regras de entrega.')\n }\n for (const rule of draft.rules) {\n await shop.createShippingZone(zoneInputFrom(rule))\n }\n clearDeliveryDraft()\n onSaved()\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <div className=\"rounded-card border border-primary/40 bg-primary/5 shadow-sm\">\n <div className=\"flex flex-wrap items-center gap-3 border-b border-primary/20 px-5 py-4\">\n <ListChecks className=\"h-4 w-4 text-primary\" />\n <div className=\"flex-1\">\n {/* Neutro de propósito: a mesma tabela recebe o que ela escolheu na\n busca e o que o assistente leu da mensagem dela. */}\n <p className=\"text-sm font-medium\">Regras a salvar</p>\n <p className=\"text-xs text-muted-foreground\">\n {delivering} entrega{delivering === 1 ? '' : 's'}\n {reviewing > 0 && `, ${reviewing} a confirmar`}\n {refusing > 0 && `, ${refusing} recusa${refusing === 1 ? '' : 's'}`}\n {' '}— confira e corrija antes de salvar. Nada foi gravado ainda.\n </p>\n </div>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={clearDeliveryDraft}\n disabled={saving}\n className=\"font-normal rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-muted\"\n >\n Descartar\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={save}\n disabled={saving || draft.rules.length === 0}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3.5 py-2 text-xs font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-50\"\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : <Check className=\"h-3.5 w-3.5\" />}\n Salvar {draft.rules.length} regra{draft.rules.length === 1 ? '' : 's'}\n </Button>\n </div>\n\n {error && (\n <p className=\"px-5 pt-3 text-xs text-destructive\">{error}</p>\n )}\n\n {/* O mesmo frete em todas de uma vez. Quem escolheu catorze bairros cobra\n o mesmo nos catorze, e digitar catorze vezes é exatamente onde a\n configuração é abandonada. Linhas de recusa ficam de fora sozinhas. */}\n {delivering + reviewing > 1 && (\n <div className=\"flex flex-wrap items-center gap-2 border-b border-primary/10 px-5 py-3\">\n <span className=\"text-xs text-muted-foreground\">Mesmo preço em todas:</span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">R$</span>\n <div className=\"w-20\">\n <Input\n value={bulkRate}\n onChange={(e) => setBulkRate(e.target.value)}\n placeholder=\"15,00\"\n aria-label=\"Frete para todas as regiões\"\n className={BULK_INPUT}\n />\n </div>\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground\">grátis acima de R$</span>\n <div className=\"w-24\">\n <Input\n value={bulkFree}\n onChange={(e) => setBulkFree(e.target.value)}\n placeholder=\"opcional\"\n aria-label=\"Frete grátis acima de, para todas as regiões\"\n className={BULK_INPUT}\n />\n </div>\n </span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => {\n setAllDeliveryDraftRates({\n rate: parseMoney(bulkRate),\n freeAbove: parseMoney(bulkFree),\n })\n setBulkRate('')\n setBulkFree('')\n }}\n disabled={!bulkRate.trim() && !bulkFree.trim()}\n className=\"rounded-md border border-border px-2.5 py-1 text-xs font-medium hover:bg-muted disabled:opacity-40\"\n >\n Aplicar\n </Button>\n </div>\n )}\n\n {draft.rules.length > 0 && <DataTable variant=\"bare\" columns={columns} data={draft.rules} />}\n\n {draft.gaps.length > 0 && (\n <div className=\"border-t border-primary/20 px-5 py-3.5\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n O que ficou de fora — e por quê\n </p>\n <ul className=\"mt-1 space-y-1\">\n {draft.gaps.map((gap) => (\n <li key={gap.query} className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <X className=\"mt-0.5 h-3 w-3 shrink-0 text-destructive\" />\n <span><span className=\"font-medium text-foreground\">{gap.query}</span> — {gap.reason}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport {\n SettingsGroup, TextRow, RegistryCrudView,\n useConnectors, ConnectorRow, ConnectorDetail,\n openConnectorsPanel, useConnectorsPanelAvailable,\n type UnifiedConnector,\n} from '@fayz-ai/admin'\nimport { getShopProvider } from '@fayz-ai/shop'\nimport type { ShippingSettings as ShippingSettingsRow, ShippingZone, StockLocation } from '@fayz-ai/shop'\nimport { AlertTriangle, ArrowRight, Car, Loader2, MapPin, Truck, Warehouse } from 'lucide-react'\nimport { resolve, type ShopProviderResolver } from '../data/shared'\nimport { errorMessage } from './error-message'\nimport { PackagesSettings } from './PackagesSettings'\nimport {\n buildShopRegistries, locationSummary, LOCATIONS_REGISTRY, SHIPPING_ZONES_REGISTRY,\n} from '../data/registries'\nimport { shippingRecordPath, shippingRegistryIdFromHash, shippingRegistryPath } from '../data/registry-routes'\nimport { HandlingSettings } from './HandlingSettings'\nimport { ChoiceCards } from './ChoiceCards'\nimport { useStoreSettings } from './useStoreSettings'\nimport { DeliveryAgentSurface } from '../views/DeliveryAgentSurface'\nimport { DeliveryAreaPicker } from '../views/DeliveryAreaPicker'\nimport { DeliveryRulesDraft } from '../views/DeliveryRulesDraft'\nimport { Button } from '@fayz-ai/ui'\n\nexport interface ShippingSettingsProps {\n provider?: ShopProviderResolver\n}\n\n/** Money in, as typed: '12,50' and '12.50' are the same number to a shopkeeper. */\nfunction parseMoney(raw: string): number | null {\n const cleaned = raw.replace(/[^\\d,.-]/g, '').replace(',', '.')\n if (!cleaned.trim()) return null\n const n = Number(cleaned)\n return Number.isFinite(n) && n >= 0 ? Math.round(n * 100) / 100 : null\n}\n\nconst formatMoney = (v: number | null | undefined): string =>\n v == null ? '' : String(v).replace('.', ',')\n\ntype FreightSource = 'own' | 'gateway'\n\n/** Stored rather than inferred from \"no connection\": connecting a gateway must not\n * start quoting carriers for a store that dispatches by hand. */\nconst FREIGHT_SOURCE: ReadonlyArray<{\n value: FreightSource\n label: string\n description: string\n Icon: React.ComponentType<{ className?: string }>\n}> = [\n {\n value: 'own',\n label: 'Eu mesmo calculo e despacho',\n description:\n 'O frete sai do preço base e das suas faixas de CEP, e você despacha como quiser — carro próprio, motoboy, agência. Nenhum gateway é consultado, mesmo que exista um conectado.',\n Icon: Car,\n },\n {\n value: 'gateway',\n label: 'Perguntar a um gateway de frete',\n description:\n 'O preço e o prazo vêm da transportadora, calculados pelo CEP do comprador. Quando o gateway não responde a tempo, o checkout usa suas faixas — a compra nunca fica sem preço.',\n Icon: Truck,\n },\n]\n\n/**\n * Entrega — o preço base, as zonas e quem coleta.\n *\n * A ORDEM DE PRECEDÊNCIA é o assunto desta tela, e está escrita nela em vez de\n * só no SQL: uma ZONA que cobre o CEP ganha do preço base; o preço base é o que\n * a loja cobra para um endereço que nenhuma zona cobre. Sem isso dito, um\n * lojista que criou uma zona não entende por que o número que ele digitou aqui\n * não aparece no checkout.\n *\n * O preço base vive em public.shipping_settings desde a 0015 e, até agora, só\n * podia ser escrito por SQL à mão — a tabela existia, com RLS e leitura anônima,\n * e nenhuma tela. É este arquivo que fecha isso.\n *\n * ZONAS E EMBALAGENS SÃO CADASTROS, e desde a FAY-1407 são cadastros DAQUI. As\n * zonas moravam numa página de CRUD própria em /store/shipping, então clicar em\n * \"Zonas de entrega\" no meio de configurar a entrega jogava o lojista para fora\n * de Configurações e o trazia de volta pela seta do navegador. Agora as duas\n * abrem em `_properties/<id>` dentro desta mesma tela, pelo `RegistryCrudView`\n * genérico — o mesmo que desenha feriados e locais.\n */\n\nexport function ShippingSettings({ provider }: ShippingSettingsProps) {\n // A rota mais funda ganha: /settings/shop-shipping/_properties/zonas é a\n // mesma aba, mostrando o cadastro em vez do resumo. Sem isso a lista de zonas\n // apareceria inteira embaixo do preço base o tempo todo.\n const [registryId, setRegistryId] = React.useState(shippingRegistryIdFromHash)\n React.useEffect(() => {\n const handler = () => setRegistryId(shippingRegistryIdFromHash())\n window.addEventListener('hashchange', handler)\n return () => window.removeEventListener('hashchange', handler)\n }, [])\n\n const shop = React.useMemo(() => (provider ? resolve(provider) : getShopProvider()), [provider])\n const registries = React.useMemo(\n () => buildShopRegistries(provider ?? getShopProvider),\n [provider],\n )\n // One read of plg_shop_settings for the whole screen: both sections below are\n // slices of the same tenant row.\n const storeSettings = useStoreSettings(provider)\n const supported = typeof shop.getShippingSettings === 'function' && typeof shop.updateShippingSettings === 'function'\n\n const [row, setRow] = React.useState<ShippingSettingsRow | null>(null)\n const [zones, setZones] = React.useState<ShippingZone[] | null>(null)\n const [locations, setLocations] = React.useState<StockLocation[] | null>(null)\n const [loading, setLoading] = React.useState(supported)\n const [saving, setSaving] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n // Drafts, because these are TEXT inputs over numbers: committing on every\n // keystroke would turn '1' into a R$ 1,00 flat rate on the way to '15'. They\n // commit on blur, which is also when the parse refusal can be shown without\n // fighting the person still typing.\n const [flatDraft, setFlatDraft] = React.useState('')\n const [freeDraft, setFreeDraft] = React.useState('')\n const [flatBad, setFlatBad] = React.useState(false)\n const [freeBad, setFreeBad] = React.useState(false)\n\n const { connectors } = useConnectors({ hostPluginId: 'shop', includeGrants: false })\n const [selected, setSelected] = React.useState<UnifiedConnector | null>(null)\n const panelAvailable = useConnectorsPanelAvailable()\n const openJourney = React.useCallback(\n (connector: UnifiedConnector) => {\n if (panelAvailable) openConnectorsPanel(connector)\n else setSelected(connector)\n },\n [panelAvailable],\n )\n const carriers = React.useMemo(\n () => (connectors ?? []).filter((c) => c.category === 'logistics' || c.category === 'shipping'),\n [connectors],\n )\n // 'ready' means declared and installed, not connected.\n const carriersConnected = carriers.some((c) => c.state !== 'ready')\n\n // Bumped after the assistant (or the draft panel) writes rules, so the cards\n // below re-read instead of showing the count from before the save.\n const [zonesEpoch, setZonesEpoch] = React.useState(0)\n const reloadZones = React.useCallback(() => setZonesEpoch((n) => n + 1), [])\n\n React.useEffect(() => {\n let cancelled = false\n if (supported) {\n setLoading(true)\n void shop\n .getShippingSettings!()\n .then((settings) => {\n if (cancelled) return\n setRow(settings)\n setFlatDraft(formatMoney(settings?.flatRate ?? 0))\n setFreeDraft(formatMoney(settings?.freeAbove))\n })\n .catch((e) => { if (!cancelled) setLoadError(errorMessage(e)) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n void shop.listShippingZones?.()\n .then((list) => { if (!cancelled) setZones(list) })\n .catch(() => { if (!cancelled) setZones([]) })\n void shop.listStockLocations?.()\n .then((list) => { if (!cancelled) setLocations(list) })\n .catch(() => { if (!cancelled) setLocations([]) })\n return () => { cancelled = true }\n }, [shop, supported, zonesEpoch])\n\n const save = React.useCallback(\n (patch: Partial<ShippingSettingsRow>) => {\n if (!supported) return\n setSaving(true)\n setError(null)\n void shop\n .updateShippingSettings!(patch)\n .then((saved) => setRow(saved))\n .catch((e) => setError(errorMessage(e)))\n .finally(() => setSaving(false))\n },\n [shop, supported],\n )\n\n const commitFlat = () => {\n const parsed = parseMoney(flatDraft)\n // Empty means zero here — \"I charge nothing\" is a decision a store makes, and\n // it is also the column's default, so there is nothing ambiguous to refuse.\n const next = flatDraft.trim() === '' ? 0 : parsed\n if (next == null) { setFlatBad(true); return }\n setFlatBad(false)\n setFlatDraft(formatMoney(next))\n if (next !== (row?.flatRate ?? 0)) save({ flatRate: next })\n }\n\n const commitFree = () => {\n // Empty is NULL, not zero: \"no threshold\" and \"free from R$ 0\" are opposite\n // policies, and a zero here would make every order's delivery free.\n if (freeDraft.trim() === '') {\n setFreeBad(false)\n if (row?.freeAbove != null) save({ freeAbove: null })\n return\n }\n const parsed = parseMoney(freeDraft)\n if (parsed == null) { setFreeBad(true); return }\n setFreeBad(false)\n setFreeDraft(formatMoney(parsed))\n if (parsed !== row?.freeAbove) save({ freeAbove: parsed })\n }\n\n // An exclusion is active and is NOT a delivery zone.\n // `outcome` is 0081's word; `excluded` is 0048's and stays as the fallback for\n // a pool that has not reached 0081 yet.\n const outcomeOf = (z: ShippingZone) => z.outcome ?? (z.excluded ? 'refuse' : 'deliver')\n const activeZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'deliver')\n const reviewZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'review')\n const excludedZones = (zones ?? []).filter((z) => z.active && outcomeOf(z) === 'refuse')\n // undefined = undecided, which asks the gateway if one is connected.\n const usesGateway = storeSettings.value.carrierQuotes !== false\n\n // Only active locations that dispatch: an archived warehouse and one that just\n // holds stock are both irrelevant to what the shopper is quoted.\n const dispatching = (locations ?? []).filter((l) => l.status === 'active' && l.shipsOnline !== false)\n const originCep = dispatching.find((l) => l.postalCode)?.postalCode ?? null\n\n // Looked up, never compared to a literal: a `registryId === 'zonas'` here kept\n // rendering Embalagens after the rename, with nothing visibly broken.\n const activeRegistry = registryId\n ? registries.find((candidate) => candidate.id === registryId) ?? null\n : null\n if (activeRegistry) {\n // No back button of its own: the shell draws the whole trail.\n return (\n <RegistryCrudView\n registry={activeRegistry}\n basePath={shippingRegistryPath(activeRegistry.id)}\n />\n )\n }\n\n return (\n <div className=\"space-y-4\">\n {loadError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-3 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-destructive\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Não foi possível carregar o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O valor abaixo é o padrão, não o da sua loja. Recarregue antes de alterá-lo — salvar\n agora sobrescreveria um preço que não conseguimos ler.\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">{loadError}</p>\n </div>\n )}\n {!supported ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-4 text-sm\">\n <p className=\"flex items-center gap-2 font-medium text-amber-700 dark:text-amber-500\">\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n Este app não guarda o preço base de entrega\n </p>\n <p className=\"mt-1 text-muted-foreground\">\n O provedor de loja montado aqui não implementa <code>getShippingSettings</code>.\n </p>\n </div>\n ) : (\n <SettingsGroup\n title=\"Preço base\"\n description=\"O que a loja cobra quando nenhuma zona cobre o endereço. Uma zona que cobre o CEP sempre ganha deste número.\"\n >\n <TextRow\n label=\"Frete padrão\"\n description=\"Em reais. Deixe 0 para entrega grátis.\"\n value={flatDraft}\n onChange={setFlatDraft}\n onBlurCommit={commitFlat}\n placeholder=\"0,00\"\n invalid={flatBad}\n hint={flatBad ? 'Informe um valor em reais (ex.: 19,90).' : undefined}\n disabled={loading}\n />\n <TextRow\n label=\"Frete grátis acima de\"\n description=\"Subtotal, já com desconto, a partir do qual a entrega sai de graça. Vazio = sem regra de frete grátis.\"\n value={freeDraft}\n onChange={setFreeDraft}\n onBlurCommit={commitFree}\n placeholder=\"Sem regra\"\n invalid={freeBad}\n hint={freeBad ? 'Informe um valor em reais, ou deixe vazio.' : undefined}\n disabled={loading}\n />\n </SettingsGroup>\n )}\n\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">De onde você despacha</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Os locais que guardam estoque e despacham pedidos. O CEP do local padrão é a origem que a\n transportadora usa para cotar o frete — é aqui que ele se cadastra, uma vez. Cada local\n pode ter o seu próprio despachante ou seguir a decisão da loja.\n </p>\n </div>\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n // Named ONE place? Open it. The list is only the answer when there\n // is nothing specific to point at.\n onClick={() => {\n window.location.hash = dispatching.length === 1 && dispatching[0]\n ? shippingRecordPath(LOCATIONS_REGISTRY, dispatching[0].id)\n : shippingRegistryPath(LOCATIONS_REGISTRY)\n }}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <Warehouse className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {locations == null\n ? 'Carregando locais…'\n : dispatching.length === 0\n ? 'Nenhum local despacha pedidos'\n : dispatching.length === 1\n ? dispatching[0]!.name\n : `${dispatching.length} locais despachando`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {locations == null\n ? ' '\n : dispatching.length === 0\n ? 'Cadastre o local de onde os pedidos saem.'\n : dispatching.slice(0, 2).map((l) => locationSummary(l)).join(' — ')}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n {/* The one failure this screen can predict: a gateway that is asked to\n quote from nowhere answers nothing, and the shopper sees the zone\n price forever without knowing why. */}\n {usesGateway && locations != null && dispatching.length > 0 && !originCep && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Nenhum local tem CEP de origem. Sem ele a transportadora não cota, e o checkout cai nas\n suas zonas — preencha o CEP do local padrão.\n </span>\n </div>\n )}\n </div>\n\n {/* space-y porque esta seção tem QUATRO cards empilhados agora (busca,\n rascunho, o que está salvo) — quando era um só, o div nu bastava e os\n cards nasceram grudados no dia em que os outros entraram. */}\n <div className=\"space-y-3\">\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Onde você entrega</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n As regiões onde a loja entrega, com preço, prazo e frete grátis próprios. Um endereço\n fora de todas elas cai no preço base acima; se a loja não tiver preço base nem região que\n o cubra, o checkout diz que não entrega ali. Uma região também pode ser uma recusa —\n «não entrego aqui» — e ela vence qualquer outra e qualquer gateway.\n </p>\n </div>\n <DeliveryAgentSurface\n provider={() => shop}\n zones={zones ?? []}\n onSaved={reloadZones}\n />\n <DeliveryAreaPicker provider={provider} />\n <DeliveryRulesDraft provider={provider} onSaved={reloadZones} />\n <div className=\"rounded-card border bg-card px-5 shadow-sm\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { window.location.hash = shippingRegistryPath(SHIPPING_ZONES_REGISTRY) }}\n className=\"font-normal justify-start whitespace-normal flex w-full items-center gap-3 py-3.5 text-left\"\n >\n <MapPin className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium\">\n {zones == null\n ? 'Carregando regiões…'\n : activeZones.length === 0\n ? 'Nenhuma região salva ainda'\n : `${activeZones.length} ${activeZones.length === 1 ? 'região onde entrego' : 'regiões onde entrego'}`}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {activeZones.length === 0\n ? 'Sem região salva, toda entrega usa o preço base. Escolha as suas na busca acima.'\n : activeZones.slice(0, 3).map((z) => z.name).join(' · ')}\n {activeZones.length > 3 && ` e ${activeZones.length - 3} mais`}\n {reviewZones.length > 0 && (\n <span className=\"mt-0.5 block text-amber-700 dark:text-amber-500\">\n {reviewZones.length === 1\n ? '1 região a confirmar antes de sair'\n : `${reviewZones.length} regiões a confirmar antes de sair`}\n {' — '}\n {reviewZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n {excludedZones.length > 0 && (\n <span className=\"mt-0.5 block text-red-700 dark:text-red-400\">\n {excludedZones.length === 1\n ? '1 região recusada'\n : `${excludedZones.length} regiões recusadas`}\n {' — '}\n {excludedZones.slice(0, 2).map((z) => z.name).join(' · ')}\n </span>\n )}\n </span>\n </span>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </Button>\n </div>\n </div>\n\n <PackagesSettings />\n\n {storeSettings.supported && (\n <div>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Quem calcula o frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n O Melhor Envio não é uma transportadora: é um gateway, uma conexão só que traz\n Correios, Jadlog, Loggi e outras. Então a escolha aqui não é qual transportadora — é\n se a loja calcula pelas próprias faixas ou se pergunta o preço a um gateway.\n </p>\n </div>\n <ChoiceCards\n label=\"Quem calcula o frete\"\n choices={FREIGHT_SOURCE}\n value={usesGateway ? 'gateway' : 'own'}\n onChange={(choice) => storeSettings.set({ carrierQuotes: choice === 'gateway' })}\n disabled={storeSettings.loading}\n />\n {/* Keeps the screen honest: with a gateway still connected the choice is\n recorded intent, not a guarantee. */}\n {!usesGateway && carriersConnected && (\n <div className=\"mt-2 flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600\" />\n <span className=\"text-muted-foreground\">\n Há um gateway ainda conectado abaixo. Para garantir que nenhum preço de\n transportadora apareça no checkout, desconecte-o — a escolha acima vale para a\n vitrine, a conexão continua existindo.\n </span>\n </div>\n )}\n </div>\n )}\n\n {carriers.length > 0 && (\n <div className={usesGateway ? undefined : 'opacity-60'}>\n <div className=\"px-1 pb-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Gateway de frete</h3>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n Conectado, ele cota o frete para o CEP do comprador em vez de a loja adivinhar. O preço\n cotado é gravado no servidor e é ele que o pedido cobra — o navegador escolhe entre\n opções, nunca informa um valor. Quais transportadoras aparecem vem da conta do\n gateway, não desta lista.\n </p>\n {!carriersConnected && (\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Nenhum conectado — a loja entrega por conta própria, pelo preço base e pelas zonas\n acima. Conectar é opcional e pode ficar para depois.\n </p>\n )}\n </div>\n <div className=\"rounded-card border bg-card shadow-sm\">\n <ul className=\"divide-y\">\n {carriers.map((connector) => (\n <ConnectorRow key={connector.id} connector={connector} onOpen={openJourney} />\n ))}\n </ul>\n </div>\n </div>\n )}\n\n <HandlingSettings settings={storeSettings} provider={provider} />\n\n <div className=\"flex min-h-5 items-center gap-1.5 px-1 text-xs text-muted-foreground\">\n {error ? (\n <span className=\"flex items-center gap-1.5 text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n Não foi possível salvar: {error}\n </span>\n ) : saving ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" />\n Salvando…\n </>\n ) : (\n 'As alterações são salvas ao sair do campo.'\n )}\n </div>\n\n <ConnectorDetail\n connector={selected}\n open={!!selected}\n onOpenChange={(open) => { if (!open) setSelected(null) }}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { SettingsGroup } from '@fayz-ai/admin'\nimport { Info } from 'lucide-react'\nimport type { StoreSettings } from '@fayz-ai/shop'\nimport type { ShopProviderResolver } from '../data/shared'\nimport { useStoreSettings } from './useStoreSettings'\nimport { SettingsState } from './SettingsState'\nimport { ChoiceCards } from './ChoiceCards'\n\nexport interface FulfillmentSettingsProps {\n provider?: ShopProviderResolver\n}\n\ntype Policy = NonNullable<StoreSettings['autoFulfill']>\n\n/**\n * Three mutually exclusive policies with a paragraph each — a radio, not a\n * dropdown. The difference between them is a sentence long, and a dropdown shows\n * one option at a time: choosing between \"quando o pagamento cair\" and \"sempre\"\n * requires reading both, which means both have to be on screen.\n */\nconst POLICIES: ReadonlyArray<{ value: Policy; label: string; description: string }> = [\n {\n value: 'on_payment',\n label: 'Dar baixa quando o pagamento for confirmado',\n description:\n 'A remessa é criada assim que o pedido é pago — pelo gateway ou por você aqui no admin. É a opção segura: nada sai antes de o dinheiro entrar.',\n },\n {\n value: 'always',\n label: 'Dar baixa em todo pedido, automaticamente',\n description:\n 'A remessa nasce junto com o pedido, pago ou não. Para quem cobra na entrega ou separa antes de receber.',\n },\n {\n value: 'never',\n label: 'Não dar baixa automática',\n description: 'Cada remessa é criada à mão, na tela do pedido. É o padrão.',\n },\n]\n\n/**\n * Fulfillment — se a remessa nasce sozinha.\n *\n * Uma decisão só, e ela é sobre QUANDO um registro de remessa passa a existir —\n * não sobre quem entrega. `public.fulfillments` e `fulfillment_items` já existem\n * desde a 0018, com o `fulfillment_status` do pedido DERIVADO deles por trigger;\n * a política escolhida aqui é lida por um trigger da 0045 que insere a remessa\n * com os itens do pedido, exatamente como a tela do pedido faria à mão. Nada\n * aqui escreve `fulfillment_status`: ele continua derivado, que é o que o impede\n * de divergir da realidade.\n *\n * Pedidos que já existem não são afetados. A política vale para o que vem\n * depois, e isso é dito na tela: um lojista que liga a baixa automática\n * esperando ver os pedidos de ontem despacharem tem uma surpresa pior do que a\n * frase.\n */\nexport function FulfillmentSettings({ provider }: FulfillmentSettingsProps) {\n const settings = useStoreSettings(provider, { autoFulfill: 'never' })\n const { value, set } = settings\n const current: Policy = value.autoFulfill ?? 'never'\n\n return (\n <SettingsState {...settings}>\n <SettingsGroup\n title=\"Baixa automática\"\n description=\"Quando um registro de remessa é criado para um pedido novo.\"\n >\n <ChoiceCards\n label=\"Baixa automática\"\n choices={POLICIES}\n value={current}\n onChange={(autoFulfill) => set({ autoFulfill })}\n />\n </SettingsGroup>\n\n <div className=\"flex items-start gap-2 rounded-lg border bg-muted/30 p-3 text-xs text-muted-foreground\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span>\n A remessa criada aqui nasce <strong className=\"font-medium\">pendente</strong>, com os itens\n do pedido e sem transportadora nem código de rastreio — quem despacha preenche isso na tela\n do pedido. Pedidos que já foram feitos não são afetados.\n </span>\n </div>\n </SettingsState>\n )\n}\n","import React from 'react'\nimport { RegistryCrudView } from '@fayz-ai/admin'\nimport { marketsRegistry } from '../data/registries'\n\n/**\n * Mercados — onde a loja vende (0116).\n *\n * Um mercado por moeda e região: o Brasil em real, a Europa em euro. O país do\n * comprador escolhe o mercado na vitrine, e o checkout cobra na moeda dele.\n * O cadastro é o par de sempre, `PluginRegistryDef` + `RegistryCrudView`.\n */\nexport function MarketsSettings({ basePath = '/settings/shop-markets' }: { basePath?: string }) {\n return (\n <div className=\"space-y-3\">\n <div className=\"px-1 pt-4\">\n <h3 className=\"text-sm font-semibold\">Mercados</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{marketsRegistry.description}</p>\n </div>\n <RegistryCrudView registry={marketsRegistry} basePath={basePath} embedded />\n </div>\n )\n}\n","// Melhor Envio as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The first REQUEST-plane connector: the buyer is on the page waiting for a\n// price, so it declares a latency budget and what to do when the budget is\n// spent. `onFailure: 'degrade'` is the whole point — FAY-1301 says quoting\n// freight never blocks the purchase, and the answer it degrades to is the\n// store's own shipping zones, which is what the store quoted before Melhor\n// Envio existed.\n//\n// It brings no SQL. The connection is a connections row (packages/db 029);\n// the label it buys later is an effect, and effects are ordinary sync_runs\n// rows claimed through plg_claim_effect (030). Quotes are neither.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MELHOR_ENVIO_CONNECTOR_ID = 'melhor-envio'\n\n/**\n * Two and a half seconds, and the number moved because it was MEASURED.\n *\n * It said one second, \"chosen against the funnel, not against the carrier\",\n * with the claim that \"Melhor Envio answers well inside it on a good day\". The\n * first real quote refuted that: the carrier alone takes ~610ms from São Paulo\n * to Rio in the sandbox, before the credential redemption (43ms) and the two\n * database round trips the quote needs. Total ~850ms server-side on a GOOD run,\n * which the browser's own hop pushed past 1000ms — so the budget aborted every\n * real quote and the shopper saw the zone price, forever. A budget that only\n * ever fires is not a safety net, it is the feature being off.\n *\n * The funnel reasoning was still right, which is why this is 2.5s and not 10:\n * past a few seconds \"calculando\" reads as broken, and the zones answer\n * instantly. What changed is the evidence about where the line actually is.\n */\nexport const MELHOR_ENVIO_LATENCY_BUDGET_MS = 2500\n\n/**\n * Where the parcels leave from. The canonical REQUIRED-TO-OPERATE setting:\n * Melhor Envio cannot quote a single price without it, and it is still not what\n * authorizes the connection — that is the OAuth grant, which is asked for on\n * Melhor Envio's own screen and never in this form.\n *\n * It used to be a `ConnectorField`, which meant a merchant had to know which\n * warehouse they ship from before they were allowed to plug the carrier in. Now\n * the connection is made and the store reads \"conectado, falta configurar\"\n * (`connections.status = 'pending'`) until a postcode is chosen — which is\n * true, and is the difference between an integration that is not ready and one\n * that is broken.\n *\n * The `pattern` is what a free-text box never had: eight digits, checked here\n * rather than discovered by the first buyer who gets no price.\n */\n// A agência de postagem NÃO mora aqui: ela é do local de despacho (Entrega ▸\n// Locais), porque uma loja com dois galpões entrega em duas agências e o\n// conector guarda uma conta, não um endereço. O seletor está no cadastro do\n// local, listando o que existe perto DELE.\nexport const MELHOR_ENVIO_SETTINGS: ConnectorSetting[] = [\n {\n key: 'originPostalCode',\n label: 'CEP de origem',\n description: 'De onde os pedidos saem. É o que a transportadora usa para calcular preço e prazo.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '^\\\\d{5}-?\\\\d{3}$',\n patternHint: 'Use 8 dígitos, como 01310-100.',\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(MELHOR_ENVIO_CONNECTOR_ID, {\n settings: MELHOR_ENVIO_SETTINGS,\n settingsKeys: ['services', 'extraDays'],\n})\n\nfunction MelhorEnvioExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n A cotação acontece enquanto o cliente espera, com um limite de 1 segundo. Se a transportadora\n não responder a tempo, o checkout mostra o preço das suas faixas de CEP e a compra continua\n normalmente — o cliente nunca fica sem preço na tela.\n </p>\n <p>\n Não existe histórico de cotações aqui de propósito: cotar não movimenta nada. O que aparece no\n histórico é a compra da etiqueta, feita uma única vez por pedido.\n </p>\n </div>\n )\n}\n\nexport const melhorEnvioConnectorDef: ConnectorDefinition = {\n id: MELHOR_ENVIO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Melhor Envio',\n description:\n 'Frete real no checkout: Correios e Jadlog numa integração só, com prazo e preço calculados pelo CEP do cliente.',\n icon: 'Truck',\n category: 'logistics',\n authKind: 'oauth',\n // Two planes, and they are different jobs: the quote is in the buyer's request\n // path, the label purchase and its tracking are an ordinary outbound sync.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.melhorenvio.com.br',\n // A quote WRITES NOTHING — `createShippingQuoter` says so in as many words,\n // and 029_connections.sql is why: one row per quote would make sync_runs\n // the largest table in the pool within weeks. So `order` is read-only here,\n // and the only write is the label, which is an effect with an idempotency key\n // (`createLabelBuyer`) because a label bought twice is money spent twice.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o CEP de destino e o que está no carrinho para pedir o preço e o prazo à transportadora. A cotação não é guardada.',\n },\n {\n kind: 'data',\n resource: 'shipment',\n actions: ['write'],\n reason: 'Registrar a etiqueta comprada e o código de rastreio no pedido.',\n },\n ],\n latencyBudgetMs: MELHOR_ENVIO_LATENCY_BUDGET_MS,\n // The sale is never blocked by a carrier's API (FAY-1301).\n onFailure: 'degrade',\n /**\n * There is no form. Melhor Envio is OAuth, and the store authorizes on Melhor\n * Envio's own screen exactly as it does with Google Calendar.\n *\n * It got here in two wrong steps. First `fields: []` on the theory that a\n * platform-level token existed — none does, so Conectar wrote `active = true`\n * against an account nobody had linked. Then a pasted `token` password field,\n * as a stopgap to stop that lie. OAuth replaces both: the store's own account\n * is linked, per-merchant by nature (the labels are bought with THIS store's\n * balance), and no credential ever passes through this file.\n *\n * The origin postcode stays where it is — a `ConnectorSetting`, on the\n * Configurações tab. It is what the connection needs to WORK, not what\n * authorizes it, and it must never come back to the connect step.\n */\n // `melhorenvio` without the hyphen, and that is not a typo: the provider key\n // is the path Melhor Envio has registered on our app (`/redirect/melhorenvio`),\n // and changing it would mean editing the registration at their end. The\n // connector's own id keeps the hyphen.\n startOAuth: fayzConnectorOAuth(MELHOR_ENVIO_CONNECTOR_ID, { provider: 'melhorenvio' }),\n settings: MELHOR_ENVIO_SETTINGS,\n // The answer to \"o Melhor Envio é acionado em quais momentos?\". Both calls are\n // real, so both are stated plainly.\n invokedAt: [\n {\n key: 'shop.checkout.shipping_quote',\n label: 'O cliente informa o CEP e pede as opções de frete',\n touches: ['order'],\n },\n {\n key: 'shop.order.label_purchase',\n label: 'O pedido é confirmado e a etiqueta é comprada, uma única vez',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['order', 'shipment'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n MELHOR_ENVIO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: (connection?.settings?.originPostalCode as string) ?? undefined,\n plane: 'request',\n ...settingsStatus(MELHOR_ENVIO_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // This used to say the platform's redirect route writes `active = true`. It\n // does not, and says so itself: \"It does not touch `connections` in the\n // tenant's pool. Per FAY-1388 ... the app writes its own.\" Bling shipped with\n // the same belief and looped — authorize, come back, still \"not connected\",\n // click again, forever.\n //\n // So the two halves are written by their owners: the platform files the\n // credential, and this runs on the way back to say the account is linked. No\n // values — the token is not ours to see, and nothing is configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MelhorEnvioExtraPanel,\n}\n","// AppMax as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The mirror image of Melhor Envio, and the reason `onFailure` is a field\n// instead of a habit: same plane, same budget mechanism, opposite verdict. A\n// carrier that does not answer must not stop a sale; a gateway that does not\n// answer must stop it, because an order that reads as confirmed without a\n// payment is worse than a refused checkout.\n//\n// It lives in plugin-shop rather than plugin-payments because plugin-payments\n// is provider-only — it ships no manifest and no admin surface — and because\n// the store's stack (who charges, who ships) is configured in the store's own\n// settings. commerce-stack.md §0: the admin is the control panel of the stack.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030). Opening a session is\n// neither — it is a quote by another name and files nothing.\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const APPMAX_CONNECTOR_ID = 'appmax'\n\n/**\n * Six seconds. Longer than the freight budget on purpose: this one is spent\n * after the buyer pressed \"pagar\", where waiting is expected and a premature\n * refusal costs a sale that was about to happen. It is still a budget — beyond\n * it the buyer is told the payment did not go through, which is true, instead of\n * watching a spinner that resolves into a charge they already gave up on.\n */\nexport const APPMAX_LATENCY_BUDGET_MS = 6000\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential\n * and not an authorization.\n *\n * It used to be a `ConnectorField` labelled \"Formas de pagamento (pix, boleto,\n * credit_card)\": a free-text box on the connect screen, which asked a merchant\n * to decide what they accept before they were allowed to plug the gateway in,\n * and then made \"passei a aceitar boleto\" look like re-authorizing the account.\n * It is a multi-select over the three methods AppMax actually has, so the\n * misspelling that silently offered nothing is not expressible.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a session, so the connection is made and reported as \"conectado,\n * falta configurar\" (`connections.status = 'pending'`).\n */\nexport const APPMAX_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n { value: 'credit_card', label: 'Cartão de crédito' },\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(APPMAX_CONNECTOR_ID, {\n settings: APPMAX_SETTINGS,\n settingsKeys: ['maxInstallments', 'environment'],\n})\n\nconst METHOD_LABELS: Record<string, string> = { pix: 'Pix', boleto: 'Boleto', credit_card: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may still hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction AppmaxExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou o código de barras sem sair\n da página. Cartão vai para a página segura da AppMax e volta com o resultado — assim nenhum\n número de cartão passa pelo seu site.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n )\n}\n\nexport const appmaxConnectorDef: ConnectorDefinition = {\n id: APPMAX_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AppMax',\n description: 'Checkout de verdade: Pix, boleto e cartão parcelado, com o valor recalculado no servidor.',\n icon: 'CreditCard',\n category: 'payments',\n authKind: 'oauth',\n // The session is opened in the buyer's request path; the capture, the refund\n // and the webhook that reports them are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.appmax.com.br',\n // Grounded in the request plane's own code, not in an AppMax data plane —\n // there isn't one in this repo yet (see the header). `createCheckoutStarter`\n // recomputes the order total server-side before opening a session, which is a\n // read of the order and never a write of it; `createPaymentCapturer` files the\n // capture through the effect ledger, which is the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: APPMAX_LATENCY_BUDGET_MS,\n // The order does not confirm. FAY-1300.\n onFailure: 'block',\n /**\n * O lojista NÃO digita chave nenhuma — e essa é a correção.\n *\n * A tela pedia `client_id` e `client_secret` da AppMax, o que estava errado em\n * dois níveis. Primeiro porque é o par do APLICATIVO (nosso, um só para toda a\n * frota) que abre a instalação, e ele não pode passar pelo navegador de\n * lojista nenhum. Segundo porque o par da LOJA nem é mostrado ao lojista para\n * copiar: a AppMax o emite no fim da instalação e o entrega ao aplicativo.\n *\n * Foi exatamente por isso que o campo apareceu preenchido com um e-mail: não\n * havia o que colar ali, então colaram o que tinham.\n *\n * O caminho certo é o consentimento abaixo: o lojista autoriza a conta dele no\n * painel da AppMax e o par sai de lá para o cofre da plataforma sem nunca\n * passar por este pacote.\n */\n fields: [],\n /**\n * Um botão só: \"Conectar\" É o que abre o consentimento.\n *\n * Antes eram dois — um \"Abrir o painel da AppMax\" e um \"Conectar\" que apenas\n * marcava a linha. O segundo mentia: dizia conectado sem credencial atrás.\n *\n * E é consentimento de verdade, apesar do nome estranho na doc deles. O\n * círculo fecha: chamamos `/app/authorize` com o par do APLICATIVO e recebemos\n * um token; o lojista autoriza no painel da AppMax; a AppMax **devolve o\n * navegador dele** para o nosso callback com esse token na URL; e é o nosso\n * servidor que troca o token pelo par da LOJA em `/app/client/generate`.\n *\n * Ida, volta e troca no servidor — a mesma forma do Bling e do Melhor Envio.\n * Por isso passa pelo mesmo `fayzConnectorOAuth` e não por um link solto: o\n * par do aplicativo não pode sair do servidor, e o token que volta não vale\n * nada no navegador.\n */\n startOAuth: fayzConnectorOAuth(APPMAX_CONNECTOR_ID),\n settings: APPMAX_SETTINGS,\n // When the gateway is actually reached. Both are real calls, so both may be\n // stated plainly — see ConnectorPermissions for the events that may not.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AppMax (Pix, boleto ou cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AppMax avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n APPMAX_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(APPMAX_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the token — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The token itself never arrives\n // here: the hub splits it out before calling this.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AppmaxExtraPanel,\n}\n","// The back office's side of the AbacatePay catalogue.\n//\n// Same shape as ../bling/data.ts and for the same reason: the edge function\n// cannot derive the two things it needs. The Supabase session proves who is\n// asking, and the runtime token is what the function FORWARDS to redeem this\n// tenant's key — a function cannot mint one.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n/** The edge function that holds every catalogue call this connector makes. */\nexport const ABACATEPAY_FUNCTION = 'abacatepay-sync'\n\nexport interface AbacatePaySyncResult {\n ok: boolean\n /** Products created in the provider's catalogue on this run. */\n pushed: number\n /** Already there and still at the same price. */\n unchanged: number\n /** Refused before sending: no name, or a price of zero. */\n skipped: Array<{ productId: string; reason: string }>\n /** The provider said no. One bad product does not end a run. */\n failed: Array<{ productId: string; error: string }>\n /** Created, but AbacatePay refused the photo, so it went without one. */\n withoutImage: string[]\n /** Linked, but the store's price has moved since. Reported, never repaired. */\n drifted?: Array<{ productId: string; externalId: string }>\n /** The per-run cap stopped it short — press again. */\n hasMore: boolean\n total: number\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com a AbacatePay.')\n return supabase\n}\n\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com a AbacatePay.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(ABACATEPAY_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (!error) return data as T\n\n // supabase-js hides the function's own body inside the error context. Without\n // digging it out, every refusal reads as \"Edge Function returned a non-2xx\n // status code\" — which is what a missing table, a missing credential and a\n // rejected CORS preflight all looked like, while the function was answering\n // each of them with a sentence written for the merchant.\n const status = Number((error as { context?: { status?: number } })?.context?.status ?? 0)\n let message = ''\n try {\n const payload = (await (error as { context?: { json?: () => Promise<unknown> } })\n ?.context?.json?.()) as { message?: string; error?: string } | undefined\n message = String(payload?.message ?? payload?.error ?? '').trim()\n } catch {\n /* no JSON body — fall through to the generic message below */\n }\n if (!message && status === 404) {\n message = 'Esta loja não tem uma conta AbacatePay conectada.'\n }\n throw new Error(message || error.message)\n}\n\n/** Read-only probe: is the key good? Listing an empty catalogue is a success. */\nexport function testAbacatePay(): Promise<{ ok: boolean; remoteProducts?: number; error?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Send the products that have no link yet. Additive — nothing is ever deleted. */\nexport function pushCatalogue(): Promise<AbacatePaySyncResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Push, then report which linked products have drifted from the sent price. */\nexport function reconcileCatalogue(): Promise<AbacatePaySyncResult> {\n return invoke({ action: 'reconcile' })\n}\n","// AbacatePay as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The second gateway, and the one that shows the shelf is not a special case:\n// it declares the same category, the same planes and the same `onFailure` as\n// AppMax, and differs only where the provider differs — how it authorizes.\n//\n// There is no consent screen and no app to install. AbacatePay issues API keys\n// in the merchant's own dashboard (Integrar → API Keys) and every call is\n// `Authorization: Bearer <key>`, so the connect step is a form with one box and\n// the key leaves for the platform vault instead of reaching this file.\n//\n// The same host serves dev and production — the KEY decides which. That is a\n// merchant-facing fact, not a base-URL switch, so it is said on the panel\n// rather than expressed as an `environment` setting nothing would honour.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n pushCatalogue,\n reconcileCatalogue,\n type AbacatePaySyncResult,\n} from './data'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n describeError,\n} from '@fayz-ai/core'\nimport { Button } from '@fayz-ai/ui'\n\nexport const ABACATEPAY_CONNECTOR_ID = 'abacatepay'\n\n/**\n * Six seconds, the same budget AppMax carries and for the same reason: it is\n * spent after the buyer pressed \"pagar\", where waiting is expected and a\n * premature refusal costs a sale that was about to happen.\n *\n * Measured, not guessed — `POST /v2/transparents/create` answered in 640–830ms\n * from São Paulo on the dev key, before credential redemption and the two\n * database round trips the checkout needs. The budget sits far above that so it\n * fires on a gateway that is actually down, never on a slow-but-alive one.\n */\nexport const ABACATEPAY_LATENCY_BUDGET_MS = 6000\n\n/**\n * The one thing that authorizes the connection.\n *\n * `type: 'password'` is what routes it to the platform's credential sink\n * (packages/admin/.../connect/credentials.ts) instead of to `saveConnection`;\n * `secret: true` states the same thing on the field itself, so the intent\n * survives a future change of input type. Either flag alone is enough — both\n * are here because a payment credential is the wrong place to be terse.\n *\n * The key is per-STORE and carries its own permissions and its own environment,\n * so nothing about it can be inferred, defaulted or shared across the fleet.\n */\nexport const ABACATEPAY_FIELDS: ConnectorField[] = [\n {\n key: 'apiKey',\n label: 'Chave de API',\n type: 'password',\n secret: true,\n placeholder: 'AbacatePay → Integrar → API Keys',\n },\n]\n\n/**\n * Which methods the storefront may offer — commercial policy, not a credential.\n *\n * The three the gateway really has, in AbacatePay's own vocabulary (uppercase),\n * because these values travel to it as `method` / `methods`: a translation\n * table between what the merchant picked and what the wire accepts is one more\n * place for a method to silently stop being offered.\n *\n * Required to OPERATE and not to connect: a gateway with no method selected\n * cannot open a charge, so the connection is made and reported as \"conectado,\n * falta configurar\" (`connections.status = 'pending'`).\n */\nexport const ABACATEPAY_SETTINGS: ConnectorSetting[] = [\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'PIX', label: 'Pix' },\n { value: 'BOLETO', label: 'Boleto' },\n // Credit card does NOT belong here. AbacatePay discontinued it for new\n // clients and new integrations, so offering the checkbox would let a\n // merchant switch on a method the acquirer refuses — and the first to find\n // out would be a buyer. `CARD` stays in METHOD_LABELS because an older\n // connection may have the option stored and its row still has to describe\n // itself.\n ],\n requiredToOperate: true,\n },\n]\n\nconst store = createConnectionStore(ABACATEPAY_CONNECTOR_ID, {\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { PIX: 'Pix', BOLETO: 'Boleto', CARD: 'Cartão' }\n\n/** The row's one-line summary. Tolerates the pre-split string a live row may hold. */\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const labels = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\n/**\n * Push the store's catalogue to AbacatePay.\n *\n * It exists because the hosted page bills for PRODUCTS out of the provider's own\n * catalogue, while the transparent checkout (Pix, boleto) has no items field at\n * all. Without this sync, a hosted checkout is refused with\n * `catalogue_not_synced`.\n *\n * It is ADDITIVE, and not by choice: the API offers create, get, list and delete\n * for products, and NO update. A price changed here cannot be pushed, and\n * deleting the product to recreate it breaks any live charge attached to it. So\n * a drifted price is REPORTED instead, with the figure the provider still holds,\n * and recreating it stays the merchant's decision.\n */\nfunction CatalogueSync() {\n const [busy, setBusy] = useState<'push' | 'reconcile' | null>(null)\n const [result, setResult] = useState<AbacatePaySyncResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const run = async (kind: 'push' | 'reconcile') => {\n setBusy(kind)\n setError(null)\n try {\n setResult(await (kind === 'push' ? pushCatalogue() : reconcileCatalogue()))\n } catch (caught) {\n setError(describeError(caught, 'Não conseguimos sincronizar agora.'))\n } finally {\n setBusy(null)\n }\n }\n\n return (\n <div className=\"space-y-3\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">Catálogo</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n O link de pagamento é aberto na página da AbacatePay, e ela cobra por produtos que\n precisam existir lá. Envie os seus antes de mandar um link para um cliente.\n </p>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { void run('push') }}\n disabled={busy !== null}\n className=\"inline-flex min-h-9 items-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground transition hover:opacity-90 disabled:opacity-60\"\n >\n {busy === 'push' ? 'Enviando…' : 'Enviar produtos'}\n </Button>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={() => { void run('reconcile') }}\n disabled={busy !== null}\n className=\"inline-flex min-h-9 items-center rounded-md border px-3 text-xs font-medium transition hover:bg-muted/50 disabled:opacity-60\"\n >\n {busy === 'reconcile' ? 'Conferindo…' : 'Conferir preços'}\n </Button>\n </div>\n\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n\n {result && (\n <div className=\"space-y-1.5 rounded-md border bg-muted/30 p-3 text-xs\">\n <p className=\"text-foreground\">\n {result.pushed > 0\n ? `${result.pushed} produto${result.pushed > 1 ? 's' : ''} enviado${result.pushed > 1 ? 's' : ''}.`\n : 'Nenhum produto novo para enviar.'}{' '}\n <span className=\"text-muted-foreground\">\n {result.unchanged} já {result.unchanged === 1 ? 'estava' : 'estavam'} lá, de {result.total}.\n </span>\n </p>\n\n {/* The per-round cap is not an error; it is what stops the function\n dying halfway and leaving the merchant unsure how much landed. */}\n {result.hasMore && (\n <p className=\"text-muted-foreground\">\n Ainda há produtos na fila — clique novamente para continuar.\n </p>\n )}\n\n {result.withoutImage?.length > 0 && (\n <p className=\"text-muted-foreground\">\n {result.withoutImage.length} produto{result.withoutImage.length > 1 ? 's foram enviados' : ' foi enviado'} sem\n foto — a AbacatePay recusou a imagem. O produto vende normalmente; só aparece sem imagem na página dela.\n </p>\n )}\n\n {result.skipped?.length > 0 && (\n <p className=\"text-muted-foreground\">\n {result.skipped.length} ignorado{result.skipped.length > 1 ? 's' : ''} por estar sem nome ou\n com preço zerado.\n </p>\n )}\n\n {result.failed?.length > 0 && (\n <div className=\"text-destructive\">\n <p>{result.failed.length} recusado{result.failed.length > 1 ? 's' : ''} pela AbacatePay:</p>\n <ul className=\"mt-0.5 list-disc pl-4\">\n {result.failed.slice(0, 3).map((f) => <li key={f.productId}>{f.error}</li>)}\n </ul>\n </div>\n )}\n\n {result.drifted && result.drifted.length > 0 && (\n <p className=\"text-amber-600 dark:text-amber-500\">\n {result.drifted.length} produto{result.drifted.length > 1 ? 's mudaram' : ' mudou'} de preço\n aqui depois de enviado. A AbacatePay não permite alterar um produto já criado, então o\n link ainda cobra o preço antigo — refaça o produto lá se o novo valor precisa valer.\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction AbacatePayExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded || !connected) return null\n\n return (\n <div className=\"space-y-4 border-t pt-4\">\n <CatalogueSync />\n <div className=\"space-y-2 text-xs text-muted-foreground\">\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem sair\n da página. Cartão de crédito a AbacatePay encerrou para contas novas — para vender no\n cartão, conecte outro provedor em Pagamentos.\n </p>\n <p>\n Quem decide se a cobrança é de verdade é a chave. Uma chave de teste simula o pagamento e não\n movimenta dinheiro; a de produção cobra o cliente. É a mesma tela para as duas, então confira no\n painel da AbacatePay qual chave você colou aqui.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado no\n navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </div>\n </div>\n )\n}\n\nexport const abacatePayConnectorDef: ConnectorDefinition = {\n id: ABACATEPAY_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'AbacatePay',\n description: 'Pix e boleto com uma chave só, sem contrato de adquirente e sem tirar o cliente da loja.',\n icon: 'CreditCard',\n category: 'payments',\n // One pasted key, no consent screen: AbacatePay has no OAuth and no app to\n // install, so inventing a `startOAuth` here would ship a button that could\n // never connect anything.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the confirmation webhook\n // and the refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.abacatepay.com',\n // Where the key comes from. The connector declares the address because it is\n // a fact about THIS provider, and the doc names the path inside it\n // (Integrar → API Keys), which the field's placeholder repeats.\n providerInstall: { url: 'https://app.abacatepay.com' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: ABACATEPAY_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. The opposite\n // verdict from the carrier next door, on purpose (FAY-1300/FAY-1301).\n onFailure: 'block',\n fields: ABACATEPAY_FIELDS,\n settings: ABACATEPAY_SETTINGS,\n // The two calls that exist. A refund endpoint exists too, but nothing in this\n // repo reaches it yet, and a declared moment that never arrives is a promise\n // the code cannot keep.\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na AbacatePay (Pix ou boleto)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A AbacatePay avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n ABACATEPAY_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.methods),\n plane: 'request',\n ...settingsStatus(ABACATEPAY_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the key — that ordering is\n // what makes `active = true` mean \"a credential was placed for this store\"\n // rather than \"somebody pressed a button\". The key itself never arrives here:\n // the hub split it out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing, and there is no useful call to make without\n // the key. Testing it belongs to the edge function that holds it.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: AbacatePayExtraPanel,\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const STRIPE_CONNECT_CONNECTOR_ID = 'stripe-connect'\n\n/**\n * Six seconds, the same budget the other two gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n */\nexport const STRIPE_CONNECT_LATENCY_BUDGET_MS = 6000\n\n/**\n * Stripe's own vocabulary (lowercase), because these values travel to it as\n * `payment_method_types` — a translation table between what the merchant picked\n * and what the wire accepts is one more place for a method to silently stop\n * being offered.\n */\nexport const STRIPE_CONNECT_SETTINGS: ConnectorSetting[] = [\n {\n key: 'paymentMethods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher no checkout.',\n type: 'multi-select',\n options: [\n { value: 'card', label: 'Cartão de crédito' },\n { value: 'pix', label: 'Pix' },\n { value: 'boleto', label: 'Boleto' },\n ],\n requiredToOperate: true,\n // Card is the one method every Stripe account can charge the moment it is\n // active; Pix and boleto in BR each need their own approval, so offering\n // them by default would promise a checkout option that may not settle.\n defaultValue: ['card'],\n },\n]\n\n/**\n * The second door, for a merchant who already has a Stripe account and would\n * rather paste its secret key than authorize the platform on it.\n *\n * It is the same credential the OAuth grant yields (an access token for a\n * connected account IS a secret key), so the data plane has one code path and\n * `readSecretKey` in stripe-runtime.js is the only thing that knows there are\n * two sources. The platform's per-charge fee needs the grant, not the key, and\n * is the one thing a pasted key cannot do.\n */\nexport const STRIPE_CONNECT_FIELDS: ConnectorField[] = [\n {\n key: 'secretKey',\n label: 'Chave secreta (sk_…)',\n type: 'password',\n secret: true,\n placeholder: 'Stripe → Developers → API keys → Secret key',\n },\n]\n\nconst store = createConnectionStore(STRIPE_CONNECT_CONNECTOR_ID, {\n settings: STRIPE_CONNECT_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = { card: 'Cartão', pix: 'Pix', boleto: 'Boleto' }\n\nfunction methodsDetail(value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : []\n const labels = list.map((v) => METHOD_LABELS[String(v)] ?? String(v)).filter(Boolean)\n return labels.length > 0 ? labels.join(', ') : undefined\n}\n\nfunction StripeConnectExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => { if (!cancelled) setConnected(!!c?.active) })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n A Stripe pede documentos e dados bancários antes de liberar cobranças. Se você fechou o\n cadastro no meio, a conexão fica de pé mas a loja ainda não cobra — clique em conectar de\n novo para voltar de onde parou, na mesma conta.\n </p>\n <p>\n O dinheiro cai na sua conta Stripe, não na Fayz. O que a Fayz retém é a taxa da\n plataforma, descontada na própria cobrança.\n </p>\n </>\n ) : (\n <p>\n Conectar abre o cadastro da Stripe numa aba. Você pode entrar com uma conta Stripe que já\n tenha ou criar uma na hora — em qualquer caso é sua, e é ela que recebe.\n </p>\n )}\n </div>\n )\n}\n\nexport const stripeConnectConnectorDef: ConnectorDefinition = {\n id: STRIPE_CONNECT_CONNECTOR_ID,\n // The catalogue has one Stripe row and this is not the Financeiro's `stripe`\n // connector, which is the tenant invoicing on their own account. Here Fayz is\n // the platform and the charge is opened on a connected account.\n catalogSlug: 'stripe',\n hostPluginId: 'shop',\n name: 'Stripe · Checkout',\n description: 'Cartão, Pix e boleto pela Stripe. A loja recebe na conta dela e a Fayz retém a taxa na própria cobrança.',\n icon: 'CreditCard',\n category: 'payments',\n // The OAuth grant on an account the merchant already owns (Connect's OAuth\n // flow, served by the vault); nothing secret ever reaches this file.\n authKind: 'oauth',\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://docs.stripe.com/connect',\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: STRIPE_CONNECT_LATENCY_BUDGET_MS,\n // Same verdict as the other two gateways: an order that reads as confirmed\n // without a payment is worse than a refused checkout.\n onFailure: 'block',\n // OAuth-shaped, with a key as the second door: consent is the usual form,\n // and a merchant who already holds the account may paste its secret key\n // instead. Either one lands in the vault under this connector.\n fields: STRIPE_CONNECT_FIELDS,\n settings: STRIPE_CONNECT_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na conta Stripe da loja',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Stripe avisa que o pagamento caiu e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n ...connectionStatus(\n STRIPE_CONNECT_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: methodsDetail(connection?.settings?.paymentMethods),\n plane: 'request',\n ...settingsStatus(STRIPE_CONNECT_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n startOAuth: fayzConnectorOAuth(STRIPE_CONNECT_CONNECTOR_ID),\n // Reached with no values when the browser returns marked `connected`, and\n // with none again after a pasted key (the secret goes to the vault, not\n // here). Required either way: the vault never touches the pool, so this is\n // the only thing that writes the tenant's `connections` row.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: async () => { await store.disconnect() },\n ExtraPanel: StripeConnectExtraPanel,\n}\n","// Vindi as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fourth gateway on the shelf, and the first whose provider name means two\n// different products. This connector is **Vindi Pagamentos** — the gateway, ex-\n// Yapay, `api.intermediador.yapay.com.br`. It is NOT Vindi Recorrência\n// (`app.vindi.com.br/api/v1`), which is subscriptions and invoices and\n// authenticates with HTTP Basic. Nothing here reaches that one.\n//\n// There is no consent screen, and that is a fact about Vindi rather than a\n// shortcut. Their `consumer_key` → CODE → `access_token` chain looks like OAuth\n// from a distance and is not: the authorize URL accepts only `consumer_key` —\n// no `redirect_uri`, no `state`, no scopes — and the instruction is literally to\n// open it in a browser and copy the CODE out of the address bar. That is the\n// account owner fetching their own credential, not a merchant authorizing a\n// platform, and our broker has nothing to sign or register against it. The path\n// that WOULD work is Vindi's Partner Accounts API, which provisions the\n// merchant's subaccount and hands the key straight to us — it needs a commercial\n// relationship with Vindi, and it is phase 2 (FAY-1416).\n//\n// Two hosts, unlike AbacatePay where one host serves both worlds and the key\n// decides. So the environment is a stored decision rather than something the\n// credential implies.\n//\n// ── card, and the shape it forced ───────────────────────────────────────────\n// This connector offers three methods it charges ITSELF (Pix, Bolepix, boleto)\n// and one it does not: credit card, which is paid on Vindi's own page. That is\n// not a limitation to be lifted later — Vindi's transparent card call takes a\n// card number in the request body, and the day this pool accepts one is the day\n// it is in PCI scope. The cart endpoint (`/v1/tmp_transactions/create`) is the\n// answer, and the same cart is what the panel sends as a payment link.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorField,\n type ConnectorSetting,\n} from '@fayz-ai/core'\n\nexport const VINDI_CONNECTOR_ID = 'vindi'\n\n/**\n * Six seconds, the same budget the other three gateways carry: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Not measured against Vindi yet — no account exists to measure with. It is\n * copied from the two gateways that WERE measured (AbacatePay answered 640–830ms\n * from São Paulo) on the reading that a Brazilian gateway called from a Brazilian\n * pool sits in the same band. If a real sandbox says otherwise, this number moves\n * and this paragraph goes with it.\n */\nexport const VINDI_LATENCY_BUDGET_MS = 6000\n\n/**\n * As URLs onde o dono da conta busca o CODE, uma por ambiente.\n *\n * Não é uma tela de consentimento: a Vindi aceita `consumer_key` e mais nada —\n * sem `redirect_uri`, sem `state`, sem escopos — e devolve o CODE na barra de\n * endereço para ser copiado à mão. É por isso que o conector segue `api-key` e\n * não `oauth`: não há nada que o broker da plataforma possa assinar aqui.\n */\nexport const VINDI_AUTHENTICATION_URLS: Record<string, string> = {\n sandbox: 'https://tc-intermediador-sandbox.yapay.com.br/authentication?consumer_key=',\n production: 'https://tc.intermediador.yapay.com.br/authentication?consumer_key=',\n}\n\n/**\n * O que autoriza a conexão — e são QUATRO coisas, não uma, porque a Vindi tem\n * duas credenciais que abrem portas diferentes.\n *\n * `type: 'password'` é o que roteia cada uma para o cofre da plataforma\n * (packages/admin/.../connect/credentials.ts) em vez do `saveConnection`;\n * `secret: true` diz a mesma coisa no próprio campo, para a intenção sobreviver\n * a uma troca futura do tipo de input.\n *\n * ── o token da conta, e onde ele PARA ───────────────────────────────────────\n *\n * `tokenAccount` abre uma transação e a relê: Pix, boleto e o carrinho de\n * cartão vivem inteiramente dele. O que ele não faz é falar com a v3 — medido,\n * não suposto: `POST /api/v3/charges` respondeu **401** às três formas de\n * mandá-lo (corpo, Bearer, cabeçalho) no pool de produção em 25/08.\n *\n * ── a chave de consumidor, e o que ela compra ──────────────────────────────\n *\n * A v3 é o que emite um LINK DE PAGAMENTO de verdade — `pagar.vindi.com.br/…`,\n * com um `id` que a loja pode consultar depois. O carrinho da v1 devolve um\n * endereço parecido e sem id: ninguém pode perguntar por ele, e a venda só se\n * liquida se um webhook chegar. Era o que a loja tinha antes disto.\n *\n * O preço é uma corrente de três passos, e o do meio é manual:\n * `consumer_key` + `consumer_secret` (painel da Vindi) → abrir\n * {@link VINDI_AUTHENTICATION_URLS} no navegador e copiar o CODE da barra de\n * endereço → `access_token` (24 h) + `refresh_token` (1 ano). A renovação\n * diária é automática e acontece na função de borda; o CODE se digita uma vez\n * por ambiente.\n *\n * Os três são OPCIONAIS de propósito. Uma loja que só vende Pix na própria\n * página nunca precisou deles, e torná-los obrigatórios jogaria toda conexão que\n * funciona hoje para \"falta configurar\". O que falta sem eles é o link — e quem\n * pedir um recebe a frase que diz exatamente isto, em vez de um endereço mudo.\n */\nexport const VINDI_FIELDS: ConnectorField[] = [\n {\n key: 'tokenAccount',\n label: 'Token da conta',\n type: 'password',\n secret: true,\n placeholder: 'Vindi Pagamentos → Minha Conta → Token',\n },\n {\n key: 'consumerKey',\n label: 'Chave de consumidor (para links de pagamento)',\n type: 'password',\n secret: true,\n placeholder: 'consumer_key',\n },\n {\n key: 'consumerSecret',\n label: 'Segredo de consumidor',\n type: 'password',\n secret: true,\n placeholder: 'consumer_secret',\n },\n {\n key: 'authorizationCode',\n label: 'CODE de autorização',\n type: 'password',\n secret: true,\n placeholder: 'copiado da barra de endereço, uma vez por ambiente',\n },\n]\n\n/**\n * Which world the credential is valid against.\n *\n * Deliberately WITHOUT a `defaultValue`. Every other setting on this shelf can\n * afford a sensible default; this one decides whether a charge is real money or a\n * simulation, and a default here is a number nobody chose making that call. Until\n * the merchant answers, the connection reads \"conectado, falta configurar\" — which\n * is true, and is a state the column already has.\n *\n * A `select` and not a toggle: \"produção\" and \"não-sandbox\" are not the same\n * sentence to read at speed.\n */\nexport const VINDI_ENVIRONMENT_SETTING: ConnectorSetting = {\n key: 'environment',\n label: 'Ambiente',\n description: 'Sandbox simula o pagamento e não movimenta dinheiro. Produção cobra o cliente de verdade.',\n type: 'select',\n options: [\n { value: 'sandbox', label: 'Sandbox (teste)' },\n { value: 'production', label: 'Produção' },\n ],\n requiredToOperate: true,\n}\n\n/** Vindi's credit card id — the one method that is not paid on our page. */\nexport const VINDI_CARD_METHOD = '3'\n\n/**\n * Which methods the merchant offers — commercial policy, not a credential.\n *\n * The values are Vindi's own `payment_method_id`, as numbers-in-strings, because\n * that is what travels to it on the wire. A translation table between what the\n * merchant picked and what the API accepts is one more place for a method to\n * silently stop being offered.\n *\n * ── card is here, and it is NOT the same kind of thing as the others ────────\n *\n * Pix, Bolepix and boleto are opened by our own edge function and paid inside\n * the store: a QR code and a barcode are public strings, so nothing sensitive\n * is ever ours to hold.\n *\n * Card cannot work that way. Vindi's transparent card call takes `card_number`,\n * `card_cvv` and the expiry in the request body, and a PAN crossing our edge\n * function drags the whole pool into PCI scope — an audit and an architecture,\n * not a feature. So card is opened as a CART and paid on Vindi's own page: the\n * buyer is redirected, types the number under Vindi's certificate, and comes\n * back. That is the cost, and it is stated to the merchant in the panel below\n * rather than discovered by a buyer.\n */\nexport const VINDI_SETTINGS: ConnectorSetting[] = [\n VINDI_ENVIRONMENT_SETTING,\n {\n key: 'methods',\n label: 'Formas de pagamento',\n description: 'O que o cliente pode escolher. O cartão é pago na página segura da Vindi.',\n type: 'multi-select',\n options: [\n { value: '27', label: 'Pix' },\n { value: '28', label: 'Bolepix (boleto com QR)' },\n { value: '6', label: 'Boleto' },\n { value: VINDI_CARD_METHOD, label: 'Cartão de crédito (página da Vindi)' },\n ],\n requiredToOperate: true,\n },\n /**\n * The seller's postcode, which Vindi's cart endpoint refuses to open without.\n *\n * NOT `requiredToOperate` in the static list — a store selling Pix has never\n * needed it, and turning it into a requirement would put every working\n * connection into \"falta configurar\" the day this version ships. It becomes\n * required the moment card is enabled: see `requiredSettingsFor`.\n */\n {\n key: 'sellerPostalCode',\n label: 'CEP da loja',\n description: 'De onde a loja vende. A Vindi exige esse dado para abrir a página de cartão.',\n type: 'text',\n placeholder: '01310-100',\n pattern: '\\\\d{5}-?\\\\d{3}',\n patternHint: 'Oito dígitos, com ou sem hífen.',\n },\n /**\n * How many instalments Vindi's page may offer.\n *\n * A `select` rather than free text because it is a number with a ceiling the\n * merchant does not know: Vindi refuses a split above what the account was\n * accredited for, and a typed \"24\" would be a checkout that fails at the last\n * click. The default is 1 — a store that never thought about instalments\n * should not discover it is financing purchases.\n */\n {\n key: 'maxSplit',\n label: 'Parcelas no cartão',\n description: 'Em quantas vezes o cliente pode dividir. Depende do que a Vindi liberou para a conta.',\n type: 'select',\n options: [\n { value: '1', label: 'À vista' },\n { value: '2', label: 'Até 2x' },\n { value: '3', label: 'Até 3x' },\n { value: '6', label: 'Até 6x' },\n { value: '10', label: 'Até 10x' },\n { value: '12', label: 'Até 12x' },\n ],\n defaultValue: '1',\n },\n]\n\n/**\n * The required-to-operate list for THIS connection, which is not a constant.\n *\n * A merchant who enabled card owes us a postcode; one who did not, does not. A\n * static declaration could only choose between nagging every Pix-only store\n * forever and letting a card checkout fail at the moment of paying — and the\n * second is a buyer's problem, which is the one kind we do not get to ship.\n */\nexport function requiredSettingsFor(settings: Record<string, unknown> | undefined): ConnectorSetting[] {\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : String(raw ?? '').split(',')\n const hasCard = list.map((v) => String(v).trim()).includes(VINDI_CARD_METHOD)\n\n return VINDI_SETTINGS.map((setting) =>\n setting.key === 'sellerPostalCode' && hasCard\n ? { ...setting, requiredToOperate: true }\n : setting)\n}\n\nconst store = createConnectionStore(VINDI_CONNECTOR_ID, {\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n})\n\nconst METHOD_LABELS: Record<string, string> = {\n '27': 'Pix',\n '28': 'Bolepix',\n '6': 'Boleto',\n [VINDI_CARD_METHOD]: 'Cartão',\n}\nconst ENVIRONMENT_LABELS: Record<string, string> = { sandbox: 'Sandbox', production: 'Produção' }\n\n/**\n * The row's one-line summary — the environment first, because it is the one\n * mistake a merchant needs to catch from across the screen.\n */\nfunction connectionDetail(settings: Record<string, unknown> | undefined): string | undefined {\n const environment = ENVIRONMENT_LABELS[String(settings?.environment ?? '')]\n const raw = settings?.methods\n const list = Array.isArray(raw) ? raw : typeof raw === 'string' ? raw.split(',') : []\n const methods = list.map((v) => METHOD_LABELS[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n\n const parts = [environment, methods.length > 0 ? methods.join(', ') : null].filter(Boolean)\n return parts.length > 0 ? parts.join(' · ') : undefined\n}\n\nfunction VindiExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [environment, setEnvironment] = useState('')\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => {\n if (cancelled) return\n setConnected(!!c?.active)\n setEnvironment(String((c?.settings as Record<string, unknown>)?.environment ?? ''))\n })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n // Sem ambiente escolhido não se mostra endereço nenhum: os dois mundos são\n // contas diferentes, e o CODE tirado do errado não abre a certa.\n const authenticationUrl = VINDI_AUTHENTICATION_URLS[environment]\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected ? (\n <>\n <p>\n Pix e boleto acontecem dentro da sua loja: o cliente vê o QR Code ou a linha digitável sem\n sair da página. O cartão é diferente — ele é digitado na página segura da Vindi, e o\n cliente volta para a loja em seguida. É assim de propósito: nenhum número de cartão passa\n pelo seu site.\n </p>\n <p>\n Você também pode gerar um <strong>link de pagamento</strong> em Pedidos → Novo e mandar\n no WhatsApp. O cliente escolhe como pagar na página da Vindi, e o pedido aparece aqui\n sozinho quando o dinheiro cair.\n </p>\n <p>\n Sandbox e produção são contas diferentes, com tokens diferentes. Se você trocar o ambiente\n aqui, troque também as credenciais — as de teste não cobram em produção e as de produção\n não funcionam no sandbox.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n </>\n ) : (\n <p>\n O token da conta você pega no painel da Vindi Pagamentos, em Minha Conta. Confira se ele é o\n do mesmo ambiente que você vai escolher aqui — o token de sandbox não cobra em produção.\n </p>\n )}\n\n {/* O passo manual da Vindi, escrito onde ele é feito. Escondê-lo atrás de\n um link de documentação transformaria \"o link não sai\" numa conversa. */}\n <div className=\"rounded-md border border-dashed p-3\">\n <p className=\"font-medium text-foreground\">Para gerar links de pagamento</p>\n <p className=\"mt-1\">\n O token da conta não emite link — a Vindi exige uma autorização à parte. Peça a{' '}\n <strong>chave</strong> e o <strong>segredo de consumidor</strong> no painel da Vindi e\n preencha os campos acima. Falta ainda o <strong>CODE</strong>:\n </p>\n <ol className=\"mt-2 list-decimal space-y-1 pl-4\">\n <li>\n {authenticationUrl ? (\n <>\n Abra no navegador{' '}\n <code className=\"break-all rounded bg-muted px-1 py-0.5\">\n {authenticationUrl}SUA_CHAVE\n </code>{' '}\n trocando <code>SUA_CHAVE</code> pela sua chave de consumidor.\n </>\n ) : (\n <>Escolha o ambiente acima e o endereço para buscar o CODE aparece aqui.</>\n )}\n </li>\n <li>A Vindi redireciona. O CODE fica na barra de endereço — copie de lá.</li>\n <li>Cole no campo <strong>CODE de autorização</strong> e salve.</li>\n </ol>\n <p className=\"mt-2\">\n É uma vez por ambiente. A partir daí a renovação diária acontece sozinha.\n </p>\n </div>\n </div>\n )\n}\n\nexport const vindiConnectorDef: ConnectorDefinition = {\n id: VINDI_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Vindi',\n description: 'Pix, boleto e cartão pela Vindi. A loja recebe na conta dela; o cartão é digitado na página segura da Vindi.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, because the catalogue row\n // is a change in another repo that has to be seeded before it exists anywhere:\n // until then `emit-connector-map` warns that `vindi` \"resolves to a slug the\n // platform catalogue does not carry\", and the shelf would render a grey plug.\n // The absolute URL on the assets bucket answers the same from any origin,\n // which a path would not — a tenant app is served from its own domain.\n logoUrl: 'https://assets.fayz.ai/connectors/vindi.png',\n category: 'payments',\n // Pasted keys, no consent screen: Vindi has no merchant-connect OAuth, so a\n // `startOAuth` here would ship a button that could never connect anything. See\n // the file header for why the flow that looks like OAuth is not one.\n authKind: 'api-key',\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://developers.vindi.com.br/',\n // Where the token comes from. The consumer pair does NOT come from here — it\n // is requested from Vindi by form — which the fields' placeholders say.\n providerInstall: { url: 'https://app.vindi.com.br' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason: 'Registrar aqui a cobrança aberta e a confirmação do pagamento. Dados do cartão não passam por este app — são digitados na página da Vindi.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: VINDI_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other three gateways, opposite to the carrier next door.\n onFailure: 'block',\n fields: VINDI_FIELDS,\n settings: VINDI_SETTINGS,\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta na Vindi (Pix, boleto ou a página de cartão)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'A Vindi avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n ...connectionStatus(\n VINDI_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection?.settings),\n plane: 'request',\n // Judged against what THIS connection needs, not against a constant: a\n // store that ticked card owes a postcode, and one that did not owes\n // nothing. See `requiredSettingsFor`.\n ...settingsStatus(requiredSettingsFor(connection?.settings), connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the three keys — that\n // ordering is what makes `active = true` mean \"credentials were placed for\n // this store\" rather than \"somebody pressed a button\". They never arrive here:\n // the hub split them out before calling this, so `values` is empty.\n //\n // No `testConnection` either: the probe is handed the non-secret half, which\n // for this connector is nothing. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: VindiExtraPanel,\n}\n","// Mercado Pago as a unified ConnectorDefinition, surfaced in Loja → settings →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// The fifth gateway on the shelf, and the first where the CARD is typed inside\n// the store. That is not ambition, it is a different mechanism: AbacatePay's and\n// Vindi's transparent card calls take `card_number` and `card_cvv` in a request\n// body OUR edge function makes, and the day this pool accepts one is the day it\n// is in PCI scope — which is why both of them redirect. Mercado Pago tokenises\n// in the BROWSER, inside their own iframes, and hands the page a single-use\n// token. The store never holds a PAN, so the buyer never has to leave. The\n// guarantee is structural rather than promised: see packages/storefront\n// CardBrick.tsx, where there is no state that could hold a card number because\n// the inputs are not ours to read.\n//\n// ── which API this speaks, and why it matters here ──────────────────────────\n// The Orders API (`POST /v1/orders`), not `/v1/payments`. Their own docs say\n// the payments endpoint \"will no longer receive new features\", and the two do\n// not agree on shapes that a connector cannot paper over: Orders wants money as\n// a STRING (\"27.99\"), an expiry as an ISO-8601 DURATION (\"PT30M\"), and it\n// returns the Pix QR on `transactions.payments[].payment_method` rather than on\n// `point_of_interaction`. Verified end to end against a production seller test\n// user on 2026-08-26 — Pix opened 201 `action_required`/`waiting_transfer`, card\n// opened 201 `processed`/`accredited`.\n//\n// No SQL. The connection is a connections row (packages/db 029); a capture\n// is an effect claimed through plg_claim_effect (030).\nimport React, { useEffect, useState } from 'react'\nimport {\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n getActiveTenantId,\n type ConnectorDefinition,\n} from '@fayz-ai/core'\nimport { describeConnectorAccount, fayzConnectorOAuth } from '@fayz-ai/admin'\n\nexport const MERCADOPAGO_CONNECTOR_ID = 'mercadopago'\n\n/**\n * Six seconds, the budget every gateway on this shelf carries: it is spent after\n * the buyer pressed \"pagar\", where waiting is expected and a premature refusal\n * costs a sale that was about to happen.\n *\n * Measured, not copied: `POST /v1/orders` answered in 700–1100 ms from São Paulo\n * across the Pix and card runs on 2026-08-26. The budget keeps the same headroom\n * the others were given.\n */\nexport const MERCADOPAGO_LATENCY_BUDGET_MS = 6000\n\n/**\n * There is no form, and that is the point of this connector.\n *\n * The seller authorizes Fayz on Mercado Pago's own screen. No credential ever\n * passes through this file, nobody has to find an access token in a developer\n * panel, and the grant can be revoked from their side without us holding\n * anything that keeps working afterwards.\n *\n * ── what replaced the two pasted fields ────────────────────────────────────\n *\n * This connector first shipped with `accessToken` and `publicKey` as password\n * fields, because that could be tested the same afternoon. It worked, and it\n * could never be a product: `marketplace_fee` — the split that pays Fayz — is\n * \"exclusivo para integrações com OAuth\" in their docs, so a store connected by\n * pasting keys is a store we cannot earn on. The form is gone rather than kept\n * as a fallback, because a shelf offering both would let a merchant choose the\n * one that quietly disables the business model.\n *\n * Stores connected the old way are NOT stranded. The vault is keyed by\n * slug + tenant and the runtime reads `accessToken` and `access_token` alike,\n * so an existing connection keeps charging; pressing Conectar upgrades it in\n * place, and the row gains the refresh token it never had.\n *\n * ── there is still no environment setting ──────────────────────────────────\n *\n * The token itself decides which world a charge lands in — `live_mode` comes\n * back with the grant — so there is no flag here to disagree with it. That is\n * the trap AbacatePay set (migration 0069), where a catalogue pushed with a\n * production key did not exist in sandbox.\n *\n * One caveat that survives from the pasted-key days: the Orders API REFUSES\n * `TEST-` credentials outright. Testing means a test USER authorizing with\n * their own production keys, which is what the panel below says.\n */\nconst store = createConnectionStore(MERCADOPAGO_CONNECTOR_ID)\n\n/**\n * The row's one-line summary.\n *\n * It used to read the pasted `publicKey` out of settings and say Sandbox or\n * Produção from its prefix. Under OAuth there is no pasted key: the whole\n * credential — `live_mode` included — is in the vault, which never hands it\n * back to this file. Saying \"Produção\" from something we can no longer see\n * would be a guess printed as a fact, so the row states only what is certainly\n * true of every connected store.\n */\nfunction connectionDetail(connection: { displayName?: string | null } | null | undefined): string {\n // The account first, because it is the thing a green dot cannot say. A\n // merchant with a personal account and a company one, or an agency holding\n // several clients, otherwise has no way to tell which is taking the money —\n // and connecting the WRONG one looks exactly like connecting the right one.\n const account = String(connection?.displayName ?? '').trim()\n return account ? `${account} · Pix e cartão` : 'Pix e cartão'\n}\n\nfunction MercadoPagoExtraPanel() {\n const [connected, setConnected] = useState(false)\n const [account, setAccount] = useState<{ name: string | null; id: string | null }>({ name: null, id: null })\n const [loaded, setLoaded] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void store\n .get()\n .then((c) => {\n if (cancelled) return\n setConnected(!!c?.active)\n setAccount({\n name: String(c?.displayName ?? '').trim() || null,\n id: String(c?.providerAccountKey ?? '').trim() || null,\n })\n })\n .catch(() => {})\n .finally(() => { if (!cancelled) setLoaded(true) })\n return () => { cancelled = true }\n }, [])\n\n if (!loaded) return null\n\n return (\n <div className=\"space-y-2 border-t pt-4 text-xs text-muted-foreground\">\n {connected && (account.name || account.id) && (\n /* Named before anything else is explained. \"Conectado\" is not an answer\n to \"connected to WHAT\" — and a store whose money is going to the\n wrong Mercado Pago account looks identical to one whose money is not. */\n <div className=\"rounded-md border bg-muted/40 p-3\">\n <p className=\"font-medium text-foreground\">Conta conectada</p>\n {account.name && <p className=\"mt-1 break-words\">{account.name}</p>}\n {account.id && (\n <p className=\"mt-0.5\">\n ID no Mercado Pago: <code className=\"rounded bg-muted px-1 py-0.5\">{account.id}</code>\n </p>\n )}\n <p className=\"mt-1\">\n Não é esta a conta? Clique em <strong>Desconectar</strong> e conecte de novo, logado na\n conta certa do Mercado Pago.\n </p>\n </div>\n )}\n {connected && !account.name && !account.id && (\n /* An older connection, made before the account was recorded. Saying so\n beats showing nothing and letting it read as \"no account\". */\n <p className=\"rounded-md border border-dashed p-3\">\n Esta conexão foi feita antes de a loja passar a guardar qual conta foi autorizada. Para ver\n o nome da conta aqui, clique em <strong>Desconectar</strong> e conecte novamente.\n </p>\n )}\n {connected ? (\n <>\n <p>\n Pix e cartão acontecem <strong>dentro da sua loja</strong>. O cliente vê o QR Code ou\n digita o cartão sem sair da página, e volta para a confirmação no mesmo lugar. Diferente\n das outras adquirentes, aqui o cartão não redireciona.\n </p>\n <p>\n O número do cartão não passa pelo seu site: ele é digitado dentro de um formulário do\n próprio Mercado Pago e vira um código de uso único antes de chegar até nós. É por isso\n que dá para receber cartão na sua página sem a auditoria que isso normalmente exige.\n </p>\n <p>\n O valor cobrado é sempre recalculado aqui no servidor a partir do pedido. Preço alterado\n no navegador não é aceito, e clicar duas vezes em \"pagar\" gera uma cobrança só.\n </p>\n <p>\n O Pix vale por 30 minutos. Se o cliente fechar a aba depois de pagar, o pedido aparece\n aqui do mesmo jeito — o Mercado Pago avisa a loja assim que o dinheiro cai.\n </p>\n </>\n ) : (\n <>\n <p>\n Clique em <strong>Conectar</strong> e você vai para o Mercado Pago autorizar a Fayz. É\n na tela deles, com o seu login — nenhuma senha e nenhuma chave passam por aqui.\n </p>\n <p>\n O dinheiro continua caindo na <strong>sua</strong> conta do Mercado Pago. A autorização\n só permite abrir cobranças em nome da sua loja, e você pode cancelá-la quando quiser no\n painel do Mercado Pago.\n </p>\n <p>\n Use uma conta <strong>PJ</strong>, com o CNPJ da loja. Conta pessoa física costuma vir\n com bandeiras de cartão bloqueadas até a verificação terminar — e o bloqueio aparece\n como uma compra recusada, não como um aviso.\n </p>\n </>\n )}\n\n {/* The one thing that surprises everybody who tests this, written where the\n testing happens. Leaving it to the docs turns \"401\" into a conversation. */}\n <div className=\"rounded-md border border-dashed p-3\">\n <p className=\"font-medium text-foreground\">Para testar sem cobrar de verdade</p>\n <p className=\"mt-1\">\n O teste é feito com <strong>usuários de teste</strong>: crie um vendedor e um comprador em\n Suas integrações → Contas de teste, e autorize aqui logado como o vendedor de teste. Não é\n dinheiro real, e é assim que o próprio Mercado Pago recomenda. Credenciais que começam com{' '}\n <code className=\"rounded bg-muted px-1 py-0.5\">TEST-</code> <strong>não funcionam</strong>{' '}\n nesta API — o usuário de teste usa as chaves de produção dele.\n </p>\n </div>\n </div>\n )\n}\n\nexport const mercadoPagoConnectorDef: ConnectorDefinition = {\n id: MERCADOPAGO_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Mercado Pago · Checkout',\n description: 'Pix e cartão pelo Mercado Pago, os dois pagos dentro da loja — o cartão é digitado sem o cliente sair da página.',\n icon: 'CreditCard',\n // Declared rather than borrowed from the catalogue, for the same reason Vindi\n // declares its own: the catalogue row is a change in another repo that has to\n // be seeded before it exists anywhere, and until then the shelf renders a grey\n // plug. The absolute URL answers from any origin — a tenant app is served from\n // its own domain, so a path would not.\n logoUrl: 'https://assets.fayz.ai/connectors/mercadopago.png',\n category: 'payments',\n // A real consent screen, unlike Vindi's — whose flow only LOOKS like OAuth and\n // is a CODE copied out of an address bar. The seller authorizes Fayz once at\n // auth.mercadopago.com, the money keeps landing in their own account, and\n // `marketplace_fee` takes our cut on the way past.\n //\n // That fee is the reason this is not pasted keys: Mercado Pago's docs are\n // explicit that it is \"exclusivo para integrações com OAuth\", so a connection\n // made by copying credentials out of a panel can never earn. The pasted-key\n // version shipped first because it could be tested the same afternoon; this\n // is the one that can be a product.\n //\n // A store connected the old way keeps working and does not have to be\n // migrated by hand: the vault is keyed by slug + tenant, and the runtime reads\n // `accessToken` and `access_token` alike. Reconnecting through the button\n // upgrades it in place — same slug, same row, now with a refresh token.\n authKind: 'oauth',\n // The whole of it. `provider` defaults to the connector id, and both are\n // `mercadopago` — the platform registry keys on that word.\n startOAuth: fayzConnectorOAuth(MERCADOPAGO_CONNECTOR_ID),\n // The charge is opened in the buyer's request path; the notification and the\n // refund are outbound sync work.\n planes: ['request', 'sync'],\n direction: 'outbound',\n docsUrl: 'https://www.mercadopago.com.br/developers/pt/docs/checkout-api/landing',\n providerInstall: { url: 'https://www.mercadopago.com.br/developers/panel/app' },\n // Grounded in what the request plane does, and padded with nothing: the total\n // is recomputed server-side from the order before the charge is opened, which\n // is a read of the order and never a write of it; the charge and its\n // confirmation are the write.\n permissions: [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read'],\n reason:\n 'Ler o pedido para recalcular o valor no servidor antes de abrir a cobrança — o total nunca vem do navegador do cliente.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'payment',\n actions: ['write'],\n reason:\n 'Registrar aqui a cobrança aberta e a confirmação do pagamento. O número do cartão não passa por este app — ele é digitado num formulário do próprio Mercado Pago.',\n sensitive: true,\n },\n ],\n latencyBudgetMs: MERCADOPAGO_LATENCY_BUDGET_MS,\n // A gateway that does not answer must stop the sale: an order that reads as\n // confirmed without a payment is worse than a refused checkout. Same verdict\n // as the other four gateways, opposite to the carrier next door.\n onFailure: 'block',\n invokedAt: [\n {\n key: 'shop.checkout.session_open',\n label: 'O cliente finaliza a compra e a cobrança é aberta no Mercado Pago (QR do Pix ou cartão digitado na própria loja)',\n touches: ['order', 'payment'],\n },\n {\n key: 'shop.payment.capture',\n label: 'O Mercado Pago avisa que o pagamento caiu, a cobrança é reconsultada e o pedido é liberado',\n plane: 'sync',\n trigger: 'webhook',\n touches: ['payment'],\n },\n ],\n // Read from the row the list already batched, so a screen with N connectors\n // costs one connections request rather than N.\n //\n // No `settingsStatus`: this connector has nothing to configure, so a\n // connection either has its credential pair or does not. \"Conectado, falta\n // configurar\" would be a state that can never be true here.\n ...connectionStatus(\n MERCADOPAGO_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: connectionDetail(connection),\n plane: 'request',\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n // Reached only AFTER the credential sink accepted the pair — that ordering is\n // what makes `active = true` mean \"credentials were placed for this store\"\n // rather than \"somebody pressed a button\". The secret never arrives here: the\n // hub split it out before calling this.\n //\n // No `testConnection`: the probe is handed the non-secret half, and a public\n // key alone cannot open an order. Testing belongs to the edge function that\n // holds the credential.\n saveConnection: async () => {\n // Runs on the way back from the consent screen. `active: true` is the half\n // that has always been written here; the account is the half that was\n // missing, and this is the only place it can be written.\n //\n // The name lives on the PLATFORM's connection row — captured at grant time,\n // because the vault never hands a token back to a screen — while the panel\n // renders from the tenant's own `connections`. Nothing bridged the two,\n // which is why every row in a live pool has `display_name: null`. So the\n // app asks who it just connected to and stores the answer next to the\n // switch, where the panel already looks.\n //\n // Failure is silent by construction: `describeConnectorAccount` returns\n // null rather than throwing, and a connector must not refuse to connect\n // because a label could not be fetched.\n // WITH the tenant, always. The platform mints the runtime token behind this\n // call from a schema where `tenantId` is REQUIRED (`z.string().min(1)`), so\n // omitting it is not \"let the server choose\" — it is a 400 before any\n // choosing happens, and the null that comes back is indistinguishable from\n // \"this connector has no account\". That is how a live pool ends up with\n // every `display_name` null while the connect itself reports success.\n //\n // It reads as harmless because one org hides it: with a single membership\n // there is nothing to select. The bill arrives on the first operator who\n // belongs to two.\n const account = await describeConnectorAccount({\n connectorId: MERCADOPAGO_CONNECTOR_ID,\n tenantId: getActiveTenantId(),\n })\n await store.save({\n active: true,\n ...(account?.displayName ? { displayName: account.displayName } : {}),\n ...(account?.providerAccountKey ? { providerAccountKey: account.providerAccountKey } : {}),\n })\n },\n disconnect: () => store.disconnect(),\n ExtraPanel: MercadoPagoExtraPanel,\n}\n","import type { MediaFile } from '@fayz-ai/shop'\n\n// ---------------------------------------------------------------------------\n// Os dois endereços que a biblioteca de conteúdo precisa saber montar: para\n// onde uma foto leva, e por onde ela desce. Fora do componente porque é o que\n// realmente pode quebrar sem ninguém ver — uma rota que mudou de forma, um\n// arquivo que abre em vez de baixar.\n// ---------------------------------------------------------------------------\n\n/** A tela onde a foto é gerenciada — a aba de fotos do produto, não a lista. */\nexport function recordRoute(reference: NonNullable<MediaFile['reference']>): string {\n return `#/products/${reference.id}/images`\n}\n\n/**\n * O endereço que baixa o arquivo em vez de abri-lo.\n *\n * O storage devolve o arquivo como anexo quando pedimos; o atributo `download`\n * do link sozinho é ignorado quando o arquivo vem de outro domínio — que é o\n * caso de toda foto da loja.\n */\nexport function downloadUrlOf(file: MediaFile): string {\n if (!/^https?:/i.test(file.url)) return file.url\n const separator = file.url.includes('?') ? '&' : '?'\n return `${file.url}${separator}download=${encodeURIComponent(file.name)}`\n}\n","import React from 'react'\nimport {\n ChevronLeft, ChevronRight, Download, Film, FileText, ImageOff,\n Package, RefreshCw, Trash2, Upload,\n} from 'lucide-react'\nimport { Button, Card, ConfirmDialog, Hint, PageHeader, PageHeaderActions, PageTabs, toast } from '@fayz-ai/ui'\nimport { AskAIButton, PageActions, type PageAction } from '@fayz-ai/admin'\nimport type { MediaFile, ShopProvider } from '@fayz-ai/shop'\nimport { getShopProvider, productImageToMediaFile } from '@fayz-ai/shop'\nimport { downloadUrlOf, recordRoute } from './media-links'\nimport type { ShopProviderResolver } from './ShopPage'\n\n// ---------------------------------------------------------------------------\n// Conteúdo — a biblioteca de arquivos da loja.\n//\n// Não é um depósito: é onde o lojista olha as fotos do catálogo todas juntas e\n// vê quais estão ruins. Por isso cada arquivo mostra a que registro pertence e\n// leva até ele — uma parede de miniaturas anônimas mostra o problema e não dá\n// para onde ir —, e por isso abrir uma foto acontece AQUI, com voltar, baixar e\n// trocar à mão: quem veio revisar o catálogo revisa dezenas, e cada ida a outra\n// aba é uma volta que ele não faz.\n//\n// Uma foto de produto é uma linha em plg_shop_product_images (é o provider que\n// junta as duas fontes); o que o lojista sobe aqui não pertence a nada e fica na\n// biblioteca.\n// ---------------------------------------------------------------------------\n\ntype MediaTab = 'all' | 'image' | 'video'\n\nconst TABS: { value: MediaTab; label: string }[] = [\n { value: 'all', label: 'Todos' },\n { value: 'image', label: 'Imagens' },\n { value: 'video', label: 'Vídeos' },\n]\n\n/** Abaixo disso a foto estoura no zoom do storefront e no retina de um celular. */\nconst LOW_RESOLUTION_PX = 800\n\nfunction resolve(resolver?: ShopProviderResolver): ShopProvider {\n return typeof resolver === 'function' ? resolver() : resolver ?? getShopProvider()\n}\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return ''\n const units = ['B', 'KB', 'MB', 'GB']\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1)\n return `${(bytes / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n}\n\ninterface Dimensions { width: number; height: number }\n\nexport interface ContentPageProps {\n resolveProvider?: ShopProviderResolver\n}\n\nexport function ContentPage({ resolveProvider }: ContentPageProps) {\n const provider = React.useMemo(() => resolve(resolveProvider), [resolveProvider])\n const supported = typeof provider.listMediaFiles === 'function'\n\n const [files, setFiles] = React.useState<MediaFile[] | null>(null)\n const [tab, setTab] = React.useState<MediaTab>('all')\n const [uploading, setUploading] = React.useState(false)\n const [pendingDelete, setPendingDelete] = React.useState<MediaFile | null>(null)\n const [deleting, setDeleting] = React.useState(false)\n const [replacing, setReplacing] = React.useState(false)\n // A foto aberta é guardada por id, não por objeto: a lista recarrega a cada\n // troca e um objeto guardado ficaria mostrando o arquivo antigo.\n const [openId, setOpenId] = React.useState<string | null>(null)\n // Medidas do arquivo real, lidas do <img> depois que ele carrega: o tamanho em\n // bytes não diz se a foto está pequena, e é isso que o lojista veio ver.\n const [dimensions, setDimensions] = React.useState<Record<string, Dimensions>>({})\n // The picker lives on the page, not inside a button: the header action is\n // now declared (PageActions), and a declaration has no DOM to hang an\n // <input type=\"file\"> off. Its `onSelect` clicks this one instead.\n const uploadInputRef = React.useRef<HTMLInputElement>(null)\n\n const reload = React.useCallback(async () => {\n if (!provider.listMediaFiles) { setFiles([]); return }\n try {\n setFiles(await provider.listMediaFiles())\n } catch (err) {\n console.warn('[content] failed to list media', err)\n setFiles([])\n }\n }, [provider])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const measure = React.useCallback((id: string, d: Dimensions) => {\n setDimensions((prev) => prev[id] ? prev : { ...prev, [id]: d })\n }, [])\n\n const handleUpload = async (picked: FileList | null) => {\n if (!picked?.length || !provider.uploadMediaFile) return\n setUploading(true)\n try {\n // Sequential, not Promise.all: a merchant dropping twenty photos on a\n // café connection should not open twenty parallel uploads that all\n // time out together.\n for (const file of Array.from(picked)) {\n await provider.uploadMediaFile(file)\n }\n toast.success(picked.length === 1 ? 'Arquivo enviado' : `${picked.length} arquivos enviados`)\n await reload()\n } catch (err) {\n console.warn('[content] upload failed', err)\n toast.error('Não foi possível enviar o arquivo')\n } finally {\n setUploading(false)\n }\n }\n\n const handleReplace = async (file: MediaFile, picked: File) => {\n setReplacing(true)\n try {\n let nextId: string\n if (file.reference) {\n if (!provider.replaceProductImage) throw new Error('unsupported')\n const image = await provider.replaceProductImage(file.reference.attachmentId, picked)\n // A troca escreve um arquivo novo, então a identidade muda — reabrir a\n // foto pelo id antigo cairia numa tela em branco.\n nextId = productImageToMediaFile(image, file.reference.label).id\n } else {\n if (!provider.uploadMediaFile) throw new Error('unsupported')\n // Sobe primeiro, apaga depois: se a subida falhar, o lojista continua\n // com o arquivo que tinha.\n const uploaded = await provider.uploadMediaFile(picked)\n if (provider.deleteMediaFile) await provider.deleteMediaFile(file.id)\n nextId = uploaded.id\n }\n await reload()\n setOpenId(nextId)\n toast.success('Arquivo trocado')\n } catch (err) {\n console.warn('[content] replace failed', err)\n toast.error('Não foi possível trocar o arquivo')\n } finally {\n setReplacing(false)\n }\n }\n\n const confirmDelete = async () => {\n const file = pendingDelete\n if (!file) return\n setDeleting(true)\n try {\n // Uma foto de produto se apaga desanexando: a linha é o que a torna a foto\n // daquele produto, e é o provider que leva o arquivo junto. Um arquivo da\n // biblioteca não tem linha nenhuma — só o objeto.\n if (file.reference) {\n await provider.deleteProductImage(file.reference.attachmentId)\n } else if (provider.deleteMediaFile) {\n await provider.deleteMediaFile(file.id)\n }\n setFiles((prev) => prev?.filter((f) => f.id !== file.id) ?? null)\n setPendingDelete(null)\n if (openId === file.id) setOpenId(null)\n } catch (err) {\n console.warn('[content] delete failed', err)\n toast.error('Não foi possível excluir o arquivo')\n } finally {\n setDeleting(false)\n }\n }\n\n const visible = (files ?? []).filter((f) => tab === 'all' || f.kind === tab)\n const openIndex = visible.findIndex((f) => f.id === openId)\n const open = openIndex >= 0 ? visible[openIndex]! : null\n\n const canDelete = (file: MediaFile) => Boolean(file.reference) || typeof provider.deleteMediaFile === 'function'\n const canReplace = (file: MediaFile) => file.reference\n ? typeof provider.replaceProductImage === 'function'\n : typeof provider.uploadMediaFile === 'function'\n\n // A foto aberta ocupa a página inteira: a grade atrás dela seria só ruído, e\n // voltar é um clique (ou Esc).\n if (open) {\n return (\n <>\n <MediaDetail\n file={open}\n dimensions={dimensions[open.id]}\n onMeasured={(d) => measure(open.id, d)}\n position={{ index: openIndex, total: visible.length }}\n onNavigate={(delta) => setOpenId(visible[openIndex + delta]?.id ?? open.id)}\n onBack={() => setOpenId(null)}\n onReplace={canReplace(open) ? (picked) => void handleReplace(open, picked) : undefined}\n onDelete={canDelete(open) ? () => setPendingDelete(open) : undefined}\n replacing={replacing}\n />\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n </>\n )\n }\n\n const attached = visible.filter((f) => f.reference)\n const loose = visible.filter((f) => !f.reference)\n\n // O NÚMERO VAI NA ABA, não ao lado dela.\n //\n // A contagem saía como texto solto no lado direito da faixa — que é o lugar\n // dos filtros e dos modos de ver em toda tela do produto (ver PageTabs). Era\n // a única tela com prosa ali, e era ela que esticava a faixa. `count` é o\n // slot que a própria aba tem para isso, e ainda responde uma pergunta que a\n // legenda não respondia: quantos vídeos, quantas imagens.\n const countOf = (t: MediaTab) => {\n if (files === null) return undefined\n if (t === 'all') return files.length\n return files.filter((f) => f.kind === t).length\n }\n const tabs = TABS.map((t) => ({ ...t, count: countOf(t.value) }))\n\n // Declared, not drawn: PageActions is what every other list's header uses,\n // so \"Enviar arquivos\" gets the same button on a pointer and the same FAB in\n // the thumb's corner on a phone. Hand-drawn it was a text button squeezed\n // into the phone's top bar, which is the one place a thumb cannot reach.\n const uploadActions: PageAction[] = [{\n id: 'upload',\n label: uploading ? 'Enviando…' : 'Enviar arquivos',\n icon: Upload,\n intent: 'primary',\n // It puts a new file in the library — the FAB is a \"+\", not a \"⋮\".\n creates: true,\n disabled: uploading,\n onSelect: () => uploadInputRef.current?.click(),\n }]\n\n const renderGrid = (list: MediaFile[]) => (\n <div className=\"fz-cards gap-4\">\n {list.map((file) => (\n <MediaCard\n key={file.id}\n file={file}\n dimensions={dimensions[file.id]}\n onMeasured={(d) => measure(file.id, d)}\n onOpen={() => setOpenId(file.id)}\n onDelete={canDelete(file) ? () => setPendingDelete(file) : undefined}\n />\n ))}\n </div>\n )\n\n return (\n <>\n {/* No <h1>: the shell's top bar already names the page — and now it also\n carries the upload, like every other page's primary action. The tabs\n are the page's own band (PageTabs), the same strip every list draws,\n not a row of links floating on the content. */}\n {/* A FAIXA É O PRIMEIRO FILHO, e tem de ser.\n A shell embrulha a página em `space-y-6 pt-4` (AdminShell), e a faixa\n sobe com `-mt-4` para encostar no cabeçalho — as duas coisas só se\n cancelam no PRIMEIRO filho. O seletor de arquivo escondido vinha\n antes: `display:none` não ocupa altura, mas continua sendo um filho,\n então a faixa herdava os 24px do `space-y` E perdia o encaixe do\n `-mt-4`. Era um buraco de ~40px entre \"Conteúdo\" e as abas que\n nenhuma outra tela tinha. O input foi para o fim, onde não empurra\n nada.\n A mesma faixa do Financeiro: abas à esquerda, fio atravessando a\n página, lado direito livre para filtros. */}\n <PageTabs\n tabs={tabs}\n value={tab}\n onChange={setTab}\n aria-label=\"Arquivos\"\n />\n {supported && provider.uploadMediaFile && (\n <PageHeaderActions>\n <PageActions actions={uploadActions} />\n </PageHeaderActions>\n )}\n\n <div className=\"space-y-6\">\n {!supported ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Armazenamento não configurado</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n A biblioteca de arquivos precisa do storage da loja, que não está disponível neste modo.\n </p>\n </Card>\n ) : files === null ? (\n <div className=\"fz-cards gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Card key={i} className=\"p-3\">\n <div className=\"aspect-square animate-pulse rounded-md bg-muted\" />\n <div className=\"mt-2 h-3.5 w-2/3 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : visible.length === 0 ? (\n <Card className=\"p-12 text-center\">\n <ImageOff className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-3 font-medium\">Nenhum arquivo ainda</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n As fotos dos seus produtos e o que você enviar aqui aparecem nesta biblioteca.\n </p>\n </Card>\n ) : attached.length && loose.length ? (\n // Só separa quando há os dois: um título sozinho em cima de tudo é\n // barulho, e a etiqueta em cada cartão já diz de quem é a foto.\n <div className=\"space-y-8\">\n <section className=\"space-y-3\">\n <SectionTitle title=\"Fotos de produtos\" count={attached.length} />\n {renderGrid(attached)}\n </section>\n <section className=\"space-y-3\">\n <SectionTitle title=\"Biblioteca\" count={loose.length} />\n {renderGrid(loose)}\n </section>\n </div>\n ) : (\n renderGrid(visible)\n )}\n\n <DeleteConfirm\n file={pendingDelete}\n loading={deleting}\n onConfirm={() => void confirmDelete()}\n onCancel={() => setPendingDelete(null)}\n />\n {supported && provider.uploadMediaFile && (\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n void handleUpload(e.target.files).finally(() => {\n if (uploadInputRef.current) uploadInputRef.current.value = ''\n })\n }}\n />\n )}\n </div>\n </>\n )\n}\n\nfunction DeleteConfirm({ file, loading, onConfirm, onCancel }: {\n file: MediaFile | null\n loading: boolean\n onConfirm: () => void\n onCancel: () => void\n}) {\n return (\n <ConfirmDialog\n open={file !== null}\n loading={loading}\n variant=\"destructive\"\n title={file?.reference ? 'Excluir a foto do produto?' : 'Excluir arquivo?'}\n description={file?.reference\n ? `A foto sai de \"${file.reference.label}\" e da loja imediatamente.`\n : 'O arquivo sai da biblioteca. Se ele estiver em uso em algum lugar, o endereço para de funcionar.'}\n confirmLabel=\"Excluir\"\n cancelLabel=\"Cancelar\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n )\n}\n\nfunction SectionTitle({ title, count }: { title: string; count: number }) {\n return (\n <h2 className=\"text-sm font-semibold\">\n {title} <span className=\"font-normal text-muted-foreground\">({count})</span>\n </h2>\n )\n}\n\n/** O ícone que representa um arquivo que não é imagem. */\nfunction KindIcon({ kind, className }: { kind: MediaFile['kind']; className: string }) {\n const Icon = kind === 'video' ? Film : FileText\n return <Icon className={className} />\n}\n\nfunction MediaCard({ file, dimensions, onMeasured, onOpen, onDelete }: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n onOpen: () => void\n onDelete?: () => void\n}) {\n return (\n <Card className=\"group relative overflow-hidden p-3\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n onClick={onOpen}\n aria-label={`Abrir ${file.name}`}\n className=\"font-normal gap-0 whitespace-normal relative flex aspect-square w-full items-center justify-center overflow-hidden rounded-md bg-muted\"\n >\n {file.kind === 'image' ? (\n <img\n src={file.url}\n alt={file.name}\n loading=\"lazy\"\n className=\"h-full w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <KindIcon kind={file.kind} className=\"h-8 w-8 text-muted-foreground\" />\n )}\n {file.reference?.isCover && (\n <span className=\"absolute left-1.5 top-1.5 rounded-full bg-primary px-2 py-0.5 text-[11px] font-bold text-primary-foreground\">\n Capa\n </span>\n )}\n </Button>\n\n {onDelete && (\n <Hint label=\"Excluir\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Excluir\"\n onClick={onDelete}\n className=\"absolute right-4 top-4 rounded-md bg-card/90 p-1.5 text-muted-foreground opacity-0 shadow-button transition-opacity hover:text-destructive group-hover:opacity-100\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </Hint>\n )}\n\n <p className=\"mt-2 truncate text-[13px] font-medium\" title={file.name}>{file.name}</p>\n <p className=\"text-[11px] text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-1 text-[11px] font-medium text-warning\">Baixa resolução</p>\n )}\n\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1.5 text-[11px]\" />\n ) : (\n <p className=\"mt-1.5 text-[11px] text-muted-foreground\">Biblioteca</p>\n )}\n </Card>\n )\n}\n\n/**\n * A foto aberta, dentro de /content.\n *\n * Abrir numa aba nova mostrava o arquivo e mais nada — nem de quem é, nem como\n * trocar. Aqui a revisão inteira acontece no mesmo lugar: olhar, baixar, trocar,\n * ir para a próxima.\n */\nfunction MediaDetail({\n file, dimensions, onMeasured, position, onNavigate, onBack, onReplace, onDelete, replacing,\n}: {\n file: MediaFile\n dimensions?: Dimensions\n onMeasured: (d: Dimensions) => void\n position: { index: number; total: number }\n onNavigate: (delta: number) => void\n onBack: () => void\n onReplace?: (picked: File) => void\n onDelete?: () => void\n replacing: boolean\n}) {\n const replaceRef = React.useRef<HTMLInputElement>(null)\n\n // As setas andam pelo conjunto que está na tela: revisar trinta fotos é uma\n // tarefa de teclado. O Escape não está aqui — o PageHeader já o liga ao\n // mesmo \"voltar\" que desenha na barra.\n React.useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowLeft') onNavigate(-1)\n if (e.key === 'ArrowRight') onNavigate(1)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [onNavigate])\n\n return (\n // `fz-container` é o ponto de MEDIÇÃO: sem ele a container query de\n // `fz-split` nunca casa e as duas colunas ficam empilhadas para sempre,\n // por mais larga que a janela esteja.\n <div className=\"fz-container space-y-4\">\n {/* A seta mora na barra da shell, como em toda tela de detalhe do app:\n \"← Conteúdo / foto.jpg\". Desenhá-la aqui dentro seria o segundo\n cabeçalho que o PageHeader existe para não deixar acontecer. */}\n <PageHeader title={file.name} parentLabel=\"Conteúdo\" onBack={onBack} />\n\n {position.total > 1 && (\n <div className=\"flex items-center justify-end gap-3\">\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Arquivo anterior\"\n disabled={position.index === 0}\n onClick={() => onNavigate(-1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"px-1 tabular-nums\">{position.index + 1} de {position.total}</span>\n <Button variant=\"bare\" size=\"bare\"\n type=\"button\"\n aria-label=\"Próximo arquivo\"\n disabled={position.index === position.total - 1}\n onClick={() => onNavigate(1)}\n className=\"rounded-md border p-1 transition hover:bg-muted disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n\n <div className=\"fz-split\">\n <Card className=\"flex min-h-[320px] items-center justify-center overflow-hidden bg-muted p-2\">\n {file.kind === 'image' ? (\n <img\n key={file.url}\n src={file.url}\n alt={file.name}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n onLoad={(e) => {\n const img = e.currentTarget\n if (img.naturalWidth) onMeasured({ width: img.naturalWidth, height: img.naturalHeight })\n }}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 p-12 text-muted-foreground\">\n <KindIcon kind={file.kind} className=\"h-10 w-10\" />\n <span className=\"text-sm\">Pré-visualização não disponível</span>\n </div>\n )}\n </Card>\n\n <Card className=\"space-y-4 p-4\">\n <div>\n <p className=\"break-words font-medium\" title={file.name}>{file.name}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n <FileMeta file={file} dimensions={dimensions} />\n </p>\n {isLowResolution(file, dimensions) && (\n <p className=\"mt-2 rounded-md bg-warning/10 px-2 py-1.5 text-xs font-medium text-warning\">\n Baixa resolução — no zoom da loja essa foto fica borrada. Troque por uma\n de pelo menos {LOW_RESOLUTION_PX}px no lado maior.\n </p>\n )}\n </div>\n\n <div>\n <p className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">Onde é usada</p>\n {file.reference ? (\n <RecordLink reference={file.reference} className=\"mt-1 text-sm\" />\n ) : (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Biblioteca — este arquivo não está preso a nenhum registro.\n </p>\n )}\n {file.reference?.isCover && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n É a capa: é ela que aparece no catálogo, no carrinho e no pedido.\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n {/* Abre o assistente já sobre ESTA foto: a imagem entra anexada por\n endereço — o modelo busca o original, ninguém converte 100KB em\n base64 — e o pedido já vem escrito. Escrito, não enviado: quem\n está olhando uma foto ruim costuma ter algo a acrescentar (\"e\n deixa o fundo branco\"), e mandar por ele tiraria essa chance. */}\n {file.kind === 'image' && (\n <AskAIButton\n className=\"w-full\"\n size=\"lg\"\n label=\"Melhorar com IA\"\n media={{ url: file.url, name: file.name }}\n draft=\"Melhora essa imagem\"\n hint=\"o que você quer mudar nessa foto\"\n intro={{\n persona: 'Estúdio de imagem',\n pitch: `Vamos melhorar ${file.name}.`,\n description:\n 'Posso limpar o fundo, corrigir luz e cor, e gerar uma versão em resolução maior para o catálogo.',\n suggestions: [\n { label: 'Fundo branco', prompt: 'Remove o fundo e deixa branco' },\n { label: 'Mais nítida', prompt: 'Aumenta a resolução e a nitidez' },\n { label: 'Corrigir a luz', prompt: 'Corrige a iluminação e as cores' },\n ],\n }}\n />\n )}\n\n <Button asChild variant=\"outline\" className=\"w-full\">\n <a href={downloadUrlOf(file)} download={file.name}>\n <Download className=\"mr-2 h-4 w-4\" />\n Baixar\n </a>\n </Button>\n\n {onReplace && (\n <>\n <input\n ref={replaceRef}\n type=\"file\"\n accept={file.kind === 'image' ? 'image/*' : undefined}\n className=\"hidden\"\n onChange={(e) => {\n const picked = e.target.files?.[0]\n e.target.value = ''\n if (picked) onReplace(picked)\n }}\n />\n <Button\n variant=\"outline\"\n className=\"w-full\"\n disabled={replacing}\n onClick={() => replaceRef.current?.click()}\n >\n <RefreshCw className={`mr-2 h-4 w-4 ${replacing ? 'animate-spin' : ''}`} />\n {replacing ? 'Trocando…' : 'Trocar arquivo'}\n </Button>\n {file.reference && (\n <p className=\"text-[11px] text-muted-foreground\">\n A troca mantém a posição da foto na galeria do produto.\n </p>\n )}\n </>\n )}\n\n {onDelete && (\n <Button variant=\"ghost\" className=\"w-full text-destructive hover:text-destructive\" onClick={onDelete}>\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Excluir\n </Button>\n )}\n </div>\n </Card>\n </div>\n </div>\n )\n}\n\nfunction RecordLink({ reference, className = '' }: {\n reference: NonNullable<MediaFile['reference']>\n /** Quem chama define o tamanho: o mesmo link serve o cartão e o painel. */\n className?: string\n}) {\n return (\n <a\n href={recordRoute(reference)}\n title={`Abrir ${reference.label}`}\n className={`flex items-center gap-1 truncate font-medium text-primary hover:underline ${className}`}\n >\n <Package className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{reference.label}</span>\n </a>\n )\n}\n\nfunction FileMeta({ file, dimensions }: { file: MediaFile; dimensions?: Dimensions }) {\n const parts = [\n file.extension,\n dimensions ? `${dimensions.width}×${dimensions.height}` : '',\n formatSize(file.size),\n ].filter(Boolean)\n return <>{parts.join(' · ')}</>\n}\n\nfunction isLowResolution(file: MediaFile, dimensions?: Dimensions): boolean {\n return file.kind === 'image' && !!dimensions\n && Math.max(dimensions.width, dimensions.height) < LOW_RESOLUTION_PX\n}\n","// ---------------------------------------------------------------------------\n// Bling's constraints. They are shape, not implementation detail.\n// ---------------------------------------------------------------------------\n// Every number here changes what the connector IS, not how it is written:\n//\n// 3 req/s, 120k/day per account, summed across every module\n// → never one request per product, which is what forces the fast `sample`\n// and the background `backfill` apart.\n// a date filter wider than one year answers 400\n// → the window is always sliced; a backfill that reaches back two years is\n// two calls, decided by the client, not one call that fails.\n// authorization_code expires in 60 seconds, and 20 calls to /oauth/token in\n// 60 seconds block the IP for an hour\n// → refresh with days of slack, never in a loop, never at the deadline.\n// the refresh token lives 30 days and rotates on use\n// → scheduled renewal is a requirement; a tenant who does not shop for a\n// month otherwise comes back disconnected.\n// a webhook must be answered 2xx within 5 seconds or Bling DISABLES the\n// configuration\n// → receive, verify, enqueue, answer. No processing on the response path.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const BLING_CONNECTOR_ID = 'bling'\n\n/** Per ACCOUNT, not per tenant: `instance_key` is the Bling company. */\nexport const BLING_RATE_LIMIT: RateLimitBudget = { perSecond: 3, perDay: 120_000 }\n\n/** Widest date filter Bling accepts. Anything longer answers 400. */\nexport const BLING_MAX_WINDOW_MS = 365 * 24 * 60 * 60_000\n\n/**\n * Re-read this much before the last window's end.\n *\n * Bling stamps `dataAlteracao` at second precision, so a product changed in the\n * same second the window closed is invisible for ever without an overlap. The\n * cost is an idempotent upsert; the cost of not having it is a price that never\n * updates and nobody can explain.\n */\nexport const BLING_WINDOW_OVERLAP_MS = 10 * 60_000\n\n/** Renew the token a week early. See the /oauth/token ban above. */\nexport const BLING_TOKEN_LEAD_MS = 7 * 24 * 60 * 60_000\n\n/** Bling's page size for the list endpoints. */\nexport const BLING_PAGE_SIZE = 100\n\n/**\n * A sample is one page, and one page only.\n *\n * At 3 req/s a ten-thousand-product catalogue is close to an hour. A connect\n * screen that waits for it is a connect screen nobody finishes, so the sample\n * answers with enough to design a storefront against and the backfill finishes\n * the mirror behind it.\n */\nexport const BLING_SAMPLE_SIZE = 100\n\n/** Bling signs its webhooks HMAC-SHA256 with the app's client secret. */\nexport const BLING_SIGNATURE_HEADER = 'x-bling-signature-256'\n\n/** Bling must see a 2xx before this, or it disables the tenant's webhook. */\nexport const BLING_WEBHOOK_DEADLINE_MS = 5_000\n","// The one place that names the Bling data plane. Same split as the Kiwify and\n// Stripe connectors: the definition declares WHAT the merchant can do, this file\n// knows how the call is made — and the credential path is what moves.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n// Estes contadores LEEM o arquétipo (v_shop_*), não a cópia do plugin: pedido e\n// cliente pertencem à base desde 0009/0013, e a view é onde os dois lados\n// concordam. Os *_links continuam em plg_shop_* — o vínculo com o provedor\n// externo é genuinamente da loja.\n\n/** The edge function that holds every Bling call this connector makes. */\nexport const BLING_FUNCTION = 'bling-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface BlingPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n stockPending?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface BlingPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o Bling.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o Bling.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(BLING_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testBling(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue down. `sample` is the seconds-long first answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<BlingPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send the products that exist only here. They come back linked — see the def. */\nexport function pushCatalogue(): Promise<BlingPushResult> {\n return invoke({ action: 'push_products' })\n}\n\n/** Send the buyers who have ordered, as Bling contacts. */\nexport function pushCustomers(): Promise<BlingPushResult> {\n return invoke({ action: 'push_customers' })\n}\n\n/** Send every paid order not filed yet, as a pedido de venda. */\nexport function pushOrders(): Promise<BlingPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Lança o saldo dos produtos já vinculados. O reparo de um estoque que não subiu. */\nexport function pushStock(): Promise<{ sent: number; considered: number; message: string }> {\n return invoke({ action: 'push_stock' })\n}\n\n/**\n * Quantos registros ainda faltam subir, por fila.\n *\n * As mesmas ausências que a função usa como fila, contadas daqui: produto sem\n * vínculo, cliente que comprou e não virou contato, pedido pago sem pedido de\n * venda. É o que deixa a linha dizer \"em dia\" em vez de oferecer um botão que\n * não enviaria nada.\n */\nasync function countRows(table: string, apply: (q: any) => any): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { count, error } = await apply(\n supabase.from(table).select('id', { count: 'exact', head: true }).eq('tenant_id', tenantId),\n )\n return error ? null : (count ?? 0)\n}\n\nexport function pendingProducts(): Promise<number | null> {\n return countRows('plg_shop_products', (q: any) => q.is('external_source', null))\n}\n\nexport async function pendingCustomers(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_customer_links')\n .select('customer_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n const already = new Set((linked ?? []).map((row: any) => row.customer_id))\n const { data, error } = await supabase\n .from('v_shop_customers')\n .select('id')\n .eq('tenant_id', tenantId)\n .gt('orders_count', 0)\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n const already = new Set((linked ?? []).map((row: any) => row.order_id))\n const { data, error } = await supabase\n .from('v_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return (data ?? []).filter((row: any) => !already.has(row.id)).length\n}\n\n/**\n * Which paid orders actually reached Bling — what a run's \"12 de 20\" cannot say.\n *\n * Read from the LINK TABLE, the same fact the push queue is built on: the link\n * exists exactly when Bling returned an id, so this screen cannot claim\n * \"enviado\" about something that was not.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('v_shop_orders')\n .select('id,order_number,customer_name,customer_document,paid_at,created_at')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'bling')\n .eq('kind', 'sales_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order) => {\n const link = byOrder.get(order.id)\n const name = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n if (link) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n detail: order.customer_name ? String(order.customer_name) : undefined,\n }\n }\n // The one refusal explainable without asking Bling — and one the merchant\n // can fix.\n if (!String(order.customer_document ?? '').trim()) {\n return {\n subject: name,\n subjectId: order.id,\n status: 'failed',\n detail: 'sem CPF/CNPJ no pedido — o Bling não emite nota sem ele',\n at: order.paid_at ?? order.created_at,\n }\n }\n return {\n subject: name,\n subjectId: order.id,\n status: 'pending',\n detail: 'na fila — sobe na próxima sincronização',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n\n/** Both directions, everything pending. What the clock runs every fifteen minutes. */\nexport function reconcile(): Promise<{\n pull: BlingPullResult\n push: Record<string, BlingPushResult | { skipped: string }>\n}> {\n return invoke({ action: 'reconcile' })\n}\n","// Bling as a unified ConnectorDefinition, surfaced in Loja → configurações →\n// Integrações (rendered by the shared ConnectorsHub).\n//\n// It ships NO SQL. The connection is a row of connections and the run\n// history is sync_runs, both read through createConnectionStore — which is\n// what the gate in scripts/check-connector-tables.mjs exists to keep true.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport {\n BLING_CONNECTOR_ID,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n} from './limits'\nimport {\n listOrderDeliveries,\n pendingCustomers,\n pendingOrders,\n pendingProducts,\n pullCatalogue,\n pushCatalogue,\n pushCustomers,\n pushOrders,\n pushStock,\n reconcile,\n} from './data'\n\n/**\n * `settingsKeys` and not `fields`: none of these is asked for in a form. Bling\n * authenticates by OAuth, so the connector's own code never sees a credential —\n * the hub routes secrets to the platform, and this connection has no secret\n * field to route in the first place.\n */\nexport const blingConnectionStore = () =>\n createConnectionStore(BLING_CONNECTOR_ID, {\n settingsKeys: ['companyId', 'backfillFrom', 'stockOwner', 'source', 'pushOrdersFrom'],\n })\n\nexport const blingConnectorDef: ConnectorDefinition = {\n id: BLING_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'Bling',\n description:\n 'Traz o catálogo e o estoque do Bling para a loja e devolve cada pedido como pedido de venda, pronto para faturar.',\n // Quando sincroniza, em português e sem jargão. É a primeira pergunta de quem\n // conecta, e ela não tinha resposta em lugar nenhum da tela.\n howItSyncs: [\n 'Ao salvar um pedido, cliente ou produto aqui, a sincronização é antecipada e sobe em até um minuto.',\n 'De hora em hora, sozinho: traz do Bling o que mudou lá e envia o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada registro guarda o número que recebeu no Bling.',\n ],\n icon: 'Boxes',\n authKind: 'oauth',\n // The catalogue files bling under `erp`, not `ecommerce`: Bling is the back\n // office, not the storefront. It shipped as 'commerce' — a word the catalogue\n // has never used — and the badge rendered nothing at all.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n docsUrl: 'https://developer.bling.com.br/',\n // The catalogue is a MIRROR, which is why `shop_product` is read as well as\n // written: `reconcileMirror` has to see what is here before it decides what a\n // record missing from a page means. The consent also has to name what LEAVES:\n // the initial load sends the catalogue, the buyers who have ordered, and every\n // paid order up to Bling.\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Enviar ao Bling os produtos que ainda só existem aqui, e depois trazer de lá o catálogo, o preço e o estoque — comparando com o que já está na loja para não duplicar nem apagar produto por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_customer',\n actions: ['read', 'write'],\n // `write` é o vínculo, não o cliente: sem ele cada pedido cria um contato\n // novo no Bling (o defeito que 0063 fecha).\n reason:\n 'Cadastrar como contato no Bling quem já comprou, para o pedido sair com nota. Nome, e-mail, telefone e CPF/CNPJ desse cliente vão para o Bling.',\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // Idem: grava-se o número que o pedido ganhou lá, que é o que permite\n // reenviar sem duplicar.\n reason:\n 'Ler o pedido pago para lançá-lo no Bling como pedido de venda, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n // Os momentos em que o ERP tem algo a fazer. `order_shipped` e\n // `order_delivered` ficam de fora de propósito: o pedido de venda já está\n // no Bling e o rastreio é outra história.\n {\n kind: 'event',\n // `order_confirmation` é o \"pedido feito\" no catálogo de fatos da loja\n // (packages/shop/src/lib/emails.ts). `shop.order_created` não existe, e\n // declarar um fato que ninguém publica é o bug que já aconteceu aqui.\n resource: 'shop.order_confirmation',\n actions: ['listen'],\n reason: 'Saber que um pedido foi feito, para lançá-lo no Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo ao Bling como pedido de venda.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não lançá-lo no Bling.',\n },\n {\n kind: 'event',\n resource: 'shop.customer_welcome',\n actions: ['listen'],\n reason: 'Saber que um cliente foi cadastrado, para virar contato no Bling.',\n },\n ],\n // Declared, so the scheduler owns the clock. A `sleep` inside the connector\n // could not express the daily ceiling and could not be shared between the\n // catalogue pull and the order push running at the same time.\n rateLimit: BLING_RATE_LIMIT,\n // A ten-thousand-product catalogue at 3 req/s is close to an hour, so the\n // first load has two entries: a sample that answers in seconds, and a backfill\n // that finishes behind it.\n firstLoad: { sampleSize: BLING_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // `shop.order_paid`, with an underscore. It shipped as `shop.order.paid`,\n // which is not a key anything publishes — the shop builds its facts as\n // `shop.${def.event}` over SHOP_EMAIL_EVENTS (packages/shop/src/lib/emails.ts),\n // and `eventKeyMatches` is exact for a pattern with no trailing star. The\n // managed automation was declared against a fact that could never arrive.\n subscribesTo: ['shop.order_confirmation', 'shop.order_paid', 'shop.order_cancelled', 'shop.customer_welcome'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Enviar o pedido para o Bling como pedido de venda' },\n { eventKey: 'shop.order_confirmation', label: 'Lançar o pedido novo no Bling como pedido de venda' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de enviar ao Bling um pedido que foi cancelado' },\n { eventKey: 'shop.customer_welcome', label: 'Cadastrar como contato no Bling o cliente que comprou' },\n ],\n // O que ACONTECE, e não o que está declarado. Os dois primeiros são o gatilho\n // de escrita da migration 0064: salvar um pedido antecipa o próximo tique do\n // agendador, então a fila drena em até um minuto em vez de quinze.\n invokedAt: [\n {\n key: 'shop.order.wake',\n label: 'Um pedido é salvo ou pago aqui, e a sincronização é antecipada',\n plane: 'sync',\n trigger: 'on-write',\n touches: ['shop_order'],\n },\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido de venda no Bling',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order', 'shop_customer'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O catálogo, o preço e o estoque do Bling descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n BLING_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const company = connection.settings?.companyId\n return {\n connected: connection.status === 'connected',\n detail: company ? `Empresa ${company}` : undefined,\n plane: 'sync',\n }\n },\n { store: blingConnectionStore },\n ),\n // The whole connect step. Declaring `authKind: 'oauth'` and no `startOAuth`\n // is what rendered the Conectar button DISABLED, with nothing on screen\n // saying why — the defect this connector was reported for. Bling ignores a\n // per-request `redirect_uri` and always uses what is registered on the app,\n // so the page to come back to travels inside the platform's signed state;\n // none of that is spelled here, which is the point of the helper.\n startOAuth: fayzConnectorOAuth(BLING_CONNECTOR_ID),\n // The other half of the consent, and the reason the first live test looped:\n // the platform stores the token and the pool stores \"is it on?\", and with\n // nobody writing the second the connector answered \"not connected\" to a\n // merchant who had just authorized. Called with no values — the credential is\n // not ours to see, and there is nothing to configure yet.\n saveConnection: async () => {\n await blingConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. It does not delete: a shopkeeper who unplugs\n // Bling still has a store, and a connector that empties the catalogue on\n // disconnect is a connector nobody dares to disconnect. `disconnect()` on the\n // shared store flips `active` and clears cursors — it never touches shop data.\n disconnect: async () => { await blingConnectionStore().disconnect() },\n // The one sentence that used to hang below Bling's own history panel, said\n // where the question is actually asked. It is the only thing in that panel\n // that was neither status, nor history, nor an act.\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n // No panel of its own. The history is `sync_runs` read through the shared\n // store, and the shared surface renders it — including the \"first load brings\n // a sample\" sentence, which it derives from `firstLoad` above rather than\n // repeating the number in prose.\n ...connectionRuns(blingConnectionStore),\n // Record by record, for the automations screen: the managed automation says a\n // paid order goes to Bling, and this is what says whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n // The same seam Google Calendar uses, so the two screens are one screen with\n // two sets of words. Before this, Bling's tab was a history with nothing that\n // could put a row in it. Ordered as somebody does them on the first day.\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no Bling e envia o que está pendente daqui — catálogo novo, clientes que compraram e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg: any) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do Bling`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer catálogo do Bling',\n direction: 'inbound',\n description: 'Preço e estoque do Bling passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_products',\n label: 'Enviar catálogo para o Bling',\n direction: 'outbound',\n description:\n 'Sobe só o que ainda não existe lá. Depois de subir, quem manda no preço e no estoque passa a ser o Bling.',\n // Confirmed: a product filed at Bling cannot be taken back from here, and\n // the ownership handover is the part a merchant must agree to knowingly.\n confirm: {\n title: 'Enviar o catálogo para o Bling?',\n body:\n 'Os produtos que só existem aqui serão criados no Bling, com o saldo atual. A partir daí o Bling passa a mandar no preço e no estoque deles, e as mudanças vêm de lá para cá.',\n cta: 'Enviar catálogo',\n },\n pending: pendingProducts,\n run: async () => {\n const result = await pushCatalogue()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_stock',\n label: 'Enviar saldo do estoque',\n direction: 'outbound',\n description:\n 'Lança no Bling o saldo dos produtos já enviados. Use quando um envio disser que o saldo não foi transferido.',\n run: async () => (await pushStock()).message,\n },\n {\n key: 'push_customers',\n label: 'Enviar clientes para o Bling',\n direction: 'outbound',\n description:\n 'Cadastra como contato quem já comprou. Cliente sem CPF/CNPJ fica de fora — o Bling precisa dele para emitir a nota.',\n confirm: {\n title: 'Enviar os clientes para o Bling?',\n body:\n 'Quem já comprou nesta loja será cadastrado como contato no Bling, com nome, e-mail, telefone e CPF/CNPJ. Quem não tem documento cadastrado não é enviado.',\n cta: 'Enviar clientes',\n },\n pending: pendingCustomers,\n run: async () => {\n const result = await pushCustomers()\n return { message: result.message, status: result.status }\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos',\n direction: 'outbound',\n description:\n 'Cada pedido vira um pedido de venda no Bling, pago ou não — é lá que ele vira nota. Pedido cancelado não sobe.',\n confirm: {\n title: 'Enviar os pedidos para o Bling?',\n body:\n 'Cada pedido que ainda não subiu vira um pedido de venda no Bling, pago ou não. Pedido cancelado fica de fora, e um pedido já enviado não sobe duas vezes.',\n cta: 'Enviar pedidos',\n },\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","// ---------------------------------------------------------------------------\n// NeoChef's constraints — and the short list is itself the finding.\n// ---------------------------------------------------------------------------\n// Bling's limits file is long because a vendor API is a set of rules somebody\n// else chose: 3 req/s, a one-year filter ceiling, a code that dies in sixty\n// seconds, a webhook that must answer inside five. NeoChef is a Fayz app, so\n// the \"provider\" is our own tenant data plane, and almost none of that exists.\n//\n// What remains is real and worth declaring:\n//\n// the data plane is a shared platform, not a private one\n// → a budget, so one store's first sync does not become everyone's latency.\n// the access token lives an hour and refreshes by rotation\n// → renewal is scheduled, never at the deadline, and never in a loop.\n// `updated_at` is stamped at millisecond precision by Postgres\n// → the cursor still overlaps, for the same reason Bling's does: a row\n// changed inside the window's closing instant is otherwise invisible for\n// ever, and the cost of re-reading it is an idempotent upsert.\nimport type { RateLimitBudget } from '@fayz-ai/core/connector-runtime'\n\nexport const NEOCHEF_CONNECTOR_ID = 'neochef'\n\n/**\n * Per connection.\n *\n * Not a limit NeoChef publishes — it is one we choose, because the far side is\n * a platform serving every other tenant too. A connector with no budget is a\n * connector whose worst day is someone else's outage.\n */\nexport const NEOCHEF_RATE_LIMIT: RateLimitBudget = { perSecond: 5, perDay: 50_000 }\n\n/** Rows per page on the data plane's row endpoints. */\nexport const NEOCHEF_PAGE_SIZE = 100\n\n/**\n * The first answer, and why it is one page.\n *\n * The same argument as Bling's, at a different speed: a connect screen must\n * settle in seconds, and a kitchen with a thousand products would otherwise\n * make the merchant watch a spinner to find out whether the connection worked.\n * The backfill finishes the mirror behind it.\n */\nexport const NEOCHEF_SAMPLE_SIZE = 100\n\n/** Re-read this much before the last cursor. See the header. */\nexport const NEOCHEF_CURSOR_OVERLAP_MS = 60_000\n\n/** Renew well before the hour is up — never at the deadline. */\nexport const NEOCHEF_TOKEN_LEAD_MS = 10 * 60_000\n","/**\n * NeoChef's mark, inlined.\n *\n * Same reasoning as `client-marks.ts` in @fayz-ai/admin: a brand a row wears\n * cannot fail to load, on an app served from anywhere. A first-party mark has\n * no reason to depend on a bucket being reachable.\n *\n * It is COMPOSED rather than copied, and that is the part worth knowing. The\n * app's own asset (`public/logo/neochef-icon.png`) is a MASK — the stroke is\n * white and the shape lives in the alpha channel, because the app paints it\n * with `currentColor` so one file serves the ink rail and the login card. Used\n * as an `<img>` that file is invisible on a light surface, which is what a\n * connector row is. So the hat sits on the brand's own turmeric (#e0a906),\n * giving the row a mark that is legible on both themes — the same shape the\n * consent screen shows, in a form a plain image tag can render.\n *\n * Replace with an `assets.fayz.ai/connectors/neochef.png` URL whenever the\n * bucket has one; nothing else has to change.\n */\nexport const NEOCHEF_MARK =\n 'data:image/png;base64,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'\n","// The one place that names the NeoChef data plane. Same split as Bling: the\n// definition declares WHAT the merchant can do, this file knows how the call is\n// made, and neither ever holds the credential.\nimport {\n CONNECTOR_RUNTIME_TOKEN_HEADER,\n connectorRuntimeToken,\n getSupabaseClientOptional,\n type ConnectorDelivery,\n} from '@fayz-ai/core'\nimport { getShopTenantId } from '@fayz-ai/shop'\n\n// Estes contadores LEEM o arquétipo (v_shop_*), não a cópia do plugin: pedido e\n// cliente pertencem à base desde 0009/0013, e a view é onde os dois lados\n// concordam. Os *_links continuam em plg_shop_* — o vínculo com o provedor\n// externo é genuinamente da loja.\n\n/** The edge function that holds every NeoChef call this connector makes. */\nexport const NEOCHEF_FUNCTION = 'neochef-sync'\n\n/** What a push leg answers with. Every field is a count the merchant can check. */\nexport interface NeoChefPushResult {\n runId?: string\n /** What the run settled as. The toast reads this, not \"it did not throw\". */\n status?: 'success' | 'partial' | 'error'\n filed: number\n skipped?: number\n considered: number\n failures?: number\n message: string\n}\n\nexport interface NeoChefPullResult {\n runId?: string\n fetched: number\n inserted: number\n updated: number\n untouched: number\n sample: boolean\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (\n name: string,\n options: { body: unknown; headers?: Record<string, string> },\n ) => Promise<{ data: unknown; error: { message: string } | null }>\n }\n from: (table: string) => any\n}\n\nfunction client(): MinimalClient {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!supabase) throw new Error('Sem conexão com o banco para falar com o NeoChef.')\n return supabase\n}\n\n/**\n * One call to the data plane, carrying the two things it cannot derive: the\n * Supabase session (the gateway checks it) and the runtime token the function\n * FORWARDS to redeem this tenant's credential. Asked for here so a missing one\n * is refused before the round trip rather than as a failed run.\n */\nasync function invoke<T>(body: Record<string, unknown>): Promise<T> {\n const tenantId = getShopTenantId()\n if (!tenantId) throw new Error('Sem loja selecionada para sincronizar com o NeoChef.')\n const runtimeToken = await connectorRuntimeToken({ tenantId })\n\n const { data, error } = await client().functions.invoke(NEOCHEF_FUNCTION, {\n body: { ...body, tenantId },\n headers: { [CONNECTOR_RUNTIME_TOKEN_HEADER]: runtimeToken },\n })\n if (error) throw new Error(error.message)\n return data as T\n}\n\n/** Read one product. Writes nothing anywhere — the probe, not a sync. */\nexport function testNeoChef(): Promise<{ ok: boolean; message?: string }> {\n return invoke({ action: 'test' })\n}\n\n/** Bring the catalogue and the stock down. `sample` is the first, fast answer. */\nexport function pullCatalogue(mode?: 'sample' | 'full'): Promise<NeoChefPullResult> {\n return invoke({ action: 'pull_products', ...(mode ? { mode } : {}) })\n}\n\n/** Send every paid order not filed yet, as an order in the kitchen. */\nexport function pushOrders(): Promise<NeoChefPushResult> {\n return invoke({ action: 'push_orders' })\n}\n\n/** Both legs, in the order somebody does them on an ordinary day. */\nexport function reconcile(): Promise<{\n pull?: NeoChefPullResult\n push?: Record<string, NeoChefPushResult>\n}> {\n return invoke({ action: 'reconcile' })\n}\n\n/**\n * How many orders still have to go up.\n *\n * The same ABSENCE the function uses as its queue: a paid order with no link\n * row. Counted from here so the row can say \"em dia\" instead of offering a\n * button that would send nothing.\n */\nexport async function pendingOrders(): Promise<number | null> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return null\n\n const { data: linked } = await supabase\n .from('plg_shop_order_links')\n .select('order_id')\n .eq('tenant_id', tenantId)\n .eq('source', 'neochef')\n .eq('kind', 'kitchen_order')\n const already = new Set(((linked ?? []) as any[]).map((row) => row.order_id))\n\n const { data, error } = await supabase\n .from('v_shop_orders')\n .select('id')\n .eq('tenant_id', tenantId)\n .neq('status', 'cancelled')\n if (error) return null\n return ((data ?? []) as any[]).filter((row) => !already.has(row.id)).length\n}\n\n/**\n * Record by record, for the automations screen.\n *\n * The managed automation says a paid order goes to the kitchen; this is what\n * says whether it arrived. Orders first and links second, so an order that has\n * NOT gone up still appears — a list built from links alone shows only the\n * successes, which reads as health.\n */\nexport async function listOrderDeliveries(limit = 10): Promise<ConnectorDelivery[]> {\n const tenantId = getShopTenantId()\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n if (!tenantId || !supabase) return []\n\n const { data: orders } = await supabase\n .from('v_shop_orders')\n .select('id,order_number,paid_at,created_at,customer_name,status')\n .eq('tenant_id', tenantId)\n .order('created_at', { ascending: false })\n .limit(limit)\n\n const rows = (orders ?? []) as Array<Record<string, any>>\n if (rows.length === 0) return []\n\n const { data: filed } = await supabase\n .from('plg_shop_order_links')\n .select('order_id,external_id,external_number,synced_at')\n .eq('tenant_id', tenantId)\n .eq('source', 'neochef')\n .eq('kind', 'kitchen_order')\n .in('order_id', rows.map((row) => row.id))\n\n const byOrder = new Map<string, Record<string, any>>(\n ((filed ?? []) as Array<Record<string, any>>).map((row) => [row.order_id, row]),\n )\n\n return rows.map((order): ConnectorDelivery => {\n const subject = order.order_number ? `Pedido ${order.order_number}` : 'Pedido'\n const link = byOrder.get(order.id)\n if (link) {\n return {\n subject,\n subjectId: order.id,\n status: 'delivered',\n externalId: link.external_number ?? link.external_id,\n at: link.synced_at ?? order.paid_at,\n ...(order.customer_name ? { detail: String(order.customer_name) } : {}),\n }\n }\n // A cancelled order is not late, it is excluded — saying \"pendente\" about\n // one would have the merchant waiting for something that will never go.\n if (String(order.status ?? '') === 'cancelled') {\n return {\n subject,\n subjectId: order.id,\n status: 'failed',\n detail: 'Cancelado — não sobe para a cozinha.',\n at: order.created_at,\n }\n }\n return {\n subject,\n subjectId: order.id,\n status: 'pending',\n detail: 'Ainda não subiu — vai na próxima sincronização.',\n at: order.paid_at ?? order.created_at,\n }\n })\n}\n","// NeoChef, connected the way any ERP is — and the first connector whose\n// provider is another Fayz app.\n//\n// That changes nothing the merchant can see, and it is worth saying why: the\n// connection still crosses an ORGANIZATION boundary, so it is still a grant a\n// person gives on NeoChef's own screen and can take back from there. Sharing a\n// deployment is not sharing a tenant.\n//\n// It ships no SQL. The connection is a row of connections and the history is\n// sync_runs, both through createConnectionStore.\nimport type { ConnectorDefinition } from '@fayz-ai/core'\nimport { connectionRuns, connectionStatus, createConnectionStore } from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { NEOCHEF_CONNECTOR_ID, NEOCHEF_RATE_LIMIT, NEOCHEF_SAMPLE_SIZE } from './limits'\nimport { NEOCHEF_MARK } from './mark'\nimport { listOrderDeliveries, pendingOrders, pullCatalogue, pushOrders, reconcile } from './data'\n\n/**\n * `settingsKeys` and not `fields`: nothing here is asked for in a form.\n *\n * The merchant authorizes on NeoChef's consent screen and comes back — which\n * kitchen, and what it is called, are learned from the grant. There is no\n * credential to route either: the platform holds it, and this connection has no\n * secret field to route in the first place.\n */\nexport const neoChefConnectionStore = () =>\n createConnectionStore(NEOCHEF_CONNECTOR_ID, {\n settingsKeys: ['kitchenId', 'backfillFrom', 'stockOwner'],\n })\n\nexport const neoChefConnectorDef: ConnectorDefinition = {\n id: NEOCHEF_CONNECTOR_ID,\n hostPluginId: 'shop',\n name: 'NeoChef',\n description:\n 'Traz o cardápio, o preço e o estoque do NeoChef para a loja e devolve cada pedido pago como pedido na cozinha.',\n // The first question anyone connecting asks, answered before they connect.\n howItSyncs: [\n 'De tempos em tempos, sozinho: desce do NeoChef o que mudou lá e sobe o que estiver pendente daqui.',\n 'A qualquer momento, no botão Sincronizar agora.',\n 'Nada sobe duas vezes: cada pedido guarda o número que recebeu na cozinha.',\n 'Produto desativado no NeoChef sai de venda na loja — nenhum produto é apagado.',\n ],\n icon: 'ChefHat',\n // The app's own mark, so the row wears the same face the consent screen does.\n // `icon` stays as the fallback the mark resolver advances to — see mark.ts.\n logoUrl: NEOCHEF_MARK,\n authKind: 'oauth',\n // `erp` and not `ecommerce`: NeoChef is the back office, not the storefront.\n // Same reading of §2 that moved Bling off the word 'commerce'.\n category: 'erp',\n // Both ways, and the connector says so before anyone connects: the catalogue\n // comes in, the paid order goes out.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://fayz.ai/docs/integrations/neochef',\n /**\n * The consent names these, entity by entity, on NeoChef's own screen — this\n * list is what the STORE says it will do with them, which is the other half\n * of the same sentence.\n *\n * `shop_product` is read as well as written because the catalogue is a\n * MIRROR: `reconcileMirror` has to see what is here before it can decide what\n * a product missing from a page means.\n */\n permissions: [\n {\n kind: 'data',\n resource: 'shop_product',\n actions: ['read', 'write'],\n reason:\n 'Trazer do NeoChef o cardápio, o preço e o saldo do estoque, comparando com o que já está na loja para não duplicar nem tirar de venda por engano.',\n },\n {\n kind: 'data',\n resource: 'shop_order',\n actions: ['read', 'write'],\n // `write` is the LINK, not the order: without it every sync would file the\n // same sale again.\n reason:\n 'Ler o pedido pago para lançá-lo na cozinha, e guardar aqui o número que ele recebeu lá. O conteúdo do pedido não é alterado.',\n sensitive: true,\n },\n {\n kind: 'event',\n resource: 'shop.order_paid',\n actions: ['listen'],\n reason: 'Saber que um pedido foi pago, para mandá-lo para a cozinha.',\n },\n {\n kind: 'event',\n resource: 'shop.order_cancelled',\n actions: ['listen'],\n reason: 'Saber que um pedido foi cancelado, para não mandá-lo para a cozinha.',\n },\n ],\n // Declared, so the scheduler owns the clock. The budget is ours and not the\n // provider's — see limits.ts.\n rateLimit: NEOCHEF_RATE_LIMIT,\n // A connect screen that waits for a whole catalogue is a connect screen nobody\n // finishes, so the first load answers with a page and the backfill follows.\n firstLoad: { sampleSize: NEOCHEF_SAMPLE_SIZE, samplePages: 1, stream: 'products' },\n // With underscores. `shop.order.paid` is not a key anything publishes — the\n // shop builds its facts as `shop.${def.event}` over SHOP_EMAIL_EVENTS.\n subscribesTo: ['shop.order_paid', 'shop.order_cancelled'],\n managedAutomations: [\n { eventKey: 'shop.order_paid', label: 'Mandar o pedido pago para a cozinha do NeoChef' },\n { eventKey: 'shop.order_cancelled', label: 'Parar de mandar para a cozinha um pedido cancelado' },\n ],\n // What HAPPENS, not what is declared. Nothing here names a moment that has no\n // code behind it.\n invokedAt: [\n {\n key: 'shop.order.push',\n label: 'O pedido pago sobe como pedido na cozinha',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_order'],\n },\n {\n key: 'shop.catalogue.pull',\n label: 'O cardápio, o preço e o estoque do NeoChef descem para a loja',\n plane: 'sync',\n trigger: 'scheduled',\n touches: ['shop_product'],\n },\n ],\n // Read from the row the list already batched — one request for N connectors.\n ...connectionStatus(\n NEOCHEF_CONNECTOR_ID,\n (connection) => {\n if (!connection?.active) return { connected: false }\n const kitchen = connection.settings?.kitchenId\n return {\n connected: connection.status === 'connected',\n detail: kitchen ? `Cozinha ${kitchen}` : undefined,\n plane: 'sync',\n }\n },\n { store: neoChefConnectionStore },\n ),\n // The whole connect step. Declaring `oauth` and no `startOAuth` is what renders\n // the Conectar button disabled with nothing on screen saying why.\n startOAuth: fayzConnectorOAuth(NEOCHEF_CONNECTOR_ID),\n // The other half of the consent: the platform stores the token and the pool\n // stores \"is it on?\". With nobody writing the second, the connector answers\n // \"não conectado\" to a merchant who has just authorized.\n saveConnection: async () => {\n await neoChefConnectionStore().save({ active: true })\n },\n // Disconnect FREEZES the mirror. A merchant who unplugs the kitchen still has\n // a store, and a connector that empties the catalogue on disconnect is one\n // nobody dares to disconnect.\n disconnect: async () => {\n await neoChefConnectionStore().disconnect()\n },\n disconnectNote:\n 'Desconectar congela o espelho: nenhum produto é apagado e o estoque para de ser atualizado.',\n ...connectionRuns(neoChefConnectionStore),\n // The managed automation says a paid order goes to the kitchen; this says\n // whether it arrived.\n listDeliveries: (options) => listOrderDeliveries(options?.limit ?? 10),\n syncActions: [\n {\n key: 'reconcile',\n label: 'Sincronizar agora',\n direction: 'inbound',\n // The one that is right on an ordinary day; the rest fold away.\n primary: true,\n description:\n 'Traz o que mudou no NeoChef e envia o que está pendente daqui — cardápio, preço, estoque e pedidos pagos.',\n run: async () => {\n const result = await reconcile()\n const legs = Object.values(result.push ?? {})\n .map((leg) => (leg?.message ? String(leg.message) : null))\n .filter(Boolean)\n return [`${result.pull?.fetched ?? 0} produto(s) lidos do NeoChef`, ...legs].join(' · ')\n },\n },\n {\n key: 'pull_products',\n label: 'Trazer cardápio do NeoChef',\n direction: 'inbound',\n description: 'Preço e estoque do NeoChef passam a valer aqui. Nada é apagado da loja.',\n run: async () => {\n const result = await pullCatalogue('full')\n return `${result.fetched} produto(s) lidos, ${result.inserted} criado(s), ${result.updated} atualizado(s)`\n },\n },\n {\n key: 'push_orders',\n label: 'Enviar pedidos para a cozinha',\n direction: 'outbound',\n description:\n 'Cada pedido pago vira um pedido na cozinha. Pedido cancelado não sobe, e um já enviado não sobe duas vezes.',\n pending: pendingOrders,\n run: async () => {\n const result = await pushOrders()\n return { message: result.message, status: result.status }\n },\n },\n ],\n}\n","import type { AnalyticsCardDef, AnalyticsFilterDef, AnalyticsMeasure } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// The retail analytics pack.\n//\n// Owned by plugin-shop because shop owns the DATA: \"sales by product\" means the\n// same thing whether the tenant is a salon or a storefront, and declaring it\n// once here beats copying it into every vertical's config. A vertical pack\n// curates this list (order, placement, labels); it does not restate it.\n//\n// Every card reads a registered read model from migration 0066 and goes through\n// the generic analytics_run engine — no card needs its own SQL. A card is at\n// the same time a tile on /analytics, a row in /analytics/reports and a full\n// report at /analytics/reports/<id>: one definition, three sizes, which is what\n// stops a headline KPI and the report behind it from disagreeing.\n// ---------------------------------------------------------------------------\n\nconst ORDERS = 'plg_shop_rep_orders'\nconst ITEMS = 'plg_shop_rep_order_items'\nconst CUSTOMERS = 'plg_shop_rep_customers'\nconst PRODUCTS = 'plg_shop_rep_products'\n\nconst CANONICAL = 'public.v_shop_orders'\n\n// --- Categories -------------------------------------------------------------\n// The chip on every report row and the grouping on the list. Declared once:\n// typing 'Vendas' in fourteen places is how a catalogue grows two categories\n// that differ by an accent.\n\nconst CAT = {\n sales: tl('Sales', 'Vendas'),\n orders: tl('Orders', 'Pedidos'),\n products: tl('Products', 'Produtos'),\n customers: tl('Customers', 'Clientes'),\n inventory: tl('Inventory', 'Estoque'),\n fulfillment: tl('Fulfillment', 'Entrega'),\n marketing: tl('Marketing', 'Marketing'),\n}\n\n// --- Shared filters, grouped for the categorized picker ---------------------\n\nconst financialStatus: AnalyticsFilterDef = {\n key: 'financial_status',\n label: tl('Payment status', 'Situação do pagamento'),\n type: 'multiselect',\n group: tl('Finance and payments', 'Financeiro e pagamentos'),\n options: [\n { label: tl('Paid', 'Pago'), value: 'paid' },\n { label: tl('Pending', 'Pendente'), value: 'pending' },\n { label: tl('Partially paid', 'Pago parcialmente'), value: 'partially_paid' },\n { label: tl('Refunded', 'Estornado'), value: 'refunded' },\n { label: tl('Partially refunded', 'Estornado parcialmente'), value: 'partially_refunded' },\n { label: tl('Voided', 'Cancelado'), value: 'voided' },\n ],\n}\n\nconst fulfillmentStatus: AnalyticsFilterDef = {\n key: 'fulfillment_status',\n label: tl('Fulfillment status', 'Situação da entrega'),\n type: 'multiselect',\n group: tl('Fulfillment', 'Entrega'),\n options: [\n { label: tl('Fulfilled', 'Enviado'), value: 'fulfilled' },\n { label: tl('Partially fulfilled', 'Enviado parcialmente'), value: 'partially_fulfilled' },\n { label: tl('Unfulfilled', 'Não enviado'), value: 'unfulfilled' },\n ],\n}\n\nconst orderStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Order status', 'Situação do pedido'),\n type: 'multiselect',\n group: tl('Orders', 'Pedidos'),\n options: [\n { label: tl('Open', 'Aberto'), value: 'open' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n { label: tl('Cancelled', 'Cancelado'), value: 'cancelled' },\n ],\n}\n\n// The items view carries the order's payment state under a prefixed name, so\n// the same picker narrows a line-item card without a second set of options.\nconst itemFinancialStatus: AnalyticsFilterDef = {\n ...financialStatus,\n key: 'order_financial_status',\n}\n\nconst productStatus: AnalyticsFilterDef = {\n key: 'status',\n label: tl('Product status', 'Situação do produto'),\n type: 'multiselect',\n group: tl('Inventory', 'Estoque'),\n options: [\n { label: tl('Active', 'Ativo'), value: 'active' },\n { label: tl('Draft', 'Rascunho'), value: 'draft' },\n { label: tl('Archived', 'Arquivado'), value: 'archived' },\n ],\n}\n\nconst orderFilters = [financialStatus, fulfillmentStatus, orderStatus]\n\n// --- Reusable measure fragments ---------------------------------------------\n\nconst M = {\n grossSales: { key: 'gross_sales', label: tl('Gross sales', 'Vendas brutas'), agg: 'sum', format: 'currency' },\n discounts: { key: 'discounts', label: tl('Discounts', 'Descontos'), agg: 'sum', format: 'currency' },\n netSales: { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), agg: 'sum', format: 'currency' },\n shipping: { key: 'shipping', label: tl('Shipping', 'Frete'), agg: 'sum', format: 'currency' },\n taxes: { key: 'taxes', label: tl('Taxes', 'Impostos'), agg: 'sum', format: 'currency' },\n total: { key: 'total', label: tl('Total sales', 'Vendas totais'), agg: 'sum', format: 'currency' },\n paid: { key: 'paid_total', label: tl('Collected', 'Recebido'), agg: 'sum', format: 'currency' },\n orders: { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count', format: 'number' },\n} satisfies Record<string, AnalyticsMeasure>\n\n/** Average order value — a ratio of two real measures, never an avg of ratios. */\nconst AOV: AnalyticsMeasure = {\n key: 'aov',\n label: tl('Average order value', 'Ticket médio'),\n agg: 'ratio',\n ratioOf: ['total', 'orders'],\n format: 'currency',\n}\n\nexport function buildShopAnalyticsCards(): AnalyticsCardDef[] {\n const base = { domain: 'shop', canonicalOwner: CANONICAL, compare: true }\n\n return [\n // =======================================================================\n // Row 1 — the four numbers a merchant opens the page for\n // =======================================================================\n {\n ...base,\n id: 'shop.total-sales',\n name: tl('Total sales', 'Vendas totais'),\n description: tl(\n 'Gross sales less discounts, plus shipping and taxes. What the store billed, paid or not.',\n 'Vendas brutas menos descontos, mais frete e impostos. O que a loja faturou, pago ou não.',\n ),\n icon: 'CircleDollarSign',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 0 },\n },\n {\n // Deliberately beside Total sales and not instead of it. A store on Pix\n // bills long before it is paid, and a merchant reading only the first\n // number sees money they cannot spend.\n ...base,\n id: 'shop.collected',\n name: tl('Collected', 'Recebido'),\n description: tl(\n 'Of everything billed in the period, the part that is actually paid.',\n 'De tudo o que foi faturado no período, a parte que já está paga.',\n ),\n icon: 'Banknote',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.paid],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 1 },\n },\n {\n ...base,\n id: 'shop.orders',\n name: tl('Orders', 'Pedidos'),\n description: tl(\n 'Orders placed in the period, cancellations included.',\n 'Pedidos feitos no período, cancelados inclusive.',\n ),\n icon: 'ShoppingCart',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 2 },\n },\n {\n ...base,\n id: 'shop.aov',\n name: tl('Average order value', 'Ticket médio'),\n description: tl(\n 'Total sales over order count — the ratio of the totals, not the average of each order.',\n 'Vendas totais sobre número de pedidos — a razão dos totais, não a média de cada pedido.',\n ),\n icon: 'Receipt',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['aov'] },\n dashboard: { span: 1, order: 3 },\n },\n\n // =======================================================================\n // Row 2 — basket and loyalty\n // =======================================================================\n {\n ...base,\n id: 'shop.units-per-order',\n name: tl('Items per order', 'Itens por pedido'),\n description: tl(\n 'Units sold over distinct orders. Rises when cross-sell works.',\n 'Unidades vendidas sobre pedidos distintos. Sobe quando a venda casada funciona.',\n ),\n icon: 'Boxes',\n category: CAT.orders,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n measures: [\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n // count_distinct and not count(*): the row here is a LINE, and\n // counting lines would make \"items per order\" always exactly 1.\n { key: 'orders', label: tl('Orders', 'Pedidos'), agg: 'count_distinct', column: 'order_id', format: 'number' },\n {\n key: 'units_per_order', label: tl('Items per order', 'Itens por pedido'),\n agg: 'ratio', ratioOf: ['units', 'orders'], format: 'number',\n },\n ],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', measures: ['units_per_order'] },\n dashboard: { span: 1, order: 4 },\n },\n {\n ...base,\n id: 'shop.units-sold',\n name: tl('Units sold', 'Unidades vendidas'),\n description: tl('Total units leaving the shelf in the period.', 'Total de unidades que saíram da prateleira no período.'),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' }],\n filters: [itemFinancialStatus],\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 5 },\n },\n {\n ...base,\n id: 'shop.returning-customer-rate',\n name: tl('Returning customer rate', 'Taxa de recompra'),\n description: tl(\n 'Share of orders placed by someone who had ordered before.',\n 'Fatia dos pedidos feitos por quem já havia comprado antes.',\n ),\n icon: 'Repeat',\n category: CAT.customers,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'returning', label: tl('Returning orders', 'Pedidos de quem já comprou'), agg: 'sum', column: 'is_returning', format: 'number' },\n M.orders,\n {\n key: 'returning_rate', label: tl('Returning customer rate', 'Taxa de recompra'),\n agg: 'ratio', ratioOf: ['returning', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['returning_rate'] },\n dashboard: { span: 1, order: 6 },\n },\n {\n ...base,\n id: 'shop.cancellation-rate',\n name: tl('Cancellation rate', 'Taxa de cancelamento'),\n description: tl(\n 'Share of orders in the period that were cancelled.',\n 'Fatia dos pedidos do período que acabaram cancelados.',\n ),\n icon: 'XCircle',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [\n { key: 'cancelled', label: tl('Cancelled orders', 'Pedidos cancelados'), agg: 'sum', column: 'is_cancelled', format: 'number' },\n M.orders,\n {\n key: 'cancellation_rate', label: tl('Cancellation rate', 'Taxa de cancelamento'),\n agg: 'ratio', ratioOf: ['cancelled', 'orders'], scale: 100, format: 'percent',\n },\n ],\n filters: orderFilters,\n },\n viz: { type: 'kpi', measures: ['cancellation_rate'] },\n dashboard: { span: 1, order: 7 },\n },\n\n // =======================================================================\n // Row 3 — operations and what is sitting in the warehouse\n // =======================================================================\n {\n ...base,\n id: 'shop.days-to-fulfillment',\n name: tl('Time to dispatch', 'Tempo até o envio'),\n description: tl(\n 'Average time from order placed to first shipment. Orders never shipped are excluded, not counted as zero.',\n 'Tempo médio do pedido até a primeira remessa. Pedidos que nunca saíram ficam de fora, não entram como zero.',\n ),\n icon: 'Clock',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [{\n key: 'hours_to_fulfillment',\n label: tl('Time to dispatch', 'Tempo até o envio'),\n agg: 'avg',\n format: 'duration',\n }],\n filters: orderFilters,\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 8 },\n },\n {\n ...base,\n id: 'shop.discounts-given',\n name: tl('Discounts given', 'Descontos concedidos'),\n description: tl(\n 'What coupons and promotions cost the store in the period.',\n 'Quanto os cupons e promoções custaram à loja no período.',\n ),\n icon: 'TicketPercent',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.discounts],\n filters: orderFilters,\n },\n viz: { type: 'kpi', spark: true },\n dashboard: { span: 1, order: 9 },\n },\n {\n // Snapshots: what is in the warehouse now, not what was created in the\n // last 30 days. `dateColumn: null` is what stops the range picker from\n // silently answering a different question.\n ...base,\n compare: false,\n id: 'shop.inventory-value',\n name: tl('Inventory value', 'Valor do estoque'),\n description: tl(\n 'Retail value of stock currently held. A snapshot — the date range does not apply.',\n 'Valor de venda do estoque parado hoje. É uma foto — o período selecionado não se aplica.',\n ),\n icon: 'Warehouse',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'inventory_retail_value', label: tl('Inventory value', 'Valor do estoque'), agg: 'sum', format: 'currency' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 10 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.out-of-stock',\n name: tl('Out of stock', 'Sem estoque'),\n description: tl(\n 'Active products with zero inventory — sales the storefront is turning away.',\n 'Produtos ativos com estoque zerado — vendas que a loja está recusando.',\n ),\n icon: 'PackageX',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n measures: [{ key: 'is_out_of_stock', label: tl('Out of stock', 'Sem estoque'), agg: 'sum', format: 'number' }],\n filters: [productStatus],\n },\n viz: { type: 'kpi' },\n dashboard: { span: 1, order: 11 },\n },\n\n // =======================================================================\n // Charts — the shape behind the headline numbers\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-over-time',\n name: tl('Sales over time', 'Vendas ao longo do tempo'),\n description: tl(\n 'Billed against collected, bucketed by day, week or month depending on the range.',\n 'Faturado contra recebido, agrupado por dia, semana ou mês conforme o período.',\n ),\n icon: 'TrendingUp',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'area' },\n dashboard: { span: 2, order: 20 },\n },\n {\n ...base,\n id: 'shop.orders-over-time',\n name: tl('Orders over time', 'Pedidos ao longo do tempo'),\n description: tl('Order volume across the period.', 'Volume de pedidos ao longo do período.'),\n icon: 'Activity',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.orders],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line' },\n dashboard: { span: 2, order: 21 },\n },\n {\n ...base,\n id: 'shop.sales-by-product',\n name: tl('Sales by product', 'Vendas por produto'),\n description: tl(\n 'Revenue per product at line-item grain, so a multi-product order counts once per line.',\n 'Receita por produto no grão da linha, então um pedido com vários produtos conta uma vez por linha.',\n ),\n icon: 'Package',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' },\n { key: 'units', label: tl('Units', 'Unidades'), agg: 'sum', column: 'quantity', format: 'number' },\n ],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['revenue'], limit: 6 },\n dashboard: { span: 2, order: 22 },\n },\n {\n ...base,\n id: 'shop.sales-by-category',\n name: tl('Sales by category', 'Vendas por categoria'),\n description: tl('Revenue split across catalogue categories.', 'Receita dividida entre as categorias do catálogo.'),\n icon: 'FolderTree',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n dimensions: [{ key: 'category_name', label: tl('Category', 'Categoria') }],\n measures: [{ key: 'revenue', label: tl('Revenue', 'Receita'), agg: 'sum', column: 'line_total', format: 'currency' }],\n filters: [itemFinancialStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'donut' },\n dashboard: { span: 2, order: 23 },\n },\n {\n ...base,\n id: 'shop.sales-by-payment-status',\n name: tl('Sales by payment status', 'Vendas por situação do pagamento'),\n description: tl('Where the money sits: paid, pending, refunded.', 'Onde o dinheiro está: pago, pendente, estornado.'),\n icon: 'CreditCard',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'financial_status', label: tl('Payment status', 'Situação do pagamento') }],\n measures: [M.total, M.orders],\n filters: [orderStatus],\n defaultSort: 'total',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['total'] },\n dashboard: { span: 2, order: 24 },\n },\n {\n ...base,\n id: 'shop.orders-by-fulfillment-status',\n name: tl('Orders by fulfillment status', 'Pedidos por situação da entrega'),\n description: tl(\n 'How much of the period is still waiting to leave the warehouse.',\n 'Quanto do período ainda está esperando para sair do estoque.',\n ),\n icon: 'Truck',\n category: CAT.fulfillment,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'fulfillment_status', label: tl('Fulfillment status', 'Situação da entrega') }],\n measures: [M.orders, M.total],\n filters: [financialStatus, orderStatus],\n defaultSort: 'orders',\n defaultSortDir: 'desc',\n },\n viz: { type: 'breakdown', measures: ['orders'] },\n dashboard: { span: 2, order: 25 },\n },\n {\n ...base,\n id: 'shop.new-customers',\n name: tl('New customers', 'Novos clientes'),\n description: tl('Customers acquired in the period, by signup date.', 'Clientes conquistados no período, pela data de cadastro.'),\n icon: 'UserPlus',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [{ key: 'customers', label: tl('New customers', 'Novos clientes'), agg: 'count', format: 'number' }],\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'bar' },\n dashboard: { span: 2, order: 26 },\n },\n {\n ...base,\n id: 'shop.aov-over-time',\n name: tl('Average order value over time', 'Ticket médio ao longo do tempo'),\n description: tl(\n 'AOV per bucket, computed as that bucket’s total over its own order count.',\n 'Ticket médio por período, calculado como o total daquele período sobre os pedidos dele.',\n ),\n icon: 'LineChart',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'created_at', label: tl('Date', 'Data'), grain: 'auto' }],\n measures: [M.total, M.orders, AOV],\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'asc',\n },\n viz: { type: 'line', measures: ['aov'] },\n dashboard: { span: 2, order: 27 },\n },\n\n // =======================================================================\n // Tables on the overview\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-breakdown',\n name: tl('Sales breakdown', 'Composição das vendas'),\n description: tl(\n 'The money chain: gross sales → discounts → net sales → shipping and taxes → total.',\n 'A cadeia do dinheiro: vendas brutas → descontos → vendas líquidas → frete e impostos → total.',\n ),\n icon: 'Layers',\n category: CAT.sales,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n measures: [M.grossSales, M.discounts, M.netSales, M.shipping, M.taxes, M.total, M.paid],\n filters: orderFilters,\n },\n viz: { type: 'table' },\n dashboard: { span: 2, order: 30 },\n },\n {\n ...base,\n compare: false,\n id: 'shop.low-stock',\n name: tl('Running low', 'Estoque acabando'),\n description: tl(\n 'The products closest to zero, lowest first. A snapshot — the date range does not apply.',\n 'Os produtos mais perto do zero, do menor para o maior. É uma foto — o período não se aplica.',\n ),\n icon: 'PackageMinus',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n ],\n // Active products only by default: a draft with no stock is not a\n // shortage, it is a product that was never put on sale.\n filters: [{ ...productStatus, defaultValue: ['active'] }],\n defaultSort: 'inventory_count',\n defaultSortDir: 'asc',\n },\n viz: { type: 'table', limit: 6 },\n dashboard: { span: 2, order: 31 },\n },\n\n // =======================================================================\n // Report-list only — the long tail, reachable from /analytics/reports\n // =======================================================================\n {\n ...base,\n id: 'shop.sales-by-discount-code',\n name: tl('Sales by discount code', 'Vendas por cupom'),\n description: tl(\n 'Which coupons are actually being used, what they brought in and what they cost.',\n 'Quais cupons estão realmente sendo usados, o que trouxeram e o que custaram.',\n ),\n icon: 'TicketCheck',\n category: CAT.marketing,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n dimensions: [{ key: 'discount_code', label: tl('Discount code', 'Cupom') }],\n measures: [M.orders, M.discounts, M.total, M.paid],\n filters: orderFilters,\n defaultSort: 'discounts',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.sell-through',\n name: tl('Sell-through by product', 'Giro por produto'),\n description: tl(\n 'Units sold as a share of everything ever held — sold plus still on hand. A snapshot; the date range does not apply.',\n 'Unidades vendidas sobre tudo o que já se teve — vendido mais o que está em estoque. É uma foto; o período não se aplica.',\n ),\n icon: 'Percent',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n dimensions: [{ key: 'product_name', label: tl('Product', 'Produto') }],\n measures: [\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), agg: 'sum', format: 'number' },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), agg: 'sum', format: 'number' },\n // The denominator is a column on the read model, not sold+on-hand\n // recomputed here: summing the two separately and dividing is the same\n // arithmetic only while no product is missing from one of them.\n { key: 'units_ever_held', label: tl('Ever held', 'Total já tido'), agg: 'sum', format: 'number' },\n {\n key: 'sell_through', label: tl('Sell-through', 'Giro'),\n agg: 'ratio', ratioOf: ['units_sold', 'units_ever_held'], scale: 100, format: 'percent',\n },\n ],\n filters: [productStatus],\n defaultSort: 'units_sold',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n {\n ...base,\n compare: false,\n id: 'shop.top-customers',\n name: tl('Top customers by spend', 'Melhores clientes'),\n description: tl(\n 'Lifetime spend per customer. A snapshot of the customer base, not of the period.',\n 'Gasto de vida por cliente. Uma foto da base, não do período.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n dateColumn: null,\n dimensions: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n person: { idKey: 'customer_id', kind: 'shop_customer' },\n },\n // Grouped on but never shown. It is what the name links to — and also\n // what stops two customers called \"Silva\" from being reported as one.\n { key: 'customer_id', label: tl('Customer id', 'ID do cliente'), hidden: true },\n ],\n measures: [\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), agg: 'sum', format: 'currency' },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), agg: 'sum', format: 'number' },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), agg: 'avg', format: 'currency' },\n ],\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n },\n\n // --- Detail listings: raw rows, sortable, searchable, exportable --------\n // No dimensions and no measures, which is what routes them past the\n // aggregate engine to a plain paged SELECT over the read model.\n {\n ...base,\n id: 'shop.orders-detail',\n name: tl('Order list', 'Lista de pedidos'),\n description: tl(\n 'Every order in the period with its money breakdown and both statuses.',\n 'Todos os pedidos do período com a composição do valor e as duas situações.',\n ),\n icon: 'ShoppingBag',\n category: CAT.orders,\n grain: 'order',\n query: {\n source: { kind: 'view', name: ORDERS },\n filters: orderFilters,\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'customer_email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'financial_status', label: tl('Payment', 'Pagamento'), type: 'text' },\n { key: 'fulfillment_status', label: tl('Fulfillment', 'Entrega'), type: 'text' },\n { key: 'net_sales', label: tl('Net sales', 'Vendas líquidas'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.order-items-detail',\n name: tl('Sold items', 'Itens vendidos'),\n description: tl(\n 'Every line sold, joined to its product and category.',\n 'Cada linha vendida, ligada ao seu produto e categoria.',\n ),\n icon: 'List',\n category: CAT.products,\n grain: 'order_item',\n query: {\n source: { kind: 'view', name: ITEMS },\n filters: [itemFinancialStatus],\n defaultSort: 'created_at',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'created_at', label: tl('Date', 'Data'), type: 'date', sortable: true },\n { key: 'order_number', label: tl('Order', 'Pedido'), type: 'number', sortable: true },\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'quantity', label: tl('Qty', 'Qtd'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'unit_price', label: tl('Unit price', 'Preço unit.'), type: 'currency' },\n { key: 'line_total', label: tl('Total', 'Total'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n compare: false,\n id: 'shop.products-detail',\n name: tl('Catalogue and stock', 'Catálogo e estoque'),\n description: tl(\n 'Every product with price, stock on hand and lifetime sales. A snapshot — the date range does not apply.',\n 'Cada produto com preço, estoque e vendas de vida. É uma foto — o período não se aplica.',\n ),\n icon: 'Boxes',\n category: CAT.inventory,\n grain: 'product',\n query: {\n source: { kind: 'view', name: PRODUCTS },\n dateColumn: null,\n filters: [productStatus],\n defaultSort: 'revenue',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n { key: 'product_name', label: tl('Product', 'Produto'), type: 'text' },\n { key: 'sku', label: 'SKU', type: 'text' },\n { key: 'category_name', label: tl('Category', 'Categoria'), type: 'text' },\n { key: 'status', label: tl('Status', 'Situação'), type: 'text' },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', sortable: true },\n { key: 'inventory_count', label: tl('On hand', 'Em estoque'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'units_sold', label: tl('Units sold', 'Vendidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'revenue', label: tl('Revenue', 'Receita'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'inventory_retail_value', label: tl('Stock value', 'Valor em estoque'), type: 'currency', aggregate: 'sum', sortable: true },\n ],\n },\n {\n ...base,\n id: 'shop.customers-detail',\n name: tl('Customer list', 'Lista de clientes'),\n description: tl(\n 'Customers acquired in the period, with what they have spent since.',\n 'Clientes conquistados no período, com o que gastaram desde então.',\n ),\n icon: 'Users',\n category: CAT.customers,\n grain: 'customer',\n query: {\n source: { kind: 'view', name: CUSTOMERS },\n defaultSort: 'total_spent',\n defaultSortDir: 'desc',\n },\n viz: { type: 'table' },\n columns: [\n {\n key: 'customer_name', label: tl('Customer', 'Cliente'),\n type: 'person', idKey: 'customer_id', personKind: 'shop_customer',\n },\n { key: 'email', label: tl('Email', 'E-mail'), type: 'email' },\n { key: 'created_at', label: tl('Since', 'Cliente desde'), type: 'date', sortable: true },\n { key: 'orders_count', label: tl('Orders', 'Pedidos'), type: 'number', aggregate: 'sum', sortable: true },\n { key: 'total_spent', label: tl('Total spent', 'Total gasto'), type: 'currency', aggregate: 'sum', sortable: true },\n { key: 'avg_order_value', label: tl('Average order', 'Ticket médio'), type: 'currency', sortable: true },\n { key: 'last_order_at', label: tl('Last order', 'Último pedido'), type: 'date', sortable: true },\n ],\n },\n ]\n}\n","// Bling ↔ canonical de-para. Pure, so the field-by-field agreement the brief\n// (docs/integrations/bling-integration-brief.md §5) settles is testable without\n// a Bling account.\nimport type { BlingProduto, MirroredProduct } from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One Bling product as the mirror stores it, or null when it carries no id.\n *\n * `situacao` is Bling's own on/off ('A' = ativo). It maps to archived rather\n * than to a delete: an inactive product in Bling is still a product, and this\n * connector has no vocabulary for deletion at all — see `pullProducts`.\n */\nexport function toMirroredProduct(raw: BlingProduto | null | undefined): MirroredProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n return {\n externalId: String(raw.id),\n sku: raw.codigo ? String(raw.codigo) : null,\n name: String(raw.nome ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.preco),\n // Bling is the source of the stock number. The store mirrors it; it does not\n // decide it. See docs/integrations/bling-integration-brief.md §3.\n inventoryCount: toNumber(raw.estoque?.saldoVirtualTotal),\n status: String(raw.situacao ?? 'A').toUpperCase() === 'A' ? 'active' : 'archived',\n imageUrl: raw.imagemURL ? String(raw.imagemURL) : null,\n // Always null in practice: Bling does not return a change date at all (see\n // BlingProduto.dataAlteracao). Kept rather than deleted because the canonical\n // shape is shared with providers that do, and the run stamps its own\n // watermark either way.\n updatedAt: raw.dataAlteracao ? String(raw.dataAlteracao) : null,\n }\n}\n","// ---------------------------------------------------------------------------\n// Bling → canonical: the pull, and why it may never cancel anything.\n// ---------------------------------------------------------------------------\n// Bling has no memory of what it told us last time. There is no syncToken and\n// no tombstone: the only way to ask \"what changed\" is a date filter this client\n// computes, which is a `window` cursor. So the completeness of every run here is\n// `additive`, and that single word is what stops the engine from archiving a\n// product whose only crime was to fall outside the range.\n//\n// Everything is transport-injected — fetch, clock, sleep and the limiter — so\n// \"3000 SKUs enter without blowing 3 req/s\" is a proof rather than an impression.\n//\n// The import is split by subpath and that is load-bearing, not tidiness: the\n// edge function in ../../functions/bling-sync runs this file under Deno, where\n// `@fayz-ai/core` pulls React and the plugin registry and cannot load at all.\n// `@fayz-ai/core/connector-runtime` is the one entry written to be loadable\n// there, and it is the one specifier the app repos' functions-sync vendors.\n// `SyncResult` stays on the barrel because a type import is erased before Deno\n// ever sees it.\nimport {\n createRateLimiter,\n paginate,\n reconcileMirror,\n serializeCursor,\n sliceWindow,\n advanceWindow,\n type Completeness,\n type Cursor,\n type MirrorRecord,\n type RateLimiter,\n} from '@fayz-ai/core/connector-runtime'\nimport type { SyncResult } from '@fayz-ai/core'\nimport {\n BLING_MAX_WINDOW_MS,\n BLING_PAGE_SIZE,\n BLING_RATE_LIMIT,\n BLING_SAMPLE_SIZE,\n BLING_WINDOW_OVERLAP_MS,\n} from './limits'\nimport { toMirroredProduct } from './mapping'\nimport type { BlingProduto, MirroredProduct } from './types'\n\n/** One page of `GET /produtos`, as the caller's transport hands it over. */\nexport interface BlingProductPage {\n items: BlingProduto[]\n /** Bling has no next-page token: a short page is the last page. */\n short?: boolean\n}\n\nexport interface BlingPageRequest {\n pagina: number\n from: string\n to: string\n limite: number\n}\n\nexport interface PullProductsOptions {\n /** Where this run resumes. Absent = the first backfill. */\n cursor?: Cursor\n /** How far back a first run reaches. */\n backfillFrom?: string\n now?: number\n fetchPage(request: BlingPageRequest): Promise<BlingProductPage>\n /** Idempotent upsert into the canonical mirror. Returns whether it wrote. */\n upsert(product: MirroredProduct): Promise<boolean>\n /** Products already mirrored for this connection, for the reconciliation below. */\n linked?: MirrorRecord[]\n limiter?: RateLimiter\n pageSize?: number\n /** Stop after this many records — the `sample` phase. */\n maxRecords?: number\n maxPages?: number\n}\n\nexport interface PullProductsResult extends SyncResult {\n completeness: Completeness\n cursor: Cursor\n /** Local ids the run did NOT see and deliberately did not touch. */\n keptOutOfRange: string[]\n products: MirroredProduct[]\n pages: number\n /** Calls actually spent, so a caller can bill them against the daily budget. */\n calls: number\n}\n\n/** The window a first run asks for: `backfillFrom` (or a year back) until now. */\nexport function firstWindow(now: number, backfillFrom?: string): Extract<Cursor, { kind: 'window' }> {\n const parsed = backfillFrom ? Date.parse(backfillFrom) : NaN\n const from = Number.isFinite(parsed) ? parsed : now - BLING_MAX_WINDOW_MS\n return {\n kind: 'window',\n from: new Date(from).toISOString(),\n to: new Date(now).toISOString(),\n overlapMs: BLING_WINDOW_OVERLAP_MS,\n }\n}\n\n/** The window this run should ask for, given what the last one left behind. */\nexport function windowFor(options: Pick<PullProductsOptions, 'cursor' | 'backfillFrom' | 'now'>): Extract<Cursor, { kind: 'window' }> {\n const now = options.now ?? Date.now()\n const previous = options.cursor\n if (previous?.kind === 'window') return advanceWindow(previous, now)\n // A delta or period cursor arriving here is a connector mix-up, not a\n // recoverable state: starting over is the only honest answer.\n return firstWindow(now, options.backfillFrom)\n}\n\n/**\n * Pull the products Bling changed inside the window.\n *\n * `completeness` is hard-coded `additive` and it is not a default anyone should\n * \"improve\": Bling structurally cannot tell us a product was deleted, because\n * the question we asked was \"what changed between these two dates\". A run that\n * returned `authoritative` here would archive every product the store did not\n * happen to touch this week.\n */\nexport async function pullProducts(options: PullProductsOptions): Promise<PullProductsResult> {\n const now = options.now ?? Date.now()\n const cursor = windowFor({ cursor: options.cursor, backfillFrom: options.backfillFrom, now })\n const limiter = options.limiter ?? createRateLimiter(BLING_RATE_LIMIT)\n const limite = options.pageSize ?? BLING_PAGE_SIZE\n const maxRecords = options.maxRecords ?? Number.POSITIVE_INFINITY\n\n // A window wider than a year is a 400 from Bling, so it is sliced BEFORE the\n // first call. Discovering the cap in production means discovering it as a\n // backfill that never ran.\n const slices = sliceWindow(cursor.from, cursor.to, BLING_MAX_WINDOW_MS)\n\n const products: MirroredProduct[] = []\n const seen = new Set<string>()\n let pages = 0\n let calls = 0\n let written = 0\n let error: string | undefined\n\n try {\n for (const slice of slices) {\n if (products.length >= maxRecords) break\n const walked = await paginate<BlingProduto, BlingPageRequest>({\n first: { pagina: 1, from: slice.from, to: slice.to, limite },\n maxPages: options.maxPages ?? 1_000,\n fetchPage: async (request) => {\n await limiter.take()\n calls += 1\n const page = await options.fetchPage(request)\n pages += 1\n const items = page.items ?? []\n // Bling has no next-page token. The page is the last one when it came\n // back short — which is also why an off-by-one here silently drops a\n // whole page, the exact failure FAY-1377 was.\n const last = page.short === true || items.length < request.limite\n const enough = products.length + items.length >= maxRecords\n return { items, next: last || enough ? null : { ...request, pagina: request.pagina + 1 } }\n },\n })\n\n for (const raw of walked.items) {\n if (products.length >= maxRecords) break\n const mapped = toMirroredProduct(raw)\n if (!mapped) continue\n seen.add(mapped.externalId)\n products.push(mapped)\n if (await options.upsert(mapped)) written += 1\n }\n }\n } catch (caught) {\n error = String((caught as Error)?.message ?? caught)\n }\n\n // The whole point. Under `additive` this returns nothing to cancel and names\n // what it refused to touch, so the refusal is visible in the run rather than\n // being an absence of behaviour.\n const reconciled = reconcileMirror({\n completeness: 'additive',\n observed: seen,\n linked: options.linked ?? [],\n })\n\n const advanced: Cursor = error ? cursor : { ...cursor }\n return {\n status: error ? 'error' : products.length >= maxRecords ? 'partial' : 'success',\n completeness: 'additive',\n fetched: products.length,\n written,\n cursor: advanced,\n keptOutOfRange: reconciled.keptOutOfRange,\n products,\n pages,\n calls,\n error,\n stats: {\n pages,\n calls,\n window_from: cursor.from,\n window_to: cursor.to,\n slices: slices.length,\n kept_out_of_range: reconciled.keptOutOfRange.length,\n cursor: serializeCursor(advanced),\n },\n }\n}\n\n/**\n * The fast half of the first load: one page, seconds, enough to design against.\n *\n * It is a different call and not a flag because it makes a different promise —\n * `partial` by construction, never a basis for deciding anything is missing.\n */\nexport function sampleProducts(\n options: Omit<PullProductsOptions, 'maxRecords' | 'maxPages'> & { sampleSize?: number },\n): Promise<PullProductsResult> {\n return pullProducts({\n ...options,\n maxRecords: options.sampleSize ?? BLING_SAMPLE_SIZE,\n maxPages: 1,\n // A sample never reconciles: it saw one page of one window and knows less\n // about absence than any other run in the system.\n linked: [],\n })\n}\n","// ---------------------------------------------------------------------------\n// The two ways Bling reaches US, and neither of them knows a tenant.\n// ---------------------------------------------------------------------------\n// 1. OAuth started at the PROVIDER. The shopkeeper authorises inside Bling's\n// extension centre, so the callback arrives with no `state` and possibly no\n// Fayz account behind it at all. The ingress presumes a tenant in the URL,\n// which is exactly the premise this breaks. The answer is a connection that\n// exists before a tenant does, keyed by the account Bling DID name, and\n// claimed at signup — this is an acquisition channel, not an edge case.\n//\n// 2. Webhooks. Bling announces an account, never a tenant, and requires a 2xx\n// within 5 seconds or it DISABLES the tenant's configuration. So the\n// response path verifies, routes and enqueues; it processes nothing.\n//\n// Both land on `provider_account_key` and its partial unique index in\n// packages/db/migrations/029_connections.sql. Pure functions, so the routing is\n// provable without a Bling account and without a secret anywhere near a fixture.\nimport { BLING_CONNECTOR_ID } from './limits'\n\n/** What the platform learned from a Bling OAuth callback. */\nexport interface BlingCallback {\n /** Present only when Fayz started the flow. Absent on the Bling-first path. */\n state?: string | null\n /** Bling's own id for the authorising account. The only stable handle we get. */\n companyId?: string | null\n}\n\nexport type CallbackRoute =\n /** Fayz started it: the state names the tenant, and the connection is theirs. */\n | { mode: 'tenant'; state: string; providerAccountKey: string | null }\n /**\n * Bling started it: park the grant against the account, claimable at signup.\n * `source` is what makes the channel measurable instead of anecdotal.\n */\n | { mode: 'orphan'; providerAccountKey: string; source: string }\n /** Nothing identifies the grant. Nothing can be done with it later either. */\n | { mode: 'reject'; reason: string }\n\n/** Where Bling-first connections are attributed from. */\nexport const BLING_MARKETPLACE_SOURCE = 'bling_marketplace'\n\n/**\n * Decide what a callback becomes. A missing `state` is NOT an error — treating\n * it as one throws away the shopkeeper who arrived from Bling's own storefront.\n */\nexport function routeCallback(callback: BlingCallback): CallbackRoute {\n const account = callback.companyId ? String(callback.companyId).trim() : ''\n if (callback.state) return { mode: 'tenant', state: callback.state, providerAccountKey: account || null }\n if (account) return { mode: 'orphan', providerAccountKey: account, source: BLING_MARKETPLACE_SOURCE }\n return { mode: 'reject', reason: 'callback carried neither state nor companyId' }\n}\n\n/** The identity an orphan connection is stored under until someone claims it. */\nexport function orphanConnection(route: Extract<CallbackRoute, { mode: 'orphan' }>) {\n return {\n connectorId: BLING_CONNECTOR_ID,\n // The Bling company is the account, so it is also the instance key: two\n // companies are two connections, not two rows fighting over one.\n instanceKey: route.providerAccountKey,\n providerAccountKey: route.providerAccountKey,\n status: 'pending' as const,\n settings: { companyId: route.providerAccountKey, source: route.source, stockOwner: 'bling' as const },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Webhooks\n// ---------------------------------------------------------------------------\n\nexport interface WebhookRequest {\n /** Raw body. Signed bytes, so it is verified before it is parsed. */\n body: string\n signature: string | null\n /** The account the event belongs to, read after verification. */\n providerAccountKey?: string | null\n}\n\nexport interface AcceptWebhookOptions {\n /**\n * Constant-time HMAC-SHA256 comparison, INJECTED. No key, no crypto import and\n * no fixture in this repo ever holds one — the secret lives in the platform\n * credential store and is handed to the edge function per call.\n */\n verify(body: string, signature: string | null): Promise<boolean> | boolean\n /** Find the tenant behind the account. Backed by uq_plg_connections_account_key. */\n resolve(providerAccountKey: string): Promise<{ tenantId: string; connectionId: string } | null>\n /** Hand the work to the queue. MUST NOT be awaited on the response path. */\n enqueue(job: { tenantId: string; connectionId: string; body: string }): Promise<void> | void\n onError?(error: unknown): void\n}\n\nexport interface WebhookVerdict {\n status: number\n /** Whether work was handed to the queue and is still outstanding. */\n queued: boolean\n reason?: string\n}\n\n/**\n * Answer Bling, then let the work happen.\n *\n * The 200 is not optimism: an unverified body was already rejected and a routed\n * job is already durable. What the 200 declines to wait for is the processing —\n * because a Bling webhook that has not been answered in 5 seconds does not\n * retry, it turns the tenant's integration off, and the tenant finds out weeks\n * later as \"Bling stopped working\".\n *\n * An unroutable account still answers 200. A 4xx there would make Bling disable\n * a configuration over an account we simply have not been given yet — the\n * orphan case above, arriving by webhook instead of by callback.\n */\nexport async function acceptWebhook(request: WebhookRequest, options: AcceptWebhookOptions): Promise<WebhookVerdict> {\n let ok = false\n try {\n ok = await options.verify(request.body, request.signature)\n } catch (error) {\n options.onError?.(error)\n ok = false\n }\n // The one refusal worth making: an unsigned body is not from Bling, and\n // answering 200 to it would let anyone move a tenant's stock.\n if (!ok) return { status: 401, queued: false, reason: 'signature' }\n\n const account = request.providerAccountKey ? String(request.providerAccountKey) : ''\n if (!account) return { status: 200, queued: false, reason: 'no account in payload' }\n\n let target: { tenantId: string; connectionId: string } | null = null\n try {\n target = await options.resolve(account)\n } catch (error) {\n options.onError?.(error)\n }\n if (!target) return { status: 200, queued: false, reason: 'unclaimed account' }\n\n try {\n await options.enqueue({ ...target, body: request.body })\n } catch (error) {\n options.onError?.(error)\n // Bling does not guarantee order and will re-deliver; a 5xx is the honest\n // answer when the job did not become durable, and it does not disable the\n // configuration the way a 4xx does.\n return { status: 500, queued: false, reason: 'enqueue failed' }\n }\n\n return { status: 200, queued: true }\n}\n","// NeoChef ↔ store, both directions. Pure, so the agreement is testable without\n// a NeoChef tenant, an OAuth grant or a network.\nimport type {\n MirroredNeoChefProduct,\n NeoChefOrderRow,\n NeoChefProductRow,\n ShopOrderForNeoChef,\n} from './types'\n\nfunction toNumber(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const n = typeof value === 'number' ? value : Number(String(value).replace(',', '.'))\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * One NeoChef product as the mirror stores it, or null when it carries no id.\n *\n * `is_active` maps to archived and never to a delete. An inactive product in\n * the kitchen is still a product, and this connector has no vocabulary for\n * deletion at all — a store that empties its catalogue because a row left a\n * page is the failure `reconcileMirror` exists to prevent.\n */\nexport function toMirroredNeoChefProduct(\n raw: NeoChefProductRow | null | undefined,\n): MirroredNeoChefProduct | null {\n if (!raw || raw.id === null || raw.id === undefined || raw.id === '') return null\n\n // Two columns can say \"off\" and they disagree in practice: `is_active` is the\n // switch the UI toggles, `status` is the archetype's own word. Either one\n // saying off is off — reading only one is how a product the merchant retired\n // stays for sale in the store.\n const inactive = raw.is_active === false || String(raw.status ?? 'active').toLowerCase() === 'archived'\n\n return {\n externalId: String(raw.id),\n sku: raw.sku ? String(raw.sku) : null,\n name: String(raw.name ?? '').trim() || `Produto ${raw.id}`,\n price: toNumber(raw.price),\n // The kitchen owns this number. The store mirrors it; it does not decide it.\n inventoryCount: toNumber(raw.stock),\n status: inactive ? 'archived' : 'active',\n imageUrl: raw.image_url ? String(raw.image_url) : null,\n // Unlike Bling, the far side DOES return its change stamp, so the cursor can\n // advance from the data instead of from the window we asked for.\n updatedAt: raw.updated_at ? String(raw.updated_at) : null,\n }\n}\n\n/**\n * A paid store order as a NeoChef order row.\n *\n * `kind` is the only real decision here: NeoChef's orders are `takeout` or\n * `delivery`, and which one a web order is depends on whether the buyer\n * collects. Guessing one would put every online sale on the wrong board in the\n * kitchen, so it is read from the order and defaults to delivery — the answer\n * that is wrong in the safer direction, since a delivery order nobody drives is\n * visible and a takeout order nobody prepared is not.\n */\nexport function toNeoChefOrder(order: ShopOrderForNeoChef): NeoChefOrderRow {\n return {\n kind: order.pickup === true ? 'takeout' : 'delivery',\n // The store's own number, so a human can match the two screens. Falls back\n // to the id rather than to empty: an order with no reference is unmatchable.\n reference_number: String(order.referenceNumber ?? order.id),\n // It arrives paid and confirmed — the store already took the money, and a\n // kitchen that has to re-confirm it is a kitchen doing the work twice.\n status: 'confirmed',\n total: toNumber(order.total),\n subtotal: toNumber(order.subtotal),\n notes: order.notes ? String(order.notes) : null,\n }\n}\n\n/**\n * The cursor for the next pull.\n *\n * The newest `updated_at` OBSERVED, minus an overlap, and never the clock: the\n * two sides do not share one, and a cursor taken from ours skips whatever the\n * far side stamped in between. Null when nothing carried a stamp, which asks\n * the next run to repeat the window rather than to invent one.\n */\nexport function advanceNeoChefCursor(\n products: MirroredNeoChefProduct[],\n overlapMs: number,\n): string | null {\n const stamps = products\n .map((product) => (product.updatedAt ? Date.parse(product.updatedAt) : NaN))\n .filter((value) => Number.isFinite(value))\n if (stamps.length === 0) return null\n return new Date(Math.max(...stamps) - overlapMs).toISOString()\n}\n","import React, { useEffect, useState } from 'react'\nimport { Skeleton } from '@fayz-ai/ui'\nimport type { Product, ShopProvider } from '@fayz-ai/shop'\nimport { ProductImagesTab } from './ProductImagesTab'\nimport { errorMessage } from '../settings/error-message'\n\n/**\n * The store's content for a CATALOG product: its photos, which one is the\n * cover, and the way to the content library — mounted on the product record of\n * whichever plugin owns the catalog (stock, here), not only on the shop's own.\n *\n * `item.id` is the catalog product; the gallery belongs to the storefront\n * product behind it, which is looked up once.\n */\nexport function ProductContentTab({ item, getProvider, libraryHref = '#/content' }: {\n item: unknown\n getProvider: () => ShopProvider\n /** Where the whole library opens. */\n libraryHref?: string\n}) {\n const catalogId = (item as { id?: string } | null)?.id\n const [product, setProduct] = useState<Product | null | undefined>(undefined)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!catalogId) { setProduct(null); return }\n let alive = true\n setProduct(undefined)\n const provider = getProvider()\n const lookup = provider.getProductByCatalogId\n ? provider.getProductByCatalogId(catalogId)\n : provider.getProduct(catalogId)\n lookup\n .then((found) => { if (alive) setProduct(found) })\n .catch((err: unknown) => { if (alive) { setProduct(null); setError(errorMessage(err)) } })\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [catalogId])\n\n if (product === undefined) {\n return (\n <div className=\"space-y-4\" aria-busy=\"true\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-full max-w-lg\" />\n </div>\n <ul className=\"fz-cards gap-3\">\n {[0, 1, 2, 3].map((i) => (\n <li key={i} className=\"overflow-hidden rounded-lg border\">\n <Skeleton className=\"aspect-square w-full rounded-none\" />\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-4 w-20\" />\n </div>\n </li>\n ))}\n </ul>\n </div>\n )\n }\n\n if (!product) {\n return (\n <p className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n {error ?? 'Este produto ainda não está na loja, então não tem galeria. Publique-o na loja para adicionar fotos.'}\n </p>\n )\n }\n\n return (\n <ProductImagesTab\n item={product}\n getProvider={getProvider}\n footer={(\n <p className=\"text-xs text-muted-foreground\">\n Estas fotos também aparecem em{' '}\n <a href={libraryHref} className=\"font-medium text-primary underline underline-offset-2 hover:opacity-80\">Conteúdo</a>\n , junto com as de todos os produtos.\n </p>\n )}\n />\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\nimport { Badge, Button, CurrencyInput, Skeleton } from '@fayz-ai/ui'\nimport type { AdminShopMarket, ShopProvider } from '@fayz-ai/shop'\nimport { errorMessage } from '../settings/error-message'\n\nconst SYMBOLS: Record<string, string> = { BRL: 'R$', EUR: '€', USD: 'US$', GBP: '£', ARS: 'AR$', MXN: 'MX$' }\n\n/**\n * Preços por mercado (0116) — the product's price in each market, in that\n * market's money.\n *\n * Mounted on the CATALOGUE product (stock's record), because a price table\n * keys on public.products.id. Each market owns one price table; this tab writes\n * the product-level row of each. The default market falls back to the\n * product's own sale price when left empty; any other market without a price\n * does not sell the product — the storefront shows it sold out there and the\n * checkout refuses it, instead of charging the reais number in euros.\n */\nexport function ProductMarketPricesTab({ item, getProvider, settingsHref = '#/settings/shop-markets' }: {\n item: unknown\n getProvider: () => ShopProvider\n settingsHref?: string\n}) {\n const catalogId = (item as { id?: string } | null)?.id\n const basePrice = Number((item as { salePrice?: number; price?: number } | null)?.salePrice\n ?? (item as { price?: number } | null)?.price ?? 0)\n const [markets, setMarkets] = useState<AdminShopMarket[] | undefined>(undefined)\n const [saved, setSaved] = useState<Record<string, number | null>>({})\n const [draft, setDraft] = useState<Record<string, number | null>>({})\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [done, setDone] = useState(false)\n\n useEffect(() => {\n if (!catalogId) return\n let alive = true\n const provider = getProvider()\n if (!provider.listAdminMarkets || !provider.getCatalogMarketPrices) {\n setMarkets([])\n return\n }\n Promise.all([provider.listAdminMarkets(), provider.getCatalogMarketPrices(catalogId)])\n .then(([list, prices]) => {\n if (!alive) return\n const byMarket = Object.fromEntries(prices.map((p) => [p.marketId, p.price]))\n setMarkets(list)\n setSaved(byMarket)\n setDraft(byMarket)\n })\n .catch((err: unknown) => { if (alive) { setMarkets([]); setError(errorMessage(err)) } })\n return () => { alive = false }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [catalogId])\n\n const dirty = useMemo(\n () => Object.keys(draft).some((id) => (draft[id] ?? null) !== (saved[id] ?? null)),\n [draft, saved],\n )\n\n async function save() {\n if (!catalogId) return\n const provider = getProvider()\n if (!provider.setCatalogMarketPrice) return\n setSaving(true)\n setError(null)\n setDone(false)\n try {\n for (const id of Object.keys(draft)) {\n const next = draft[id] ?? null\n if (next !== (saved[id] ?? null)) await provider.setCatalogMarketPrice(catalogId, id, next)\n }\n setSaved({ ...draft })\n setDone(true)\n } catch (err) {\n setError(errorMessage(err))\n } finally {\n setSaving(false)\n }\n }\n\n if (markets === undefined) {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <Skeleton className=\"h-5 w-48\" />\n {[0, 1].map((i) => <Skeleton key={i} className=\"h-16 w-full\" />)}\n </div>\n )\n }\n\n if (markets.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed px-4 py-10 text-center text-sm text-muted-foreground\">\n {error ?? (\n <>\n A loja vende numa moeda só. Para vender em outros países com preço próprio,{' '}\n <a href={settingsHref} className=\"font-medium text-primary underline underline-offset-2\">crie os mercados</a>.\n </>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <h3 className=\"text-sm font-semibold\">Preços por mercado</h3>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n O preço deste produto em cada mercado, na moeda dele. No mercado padrão, vazio usa o preço de venda do produto;\n nos outros, vazio quer dizer que o produto não é vendido lá.\n </p>\n </div>\n\n <ul className=\"divide-y rounded-lg border\">\n {markets.map((market) => {\n const value = draft[market.id] ?? null\n const symbol = SYMBOLS[market.currency] ?? market.currency\n return (\n <li key={market.id} className=\"flex flex-wrap items-center gap-4 px-4 py-3\">\n <div className=\"min-w-[12rem] flex-1\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n {market.name}\n <Badge variant=\"secondary\">{market.currency}</Badge>\n {market.isDefault && <Badge variant=\"outline\">Padrão</Badge>}\n {!market.isActive && <Badge variant=\"outline\">Inativo</Badge>}\n </div>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {market.countries.length ? market.countries.join(', ') : 'Todos os países sem outro mercado'}\n </p>\n </div>\n <div className=\"w-48\">\n <CurrencyInput\n value={value ?? 0}\n onChange={(next) => { setDone(false); setDraft((d) => ({ ...d, [market.id]: next > 0 ? next : null })) }}\n symbol={symbol}\n currencyCode={market.currency}\n locale={market.locale ?? 'pt-BR'}\n placeholder={market.isDefault && basePrice ? String(basePrice) : undefined}\n />\n </div>\n <p className=\"w-full text-xs sm:w-56\">\n {value != null ? (\n <span className=\"text-muted-foreground\">Preço próprio neste mercado.</span>\n ) : market.isDefault ? (\n <span className=\"text-muted-foreground\">Usa o preço de venda do produto.</span>\n ) : (\n <span className=\"text-amber-600\">Sem preço — não aparece à venda neste mercado.</span>\n )}\n </p>\n </li>\n )\n })}\n </ul>\n\n {error && <p className=\"text-sm text-destructive\">{error}</p>}\n\n <div className=\"flex items-center gap-3\">\n <Button onClick={() => { void save() }} disabled={!dirty || saving}>\n {saving ? 'Salvando…' : 'Salvar preços'}\n </Button>\n {done && !dirty && <span className=\"text-sm text-emerald-600\">Preços salvos.</span>}\n <a href={settingsHref} className=\"ml-auto text-xs text-muted-foreground underline underline-offset-2\">Gerenciar mercados</a>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { buildShopOnboarding } from './lib/onboarding'\nimport { registerMessageDefaults, registerComponent, formatCurrency } from '@fayz-ai/core'\nimport {\n setShopTenantResolver, getShopProvider, registerShippingLabelProvider,\n buildShopDomainEvents, buildShopMessageDefaults,\n} from '@fayz-ai/shop'\nimport { createMelhorEnvioLabelProvider } from './integrations/melhor-envio/labelProvider'\nimport { shopCustomerLookup } from './views/customerLookup'\nimport {\n useOrganizationStore, createCrudPage, registerEntityPath, registerPersonLookup, adminNavigateTo,\n registerCrudNavTabs,\n type CrudNavTab,\n} from '@fayz-ai/admin'\nimport {\n CircleDollarSign, CreditCard, Eye, FileEdit, FolderTree, Layers, Package, PackageX,\n ShoppingBag, Tag, TicketCheck, Users, UsersRound, UserX, Filter,\n} from 'lucide-react'\nimport { buildShopProductEntity } from './views/productEntity'\nimport { buildShopCustomerEntity } from './views/customerEntity'\nimport { buildShopDiscountEntity } from './views/discountEntity'\nimport { DISCOUNT_CREATE_INSTRUCTIONS } from './views/discount-agent'\nimport { buildShopCategoryEntity } from './views/categoryEntity'\nimport { buildShopCollectionEntity } from './views/collectionEntity'\nimport { buildShopGiftCardEntity } from './views/giftCardEntity'\nimport { buildShopCustomerGroupEntity } from './views/customerGroupEntity'\nimport { buildShopCustomerSegmentEntity } from './views/customerSegmentEntity'\nimport { createShopProductDataProvider } from './data/productDataProvider'\nimport { createShopDiscountDataProvider } from './data/discountDataProvider'\nimport { createShopCategoryDataProvider } from './data/categoryDataProvider'\nimport { createShopCollectionDataProvider } from './data/collectionDataProvider'\nimport { createShopGiftCardDataProvider } from './data/giftCardDataProvider'\nimport { createShopCustomerGroupDataProvider } from './data/customerGroupDataProvider'\nimport { createShopCustomerSegmentDataProvider } from './data/customerSegmentDataProvider'\nimport type { ShopProviderResolver } from './views/ShopPage'\nimport { StoreGeneralSettings } from './settings/StoreGeneralSettings'\nimport { PaymentsSettings } from './settings/PaymentsSettings'\nimport { CheckoutSettings } from './settings/CheckoutSettings'\nimport { ShippingSettings } from './settings/ShippingSettings'\nimport { FulfillmentSettings } from './settings/FulfillmentSettings'\nimport { MarketsSettings } from './settings/MarketsSettings'\nimport { melhorEnvioConnectorDef } from './integrations/melhor-envio/connectorDef'\nimport { appmaxConnectorDef } from './integrations/appmax/connectorDef'\nimport { abacatePayConnectorDef } from './integrations/abacatepay/connectorDef'\nimport { stripeConnectConnectorDef } from './integrations/stripe-connect/connectorDef'\nimport { vindiConnectorDef } from './integrations/vindi/connectorDef'\nimport { mercadoPagoConnectorDef } from './integrations/mercadopago/connectorDef'\nimport { ContentPage } from './views/ContentPage'\nimport { blingConnectorDef } from './integrations/bling/connectorDef'\nimport { neoChefConnectorDef } from './integrations/neochef/connectorDef'\nimport { SHIPPING_ZONES_REGISTRY } from './data/registries'\nimport { shippingRegistryPath } from './data/registry-routes'\nimport { buildShopAnalyticsCards } from './analytics/cards'\n\nconst ShopPage = React.lazy(() => import('./views/ShopPage').then((m) => ({ default: m.ShopPage })))\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShopPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /** Override the nav labels of the store's groups and their children. */\n sectionLabels?: Partial<Record<\n | 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n | 'collections' | 'categories' | 'giftCards' | 'content' | 'store' | 'emails'\n | 'customerGroups' | 'customerSegments' | 'stock', string>>\n /**\n * As partes da loja que este app publica. Só `products` é destacável hoje —\n * é a única que tem um concorrente legítimo em outro plugin.\n */\n modules?: {\n /**\n * O catálogo da vitrine (Produtos · Coleções · Categorias), sobre\n * `plg_shop_products`. Ligado por padrão. DESLIGUE quando o app já registra\n * produto em outro lugar: o Estoque mantém o cadastro-mestre em\n * `public.products`, e dois \"Produtos\" no mesmo rail, sobre duas tabelas,\n * é como o mesmo produto acaba cadastrado duas vezes, diferente.\n * Pedidos, clientes, conteúdo e descontos continuam de pé.\n */\n products?: boolean\n /**\n * The shop's own orders LIST at `/orders`. On by default. Turn it off when\n * the app mounts an orders list that already covers every sale of the\n * account: two plugins drawing `/orders` is one of them never showing.\n * The shop keeps `/orders/new`, `/orders/:id/edit` and its detail page,\n * which it offers through the `orders.detail` component slot.\n */\n orders?: boolean\n }\n scope?: PluginScope\n verticalId?: VerticalId\n currency?: { code?: string; locale?: string; symbol?: string }\n provider?: ShopProviderResolver\n /** Heading the store's settings screens are grouped under in the settings\n * rail. Default 'Commerce'. */\n settingsGroupLabel?: string\n /**\n * Contribute the retail analytics catalogue. Default TRUE — a store that\n * cannot report on its own sales is not a store. Pass false where the host\n * app supplies its own pack, so the two do not stack.\n */\n analyticsCards?: false\n /**\n * Where the storefront is edited now that the app builder owns it. The old\n * \"Canais de venda\" screen pointed here instead of being kept alive as a\n * second, thinner way to type the store's address.\n */\n siteRoute?: string\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nconst LazyOrderDetail = React.lazy(() =>\n import('./views/ShopPage').then((m) => ({ default: m.ShopOrderDetailSlot })))\n\nfunction ShopOrderDetail(provider?: ShopProviderResolver) {\n const Detail: React.ComponentType<{ orderId: string; onBack: () => void; fallback: React.ReactNode }> = (props) =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(LazyOrderDetail, { ...props, provider }))\n Detail.displayName = 'ShopOrderDetail'\n return Detail\n}\n\nexport function createShopPlugin(options?: ShopPluginOptions): PluginManifest {\n const curr = { code: 'BRL', locale: 'pt-BR', symbol: 'R$', ...options?.currency }\n\n // Scope fallback shop queries to the active organization. Apps can inject a\n // provider when they want SDK-owned data access instead of the global runtime.\n setShopTenantResolver(() => useOrganizationStore.getState().currentOrg?.id)\n\n // O texto sugerido para cada fato. Os FATOS em si são declarados no\n // manifesto (`events`, abaixo): é de lá que webhook e auditoria leem, sem\n // passar por nada de mensageria.\n registerMessageDefaults(buildShopMessageDefaults())\n\n // Who can issue a label. Registered, not hard-coded: the order screen resolves\n // whichever carrier the store connected and calls the same four verbs.\n registerShippingLabelProvider(createMelhorEnvioLabelProvider(() =>\n (typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider())))\n\n // Teach the shared person-path registry where a SHOP customer lives. The\n // built-in map ships veterinary defaults (customer → /registry/tutors), so\n // without this PersonLink would resolve a shop customer to the wrong module.\n // Clientes is the standard registry: a store customer is a person the house\n // already knows, and `plg_shop_customers` hangs off `people` by `person_id`.\n registerEntityPath('shop_customer', '/customers')\n\n // And where to LOAD one from. A surface that only holds an id and a name — an\n // analytics cell — can now render the same card the order screen shows,\n // without every caller having to hand it the shop provider.\n registerPersonLookup('shop_customer', shopCustomerLookup(() => resolveProvider()))\n\n type ShopSection = 'products' | 'orders' | 'customers' | 'discounts' | 'shipping'\n\n // Orders keep the bespoke ShopPage rather than a generic CRUD: an order is not\n // a CRUD record — it needs fulfilment, refunds and a line-item view.\n const pageFor = (section?: ShopSection): React.ComponentType<unknown> => {\n const Wrapped: React.ComponentType<unknown> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(\n ShopPage as React.ComponentType<{ provider?: ShopProviderResolver; section?: ShopSection }>,\n { provider: options?.provider, section },\n )\n )\n Wrapped.displayName = section ? `ShopPage:${section}` : 'ShopPageWrapper'\n return Wrapped\n }\n\n // Products, customers and discounts all get the full generic CRUD (list +\n // form + detail + delete) from their EntityDef, rather than three bespoke\n // read-only tables. Orders stay on the custom page: an order is not a CRUD\n // record — it needs fulfilment, refunds and a line-item view, which is its\n // own screen.\n const resolveProvider = () =>\n typeof options?.provider === 'function'\n ? options.provider()\n : options?.provider ?? getShopProvider()\n\n const label = (key: keyof NonNullable<ShopPluginOptions['sectionLabels']>, fallback: string) =>\n options?.sectionLabels?.[key] ?? fallback\n\n // The heading the store's five settings screens are filed under. One constant\n // so the rail groups them: the shell keys the run off equal STRINGS, and five\n // hand-typed labels group as five sections the moment one of them is retyped.\n const COMMERCE_GROUP = options?.settingsGroupLabel ?? 'Commerce'\n\n // Each settings tab is a zero-prop component the shell instantiates, so the\n // props it actually needs (provider, currency) are closed over here. Named,\n // because an anonymous arrow makes every one of the five read as the same\n // frame in a React stack trace.\n const settingsTab = (\n name: string,\n render: () => React.ReactElement,\n ): React.ComponentType<unknown> => {\n const Tab: React.ComponentType<unknown> = () => render()\n Tab.displayName = name\n return Tab\n }\n\n // The header tab strip carries the STATUS FILTER of each list (Todos / Ativo /\n // Rascunho / Arquivado), declared per entity as `facets: [{ display: 'tabs' }]`.\n //\n // It deliberately does NOT carry sibling CRUDs here: the sidebar already lists\n // Produtos · Coleções · Categorias under \"Produtos\", and repeating those three\n // as tabs would give the same navigation twice on the same screen — two\n // controls that must be kept in sync and disagree the moment one is used. The\n // CrudListView `navTabs` slot exists for lists whose siblings are NOT in the\n // menu; nothing in this plugin is in that position.\n\n const ProductsCrudPage = createCrudPage(buildShopProductEntity(curr.code, resolveProvider), {\n dataProvider: createShopProductDataProvider(resolveProvider),\n feature: 'shop',\n // O produto da loja não tem tabela própria — vive atrás do provider de\n // commerce —, então as primitivas de dado do agente não o alcançam. A porta\n // funciona porque a lista empresta o próprio store: ver CrudAgentSurface.\n aiCreate: {\n hint: 'Descreva o produto…',\n description: 'Descreva o produto e eu cadastro.',\n intro: {\n role: 'operations',\n persona: 'Cadastro de produtos',\n pitch: 'Diga o produto que você quer cadastrar.',\n description:\n 'Nome, preço, descrição, estoque — diga o que souber, do jeito que falar, e eu preencho o resto com o que faz sentido. Nasce como rascunho e você confere antes de publicar.',\n suggestions: [\n { label: 'Camiseta preta, R$ 79, estoque 20' },\n { label: 'Cadastre 5 produtos de exemplo para eu testar a loja' },\n { label: 'Um combo com os dois produtos mais vendidos' },\n ],\n },\n },\n stats: (items, total) => [\n { id: 'total', label: 'Produtos', value: total, icon: Package },\n { id: 'active', label: 'Ativos', value: items?.filter((p) => p.status === 'active').length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((p) => p.status === 'draft').length ?? 0, icon: FileEdit },\n { id: 'out-of-stock', label: 'Sem estoque', value: items?.filter((p) => (p.inventoryCount ?? 0) <= 0).length ?? 0, icon: PackageX },\n ],\n })\n\n // Clientes / Grupos / Segmentos are three DIFFERENT CRUDs about the same\n // people, and only \"Clientes\" is in the sidebar — so here the header strip\n // carries siblings rather than a status filter, and duplicates no menu entry.\n const customerTabs = (): CrudNavTab[] => [\n { id: 'customers', label: label('customers', 'Clientes'), icon: Users,\n onSelect: () => adminNavigateTo('/customers') },\n { id: 'groups', label: label('customerGroups', 'Grupos'), icon: UsersRound,\n onSelect: () => adminNavigateTo('/customers/groups') },\n { id: 'segments', label: label('customerSegments', 'Segmentos'), icon: Filter,\n onSelect: () => adminNavigateTo('/customers/segments') },\n ]\n\n // A faixa aparece nas TRÊS telas, e a primeira delas é do cadastro padrão,\n // que é de outro plugin. Por isso o registro: a loja oferece as abas à rota\n // `/customers` sem que o plugin-crm precise conhecer a loja — e onde a loja\n // está desligada, Clientes simplesmente não ganha faixa.\n registerCrudNavTabs('/customers', customerTabs)\n\n const CustomerGroupsCrudPage = createCrudPage(buildShopCustomerGroupEntity(), {\n dataProvider: createShopCustomerGroupDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'groups',\n stats: (items, total) => [\n { id: 'total', label: 'Grupos', value: total, icon: UsersRound },\n {\n id: 'members', label: 'Clientes agrupados', icon: Users,\n // Distinct people, not the sum: someone in two groups is still one\n // customer, and a sum would report more members than the store has.\n value: new Set((items ?? []).flatMap((g) => g.customerIds ?? [])).size,\n },\n {\n id: 'empty', label: 'Grupos vazios', icon: UserX,\n value: items?.filter((g) => (g.customerIds?.length ?? 0) === 0).length ?? 0,\n },\n { id: 'segments', label: 'Segmentos', pending: 'Ver aba', icon: Filter },\n ],\n })\n\n const CustomerSegmentsCrudPage = createCrudPage(buildShopCustomerSegmentEntity(curr.code), {\n dataProvider: createShopCustomerSegmentDataProvider(resolveProvider),\n feature: 'shop',\n navTabs: customerTabs,\n activeNavTab: 'segments',\n stats: (items, total) => [\n { id: 'total', label: 'Segmentos', value: total, icon: Filter },\n {\n id: 'matched', label: 'Maior segmento', icon: Users,\n value: items?.length ? Math.max(...items.map((s) => s.matchCount ?? 0)) : 0,\n },\n {\n id: 'empty', label: 'Sem ninguém', icon: UserX,\n value: items?.filter((s) => (s.matchCount ?? 0) === 0).length ?? 0,\n },\n { id: 'groups', label: 'Grupos', pending: 'Ver aba', icon: UsersRound },\n ],\n })\n\n // A loja NÃO monta a própria lista de clientes: `/customers` é do cadastro\n // padrão, e `plg_shop_customers` pendura nele por `person_id`. A entidade\n // continua viva — `CustomerModal` a usa para abrir a ficha da loja de dentro\n // de um pedido, que é onde ela tem pergunta.\n\n const DiscountsCrudPage = createCrudPage(buildShopDiscountEntity(), {\n dataProvider: createShopDiscountDataProvider(resolveProvider),\n feature: 'shop',\n // O cupom vive atrás do provider de commerce, sem tabela que as primitivas\n // de dado do agente alcancem — então a lista empresta o próprio store, como\n // a de produtos faz (ver CrudAgentSurface).\n aiCreate: {\n hint: 'Descreva o cupom…',\n description: 'Descreva a promoção e eu crio o cupom.',\n // O código não se pergunta: ver DISCOUNT_CREATE_INSTRUCTIONS. `code` é\n // único no banco (0001:208), então a lista publica os que já existem e a\n // recusa do índice volta legível se dois turnos escolherem o mesmo.\n instructions: DISCOUNT_CREATE_INSTRUCTIONS,\n uniqueFields: ['code'],\n intro: {\n role: 'operations',\n persona: 'Cupons e promoções',\n pitch: 'Diga a promoção que você quer fazer.',\n description:\n 'Frete grátis, percentual ou valor fixo — diga a regra do jeito que você falaria com um cliente, '\n + 'e eu escrevo o código, o tipo, o mínimo e a validade. Só pergunto o tamanho do desconto quando você não disser.',\n suggestions: [\n { label: 'Frete grátis até o fim da semana' },\n { label: '10% na primeira compra, uma vez por cliente' },\n { label: 'R$ 50 off acima de R$ 300, limite de 100 usos' },\n ],\n },\n },\n stats: (items, total) => [\n { id: 'total', label: 'Total de cupons', value: total, icon: Tag },\n { id: 'active', label: 'Ativos agora', value: items?.filter((d) => d.status === 'active').length ?? 0, icon: Eye },\n { id: 'uses', label: 'Usos', value: items?.reduce((sum, d) => sum + (d.timesUsed ?? 0), 0) ?? 0, icon: TicketCheck },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((d) => d.status === 'draft').length ?? 0, icon: FileEdit },\n ],\n })\n\n // Zonas de entrega NÃO têm mais página própria: viraram registry dentro de\n // Configurações → Entrega (buildShippingZonesRegistry). O EntityDef e o\n // dataProvider continuam os mesmos — só o lugar onde a tela abre mudou, e o\n // que mudou é o que estava errado: clicar em \"Zonas\" no meio de configurar a\n // entrega tirava o lojista de Configurações.\n\n const CategoriesCrudPage = createCrudPage(buildShopCategoryEntity(), {\n dataProvider: createShopCategoryDataProvider(resolveProvider),\n feature: 'shop',\n })\n\n const CollectionsCrudPage = createCrudPage(buildShopCollectionEntity(), {\n dataProvider: createShopCollectionDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => [\n { id: 'total', label: 'Coleções', value: total, icon: Layers },\n { id: 'published', label: 'Publicadas', value: items?.filter((c) => c.published).length ?? 0, icon: Eye },\n { id: 'draft', label: 'Rascunhos', value: items?.filter((c) => !c.published).length ?? 0, icon: FileEdit },\n {\n id: 'members', label: 'Produtos agrupados', icon: Package,\n value: items?.reduce((sum, c) => sum + (c.productIds?.length ?? 0), 0) ?? 0,\n },\n ],\n })\n\n const GiftCardsCrudPage = createCrudPage(buildShopGiftCardEntity(curr.code), {\n dataProvider: createShopGiftCardDataProvider(resolveProvider),\n feature: 'shop',\n stats: (items, total) => {\n const money = (v: number) => formatCurrency(v, curr.code)\n const active = items?.filter((g) => g.status === 'active') ?? []\n return [\n { id: 'total', label: 'Cartões emitidos', value: total, icon: CreditCard },\n { id: 'active', label: 'Ativos', value: active.length, icon: Eye },\n // Saldo em aberto é passivo: dinheiro já recebido que a loja ainda deve\n // em produto. É o número que a conciliação procura aqui.\n {\n id: 'outstanding', label: 'Saldo em aberto', icon: CircleDollarSign,\n value: money(active.reduce((sum, g) => sum + (g.balance ?? 0), 0)),\n },\n {\n id: 'issued', label: 'Valor emitido', icon: TicketCheck,\n value: money(items?.reduce((sum, g) => sum + (g.initialBalance ?? 0), 0) ?? 0),\n },\n ]\n },\n })\n\n const ContentPageWrapped: React.ComponentType<unknown> = () =>\n React.createElement(ContentPage, { resolveProvider: options?.provider })\n ContentPageWrapped.displayName = 'ContentPage'\n\n\n\n\n\n\n\n\n\n // -------------------------------------------------------------------------\n // Nav + routes\n // -------------------------------------------------------------------------\n // Routes are top-level (/products, /orders, /discounts) rather than nested\n // under /shop, because the shell nests nav by route PREFIX and only one level\n // deep: with everything under /shop the whole store collapsed into a single\n // \"Loja\" accordion. Top-level parents give the store its real shape — Pedidos\n // with Clientes under it, Produtos with Coleções and Categorias under it.\n //\n // `indexChild: false` on a parent means the parent is a plain link with\n // children beside it; leaving it on repeats the parent as its own first child\n // (Pedidos ▸ Pedidos · Clientes), which is what a group whose index IS a\n // destination should do.\n const navSection = options?.navSection ?? 'main'\n const navPosition = options?.navPosition ?? 6\n const siteRoute = options?.siteRoute ?? '/site'\n\n type NavEntry = {\n route: string\n label: string\n icon: string\n position: number\n indexChild?: boolean\n component: React.ComponentType<unknown>\n }\n\n const NAV: NavEntry[] = [\n // Pedidos ▸ Pedidos · Clientes\n { route: '/orders', label: label('orders', 'Pedidos'), icon: 'ShoppingBag',\n position: navPosition, component: pageFor('orders') },\n // Sem Clientes aqui: o cadastro padrão já tem linha própria no rail, e uma\n // segunda porta para o mesmo assunto dentro da Loja era a duplicação que a\n // faixa de abas existe para evitar. Grupos e Segmentos continuam da loja,\n // agora pendurados em `/customers`.\n // Produtos ▸ Produtos · Coleções · Categorias\n { route: '/products', label: label('products', 'Produtos'), icon: 'Package',\n position: navPosition + 1, component: ProductsCrudPage as React.ComponentType<unknown> },\n { route: '/products/collections', label: label('collections', 'Coleções'), icon: 'Layers',\n position: navPosition + 1.1, component: CollectionsCrudPage as React.ComponentType<unknown> },\n { route: '/products/categories', label: label('categories', 'Categorias'), icon: 'FolderTree',\n position: navPosition + 1.2, component: CategoriesCrudPage as React.ComponentType<unknown> },\n\n\n // Conteúdo — a biblioteca de arquivos (sem filhos).\n { route: '/content', label: label('content', 'Conteúdo'), icon: 'Image',\n position: navPosition + 2, indexChild: false, component: ContentPageWrapped },\n\n // Descontos ▸ Descontos · Gift Cards\n { route: '/discounts', label: label('discounts', 'Descontos'), icon: 'Tag',\n position: navPosition + 3, component: DiscountsCrudPage as React.ComponentType<unknown> },\n { route: '/discounts/gift-cards', label: label('giftCards', 'Gift Cards'), icon: 'CreditCard',\n position: navPosition + 3.1, component: GiftCardsCrudPage as React.ComponentType<unknown> },\n\n ]\n\n // Reachable but not in the nav.\n // `title` + `parentRoute` são a definição de página: a barra da shell escreve\n // o título e desenha o \"←\" a partir daqui. Sem isso, uma tela fora do menu\n // casava só com o prefixo do pai e era rotulada com o nome dele — \"Pedidos\"\n // numa tela que não é a lista de pedidos —, e cada página acabava desenhando\n // a própria seta de voltar.\n const HIDDEN_ROUTES: Array<{\n path: string\n component: React.ComponentType<unknown>\n title?: string\n parentRoute?: string\n }> = [\n // Reached from the Clientes tab strip, deliberately not from the menu:\n // three sidebar entries for one destination is the duplication the tab\n // strip exists to avoid.\n //\n // Penduradas em `/customers`, e não numa Clientes própria da loja: a ficha\n // de quem compra é UMA — `plg_shop_customers` pendura em `people` por\n // `person_id`, e o cadastro padrão já é a lista canônica. Grupo e segmento\n // são recortes DAQUELAS pessoas, então moram ao lado delas; a loja continua\n // dona das duas telas, só não abre uma segunda porta para o mesmo assunto.\n { path: '/customers/groups', component: CustomerGroupsCrudPage as React.ComponentType<unknown>,\n title: label('customerGroups', 'Grupos'), parentRoute: '/customers' },\n { path: '/customers/segments', component: CustomerSegmentsCrudPage as React.ComponentType<unknown>,\n title: label('customerSegments', 'Segmentos'), parentRoute: '/customers' },\n ]\n\n // Where the store used to live. These REDIRECT rather than mounting the page\n // a second time: a generated CRUD page carries ONE `__crudBasePath`, so\n // mounting the same component at two paths left it with whichever was\n // registered last — and /orders/customers/new then resolved against\n // /customers and silently rendered the list instead of the form.\n const redirectTo = (target: string): React.ComponentType<unknown> => {\n const Redirect: React.ComponentType<unknown> = () => {\n React.useEffect(() => { adminNavigateTo(target) }, [])\n return null\n }\n Redirect.displayName = `Redirect(${target})`\n return Redirect\n }\n\n const LEGACY_ROUTES: Array<{ path: string; component: React.ComponentType<unknown> }> = [\n { path: '/shop', component: redirectTo('/products') },\n { path: '/shop/products', component: redirectTo('/products') },\n { path: '/shop/orders', component: redirectTo('/orders') },\n { path: '/shop/discounts', component: redirectTo('/discounts') },\n // As duas rotas antigas das zonas apontam para onde o cadastro passou a\n // viver. Existem em favorito e em link — tirá-las daria 404 para quem já\n // sabia o caminho.\n // Os dois redirects apontavam para `_properties/zonas`, que deixou de existir\n // quando o id virou slug em inglês — um link antigo caía numa aba vazia. A\n // rota vem do mesmo lugar que a tela usa.\n { path: '/shop/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store/shipping', component: redirectTo(shippingRegistryPath(SHIPPING_ZONES_REGISTRY)) },\n { path: '/store', component: redirectTo(siteRoute) },\n { path: '/shop/channels', component: redirectTo(siteRoute) },\n // A seta virou: `/customers` é do cadastro padrão, que toda conta tem com\n // ou sem loja. Era a loja que sequestrava a linha Clientes do rail — quem\n // clicava no cadastro de fora aterrissava dentro da loja.\n { path: '/orders/customers', component: redirectTo('/customers') },\n // A mensageria da loja virou parte de Automações — mesmos eventos, agora ao\n // lado dos do CRM e da agenda, e com WhatsApp além do e-mail.\n { path: '/emails', component: redirectTo('/automations') },\n { path: '/emails/:event', component: redirectTo('/automations') },\n ]\n\n // O catálogo da vitrine só entra quando o app não tem outro dono de produto.\n // As rotas saem junto com as linhas do rail: uma rota montada fora do menu\n // continua alcançável pela busca e pelo link antigo, e o cadastro duplicado\n // voltaria por ali.\n const withProducts = options?.modules?.products !== false\n const isProductRoute = (route: string) => route === '/products' || route.startsWith('/products/')\n const withOrders = options?.modules?.orders !== false\n const ACTIVE_NAV = NAV.filter((entry) =>\n (withProducts || !isProductRoute(entry.route)) && (withOrders || entry.route !== '/orders'))\n // Explicit, so they outrank any `/orders/:id` another plugin mounts — \"new\"\n // is a screen, not an order whose id happens to be \"new\".\n const ORDER_FORM_ROUTES = [\n { path: '/orders/new', component: pageFor('orders') },\n { path: '/orders/:id/edit', component: pageFor('orders') },\n ]\n // Plain id on purpose: importing it would make the orders plugin a\n // dependency of every shop.\n registerComponent('orders.detail', ShopOrderDetail(options?.provider))\n const ACTIVE_LEGACY = withProducts\n ? LEGACY_ROUTES\n // `/shop` e `/shop/products` apontavam para um destino que deixou de\n // existir; mandar para Pedidos é onde a loja de fato começa sem catálogo.\n : LEGACY_ROUTES.map((r) =>\n r.path === '/shop' || r.path === '/shop/products'\n ? { path: r.path, component: redirectTo('/orders') }\n : r)\n\n const READ: { feature: 'shop'; action: 'read' } = { feature: 'shop', action: 'read' }\n\n return {\n id: 'shop',\n defaultAgentRole: 'operations',\n // O que a loja pede de um tenant novo, na ordem em que faz diferença.\n // Vira linha de tarefa, aparece no checklist da trilha e é o roteiro que o\n // assistente segue — ver ./lib/onboarding.ts.\n onboarding: { program: buildShopOnboarding(siteRoute, withProducts) },\n name: options?.navLabel ?? 'Shop',\n icon: 'ShoppingBag',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n // Storefront/commerce-operator-console surface — targets the ecommerce\n // Panel world, not a saas admin app.\n scaffolds: ['ecommerce'],\n defaultEnabled: true,\n dependencies: [],\n navigation: ACTIVE_NAV.map((entry) => ({\n section: navSection,\n position: entry.position,\n label: entry.label,\n route: entry.route,\n icon: entry.icon,\n permission: READ,\n ...(entry.indexChild === false ? { indexChild: false as const } : {}),\n })),\n routes: [\n ...ACTIVE_NAV.map((entry) => ({ path: entry.route, component: entry.component, permission: READ })),\n ...ORDER_FORM_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...HIDDEN_ROUTES.map((r) => ({ ...r, permission: READ })),\n ...ACTIVE_LEGACY.map((r) => ({ ...r, permission: READ })),\n ],\n widgets: [],\n // Os ~28 cards de varejo. Ficam AQUI porque quem é dono do dado é dono do\n // número: \"vendas por produto\" quer dizer a mesma coisa numa loja e num\n // salão, e o plugin de Análises só sabe desenhar — ele não sabe o que é uma\n // venda. Cada card é ao mesmo tempo um bloco do painel, uma linha da lista\n // de relatórios e um relatório inteiro, então o KPI e o relatório atrás dele\n // não têm como discordar.\n analyticsCards: options?.analyticsCards === false ? [] : buildShopAnalyticsCards(),\n // Os fatos que a loja emite. Lidos por três consumidores — automações,\n // integrações e auditoria — e agregados pelo runtime só quando o plugin\n // está ATIVO, para um módulo desligado não anunciar eventos que não vêm.\n events: buildShopDomainEvents(),\n aiTools: [\n {\n id: 'shop.list-products',\n name: 'listProducts',\n description: 'Lists products in the shop catalog.',\n icon: 'Package',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n search: { type: 'string' as const, description: 'Filter by name' },\n status: { type: 'string' as const, enum: ['draft', 'active', 'archived'] },\n },\n },\n suggestions: [\n { label: 'What products are available?' },\n { label: 'Which products are out of stock?' },\n ],\n },\n {\n id: 'shop.list-orders',\n name: 'listOrders',\n description: 'Lists recent shop orders.',\n icon: 'ShoppingCart',\n mode: 'read' as const,\n category: 'Shop',\n parameters: {\n type: 'object' as const,\n properties: {\n financialStatus: { type: 'string' as const, enum: ['pending', 'paid', 'refunded', 'voided'] },\n fulfillmentStatus: { type: 'string' as const, enum: ['unfulfilled', 'partially_fulfilled', 'fulfilled'] },\n },\n },\n suggestions: [\n { label: 'Show me pending orders' },\n { label: 'How many orders were paid today?' },\n ],\n },\n ],\n // A loja não é UM ajuste. Era uma aba só, «Shop», com moeda, catálogo,\n // checkout e notificações empilhados num scroll — e nenhum deles gravava\n // nada. São cinco decisões de naturezas diferentes: quem cobra, quem pode\n // comprar, quanto custa entregar, quando a remessa nasce, e como a vitrine\n // se apresenta. Cada uma é uma tela, e as cinco se agrupam sob COMMERCE\n // (`group`), que é o que a rail de configurações passou a saber desenhar.\n //\n // `id: 'shop'` fica com a tela geral: /settings/shop é uma URL que já\n // existe, em favoritos e em links, e renumerá-la para ganhar simetria de\n // nomes seria quebrar o que funciona por estética.\n settings: [\n {\n id: 'shop',\n label: label('store', 'Loja'),\n icon: 'ShoppingBag',\n group: COMMERCE_GROUP,\n component: settingsTab('StoreGeneralSettings', () =>\n React.createElement(StoreGeneralSettings, { currency: curr, provider: options?.provider })),\n order: 30,\n permission: READ,\n },\n {\n // Onde a loja vende (0116): moeda, países, filial e frete por mercado.\n id: 'shop-markets',\n label: 'Mercados',\n icon: 'Globe',\n group: COMMERCE_GROUP,\n component: settingsTab('MarketsSettings', () => React.createElement(MarketsSettings, {})),\n order: 30.5,\n permission: READ,\n },\n {\n id: 'shop-payments',\n label: 'Pagamentos',\n icon: 'CreditCard',\n group: COMMERCE_GROUP,\n component: settingsTab('PaymentsSettings', () =>\n React.createElement(PaymentsSettings, { provider: options?.provider })),\n order: 31,\n permission: READ,\n },\n {\n id: 'shop-checkout',\n label: 'Checkout',\n icon: 'ShoppingCart',\n group: COMMERCE_GROUP,\n component: settingsTab('CheckoutSettings', () =>\n React.createElement(CheckoutSettings, { provider: options?.provider })),\n order: 32,\n permission: READ,\n },\n {\n id: 'shop-shipping',\n label: label('shipping', 'Entrega'),\n icon: 'Truck',\n group: COMMERCE_GROUP,\n component: settingsTab('ShippingSettings', () =>\n React.createElement(ShippingSettings, { provider: options?.provider })),\n order: 33,\n permission: READ,\n },\n {\n id: 'shop-fulfillment',\n label: 'Fulfillment',\n icon: 'PackageCheck',\n group: COMMERCE_GROUP,\n component: settingsTab('FulfillmentSettings', () =>\n React.createElement(FulfillmentSettings, { provider: options?.provider })),\n order: 34,\n permission: READ,\n },\n ],\n // The store's stack, configured where the store is configured — zero new\n // screens (commerce-stack.md §0). Melhor Envio, AppMax and AbacatePay are\n // REQUEST-plane connectors: the buyer is waiting, so each declares a latency\n // budget and, because the carrier and the gateways want opposite answers to\n // the same failure, its own `onFailure`. Bling and NeoChef are the SYNC-plane\n // ones — nobody is waiting on them, and what they declare instead is a call\n // budget and a cursor.\n //\n // Four gateways on the shelf is the point: the store picks one, and each\n // one arriving changed no contract — only how it authorizes. Mercado Pago\n // pushes that furthest, because it is the first whose CARD is paid inside\n // the store: it tokenises in the browser, so there is no PAN for an edge\n // function to hold and no redirect to send the buyer through. The shelf\n // absorbed that too, as a capability the checkout reads rather than a branch\n // it hard-codes. NeoChef makes the same point about the back office, and one\n // better: its provider is another Fayz app, and it still fits without a\n // special case.\n connectors: [\n melhorEnvioConnectorDef,\n appmaxConnectorDef,\n abacatePayConnectorDef,\n stripeConnectConnectorDef,\n vindiConnectorDef,\n mercadoPagoConnectorDef,\n blingConnectorDef,\n neoChefConnectorDef,\n ],\n // What having a store makes plugable — the ones above plus the ones still\n // to be built. Carried over from the Fayz plugin page's \"Integra com\" row,\n // minus Nuvemshop: the platform catalogue has no row for it, and a slug the\n // directory cannot back is refused rather than shown.\n integrations: ['shopify', 'stripe'],\n }\n}\n\nexport { blingConnectorDef, blingConnectionStore } from './integrations/bling/connectorDef'\nexport {\n BLING_CONNECTOR_ID,\n BLING_RATE_LIMIT,\n BLING_MAX_WINDOW_MS,\n BLING_WINDOW_OVERLAP_MS,\n BLING_TOKEN_LEAD_MS,\n BLING_PAGE_SIZE,\n BLING_SAMPLE_SIZE,\n BLING_SIGNATURE_HEADER,\n BLING_WEBHOOK_DEADLINE_MS,\n} from './integrations/bling/limits'\nexport { toMirroredProduct } from './integrations/bling/mapping'\nexport {\n pullProducts,\n sampleProducts,\n firstWindow,\n windowFor,\n type PullProductsOptions,\n type PullProductsResult,\n type BlingPageRequest,\n type BlingProductPage,\n} from './integrations/bling/sync'\nexport {\n routeCallback,\n orphanConnection,\n acceptWebhook,\n BLING_MARKETPLACE_SOURCE,\n type BlingCallback,\n type CallbackRoute,\n type WebhookRequest,\n type WebhookVerdict,\n type AcceptWebhookOptions,\n} from './integrations/bling/inbound'\nexport type { BlingProduto, BlingSettings, MirroredProduct } from './integrations/bling/types'\nexport { neoChefConnectorDef, neoChefConnectionStore } from './integrations/neochef/connectorDef'\nexport {\n NEOCHEF_CONNECTOR_ID,\n NEOCHEF_RATE_LIMIT,\n NEOCHEF_PAGE_SIZE,\n NEOCHEF_SAMPLE_SIZE,\n NEOCHEF_CURSOR_OVERLAP_MS,\n NEOCHEF_TOKEN_LEAD_MS,\n} from './integrations/neochef/limits'\nexport { toMirroredNeoChefProduct, toNeoChefOrder, advanceNeoChefCursor } from './integrations/neochef/mapping'\nexport { NEOCHEF_MARK } from './integrations/neochef/mark'\nexport {\n NEOCHEF_FUNCTION,\n pullCatalogue,\n pushOrders,\n reconcile,\n testNeoChef,\n pendingOrders,\n listOrderDeliveries,\n type NeoChefPullResult,\n type NeoChefPushResult,\n} from './integrations/neochef/data'\nexport type {\n NeoChefProductRow,\n NeoChefOrderRow,\n NeoChefSettings,\n MirroredNeoChefProduct,\n ShopOrderForNeoChef,\n} from './integrations/neochef/types'\n\n// The retail pack, exported so an app can curate it — reorder the overview,\n// relabel a card, drop one — by re-declaring an id in the analytics plugin's\n// `cards`, instead of forking the plugin to change one word.\nexport { ProductContentTab } from './views/ProductContentTab'\nimport type { DetailTab } from '@fayz-ai/core'\nimport type { ShopProvider as ShopProviderForTab } from '@fayz-ai/shop'\nimport { ProductContentTab as ProductContentTabView } from './views/ProductContentTab'\n\n/**\n * The \"Conteúdo\" tab for a product record owned by another plugin: the app\n * hands it to that plugin's own tab option. The shop offers; the app composes.\n */\nexport function shopProductContentTab(options: {\n provider: () => ShopProviderForTab\n /** Where the content library lives in this app. */\n libraryHref?: string\n label?: string\n}): DetailTab {\n return {\n id: 'content',\n label: options.label ?? 'Conteúdo',\n icon: 'Image',\n component: ProductContentTabView as never,\n props: { getProvider: options.provider, libraryHref: options.libraryHref ?? '#/content' },\n }\n}\n\nimport { ProductMarketPricesTab as ProductMarketPricesTabView } from './views/ProductMarketPricesTab'\nexport { ProductMarketPricesTab } from './views/ProductMarketPricesTab'\n\n/**\n * The \"Preços por mercado\" tab for a catalogue product owned by another\n * plugin (0116): the product's price in each market, in that market's money.\n */\nexport function shopProductMarketPricesTab(options: {\n provider: () => ShopProviderForTab\n /** Where the markets are managed in this app. */\n settingsHref?: string\n label?: string\n}): DetailTab {\n return {\n id: 'market-prices',\n label: options.label ?? 'Preços por mercado',\n icon: 'Globe',\n component: ProductMarketPricesTabView as never,\n props: { getProvider: options.provider, settingsHref: options.settingsHref ?? '#/settings/shop-markets' },\n }\n}\n\nexport { buildShopAnalyticsCards } from './analytics/cards'\n\n// Re-export shop types so consumer apps only need @fayz-ai/plugin-shop\nexport type {\n Product, Order, ShopCustomer, Discount, Category,\n CreateProductInput, UpdateProductInput, ListProductsOptions,\n CreateOrderInput, UpdateOrderInput, ListOrdersOptions,\n} from '@fayz-ai/shop'\n\n// The store's stack on the request plane. Exported so an app can offer one and\n// not the other, and so the ConnectorsHub in a bespoke admin can render them.\nexport { melhorEnvioConnectorDef, MELHOR_ENVIO_CONNECTOR_ID, MELHOR_ENVIO_LATENCY_BUDGET_MS } from './integrations/melhor-envio/connectorDef'\nexport { appmaxConnectorDef, APPMAX_CONNECTOR_ID, APPMAX_LATENCY_BUDGET_MS } from './integrations/appmax/connectorDef'\nexport { abacatePayConnectorDef, ABACATEPAY_CONNECTOR_ID, ABACATEPAY_LATENCY_BUDGET_MS } from './integrations/abacatepay/connectorDef'\nexport { stripeConnectConnectorDef, STRIPE_CONNECT_CONNECTOR_ID, STRIPE_CONNECT_LATENCY_BUDGET_MS } from './integrations/stripe-connect/connectorDef'\nexport { vindiConnectorDef, VINDI_CONNECTOR_ID, VINDI_LATENCY_BUDGET_MS } from './integrations/vindi/connectorDef'\nexport { mercadoPagoConnectorDef, MERCADOPAGO_CONNECTOR_ID, MERCADOPAGO_LATENCY_BUDGET_MS } from './integrations/mercadopago/connectorDef'\n"]}