{
  "version": 3,
  "sources": ["/cdn/shop/t/19/assets/dd-ai-preview-all-pdp.js?ddv=20260829-human-preview"],
  "sourcesContent": ["(function () {\n  const MAX_ATTEMPTS = 5;\n  const VISITOR_ID_KEY = 'ddAiPreviewVisitorId';\n  const PREVIEW_REFERENCE_KEY = 'ddAiPreviewReference:v1:';\n  const PREVIEW_REFERENCE_TTL = 24 * 60 * 60 * 1000;\n  let cartBackupQueue = Promise.resolve();\n  const ANALYTICS_VERSION = '2';\n  const GA4_MEASUREMENT_ID = 'G-WN0SELMF2M';\n  const CONFIG_CACHE = new Map();\n  const LOADING_STEPS = [\n    {\n      title: 'Reading your pet photo',\n      copy: 'Finding the face, ears, muzzle, and markings that make your pet recognizable.',\n      status: 'Reading your pet photo...',\n      progress: 16\n    },\n    {\n      title: 'Finding the face details',\n      copy: 'Checking the photo before we draw so the preview stays close to your pet.',\n      status: 'Finding your pet\u2019s face details...',\n      progress: 30\n    },\n    {\n      title: 'Drawing custom line art',\n      copy: 'Our AI artist is sketching a clean portrait from your uploaded photo.',\n      status: 'Drawing your custom pet line art...',\n      progress: 52\n    },\n    {\n      title: 'Placing it on your product',\n      copy: 'Positioning the artwork on this item and print placement.',\n      status: 'Placing the artwork on this product...',\n      progress: 70\n    },\n    {\n      title: 'Checking the artwork',\n      copy: 'Still working \u2014 detailed fur, darker photos, or close crops can take a little longer.',\n      status: 'Still working. Checking the artwork before we show it...',\n      progress: 84\n    },\n    {\n      title: 'Almost there',\n      copy: 'Final quality check. Please keep this page open while we prepare your preview.',\n      status: 'Almost there. Preparing your preview...',\n      progress: 93\n    }\n  ];\n\n  function analyticsProcessingAllowed() {\n    try {\n      const privacy = window.Shopify && window.Shopify.customerPrivacy;\n      return !privacy ||\n        typeof privacy.analyticsProcessingAllowed !== 'function' ||\n        privacy.analyticsProcessingAllowed();\n    } catch (error) {\n      return false;\n    }\n  }\n\n  function ensureGa4() {\n    if (!analyticsProcessingAllowed()) return false;\n    window.dataLayer = window.dataLayer || [];\n    if (typeof window.gtag !== 'function') {\n      window.gtag = function () {\n        window.dataLayer.push(arguments);\n      };\n    }\n    if (!window.ddAiPreviewGa4Initialized) {\n      window.ddAiPreviewGa4Initialized = true;\n    }\n    return true;\n  }\n\n  function track(eventName, detail) {\n    const payload = Object.assign({\n      event_category: 'ai_preview',\n      funnel_version: ANALYTICS_VERSION\n    }, detail || {});\n    try {\n      if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {\n        window.Shopify.analytics.publish(eventName, payload);\n      }\n      if (ensureGa4()) {\n        window.gtag('event', eventName, Object.assign({\n          send_to: GA4_MEASUREMENT_ID\n        }, payload));\n      }\n    } catch (error) {\n      console.warn('Dilly AI preview analytics emit failed', error);\n    }\n    document.dispatchEvent(new CustomEvent(eventName, { detail: payload }));\n  }\n\n  function fileSizeBucket(bytes) {\n    if (bytes < 1024 * 1024) return 'under_1mb';\n    if (bytes < 4 * 1024 * 1024) return '1_to_4mb';\n    if (bytes <= 8 * 1024 * 1024) return '4_to_8mb';\n    return 'over_8mb';\n  }\n\n  function generationFailureType(error) {\n    const message = String(error && error.message || error || '').toLowerCase();\n    if (message.includes('429') || message.includes('rate limit') || message.includes('preview limit')) return 'rate_limited';\n    if (message.includes('taking longer') || message.includes('timeout') || message.includes('aborted')) return 'timeout';\n    if (message.includes('form was not ready')) return 'product_form_unavailable';\n    if (\n      message.includes('clear photo') ||\n      message.includes('single pet') ||\n      message.includes('not a pet') ||\n      message.includes('pet photo') ||\n      message.includes('face visible')\n    ) return 'photo_rejected';\n    if (\n      message.includes('did not respond') ||\n      message.includes('lost the connection') ||\n      message.includes('load failed') ||\n      message.includes('failed to fetch') ||\n      message.includes('network')\n    ) return 'network_error';\n    if (\n      message.includes('temporarily unavailable') ||\n      message.includes('returned 500') ||\n      message.includes('returned 502') ||\n      message.includes('returned 503') ||\n      message.includes('returned 504')\n    ) return 'service_unavailable';\n    return 'unknown';\n  }\n\n  function getVisitorId() {\n    try {\n      let visitorId = window.localStorage.getItem(VISITOR_ID_KEY);\n      if (!visitorId) {\n        visitorId = window.crypto && window.crypto.randomUUID\n          ? window.crypto.randomUUID()\n          : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n        window.localStorage.setItem(VISITOR_ID_KEY, visitorId);\n      }\n      return visitorId;\n    } catch (error) {\n      return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n    }\n  }\n\n  function fileToDataUrl(file) {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(String(reader.result || ''));\n      reader.onerror = () => reject(reader.error || new Error('Could not read file'));\n      reader.readAsDataURL(file);\n    });\n  }\n\n  function previewServiceBaseUrl(endpoint) {\n    return String(endpoint || '').replace(/\\/+(preview|api\\/dilly\\/preview)?\\/?$/, '');\n  }\n\n  function previewApiUrl(endpoint) {\n    return `${previewServiceBaseUrl(endpoint)}/preview`;\n  }\n\n  function previewUnlockApiUrl(endpoint) {\n    return `${previewServiceBaseUrl(endpoint)}/preview-unlock`;\n  }\n\n  function warmPreviewService(endpoint) {\n    const healthUrl = `${previewServiceBaseUrl(endpoint)}/health`;\n    fetch(healthUrl, { method: 'GET', mode: 'cors', cache: 'no-store' }).catch(() => {});\n  }\n\n  async function previewResponse(url, options, timeoutMs) {\n    const controller = new AbortController();\n    const timeout = window.setTimeout(() => controller.abort(), timeoutMs);\n    try {\n      const response = await fetch(url, Object.assign({}, options, { signal: controller.signal }));\n      const result = await response.json();\n      return { httpStatus: response.status, result };\n    } finally {\n      window.clearTimeout(timeout);\n    }\n  }\n\n  function completedPreview(response) {\n    if (!response) return null;\n    const result = response.result || {};\n    if (response.httpStatus === 200 && result.ok && result.ai_preview_url) return result;\n    if (result.status === 'failed' || result.status === 'rate_limited' ||\n        [400, 403, 409, 429].includes(response.httpStatus)) {\n      const error = new Error(result.error || 'The preview could not finish. You can continue with an artist proof.');\n      error.previewTerminal = true;\n      throw error;\n    }\n    return null;\n  }\n\n  async function requestPreview(endpoint, payload) {\n    const bytes = crypto.getRandomValues(new Uint8Array(32));\n    const requestId = Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n    const body = JSON.stringify(Object.assign({}, payload, { request_id: requestId }));\n    const deadline = Date.now() + 300000;\n    const post = () => previewResponse(previewApiUrl(endpoint), {\n      method: 'POST', headers: { 'Content-Type': 'application/json' }, body\n    }, 45000);\n    try {\n      const result = completedPreview(await post());\n      if (result) return result;\n    } catch (error) {\n      if (error.previewTerminal) throw error;\n    }\n\n    let uploadRetried = false;\n    while (Date.now() < deadline) {\n      await new Promise((resolve) => window.setTimeout(resolve, 3000));\n      try {\n        const response = await previewResponse(\n          `${previewServiceBaseUrl(endpoint)}/preview-status/${requestId}`,\n          { method: 'GET', cache: 'no-store' }, 8000\n        );\n        const result = completedPreview(response);\n        if (result) return result;\n        if (response.httpStatus === 404 && !uploadRetried) {\n          uploadRetried = true;\n          const retriedResult = completedPreview(await post());\n          if (retriedResult) return retriedResult;\n        }\n      } catch (error) {\n        if (error.previewTerminal) throw error;\n      }\n    }\n    throw new Error('We lost the connection while making your preview. Please try again, or continue with your photo for an artist proof.');\n  }\n\n  async function requestPreviewUnlock(endpoint, payload) {\n    const controller = new AbortController();\n    const timeout = window.setTimeout(() => controller.abort(), 8000);\n    try {\n      const response = await fetch(previewUnlockApiUrl(endpoint), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(payload),\n        signal: controller.signal\n      });\n      const responseText = await response.text();\n      let result = {};\n      try {\n        result = responseText ? JSON.parse(responseText) : {};\n      } catch (error) {\n        result = {};\n      }\n      if (response.ok && result.ok) return result;\n      throw new Error(result.error || `Preview unlock returned ${response.status}`);\n    } finally {\n      window.clearTimeout(timeout);\n    }\n  }\n\n  function emailLooksValid(email) {\n    return /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(String(email || '').trim());\n  }\n\n  function utmFields() {\n    const out = {};\n    try {\n      const params = new URLSearchParams(window.location.search || '');\n      ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'].forEach((key) => {\n        const value = params.get(key);\n        if (value) out[key] = value.slice(0, 220);\n      });\n    } catch (error) {}\n    return out;\n  }\n\n  function readCookie(name) {\n    const prefix = `${name}=`;\n    const item = String(document.cookie || '')\n      .split(';')\n      .map((part) => part.trim())\n      .find((part) => part.startsWith(prefix));\n    return item ? decodeURIComponent(item.slice(prefix.length)).slice(0, 220) : '';\n  }\n\n  function metaAttributionFields() {\n    const allowed = analyticsProcessingAllowed();\n    if (!allowed) return { analytics_consent: false };\n    const fields = { analytics_consent: true };\n    const fbp = readCookie('_fbp');\n    const fbc = readCookie('_fbc');\n    if (fbp) fields.fbp = fbp;\n    if (fbc) fields.fbc = fbc;\n    return fields;\n  }\n\n  function previewUnlockPayload(module, result, email, consentText) {\n    const placement = currentPlacement(module);\n    return Object.assign({\n      email,\n      marketing_consent: true,\n      consent_text: consentText,\n      job_id: result.job_id || '',\n      visitor_id: getVisitorId(),\n      product_handle: module.dataset.productHandle || '',\n      product_title: module.dataset.productTitle || '',\n      variant_id: getVariantId(module),\n      print_location: result.print_location_label || (placement && placement.label) || '',\n      ai_preview_url: result.ai_preview_url || '',\n      production_art_url: result.production_art_url || result.line_art_url || '',\n      pet_photo_url: result.pet_photo_url || result.dog_photo_url || '',\n      page_url: window.location.href\n    }, utmFields(), metaAttributionFields());\n  }\n\n  function normalizeId(value) {\n    return String(value || '').split('/').pop();\n  }\n\n  async function loadConfig(url) {\n    if (!url) return null;\n    if (!CONFIG_CACHE.has(url)) {\n      CONFIG_CACHE.set(url, fetch(url, { credentials: 'same-origin' }).then((response) => {\n        if (!response.ok) throw new Error('Preview product configuration could not be loaded');\n        return response.json();\n      }));\n    }\n    return CONFIG_CACHE.get(url);\n  }\n\n  function getProductForm(module) {\n    const scope = module.closest('product-info') || document;\n    const forms = Array.from(scope.querySelectorAll('form[action*=\"/cart/add\"]'));\n    return forms.find((form) => form.querySelector('button[name=\"add\"], [type=\"submit\"][name=\"add\"]')) ||\n      scope.querySelector('product-form form[action*=\"/cart/add\"]') ||\n      forms[0] ||\n      document.querySelector('product-form form[action*=\"/cart/add\"], form[action*=\"/cart/add\"]');\n  }\n\n  function getVariantId(module) {\n    const form = getProductForm(module);\n    const input = form && form.querySelector('[name=\"id\"]');\n    return normalizeId(input ? input.value : module.dataset.variantId);\n  }\n\n  function productConfig(module) {\n    const all = module.ddAiPreviewConfig;\n    return all && all.products && all.products[module.dataset.productHandle];\n  }\n\n  function variantConfig(module) {\n    const product = productConfig(module);\n    if (!product) return null;\n    const variantId = getVariantId(module);\n    return (product.variants && product.variants[variantId]) ||\n      (product.variants && product.variants[String(product.default_variant_id || '')]) ||\n      null;\n  }\n\n  function placements(module) {\n    const product = productConfig(module);\n    return product && Array.isArray(product.placements) && product.placements.length\n      ? product.placements\n      : [];\n  }\n\n  function currentPlacement(module) {\n    const checked = module.querySelector('[data-dd-preview-placement-input]:checked');\n    const available = placements(module);\n    if (checked) {\n      const found = available.find((placement) => placement.key === checked.value || placement.label === checked.value);\n      if (found) return found;\n    }\n    return available[0] || null;\n  }\n\n  function currentMockupUrl(module) {\n    const variant = variantConfig(module);\n    const product = productConfig(module);\n    return (variant && variant.mockup_url) || (product && product.default_mockup_url) || '';\n  }\n\n  function renderPlacementChoices(module, keepKey) {\n    const fieldset = module.querySelector('[data-dd-preview-placement]');\n    const container = module.querySelector('[data-dd-preview-placement-options]');\n    const available = placements(module);\n    if (!fieldset || !container || !available.length) return;\n    fieldset.hidden = available.length <= 1;\n    const selectedKey = keepKey && available.some((placement) => placement.key === keepKey)\n      ? keepKey\n      : available[0].key;\n    container.innerHTML = available.map((placement, index) => `\n      <label class=\"dd-ai-preview__placement-choice\">\n        <input\n          type=\"radio\"\n          name=\"dd-ai-preview-placement-${module.dataset.sectionId || 'main'}\"\n          value=\"${placement.key}\"\n          data-dd-preview-placement-input\n          ${placement.key === selectedKey || (!selectedKey && index === 0) ? 'checked' : ''}\n        >\n        <span>${placement.label}<small>${placement.help || 'Preview placement'}</small></span>\n      </label>\n    `).join('');\n  }\n\n  function gpoPlacementValue(module, placement) {\n    if (!placement) return '';\n    const scope = module.closest('product-info') || document;\n    const choices = Array.from(scope.querySelectorAll('input[name=\"radio-1\"]'));\n    if (choices.some((input) => input.value === placement.label)) return placement.label;\n    if (placements(module).length === 1 && placement.key === 'front' &&\n        choices.some((input) => input.value === 'N/A')) return 'N/A';\n    return placement.label;\n  }\n\n  function syncGpoPrintLocation(module, placement, attempt, requestId) {\n    if (!placement || !placement.label) return false;\n    if (!attempt) {\n      requestId = (module.ddAiPlacementSyncRequest || 0) + 1;\n      module.ddAiPlacementSyncRequest = requestId;\n    }\n    if (requestId !== module.ddAiPlacementSyncRequest) return false;\n    const scope = module.closest('product-info') || document;\n    const value = gpoPlacementValue(module, placement);\n    const input = Array.from(scope.querySelectorAll('input[name=\"radio-1\"]'))\n      .find((candidate) => candidate.value === value);\n    if (input) {\n      if (!input.checked) {\n        input.click();\n        input.dispatchEvent(new Event('input', { bubbles: true }));\n        input.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      return true;\n    }\n    if ((attempt || 0) < 10) {\n      window.setTimeout(() => syncGpoPrintLocation(module, placement, (attempt || 0) + 1, requestId), 350);\n    }\n    return false;\n  }\n\n  function syncGpoFieldBypass(module, attempt, options) {\n    const bypassPhoto = Boolean(options && options.photo);\n    const hidePhoto = Boolean(options && options.hidePhoto);\n    const bypassPlacement = !options || options.placement !== false;\n    const scope = module.closest('product-info') || document;\n    const fileInput = scope.querySelector(\n      'input.gpo-file[name=\"Pet-image\"], input#file-1[name=\"Pet-image\"], input[data-dd-native-photo]'\n    );\n    if (fileInput) {\n      const field = fileInput.closest('.gpo-element, [data-dd-native-photo-field]') || fileInput.parentElement;\n      const wasBypassed = fileInput.dataset.ddAiPreviewBypassed === 'true';\n      if (!('ddAiPreviewHadPresence' in fileInput.dataset)) {\n        fileInput.dataset.ddAiPreviewHadPresence = fileInput.hasAttribute('presence') ? 'true' : 'false';\n        fileInput.dataset.ddAiPreviewWasDisabled = fileInput.disabled ? 'true' : 'false';\n      }\n\n      if (bypassPhoto) {\n        fileInput.dataset.ddAiPreviewBypassed = 'true';\n        fileInput.removeAttribute('presence');\n        fileInput.required = false;\n        fileInput.disabled = true;\n        if (field) {\n          field.classList.remove('has-error');\n          field.querySelectorAll('.messages .help-block.error').forEach((error) => error.remove());\n        }\n      } else if (wasBypassed) {\n        delete fileInput.dataset.ddAiPreviewBypassed;\n        if (fileInput.dataset.ddAiPreviewHadPresence === 'true') {\n          fileInput.setAttribute('presence', '');\n        }\n        fileInput.disabled = fileInput.dataset.ddAiPreviewWasDisabled === 'true';\n      }\n\n      if (field && (hidePhoto || bypassPhoto)) {\n        field.classList.add('dd-ai-preview__gpo-photo-hidden');\n        field.setAttribute('aria-hidden', 'true');\n      } else if (field) {\n        field.classList.remove('dd-ai-preview__gpo-photo-hidden');\n        field.removeAttribute('aria-hidden');\n      }\n\n      if (wasBypassed !== bypassPhoto) {\n        // Globo caches its validation constraints. A change event forces it to\n        // rebuild them after the custom `presence` requirement changes.\n        fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n    }\n\n    const printInput = scope.querySelector('input[name=\"radio-1\"][value=\"Left Chest\"], input[name=\"radio-1\"][value=\"Big Center Print\"]');\n    if (printInput) {\n      const field = printInput.closest('.gpo-element') || printInput.parentElement;\n      if (field && bypassPlacement) {\n        field.classList.add('dd-ai-preview__gpo-placement-bypassed');\n        field.setAttribute('aria-hidden', 'true');\n      } else if (field) {\n        field.classList.remove('dd-ai-preview__gpo-placement-bypassed');\n        field.removeAttribute('aria-hidden');\n      }\n    }\n\n    if ((bypassPhoto || hidePhoto || bypassPlacement) && !fileInput && (attempt || 0) < 12) {\n      window.setTimeout(() => syncGpoFieldBypass(module, (attempt || 0) + 1, options), 350);\n    }\n  }\n\n  function syncAiPlacementFromGpo(module, value) {\n    if (!value) return;\n    const placement = placements(module).find((item) => item.label === value || item.key === value || gpoPlacementValue(module, item) === value);\n    if (!placement) return;\n    const input = Array.from(module.querySelectorAll('[data-dd-preview-placement-input]'))\n      .find((candidate) => candidate.value === placement.key);\n    if (!input || input.checked) return;\n    input.checked = true;\n    input.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n\n  function repairGpoRadioClicks(module, scope) {\n    let latestChoice = 0;\n    scope.addEventListener('click', (event) => {\n      const target = event.target;\n      if (!target || !target.closest) return;\n      const choice = target.closest('.gpo-choicelist');\n      if (!choice || !scope.contains(choice)) return;\n      const input = choice.querySelector('input[type=\"radio\"][name=\"radio-1\"]');\n      if (!input || input.disabled) return;\n      const choiceId = ++latestChoice;\n      module.ddAiPlacementSyncRequest = (module.ddAiPlacementSyncRequest || 0) + 1;\n      const applyChoice = () => {\n        if (choiceId !== latestChoice || !scope.contains(input)) return;\n        input.checked = true;\n        input.dispatchEvent(new Event('input', { bubbles: true }));\n        input.dispatchEvent(new Event('change', { bubbles: true }));\n        syncAiPlacementFromGpo(module, input.value);\n      };\n      applyChoice();\n      window.setTimeout(applyChoice, 0);\n      window.setTimeout(applyChoice, 120);\n    }, { capture: true });\n  }\n\n  function setLineProperty(form, name, value) {\n    let input = form.querySelector(`input[name=\"properties[${name}]\"]`);\n    if (!input) {\n      input = document.createElement('input');\n      input.type = 'hidden';\n      input.name = `properties[${name}]`;\n      input.setAttribute('data-dd-ai-preview-property', 'true');\n      form.appendChild(input);\n    }\n    input.value = value || '';\n  }\n\n  function rememberPreviewReference(module, result) {\n    const reference = {\n      saved_at: Date.now(),\n      product_handle: module.dataset.productHandle || '',\n      result: Object.assign({}, result)\n    };\n    module.ddAiPreviewReference = reference;\n    try {\n      sessionStorage.setItem(PREVIEW_REFERENCE_KEY + reference.product_handle, JSON.stringify(reference));\n    } catch (error) {\n      // The current page still keeps its reference when browser storage is unavailable.\n    }\n  }\n\n  function cartPreviewAttributes(module, result) {\n    const handle = module.dataset.productHandle || '';\n    const artwork = result.production_art_url || result.line_art_url || '';\n    if (!handle || !result.job_id || !result.ai_preview_url || !artwork) {\n      throw new Error('Preview backup is missing its artwork or product reference');\n    }\n    const backupKey = `${handle} | ${result.job_id}`;\n    const reference = module.ddAiPreviewReference;\n    const savedAt = reference && reference.result.job_id === result.job_id ? reference.saved_at : Date.now();\n    return {\n      [`__AI Preview (${backupKey})`]: result.ai_preview_url,\n      [`__AI Line Art PNG (${backupKey})`]: artwork,\n      [`__AI Source Photo (${backupKey})`]: result.pet_photo_url || result.dog_photo_url || '',\n      [`__AI Preview Details (${backupKey})`]: [\n        `Product: ${handle}`,\n        `Job: ${result.job_id}`,\n        `Generated: ${new Date(savedAt).toISOString()}`,\n        `Preview variant: ${result.preview_variant_id || ''}`,\n        `Placement: ${result.print_location_label || ''}`,\n        'Shopping reference only. Photo/options may differ from the order. Customer proof approval required before printing.'\n      ].join(' | ')\n    };\n  }\n\n  function savePreviewToCart(module, result, force) {\n    if (!force && module.ddAiPreviewCartSavedJob === result.job_id) return Promise.resolve();\n    if (module.ddAiPreviewCartSave && module.ddAiPreviewCartSaveJob === result.job_id) {\n      return module.ddAiPreviewCartSave;\n    }\n    const save = cartBackupQueue.catch(() => {}).then(async () => {\n      const attributes = cartPreviewAttributes(module, result);\n      const root = window.Shopify && window.Shopify.routes && window.Shopify.routes.root || '/';\n      for (let attempt = 0; attempt < 3; attempt += 1) {\n        const controller = new AbortController();\n        const timeout = window.setTimeout(() => controller.abort(), 5000);\n        try {\n          const response = await fetch(`${root}cart/update.js`, {\n            method: 'POST', credentials: 'same-origin', keepalive: true,\n            headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n            body: JSON.stringify({ attributes }), signal: controller.signal\n          });\n          if (!response.ok) throw new Error('Shopify could not save the preview backup');\n          const cart = await response.json();\n          if (!cart || typeof cart.token !== 'string') throw new Error('Shopify did not confirm the cart backup');\n          // Private attributes are intentionally absent from Ajax response JSON.\n          module.ddAiPreviewCartSavedJob = result.job_id;\n          return;\n        } catch (error) {\n          if (attempt === 2) throw error;\n        } finally {\n          window.clearTimeout(timeout);\n        }\n        await new Promise((resolve) => window.setTimeout(resolve, 250 * (attempt + 1)));\n      }\n    });\n    module.ddAiPreviewCartSaveJob = result.job_id;\n    module.ddAiPreviewCartSave = save;\n    cartBackupQueue = save.catch(() => {});\n    const finished = () => {\n      if (module.ddAiPreviewCartSave === save) module.ddAiPreviewCartSave = null;\n    };\n    save.then(finished, finished);\n    return save;\n  }\n\n  function ensureCartBackup(module, result, force) {\n    if (!result || (!force && module.ddAiPreviewCartSavedJob === result.job_id)) return;\n    const accepted = module.querySelector('[data-dd-preview-accepted]');\n    let retry = module.querySelector('[data-dd-preview-save-retry]');\n    if (!retry && accepted) {\n      retry = document.createElement('button');\n      retry.type = 'button';\n      retry.className = 'dd-ai-preview__manual';\n      retry.dataset.ddPreviewSaveRetry = 'true';\n      retry.textContent = 'Retry saving preview';\n      retry.addEventListener('click', () => {\n        const reference = module.ddAiPreviewReference;\n        ensureCartBackup(module, module.ddAiPreviewLatestResult || (reference && reference.result));\n      });\n      accepted.after(retry);\n    }\n    if (retry) retry.hidden = true;\n    const current = () => module.ddAiPreviewReference && module.ddAiPreviewReference.result.job_id === result.job_id;\n    if (accepted && current()) accepted.textContent = 'Saving your preview with your cart...';\n    savePreviewToCart(module, result, force).then(() => {\n      if (!current()) return;\n      if (retry) retry.hidden = true;\n      if (accepted) accepted.textContent = 'Your preview and line art are saved with your cart. You will still approve a final proof before printing.';\n      track('dd_ai_preview_order_backup_saved', { product_handle: module.dataset.productHandle, job_id: result.job_id });\n    }).catch(() => {\n      if (!current()) return;\n      if (retry) retry.hidden = false;\n      if (accepted) accepted.textContent = \"Your preview is ready, but its order backup hasn't saved. Please retry.\";\n      track('dd_ai_preview_order_backup_failed', { product_handle: module.dataset.productHandle, job_id: result.job_id });\n    });\n  }\n\n  function restorePreviewReference(module) {\n    try {\n      const handle = module.dataset.productHandle || '';\n      const key = PREVIEW_REFERENCE_KEY + handle;\n      const reference = JSON.parse(sessionStorage.getItem(key) || 'null');\n      if (reference && reference.product_handle === handle &&\n          reference.saved_at <= Date.now() && Date.now() - reference.saved_at < PREVIEW_REFERENCE_TTL &&\n          reference.result && reference.result.job_id && reference.result.ai_preview_url) {\n        module.ddAiPreviewReference = reference;\n      } else {\n        sessionStorage.removeItem(key);\n      }\n    } catch (error) {\n      // A missing or invalid saved reference must never block a normal order.\n    }\n  }\n\n  function attachPreviewReference(module) {\n    const form = getProductForm(module);\n    const reference = module.ddAiPreviewReference;\n    if (!form) return;\n    if (!reference || Date.now() - reference.saved_at >= PREVIEW_REFERENCE_TTL) {\n      form.querySelectorAll('[data-dd-ai-preview-property]').forEach((input) => {\n        if (input.name.startsWith('properties[_AI ')) input.remove();\n      });\n      return;\n    }\n    const result = reference.result;\n    // Historical previews remain available to the artist, never as a selected design.\n    setLineProperty(form, '_AI Preview Reference', result.ai_preview_url || '');\n    setLineProperty(form, '_AI Artwork Reference PNG', result.production_art_url || result.line_art_url || '');\n    setLineProperty(form, '_AI Preview Source Photo', result.pet_photo_url || result.dog_photo_url || '');\n    setLineProperty(form, '_AI Preview Reference Job', result.job_id || '');\n    setLineProperty(form, '_AI Preview Reference Variant', result.preview_variant_id || '');\n    setLineProperty(form, '_AI Preview Reference Placement', result.print_location_label || '');\n    setLineProperty(form, '_AI Preview Reference Status', 'Reference only: photo or product options may differ. Confirm with customer; approval required before production.');\n  }\n\n  function clearLineProperties(module) {\n    const form = getProductForm(module);\n    if (!form) {\n      updatePreviewJump(module);\n      return;\n    }\n    form.querySelectorAll('[data-dd-ai-preview-property]').forEach((input) => input.remove());\n    attachPreviewReference(module);\n    updatePreviewJump(module);\n  }\n\n  function attachProperties(module, result) {\n    const form = getProductForm(module);\n    if (!form) {\n      updatePreviewJump(module);\n      return false;\n    }\n    form.querySelectorAll('[data-dd-ai-preview-property]').forEach((input) => input.remove());\n    const placement = currentPlacement(module);\n    setLineProperty(form, 'Reference Photo', result.pet_photo_url || result.dog_photo_url || '');\n    setLineProperty(form, 'AI Preview', result.ai_preview_url || '');\n    setLineProperty(form, '_Production Artwork PNG', result.production_art_url || result.line_art_url || '');\n    setLineProperty(form, '_Preview Job ID', result.job_id || '');\n    setLineProperty(form, '_Preview Status', result.status || 'complete');\n    setLineProperty(form, '_Artwork Approval', 'Customer proof approval required before production.');\n    setLineProperty(form, '_Preview Print Location', result.print_location_label || (placement && placement.label) || '');\n    setLineProperty(form, '_Preview Product Mockup', result.preview_mockup_url || currentMockupUrl(module));\n    setLineProperty(form, '_Product Handle', module.dataset.productHandle || '');\n    setLineProperty(form, '_Variant ID', getVariantId(module));\n    syncGpoPrintLocation(module, placement);\n    syncGpoFieldBypass(module, 0, { photo: true, placement: true });\n    updatePreviewJump(module);\n    return true;\n  }\n\n  function showError(module, message) {\n    hideLoadingPanel(module);\n    module.querySelector('[data-dd-preview-error]').textContent = message;\n    module.querySelector('[data-dd-preview-status]').textContent = '';\n  }\n\n  function clearError(module) {\n    module.querySelector('[data-dd-preview-error]').textContent = '';\n  }\n\n  function loadingElements(module) {\n    return {\n      panel: module.querySelector('[data-dd-preview-loader]'),\n      title: module.querySelector('[data-dd-preview-loader-title]'),\n      copy: module.querySelector('[data-dd-preview-loader-copy]'),\n      progress: module.querySelector('[data-dd-preview-loader-progress]'),\n      steps: Array.from(module.querySelectorAll('[data-dd-preview-loader-step]')),\n      note: module.querySelector('[data-dd-preview-loader-note]'),\n      status: module.querySelector('[data-dd-preview-status]')\n    };\n  }\n\n  function setLoadingStep(module, index) {\n    const loader = loadingElements(module);\n    const stepIndex = Math.max(0, Math.min(index, LOADING_STEPS.length - 1));\n    const step = LOADING_STEPS[stepIndex];\n    if (loader.title) loader.title.textContent = step.title;\n    if (loader.copy) loader.copy.textContent = step.copy;\n    if (loader.status) loader.status.textContent = step.status;\n    if (loader.progress) loader.progress.style.width = `${step.progress}%`;\n    loader.steps.forEach((item, itemIndex) => {\n      item.classList.toggle('is-complete', itemIndex < Math.min(stepIndex, 4));\n      item.classList.toggle('is-active', itemIndex === Math.min(stepIndex, 4));\n    });\n    if (loader.note) {\n      loader.note.textContent = stepIndex >= 4\n        ? 'Some previews take a little longer because we check the artwork before showing it.'\n        : 'Allow 1 to 3 minutes for your preview. Detailed photos can take longer.';\n    }\n  }\n\n  function loadingStepForElapsed(elapsedMs) {\n    if (elapsedMs >= 50000) return 5;\n    if (elapsedMs >= 30000) return 4;\n    if (elapsedMs >= 18000) return 3;\n    if (elapsedMs >= 9000) return 2;\n    if (elapsedMs >= 4000) return 1;\n    return 0;\n  }\n\n  function showLoadingPanel(module) {\n    const loader = loadingElements(module);\n    if (!loader.panel) return;\n    loader.panel.hidden = false;\n    setLoadingStep(module, 0);\n    safeScrollIntoView(loader.panel);\n  }\n\n  function hideLoadingPanel(module) {\n    const loader = loadingElements(module);\n    if (loader.panel) loader.panel.hidden = true;\n    if (loader.progress) loader.progress.style.width = '14%';\n    loader.steps.forEach((item) => {\n      item.classList.remove('is-active', 'is-complete');\n    });\n  }\n\n  function setBusy(module, busy) {\n    module.querySelectorAll('button').forEach((button) => {\n      if (button.hasAttribute('data-dd-preview-replace')) return;\n      button.disabled = busy;\n    });\n    const generateButton = module.querySelector('[data-dd-preview-generate]');\n    if (generateButton) {\n      if (!generateButton.dataset.idleText) generateButton.dataset.idleText = generateButton.textContent.trim();\n      generateButton.textContent = busy ? 'Creating Preview\u2026' : generateButton.dataset.idleText;\n    }\n    module.setAttribute('aria-busy', busy ? 'true' : 'false');\n  }\n\n  function safeScrollIntoView(element) {\n    if (!element || !element.scrollIntoView) return;\n    window.setTimeout(() => {\n      element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n    }, 120);\n  }\n\n  function updatePreviewJump(module) {\n    const scope = module.closest('product-info') || document;\n    const jump = scope.querySelector('[data-dd-preview-jump]');\n    if (!jump) return;\n    const form = getProductForm(module);\n    const result = module.ddAiPreviewLatestResult;\n    const property = (name) => form && form.querySelector(`input[name=\"properties[${name}]\"]`);\n    const photo = property('Reference Photo');\n    const preview = property('AI Preview');\n    const job = property('_Preview Job ID');\n    const attached = Boolean(result && result.job_id && photo && photo.value &&\n      photo.value === (result.pet_photo_url || result.dog_photo_url) &&\n      preview && preview.value && preview.value === result.ai_preview_url &&\n      job && job.value === result.job_id);\n    const heading = jump.querySelector('strong');\n    const detail = jump.querySelector('small');\n    jump.dataset.previewAttached = String(attached);\n    if (heading) heading.textContent = attached ? 'Photo and AI preview added' : 'Want to see it first?';\n    if (detail) detail.textContent = attached ? 'Review or change your preview.' : 'Try the free preview before you order.';\n  }\n\n  function placePreviewJumpNearPhoto(module, attempt) {\n    const shell = module.closest('[data-dd-preview-shell]');\n    const scope = module.closest('product-info') || document;\n    const fileInput = scope.querySelector(\n      'input.gpo-file[name=\"Pet-image\"], input#file-1[name=\"Pet-image\"], input[data-dd-native-photo]'\n    );\n    const field = fileInput && (fileInput.closest('.gpo-element, [data-dd-native-photo-field]') || fileInput.parentElement);\n\n    if (!shell || !field || !field.parentElement) {\n      if ((attempt || 0) < 16) {\n        window.setTimeout(() => placePreviewJumpNearPhoto(module, (attempt || 0) + 1), 350);\n      }\n      return false;\n    }\n\n    const existing = scope.querySelector('[data-dd-preview-jump]');\n    if (existing) {\n      updatePreviewJump(module);\n      return true;\n    }\n\n    const jump = document.createElement('button');\n    jump.type = 'button';\n    jump.className = 'dd-ai-preview-jump';\n    jump.dataset.ddPreviewJump = 'true';\n    jump.setAttribute('aria-controls', shell.id || 'dilly-ai-preview');\n\n    const icon = shell.querySelector('.dd-ai-preview-shell__icon');\n    if (icon) jump.appendChild(icon.cloneNode(true));\n\n    const copy = document.createElement('span');\n    copy.className = 'dd-ai-preview-jump__copy';\n    copy.innerHTML = '<strong>Want to see it first?</strong><small>Try the free preview before you order.</small>';\n    jump.appendChild(copy);\n\n    const caret = shell.querySelector('.dd-ai-preview-shell__caret');\n    if (caret) jump.appendChild(caret.cloneNode(true));\n\n    jump.addEventListener('click', () => {\n      updatePreviewJump(module);\n      shell.open = true;\n      const previewFigure = module.querySelector('[data-dd-preview-result-figure]');\n      safeScrollIntoView(jump.dataset.previewAttached === 'true' && previewFigure && !previewFigure.hidden\n        ? previewFigure : shell);\n      track('dd_ai_preview_near_upload_opened', {\n        product_handle: module.dataset.productHandle,\n        variant_id: getVariantId(module)\n      });\n    });\n\n    field.insertAdjacentElement('afterend', jump);\n    updatePreviewJump(module);\n    return true;\n  }\n\n  function alignPreviewDeepLink(module) {\n    if (window.location.hash !== '#dilly-ai-preview' || !module.scrollIntoView) return;\n    const shell = module.closest('[data-dd-preview-shell]');\n    if (shell) shell.open = true;\n    let userMoved = false;\n    const cancelAlignment = () => {\n      userMoved = true;\n    };\n    window.addEventListener('touchstart', cancelAlignment, { once: true, passive: true });\n    window.addEventListener('wheel', cancelAlignment, { once: true, passive: true });\n    window.addEventListener('keydown', cancelAlignment, { once: true });\n    const align = () => {\n      if (!userMoved) (shell || module).scrollIntoView({ behavior: 'auto', block: 'start', inline: 'nearest' });\n    };\n    window.requestAnimationFrame(() => window.requestAnimationFrame(align));\n    if (document.readyState !== 'complete') {\n      window.addEventListener('load', align, { once: true });\n    }\n    window.setTimeout(align, 350);\n    window.setTimeout(align, 900);\n  }\n\n  function gateElements(module) {\n    return {\n      gate: module.querySelector('[data-dd-preview-gate]'),\n      email: module.querySelector('[data-dd-preview-email]'),\n      consent: module.querySelector('[data-dd-preview-consent]'),\n      unlock: module.querySelector('[data-dd-preview-unlock]'),\n      skip: module.querySelector('[data-dd-preview-skip-email]'),\n      error: module.querySelector('[data-dd-preview-gate-error]'),\n      feedback: module.querySelector('[data-dd-preview-email-status]')\n    };\n  }\n\n  function setGateBusy(module, busy) {\n    const gate = gateElements(module);\n    [gate.unlock, gate.skip, gate.email, gate.consent].forEach((item) => {\n      if (item) item.disabled = busy;\n    });\n  }\n\n  function hidePreviewGate(module) {\n    const gate = gateElements(module);\n    if (gate.gate) gate.gate.hidden = true;\n    if (gate.gate) gate.gate.open = false;\n    if (gate.error) gate.error.textContent = '';\n    if (gate.feedback) gate.feedback.textContent = '';\n    setGateBusy(module, false);\n  }\n\n  function showPreviewFollowUp(module) {\n    const gate = gateElements(module);\n    hidePreviewGate(module);\n    if (gate.gate) gate.gate.hidden = false;\n    if (gate.consent) gate.consent.checked = false;\n  }\n\n  function revealGeneratedPreview(module, result, options) {\n    const placement = currentPlacement(module);\n    const previewImage = module.querySelector('[data-dd-preview-result]');\n    const previewCaption = module.querySelector('[data-dd-preview-result-caption]');\n    const previewFigure = module.querySelector('[data-dd-preview-result-figure]');\n    const status = module.querySelector('[data-dd-preview-status]');\n    const accepted = module.querySelector('[data-dd-preview-accepted]');\n    const manualButton = module.querySelector('[data-dd-preview-manual]');\n    module.ddAiPreviewLatestResult = result;\n    module.ddAiPreviewPendingResult = null;\n    rememberPreviewReference(module, result);\n    const attached = attachProperties(module, result);\n    if (!attached) {\n      throw new Error('Preview created, but the product form was not ready. Please refresh and try again.');\n    }\n    if (previewImage) previewImage.src = result.ai_preview_url;\n    if (previewCaption) previewCaption.textContent = `Line art on this item: ${result.print_location_label || (placement && placement.label) || 'Preview'}`;\n    if (previewFigure) previewFigure.hidden = false;\n    if (status) status.textContent = 'Your preview is ready.';\n    if (accepted) accepted.textContent = 'Your photo, preview and line art will go with this item when you add it to your cart.';\n    ensureCartBackup(module, result);\n    if (manualButton) manualButton.hidden = true;\n    hideLoadingPanel(module);\n    hidePreviewGate(module);\n    track('dd_ai_preview_revealed', {\n      product_handle: module.dataset.productHandle,\n      variant_id: getVariantId(module),\n      job_id: result.job_id || '',\n      source: options && options.source || 'automatic'\n    });\n    safeScrollIntoView(previewFigure || accepted);\n    return true;\n  }\n\n  function clearGeneratedPreview(module, message) {\n    module.ddAiPreviewLatestResult = null;\n    module.ddAiPreviewPendingResult = null;\n    module.ddAiPreviewManualUpload = false;\n    clearLineProperties(module);\n    syncGpoFieldBypass(module, 0, { photo: false, hidePhoto: false, placement: false });\n    const previewImage = module.querySelector('[data-dd-preview-result]');\n    const previewFigure = module.querySelector('[data-dd-preview-result-figure]');\n    const accepted = module.querySelector('[data-dd-preview-accepted]');\n    const manualButton = module.querySelector('[data-dd-preview-manual]');\n    if (previewImage) previewImage.removeAttribute('src');\n    if (previewFigure) previewFigure.hidden = true;\n    if (accepted) accepted.textContent = '';\n    const saveRetry = module.querySelector('[data-dd-preview-save-retry]');\n    if (saveRetry) saveRetry.hidden = true;\n    if (manualButton) manualButton.hidden = false;\n    hideLoadingPanel(module);\n    hidePreviewGate(module);\n    if (message) module.querySelector('[data-dd-preview-status]').textContent = message;\n  }\n\n  function refreshVariantContext(module, messageIfChanged) {\n    const previousVariant = module.ddAiPreviewVariantId;\n    const previousMockupUrl = module.dataset.mockupUrl || '';\n    const nextVariant = getVariantId(module);\n    module.ddAiPreviewVariantId = nextVariant;\n    const mockupUrl = currentMockupUrl(module);\n    module.dataset.mockupUrl = mockupUrl;\n    const placement = currentPlacement(module);\n    const shell = module.closest('[data-dd-preview-shell]');\n    if (!shell || shell.open) syncGpoPrintLocation(module, placement);\n    if (previousVariant && previousVariant !== nextVariant && (module.ddAiPreviewLatestResult || module.ddAiPreviewPendingResult)) {\n      const result = module.ddAiPreviewLatestResult || module.ddAiPreviewPendingResult;\n      const previewMockupUrl = result.preview_mockup_url || previousMockupUrl;\n      if (previewMockupUrl && previewMockupUrl === mockupUrl) {\n        result.preview_mockup_url = mockupUrl;\n        if (module.ddAiPreviewLatestResult) attachProperties(module, result);\n      } else {\n        clearGeneratedPreview(module, messageIfChanged || 'Product option changed. Generate a fresh preview for this selection.');\n      }\n    }\n    updatePreviewJump(module);\n  }\n\n  async function initModule(module) {\n    if (module.dataset.ddAiPreviewInitialized === 'true') return;\n    module.dataset.ddAiPreviewInitialized = 'true';\n\n    const endpoint = module.dataset.endpoint;\n    const shell = module.closest('[data-dd-preview-shell]');\n    if (!endpoint) {\n      module.hidden = true;\n      if (shell) shell.hidden = true;\n      return;\n    }\n    try {\n      module.ddAiPreviewConfig = await loadConfig(module.dataset.configUrl);\n    } catch (error) {\n      module.hidden = true;\n      if (shell) shell.hidden = true;\n      return;\n    }\n    const config = productConfig(module);\n    if (!config || !config.default_mockup_url || !placements(module).length) {\n      module.hidden = true;\n      if (shell) shell.hidden = true;\n      return;\n    }\n\n    module.hidden = false;\n    if (shell) shell.hidden = false;\n    let serviceWarmed = false;\n    const warmWhenOpened = () => {\n      if (serviceWarmed || (shell && !shell.open)) return;\n      serviceWarmed = true;\n      warmPreviewService(endpoint);\n    };\n    if (shell) {\n      shell.addEventListener('toggle', warmWhenOpened);\n    } else {\n      warmWhenOpened();\n    }\n    module.ddAiPreviewLatestResult = null;\n    module.ddAiPreviewPendingResult = null;\n    module.ddAiPreviewManualUpload = false;\n    module.ddAiPreviewVariantId = getVariantId(module);\n    restorePreviewReference(module);\n    attachPreviewReference(module);\n    if (module.ddAiPreviewReference) ensureCartBackup(module, module.ddAiPreviewReference.result);\n    renderPlacementChoices(module);\n    refreshVariantContext(module);\n    syncGpoFieldBypass(module, 0, { photo: false, hidePhoto: false, placement: false });\n    placePreviewJumpNearPhoto(module, 0);\n    alignPreviewDeepLink(module);\n    warmWhenOpened();\n\n    const fileInput = module.querySelector('[data-dd-preview-file]');\n    const dropZone = module.querySelector('[data-dd-preview-drop]');\n    const generateButton = module.querySelector('[data-dd-preview-generate]');\n    const manualButton = module.querySelector('[data-dd-preview-manual]');\n    const replaceButtons = module.querySelectorAll('[data-dd-preview-replace]');\n    const originalImage = module.querySelector('[data-dd-preview-original]');\n    const previewImage = module.querySelector('[data-dd-preview-result]');\n    const previewCaption = module.querySelector('[data-dd-preview-result-caption]');\n    const previewFigure = module.querySelector('[data-dd-preview-result-figure]');\n    const status = module.querySelector('[data-dd-preview-status]');\n    const resultPanel = module.querySelector('[data-dd-preview-panel]');\n    const accepted = module.querySelector('[data-dd-preview-accepted]');\n    const gate = gateElements(module);\n    const consentText = 'I agree to receive emails from Dilly Dally Dog about my preview and custom pet products.';\n\n    let selectedFile = null;\n    let selectedDataUrl = '';\n    let attempts = Number(sessionStorage.getItem('ddAiPreviewAttempts') || '0');\n\n    fileInput.addEventListener('change', async () => {\n      clearError(module);\n      clearGeneratedPreview(module);\n      hideLoadingPanel(module);\n      selectedDataUrl = '';\n      originalImage.removeAttribute('src');\n      resultPanel.hidden = true;\n      generateButton.disabled = true;\n      selectedFile = fileInput.files && fileInput.files[0];\n      if (!selectedFile) return;\n      track('dd_ai_preview_photo_selected', {\n        product_handle: module.dataset.productHandle,\n        variant_id: getVariantId(module),\n        file_type: selectedFile.type || 'unknown',\n        file_size_bucket: fileSizeBucket(selectedFile.size),\n        selection_status: selectedFile.size > 8 * 1024 * 1024 ? 'rejected_too_large' : 'accepted'\n      });\n      if (selectedFile.size > 8 * 1024 * 1024) {\n        showError(module, 'That photo is too large. Please upload an image under 8MB.');\n        selectedFile = null;\n        return;\n      }\n      selectedDataUrl = await fileToDataUrl(selectedFile);\n      originalImage.src = selectedDataUrl;\n      resultPanel.hidden = false;\n      generateButton.disabled = false;\n      status.textContent = 'Photo ready. Generate your preview when you are ready.';\n      safeScrollIntoView(generateButton);\n    });\n\n    if (dropZone) {\n      dropZone.addEventListener('dragover', (event) => {\n        event.preventDefault();\n      });\n      dropZone.addEventListener('drop', async (event) => {\n        event.preventDefault();\n        if (!event.dataTransfer || !event.dataTransfer.files || !event.dataTransfer.files.length) return;\n        const transfer = new DataTransfer();\n        transfer.items.add(event.dataTransfer.files[0]);\n        fileInput.files = transfer.files;\n        fileInput.dispatchEvent(new Event('change', { bubbles: true }));\n      });\n    }\n\n    module.addEventListener('change', (event) => {\n      const target = event.target;\n      if (target && target.matches && target.matches('[data-dd-preview-placement-input]')) {\n        const placement = currentPlacement(module);\n        syncGpoPrintLocation(module, placement);\n        if (module.ddAiPreviewLatestResult || module.ddAiPreviewPendingResult) {\n          clearGeneratedPreview(module, 'Placement changed. Generate a fresh preview for this print location.');\n        }\n      }\n    });\n\n    module.addEventListener('click', (event) => {\n      const choice = event.target && event.target.closest && event.target.closest('.dd-ai-preview__placement-choice');\n      if (!choice || !module.contains(choice)) return;\n      const input = choice.querySelector('[data-dd-preview-placement-input]');\n      if (!input || input.checked) return;\n      input.checked = true;\n      input.dispatchEvent(new Event('change', { bubbles: true }));\n    });\n\n    const productScope = module.closest('product-info') || document;\n    repairGpoRadioClicks(module, productScope);\n    productScope.addEventListener('change', (event) => {\n      const target = event.target;\n      if (target && target.matches && target.matches('input[name=\"radio-1\"]')) return;\n      if (target && target.matches && target.matches(\n        'input.gpo-file[name=\"Pet-image\"], input#file-1[name=\"Pet-image\"], input[data-dd-native-photo]'\n      ) && target.files && target.files.length && module.ddAiPreviewLatestResult) {\n        clearGeneratedPreview(module, 'Your new photo will be used for your artist proof.');\n      }\n      window.setTimeout(() => {\n        refreshVariantContext(module);\n        placePreviewJumpNearPhoto(module, 0);\n      }, 0);\n    });\n    productScope.addEventListener('variant:change', () => {\n      refreshVariantContext(module);\n      placePreviewJumpNearPhoto(module, 0);\n    });\n\n    generateButton.addEventListener('click', async () => {\n      clearError(module);\n      accepted.textContent = '';\n      refreshVariantContext(module);\n      const placement = currentPlacement(module);\n      const mockupUrl = currentMockupUrl(module);\n      if (!mockupUrl) {\n        showError(module, 'This product selection is missing a preview mockup. Please choose another option or order normally for an artist proof.');\n        return;\n      }\n      if (!selectedFile || !selectedDataUrl) {\n        fileInput.click();\n        return;\n      }\n      if (attempts >= MAX_ATTEMPTS) {\n        showError(module, \"You've used your 5 free AI previews for this visit, but you can still order. Upload your pet's photo above and add your item to the cart. After checkout, our artists will send you a portrait proof to approve before anything is printed.\");\n        manualButton.hidden = false;\n        manualButton.textContent = \"Continue with my pet's photo\";\n        return;\n      }\n      const attemptNumber = attempts + 1;\n      setBusy(module, true);\n      showLoadingPanel(module);\n      track('dd_ai_preview_generation_started', {\n        product_handle: module.dataset.productHandle,\n        variant_id: getVariantId(module),\n        attempt_number: attemptNumber,\n        print_location: placement && placement.label\n      });\n      const loadingStartedAt = Date.now();\n      const statusTimer = window.setInterval(() => {\n        setLoadingStep(module, loadingStepForElapsed(Date.now() - loadingStartedAt));\n      }, 3000);\n      setLoadingStep(module, 0);\n\n      try {\n        const requestPhoto = selectedDataUrl;\n        const result = await requestPreview(endpoint, Object.assign({\n          filename: selectedFile.name,\n          mime_type: selectedFile.type || 'image/jpeg',\n          image_base64: selectedDataUrl,\n          product_handle: module.dataset.productHandle,\n          product_title: module.dataset.productTitle,\n          variant_id: getVariantId(module),\n          mockup_url: mockupUrl,\n          print_location: placement && placement.label,\n          placement_config: placement,\n          visitor_id: getVisitorId(),\n          page_url: window.location.href\n        }, utmFields(), metaAttributionFields()));\n        if (selectedDataUrl !== requestPhoto || currentMockupUrl(module) !== mockupUrl ||\n            (currentPlacement(module) || {}).key !== (placement || {}).key) {\n          throw new Error('Your photo or product selection changed. Please make a new preview for this selection.');\n        }\n        result.preview_mockup_url = mockupUrl;\n        result.preview_variant_id = getVariantId(module);\n        attempts = attemptNumber;\n        sessionStorage.setItem('ddAiPreviewAttempts', String(attempts));\n        revealGeneratedPreview(module, result, { source: 'automatic' });\n        showPreviewFollowUp(module);\n        track('dd_ai_preview_generation_completed', {\n          product_handle: module.dataset.productHandle,\n          variant_id: getVariantId(module),\n          job_id: result.job_id || '',\n          elapsed_ms: result.elapsed_ms,\n          print_location: result.print_location_label || (placement && placement.label),\n          model: result.model || 'unknown'\n        });\n      } catch (error) {\n        module.ddAiPreviewLatestResult = null;\n        module.ddAiPreviewManualUpload = true;\n        clearLineProperties(module);\n        syncGpoFieldBypass(module, 0, { photo: false, hidePhoto: false, placement: false });\n        manualButton.hidden = true;\n        previewImage.removeAttribute('src');\n        if (previewFigure) previewFigure.hidden = true;\n        hideLoadingPanel(module);\n        const message = String(error && error.message || error || '');\n        showError(module, message && message !== 'Preview generation failed'\n          ? message\n          : 'We could not generate a preview from this photo, but you can still order and our artists will create your proof.');\n        track('dd_ai_preview_generation_failed', {\n          product_handle: module.dataset.productHandle,\n          variant_id: getVariantId(module),\n          attempt_number: attemptNumber,\n          print_location: placement && placement.label,\n          failure_type: generationFailureType(error)\n        });\n      } finally {\n        window.clearInterval(statusTimer);\n        setBusy(module, false);\n      }\n    });\n\n    replaceButtons.forEach((button) => button.addEventListener('click', () => {\n      fileInput.value = '';\n      fileInput.click();\n    }));\n\n    if (gate.unlock) {\n      gate.unlock.addEventListener('click', async () => {\n        const result = module.ddAiPreviewLatestResult;\n        if (!result) return;\n        const email = gate.email ? String(gate.email.value || '').trim().toLowerCase() : '';\n        if (!emailLooksValid(email)) {\n          if (gate.error) gate.error.textContent = 'Please enter a valid email address.';\n          if (gate.email) gate.email.focus();\n          return;\n        }\n        if (!gate.consent || !gate.consent.checked) {\n          if (gate.error) gate.error.textContent = 'Please check the email permission box to sign up. This is optional.';\n          if (gate.consent) gate.consent.focus();\n          return;\n        }\n        if (gate.error) gate.error.textContent = '';\n        setGateBusy(module, true);\n        const leadDetail = {\n          product_handle: module.dataset.productHandle,\n          variant_id: getVariantId(module),\n          job_id: result.job_id || '',\n          print_location: result.print_location_label || (currentPlacement(module) && currentPlacement(module).label)\n        };\n        try {\n          const unlockResult = await requestPreviewUnlock(endpoint, previewUnlockPayload(module, result, email, consentText));\n          if (!unlockResult || !unlockResult.shopify_customer_synced) throw new Error('Email signup was not saved');\n          track('dd_ai_preview_email_submitted', leadDetail);\n          if (module.ddAiPreviewLatestResult === result) {\n            hidePreviewGate(module);\n            if (gate.feedback) gate.feedback.textContent = \"You're signed up for preview follow-ups.\";\n          }\n        } catch (error) {\n          track('dd_ai_preview_email_sync_failed', leadDetail);\n          if (module.ddAiPreviewLatestResult === result && gate.error) {\n            gate.error.textContent = \"We couldn't save your email. You can still add this item to your cart.\";\n          }\n        } finally {\n          if (module.ddAiPreviewLatestResult === result) setGateBusy(module, false);\n        }\n      });\n    }\n\n    if (gate.skip) {\n      gate.skip.addEventListener('click', () => {\n        if (gate.gate) gate.gate.open = false;\n      });\n    }\n\n    manualButton.addEventListener('click', () => {\n      module.ddAiPreviewManualUpload = true;\n      manualButton.hidden = true;\n      hidePreviewGate(module);\n      syncGpoFieldBypass(module, 0, { photo: false, hidePhoto: false, placement: false });\n      status.textContent = 'Use the standard pet photo field above, then add the item to your cart.';\n      const gpoFile = productScope.querySelector(\n        'input.gpo-file[name=\"Pet-image\"], input#file-1[name=\"Pet-image\"], input[data-dd-native-photo]'\n      );\n      if (shell) shell.open = false;\n      safeScrollIntoView(gpoFile && (gpoFile.closest('.gpo-element') || gpoFile));\n      track('dd_ai_preview_manual_upload_selected', {\n        product_handle: module.dataset.productHandle,\n        variant_id: getVariantId(module)\n      });\n    });\n\n    function guardAndAttachForCart(event) {\n      if (module.ddAiPreviewReference) ensureCartBackup(module, module.ddAiPreviewReference.result, true);\n      if (!module.ddAiPreviewLatestResult && module.ddAiPreviewPendingResult) {\n        track('dd_ai_preview_email_skipped', {\n          product_handle: module.dataset.productHandle,\n          variant_id: getVariantId(module),\n          job_id: module.ddAiPreviewPendingResult.job_id || '',\n          source: 'cart_submit'\n        });\n        revealGeneratedPreview(module, module.ddAiPreviewPendingResult, { source: 'cart_submit' });\n      }\n      const hasPreview = Boolean(module.ddAiPreviewLatestResult);\n      syncGpoFieldBypass(module, 0, { photo: hasPreview, hidePhoto: hasPreview, placement: true });\n      if (!module.ddAiPreviewLatestResult) {\n        attachPreviewReference(module);\n        module.ddAiPreviewManualUpload = true;\n        syncGpoFieldBypass(module, 0, { photo: false, hidePhoto: false, placement: false });\n        status.textContent = 'Use the standard pet photo field above to continue with your order.';\n        track('dd_ai_preview_cart_submit_without_preview', {\n          product_handle: module.dataset.productHandle,\n          variant_id: getVariantId(module),\n          has_preview: false\n        });\n        return true;\n      }\n      attachProperties(module, module.ddAiPreviewLatestResult);\n      track('dd_ai_preview_cart_submit', {\n        product_handle: module.dataset.productHandle,\n        variant_id: getVariantId(module),\n        has_preview: true\n      });\n      return true;\n    }\n\n    function isAddToCartTarget(event) {\n      const target = event.target;\n      if (!target || !target.closest) return false;\n      const button = target.closest('button[name=\"add\"], input[type=\"submit\"][name=\"add\"], .gpo-clone-atc-button');\n      if (!button) return false;\n\n      const form = getProductForm(module);\n      const productInfo = module.closest('product-info');\n      return Boolean(\n        (form && (form.contains(button) || button.form === form)) ||\n        (productInfo && productInfo.contains(button)) ||\n        button.classList.contains('gpo-clone-atc-button')\n      );\n    }\n\n    // Product option apps can replace forms or construct FormData without submitting.\n    document.addEventListener('submit', (event) => {\n      if (event.target === getProductForm(module)) guardAndAttachForCart(event);\n    }, { capture: true });\n    document.addEventListener('formdata', (event) => {\n      if (event.target !== getProductForm(module)) return;\n      const previousNames = Array.from(event.target.querySelectorAll('[data-dd-ai-preview-property]'), (input) => input.name);\n      if (module.ddAiPreviewLatestResult) attachProperties(module, module.ddAiPreviewLatestResult);\n      else attachPreviewReference(module);\n      previousNames.forEach((name) => event.formData.delete(name));\n      event.target.querySelectorAll('[data-dd-ai-preview-property]').forEach((input) => {\n        event.formData.set(input.name, input.value);\n      });\n    }, { capture: true });\n    document.addEventListener('click', (event) => {\n      if (isAddToCartTarget(event)) guardAndAttachForCart(event);\n    }, { capture: true });\n  }\n\n  function boot() {\n    document.querySelectorAll('[data-dd-ai-preview]').forEach((module) => initModule(module));\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot, { once: true });\n  } else {\n    boot();\n  }\n})();\n"],
  "mappings": "CAAC,UAAY,CAEX,MAAM,eAAiB,uBACjB,sBAAwB,2BAE9B,IAAI,gBAAkB,QAAQ,QAAQ,EACtC,MAAM,kBAAoB,IACpB,mBAAqB,eACrB,aAAe,IAAI,IACnB,cAAgB,CACpB,CACE,MAAO,yBACP,KAAM,gFACN,OAAQ,4BACR,SAAU,EACZ,EACA,CACE,MAAO,2BACP,KAAM,4EACN,OAAQ,0CACR,SAAU,EACZ,EACA,CACE,MAAO,0BACP,KAAM,wEACN,OAAQ,sCACR,SAAU,EACZ,EACA,CACE,MAAO,6BACP,KAAM,4DACN,OAAQ,yCACR,SAAU,EACZ,EACA,CACE,MAAO,uBACP,KAAM,6FACN,OAAQ,2DACR,SAAU,EACZ,EACA,CACE,MAAO,eACP,KAAM,iFACN,OAAQ,0CACR,SAAU,EACZ,CACF,EAEA,SAAS,4BAA6B,CACpC,GAAI,CACF,MAAM,QAAU,OAAO,SAAW,OAAO,QAAQ,gBACjD,MAAO,CAAC,SACN,OAAO,QAAQ,4BAA+B,YAC9C,QAAQ,2BAA2B,CACvC,MAAgB,CACd,MAAO,EACT,CACF,CAEA,SAAS,WAAY,CACnB,OAAK,2BAA2B,GAChC,OAAO,UAAY,OAAO,WAAa,CAAC,EACpC,OAAO,OAAO,MAAS,aACzB,OAAO,KAAO,UAAY,CACxB,OAAO,UAAU,KAAK,SAAS,CACjC,GAEG,OAAO,4BACV,OAAO,0BAA4B,IAE9B,IAVmC,EAW5C,CAEA,SAAS,MAAM,UAAW,OAAQ,CAChC,MAAM,QAAU,OAAO,OAAO,CAC5B,eAAgB,aAChB,eAAgB,iBAClB,EAAG,QAAU,CAAC,CAAC,EACf,GAAI,CACE,OAAO,SAAW,OAAO,QAAQ,WAAa,OAAO,OAAO,QAAQ,UAAU,SAAY,YAC5F,OAAO,QAAQ,UAAU,QAAQ,UAAW,OAAO,EAEjD,UAAU,GACZ,OAAO,KAAK,QAAS,UAAW,OAAO,OAAO,CAC5C,QAAS,kBACX,EAAG,OAAO,CAAC,CAEf,OAAS,MAAO,CACd,QAAQ,KAAK,yCAA0C,KAAK,CAC9D,CACA,SAAS,cAAc,IAAI,YAAY,UAAW,CAAE,OAAQ,OAAQ,CAAC,CAAC,CACxE,CAEA,SAAS,eAAe,MAAO,CAC7B,OAAI,MAAQ,KAAO,KAAa,YAC5B,MAAQ,EAAI,KAAO,KAAa,WAChC,OAAS,EAAI,KAAO,KAAa,WAC9B,UACT,CAEA,SAAS,sBAAsB,MAAO,CACpC,MAAM,QAAU,OAAO,OAAS,MAAM,SAAW,OAAS,EAAE,EAAE,YAAY,EAC1E,OAAI,QAAQ,SAAS,KAAK,GAAK,QAAQ,SAAS,YAAY,GAAK,QAAQ,SAAS,eAAe,EAAU,eACvG,QAAQ,SAAS,eAAe,GAAK,QAAQ,SAAS,SAAS,GAAK,QAAQ,SAAS,SAAS,EAAU,UACxG,QAAQ,SAAS,oBAAoB,EAAU,2BAEjD,QAAQ,SAAS,aAAa,GAC9B,QAAQ,SAAS,YAAY,GAC7B,QAAQ,SAAS,WAAW,GAC5B,QAAQ,SAAS,WAAW,GAC5B,QAAQ,SAAS,cAAc,EACxB,iBAEP,QAAQ,SAAS,iBAAiB,GAClC,QAAQ,SAAS,qBAAqB,GACtC,QAAQ,SAAS,aAAa,GAC9B,QAAQ,SAAS,iBAAiB,GAClC,QAAQ,SAAS,SAAS,EACnB,gBAEP,QAAQ,SAAS,yBAAyB,GAC1C,QAAQ,SAAS,cAAc,GAC/B,QAAQ,SAAS,cAAc,GAC/B,QAAQ,SAAS,cAAc,GAC/B,QAAQ,SAAS,cAAc,EACxB,sBACF,SACT,CAEA,SAAS,cAAe,CACtB,GAAI,CACF,IAAI,UAAY,OAAO,aAAa,QAAQ,cAAc,EAC1D,OAAK,YACH,UAAY,OAAO,QAAU,OAAO,OAAO,WACvC,OAAO,OAAO,WAAW,EACzB,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GACrE,OAAO,aAAa,QAAQ,eAAgB,SAAS,GAEhD,SACT,MAAgB,CACd,MAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAC1E,CACF,CAEA,SAAS,cAAc,KAAM,CAC3B,OAAO,IAAI,QAAQ,CAAC,QAAS,SAAW,CACtC,MAAM,OAAS,IAAI,WACnB,OAAO,OAAS,IAAM,QAAQ,OAAO,OAAO,QAAU,EAAE,CAAC,EACzD,OAAO,QAAU,IAAM,OAAO,OAAO,OAAS,IAAI,MAAM,qBAAqB,CAAC,EAC9E,OAAO,cAAc,IAAI,CAC3B,CAAC,CACH,CAEA,SAAS,sBAAsB,SAAU,CACvC,OAAO,OAAO,UAAY,EAAE,EAAE,QAAQ,wCAAyC,EAAE,CACnF,CAEA,SAAS,cAAc,SAAU,CAC/B,MAAO,GAAG,sBAAsB,QAAQ,CAAC,UAC3C,CAEA,SAAS,oBAAoB,SAAU,CACrC,MAAO,GAAG,sBAAsB,QAAQ,CAAC,iBAC3C,CAEA,SAAS,mBAAmB,SAAU,CACpC,MAAM,UAAY,GAAG,sBAAsB,QAAQ,CAAC,UACpD,MAAM,UAAW,CAAE,OAAQ,MAAO,KAAM,OAAQ,MAAO,UAAW,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACrF,CAEA,eAAe,gBAAgB,IAAK,QAAS,UAAW,CACtD,MAAM,WAAa,IAAI,gBACjB,QAAU,OAAO,WAAW,IAAM,WAAW,MAAM,EAAG,SAAS,EACrE,GAAI,CACF,MAAM,SAAW,MAAM,MAAM,IAAK,OAAO,OAAO,CAAC,EAAG,QAAS,CAAE,OAAQ,WAAW,MAAO,CAAC,CAAC,EACrF,OAAS,MAAM,SAAS,KAAK,EACnC,MAAO,CAAE,WAAY,SAAS,OAAQ,MAAO,CAC/C,QAAE,CACA,OAAO,aAAa,OAAO,CAC7B,CACF,CAEA,SAAS,iBAAiB,SAAU,CAClC,GAAI,CAAC,SAAU,OAAO,KACtB,MAAM,OAAS,SAAS,QAAU,CAAC,EACnC,GAAI,SAAS,aAAe,KAAO,OAAO,IAAM,OAAO,eAAgB,OAAO,OAC9E,GAAI,OAAO,SAAW,UAAY,OAAO,SAAW,gBAChD,CAAC,IAAK,IAAK,IAAK,GAAG,EAAE,SAAS,SAAS,UAAU,EAAG,CACtD,MAAM,MAAQ,IAAI,MAAM,OAAO,OAAS,sEAAsE,EAC9G,YAAM,gBAAkB,GAClB,KACR,CACA,OAAO,IACT,CAEA,eAAe,eAAe,SAAU,QAAS,CAC/C,MAAM,MAAQ,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,EACjD,UAAY,MAAM,KAAK,MAAQ,MAAS,KAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EACnF,KAAO,KAAK,UAAU,OAAO,OAAO,CAAC,EAAG,QAAS,CAAE,WAAY,SAAU,CAAC,CAAC,EAC3E,SAAW,KAAK,IAAI,EAAI,IACxB,KAAO,IAAM,gBAAgB,cAAc,QAAQ,EAAG,CAC1D,OAAQ,OAAQ,QAAS,CAAE,eAAgB,kBAAmB,EAAG,IACnE,EAAG,IAAK,EACR,GAAI,CACF,MAAM,OAAS,iBAAiB,MAAM,KAAK,CAAC,EAC5C,GAAI,OAAQ,OAAO,MACrB,OAAS,MAAO,CACd,GAAI,MAAM,gBAAiB,MAAM,KACnC,CAEA,IAAI,cAAgB,GACpB,KAAO,KAAK,IAAI,EAAI,UAAU,CAC5B,MAAM,IAAI,QAAS,SAAY,OAAO,WAAW,QAAS,GAAI,CAAC,EAC/D,GAAI,CACF,MAAM,SAAW,MAAM,gBACrB,GAAG,sBAAsB,QAAQ,CAAC,mBAAmB,SAAS,GAC9D,CAAE,OAAQ,MAAO,MAAO,UAAW,EAAG,GACxC,EACM,OAAS,iBAAiB,QAAQ,EACxC,GAAI,OAAQ,OAAO,OACnB,GAAI,SAAS,aAAe,KAAO,CAAC,cAAe,CACjD,cAAgB,GAChB,MAAM,cAAgB,iBAAiB,MAAM,KAAK,CAAC,EACnD,GAAI,cAAe,OAAO,aAC5B,CACF,OAAS,MAAO,CACd,GAAI,MAAM,gBAAiB,MAAM,KACnC,CACF,CACA,MAAM,IAAI,MAAM,sHAAsH,CACxI,CAEA,eAAe,qBAAqB,SAAU,QAAS,CACrD,MAAM,WAAa,IAAI,gBACjB,QAAU,OAAO,WAAW,IAAM,WAAW,MAAM,EAAG,GAAI,EAChE,GAAI,CACF,MAAM,SAAW,MAAM,MAAM,oBAAoB,QAAQ,EAAG,CAC1D,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAU,OAAO,EAC5B,OAAQ,WAAW,MACrB,CAAC,EACK,aAAe,MAAM,SAAS,KAAK,EACzC,IAAI,OAAS,CAAC,EACd,GAAI,CACF,OAAS,aAAe,KAAK,MAAM,YAAY,EAAI,CAAC,CACtD,MAAgB,CACd,OAAS,CAAC,CACZ,CACA,GAAI,SAAS,IAAM,OAAO,GAAI,OAAO,OACrC,MAAM,IAAI,MAAM,OAAO,OAAS,2BAA2B,SAAS,MAAM,EAAE,CAC9E,QAAE,CACA,OAAO,aAAa,OAAO,CAC7B,CACF,CAEA,SAAS,gBAAgB,MAAO,CAC9B,MAAO,6BAA6B,KAAK,OAAO,OAAS,EAAE,EAAE,KAAK,CAAC,CACrE,CAEA,SAAS,WAAY,CACnB,MAAM,IAAM,CAAC,EACb,GAAI,CACF,MAAM,OAAS,IAAI,gBAAgB,OAAO,SAAS,QAAU,EAAE,EAC/D,CAAC,aAAc,aAAc,eAAgB,WAAY,aAAa,EAAE,QAAS,KAAQ,CACvF,MAAM,MAAQ,OAAO,IAAI,GAAG,EACxB,QAAO,IAAI,GAAG,EAAI,MAAM,MAAM,EAAG,GAAG,EAC1C,CAAC,CACH,MAAgB,CAAC,CACjB,OAAO,GACT,CAEA,SAAS,WAAW,KAAM,CACxB,MAAM,OAAS,GAAG,IAAI,IAChB,KAAO,OAAO,SAAS,QAAU,EAAE,EACtC,MAAM,GAAG,EACT,IAAK,MAAS,KAAK,KAAK,CAAC,EACzB,KAAM,MAAS,KAAK,WAAW,MAAM,CAAC,EACzC,OAAO,KAAO,mBAAmB,KAAK,MAAM,OAAO,MAAM,CAAC,EAAE,MAAM,EAAG,GAAG,EAAI,EAC9E,CAEA,SAAS,uBAAwB,CAE/B,GAAI,CADY,2BAA2B,EAC7B,MAAO,CAAE,kBAAmB,EAAM,EAChD,MAAM,OAAS,CAAE,kBAAmB,EAAK,EACnC,IAAM,WAAW,MAAM,EACvB,IAAM,WAAW,MAAM,EAC7B,OAAI,MAAK,OAAO,IAAM,KAClB,MAAK,OAAO,IAAM,KACf,MACT,CAEA,SAAS,qBAAqB,OAAQ,OAAQ,MAAO,YAAa,CAChE,MAAM,UAAY,iBAAiB,MAAM,EACzC,OAAO,OAAO,OAAO,CACnB,MACA,kBAAmB,GACnB,aAAc,YACd,OAAQ,OAAO,QAAU,GACzB,WAAY,aAAa,EACzB,eAAgB,OAAO,QAAQ,eAAiB,GAChD,cAAe,OAAO,QAAQ,cAAgB,GAC9C,WAAY,aAAa,MAAM,EAC/B,eAAgB,OAAO,sBAAyB,WAAa,UAAU,OAAU,GACjF,eAAgB,OAAO,gBAAkB,GACzC,mBAAoB,OAAO,oBAAsB,OAAO,cAAgB,GACxE,cAAe,OAAO,eAAiB,OAAO,eAAiB,GAC/D,SAAU,OAAO,SAAS,IAC5B,EAAG,UAAU,EAAG,sBAAsB,CAAC,CACzC,CAEA,SAAS,YAAY,MAAO,CAC1B,OAAO,OAAO,OAAS,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAC5C,CAEA,eAAe,WAAW,IAAK,CAC7B,OAAK,KACA,aAAa,IAAI,GAAG,GACvB,aAAa,IAAI,IAAK,MAAM,IAAK,CAAE,YAAa,aAAc,CAAC,EAAE,KAAM,UAAa,CAClF,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,mDAAmD,EACrF,OAAO,SAAS,KAAK,CACvB,CAAC,CAAC,EAEG,aAAa,IAAI,GAAG,GAPV,IAQnB,CAEA,SAAS,eAAe,OAAQ,CAC9B,MAAM,MAAQ,OAAO,QAAQ,cAAc,GAAK,SAC1C,MAAQ,MAAM,KAAK,MAAM,iBAAiB,2BAA2B,CAAC,EAC5E,OAAO,MAAM,KAAM,MAAS,KAAK,cAAc,iDAAiD,CAAC,GAC/F,MAAM,cAAc,wCAAwC,GAC5D,MAAM,CAAC,GACP,SAAS,cAAc,mEAAmE,CAC9F,CAEA,SAAS,aAAa,OAAQ,CAC5B,MAAM,KAAO,eAAe,MAAM,EAC5B,MAAQ,MAAQ,KAAK,cAAc,aAAa,EACtD,OAAO,YAAY,MAAQ,MAAM,MAAQ,OAAO,QAAQ,SAAS,CACnE,CAEA,SAAS,cAAc,OAAQ,CAC7B,MAAM,IAAM,OAAO,kBACnB,OAAO,KAAO,IAAI,UAAY,IAAI,SAAS,OAAO,QAAQ,aAAa,CACzE,CAEA,SAAS,cAAc,OAAQ,CAC7B,MAAM,QAAU,cAAc,MAAM,EACpC,GAAI,CAAC,QAAS,OAAO,KACrB,MAAM,UAAY,aAAa,MAAM,EACrC,OAAQ,QAAQ,UAAY,QAAQ,SAAS,SAAS,GACnD,QAAQ,UAAY,QAAQ,SAAS,OAAO,QAAQ,oBAAsB,EAAE,CAAC,GAC9E,IACJ,CAEA,SAAS,WAAW,OAAQ,CAC1B,MAAM,QAAU,cAAc,MAAM,EACpC,OAAO,SAAW,MAAM,QAAQ,QAAQ,UAAU,GAAK,QAAQ,WAAW,OACtE,QAAQ,WACR,CAAC,CACP,CAEA,SAAS,iBAAiB,OAAQ,CAChC,MAAM,QAAU,OAAO,cAAc,2CAA2C,EAC1E,UAAY,WAAW,MAAM,EACnC,GAAI,QAAS,CACX,MAAM,MAAQ,UAAU,KAAM,WAAc,UAAU,MAAQ,QAAQ,OAAS,UAAU,QAAU,QAAQ,KAAK,EAChH,GAAI,MAAO,OAAO,KACpB,CACA,OAAO,UAAU,CAAC,GAAK,IACzB,CAEA,SAAS,iBAAiB,OAAQ,CAChC,MAAM,QAAU,cAAc,MAAM,EAC9B,QAAU,cAAc,MAAM,EACpC,OAAQ,SAAW,QAAQ,YAAgB,SAAW,QAAQ,oBAAuB,EACvF,CAEA,SAAS,uBAAuB,OAAQ,QAAS,CAC/C,MAAM,SAAW,OAAO,cAAc,6BAA6B,EAC7D,UAAY,OAAO,cAAc,qCAAqC,EACtE,UAAY,WAAW,MAAM,EACnC,GAAI,CAAC,UAAY,CAAC,WAAa,CAAC,UAAU,OAAQ,OAClD,SAAS,OAAS,UAAU,QAAU,EACtC,MAAM,YAAc,SAAW,UAAU,KAAM,WAAc,UAAU,MAAQ,OAAO,EAClF,QACA,UAAU,CAAC,EAAE,IACjB,UAAU,UAAY,UAAU,IAAI,CAAC,UAAW,QAAU;AAAA;AAAA;AAAA;AAAA,0CAIpB,OAAO,QAAQ,WAAa,MAAM;AAAA,mBACzD,UAAU,GAAG;AAAA;AAAA,YAEpB,UAAU,MAAQ,aAAgB,CAAC,aAAe,QAAU,EAAK,UAAY,EAAE;AAAA;AAAA,gBAE3E,UAAU,KAAK,UAAU,UAAU,MAAQ,mBAAmB;AAAA;AAAA,KAEzE,EAAE,KAAK,EAAE,CACZ,CAEA,SAAS,kBAAkB,OAAQ,UAAW,CAC5C,GAAI,CAAC,UAAW,MAAO,GACvB,MAAM,MAAQ,OAAO,QAAQ,cAAc,GAAK,SAC1C,QAAU,MAAM,KAAK,MAAM,iBAAiB,uBAAuB,CAAC,EAC1E,OAAI,QAAQ,KAAM,OAAU,MAAM,QAAU,UAAU,KAAK,EAAU,UAAU,MAC3E,WAAW,MAAM,EAAE,SAAW,GAAK,UAAU,MAAQ,SACrD,QAAQ,KAAM,OAAU,MAAM,QAAU,KAAK,EAAU,MACpD,UAAU,KACnB,CAEA,SAAS,qBAAqB,OAAQ,UAAW,QAAS,UAAW,CAMnE,GALI,CAAC,WAAa,CAAC,UAAU,QACxB,UACH,WAAa,OAAO,0BAA4B,GAAK,EACrD,OAAO,yBAA2B,WAEhC,YAAc,OAAO,0BAA0B,MAAO,GAC1D,MAAM,MAAQ,OAAO,QAAQ,cAAc,GAAK,SAC1C,MAAQ,kBAAkB,OAAQ,SAAS,EAC3C,MAAQ,MAAM,KAAK,MAAM,iBAAiB,uBAAuB,CAAC,EACrE,KAAM,WAAc,UAAU,QAAU,KAAK,EAChD,OAAI,OACG,MAAM,UACT,MAAM,MAAM,EACZ,MAAM,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACzD,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,GAErD,MAEJ,SAAW,GAAK,IACnB,OAAO,WAAW,IAAM,qBAAqB,OAAQ,WAAY,SAAW,GAAK,EAAG,SAAS,EAAG,GAAG,EAE9F,GACT,CAEA,SAAS,mBAAmB,OAAQ,QAAS,QAAS,CACpD,MAAM,YAAc,GAAQ,SAAW,QAAQ,OACzC,UAAY,GAAQ,SAAW,QAAQ,WACvC,gBAAkB,CAAC,SAAW,QAAQ,YAAc,GACpD,MAAQ,OAAO,QAAQ,cAAc,GAAK,SAC1C,UAAY,MAAM,cACtB,+FACF,EACA,GAAI,UAAW,CACb,MAAM,MAAQ,UAAU,QAAQ,4CAA4C,GAAK,UAAU,cACrF,YAAc,UAAU,QAAQ,sBAAwB,OACxD,2BAA4B,UAAU,UAC1C,UAAU,QAAQ,uBAAyB,UAAU,aAAa,UAAU,EAAI,OAAS,QACzF,UAAU,QAAQ,uBAAyB,UAAU,SAAW,OAAS,SAGvE,aACF,UAAU,QAAQ,oBAAsB,OACxC,UAAU,gBAAgB,UAAU,EACpC,UAAU,SAAW,GACrB,UAAU,SAAW,GACjB,QACF,MAAM,UAAU,OAAO,WAAW,EAClC,MAAM,iBAAiB,6BAA6B,EAAE,QAAS,OAAU,MAAM,OAAO,CAAC,IAEhF,cACT,OAAO,UAAU,QAAQ,oBACrB,UAAU,QAAQ,yBAA2B,QAC/C,UAAU,aAAa,WAAY,EAAE,EAEvC,UAAU,SAAW,UAAU,QAAQ,yBAA2B,QAGhE,QAAU,WAAa,cACzB,MAAM,UAAU,IAAI,iCAAiC,EACrD,MAAM,aAAa,cAAe,MAAM,GAC/B,QACT,MAAM,UAAU,OAAO,iCAAiC,EACxD,MAAM,gBAAgB,aAAa,GAGjC,cAAgB,aAGlB,UAAU,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAElE,CAEA,MAAM,WAAa,MAAM,cAAc,4FAA4F,EACnI,GAAI,WAAY,CACd,MAAM,MAAQ,WAAW,QAAQ,cAAc,GAAK,WAAW,cAC3D,OAAS,iBACX,MAAM,UAAU,IAAI,uCAAuC,EAC3D,MAAM,aAAa,cAAe,MAAM,GAC/B,QACT,MAAM,UAAU,OAAO,uCAAuC,EAC9D,MAAM,gBAAgB,aAAa,EAEvC,EAEK,aAAe,WAAa,kBAAoB,CAAC,YAAc,SAAW,GAAK,IAClF,OAAO,WAAW,IAAM,mBAAmB,QAAS,SAAW,GAAK,EAAG,OAAO,EAAG,GAAG,CAExF,CAEA,SAAS,uBAAuB,OAAQ,MAAO,CAC7C,GAAI,CAAC,MAAO,OACZ,MAAM,UAAY,WAAW,MAAM,EAAE,KAAM,MAAS,KAAK,QAAU,OAAS,KAAK,MAAQ,OAAS,kBAAkB,OAAQ,IAAI,IAAM,KAAK,EAC3I,GAAI,CAAC,UAAW,OAChB,MAAM,MAAQ,MAAM,KAAK,OAAO,iBAAiB,mCAAmC,CAAC,EAClF,KAAM,WAAc,UAAU,QAAU,UAAU,GAAG,EACpD,CAAC,OAAS,MAAM,UACpB,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAC5D,CAEA,SAAS,qBAAqB,OAAQ,MAAO,CAC3C,IAAI,aAAe,EACnB,MAAM,iBAAiB,QAAU,OAAU,CACzC,MAAM,OAAS,MAAM,OACrB,GAAI,CAAC,QAAU,CAAC,OAAO,QAAS,OAChC,MAAM,OAAS,OAAO,QAAQ,iBAAiB,EAC/C,GAAI,CAAC,QAAU,CAAC,MAAM,SAAS,MAAM,EAAG,OACxC,MAAM,MAAQ,OAAO,cAAc,qCAAqC,EACxE,GAAI,CAAC,OAAS,MAAM,SAAU,OAC9B,MAAM,SAAW,EAAE,aACnB,OAAO,0BAA4B,OAAO,0BAA4B,GAAK,EAC3E,MAAM,YAAc,IAAM,CACpB,WAAa,cAAgB,CAAC,MAAM,SAAS,KAAK,IACtD,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACzD,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAC1D,uBAAuB,OAAQ,MAAM,KAAK,EAC5C,EACA,YAAY,EACZ,OAAO,WAAW,YAAa,CAAC,EAChC,OAAO,WAAW,YAAa,GAAG,CACpC,EAAG,CAAE,QAAS,EAAK,CAAC,CACtB,CAEA,SAAS,gBAAgB,KAAM,KAAM,MAAO,CAC1C,IAAI,MAAQ,KAAK,cAAc,0BAA0B,IAAI,KAAK,EAC7D,QACH,MAAQ,SAAS,cAAc,OAAO,EACtC,MAAM,KAAO,SACb,MAAM,KAAO,cAAc,IAAI,IAC/B,MAAM,aAAa,8BAA+B,MAAM,EACxD,KAAK,YAAY,KAAK,GAExB,MAAM,MAAQ,OAAS,EACzB,CAEA,SAAS,yBAAyB,OAAQ,OAAQ,CAChD,MAAM,UAAY,CAChB,SAAU,KAAK,IAAI,EACnB,eAAgB,OAAO,QAAQ,eAAiB,GAChD,OAAQ,OAAO,OAAO,CAAC,EAAG,MAAM,CAClC,EACA,OAAO,qBAAuB,UAC9B,GAAI,CACF,eAAe,QAAQ,sBAAwB,UAAU,eAAgB,KAAK,UAAU,SAAS,CAAC,CACpG,MAAgB,CAEhB,CACF,CAEA,SAAS,sBAAsB,OAAQ,OAAQ,CAC7C,MAAM,OAAS,OAAO,QAAQ,eAAiB,GACzC,QAAU,OAAO,oBAAsB,OAAO,cAAgB,GACpE,GAAI,CAAC,QAAU,CAAC,OAAO,QAAU,CAAC,OAAO,gBAAkB,CAAC,QAC1D,MAAM,IAAI,MAAM,4DAA4D,EAE9E,MAAM,UAAY,GAAG,MAAM,MAAM,OAAO,MAAM,GACxC,UAAY,OAAO,qBACnB,QAAU,WAAa,UAAU,OAAO,SAAW,OAAO,OAAS,UAAU,SAAW,KAAK,IAAI,EACvG,MAAO,CACL,CAAC,iBAAiB,SAAS,GAAG,EAAG,OAAO,eACxC,CAAC,sBAAsB,SAAS,GAAG,EAAG,QACtC,CAAC,sBAAsB,SAAS,GAAG,EAAG,OAAO,eAAiB,OAAO,eAAiB,GACtF,CAAC,yBAAyB,SAAS,GAAG,EAAG,CACvC,YAAY,MAAM,GAClB,QAAQ,OAAO,MAAM,GACrB,cAAc,IAAI,KAAK,OAAO,EAAE,YAAY,CAAC,GAC7C,oBAAoB,OAAO,oBAAsB,EAAE,GACnD,cAAc,OAAO,sBAAwB,EAAE,GAC/C,qHACF,EAAE,KAAK,KAAK,CACd,CACF,CAEA,SAAS,kBAAkB,OAAQ,OAAQ,MAAO,CAChD,GAAI,CAAC,OAAS,OAAO,0BAA4B,OAAO,OAAQ,OAAO,QAAQ,QAAQ,EACvF,GAAI,OAAO,qBAAuB,OAAO,yBAA2B,OAAO,OACzE,OAAO,OAAO,oBAEhB,MAAM,KAAO,gBAAgB,MAAM,IAAM,CAAC,CAAC,EAAE,KAAK,SAAY,CAC5D,MAAM,WAAa,sBAAsB,OAAQ,MAAM,EACjD,KAAO,OAAO,SAAW,OAAO,QAAQ,QAAU,OAAO,QAAQ,OAAO,MAAQ,IACtF,QAAS,QAAU,EAAG,QAAU,EAAG,SAAW,EAAG,CAC/C,MAAM,WAAa,IAAI,gBACjB,QAAU,OAAO,WAAW,IAAM,WAAW,MAAM,EAAG,GAAI,EAChE,GAAI,CACF,MAAM,SAAW,MAAM,MAAM,GAAG,IAAI,iBAAkB,CACpD,OAAQ,OAAQ,YAAa,cAAe,UAAW,GACvD,QAAS,CAAE,eAAgB,mBAAoB,OAAU,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,UAAW,CAAC,EAAG,OAAQ,WAAW,MAC3D,CAAC,EACD,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,2CAA2C,EAC7E,MAAM,KAAO,MAAM,SAAS,KAAK,EACjC,GAAI,CAAC,MAAQ,OAAO,KAAK,OAAU,SAAU,MAAM,IAAI,MAAM,yCAAyC,EAEtG,OAAO,wBAA0B,OAAO,OACxC,MACF,OAAS,MAAO,CACd,GAAI,UAAY,EAAG,MAAM,KAC3B,QAAE,CACA,OAAO,aAAa,OAAO,CAC7B,CACA,MAAM,IAAI,QAAS,SAAY,OAAO,WAAW,QAAS,KAAO,QAAU,EAAE,CAAC,CAChF,CACF,CAAC,EACD,OAAO,uBAAyB,OAAO,OACvC,OAAO,oBAAsB,KAC7B,gBAAkB,KAAK,MAAM,IAAM,CAAC,CAAC,EACrC,MAAM,SAAW,IAAM,CACjB,OAAO,sBAAwB,OAAM,OAAO,oBAAsB,KACxE,EACA,YAAK,KAAK,SAAU,QAAQ,EACrB,IACT,CAEA,SAAS,iBAAiB,OAAQ,OAAQ,MAAO,CAC/C,GAAI,CAAC,QAAW,CAAC,OAAS,OAAO,0BAA4B,OAAO,OAAS,OAC7E,MAAM,SAAW,OAAO,cAAc,4BAA4B,EAClE,IAAI,MAAQ,OAAO,cAAc,8BAA8B,EAC3D,CAAC,OAAS,WACZ,MAAQ,SAAS,cAAc,QAAQ,EACvC,MAAM,KAAO,SACb,MAAM,UAAY,wBAClB,MAAM,QAAQ,mBAAqB,OACnC,MAAM,YAAc,uBACpB,MAAM,iBAAiB,QAAS,IAAM,CACpC,MAAM,UAAY,OAAO,qBACzB,iBAAiB,OAAQ,OAAO,yBAA4B,WAAa,UAAU,MAAO,CAC5F,CAAC,EACD,SAAS,MAAM,KAAK,GAElB,QAAO,MAAM,OAAS,IAC1B,MAAM,QAAU,IAAM,OAAO,sBAAwB,OAAO,qBAAqB,OAAO,SAAW,OAAO,OACtG,UAAY,QAAQ,IAAG,SAAS,YAAc,yCAClD,kBAAkB,OAAQ,OAAQ,KAAK,EAAE,KAAK,IAAM,CAC7C,QAAQ,IACT,QAAO,MAAM,OAAS,IACtB,WAAU,SAAS,YAAc,6GACrC,MAAM,mCAAoC,CAAE,eAAgB,OAAO,QAAQ,cAAe,OAAQ,OAAO,MAAO,CAAC,EACnH,CAAC,EAAE,MAAM,IAAM,CACR,QAAQ,IACT,QAAO,MAAM,OAAS,IACtB,WAAU,SAAS,YAAc,2EACrC,MAAM,oCAAqC,CAAE,eAAgB,OAAO,QAAQ,cAAe,OAAQ,OAAO,MAAO,CAAC,EACpH,CAAC,CACH,CAEA,SAAS,wBAAwB,OAAQ,CACvC,GAAI,CACF,MAAM,OAAS,OAAO,QAAQ,eAAiB,GACzC,IAAM,sBAAwB,OAC9B,UAAY,KAAK,MAAM,eAAe,QAAQ,GAAG,GAAK,MAAM,EAC9D,WAAa,UAAU,iBAAmB,QAC1C,UAAU,UAAY,KAAK,IAAI,GAAK,KAAK,IAAI,EAAI,UAAU,SAAW,OACtE,UAAU,QAAU,UAAU,OAAO,QAAU,UAAU,OAAO,eAClE,OAAO,qBAAuB,UAE9B,eAAe,WAAW,GAAG,CAEjC,MAAgB,CAEhB,CACF,CAEA,SAAS,uBAAuB,OAAQ,CACtC,MAAM,KAAO,eAAe,MAAM,EAC5B,UAAY,OAAO,qBACzB,GAAI,CAAC,KAAM,OACX,GAAI,CAAC,WAAa,KAAK,IAAI,EAAI,UAAU,UAAY,MAAuB,CAC1E,KAAK,iBAAiB,+BAA+B,EAAE,QAAS,OAAU,CACpE,MAAM,KAAK,WAAW,iBAAiB,GAAG,MAAM,OAAO,CAC7D,CAAC,EACD,MACF,CACA,MAAM,OAAS,UAAU,OAEzB,gBAAgB,KAAM,wBAAyB,OAAO,gBAAkB,EAAE,EAC1E,gBAAgB,KAAM,4BAA6B,OAAO,oBAAsB,OAAO,cAAgB,EAAE,EACzG,gBAAgB,KAAM,2BAA4B,OAAO,eAAiB,OAAO,eAAiB,EAAE,EACpG,gBAAgB,KAAM,4BAA6B,OAAO,QAAU,EAAE,EACtE,gBAAgB,KAAM,gCAAiC,OAAO,oBAAsB,EAAE,EACtF,gBAAgB,KAAM,kCAAmC,OAAO,sBAAwB,EAAE,EAC1F,gBAAgB,KAAM,+BAAgC,kHAAkH,CAC1K,CAEA,SAAS,oBAAoB,OAAQ,CACnC,MAAM,KAAO,eAAe,MAAM,EAClC,GAAI,CAAC,KAAM,CACT,kBAAkB,MAAM,EACxB,MACF,CACA,KAAK,iBAAiB,+BAA+B,EAAE,QAAS,OAAU,MAAM,OAAO,CAAC,EACxF,uBAAuB,MAAM,EAC7B,kBAAkB,MAAM,CAC1B,CAEA,SAAS,iBAAiB,OAAQ,OAAQ,CACxC,MAAM,KAAO,eAAe,MAAM,EAClC,GAAI,CAAC,KACH,yBAAkB,MAAM,EACjB,GAET,KAAK,iBAAiB,+BAA+B,EAAE,QAAS,OAAU,MAAM,OAAO,CAAC,EACxF,MAAM,UAAY,iBAAiB,MAAM,EACzC,uBAAgB,KAAM,kBAAmB,OAAO,eAAiB,OAAO,eAAiB,EAAE,EAC3F,gBAAgB,KAAM,aAAc,OAAO,gBAAkB,EAAE,EAC/D,gBAAgB,KAAM,0BAA2B,OAAO,oBAAsB,OAAO,cAAgB,EAAE,EACvG,gBAAgB,KAAM,kBAAmB,OAAO,QAAU,EAAE,EAC5D,gBAAgB,KAAM,kBAAmB,OAAO,QAAU,UAAU,EACpE,gBAAgB,KAAM,oBAAqB,qDAAqD,EAChG,gBAAgB,KAAM,0BAA2B,OAAO,sBAAyB,WAAa,UAAU,OAAU,EAAE,EACpH,gBAAgB,KAAM,0BAA2B,OAAO,oBAAsB,iBAAiB,MAAM,CAAC,EACtG,gBAAgB,KAAM,kBAAmB,OAAO,QAAQ,eAAiB,EAAE,EAC3E,gBAAgB,KAAM,cAAe,aAAa,MAAM,CAAC,EACzD,qBAAqB,OAAQ,SAAS,EACtC,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAM,UAAW,EAAK,CAAC,EAC9D,kBAAkB,MAAM,EACjB,EACT,CAEA,SAAS,UAAU,OAAQ,QAAS,CAClC,iBAAiB,MAAM,EACvB,OAAO,cAAc,yBAAyB,EAAE,YAAc,QAC9D,OAAO,cAAc,0BAA0B,EAAE,YAAc,EACjE,CAEA,SAAS,WAAW,OAAQ,CAC1B,OAAO,cAAc,yBAAyB,EAAE,YAAc,EAChE,CAEA,SAAS,gBAAgB,OAAQ,CAC/B,MAAO,CACL,MAAO,OAAO,cAAc,0BAA0B,EACtD,MAAO,OAAO,cAAc,gCAAgC,EAC5D,KAAM,OAAO,cAAc,+BAA+B,EAC1D,SAAU,OAAO,cAAc,mCAAmC,EAClE,MAAO,MAAM,KAAK,OAAO,iBAAiB,+BAA+B,CAAC,EAC1E,KAAM,OAAO,cAAc,+BAA+B,EAC1D,OAAQ,OAAO,cAAc,0BAA0B,CACzD,CACF,CAEA,SAAS,eAAe,OAAQ,MAAO,CACrC,MAAM,OAAS,gBAAgB,MAAM,EAC/B,UAAY,KAAK,IAAI,EAAG,KAAK,IAAI,MAAO,cAAc,OAAS,CAAC,CAAC,EACjE,KAAO,cAAc,SAAS,EAChC,OAAO,QAAO,OAAO,MAAM,YAAc,KAAK,OAC9C,OAAO,OAAM,OAAO,KAAK,YAAc,KAAK,MAC5C,OAAO,SAAQ,OAAO,OAAO,YAAc,KAAK,QAChD,OAAO,WAAU,OAAO,SAAS,MAAM,MAAQ,GAAG,KAAK,QAAQ,KACnE,OAAO,MAAM,QAAQ,CAAC,KAAM,YAAc,CACxC,KAAK,UAAU,OAAO,cAAe,UAAY,KAAK,IAAI,UAAW,CAAC,CAAC,EACvE,KAAK,UAAU,OAAO,YAAa,YAAc,KAAK,IAAI,UAAW,CAAC,CAAC,CACzE,CAAC,EACG,OAAO,OACT,OAAO,KAAK,YAAc,WAAa,EACnC,qFACA,0EAER,CAEA,SAAS,sBAAsB,UAAW,CACxC,OAAI,WAAa,IAAc,EAC3B,WAAa,IAAc,EAC3B,WAAa,KAAc,EAC3B,WAAa,IAAa,EAC1B,WAAa,IAAa,EACvB,CACT,CAEA,SAAS,iBAAiB,OAAQ,CAChC,MAAM,OAAS,gBAAgB,MAAM,EAChC,OAAO,QACZ,OAAO,MAAM,OAAS,GACtB,eAAe,OAAQ,CAAC,EACxB,mBAAmB,OAAO,KAAK,EACjC,CAEA,SAAS,iBAAiB,OAAQ,CAChC,MAAM,OAAS,gBAAgB,MAAM,EACjC,OAAO,QAAO,OAAO,MAAM,OAAS,IACpC,OAAO,WAAU,OAAO,SAAS,MAAM,MAAQ,OACnD,OAAO,MAAM,QAAS,MAAS,CAC7B,KAAK,UAAU,OAAO,YAAa,aAAa,CAClD,CAAC,CACH,CAEA,SAAS,QAAQ,OAAQ,KAAM,CAC7B,OAAO,iBAAiB,QAAQ,EAAE,QAAS,QAAW,CAChD,OAAO,aAAa,yBAAyB,IACjD,OAAO,SAAW,KACpB,CAAC,EACD,MAAM,eAAiB,OAAO,cAAc,4BAA4B,EACpE,iBACG,eAAe,QAAQ,WAAU,eAAe,QAAQ,SAAW,eAAe,YAAY,KAAK,GACxG,eAAe,YAAc,KAAO,yBAAsB,eAAe,QAAQ,UAEnF,OAAO,aAAa,YAAa,KAAO,OAAS,OAAO,CAC1D,CAEA,SAAS,mBAAmB,QAAS,CAC/B,CAAC,SAAW,CAAC,QAAQ,gBACzB,OAAO,WAAW,IAAM,CACtB,QAAQ,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,OAAQ,SAAU,CAAC,CACnF,EAAG,GAAG,CACR,CAEA,SAAS,kBAAkB,OAAQ,CAEjC,MAAM,MADQ,OAAO,QAAQ,cAAc,GAAK,UAC7B,cAAc,wBAAwB,EACzD,GAAI,CAAC,KAAM,OACX,MAAM,KAAO,eAAe,MAAM,EAC5B,OAAS,OAAO,wBAChB,SAAY,MAAS,MAAQ,KAAK,cAAc,0BAA0B,IAAI,KAAK,EACnF,MAAQ,SAAS,iBAAiB,EAClC,QAAU,SAAS,YAAY,EAC/B,IAAM,SAAS,iBAAiB,EAChC,SAAW,GAAQ,QAAU,OAAO,QAAU,OAAS,MAAM,OACjE,MAAM,SAAW,OAAO,eAAiB,OAAO,gBAChD,SAAW,QAAQ,OAAS,QAAQ,QAAU,OAAO,gBACrD,KAAO,IAAI,QAAU,OAAO,QACxB,QAAU,KAAK,cAAc,QAAQ,EACrC,OAAS,KAAK,cAAc,OAAO,EACzC,KAAK,QAAQ,gBAAkB,OAAO,QAAQ,EAC1C,UAAS,QAAQ,YAAc,SAAW,6BAA+B,yBACzE,SAAQ,OAAO,YAAc,SAAW,iCAAmC,yCACjF,CAEA,SAAS,0BAA0B,OAAQ,QAAS,CAClD,MAAM,MAAQ,OAAO,QAAQ,yBAAyB,EAChD,MAAQ,OAAO,QAAQ,cAAc,GAAK,SAC1C,UAAY,MAAM,cACtB,+FACF,EACM,MAAQ,YAAc,UAAU,QAAQ,4CAA4C,GAAK,UAAU,eAEzG,GAAI,CAAC,OAAS,CAAC,OAAS,CAAC,MAAM,cAC7B,OAAK,SAAW,GAAK,IACnB,OAAO,WAAW,IAAM,0BAA0B,QAAS,SAAW,GAAK,CAAC,EAAG,GAAG,EAE7E,GAIT,GADiB,MAAM,cAAc,wBAAwB,EAE3D,yBAAkB,MAAM,EACjB,GAGT,MAAM,KAAO,SAAS,cAAc,QAAQ,EAC5C,KAAK,KAAO,SACZ,KAAK,UAAY,qBACjB,KAAK,QAAQ,cAAgB,OAC7B,KAAK,aAAa,gBAAiB,MAAM,IAAM,kBAAkB,EAEjE,MAAM,KAAO,MAAM,cAAc,4BAA4B,EACzD,MAAM,KAAK,YAAY,KAAK,UAAU,EAAI,CAAC,EAE/C,MAAM,KAAO,SAAS,cAAc,MAAM,EAC1C,KAAK,UAAY,2BACjB,KAAK,UAAY,8FACjB,KAAK,YAAY,IAAI,EAErB,MAAM,MAAQ,MAAM,cAAc,6BAA6B,EAC/D,OAAI,OAAO,KAAK,YAAY,MAAM,UAAU,EAAI,CAAC,EAEjD,KAAK,iBAAiB,QAAS,IAAM,CACnC,kBAAkB,MAAM,EACxB,MAAM,KAAO,GACb,MAAM,cAAgB,OAAO,cAAc,iCAAiC,EAC5E,mBAAmB,KAAK,QAAQ,kBAAoB,QAAU,eAAiB,CAAC,cAAc,OAC1F,cAAgB,KAAK,EACzB,MAAM,mCAAoC,CACxC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,CACjC,CAAC,CACH,CAAC,EAED,MAAM,sBAAsB,WAAY,IAAI,EAC5C,kBAAkB,MAAM,EACjB,EACT,CAEA,SAAS,qBAAqB,OAAQ,CACpC,GAAI,OAAO,SAAS,OAAS,qBAAuB,CAAC,OAAO,eAAgB,OAC5E,MAAM,MAAQ,OAAO,QAAQ,yBAAyB,EAClD,QAAO,MAAM,KAAO,IACxB,IAAI,UAAY,GAChB,MAAM,gBAAkB,IAAM,CAC5B,UAAY,EACd,EACA,OAAO,iBAAiB,aAAc,gBAAiB,CAAE,KAAM,GAAM,QAAS,EAAK,CAAC,EACpF,OAAO,iBAAiB,QAAS,gBAAiB,CAAE,KAAM,GAAM,QAAS,EAAK,CAAC,EAC/E,OAAO,iBAAiB,UAAW,gBAAiB,CAAE,KAAM,EAAK,CAAC,EAClE,MAAM,MAAQ,IAAM,CACb,YAAY,OAAS,QAAQ,eAAe,CAAE,SAAU,OAAQ,MAAO,QAAS,OAAQ,SAAU,CAAC,CAC1G,EACA,OAAO,sBAAsB,IAAM,OAAO,sBAAsB,KAAK,CAAC,EAClE,SAAS,aAAe,YAC1B,OAAO,iBAAiB,OAAQ,MAAO,CAAE,KAAM,EAAK,CAAC,EAEvD,OAAO,WAAW,MAAO,GAAG,EAC5B,OAAO,WAAW,MAAO,GAAG,CAC9B,CAEA,SAAS,aAAa,OAAQ,CAC5B,MAAO,CACL,KAAM,OAAO,cAAc,wBAAwB,EACnD,MAAO,OAAO,cAAc,yBAAyB,EACrD,QAAS,OAAO,cAAc,2BAA2B,EACzD,OAAQ,OAAO,cAAc,0BAA0B,EACvD,KAAM,OAAO,cAAc,8BAA8B,EACzD,MAAO,OAAO,cAAc,8BAA8B,EAC1D,SAAU,OAAO,cAAc,gCAAgC,CACjE,CACF,CAEA,SAAS,YAAY,OAAQ,KAAM,CACjC,MAAM,KAAO,aAAa,MAAM,EAChC,CAAC,KAAK,OAAQ,KAAK,KAAM,KAAK,MAAO,KAAK,OAAO,EAAE,QAAS,MAAS,CAC/D,OAAM,KAAK,SAAW,KAC5B,CAAC,CACH,CAEA,SAAS,gBAAgB,OAAQ,CAC/B,MAAM,KAAO,aAAa,MAAM,EAC5B,KAAK,OAAM,KAAK,KAAK,OAAS,IAC9B,KAAK,OAAM,KAAK,KAAK,KAAO,IAC5B,KAAK,QAAO,KAAK,MAAM,YAAc,IACrC,KAAK,WAAU,KAAK,SAAS,YAAc,IAC/C,YAAY,OAAQ,EAAK,CAC3B,CAEA,SAAS,oBAAoB,OAAQ,CACnC,MAAM,KAAO,aAAa,MAAM,EAChC,gBAAgB,MAAM,EAClB,KAAK,OAAM,KAAK,KAAK,OAAS,IAC9B,KAAK,UAAS,KAAK,QAAQ,QAAU,GAC3C,CAEA,SAAS,uBAAuB,OAAQ,OAAQ,QAAS,CACvD,MAAM,UAAY,iBAAiB,MAAM,EACnC,aAAe,OAAO,cAAc,0BAA0B,EAC9D,eAAiB,OAAO,cAAc,kCAAkC,EACxE,cAAgB,OAAO,cAAc,iCAAiC,EACtE,OAAS,OAAO,cAAc,0BAA0B,EACxD,SAAW,OAAO,cAAc,4BAA4B,EAC5D,aAAe,OAAO,cAAc,0BAA0B,EAKpE,GAJA,OAAO,wBAA0B,OACjC,OAAO,yBAA2B,KAClC,yBAAyB,OAAQ,MAAM,EAEnC,CADa,iBAAiB,OAAQ,MAAM,EAE9C,MAAM,IAAI,MAAM,oFAAoF,EAEtG,OAAI,eAAc,aAAa,IAAM,OAAO,gBACxC,iBAAgB,eAAe,YAAc,0BAA0B,OAAO,sBAAyB,WAAa,UAAU,OAAU,SAAS,IACjJ,gBAAe,cAAc,OAAS,IACtC,SAAQ,OAAO,YAAc,0BAC7B,WAAU,SAAS,YAAc,yFACrC,iBAAiB,OAAQ,MAAM,EAC3B,eAAc,aAAa,OAAS,IACxC,iBAAiB,MAAM,EACvB,gBAAgB,MAAM,EACtB,MAAM,yBAA0B,CAC9B,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,OAAQ,OAAO,QAAU,GACzB,OAAQ,SAAW,QAAQ,QAAU,WACvC,CAAC,EACD,mBAAmB,eAAiB,QAAQ,EACrC,EACT,CAEA,SAAS,sBAAsB,OAAQ,QAAS,CAC9C,OAAO,wBAA0B,KACjC,OAAO,yBAA2B,KAClC,OAAO,wBAA0B,GACjC,oBAAoB,MAAM,EAC1B,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAO,UAAW,GAAO,UAAW,EAAM,CAAC,EAClF,MAAM,aAAe,OAAO,cAAc,0BAA0B,EAC9D,cAAgB,OAAO,cAAc,iCAAiC,EACtE,SAAW,OAAO,cAAc,4BAA4B,EAC5D,aAAe,OAAO,cAAc,0BAA0B,EAChE,cAAc,aAAa,gBAAgB,KAAK,EAChD,gBAAe,cAAc,OAAS,IACtC,WAAU,SAAS,YAAc,IACrC,MAAM,UAAY,OAAO,cAAc,8BAA8B,EACjE,YAAW,UAAU,OAAS,IAC9B,eAAc,aAAa,OAAS,IACxC,iBAAiB,MAAM,EACvB,gBAAgB,MAAM,EAClB,UAAS,OAAO,cAAc,0BAA0B,EAAE,YAAc,QAC9E,CAEA,SAAS,sBAAsB,OAAQ,iBAAkB,CACvD,MAAM,gBAAkB,OAAO,qBACzB,kBAAoB,OAAO,QAAQ,WAAa,GAChD,YAAc,aAAa,MAAM,EACvC,OAAO,qBAAuB,YAC9B,MAAM,UAAY,iBAAiB,MAAM,EACzC,OAAO,QAAQ,UAAY,UAC3B,MAAM,UAAY,iBAAiB,MAAM,EACnC,MAAQ,OAAO,QAAQ,yBAAyB,EAEtD,IADI,CAAC,OAAS,MAAM,OAAM,qBAAqB,OAAQ,SAAS,EAC5D,iBAAmB,kBAAoB,cAAgB,OAAO,yBAA2B,OAAO,0BAA2B,CAC7H,MAAM,OAAS,OAAO,yBAA2B,OAAO,yBAClD,iBAAmB,OAAO,oBAAsB,kBAClD,kBAAoB,mBAAqB,WAC3C,OAAO,mBAAqB,UACxB,OAAO,yBAAyB,iBAAiB,OAAQ,MAAM,GAEnE,sBAAsB,OAAQ,kBAAoB,sEAAsE,CAE5H,CACA,kBAAkB,MAAM,CAC1B,CAEA,eAAe,WAAW,OAAQ,CAChC,GAAI,OAAO,QAAQ,yBAA2B,OAAQ,OACtD,OAAO,QAAQ,uBAAyB,OAExC,MAAM,SAAW,OAAO,QAAQ,SAC1B,MAAQ,OAAO,QAAQ,yBAAyB,EACtD,GAAI,CAAC,SAAU,CACb,OAAO,OAAS,GACZ,QAAO,MAAM,OAAS,IAC1B,MACF,CACA,GAAI,CACF,OAAO,kBAAoB,MAAM,WAAW,OAAO,QAAQ,SAAS,CACtE,MAAgB,CACd,OAAO,OAAS,GACZ,QAAO,MAAM,OAAS,IAC1B,MACF,CACA,MAAM,OAAS,cAAc,MAAM,EACnC,GAAI,CAAC,QAAU,CAAC,OAAO,oBAAsB,CAAC,WAAW,MAAM,EAAE,OAAQ,CACvE,OAAO,OAAS,GACZ,QAAO,MAAM,OAAS,IAC1B,MACF,CAEA,OAAO,OAAS,GACZ,QAAO,MAAM,OAAS,IAC1B,IAAI,cAAgB,GACpB,MAAM,eAAiB,IAAM,CACvB,eAAkB,OAAS,CAAC,MAAM,OACtC,cAAgB,GAChB,mBAAmB,QAAQ,EAC7B,EACI,MACF,MAAM,iBAAiB,SAAU,cAAc,EAE/C,eAAe,EAEjB,OAAO,wBAA0B,KACjC,OAAO,yBAA2B,KAClC,OAAO,wBAA0B,GACjC,OAAO,qBAAuB,aAAa,MAAM,EACjD,wBAAwB,MAAM,EAC9B,uBAAuB,MAAM,EACzB,OAAO,sBAAsB,iBAAiB,OAAQ,OAAO,qBAAqB,MAAM,EAC5F,uBAAuB,MAAM,EAC7B,sBAAsB,MAAM,EAC5B,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAO,UAAW,GAAO,UAAW,EAAM,CAAC,EAClF,0BAA0B,OAAQ,CAAC,EACnC,qBAAqB,MAAM,EAC3B,eAAe,EAEf,MAAM,UAAY,OAAO,cAAc,wBAAwB,EACzD,SAAW,OAAO,cAAc,wBAAwB,EACxD,eAAiB,OAAO,cAAc,4BAA4B,EAClE,aAAe,OAAO,cAAc,0BAA0B,EAC9D,eAAiB,OAAO,iBAAiB,2BAA2B,EACpE,cAAgB,OAAO,cAAc,4BAA4B,EACjE,aAAe,OAAO,cAAc,0BAA0B,EAC9D,eAAiB,OAAO,cAAc,kCAAkC,EACxE,cAAgB,OAAO,cAAc,iCAAiC,EACtE,OAAS,OAAO,cAAc,0BAA0B,EACxD,YAAc,OAAO,cAAc,yBAAyB,EAC5D,SAAW,OAAO,cAAc,4BAA4B,EAC5D,KAAO,aAAa,MAAM,EAC1B,YAAc,2FAEpB,IAAI,aAAe,KACf,gBAAkB,GAClB,SAAW,OAAO,eAAe,QAAQ,qBAAqB,GAAK,GAAG,EAE1E,UAAU,iBAAiB,SAAU,SAAY,CAS/C,GARA,WAAW,MAAM,EACjB,sBAAsB,MAAM,EAC5B,iBAAiB,MAAM,EACvB,gBAAkB,GAClB,cAAc,gBAAgB,KAAK,EACnC,YAAY,OAAS,GACrB,eAAe,SAAW,GAC1B,aAAe,UAAU,OAAS,UAAU,MAAM,CAAC,EAC/C,EAAC,aAQL,IAPA,MAAM,+BAAgC,CACpC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,UAAW,aAAa,MAAQ,UAChC,iBAAkB,eAAe,aAAa,IAAI,EAClD,iBAAkB,aAAa,KAAO,EAAI,KAAO,KAAO,qBAAuB,UACjF,CAAC,EACG,aAAa,KAAO,EAAI,KAAO,KAAM,CACvC,UAAU,OAAQ,4DAA4D,EAC9E,aAAe,KACf,MACF,CACA,gBAAkB,MAAM,cAAc,YAAY,EAClD,cAAc,IAAM,gBACpB,YAAY,OAAS,GACrB,eAAe,SAAW,GAC1B,OAAO,YAAc,yDACrB,mBAAmB,cAAc,EACnC,CAAC,EAEG,WACF,SAAS,iBAAiB,WAAa,OAAU,CAC/C,MAAM,eAAe,CACvB,CAAC,EACD,SAAS,iBAAiB,OAAQ,MAAO,OAAU,CAEjD,GADA,MAAM,eAAe,EACjB,CAAC,MAAM,cAAgB,CAAC,MAAM,aAAa,OAAS,CAAC,MAAM,aAAa,MAAM,OAAQ,OAC1F,MAAM,SAAW,IAAI,aACrB,SAAS,MAAM,IAAI,MAAM,aAAa,MAAM,CAAC,CAAC,EAC9C,UAAU,MAAQ,SAAS,MAC3B,UAAU,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAChE,CAAC,GAGH,OAAO,iBAAiB,SAAW,OAAU,CAC3C,MAAM,OAAS,MAAM,OACrB,GAAI,QAAU,OAAO,SAAW,OAAO,QAAQ,mCAAmC,EAAG,CACnF,MAAM,UAAY,iBAAiB,MAAM,EACzC,qBAAqB,OAAQ,SAAS,GAClC,OAAO,yBAA2B,OAAO,2BAC3C,sBAAsB,OAAQ,sEAAsE,CAExG,CACF,CAAC,EAED,OAAO,iBAAiB,QAAU,OAAU,CAC1C,MAAM,OAAS,MAAM,QAAU,MAAM,OAAO,SAAW,MAAM,OAAO,QAAQ,kCAAkC,EAC9G,GAAI,CAAC,QAAU,CAAC,OAAO,SAAS,MAAM,EAAG,OACzC,MAAM,MAAQ,OAAO,cAAc,mCAAmC,EAClE,CAAC,OAAS,MAAM,UACpB,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAC5D,CAAC,EAED,MAAM,aAAe,OAAO,QAAQ,cAAc,GAAK,SACvD,qBAAqB,OAAQ,YAAY,EACzC,aAAa,iBAAiB,SAAW,OAAU,CACjD,MAAM,OAAS,MAAM,OACjB,QAAU,OAAO,SAAW,OAAO,QAAQ,uBAAuB,IAClE,QAAU,OAAO,SAAW,OAAO,QACrC,+FACF,GAAK,OAAO,OAAS,OAAO,MAAM,QAAU,OAAO,yBACjD,sBAAsB,OAAQ,oDAAoD,EAEpF,OAAO,WAAW,IAAM,CACtB,sBAAsB,MAAM,EAC5B,0BAA0B,OAAQ,CAAC,CACrC,EAAG,CAAC,EACN,CAAC,EACD,aAAa,iBAAiB,iBAAkB,IAAM,CACpD,sBAAsB,MAAM,EAC5B,0BAA0B,OAAQ,CAAC,CACrC,CAAC,EAED,eAAe,iBAAiB,QAAS,SAAY,CACnD,WAAW,MAAM,EACjB,SAAS,YAAc,GACvB,sBAAsB,MAAM,EAC5B,MAAM,UAAY,iBAAiB,MAAM,EACnC,UAAY,iBAAiB,MAAM,EACzC,GAAI,CAAC,UAAW,CACd,UAAU,OAAQ,yHAAyH,EAC3I,MACF,CACA,GAAI,CAAC,cAAgB,CAAC,gBAAiB,CACrC,UAAU,MAAM,EAChB,MACF,CACA,GAAI,UAAY,EAAc,CAC5B,UAAU,OAAQ,6OAA6O,EAC/P,aAAa,OAAS,GACtB,aAAa,YAAc,+BAC3B,MACF,CACA,MAAM,cAAgB,SAAW,EACjC,QAAQ,OAAQ,EAAI,EACpB,iBAAiB,MAAM,EACvB,MAAM,mCAAoC,CACxC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,eAAgB,cAChB,eAAgB,WAAa,UAAU,KACzC,CAAC,EACD,MAAM,iBAAmB,KAAK,IAAI,EAC5B,YAAc,OAAO,YAAY,IAAM,CAC3C,eAAe,OAAQ,sBAAsB,KAAK,IAAI,EAAI,gBAAgB,CAAC,CAC7E,EAAG,GAAI,EACP,eAAe,OAAQ,CAAC,EAExB,GAAI,CACF,MAAM,aAAe,gBACf,OAAS,MAAM,eAAe,SAAU,OAAO,OAAO,CAC1D,SAAU,aAAa,KACvB,UAAW,aAAa,MAAQ,aAChC,aAAc,gBACd,eAAgB,OAAO,QAAQ,cAC/B,cAAe,OAAO,QAAQ,aAC9B,WAAY,aAAa,MAAM,EAC/B,WAAY,UACZ,eAAgB,WAAa,UAAU,MACvC,iBAAkB,UAClB,WAAY,aAAa,EACzB,SAAU,OAAO,SAAS,IAC5B,EAAG,UAAU,EAAG,sBAAsB,CAAC,CAAC,EACxC,GAAI,kBAAoB,cAAgB,iBAAiB,MAAM,IAAM,YAChE,iBAAiB,MAAM,GAAK,CAAC,GAAG,OAAS,WAAa,CAAC,GAAG,IAC7D,MAAM,IAAI,MAAM,wFAAwF,EAE1G,OAAO,mBAAqB,UAC5B,OAAO,mBAAqB,aAAa,MAAM,EAC/C,SAAW,cACX,eAAe,QAAQ,sBAAuB,OAAO,QAAQ,CAAC,EAC9D,uBAAuB,OAAQ,OAAQ,CAAE,OAAQ,WAAY,CAAC,EAC9D,oBAAoB,MAAM,EAC1B,MAAM,qCAAsC,CAC1C,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,OAAQ,OAAO,QAAU,GACzB,WAAY,OAAO,WACnB,eAAgB,OAAO,sBAAyB,WAAa,UAAU,MACvE,MAAO,OAAO,OAAS,SACzB,CAAC,CACH,OAAS,MAAO,CACd,OAAO,wBAA0B,KACjC,OAAO,wBAA0B,GACjC,oBAAoB,MAAM,EAC1B,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAO,UAAW,GAAO,UAAW,EAAM,CAAC,EAClF,aAAa,OAAS,GACtB,aAAa,gBAAgB,KAAK,EAC9B,gBAAe,cAAc,OAAS,IAC1C,iBAAiB,MAAM,EACvB,MAAM,QAAU,OAAO,OAAS,MAAM,SAAW,OAAS,EAAE,EAC5D,UAAU,OAAQ,SAAW,UAAY,4BACrC,QACA,kHAAkH,EACtH,MAAM,kCAAmC,CACvC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,eAAgB,cAChB,eAAgB,WAAa,UAAU,MACvC,aAAc,sBAAsB,KAAK,CAC3C,CAAC,CACH,QAAE,CACA,OAAO,cAAc,WAAW,EAChC,QAAQ,OAAQ,EAAK,CACvB,CACF,CAAC,EAED,eAAe,QAAS,QAAW,OAAO,iBAAiB,QAAS,IAAM,CACxE,UAAU,MAAQ,GAClB,UAAU,MAAM,CAClB,CAAC,CAAC,EAEE,KAAK,QACP,KAAK,OAAO,iBAAiB,QAAS,SAAY,CAChD,MAAM,OAAS,OAAO,wBACtB,GAAI,CAAC,OAAQ,OACb,MAAM,MAAQ,KAAK,MAAQ,OAAO,KAAK,MAAM,OAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAI,GACjF,GAAI,CAAC,gBAAgB,KAAK,EAAG,CACvB,KAAK,QAAO,KAAK,MAAM,YAAc,uCACrC,KAAK,OAAO,KAAK,MAAM,MAAM,EACjC,MACF,CACA,GAAI,CAAC,KAAK,SAAW,CAAC,KAAK,QAAQ,QAAS,CACtC,KAAK,QAAO,KAAK,MAAM,YAAc,uEACrC,KAAK,SAAS,KAAK,QAAQ,MAAM,EACrC,MACF,CACI,KAAK,QAAO,KAAK,MAAM,YAAc,IACzC,YAAY,OAAQ,EAAI,EACxB,MAAM,WAAa,CACjB,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,OAAQ,OAAO,QAAU,GACzB,eAAgB,OAAO,sBAAyB,iBAAiB,MAAM,GAAK,iBAAiB,MAAM,EAAE,KACvG,EACA,GAAI,CACF,MAAM,aAAe,MAAM,qBAAqB,SAAU,qBAAqB,OAAQ,OAAQ,MAAO,WAAW,CAAC,EAClH,GAAI,CAAC,cAAgB,CAAC,aAAa,wBAAyB,MAAM,IAAI,MAAM,4BAA4B,EACxG,MAAM,gCAAiC,UAAU,EAC7C,OAAO,0BAA4B,SACrC,gBAAgB,MAAM,EAClB,KAAK,WAAU,KAAK,SAAS,YAAc,4CAEnD,MAAgB,CACd,MAAM,kCAAmC,UAAU,EAC/C,OAAO,0BAA4B,QAAU,KAAK,QACpD,KAAK,MAAM,YAAc,yEAE7B,QAAE,CACI,OAAO,0BAA4B,QAAQ,YAAY,OAAQ,EAAK,CAC1E,CACF,CAAC,EAGC,KAAK,MACP,KAAK,KAAK,iBAAiB,QAAS,IAAM,CACpC,KAAK,OAAM,KAAK,KAAK,KAAO,GAClC,CAAC,EAGH,aAAa,iBAAiB,QAAS,IAAM,CAC3C,OAAO,wBAA0B,GACjC,aAAa,OAAS,GACtB,gBAAgB,MAAM,EACtB,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAO,UAAW,GAAO,UAAW,EAAM,CAAC,EAClF,OAAO,YAAc,0EACrB,MAAM,QAAU,aAAa,cAC3B,+FACF,EACI,QAAO,MAAM,KAAO,IACxB,mBAAmB,UAAY,QAAQ,QAAQ,cAAc,GAAK,QAAQ,EAC1E,MAAM,uCAAwC,CAC5C,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,CACjC,CAAC,CACH,CAAC,EAED,SAAS,sBAAsB,MAAO,CAChC,OAAO,sBAAsB,iBAAiB,OAAQ,OAAO,qBAAqB,OAAQ,EAAI,EAC9F,CAAC,OAAO,yBAA2B,OAAO,2BAC5C,MAAM,8BAA+B,CACnC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,OAAQ,OAAO,yBAAyB,QAAU,GAClD,OAAQ,aACV,CAAC,EACD,uBAAuB,OAAQ,OAAO,yBAA0B,CAAE,OAAQ,aAAc,CAAC,GAE3F,MAAM,WAAa,EAAQ,OAAO,wBAElC,OADA,mBAAmB,OAAQ,EAAG,CAAE,MAAO,WAAY,UAAW,WAAY,UAAW,EAAK,CAAC,EACtF,OAAO,yBAYZ,iBAAiB,OAAQ,OAAO,uBAAuB,EACvD,MAAM,4BAA6B,CACjC,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,YAAa,EACf,CAAC,EACM,KAjBL,uBAAuB,MAAM,EAC7B,OAAO,wBAA0B,GACjC,mBAAmB,OAAQ,EAAG,CAAE,MAAO,GAAO,UAAW,GAAO,UAAW,EAAM,CAAC,EAClF,OAAO,YAAc,sEACrB,MAAM,4CAA6C,CACjD,eAAgB,OAAO,QAAQ,cAC/B,WAAY,aAAa,MAAM,EAC/B,YAAa,EACf,CAAC,EACM,GASX,CAEA,SAAS,kBAAkB,MAAO,CAChC,MAAM,OAAS,MAAM,OACrB,GAAI,CAAC,QAAU,CAAC,OAAO,QAAS,MAAO,GACvC,MAAM,OAAS,OAAO,QAAQ,6EAA6E,EAC3G,GAAI,CAAC,OAAQ,MAAO,GAEpB,MAAM,KAAO,eAAe,MAAM,EAC5B,YAAc,OAAO,QAAQ,cAAc,EACjD,MAAO,GACJ,OAAS,KAAK,SAAS,MAAM,GAAK,OAAO,OAAS,OAClD,aAAe,YAAY,SAAS,MAAM,GAC3C,OAAO,UAAU,SAAS,sBAAsB,EAEpD,CAGA,SAAS,iBAAiB,SAAW,OAAU,CACzC,MAAM,SAAW,eAAe,MAAM,GAAG,sBAAsB,KAAK,CAC1E,EAAG,CAAE,QAAS,EAAK,CAAC,EACpB,SAAS,iBAAiB,WAAa,OAAU,CAC/C,GAAI,MAAM,SAAW,eAAe,MAAM,EAAG,OAC7C,MAAM,cAAgB,MAAM,KAAK,MAAM,OAAO,iBAAiB,+BAA+B,EAAI,OAAU,MAAM,IAAI,EAClH,OAAO,wBAAyB,iBAAiB,OAAQ,OAAO,uBAAuB,EACtF,uBAAuB,MAAM,EAClC,cAAc,QAAS,MAAS,MAAM,SAAS,OAAO,IAAI,CAAC,EAC3D,MAAM,OAAO,iBAAiB,+BAA+B,EAAE,QAAS,OAAU,CAChF,MAAM,SAAS,IAAI,MAAM,KAAM,MAAM,KAAK,CAC5C,CAAC,CACH,EAAG,CAAE,QAAS,EAAK,CAAC,EACpB,SAAS,iBAAiB,QAAU,OAAU,CACxC,kBAAkB,KAAK,GAAG,sBAAsB,KAAK,CAC3D,EAAG,CAAE,QAAS,EAAK,CAAC,CACtB,CAEA,SAAS,MAAO,CACd,SAAS,iBAAiB,sBAAsB,EAAE,QAAS,QAAW,WAAW,MAAM,CAAC,CAC1F,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,KAAM,CAAE,KAAM,EAAK,CAAC,EAElE,KAAK,CAET,GAAG",
  "names": []
}
