{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/tcg-gap-filler-main.js?cb=1781414549"],
  "sourcesContent": ["(() => {\r\n  const root = document.querySelector('[data-tcg-gap-filler]');\r\n  if (!root) return;\r\n\r\n  root.classList.add('is-hydrating');\r\n\r\n  const apiBase = (() => {\r\n    const raw = (root.dataset.apiBase || '').replace(/\\/$/, '');\r\n    if (raw && /kartenladen24\\.de$/i.test(window.location.hostname) && raw.includes('loca.lt')) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Ignoriere loca.lt Cockpit-URL auf Produktion.');\r\n      return '';\r\n    }\r\n    return raw;\r\n  })();\r\n\r\n  const fetchWithTimeout = async (url, options = {}, timeoutMs = 4000) => {\r\n    const controller = new AbortController();\r\n    const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs);\r\n    try {\r\n      return await fetch(url, { ...options, signal: controller.signal });\r\n    } finally {\r\n      window.clearTimeout(timeoutId);\r\n    }\r\n  };\r\n  const defaultSet = root.dataset.defaultSet || 'ssp';\r\n  /** Resolved only after catalog + ?set= are known \u2014 avoid flashing the default set name. */\r\n  let setResolved = false;\r\n\r\n  const SET_HANDLE_ALIASES = {\r\n    pbl: 'pbl',\r\n    dunkelnacht: 'pbl',\r\n    'pitch-black': 'pbl',\r\n    pitchblack: 'pbl',\r\n    me5: 'pbl',\r\n    me05: 'pbl',\r\n    obf: 'obf',\r\n    obsidianflammen: 'obf',\r\n    'obsidian-flammen': 'obf',\r\n    sv03: 'obf',\r\n    sv3: 'obf',\r\n  };\r\n\r\n  const isPocketSet = (set) => {\r\n    const name = String(set?.name || '');\r\n    const series = String(set?.series || '');\r\n    return /pocket|sammelkartenspiel\u2011pocket|sammelkartenspiel-pocket/i.test(`${name} ${series}`);\r\n  };\r\n\r\n  const resolveSetHandle = (raw, sets = setsCache) => {\r\n    const key = String(raw || '').trim().toLowerCase();\r\n    if (!key) return '';\r\n    const aliased = SET_HANDLE_ALIASES[key] || key;\r\n    if (sets?.some((s) => String(s.handle).toLowerCase() === aliased)) return aliased;\r\n    const byCode = sets?.find(\r\n      (s) => String(s.set_code || '').trim().toLowerCase() === aliased || String(s.set_code || '').trim().toLowerCase() === key\r\n    );\r\n    if (byCode) return byCode.handle;\r\n    const byTcg = sets?.find(\r\n      (s) => String(s.tcgdex_id || '').trim().toLowerCase() === aliased || String(s.tcgdex_id || '').trim().toLowerCase() === key\r\n    );\r\n    if (byTcg) return byTcg.handle;\r\n    const byName = sets?.find((s) => {\r\n      const name = String(s.name || '').toLowerCase();\r\n      return name.startsWith(key) || name.includes(` ${key}`) || name.includes(aliased);\r\n    });\r\n    if (byName) return byName.handle;\r\n    return aliased;\r\n  };\r\n\r\n  const resolveInitialSetHandle = () => {\r\n    const fromUrl = new URLSearchParams(window.location.search).get('set');\r\n    const normalized = String(fromUrl || '').trim().toLowerCase();\r\n    return normalized || '';\r\n  };\r\n  const checklistAsset = root.dataset.checklistAsset || '';\r\n  const setsIndexAsset = root.dataset.setsIndex || '';\r\n  const inventorySnapshotAsset = root.dataset.inventorySnapshot || '';\r\n  /** @type {object|null} */\r\n  let inventorySnapshotCache = null;\r\n  /** @type {object|null} Cockpit/checklist/TCGdex payload for image backfill after storefront merge. */\r\n  let setImagePayloadCache = null;\r\n  /** @type {string} */\r\n  let setImagePayloadHandle = '';\r\n  const grid = root.querySelector('[data-gap-grid]');\r\n  const stats = root.querySelector('[data-gap-stats]');\r\n  const feedback = root.querySelector('[data-gap-feedback]');\r\n  const setSelect = root.querySelector('[data-gap-set-select]');\r\n  const setPicker = root.querySelector('[data-gap-set-picker]');\r\n  const setTrigger = root.querySelector('[data-gap-set-trigger]');\r\n  const setTriggerLabel = root.querySelector('[data-gap-set-trigger-label]');\r\n  const setDropdown = root.querySelector('[data-gap-set-dropdown]');\r\n  const setSearchInput = root.querySelector('[data-gap-set-search]');\r\n  const setList = root.querySelector('[data-gap-set-list]');\r\n  const searchInput = root.querySelector('[data-gap-search]');\r\n  const filterVariantGroup = root.querySelector('[data-gap-filter-variants]');\r\n  const filterStockInput = root.querySelector('[data-gap-filter-stock]');\r\n  const filterWishlistInput = root.querySelector('[data-gap-filter-wishlist]');\r\n  const imageNotice = root.querySelector('[data-gap-image-notice]');\r\n  const missingImagesNotice = root.querySelector('[data-gap-missing-images-notice]');\r\n  const priceLabel = root.dataset.priceLabel || 'Unser Preis';\r\n  const kpiSet = root.querySelector('[data-gap-kpi-set]');\r\n  const kpiStock = root.querySelector('[data-gap-kpi-stock]');\r\n  const setHeadingWrap = root.querySelector('[data-gap-set-heading-wrap]');\r\n  const setHeading = root.querySelector('[data-gap-set-heading]');\r\n  const legendWrap = root.querySelector('[data-gap-legend]');\r\n  const legendDismissBtn = root.querySelector('[data-gap-legend-dismiss]');\r\n  const zeroStockNotice = root.querySelector('[data-gap-zero-stock]');\r\n  const zeroStockNoticeDefault = zeroStockNotice?.textContent?.trim() || '';\r\n  const sidebarCartStat = root.querySelector('[data-gap-sidebar-cart-stat]');\r\n  const viewCartBtn = root.querySelector('[data-gap-view-cart]');\r\n  const cartDrawer = root.querySelector('[data-gap-cart-drawer]');\r\n  const cartDrawerList = root.querySelector('[data-gap-cart-drawer-list]');\r\n  const cartDrawerSummary = root.querySelector('[data-gap-cart-drawer-summary]');\r\n  if (cartDrawer) {\r\n    cartDrawer.classList.add('tcg-gap-cart-drawer--peek');\r\n    const cartPanel = cartDrawer.querySelector('.tcg-gap-cart-drawer__panel');\r\n    if (cartPanel) {\r\n      cartPanel.setAttribute('role', 'complementary');\r\n      cartPanel.removeAttribute('aria-modal');\r\n    }\r\n    window.Kl24CartDrawerCheckout?.bind(cartDrawer);\r\n    window.Kl24CartDrawerUI?.ensureFooterTotal(cartDrawer);\r\n  }\r\n  const sidebarWishStat = root.querySelector('[data-gap-sidebar-wish-stat]');\r\n  const viewWishlistBtn = root.querySelector('[data-gap-view-wishlist]');\r\n  const wishlistDrawer = root.querySelector('[data-gap-wishlist-drawer]');\r\n  const wishlistDrawerList = root.querySelector('[data-gap-wishlist-drawer-list]');\r\n  const wishlistDrawerSummary = root.querySelector('[data-gap-wishlist-drawer-summary]');\r\n  const wishlistDrawerInquiryBtn = root.querySelector('[data-gap-wishlist-drawer-inquiry]');\r\n  const sectionId = root.dataset.sectionId || '';\r\n  const quickAddOpener = root.querySelector('[data-gap-quick-add-opener]');\r\n  const getQuickAddModal = () =>\r\n    (sectionId ? document.getElementById(`GapFillerQuickAdd-${sectionId}`) : null) ||\r\n    document.querySelector('quick-add-modal[id^=\"GapFillerQuickAdd-\"]');\r\n  const cardPreviewRoot = root.querySelector('[data-gap-card-preview]');\r\n  const cardPreviewMedia = root.querySelector('[data-gap-card-preview-media]');\r\n  const cardPreviewName = root.querySelector('[data-gap-card-preview-name]');\r\n  const cardPreviewMeta = root.querySelector('[data-gap-card-preview-meta]');\r\n  const cardPreviewUnavailable = root.querySelector('[data-gap-card-preview-unavailable]');\r\n  const cardPreviewCloseBtns = root.querySelectorAll(\r\n    '[data-gap-card-preview-close], [data-gap-card-preview-close-btn]'\r\n  );\r\n\r\n  const LEGEND_DISMISS_KEY = 'tcg_gap_legend_dismissed';\r\n  const RECENT_SETS_KEY = 'tcg_gap_recent_sets';\r\n  const MAX_RECENT_SETS = 3;\r\n  const SET_SERIES_ORDER = [\r\n    'Zuletzt gew\u00E4hlt',\r\n    'Mega-Entwicklung',\r\n    'Karmesin & Purpur',\r\n    'Pok\u00E9mon Pocket',\r\n    'Schwert & Schild',\r\n    'Sonne & Mond',\r\n    'XY',\r\n    'Weitere Sets',\r\n  ];\r\n\r\n  /** Official main-set totals (theme index / collection set_total). Not TCGdex total incl. secrets. */\r\n  const SET_OFFICIAL_TOTALS = {\r\n    pbl: 84,\r\n    mew: 165,\r\n    ssp: 191,\r\n    pre: 131,\r\n    dri: 182,\r\n    jtg: 159,\r\n    scr: 142,\r\n    pfl: 94,\r\n    meg: 132,\r\n    shf: 72,\r\n    por: 88,\r\n    cri: 92,\r\n    asc: 100,\r\n    obf: 197,\r\n  };\r\n\r\n  /** @type {number} */\r\n  let currentSetOfficialTotal = 0;\r\n\r\n  let setPickerHighlightIndex = -1;\r\n  let setPickerOptionsFlat = [];\r\n\r\n  const initLegendDismiss = () => {\r\n    if (!legendWrap) return;\r\n    if (localStorage.getItem(LEGEND_DISMISS_KEY) === '1') {\r\n      legendWrap.classList.add('is-dismissed');\r\n    }\r\n    legendDismissBtn?.addEventListener('click', () => {\r\n      localStorage.setItem(LEGEND_DISMISS_KEY, '1');\r\n      legendWrap.classList.add('is-dismissed');\r\n    });\r\n  };\r\n\r\n  /** Normalize \"Serie - Set\" \u2192 \"Set (Serie)\" when not already parenthesized. */\r\n  const formatSetDisplayName = (raw) => {\r\n    const s = String(raw || '').trim();\r\n    if (!s || s.includes(' (')) return s;\r\n    const idx = s.indexOf(' - ');\r\n    if (idx <= 0) return s;\r\n    const series = s.slice(0, idx).trim();\r\n    const set = s.slice(idx + 3).trim();\r\n    if (!series || !set) return s;\r\n    return `${set} (${series})`;\r\n  };\r\n\r\n  const withGrundsetLabel = (name, handle) => {\r\n    const formatted = formatSetDisplayName(name);\r\n    const h = String(handle || '').toLowerCase();\r\n    if (h !== 'svi' && h !== 'meg') return formatted;\r\n    if (/grundset/i.test(formatted)) return formatted;\r\n    const core = formatted.replace(/\\s*\\(.*\\)\\s*$/, '').trim();\r\n    return core ? `${core} Grundset` : formatted;\r\n  };\r\n\r\n  const currentSetDisplayName = () => {\r\n    const meta = setsCache.find((s) => s.handle === currentSetHandle);\r\n    if (!meta) return withGrundsetLabel(currentSetHandle, currentSetHandle);\r\n    if (catalogLanguage === 'en') {\r\n      const englishName = englishNameForSet(meta);\r\n      if (englishName) return withGrundsetLabel(englishName, currentSetHandle);\r\n    }\r\n    return withGrundsetLabel(meta.name || currentSetHandle, currentSetHandle);\r\n  };\r\n\r\n  const syncSetHeading = () => {\r\n    if (!setHeading) return;\r\n    const loading = root.dataset.loading === '1' || !setResolved || !currentSetHandle;\r\n    if (loading) {\r\n      setHeading.textContent = 'Set wird geladen \u2026';\r\n      if (setHeadingWrap) {\r\n        setHeadingWrap.hidden = false;\r\n        setHeadingWrap.removeAttribute('hidden');\r\n      }\r\n      return;\r\n    }\r\n    const name = currentSetDisplayName();\r\n    const known = setsCache.some((s) => s.handle === currentSetHandle);\r\n    if (known && name) {\r\n      setHeading.textContent = name;\r\n      if (setHeadingWrap) {\r\n        setHeadingWrap.hidden = false;\r\n        setHeadingWrap.removeAttribute('hidden');\r\n      }\r\n    } else {\r\n      setHeading.textContent = '';\r\n      if (setHeadingWrap) {\r\n        setHeadingWrap.hidden = true;\r\n        setHeadingWrap.setAttribute('hidden', '');\r\n      }\r\n    }\r\n  };\r\n\r\n  const TCGDEX_API_DE = 'https://api.tcgdex.net/v2/de';\r\n  const TCGDEX_API_EN = 'https://api.tcgdex.net/v2/en';\r\n  /** @type {Map<string, string>} */\r\n  let englishSetNames = new Map();\r\n  /** @type {Promise<Map<string, string>> | null} */\r\n  let englishSetNamesPromise = null;\r\n\r\n  const fetchEnglishSetNames = () => {\r\n    if (englishSetNames.size) return Promise.resolve(englishSetNames);\r\n    if (!englishSetNamesPromise) {\r\n      englishSetNamesPromise = (async () => {\r\n        try {\r\n          const res = await fetch(`${TCGDEX_API_EN}/sets`);\r\n          if (!res.ok) return englishSetNames;\r\n          const list = await res.json();\r\n          const map = new Map();\r\n          (Array.isArray(list) ? list : []).forEach((set) => {\r\n            const id = String(set?.id || '').trim().toLowerCase();\r\n            const name = String(set?.name || '').trim();\r\n            if (id && name) map.set(id, name);\r\n          });\r\n          englishSetNames = map;\r\n        } catch (error) {\r\n          console.warn('[L\u00FCckenf\u00FCller] Englische Set-Namen:', error);\r\n          englishSetNamesPromise = null;\r\n        }\r\n        return englishSetNames;\r\n      })();\r\n    }\r\n    return englishSetNamesPromise;\r\n  };\r\n\r\n  const englishNameForSet = (set) => {\r\n    const id = String(set?.tcgdex_id || '').trim().toLowerCase();\r\n    if (!id) return '';\r\n    return englishSetNames.get(id) || '';\r\n  };\r\n  /** @type {Array<object>} */\r\n  let setsCache = [];\r\n  /** @type {Array<object>} */\r\n  let slots = [];\r\n  /** @type {Set<string>} */\r\n  let variantFilters = new Set();\r\n  // Empty until URL/catalog resolve \u2014 do not default to ssp (wrong heading / fill-rest link).\r\n  let currentSetHandle = '';\r\n  const getWish = () => window.TcgGapWishlist ?? null;\r\n  const singlesCollection = root.dataset.collectionHandle || 'pokemon-tcg';\r\n  /** @type {Map<string, string>} */\r\n  let variantBySku = new Map();\r\n  /** @type {Map<string, string>} */\r\n  let variantBySetNumber = new Map();\r\n  /** @type {Map<string, string>} */\r\n  let deVariantBySetNumber = new Map();\r\n  /** @type {Map<string, string>} */\r\n  let enVariantBySetNumber = new Map();\r\n  /** @type {'de' | 'en'} */\r\n  let catalogLanguage = 'de';\r\n  /** Slots after catalog/snapshot, before the live language overlay. */\r\n  let slotsBeforeLive = [];\r\n  /** @type {Set<string>} Shopify variant IDs with available=true in singles collection */\r\n  let availableVariantIds = new Set();\r\n  /** @type {Map<string, { available: boolean, listing: object }>} */\r\n  let storefrontListingBySku = new Map();\r\n  /** @type {Map<string, { available: boolean, listing: object }>} */\r\n  let deListingBySku = new Map();\r\n  /** @type {Map<string, { available: boolean, listing: object }>} */\r\n  let enListingBySku = new Map();\r\n  /** @type {Map<string, string>} */\r\n  let productHandleByVariantId = new Map();\r\n  /** @type {Map<string, object>} `${handle}|${number}|${finish}` -> live listing */\r\n  let storefrontByHandleSlot = new Map();\r\n  /** @type {Map<string, object>} */\r\n  let deByHandleSlot = new Map();\r\n  /** @type {Map<string, object>} */\r\n  let enByHandleSlot = new Map();\r\n  /** @type {'pending' | 'ready' | 'error'} */\r\n  let variantIndexStatus = 'pending';\r\n  /** @type {Promise<void>|null} */\r\n  let variantIndexLoadPromise = null;\r\n\r\n  const ensureVariantIndex = () => {\r\n    if (!variantIndexLoadPromise) {\r\n      variantIndexLoadPromise = loadStorefrontVariantIndex();\r\n    }\r\n    return variantIndexLoadPromise;\r\n  };\r\n\r\n  const PM_SKU = /^PM-([A-Z0-9]+)-(\\d+)-(\\d+)-/i;\r\n  const POK_SKU = /^POK-([A-Z0-9]+)-(\\d+)-/i;\r\n\r\n  const gidToNumericVariantId = (gid) => {\r\n    const raw = String(gid || '').trim();\r\n    if (!raw) return null;\r\n    if (raw.includes('ProductVariant/')) return raw.split('/').pop() || null;\r\n    if (/^\\d+$/.test(raw)) return raw;\r\n    return null;\r\n  };\r\n\r\n  const setNumberKey = (setCode, cardNumber) => {\r\n    const set = String(setCode || '').trim().toLowerCase();\r\n    const num = normalizeNumber(cardNumber);\r\n    return set && num ? `${set}|${num}` : '';\r\n  };\r\n\r\n  /** Map TCGdex ids like sv03.5 / swsh12.5 / me02.5 \u2192 CardVault SKU codes (SV3PT5, \u2026). */\r\n  const addDottedSkuAliases = (map, prefix, rawSuffix, handle) => {\r\n    if (!rawSuffix.includes('.')) {\r\n      map.set(`${prefix}${rawSuffix.toUpperCase()}`, handle);\r\n      const asInt = Number.parseInt(rawSuffix, 10);\r\n      if (!Number.isNaN(asInt)) map.set(`${prefix}${asInt}`, handle);\r\n      return;\r\n    }\r\n    const [major, minorRaw] = rawSuffix.split('.');\r\n    if (!major || !minorRaw) return;\r\n    const minorMatch = String(minorRaw).match(/^(\\d+)([a-z]*)$/i);\r\n    const minor = minorMatch ? minorMatch[1] : String(minorRaw).replace(/\\D/g, '');\r\n    if (!minor) return;\r\n    const majorInt = Number.parseInt(major, 10);\r\n    if (!Number.isNaN(majorInt)) {\r\n      map.set(`${prefix}${majorInt}PT${minor.toUpperCase()}`, handle);\r\n    }\r\n    map.set(`${prefix}${major.toUpperCase()}PT${minor.toUpperCase()}`, handle);\r\n  };\r\n\r\n  const buildSkuSetCodeToHandle = () => {\r\n    const map = new Map();\r\n    setsCache.forEach((entry) => {\r\n      const handle = String(entry.handle || '').trim().toLowerCase();\r\n      const code = String(entry.set_code || '').trim().toUpperCase();\r\n      const tcg = String(entry.tcgdex_id || '').trim().toLowerCase();\r\n      if (!handle) return;\r\n      if (code) map.set(code, handle);\r\n      if (!tcg) return;\r\n      map.set(tcg.toUpperCase(), handle);\r\n      if (tcg.startsWith('sv')) {\r\n        addDottedSkuAliases(map, 'SV', tcg.slice(2), handle);\r\n      } else if (tcg.startsWith('swsh')) {\r\n        addDottedSkuAliases(map, 'SWSH', tcg.slice(4), handle);\r\n      } else if (tcg.startsWith('me') && tcg !== 'mep' && tcg !== 'mee') {\r\n        addDottedSkuAliases(map, 'ME', tcg.slice(2), handle);\r\n      }\r\n    });\r\n    // Hard aliases when live SKUs diverge from set_code (151 uses SV3PT5, not MEW).\r\n    map.set('SV3PT5', 'mew');\r\n    map.set('ME5', 'pbl');\r\n    map.set('ME05', 'pbl');\r\n    return map;\r\n  };\r\n\r\n  const deriveFinishFromProduct = (product) => {\r\n    const tags = new Set((product.tags || []).map((tag) => String(tag).toLowerCase()));\r\n    const body = String(product.body_html || '').toLowerCase();\r\n    const title = String(product.title || '').toLowerCase();\r\n    const combined = `${body} ${title}`;\r\n    if (combined.includes('reverse holo') || combined.includes('reverse-holo')) return 'reverse';\r\n    if (tags.has('matt') || combined.includes('non-holo')) return 'normal';\r\n    if (tags.has('holo') || tags.has('glitzer') || combined.includes('foil')) return 'holo';\r\n    return 'normal';\r\n  };\r\n\r\n  const formatNumberFromSkuParts = (left, right) => {\r\n    const n = Number.parseInt(left, 10);\r\n    const padded = Number.isNaN(n) ? String(left) : String(n).padStart(3, '0');\r\n    return `${padded}/${right}`;\r\n  };\r\n\r\n  const buildListingFromStorefront = (product, variant, pm) => {\r\n    const sku = String(variant.sku || '').trim().toUpperCase();\r\n    const variantId = variant.id != null ? String(variant.id) : '';\r\n    const productHandle = String(product.handle || '').trim();\r\n    const price = Number.parseFloat(variant.price || '0');\r\n    return {\r\n      sku,\r\n      title: String(product.title || sku).trim(),\r\n      price_cents: Number.isFinite(price) ? Math.round(price * 100) : 0,\r\n      stock: variant.available ? 1 : 0,\r\n      shopify_product_id: product.id != null ? `gid://shopify/Product/${product.id}` : '',\r\n      shopify_product_handle: productHandle,\r\n      shopify_product_url: productHandle ? `/products/${productHandle}` : '',\r\n      shopify_variant_id: variantId ? `gid://shopify/ProductVariant/${variantId}` : '',\r\n      shopify_variant_numeric_id: variantId,\r\n      condition: String(pm[4] || 'NM').toUpperCase(),\r\n      finish: deriveFinishFromProduct(product),\r\n    };\r\n  };\r\n\r\n  /** @type {Array<object>} */\r\n  let shopifyCartItems = [];\r\n  /** @type {object|null} */\r\n  let shopifyCartSnapshot = null;\r\n\r\n  const getSetSkuCodesForHandle = (handle) => {\r\n    const meta = setsCache.find((s) => s.handle === handle);\r\n    if (!meta) return [];\r\n    const codes = new Set();\r\n    const code = String(meta.set_code || '').trim().toUpperCase();\r\n    const tcg = String(meta.tcgdex_id || '').trim().toLowerCase();\r\n    if (code) codes.add(code);\r\n    if (tcg.startsWith('sv')) {\r\n      const suffix = tcg.slice(2);\r\n      codes.add(`SV${suffix.toUpperCase()}`);\r\n      const asInt = Number.parseInt(suffix, 10);\r\n      if (!Number.isNaN(asInt)) codes.add(`SV${asInt}`);\r\n    }\r\n    if (tcg.startsWith('swsh') && tcg.includes('.')) {\r\n      const swshSuffix = tcg.slice(4);\r\n      codes.add(`SWSH${swshSuffix.replace('.', 'PT').toUpperCase()}`);\r\n    } else if (tcg.startsWith('swsh')) {\r\n      codes.add(`SWSH${tcg.slice(4).toUpperCase()}`);\r\n    }\r\n    if (tcg.startsWith('me') && tcg !== 'mep' && tcg !== 'mee') {\r\n      const suffix = tcg.slice(2);\r\n      if (suffix.includes('.')) {\r\n        const [major, minor] = suffix.split('.');\r\n        if (major && minor) {\r\n          const majorInt = Number.parseInt(major, 10);\r\n          if (!Number.isNaN(majorInt)) codes.add(`ME${majorInt}PT${minor.toUpperCase()}`);\r\n          codes.add(`ME${major.toUpperCase()}PT${minor.toUpperCase()}`);\r\n        }\r\n      } else if (/^\\d+$/.test(suffix)) {\r\n        const asInt = Number.parseInt(suffix, 10);\r\n        if (!Number.isNaN(asInt)) codes.add(`ME${asInt}`);\r\n      }\r\n    }\r\n    return [...codes];\r\n  };\r\n\r\n  const resolveVariantNumericId = (slot) => {\r\n    const listing = slot?.listing;\r\n    if (listing) {\r\n      const direct = String(listing.shopify_variant_numeric_id || '').trim();\r\n      if (direct) return direct;\r\n      const fromGid = gidToNumericVariantId(listing.shopify_variant_id);\r\n      if (fromGid) return fromGid;\r\n      const sku = String(listing.sku || '').trim().toUpperCase();\r\n      if (sku && variantBySku.has(sku)) return variantBySku.get(sku);\r\n\r\n      const slotKey = setNumberKey(slot.slotId?.split('|')[0], slot.number);\r\n      if (slotKey && variantBySetNumber.has(slotKey)) return variantBySetNumber.get(slotKey);\r\n\r\n      const pok = sku.match(POK_SKU);\r\n      if (pok) {\r\n        const altKey = setNumberKey(pok[1], slot.number);\r\n        if (altKey && variantBySetNumber.has(altKey)) return variantBySetNumber.get(altKey);\r\n      }\r\n    }\r\n\r\n    const handle = String(slot?.slotId?.split('|')[0] || currentSetHandle).trim().toLowerCase();\r\n    const num = normalizeNumber(slot?.number);\r\n    if (!num) return null;\r\n    for (const code of getSetSkuCodesForHandle(handle)) {\r\n      const key = setNumberKey(code, num);\r\n      if (variantBySetNumber.has(key)) return variantBySetNumber.get(key);\r\n    }\r\n    const handleKey = setNumberKey(handle, num);\r\n    if (variantBySetNumber.has(handleKey)) return variantBySetNumber.get(handleKey);\r\n    return null;\r\n  };\r\n\r\n  const findSlotForCartItem = (item) => {\r\n    const vid = String(item?.variant_id || '');\r\n    if (!vid) return null;\r\n    const direct = slots.find((s) => getSlotVariantId(s) === vid);\r\n    if (direct) return direct;\r\n\r\n    const sku = String(item.sku || '').trim().toUpperCase();\r\n    const englishItem = sku.endsWith('-EN');\r\n    if (catalogLanguage === 'en' ? !englishItem : englishItem) return null;\r\n    const pm = sku.match(PM_SKU);\r\n    if (!pm) return null;\r\n\r\n    const handle = buildSkuSetCodeToHandle().get(pm[1].toUpperCase());\r\n    if (handle !== currentSetHandle) return null;\r\n\r\n    const num = formatNumberFromSkuParts(pm[2], pm[3]);\r\n    const candidates = slots.filter(\r\n      (s) => normalizeNumber(s.number) === normalizeNumber(num)\r\n    );\r\n    if (!candidates.length) return null;\r\n    return candidates.find((s) => getSlotVariantId(s) === vid) || candidates[0];\r\n  };\r\n\r\n  const cartSlotsInCurrentSet = () => {\r\n    const seen = new Set();\r\n    const result = [];\r\n    shopifyCartItems.forEach((item) => {\r\n      const slot = findSlotForCartItem(item);\r\n      if (!slot || seen.has(slot.slotId)) return;\r\n      seen.add(slot.slotId);\r\n      result.push(slot);\r\n    });\r\n    return result;\r\n  };\r\n\r\n  const orphanCartItems = () =>\r\n    shopifyCartItems.filter((item) => !findSlotForCartItem(item));\r\n\r\n  const cartItemQuantity = (item) => {\r\n    const q = Number(item?.quantity);\r\n    return Number.isFinite(q) && q > 0 ? Math.floor(q) : 1;\r\n  };\r\n\r\n  const cartTotalQuantity = () =>\r\n    shopifyCartItems.reduce((sum, item) => sum + cartItemQuantity(item), 0);\r\n\r\n  const cartQuantityInCurrentSet = () =>\r\n    shopifyCartItems.reduce((sum, item) => {\r\n      if (!findSlotForCartItem(item)) return sum;\r\n      return sum + cartItemQuantity(item);\r\n    }, 0);\r\n\r\n  const cartLinePriceCents = (item) => {\r\n    const raw = item.final_line_price ?? item.line_price ?? item.final_price ?? item.price ?? 0;\r\n    const n = Number(raw);\r\n    return Number.isFinite(n) ? Math.round(n) : 0;\r\n  };\r\n\r\n  const isEnglishSingle = (sku, product) => {\r\n    if (String(sku || '').toUpperCase().endsWith('-EN')) return true;\r\n    const tags = (product?.tags || []).map((tag) => String(tag).toLowerCase().trim());\r\n    if (tags.some((tag) => tag === 'englisch' || tag === 'english' || tag === 'en')) return true;\r\n    if (/\\(englisch\\)|\\(english\\)/i.test(String(product?.title || ''))) return true;\r\n    if (/Sprache:\\s*(Englisch|English)/i.test(String(product?.body_html || ''))) return true;\r\n    return false;\r\n  };\r\n\r\n  const refreshSlotsForLanguage = () => {\r\n    const source = slotsBeforeLive.map((slot) => ({ ...slot }));\r\n    const rows =\r\n      catalogLanguage === 'en'\r\n        ? source.map((slot) => ({ ...slot, in_stock: false, listing: null }))\r\n        : source;\r\n    const named = applyEnglishCardNames(rows, currentSetHandle);\r\n    return backfillSlotImages(applyLiveStorefrontStock(named, currentSetHandle), currentSetHandle);\r\n  };\r\n\r\n  const syncLanguageControls = () => {\r\n    root.dataset.catalogLanguage = catalogLanguage;\r\n    root.querySelectorAll('[data-gap-language-value]').forEach((button) => {\r\n      const active = button.dataset.gapLanguageValue === catalogLanguage;\r\n      button.classList.toggle('is-active', active);\r\n      button.setAttribute('aria-pressed', active ? 'true' : 'false');\r\n    });\r\n    const hint = root.querySelector('[data-gap-language-hint]');\r\n    if (hint) hint.hidden = catalogLanguage !== 'en';\r\n    if (zeroStockNotice) {\r\n      zeroStockNotice.textContent =\r\n        catalogLanguage === 'en'\r\n          ? 'Aktuell keine englischen Karten von diesem Set auf Lager. Unter Sprache \u2192 Deutsch siehst du den deutschen Bestand.'\r\n          : zeroStockNoticeDefault;\r\n    }\r\n  };\r\n\r\n  const syncFillRestLink = () => {\r\n    const link = root.querySelector('[data-gap-fill-rest]');\r\n    if (!link) return;\r\n    const handle = String(currentSetHandle || '').trim().toLowerCase();\r\n    if (!handle || !setResolved) {\r\n      link.href = '/pages/auffuellen';\r\n      link.setAttribute('aria-disabled', 'true');\r\n      return;\r\n    }\r\n    const params = new URLSearchParams();\r\n    params.set('set', handle);\r\n    params.set('sprache', catalogLanguage === 'en' ? 'en' : 'de');\r\n    link.href = `/pages/auffuellen?${params.toString()}`;\r\n    link.removeAttribute('aria-disabled');\r\n  };\r\n\r\n  const activateCatalogLanguage = async (lang, { rerender = true } = {}) => {\r\n    catalogLanguage = lang === 'en' ? 'en' : 'de';\r\n    if (catalogLanguage === 'en') await fetchEnglishSetNames();\r\n    variantBySetNumber = catalogLanguage === 'en' ? enVariantBySetNumber : deVariantBySetNumber;\r\n    storefrontByHandleSlot = catalogLanguage === 'en' ? enByHandleSlot : deByHandleSlot;\r\n    storefrontListingBySku = catalogLanguage === 'en' ? enListingBySku : deListingBySku;\r\n    syncLanguageControls();\r\n    updateSetPickerLabel(currentSetHandle);\r\n    if (setDropdown && !setDropdown.hidden) {\r\n      renderSetPickerList(setSearchInput?.value || '');\r\n    }\r\n    try {\r\n      sessionStorage.setItem('kl24_gap_language', catalogLanguage);\r\n    } catch {\r\n      /* ignore private mode */\r\n    }\r\n    if (slotsBeforeLive.length) {\r\n      slots = refreshSlotsForLanguage();\r\n    }\r\n    syncFillRestLink();\r\n    if (rerender) {\r\n      render();\r\n      void syncMarkingsFromShopifyCart();\r\n    }\r\n  };\r\n\r\n  const loadStorefrontVariantIndex = async () => {\r\n    variantIndexStatus = 'pending';\r\n    const origin = window.location.origin;\r\n    const bySku = new Map();\r\n    const nextDeBySetNumber = new Map();\r\n    const nextEnBySetNumber = new Map();\r\n    const availableIds = new Set();\r\n    const nextDeListingBySku = new Map();\r\n    const nextEnListingBySku = new Map();\r\n    const nextDeByHandleSlot = new Map();\r\n    const nextEnByHandleSlot = new Map();\r\n    const handleByVariantId = new Map();\r\n    const skuSetToHandle = buildSkuSetCodeToHandle();\r\n    try {\r\n      let products = [];\r\n      const catalog = window.Kl24SinglesCatalog;\r\n      if (catalog?.fetchSinglesProducts) {\r\n        const result = await catalog.fetchSinglesProducts({\r\n          collectionHandle: singlesCollection,\r\n          maxPages: 20,\r\n          timeoutMs: 20000,\r\n        });\r\n        products = result.products || [];\r\n      } else {\r\n        let page = 1;\r\n        while (page <= 12) {\r\n          const url = `${origin}/collections/${encodeURIComponent(singlesCollection)}/products.json?limit=250&page=${page}`;\r\n          const res = await fetch(url);\r\n          if (!res.ok) break;\r\n          const data = await res.json();\r\n          const batch = data.products || [];\r\n          if (!batch.length) break;\r\n          products.push(...batch);\r\n          if (batch.length < 250) break;\r\n          page += 1;\r\n        }\r\n      }\r\n      if (products.length) {\r\n        products.forEach((product) => {\r\n          const productHandle = String(product.handle || '').trim();\r\n          (product.variants || []).forEach((variant) => {\r\n            const variantId = variant.id != null ? String(variant.id) : '';\r\n            const sku = String(variant.sku || '').trim().toUpperCase();\r\n            if (variantId && variant.available) availableIds.add(variantId);\r\n            if (variantId && productHandle) handleByVariantId.set(variantId, productHandle);\r\n            if (!sku || !variantId) return;\r\n\r\n            bySku.set(sku, variantId);\r\n            const englishSingle = isEnglishSingle(sku, product);\r\n            const bySetNumber = englishSingle ? nextEnBySetNumber : nextDeBySetNumber;\r\n            const listingBySku = englishSingle ? nextEnListingBySku : nextDeListingBySku;\r\n            const byHandleSlot = englishSingle ? nextEnByHandleSlot : nextDeByHandleSlot;\r\n\r\n            const pm = sku.match(PM_SKU);\r\n            const pok = sku.match(POK_SKU);\r\n            if (pm) {\r\n              const key = setNumberKey(pm[1], `${pm[2]}/${pm[3]}`);\r\n              if (key) bySetNumber.set(key, variantId);\r\n              const handle = skuSetToHandle.get(pm[1].toUpperCase());\r\n              if (handle) {\r\n                const listing = buildListingFromStorefront(product, variant, pm);\r\n                listingBySku.set(sku, { available: Boolean(variant.available), listing });\r\n                if (variant.available) {\r\n                  const slotKey = `${handle}|${normalizeNumber(`${pm[2]}/${pm[3]}`)}|${normalizeVariantKey(listing.finish)}`;\r\n                  byHandleSlot.set(slotKey, listing);\r\n                }\r\n              }\r\n            } else if (pok) {\r\n              const key = setNumberKey(pok[1], pok[2]);\r\n              if (key) bySetNumber.set(key, variantId);\r\n              const handle = skuSetToHandle.get(pok[1].toUpperCase());\r\n              if (handle && variant.available) {\r\n                const listing = buildListingFromStorefront(product, variant, {\r\n                  1: pok[1],\r\n                  2: pok[2],\r\n                  3: '',\r\n                });\r\n                listingBySku.set(sku, { available: true, listing });\r\n                const slotKey = `${handle}|${normalizeNumber(pok[2])}|${normalizeVariantKey(listing.finish)}`;\r\n                byHandleSlot.set(slotKey, listing);\r\n              }\r\n            }\r\n          });\r\n        });\r\n      }\r\n      variantBySku = bySku;\r\n      deVariantBySetNumber = nextDeBySetNumber;\r\n      enVariantBySetNumber = nextEnBySetNumber;\r\n      availableVariantIds = availableIds;\r\n      deListingBySku = nextDeListingBySku;\r\n      enListingBySku = nextEnListingBySku;\r\n      productHandleByVariantId = handleByVariantId;\r\n      deByHandleSlot = nextDeByHandleSlot;\r\n      enByHandleSlot = nextEnByHandleSlot;\r\n      variantIndexStatus = 'ready';\r\n      await activateCatalogLanguage(catalogLanguage, { rerender: false });\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Storefront-Varianten-Index:', error);\r\n      variantIndexStatus = 'error';\r\n    }\r\n    render();\r\n  };\r\n\r\n  const normalizeVariantKey = (raw) => {\r\n    const key = String(raw || 'normal').trim().toLowerCase();\r\n    if (!key || key === 'standard' || key === 'non-holo' || key === 'nonholo' || key === 'matt') {\r\n      return 'normal';\r\n    }\r\n    if (key === 'reverseholo' || key === 'reverse-holo' || key === 'rh') return 'reverse';\r\n    return key;\r\n  };\r\n\r\n  const listingMatchesVariant = (listing, variantKey) => {\r\n    if (!listing) return false;\r\n    const stockRaw = listing.available_stock ?? listing.stock ?? 0;\r\n    const stock = Number(stockRaw);\r\n    if (!Number.isFinite(stock) || stock <= 0) return false;\r\n    const finish = normalizeVariantKey(listing.finish);\r\n    const key = normalizeVariantKey(variantKey);\r\n    return Boolean(finish) && finish === key;\r\n  };\r\n\r\n  const resolveVariantStock = (variant) => {\r\n    const listing = variant?.listing || null;\r\n    const inStock = listingMatchesVariant(listing, variant?.key);\r\n    return { in_stock: inStock, listing: inStock ? listing : null };\r\n  };\r\n\r\n  /** Authoritative stock from live Shopify singles collection (not stale snapshot). */\r\n  const applyLiveStorefrontStock = (rows, setHandle) => {\r\n    if (variantIndexStatus !== 'ready' || storefrontByHandleSlot.size === 0) return rows;\r\n\r\n    const handle = String(setHandle || currentSetHandle).trim().toLowerCase();\r\n    const wishApi = getWish();\r\n    const existing = new Set(\r\n      rows.map((slot) => `${normalizeNumber(slot.number)}|${slot.variantKey}`)\r\n    );\r\n\r\n    const merged = rows.map((slot) => {\r\n      const num = normalizeNumber(slot.number);\r\n      const finish = normalizeVariantKey(slot.variantKey);\r\n      const liveKey = `${handle}|${num}|${finish}`;\r\n      let liveListing = storefrontByHandleSlot.get(liveKey);\r\n      if (!liveListing && num.includes('/')) {\r\n        liveListing = storefrontByHandleSlot.get(`${handle}|${num.split('/')[0]}|${finish}`);\r\n      }\r\n      if (liveListing) {\r\n        return { ...slot, variantKey: finish, in_stock: true, listing: liveListing };\r\n      }\r\n\r\n      const sku = String(slot.listing?.sku || '').trim().toUpperCase();\r\n      const bySku = sku ? storefrontListingBySku.get(sku) : null;\r\n      if (bySku?.available) {\r\n        return { ...slot, variantKey: finish, in_stock: true, listing: bySku.listing };\r\n      }\r\n      if (bySku && !bySku.available) {\r\n        return { ...slot, variantKey: finish, in_stock: false, listing: null };\r\n      }\r\n\r\n      // Keep Cockpit/snapshot stock when the singles index has no entry yet (e.g. new upload).\r\n      return { ...slot, variantKey: finish };\r\n    });\r\n\r\n    const imageByNumber = new Map();\r\n    merged.forEach((slot) => {\r\n      if (!slot.imageUrl) return;\r\n      imageByNumber.set(normalizeNumber(slot.number), slot.imageUrl);\r\n    });\r\n\r\n    const extras = [];\r\n    storefrontByHandleSlot.forEach((listing, slotKey) => {\r\n      const [slotHandle, num, finish] = slotKey.split('|');\r\n      if (slotHandle !== handle) return;\r\n      const mapKey = `${num}|${finish}`;\r\n      if (existing.has(mapKey)) return;\r\n\r\n      const pm = String(listing.sku || '').match(PM_SKU);\r\n      const displayNumber = pm\r\n        ? formatNumberFromSkuParts(pm[2], pm[3])\r\n        : num;\r\n      const slotId = wishApi\r\n        ? wishApi.buildSlotId(handle, displayNumber, finish)\r\n        : `${handle}|${displayNumber}|${finish}`;\r\n      const name = String(listing.title || '').split('\u2013')[0].trim() || listing.title || '';\r\n\r\n      extras.push({\r\n        slotId,\r\n        number: displayNumber,\r\n        name,\r\n        variantKey: finish,\r\n        variantLabel: finish === 'reverse' ? 'Reverse Holo' : finish === 'holo' ? 'Holo' : 'Normal',\r\n        setName: setNameForHandle(handle),\r\n        imageUrl: imageByNumber.get(normalizeNumber(displayNumber)) || null,\r\n        in_stock: true,\r\n        listing,\r\n        selected: false,\r\n        wishlisted: wishApi ? wishApi.isWishlisted(slotId) : false,\r\n      });\r\n      existing.add(mapKey);\r\n    });\r\n\r\n    if (!extras.length) return merged;\r\n    const combined = [...merged, ...extras];\r\n    combined.sort((a, b) =>\r\n      a.number.localeCompare(b.number, undefined, { numeric: true })\r\n    );\r\n    return combined;\r\n  };\r\n\r\n  const normalizeNumber = (value) => {\r\n    const raw = String(value || '').trim();\r\n    if (!raw.includes('/')) return raw;\r\n    const [left, right] = raw.split('/');\r\n    const n = Number.parseInt(left, 10);\r\n    return `${Number.isNaN(n) ? left : n}/${right}`;\r\n  };\r\n\r\n  const formatCardNumber = (localId, official) => {\r\n    const n = Number.parseInt(localId, 10);\r\n    const left = Number.isNaN(n) ? String(localId) : String(n).padStart(3, '0');\r\n    return `${left}/${official}`;\r\n  };\r\n\r\n  const formatMoney = (cents) => {\r\n    const fmt = window.Kl24EuroFormat;\r\n    if (fmt) return fmt.formatFromCents(cents);\r\n    return String(\r\n      new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(\r\n        (cents || 0) / 100\r\n      )\r\n    ).replace(/\\s*\u20AC/g, '\\u00A0\u20AC');\r\n  };\r\n\r\n  const showFeedback = (message, type) => {\r\n    if (!feedback) return;\r\n    feedback.hidden = false;\r\n    feedback.textContent = message;\r\n    feedback.classList.remove('is-error', 'is-success');\r\n    feedback.classList.add(type === 'success' ? 'is-success' : 'is-error');\r\n  };\r\n\r\n  const VARIANT_LABELS = {\r\n    normal: 'Normal',\r\n    reverse: 'Reverse Holo',\r\n    holo: 'Holo',\r\n    firstEdition: '1. Edition',\r\n  };\r\n\r\n  const heuristicVariants = (name, localId, official) => {\r\n    const lower = String(name || '').toLowerCase();\r\n    const n = Number.parseInt(localId, 10) || 0;\r\n    if (n > official) return [{ key: 'holo', label: 'Holo' }];\r\n    if (/\\bex\\b/.test(lower) || lower.endsWith('-ex')) {\r\n      return [{ key: 'holo', label: 'Holo' }];\r\n    }\r\n    if (lower.includes('energie') || lower.includes('energy')) {\r\n      return [{ key: 'normal', label: 'Normal' }];\r\n    }\r\n    return [\r\n      { key: 'normal', label: 'Normal' },\r\n      { key: 'reverse', label: 'Reverse Holo' },\r\n    ];\r\n  };\r\n\r\n  const variantsFromTcgdexCard = (card, name, localId, official) => {\r\n    const flags = card?.variants;\r\n    if (flags && typeof flags === 'object') {\r\n      const out = [];\r\n      Object.entries(VARIANT_LABELS).forEach(([key, label]) => {\r\n        if (flags[key]) out.push({ key, label });\r\n      });\r\n      if (out.length) return out;\r\n    }\r\n    return heuristicVariants(name, localId, official);\r\n  };\r\n\r\n  const rememberImagePayload = (handle, payload) => {\r\n    if (!payload?.cards?.length) return;\r\n    setImagePayloadHandle = String(handle || '').trim().toLowerCase();\r\n    setImagePayloadCache = payload;\r\n  };\r\n\r\n  const mergeImagePayloads = (primary, secondary) => {\r\n    if (!secondary?.cards?.length) return primary;\r\n    if (!primary?.cards?.length) return secondary;\r\n    const byNumber = new Map();\r\n    (primary.cards || []).forEach((card) => {\r\n      byNumber.set(normalizeNumber(card.number), card);\r\n    });\r\n    (secondary.cards || []).forEach((card) => {\r\n      const num = normalizeNumber(card.number);\r\n      const existing = byNumber.get(num);\r\n      if (!existing) {\r\n        byNumber.set(num, card);\r\n        return;\r\n      }\r\n      const variantKeys = new Set((existing.variants || []).map((v) => v.key));\r\n      const mergedVariants = [...(existing.variants || [])];\r\n      (card.variants || []).forEach((variant) => {\r\n        if (!variantKeys.has(variant.key)) {\r\n          mergedVariants.push(variant);\r\n          variantKeys.add(variant.key);\r\n        }\r\n      });\r\n      byNumber.set(num, {\r\n        ...existing,\r\n        image_url: existing.image_url || card.image_url,\r\n        variants: mergedVariants,\r\n      });\r\n    });\r\n    return { ...primary, cards: [...byNumber.values()] };\r\n  };\r\n\r\n  const backfillSlotImagesFromSiblings = (rows) => {\r\n    const byNumber = new Map();\r\n    rows.forEach((slot) => {\r\n      if (!slot.imageUrl) return;\r\n      const num = normalizeNumber(slot.number);\r\n      if (!byNumber.has(num)) byNumber.set(num, slot.imageUrl);\r\n    });\r\n    return rows.map((slot) => {\r\n      if (slot.imageUrl) return slot;\r\n      const hit = byNumber.get(normalizeNumber(slot.number));\r\n      return hit ? { ...slot, imageUrl: hit } : slot;\r\n    });\r\n  };\r\n\r\n  const backfillSlotImages = (rows, setHandle) => {\r\n    const handle = String(setHandle || currentSetHandle).trim().toLowerCase();\r\n    let out = rows;\r\n    if (setImagePayloadCache && setImagePayloadHandle === handle) {\r\n      out = mergeImagesIntoSlots(out, setImagePayloadCache);\r\n    }\r\n    return backfillSlotImagesFromSiblings(out);\r\n  };\r\n\r\n  const showLoading = (message) => {\r\n    root.dataset.loading = '1';\r\n    root.classList.add('is-loading-set');\r\n    if (stats) {\r\n      stats.hidden = false;\r\n      stats.textContent = message || 'Set wird geladen \u2026';\r\n    }\r\n    const meta = setsCache.find((s) => s.handle === currentSetHandle);\r\n    const knownTotal = Number(meta?.total_cards) || SET_OFFICIAL_TOTALS[currentSetHandle] || 0;\r\n    if (kpiSet) kpiSet.textContent = knownTotal > 0 ? String(knownTotal) : '\u2026';\r\n    if (kpiStock) kpiStock.textContent = '\u2026';\r\n    syncSetHeading();\r\n    if (imageNotice) imageNotice.hidden = true;\r\n    if (missingImagesNotice) missingImagesNotice.hidden = true;\r\n    if (zeroStockNotice) zeroStockNotice.hidden = true;\r\n    if (!grid) return;\r\n    grid.replaceChildren();\r\n    const status = document.createElement('p');\r\n    status.className = 'tcg-gap-filler__loading';\r\n    status.textContent = message || 'Set wird geladen \u2026';\r\n    grid.append(status);\r\n    const skeleton = document.createElement('div');\r\n    skeleton.className = 'tcg-gap-filler__skeleton-grid';\r\n    skeleton.setAttribute('aria-hidden', 'true');\r\n    for (let i = 0; i < 8; i += 1) {\r\n      const card = document.createElement('div');\r\n      card.className = 'tcg-gap-filler__skeleton-card';\r\n      skeleton.append(card);\r\n    }\r\n    grid.append(skeleton);\r\n  };\r\n\r\n  const clearLoading = () => {\r\n    root.dataset.loading = '0';\r\n    root.classList.remove('is-loading-set');\r\n  };\r\n\r\n  const passesVariantFilter = (slot) => {\r\n    if (variantFilters.size === 0) return true;\r\n    return variantFilters.has(slot.variantKey);\r\n  };\r\n\r\n  const visibleSlots = () => {\r\n    let list = slots.filter(passesVariantFilter);\r\n    if (filterStockInput?.checked) {\r\n      list = list.filter((s) => isSlotShopAvailable(s));\r\n    }\r\n    if (filterWishlistInput?.checked) {\r\n      list = list.filter((s) => s.wishlisted);\r\n    }\r\n    const q = (searchInput?.value || '').trim().toLowerCase();\r\n    if (!q) return list;\r\n    return list.filter(\r\n      (s) =>\r\n        s.name.toLowerCase().includes(q) ||\r\n        s.number.toLowerCase().includes(q) ||\r\n        s.variantLabel.toLowerCase().includes(q)\r\n    );\r\n  };\r\n\r\n  const resetFilters = () => {\r\n    variantFilters = new Set();\r\n    filterVariantGroup?.querySelectorAll('[data-variant-filter]').forEach((chip) => {\r\n      const isAll = chip.dataset.variantFilter === 'all';\r\n      chip.classList.toggle('is-active', isAll);\r\n      chip.setAttribute('aria-pressed', isAll ? 'true' : 'false');\r\n    });\r\n  };\r\n\r\n  const updateImageNotice = () => {\r\n    const usesEnScans = slots.some(\r\n      (s) => s.imageUrl && String(s.imageUrl).includes('assets.tcgdex.net/en/')\r\n    );\r\n    const hasMissingImages = slots.some((s) => !s.imageUrl);\r\n\r\n    if (imageNotice) {\r\n      imageNotice.hidden = !usesEnScans;\r\n    }\r\n    if (missingImagesNotice) {\r\n      missingImagesNotice.hidden = !hasMissingImages;\r\n    }\r\n  };\r\n\r\n  const wishlistCountForSet = () =>\r\n    slots.filter((s) => s.wishlisted).length;\r\n\r\n  const clearCurrentSetWishlist = () => {\r\n    const wishApi = getWish();\r\n    if (!wishApi) return 0;\r\n\r\n    const meta = setsCache.find((s) => s.handle === currentSetHandle);\r\n    const prefixes = [currentSetHandle];\r\n    if (meta?.tcgdex_id) prefixes.push(meta.tcgdex_id);\r\n    if (meta?.set_code) prefixes.push(String(meta.set_code).toLowerCase());\r\n\r\n    const numberVariantKeys = slots.map((slot) => {\r\n      const parts = String(slot.slotId || '').split('|');\r\n      if (parts.length < 3) return '';\r\n      const normalizeNumber = wishApi.normalizeCardNumber || ((v) => v);\r\n      return `${normalizeNumber(parts[1])}|${String(parts[2]).toLowerCase()}`;\r\n    });\r\n\r\n    if (typeof wishApi.clearMatching === 'function') {\r\n      return wishApi.clearMatching({\r\n        slotIds: slots.map((s) => s.slotId),\r\n        handlePrefixes: prefixes,\r\n        numberVariantKeys,\r\n      });\r\n    }\r\n\r\n    let removed = 0;\r\n    prefixes.forEach((prefix) => {\r\n      const before = wishApi.loadAll().length;\r\n      wishApi.clearForSet(prefix);\r\n      removed += before - wishApi.loadAll().length;\r\n    });\r\n    return removed;\r\n  };\r\n\r\n  const handleClearSetWishlist = async () => {\r\n    const wishApi = getWish();\r\n    const hadInMemory = slots.filter((s) => s.wishlisted).length;\r\n    let removed = 0;\r\n\r\n    try {\r\n      removed = clearCurrentSetWishlist();\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Wunschliste leeren:', error);\r\n    }\r\n\r\n    slots.forEach((slot) => {\r\n      slot.wishlisted = false;\r\n    });\r\n\r\n    if (filterWishlistInput?.checked) {\r\n      filterWishlistInput.checked = false;\r\n    }\r\n\r\n    render();\r\n\r\n    if (wishlistDrawer && !wishlistDrawer.hidden) {\r\n      renderWishlistDrawer();\r\n      if (!wishApi?.loadAll().length) closeWishlistDrawer();\r\n    }\r\n\r\n    if (wishApi) {\r\n      void wishApi.syncCart(wishApi.loadAll());\r\n    }\r\n\r\n    const clearedCount = Math.max(removed, hadInMemory);\r\n    const message =\r\n      clearedCount > 0\r\n        ? `${clearedCount} Karte(n) von der Wunschliste f\u00FCr dieses Set entfernt.`\r\n        : 'Keine Wunschlisten-Eintr\u00E4ge f\u00FCr dieses Set gefunden.';\r\n\r\n    showFeedback(message, clearedCount > 0 ? 'success' : 'error');\r\n\r\n    if (sidebarWishStat) {\r\n      sidebarWishStat.textContent = message;\r\n      sidebarWishStat.dataset.gapWishClearFlash = clearedCount > 0 ? 'success' : 'error';\r\n      window.setTimeout(() => {\r\n        delete sidebarWishStat.dataset.gapWishClearFlash;\r\n        updateStats();\r\n      }, 3200);\r\n    } else {\r\n      updateStats();\r\n    }\r\n  };\r\n\r\n  const setNameForHandle = (handle) => {\r\n    const hit = setsCache.find((s) => s.handle === handle);\r\n    if (!hit) return withGrundsetLabel(handle, handle);\r\n    if (catalogLanguage === 'en') {\r\n      const englishName = englishNameForSet(hit);\r\n      if (englishName) return withGrundsetLabel(englishName, handle);\r\n    }\r\n    return withGrundsetLabel(hit.name || handle, handle);\r\n  };\r\n\r\n  const resolveWishlistEntry = (slotId) => {\r\n    const hit = slots.find((s) => s.slotId === slotId);\r\n    if (hit) {\r\n      return {\r\n        slotId,\r\n        name: hit.name,\r\n        number: hit.number,\r\n        variantLabel: hit.variantLabel,\r\n        setName: setNameForHandle(slotId.split('|')[0]),\r\n      };\r\n    }\r\n    const parts = String(slotId || '').split('|');\r\n    if (parts.length >= 3) {\r\n      return {\r\n        slotId,\r\n        name: 'Unbekannte Karte',\r\n        number: parts[1],\r\n        variantLabel: parts[2],\r\n        setName: setNameForHandle(parts[0]),\r\n      };\r\n    }\r\n    return { slotId, name: slotId, number: '', variantLabel: '', setName: '' };\r\n  };\r\n\r\n  window.TcgGapFillerResolveWishlistEntry = resolveWishlistEntry;\r\n  window.TcgGapFillerSetNameForHandle = setNameForHandle;\r\n\r\n  const toggleWishlist = (slot, item, wishBtn) => {\r\n    slot.wishlisted = !slot.wishlisted;\r\n    const wishApi = getWish();\r\n    if (wishApi) {\r\n      const normalized = wishApi.normalizeSlotId\r\n        ? wishApi.normalizeSlotId(slot.slotId)\r\n        : slot.slotId;\r\n      if (slot.wishlisted) {\r\n        const list = wishApi.loadAll();\r\n        if (!list.includes(normalized)) {\r\n          wishApi.saveAll([...list, slot.slotId]);\r\n        }\r\n      } else {\r\n        wishApi.saveAll(\r\n          wishApi.loadAll().filter((id) => {\r\n            const norm = wishApi.normalizeSlotId ? wishApi.normalizeSlotId(id) : id;\r\n            return norm !== normalized;\r\n          })\r\n        );\r\n      }\r\n    }\r\n    if (item) item.classList.toggle('is-wishlisted', slot.wishlisted);\r\n    if (wishBtn) {\r\n      wishBtn.classList.toggle('is-active', slot.wishlisted);\r\n      wishBtn.setAttribute('aria-pressed', slot.wishlisted ? 'true' : 'false');\r\n    }\r\n    updateStats();\r\n  };\r\n\r\n  const cartSelectionEstimate = (selectedSlots) => {\r\n    let totalCents = 0;\r\n    let priced = 0;\r\n    selectedSlots.forEach((slot) => {\r\n      if (!canAddSlotToCart(slot)) return;\r\n      const cents = slot.listing?.price_cents;\r\n      if (cents != null) {\r\n        totalCents += cents;\r\n        priced += 1;\r\n      }\r\n    });\r\n    return { totalCents, priced };\r\n  };\r\n\r\n  const getSlotVariantId = (slot) => resolveVariantNumericId(slot);\r\n\r\n  const getSlotProductUrl = (slot) => {\r\n    const listing = slot?.listing;\r\n    const directUrl = String(listing?.shopify_product_url || '').trim();\r\n    if (directUrl) return directUrl;\r\n    const handle = String(listing?.shopify_product_handle || '').trim();\r\n    if (handle) return `/products/${handle}`;\r\n\r\n    const variantId = getSlotVariantId(slot);\r\n    if (variantId && productHandleByVariantId.has(String(variantId))) {\r\n      return `/products/${productHandleByVariantId.get(String(variantId))}`;\r\n    }\r\n\r\n    const sku = String(listing?.sku || '').trim().toUpperCase();\r\n    if (sku && storefrontListingBySku.has(sku)) {\r\n      const hit = storefrontListingBySku.get(sku);\r\n      const hitUrl = String(hit?.listing?.shopify_product_url || '').trim();\r\n      if (hitUrl) return hitUrl;\r\n      const hitHandle = String(hit?.listing?.shopify_product_handle || '').trim();\r\n      if (hitHandle) return `/products/${hitHandle}`;\r\n    }\r\n    return '';\r\n  };\r\n\r\n  const buildSlotQuickAddUrl = (slot) => {\r\n    const baseUrl = getSlotProductUrl(slot);\r\n    if (!baseUrl) return '';\r\n    const variantId = getSlotVariantId(slot);\r\n    if (!variantId) return baseUrl;\r\n    const joiner = baseUrl.includes('?') ? '&' : '?';\r\n    return `${baseUrl}${joiner}variant=${encodeURIComponent(variantId)}`;\r\n  };\r\n\r\n  const enrichSlotListing = (slot) => {\r\n    const listing = slot?.listing;\r\n    if (!listing) return slot;\r\n    if (listing.shopify_product_url || listing.shopify_product_handle) return slot;\r\n\r\n    const sku = String(listing.sku || '').trim().toUpperCase();\r\n    const bySku = sku ? storefrontListingBySku.get(sku) : null;\r\n    if (bySku?.listing?.shopify_product_handle || bySku?.listing?.shopify_product_url) {\r\n      return {\r\n        ...slot,\r\n        listing: {\r\n          ...listing,\r\n          shopify_product_handle:\r\n            bySku.listing.shopify_product_handle || listing.shopify_product_handle,\r\n          shopify_product_url: bySku.listing.shopify_product_url || listing.shopify_product_url,\r\n        },\r\n      };\r\n    }\r\n\r\n    const variantId = getSlotVariantId(slot);\r\n    const handle = variantId ? productHandleByVariantId.get(String(variantId)) : null;\r\n    if (!handle) return slot;\r\n\r\n    return {\r\n      ...slot,\r\n      listing: {\r\n        ...listing,\r\n        shopify_product_handle: handle,\r\n        shopify_product_url: `/products/${handle}`,\r\n      },\r\n    };\r\n  };\r\n\r\n  const isSlotShopAvailable = (slot) => {\r\n    if (!slot.in_stock || !slot.listing) return false;\r\n    const sku = String(slot.listing.sku || '').trim().toUpperCase();\r\n    if (variantIndexStatus === 'ready' && sku) {\r\n      const bySku = storefrontListingBySku.get(sku);\r\n      if (bySku) return bySku.available;\r\n    }\r\n    const variantId = resolveVariantNumericId(slot);\r\n    if (variantId && variantIndexStatus === 'ready') {\r\n      return availableVariantIds.has(String(variantId));\r\n    }\r\n    // Trust matched listing when the index has no contradicting SKU row yet.\r\n    const stock = Number(slot.listing.available_stock ?? slot.listing.stock ?? 0);\r\n    if (Number.isFinite(stock) && stock > 0) return true;\r\n    return Boolean(\r\n      slot.listing.shopify_variant_numeric_id || slot.listing.shopify_variant_id\r\n    );\r\n  };\r\n\r\n  const canAddSlotToCart = (slot) => isSlotShopAvailable(slot);\r\n\r\n  const getReservationSessionId = () => {\r\n    // Same owner as storefront reserve helper: Shopify cart token (shared across tabs).\r\n    const api = window.Kl24InventoryReservation;\r\n    if (api?.getSessionId) return api.getSessionId();\r\n    return `c_pending_${Date.now().toString(36)}`;\r\n  };\r\n\r\n  const cockpitInventoryHeaders = (extra = {}) => {\r\n    const headers = { Accept: 'application/json', ...extra };\r\n    if (apiBase.includes('loca.lt')) {\r\n      headers['Bypass-Tunnel-Reminder'] = 'true';\r\n    }\r\n    return headers;\r\n  };\r\n\r\n  const isNetworkFetchError = (error) => {\r\n    if (!error) return false;\r\n    const name = String(error.name || '');\r\n    const message = String(error.message || '');\r\n    return (\r\n      name === 'AbortError' ||\r\n      name === 'TypeError' ||\r\n      /networkerror|failed to fetch|load failed|network request failed/i.test(message)\r\n    );\r\n  };\r\n\r\n  const cockpitInventoryPost = async (path, body) => {\r\n    if (!apiBase) return null;\r\n    const controller = new AbortController();\r\n    const timeoutId = window.setTimeout(() => controller.abort(), 4000);\r\n    try {\r\n      const res = await fetch(`${apiBase}${path}`, {\r\n        method: 'POST',\r\n        headers: cockpitInventoryHeaders({ 'Content-Type': 'application/json' }),\r\n        body: JSON.stringify(body),\r\n        signal: controller.signal,\r\n      });\r\n      if (!res.ok) {\r\n        const errBody = await res.json().catch(() => ({}));\r\n        throw new Error(errBody.detail || errBody.message || `Cockpit ${res.status}`);\r\n      }\r\n      return res.json();\r\n    } catch (error) {\r\n      if (isNetworkFetchError(error)) {\r\n        const degraded = new Error('Cockpit API nicht erreichbar');\r\n        degraded.networkDegraded = true;\r\n        throw degraded;\r\n      }\r\n      throw error;\r\n    } finally {\r\n      window.clearTimeout(timeoutId);\r\n    }\r\n  };\r\n\r\n  const reserveSlotInventory = async (slot, { syncShopify = false } = {}) => {\r\n    const vid = getSlotVariantId(slot);\r\n    const sku = String(slot.listing?.sku || '').trim();\r\n    if (!apiBase || (!vid && !sku)) return { ok: true };\r\n    return cockpitInventoryPost('/integrations/inventory/reserve', {\r\n      session_id: getReservationSessionId(),\r\n      quantity: 1,\r\n      shopify_variant_id: vid || null,\r\n      sku: sku || null,\r\n      sync_shopify: syncShopify,\r\n    }).catch((error) => {\r\n      if (error?.networkDegraded) {\r\n        console.warn('[L\u00FCckenf\u00FCller] reserve \u00FCbersprungen (Cockpit offline):', error.message);\r\n        return { ok: true, degraded: true };\r\n      }\r\n      throw error;\r\n    });\r\n  };\r\n\r\n  const releaseSlotInventory = async (\r\n    slot,\r\n    { syncShopify = false, releaseAll = false } = {}\r\n  ) => {\r\n    if (!apiBase) return { ok: true, released: 0 };\r\n    const vid = slot ? getSlotVariantId(slot) : null;\r\n    const sku = slot ? String(slot.listing?.sku || '').trim() : '';\r\n    if (!releaseAll && !vid && !sku) return { ok: true, released: 0 };\r\n    return cockpitInventoryPost('/integrations/inventory/release', {\r\n      session_id: getReservationSessionId(),\r\n      shopify_variant_id: releaseAll ? null : vid || null,\r\n      sku: releaseAll ? null : sku || null,\r\n      release_all: releaseAll,\r\n      sync_shopify: syncShopify,\r\n    });\r\n  };\r\n\r\n  const releaseReservedSlots = async (slots, { syncShopify = false } = {}) => {\r\n    for (const slot of slots) {\r\n      try {\r\n        await releaseSlotInventory(slot, { syncShopify: false });\r\n      } catch (error) {\r\n        console.warn('[L\u00FCckenf\u00FCller] Reservierung freigeben:', error);\r\n      }\r\n    }\r\n  };\r\n\r\n  const slotsToCartItems = (list) =>\r\n    list\r\n      .filter(canAddSlotToCart)\r\n      .map((s) => ({ id: Number(getSlotVariantId(s)), quantity: 1 }));\r\n\r\n  const openShopifyCartDrawer = () => {\r\n    void refreshShopifyCartChrome(null, { openDrawer: true });\r\n  };\r\n\r\n  const isAlreadyInCartError = (message) =>\r\n    /maximale menge|bereits in deinem warenkorb|already in your cart|maximum quantity/i.test(\r\n      String(message || '')\r\n    );\r\n\r\n  const findCardElForSlot = (slot) =>\r\n    grid\r\n      ? [...grid.querySelectorAll('[data-slot-id]')].find((node) => node.dataset.slotId === slot.slotId)\r\n      : null;\r\n\r\n  const applySelectionToDom = (slot, cardEl) => {\r\n    const el = cardEl || findCardElForSlot(slot);\r\n    if (!el) return;\r\n    el.classList.add('is-selected');\r\n    const cb = el.querySelector('.tcg-gap-filler__checkbox');\r\n    if (cb) cb.checked = true;\r\n  };\r\n\r\n  const unmarkSlotInSidebar = async (slot) => {\r\n    const vid = getSlotVariantId(slot);\r\n    if (!vid) return;\r\n    const ok = await removeVariantIdsFromShopifyCart([vid]);\r\n    if (!ok) return;\r\n    try {\r\n      await releaseSlotInventory(slot, { syncShopify: false });\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Reservierung nach Abwahl:', error);\r\n    }\r\n    slot.selected = false;\r\n    const el = findCardElForSlot(slot);\r\n    if (el) {\r\n      el.classList.remove('is-selected');\r\n      const cb = el.querySelector('.tcg-gap-filler__checkbox');\r\n      if (cb) cb.checked = false;\r\n    }\r\n    await syncMarkingsFromShopifyCart();\r\n    if (cartDrawer && !cartDrawer.hidden) renderCartDrawer();\r\n    updateStats();\r\n  };\r\n\r\n  const CART_BUBBLE_SECTION = 'cart-icon-bubble';\r\n  const SHOPIFY_CART_SECTIONS = [CART_BUBBLE_SECTION, 'cart-drawer'];\r\n\r\n  const applyCartIconBubbleSection = (html) => {\r\n    const target = document.getElementById('cart-icon-bubble');\r\n    if (!target || !html) return;\r\n    const doc = new DOMParser().parseFromString(html, 'text/html');\r\n    const section = doc.querySelector('.shopify-section');\r\n    if (section) target.innerHTML = section.innerHTML;\r\n  };\r\n\r\n  const fetchAndApplyCartBubble = async () => {\r\n    try {\r\n      const cartUrl = window.routes?.cart_url || '/cart';\r\n      const res = await fetch(`${cartUrl}?section_id=${CART_BUBBLE_SECTION}`);\r\n      if (!res.ok) return;\r\n      applyCartIconBubbleSection(await res.text());\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] cart-icon-bubble:', error);\r\n    }\r\n  };\r\n\r\n  const refreshShopifyCartChrome = async (parsedState, { openDrawer = false } = {}) => {\r\n    const bubbleHtml = parsedState?.sections?.[CART_BUBBLE_SECTION];\r\n    if (bubbleHtml) {\r\n      applyCartIconBubbleSection(bubbleHtml);\r\n    } else {\r\n      await fetchAndApplyCartBubble();\r\n    }\r\n\r\n    const shopifyDrawer = document.querySelector('cart-drawer');\r\n    if (shopifyDrawer) {\r\n      const drawerSection = parsedState?.sections?.['cart-drawer'];\r\n      if (drawerSection && typeof shopifyDrawer.renderContents === 'function' && openDrawer) {\r\n        shopifyDrawer.renderContents(parsedState);\r\n      } else {\r\n        if (parsedState?.item_count != null) {\r\n          shopifyDrawer.classList.toggle('is-empty', parsedState.item_count === 0);\r\n        }\r\n        if (openDrawer && typeof shopifyDrawer.open === 'function') {\r\n          shopifyDrawer.open();\r\n        }\r\n      }\r\n    }\r\n\r\n    if (typeof publish === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\r\n      publish(PUB_SUB_EVENTS.cartUpdate, {\r\n        source: 'tcg-gap-filler',\r\n        cartData: parsedState || {},\r\n      });\r\n    }\r\n    document.dispatchEvent(new CustomEvent('cart:refresh'));\r\n  };\r\n\r\n  const removeVariantIdsFromShopifyCart = async (variantIds) => {\r\n    const ids = new Set([...variantIds].map((id) => String(id)).filter(Boolean));\r\n    if (!ids.size) return true;\r\n\r\n    try {\r\n      const cartRes = await fetch('/cart.js', { headers: { Accept: 'application/json' } });\r\n      if (!cartRes.ok) throw new Error('Warenkorb konnte nicht gelesen werden.');\r\n      const cart = await cartRes.json();\r\n\r\n      const updates = {};\r\n      (cart.items || []).forEach((item) => {\r\n        if (ids.has(String(item.variant_id))) {\r\n          updates[item.key] = 0;\r\n        }\r\n      });\r\n      if (!Object.keys(updates).length) return true;\r\n\r\n      const updateRes = await fetch('/cart/update.js', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n        body: JSON.stringify({\r\n          updates,\r\n          sections: SHOPIFY_CART_SECTIONS,\r\n          sections_url: window.location.pathname,\r\n        }),\r\n      });\r\n      if (!updateRes.ok) {\r\n        const body = await updateRes.json().catch(() => ({}));\r\n        throw new Error(body.description || 'Warenkorb konnte nicht aktualisiert werden.');\r\n      }\r\n      const parsedState = await updateRes.json();\r\n      await refreshShopifyCartChrome(parsedState);\r\n      return true;\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Warenkorb entfernen:', error);\r\n      showFeedback(error.message || 'Warenkorb konnte nicht geleert werden.', 'error');\r\n      return false;\r\n    }\r\n  };\r\n\r\n  const removeSlotsFromShopifyCart = async (slotsToRemove) => {\r\n    const variantIds = slotsToRemove.map((s) => getSlotVariantId(s)).filter(Boolean);\r\n    return removeVariantIdsFromShopifyCart(variantIds);\r\n  };\r\n\r\n  const removeCartLineItem = async (item) => {\r\n    const slot = findSlotForCartItem(item);\r\n    const ok = await removeVariantIdsFromShopifyCart([String(item.variant_id)]);\r\n    if (!ok) return;\r\n    if (slot) {\r\n      try {\r\n        await releaseSlotInventory(slot, { syncShopify: false });\r\n      } catch (error) {\r\n        console.warn('[L\u00FCckenf\u00FCller] Reservierung nach Entfernen:', error);\r\n      }\r\n      slot.selected = false;\r\n      const el = findCardElForSlot(slot);\r\n      if (el) {\r\n        el.classList.remove('is-selected');\r\n        const cb = el.querySelector('.tcg-gap-filler__checkbox');\r\n        if (cb) cb.checked = false;\r\n      }\r\n    }\r\n    await syncMarkingsFromShopifyCart();\r\n    if (cartDrawer && !cartDrawer.hidden) renderCartDrawer();\r\n    updateStats();\r\n  };\r\n\r\n  const syncKl24CartCheckout = (cart) => {\r\n    if (window.Kl24CartEnhancements?.syncCartState) {\r\n      window.Kl24CartEnhancements.syncCartState(cart);\r\n    } else {\r\n      window.Kl24CartDrawerCheckout?.sync(cartDrawer, cart);\r\n    }\r\n  };\r\n\r\n  const renderCartDrawer = () => {\r\n    if (!cartDrawerList) return;\r\n    const ui = window.Kl24CartDrawerUI;\r\n    const inSetQty = cartQuantityInCurrentSet();\r\n    const totalQty = cartTotalQuantity();\r\n    let totalCents = 0;\r\n    shopifyCartItems.forEach((item) => {\r\n      totalCents += cartLinePriceCents(item);\r\n    });\r\n    cartDrawerList.replaceChildren();\r\n\r\n    if (cartDrawerSummary) {\r\n      if (!totalQty) {\r\n        cartDrawerSummary.textContent = 'Noch keine Karten in deinem Warenkorb.';\r\n      } else if (inSetQty === totalQty) {\r\n        cartDrawerSummary.textContent =\r\n          totalQty === 1\r\n            ? `1 Karte im Warenkorb`\r\n            : `${totalQty} Karten im Warenkorb`;\r\n      } else if (inSetQty > 0) {\r\n        cartDrawerSummary.textContent = `${inSetQty} in diesem Set \u00B7 ${totalQty} gesamt`;\r\n      } else {\r\n        cartDrawerSummary.textContent =\r\n          totalQty === 1\r\n            ? `1 Karte aus anderem Set`\r\n            : `${totalQty} Karten (andere Sets)`;\r\n      }\r\n    }\r\n\r\n    ui?.updateFooterTotal(cartDrawer, {\r\n      qty: totalQty,\r\n      formattedTotal: formatMoney(totalCents),\r\n    });\r\n\r\n    if (!totalQty) {\r\n      const empty = document.createElement('li');\r\n      empty.className = 'tcg-gap-cart-drawer__empty';\r\n      empty.textContent = 'Noch keine Karten in deinem Warenkorb.';\r\n      cartDrawerList.append(empty);\r\n      syncKl24CartCheckout(\r\n        shopifyCartSnapshot || { item_count: 0, items_subtotal_price: 0, items: [] }\r\n      );\r\n      return;\r\n    }\r\n\r\n    shopifyCartItems.forEach((item) => {\r\n      const slot = findSlotForCartItem(item);\r\n      const qty = cartItemQuantity(item);\r\n      const name = slot ? slot.name : item.product_title || item.title || 'Karte';\r\n      let detail = '';\r\n      let finishLabel = '';\r\n      if (slot) {\r\n        detail = slot.number || '';\r\n        const variant = slot.variantLabel || '';\r\n        finishLabel =\r\n          variant === 'Normal'\r\n            ? 'Matt'\r\n            : variant === 'Reverse Holo' || variant === 'Holo'\r\n              ? variant\r\n              : window.Kl24CartFinish?.finishLabelForCard(variant) || variant;\r\n      } else {\r\n        const variant =\r\n          item.variant_title && item.variant_title !== 'Default Title' ? item.variant_title : '';\r\n        detail = variant || '';\r\n        finishLabel = window.Kl24CartFinish?.resolveCartItemFinish(item) || '';\r\n        if (!detail && !finishLabel) detail = 'Anderes Set';\r\n      }\r\n      const imageUrl =\r\n        slot?.imageUrl || ui?.cartItemImage(item) || '';\r\n      const priceFormatted = formatMoney(cartLinePriceCents(item));\r\n\r\n      const li = ui?.buildItemRow({\r\n        name,\r\n        detail,\r\n        finishLabel,\r\n        priceFormatted,\r\n        qty,\r\n        imageUrl,\r\n        onRemove: () => {\r\n          void removeCartLineItem(item);\r\n        },\r\n      });\r\n      if (li) cartDrawerList.append(li);\r\n    });\r\n    syncKl24CartCheckout(shopifyCartSnapshot);\r\n  };\r\n\r\n  const syncCartFromShopify = async () => {\r\n    try {\r\n      const res = await fetch('/cart.js', { headers: { Accept: 'application/json' } });\r\n      if (!res.ok) return;\r\n      const cart = await res.json();\r\n      shopifyCartSnapshot = cart;\r\n      shopifyCartItems = cart.items || [];\r\n      updateStats();\r\n      if (cartDrawer && !cartDrawer.hidden) renderCartDrawer();\r\n      syncKl24CartCheckout(cart);\r\n      const chrome = window.Kl24InventoryReservation;\r\n      if (chrome?.fetchAndApplyCartBubble) {\r\n        await chrome.fetchAndApplyCartBubble();\r\n      }\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Warenkorb-Sync:', error);\r\n    }\r\n  };\r\n\r\n  const openCartSelectionDrawer = async () => {\r\n    if (!cartDrawer) return;\r\n    await syncCartFromShopify();\r\n    renderCartDrawer();\r\n    cartDrawer.hidden = false;\r\n    cartDrawer.removeAttribute('hidden');\r\n    window.Kl24CartDrawerUI?.open(cartDrawer, closeCartSelectionDrawer);\r\n  };\r\n\r\n  const closeCartSelectionDrawer = () => {\r\n    if (!cartDrawer) return;\r\n    cartDrawer.hidden = true;\r\n    cartDrawer.setAttribute('hidden', '');\r\n    window.Kl24CartDrawerUI?.close(cartDrawer);\r\n  };\r\n\r\n  /** Keep sidebar \u201EWarenkorb\u201C in sync when adding from a card button/FAB. */\r\n  const markSlotSelectedInSidebar = (slot, cardEl) => {\r\n    if (!canAddSlotToCart(slot)) return;\r\n    slot.selected = true;\r\n    applySelectionToDom(slot, cardEl);\r\n    if (cartDrawer && !cartDrawer.hidden) renderCartDrawer();\r\n    updateStats();\r\n  };\r\n\r\n  const syncMarkingsFromShopifyCart = async () => {\r\n    if (!slots.length) return;\r\n    try {\r\n      const res = await fetch('/cart.js', { headers: { Accept: 'application/json' } });\r\n      if (!res.ok) return;\r\n      const cart = await res.json();\r\n      shopifyCartSnapshot = cart;\r\n      shopifyCartItems = cart.items || [];\r\n      const variantIdsInCart = new Set(\r\n        shopifyCartItems.map((item) => String(item.variant_id))\r\n      );\r\n\r\n      if (variantIndexStatus === 'ready') {\r\n        let changed = false;\r\n        slots.forEach((slot) => {\r\n          const vid = getSlotVariantId(slot);\r\n          if (!vid) return;\r\n          const inCart = variantIdsInCart.has(vid);\r\n          if (inCart && !slot.selected) {\r\n            slot.selected = true;\r\n            changed = true;\r\n          } else if (!inCart && slot.selected) {\r\n            slot.selected = false;\r\n            changed = true;\r\n          }\r\n        });\r\n        shopifyCartItems.forEach((item) => {\r\n          const slot = findSlotForCartItem(item);\r\n          if (slot && !slot.selected) {\r\n            slot.selected = true;\r\n            changed = true;\r\n          }\r\n        });\r\n        if (changed) {\r\n          slots.forEach((slot) => {\r\n            if (slot.selected) applySelectionToDom(slot);\r\n            else {\r\n              const el = findCardElForSlot(slot);\r\n              if (el) {\r\n                el.classList.remove('is-selected');\r\n                const cb = el.querySelector('.tcg-gap-filler__checkbox');\r\n                if (cb) cb.checked = false;\r\n              }\r\n            }\r\n          });\r\n        }\r\n      }\r\n\r\n      if (cartDrawer && !cartDrawer.hidden) renderCartDrawer();\r\n      updateStats();\r\n      if (cartTotalQuantity() > 0) {\r\n        void fetchAndApplyCartBubble();\r\n      }\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Warenkorb-Markierung-Sync:', error);\r\n    }\r\n  };\r\n\r\n  const addItemsToCart = async (items, { successMessage, reserveSlots = [] } = {}) => {\r\n    if (!items.length) {\r\n      showFeedback('Keine Karten mit Shop-Verkn\u00FCpfung zum Hinzuf\u00FCgen.', 'error');\r\n      return false;\r\n    }\r\n\r\n    let workingItems = items.slice();\r\n    let slotsToReserve = (reserveSlots || []).filter(Boolean);\r\n    const reserveApi = window.Kl24InventoryReservation;\r\n    if (reserveApi?.filterAvailableCards) {\r\n      const probeCards = workingItems.map((item) => ({\r\n        variantId: String(item.id),\r\n        sku: '',\r\n      }));\r\n      const { blocked } = await reserveApi.filterAvailableCards(probeCards);\r\n      if (blocked.length) {\r\n        const blockedIds = new Set(blocked.map((card) => String(card.variantId)));\r\n        workingItems = workingItems.filter((item) => !blockedIds.has(String(item.id)));\r\n        slotsToReserve = slotsToReserve.filter(\r\n          (slot) => !blockedIds.has(String(getSlotVariantId(slot) || ''))\r\n        );\r\n        if (!workingItems.length) {\r\n          showFeedback(\r\n            'Diese Karte ist gerade bei einem anderen Kunden reserviert.',\r\n            'error'\r\n          );\r\n          return false;\r\n        }\r\n        showFeedback(\r\n          blocked.length === 1\r\n            ? 'Eine Karte ist gerade bei einem anderen Kunden reserviert und wurde \u00FCbersprungen.'\r\n            : `${blocked.length} Karten sind gerade bei anderen Kunden reserviert und wurden \u00FCbersprungen.`,\r\n          'error'\r\n        );\r\n      }\r\n    }\r\n\r\n    const reservedSlots = [];\r\n\r\n    for (const slot of slotsToReserve) {\r\n      try {\r\n        const reserve = await reserveSlotInventory(slot, { syncShopify: false });\r\n        if (!reserve?.ok) {\r\n          if (reserve?.error === 'not_found' || reserve?.skipped || reserve?.degraded) {\r\n            console.warn(\r\n              '[L\u00FCckenf\u00FCller] Katalog-Miss \u2014 Warenkorb ohne Hold:',\r\n              reserve?.message || reserve?.error\r\n            );\r\n            continue;\r\n          }\r\n          await releaseReservedSlots(reservedSlots, { syncShopify: false });\r\n          showFeedback(\r\n            reserve?.message ||\r\n              'Diese Karte ist gerade von einem anderen Besucher reserviert.',\r\n            'error'\r\n          );\r\n          return false;\r\n        }\r\n        if (!reserve?.degraded && !reserve?.skipped) {\r\n          reservedSlots.push(slot);\r\n        }\r\n      } catch (error) {\r\n        if (error?.networkDegraded) {\r\n          console.warn('[L\u00FCckenf\u00FCller] Reservierung \u00FCbersprungen (Cockpit offline):', error.message);\r\n          continue;\r\n        }\r\n        await releaseReservedSlots(reservedSlots, { syncShopify: false });\r\n        showFeedback(error.message || 'Reservierung fehlgeschlagen.', 'error');\r\n        return false;\r\n      }\r\n    }\r\n\r\n    try {\r\n      const items = workingItems;\r\n      const response = await fetch('/cart/add.js', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n        body: JSON.stringify({\r\n          items,\r\n          sections: SHOPIFY_CART_SECTIONS,\r\n          sections_url: window.location.pathname,\r\n        }),\r\n      });\r\n      if (!response.ok) {\r\n        const body = await response.json().catch(() => ({}));\r\n        const msg = String(body.description || body.message || '');\r\n        if (isAlreadyInCartError(msg)) {\r\n          showFeedback(\r\n            items.length === 1\r\n              ? 'Diese Karte ist bereits im Warenkorb \u2014 in der Markierung angezeigt.'\r\n              : 'Einige Karten sind bereits im Warenkorb \u2014 Markierung aktualisiert.',\r\n            'success'\r\n          );\r\n          await fetchAndApplyCartBubble();\r\n          document.dispatchEvent(new CustomEvent('cart:refresh'));\r\n          return 'already';\r\n        }\r\n        await releaseReservedSlots(reservedSlots, { syncShopify: false });\r\n        throw new Error(msg || 'Warenkorb konnte nicht aktualisiert werden.');\r\n      }\r\n      const parsedState = await response.json();\r\n      for (const slot of reservedSlots) {\r\n        try {\r\n          await reserveSlotInventory(slot, { syncShopify: false });\r\n        } catch (error) {\r\n          console.warn('[L\u00FCckenf\u00FCller] Shopify-Bestand sync:', error);\r\n        }\r\n      }\r\n      showFeedback(\r\n        successMessage || `${items.length} Karte(n) wurden in den Warenkorb gelegt.`,\r\n        'success'\r\n      );\r\n      await refreshShopifyCartChrome(parsedState, { openDrawer: true });\r\n      await syncMarkingsFromShopifyCart();\r\n      const wishApi = getWish();\r\n      if (wishApi) {\r\n        await wishApi.syncCart(wishApi.loadAll());\r\n      }\r\n      return true;\r\n    } catch (error) {\r\n      await releaseReservedSlots(reservedSlots, { syncShopify: false });\r\n      showFeedback(error.message || 'Fehler beim Hinzuf\u00FCgen.', 'error');\r\n      return false;\r\n    }\r\n  };\r\n\r\n  const resolveOfficialSetTotal = (handle, payloadOfficial = 0) => {\r\n    const key = String(handle || '').trim().toLowerCase();\r\n    const meta = setsCache.find((s) => String(s.handle || '').toLowerCase() === key);\r\n    const fromIndex = Number(meta?.total_cards);\r\n    if (Number.isFinite(fromIndex) && fromIndex > 0) return fromIndex;\r\n    const fromMap = Number(SET_OFFICIAL_TOTALS[key]);\r\n    if (Number.isFinite(fromMap) && fromMap > 0) return fromMap;\r\n    const fromPayload = Number(payloadOfficial);\r\n    if (Number.isFinite(fromPayload) && fromPayload > 0) return fromPayload;\r\n    const unique = new Set(\r\n      slots.map((slot) => normalizeNumber(slot.number).split('/')[0]).filter(Boolean)\r\n    );\r\n    return unique.size || slots.length || 0;\r\n  };\r\n\r\n  const updateStats = () => {\r\n    const visible = visibleSlots();\r\n    const wishlistedSet = wishlistCountForSet();\r\n    const totalWishlist = getWish()?.loadAll().length ?? wishlistedSet;\r\n    const stockCount = slots.filter(isSlotShopAvailable).length;\r\n    const inSetQty = cartQuantityInCurrentSet();\r\n    const cartCount = cartTotalQuantity();\r\n    let cartTotalCents = 0;\r\n    shopifyCartItems.forEach((item) => {\r\n      cartTotalCents += cartLinePriceCents(item);\r\n    });\r\n\r\n    const setTotal =\r\n      currentSetOfficialTotal > 0\r\n        ? currentSetOfficialTotal\r\n        : resolveOfficialSetTotal(currentSetHandle);\r\n    if (kpiSet) kpiSet.textContent = String(setTotal || '\u2026');\r\n    if (kpiStock) kpiStock.textContent = root.dataset.loading === '1' ? '\u2026' : String(stockCount);\r\n    syncSetHeading();\r\n\r\n    if (zeroStockNotice) {\r\n      // Never show \u201C0 verf\u00FCgbar\u201D while a set is still loading.\r\n      zeroStockNotice.hidden =\r\n        root.dataset.loading === '1' || stockCount > 0 || slots.length === 0;\r\n    }\r\n\r\n    if (sidebarCartStat) {\r\n      if (cartCount === 0) {\r\n        sidebarCartStat.textContent = 'Noch keine Karten im Warenkorb';\r\n      } else if (inSetQty === cartCount) {\r\n        sidebarCartStat.textContent =\r\n          cartCount === 1\r\n            ? `1 Karte im Warenkorb \u00B7 ca. ${formatMoney(cartTotalCents)}`\r\n            : `${cartCount} Karten im Warenkorb \u00B7 ca. ${formatMoney(cartTotalCents)}`;\r\n      } else if (inSetQty > 0) {\r\n        const setPart =\r\n          inSetQty === 1 ? '1 in diesem Set' : `${inSetQty} in diesem Set`;\r\n        const totalPart = cartCount === 1 ? '1 gesamt' : `${cartCount} gesamt`;\r\n        sidebarCartStat.textContent = `${setPart} \u00B7 ${totalPart} \u00B7 ca. ${formatMoney(cartTotalCents)}`;\r\n      } else {\r\n        sidebarCartStat.textContent =\r\n          cartCount === 1\r\n            ? '1 Karte im Warenkorb (anderes Set)'\r\n            : `${cartCount} Karten im Warenkorb (andere Sets)`;\r\n      }\r\n    }\r\n\r\n    if (viewCartBtn) viewCartBtn.disabled = false;\r\n\r\n    if (sidebarWishStat) {\r\n      if (totalWishlist === 0) {\r\n        sidebarWishStat.textContent = 'Noch keine Karten gemerkt';\r\n      } else if (wishlistedSet === totalWishlist) {\r\n        sidebarWishStat.textContent =\r\n          totalWishlist === 1 ? '1 Karte auf Wunschliste' : `${totalWishlist} Karten auf Wunschliste`;\r\n      } else {\r\n        const setPart =\r\n          wishlistedSet === 1 ? '1 in diesem Set' : `${wishlistedSet} in diesem Set`;\r\n        const totalPart = totalWishlist === 1 ? '1 gesamt' : `${totalWishlist} gesamt`;\r\n        sidebarWishStat.textContent = `${setPart} \u00B7 ${totalPart}`;\r\n      }\r\n    }\r\n\r\n    if (viewWishlistBtn) viewWishlistBtn.disabled = totalWishlist === 0;\r\n\r\n    if (wishlistDrawerInquiryBtn) wishlistDrawerInquiryBtn.disabled = totalWishlist === 0;\r\n\r\n    if (stats) {\r\n      const uniqueInSet = new Set(\r\n        slots.map((slot) => normalizeNumber(slot.number).split('/')[0]).filter(Boolean)\r\n      ).size;\r\n      const setCount = setTotal || uniqueInSet || slots.length;\r\n      const variantCount = visible.length;\r\n      stats.textContent =\r\n        `${variantCount} Varianten \u00B7 ${setCount} Karten im Set \u00B7 ` +\r\n        `${stockCount} verf\u00FCgbar`;\r\n    }\r\n    window.TcgGapWishlistInquiry?.updateButton();\r\n  };\r\n\r\n  const renderWishlistDrawer = () => {\r\n    const wishApi = getWish();\r\n    if (!wishlistDrawerList || !wishApi) return;\r\n    const ids = wishApi.loadAll();\r\n    wishlistDrawerList.replaceChildren();\r\n\r\n    if (wishlistDrawerSummary) {\r\n      wishlistDrawerSummary.textContent =\r\n        ids.length === 1\r\n          ? '1 Karte auf deiner Wunschliste'\r\n          : `${ids.length} Karten auf deiner Wunschliste`;\r\n    }\r\n\r\n    if (!ids.length) {\r\n      const empty = document.createElement('li');\r\n      empty.className = 'tcg-gap-wishlist-drawer__empty';\r\n      empty.textContent = 'Noch keine Karten auf der Wunschliste.';\r\n      wishlistDrawerList.append(empty);\r\n      return;\r\n    }\r\n\r\n    ids.forEach((slotId) => {\r\n      const entry = resolveWishlistEntry(slotId);\r\n      const li = document.createElement('li');\r\n      li.className = 'tcg-gap-wishlist-drawer__item';\r\n\r\n      const info = document.createElement('div');\r\n      info.className = 'tcg-gap-wishlist-drawer__item-info';\r\n      const name = document.createElement('p');\r\n      name.className = 'tcg-gap-wishlist-drawer__item-name';\r\n      name.textContent = entry.name;\r\n      const meta = document.createElement('p');\r\n      meta.className = 'tcg-gap-wishlist-drawer__item-meta';\r\n      meta.textContent = `${entry.setName} \u00B7 ${entry.number} \u00B7 ${entry.variantLabel}`;\r\n      info.append(name, meta);\r\n\r\n      const removeBtn = document.createElement('button');\r\n      removeBtn.type = 'button';\r\n      removeBtn.className = 'tcg-gap-wishlist-drawer__item-remove';\r\n      removeBtn.textContent = 'Entfernen';\r\n      removeBtn.addEventListener('click', () => {\r\n        const api = getWish();\r\n        if (!api) return;\r\n        const normalized = api.normalizeSlotId ? api.normalizeSlotId(slotId) : slotId;\r\n        api.saveAll(\r\n          api.loadAll().filter((id) => {\r\n            const norm = api.normalizeSlotId ? api.normalizeSlotId(id) : id;\r\n            return norm !== normalized;\r\n          })\r\n        );\r\n        const slot = slots.find((s) => s.slotId === slotId);\r\n        if (slot) slot.wishlisted = false;\r\n        renderWishlistDrawer();\r\n        render();\r\n      });\r\n\r\n      li.append(info, removeBtn);\r\n      wishlistDrawerList.append(li);\r\n    });\r\n  };\r\n\r\n  const openWishlistDrawer = () => {\r\n    const wishApi = getWish();\r\n    if (!wishlistDrawer || !wishApi || wishApi.loadAll().length === 0) return;\r\n    renderWishlistDrawer();\r\n    wishlistDrawer.hidden = false;\r\n    document.body.style.overflow = 'hidden';\r\n  };\r\n\r\n  const closeWishlistDrawer = () => {\r\n    if (!wishlistDrawer) return;\r\n    wishlistDrawer.hidden = true;\r\n    document.body.style.overflow = '';\r\n  };\r\n\r\n  const render = () => {\r\n    if (!grid) return;\r\n    // Only block paint while an explicit set-load is in progress.\r\n    // Do NOT treat is-hydrating as loading \u2014 that re-entered showLoading() and\r\n    // left the grid stuck after the first loadSet() (slots ready, 0 cards painted).\r\n    if (root.dataset.loading === '1') {\r\n      showLoading('Set wird geladen \u2026');\r\n      return;\r\n    }\r\n    grid.replaceChildren();\r\n\r\n    const list = visibleSlots();\r\n    if (!list.length) {\r\n      const empty = document.createElement('p');\r\n      empty.className = 'tcg-gap-filler__loading';\r\n      empty.textContent = 'Keine Karten gefunden.';\r\n      grid.append(empty);\r\n      updateStats();\r\n      return;\r\n    }\r\n\r\n    list.forEach((slot) => {\r\n      const shopAvailable = isSlotShopAvailable(slot);\r\n      const item = document.createElement(shopAvailable ? 'label' : 'div');\r\n      item.className = 'tcg-gap-filler__card';\r\n      item.dataset.slotId = slot.slotId;\r\n      if (!shopAvailable) item.classList.add('is-out-of-stock');\r\n      else item.classList.add('is-in-stock');\r\n      if (slot.selected) item.classList.add('is-selected');\r\n      if (slot.wishlisted) item.classList.add('is-wishlisted');\r\n      const variantId = getSlotVariantId(slot);\r\n      if (variantId) item.classList.add('is-cart-ready');\r\n\r\n      /** @type {HTMLElement|null} */\r\n      let wishBtn = null;\r\n\r\n      if (shopAvailable) {\r\n        const checkbox = document.createElement('input');\r\n        checkbox.type = 'checkbox';\r\n        checkbox.className = 'tcg-gap-filler__checkbox';\r\n        checkbox.checked = slot.selected;\r\n        checkbox.setAttribute('aria-label', 'F\u00FCr Warenkorb markieren');\r\n        checkbox.addEventListener('change', () => {\r\n          slot.selected = checkbox.checked;\r\n          item.classList.toggle('is-selected', slot.selected);\r\n          updateStats();\r\n        });\r\n        item.append(checkbox);\r\n      } else {\r\n        wishBtn = document.createElement('button');\r\n        wishBtn.type = 'button';\r\n        wishBtn.className = 'tcg-gap-filler__card-wish-btn';\r\n        if (slot.wishlisted) wishBtn.classList.add('is-active');\r\n        wishBtn.setAttribute('aria-label', 'Auf Wunschliste setzen');\r\n        wishBtn.setAttribute('aria-pressed', slot.wishlisted ? 'true' : 'false');\r\n        wishBtn.title = slot.wishlisted ? 'Von Wunschliste entfernen' : 'Auf Wunschliste setzen';\r\n        wishBtn.innerHTML = '<span class=\"tcg-gap-filler__card-wish-icon\" aria-hidden=\"true\"></span>';\r\n        wishBtn.addEventListener('click', (event) => {\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          toggleWishlist(slot, item, wishBtn);\r\n          const unavail = item.querySelector('.tcg-gap-filler__card-unavailable');\r\n          if (unavail) setCardUnavailableLabel(unavail, slot);\r\n          wishBtn.title = slot.wishlisted ? 'Von Wunschliste entfernen' : 'Auf Wunschliste setzen';\r\n        });\r\n        item.append(wishBtn);\r\n      }\r\n\r\n      appendCardThumb(item, slot, shopAvailable);\r\n\r\n      const body = document.createElement('div');\r\n      body.className = 'tcg-gap-filler__card-body';\r\n\r\n      const name = document.createElement('p');\r\n      name.className = 'tcg-gap-filler__card-name';\r\n      name.textContent = slot.name;\r\n\r\n      const meta = document.createElement('p');\r\n      meta.className = 'tcg-gap-filler__card-meta';\r\n      meta.textContent = `${slot.number} \u00B7 ${slot.variantLabel}`;\r\n\r\n      body.append(name, meta);\r\n\r\n      if (shopAvailable && slot.listing?.price_cents != null) {\r\n        const priceWrap = document.createElement('div');\r\n        priceWrap.className = 'tcg-gap-filler__card-price-block';\r\n\r\n        const priceLabelEl = document.createElement('span');\r\n        priceLabelEl.className = 'tcg-gap-filler__card-price-label';\r\n        priceLabelEl.textContent = priceLabel;\r\n\r\n        const priceValue = document.createElement('p');\r\n        priceValue.className = 'tcg-gap-filler__card-shop-price';\r\n        priceValue.textContent = formatMoney(slot.listing.price_cents);\r\n\r\n        priceWrap.append(priceLabelEl, priceValue);\r\n        body.append(priceWrap);\r\n\r\n        const detail = document.createElement('p');\r\n        detail.className = 'tcg-gap-filler__card-price-detail';\r\n        detail.textContent = `${slot.listing.condition || 'NM'} \u00B7 ${slot.listing.available_stock ?? slot.listing.stock} auf Lager`;\r\n        body.append(detail);\r\n\r\n        const cartBtn = document.createElement('button');\r\n        cartBtn.type = 'button';\r\n        cartBtn.className = 'button button--secondary tcg-gap-filler__card-cart-btn';\r\n        cartBtn.textContent = 'In den Warenkorb';\r\n        cartBtn.setAttribute('aria-label', `${slot.name} in den Warenkorb legen`);\r\n        const applyCartBtnState = () => {\r\n          const vid = getSlotVariantId(slot);\r\n          if (vid) {\r\n            cartBtn.disabled = false;\r\n            cartBtn.textContent = 'In den Warenkorb';\r\n          } else if (variantIndexStatus === 'pending') {\r\n            cartBtn.disabled = true;\r\n            cartBtn.textContent = 'Shop-Verkn\u00FCpfung l\u00E4dt \u2026';\r\n          } else {\r\n            cartBtn.disabled = true;\r\n            cartBtn.textContent = 'Noch nicht im Online-Shop';\r\n          }\r\n        };\r\n        applyCartBtnState();\r\n        item._applyCartBtnState = applyCartBtnState;\r\n        cartBtn.addEventListener('click', async (event) => {\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          const vid = getSlotVariantId(slot);\r\n          if (!vid) return;\r\n          cartBtn.disabled = true;\r\n          const added = await addItemsToCart([{ id: Number(vid), quantity: 1 }], {\r\n            successMessage: `\u201E${slot.name}\u201C wurde in den Warenkorb gelegt.`,\r\n            reserveSlots: [slot],\r\n          });\r\n          if (added === true || added === 'already') markSlotSelectedInSidebar(slot, item);\r\n          applyCartBtnState();\r\n        });\r\n        body.append(cartBtn);\r\n      } else if (!shopAvailable) {\r\n        const unavail = document.createElement('p');\r\n        unavail.className = 'tcg-gap-filler__card-unavailable';\r\n        setCardUnavailableLabel(unavail, slot);\r\n        body.append(unavail);\r\n      }\r\n\r\n      item.append(body);\r\n      grid.append(item);\r\n    });\r\n\r\n    updateStats();\r\n    updateImageNotice();\r\n  };\r\n\r\n  const flattenFromPayload = (payload, setHandle) => {\r\n    const handle = String(setHandle || payload?.handle || currentSetHandle || defaultSet)\r\n      .trim()\r\n      .toLowerCase();\r\n    const rows = [];\r\n    (payload.cards || []).forEach((card) => {\r\n      const variants = card.variants?.length\r\n        ? card.variants\r\n        : [{ key: 'normal', label: 'Normal', image_url: card.image_url }];\r\n      variants.forEach((variant) => {\r\n        const finish = normalizeVariantKey(variant.key);\r\n        const wishApi = getWish();\r\n        const slotId = wishApi\r\n          ? wishApi.buildSlotId(handle, card.number, finish)\r\n          : `${handle}|${card.number}|${finish}`;\r\n        const stockState = resolveVariantStock({ ...variant, key: finish });\r\n        rows.push({\r\n          slotId,\r\n          number: card.number,\r\n          name: card.name,\r\n          variantKey: finish,\r\n          variantLabel:\r\n            variant.label ||\r\n            VARIANT_LABELS[finish] ||\r\n            (finish === 'reverse' ? 'Reverse Holo' : finish === 'holo' ? 'Holo' : 'Normal'),\r\n          setName: setNameForHandle(handle),\r\n          imageUrl: variant.image_url || card.image_url || null,\r\n          in_stock: stockState.in_stock,\r\n          listing: stockState.listing,\r\n          selected: false,\r\n          wishlisted: wishApi ? wishApi.isWishlisted(slotId) : false,\r\n        });\r\n      });\r\n    });\r\n    return rows;\r\n  };\r\n\r\n  const mergeImagesIntoSlots = (rows, apiPayload) => {\r\n    const map = new Map();\r\n    (apiPayload?.cards || []).forEach((card) => {\r\n      const cardImg = card.image_url || null;\r\n      (card.variants || [{ key: 'standard' }]).forEach((variant) => {\r\n        const img = variant.image_url || cardImg;\r\n        if (!img) return;\r\n        map.set(`${normalizeNumber(card.number)}|${variant.key}`, img);\r\n      });\r\n      if (cardImg) {\r\n        map.set(`${normalizeNumber(card.number)}|*`, cardImg);\r\n      }\r\n    });\r\n    return rows.map((slot) => {\r\n      if (slot.imageUrl) return slot;\r\n      const key = `${normalizeNumber(slot.number)}|${slot.variantKey}`;\r\n      const hit = map.get(key) || map.get(`${normalizeNumber(slot.number)}|*`);\r\n      return hit ? { ...slot, imageUrl: hit } : slot;\r\n    });\r\n  };\r\n\r\n  const setCardUnavailableLabel = (el, slot) => {\r\n    if (!el) return;\r\n    if (slot.wishlisted) {\r\n      el.textContent = 'Auf Wunschliste';\r\n      el.title = 'Wird beim Checkout \u00FCbermittelt';\r\n    } else {\r\n      el.textContent = 'Nicht auf Lager';\r\n      el.title = 'Herz klicken zum Merken';\r\n    }\r\n  };\r\n\r\n  const createThumbPlaceholder = (slot) => {\r\n    const ph = document.createElement('div');\r\n    ph.className = 'tcg-gap-filler__thumb-placeholder';\r\n    ph.setAttribute('aria-hidden', 'true');\r\n    const num = String(slot.number || '').split('/')[0] || '?';\r\n    ph.innerHTML = `<span class=\"tcg-gap-filler__thumb-placeholder-num\">${num}</span>`;\r\n    return ph;\r\n  };\r\n\r\n  /** @type {{ slot: object, item: HTMLElement, shopAvailable: boolean } | null} */\r\n  let cardPreviewContext = null;\r\n\r\n  const closeCardPreviewFallback = () => {\r\n    if (!cardPreviewRoot || cardPreviewRoot.hidden) return;\r\n    const focusTarget =\r\n      cardPreviewContext?.triggerEl ||\r\n      cardPreviewContext?.item?.querySelector('.tcg-gap-filler__thumb-wrap--preview');\r\n    cardPreviewRoot.hidden = true;\r\n    cardPreviewRoot.setAttribute('hidden', '');\r\n    document.body.style.overflow = '';\r\n    cardPreviewContext = null;\r\n    focusTarget?.focus({ preventScroll: true });\r\n  };\r\n\r\n  const syncCardPreviewActions = (slot, shopAvailable) => {\r\n    if (!cardPreviewUnavailable) return;\r\n    cardPreviewUnavailable.hidden = false;\r\n    cardPreviewUnavailable.removeAttribute('hidden');\r\n    cardPreviewUnavailable.textContent = slot.wishlisted\r\n      ? 'Auf Wunschliste'\r\n      : shopAvailable\r\n        ? 'Produktansicht nicht verf\u00FCgbar.'\r\n        : 'Nicht auf Lager';\r\n    cardPreviewUnavailable.title = slot.wishlisted\r\n      ? 'Wird beim Checkout \u00FCbermittelt'\r\n      : shopAvailable\r\n        ? ''\r\n        : 'Herz klicken zum Merken';\r\n  };\r\n\r\n  const buildGapImageAlt = (slot) => {\r\n    const name = String(slot?.name || '').trim();\r\n    const number = String(slot?.number || '').trim();\r\n    const set = formatSetDisplayName(\r\n      String(slot?.setName || slot?.set || '').trim() || currentSetDisplayName()\r\n    );\r\n    let finish = String(slot?.variantLabel || slot?.finish || '').trim();\r\n    if (finish === 'Normal') finish = 'Matt';\r\n    let head = name;\r\n    if (number && !name.includes(number)) head = [name, number].filter(Boolean).join(' ');\r\n    const setCore = set.replace(/\\s*\\([^)]*\\)\\s*$/u, '').trim();\r\n    let alt = head;\r\n    if (set && !head.includes(set) && !(setCore && head.includes(setCore))) {\r\n      alt = alt ? `${alt} \u2013 ${set}` : set;\r\n    }\r\n    alt = alt ? `${alt} \u2013 Pok\u00E9mon Karte` : 'Pok\u00E9mon Karte';\r\n    if (finish) alt = `${alt} ${finish}`;\r\n    return alt.trim();\r\n  };\r\n\r\n  const openCardPreviewFallback = (slot, item, shopAvailable, triggerEl) => {\r\n    if (!cardPreviewRoot || !cardPreviewMedia || !cardPreviewName || !cardPreviewMeta) return;\r\n    cardPreviewContext = { slot, item, shopAvailable, triggerEl };\r\n\r\n    cardPreviewMedia.replaceChildren();\r\n    if (slot.imageUrl) {\r\n      const img = document.createElement('img');\r\n      img.src = slot.imageUrl;\r\n      img.alt = buildGapImageAlt(slot);\r\n      img.width = 400;\r\n      img.height = 560;\r\n      img.addEventListener('error', () => {\r\n        cardPreviewMedia.replaceChildren(createThumbPlaceholder(slot));\r\n      });\r\n      cardPreviewMedia.append(img);\r\n    } else {\r\n      cardPreviewMedia.append(createThumbPlaceholder(slot));\r\n    }\r\n\r\n    cardPreviewName.textContent = slot.name;\r\n    cardPreviewMeta.textContent = `${slot.number} \u00B7 ${slot.variantLabel}`;\r\n    syncCardPreviewActions(slot, shopAvailable);\r\n\r\n    cardPreviewRoot.hidden = false;\r\n    cardPreviewRoot.removeAttribute('hidden');\r\n    document.body.style.overflow = 'hidden';\r\n    cardPreviewRoot.querySelector('[data-gap-card-preview-close-btn]')?.focus();\r\n  };\r\n\r\n  const loadQuickAddProduct = async (modal, productUrl) => {\r\n    const modalContent = modal.querySelector('[id^=\"QuickAddInfo-\"]');\r\n    if (!modalContent) throw new Error('Quick-add container missing');\r\n\r\n    const response = await fetch(productUrl);\r\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\r\n    const responseText = await response.text();\r\n    const doc = new DOMParser().parseFromString(responseText, 'text/html');\r\n    const productElement = doc.querySelector('product-info');\r\n    if (!productElement) throw new Error('product-info missing');\r\n\r\n    if (typeof modal.preprocessHTML === 'function') {\r\n      try {\r\n        modal.preprocessHTML(productElement);\r\n      } catch (error) {\r\n        console.warn('[L\u00FCckenf\u00FCller] Quick-View preprocess:', error);\r\n      }\r\n      if (typeof HTMLUpdateUtility !== 'undefined') {\r\n        HTMLUpdateUtility.setInnerHTML(modalContent, productElement.outerHTML);\r\n      } else {\r\n        modalContent.innerHTML = productElement.outerHTML;\r\n      }\r\n    } else {\r\n      modalContent.innerHTML = productElement.outerHTML;\r\n    }\r\n\r\n    if (window.Shopify?.PaymentButton) Shopify.PaymentButton.init();\r\n    if (window.ProductModel) window.ProductModel.loadShopifyXR();\r\n  };\r\n\r\n  const openQuickAddShell = (modal, opener) => {\r\n    const modalDialogProto = Object.getPrototypeOf(Object.getPrototypeOf(modal));\r\n    if (modalDialogProto && typeof modalDialogProto.show === 'function') {\r\n      modalDialogProto.show.call(modal, opener);\r\n      return;\r\n    }\r\n    modal.openedBy = opener;\r\n    document.body.classList.add('overflow-hidden');\r\n    modal.setAttribute('open', '');\r\n  };\r\n\r\n  const closeQuickAddModal = (modal) => {\r\n    if (!modal) return;\r\n    if (typeof modal.hide === 'function') {\r\n      modal.hide(true);\r\n      return;\r\n    }\r\n    modal.removeAttribute('open');\r\n    document.body.classList.remove('overflow-hidden');\r\n  };\r\n\r\n  const bindQuickAddCartHandler = (modal, slot, item) => {\r\n    const productForm = modal.querySelector('product-form');\r\n    const form = productForm?.querySelector('form');\r\n    if (!form) return;\r\n\r\n    const submitBtn = productForm.querySelector('[type=\"submit\"]');\r\n    const variantId = getSlotVariantId(slot);\r\n    const variantInput = form.querySelector('[name=\"id\"]');\r\n    if (variantInput && variantId) {\r\n      variantInput.value = variantId;\r\n      variantInput.disabled = false;\r\n    }\r\n    if (submitBtn) {\r\n      submitBtn.removeAttribute('disabled');\r\n      submitBtn.removeAttribute('aria-disabled');\r\n    }\r\n\r\n    if (form.dataset.gapQuickAddBound === 'true') return;\r\n    form.dataset.gapQuickAddBound = 'true';\r\n\r\n    form.addEventListener(\r\n      'submit',\r\n      async (event) => {\r\n        event.preventDefault();\r\n        event.stopImmediatePropagation();\r\n\r\n        const vid = getSlotVariantId(slot) || form.querySelector('[name=\"id\"]')?.value;\r\n        if (!vid) {\r\n          showFeedback('Shop-Verkn\u00FCpfung l\u00E4dt noch \u2013 bitte kurz warten.', 'error');\r\n          return;\r\n        }\r\n\r\n        if (submitBtn) {\r\n          submitBtn.setAttribute('aria-disabled', 'true');\r\n          submitBtn.classList.add('loading');\r\n          submitBtn.querySelector('.loading__spinner')?.classList.remove('hidden');\r\n        }\r\n\r\n        const added = await addItemsToCart([{ id: Number(vid), quantity: 1 }], {\r\n          successMessage: `\u201E${slot.name}\u201C wurde in den Warenkorb gelegt.`,\r\n          reserveSlots: [slot],\r\n        });\r\n\r\n        if (submitBtn) {\r\n          submitBtn.classList.remove('loading');\r\n          submitBtn.removeAttribute('aria-disabled');\r\n          submitBtn.querySelector('.loading__spinner')?.classList.add('hidden');\r\n        }\r\n\r\n        if (added === true || added === 'already') {\r\n          markSlotSelectedInSidebar(slot, item);\r\n          closeQuickAddModal(modal);\r\n        }\r\n      },\r\n      { capture: true }\r\n    );\r\n  };\r\n\r\n  const enableQuickAddCart = (modal, slot, item) => {\r\n    if (!modal || !slot) return;\r\n    bindQuickAddCartHandler(modal, slot, item);\r\n    modal.querySelector('product-info')?.dispatchEvent(\r\n      new CustomEvent('product-info:loaded', { bubbles: true })\r\n    );\r\n  };\r\n\r\n  const openSlotQuickAddModal = async (slot, item, shopAvailable, triggerEl) => {\r\n    const focusTarget =\r\n      triggerEl || item?.querySelector('.tcg-gap-filler__thumb-wrap--preview') || item;\r\n    const enrichedSlot = enrichSlotListing(slot);\r\n    const productUrl = buildSlotQuickAddUrl(enrichedSlot);\r\n    if (!productUrl) {\r\n      openCardPreviewFallback(enrichedSlot, item, shopAvailable, focusTarget);\r\n      return;\r\n    }\r\n\r\n    try {\r\n      await customElements.whenDefined('quick-add-modal');\r\n      const modal = getQuickAddModal();\r\n      const opener = quickAddOpener;\r\n      if (!modal || !opener) throw new Error('Quick-add modal missing');\r\n\r\n      opener.setAttribute('data-product-url', productUrl);\r\n      if (!opener.querySelector('.loading__spinner')) {\r\n        const spinner = document.createElement('div');\r\n        spinner.className = 'loading__spinner hidden';\r\n        opener.append(spinner);\r\n      }\r\n\r\n      await loadQuickAddProduct(modal, productUrl);\r\n      enableQuickAddCart(modal, enrichedSlot, item);\r\n      openQuickAddShell(modal, focusTarget);\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Quick-View fehlgeschlagen:', error);\r\n      openCardPreviewFallback(enrichedSlot, item, shopAvailable, focusTarget);\r\n    }\r\n  };\r\n\r\n  const openSlotProductModal = async (slot, item, shopAvailable, triggerEl) => {\r\n    try {\r\n      await ensureVariantIndex();\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Varianten-Index:', error);\r\n    }\r\n    await openSlotQuickAddModal(slot, item, shopAvailable, triggerEl);\r\n  };\r\n\r\n  cardPreviewRoot?.addEventListener('click', (event) => {\r\n    if (event.target === cardPreviewRoot) closeCardPreviewFallback();\r\n  });\r\n  cardPreviewCloseBtns.forEach((btn) => {\r\n    btn.addEventListener('click', closeCardPreviewFallback);\r\n  });\r\n  document.addEventListener('keydown', (event) => {\r\n    if (event.key === 'Escape' && cardPreviewRoot && !cardPreviewRoot.hidden) {\r\n      closeCardPreviewFallback();\r\n    }\r\n  });\r\n\r\n  const appendCardThumb = (item, slot, shopAvailable) => {\r\n    const thumbWrap = document.createElement('div');\r\n    thumbWrap.className = 'tcg-gap-filler__thumb-wrap tcg-gap-filler__thumb-wrap--preview';\r\n    thumbWrap.setAttribute('role', 'button');\r\n    thumbWrap.tabIndex = 0;\r\n    thumbWrap.setAttribute('aria-label', `${slot.name} vergr\u00F6\u00DFert anzeigen`);\r\n    thumbWrap.addEventListener('mousedown', (event) => {\r\n      if (event.target.closest('.tcg-gap-filler__card-cart-fab')) return;\r\n      event.preventDefault();\r\n    });\r\n\r\n    if (slot.imageUrl) {\r\n      const thumb = document.createElement('img');\r\n      thumb.className = 'tcg-gap-filler__thumb';\r\n      thumb.src = slot.imageUrl;\r\n      thumb.alt = buildGapImageAlt(slot);\r\n      thumb.loading = 'lazy';\r\n      thumb.width = 200;\r\n      thumb.height = 280;\r\n      thumb.addEventListener('error', () => {\r\n        thumb.remove();\r\n        if (!thumbWrap.querySelector('.tcg-gap-filler__thumb-placeholder')) {\r\n          thumbWrap.prepend(createThumbPlaceholder(slot));\r\n        }\r\n      });\r\n      thumbWrap.append(thumb);\r\n    } else {\r\n      thumbWrap.append(createThumbPlaceholder(slot));\r\n    }\r\n\r\n    if (shopAvailable) {\r\n      const fab = document.createElement('button');\r\n      fab.type = 'button';\r\n      fab.className = 'tcg-gap-filler__card-cart-fab';\r\n      fab.setAttribute('aria-label', `${slot.name} in den Warenkorb`);\r\n      fab.title = 'In den Warenkorb';\r\n      fab.innerHTML =\r\n        '<span class=\"tcg-gap-filler__card-cart-fab-icon\" aria-hidden=\"true\"></span>';\r\n      const applyFabState = () => {\r\n        const vid = getSlotVariantId(slot);\r\n        fab.disabled = !vid;\r\n        fab.classList.toggle('is-ready', Boolean(vid));\r\n        fab.classList.toggle('is-loading', variantIndexStatus === 'pending' && !vid);\r\n      };\r\n      applyFabState();\r\n      fab.addEventListener('click', async (event) => {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        const vid = getSlotVariantId(slot);\r\n        if (!vid) return;\r\n        fab.disabled = true;\r\n        const added = await addItemsToCart([{ id: Number(vid), quantity: 1 }], {\r\n          successMessage: `\u201E${slot.name}\u201C wurde in den Warenkorb gelegt.`,\r\n          reserveSlots: [slot],\r\n        });\r\n        if (added === true || added === 'already') markSlotSelectedInSidebar(slot, item);\r\n        applyFabState();\r\n      });\r\n      item._cartFab = fab;\r\n      item._applyFabState = applyFabState;\r\n      thumbWrap.append(fab);\r\n    }\r\n\r\n    const openPreviewFromThumb = (event) => {\r\n      if (event.target.closest('.tcg-gap-filler__card-cart-fab')) return;\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      openSlotProductModal(slot, item, shopAvailable, thumbWrap);\r\n    };\r\n    thumbWrap.addEventListener('click', openPreviewFromThumb);\r\n    thumbWrap.addEventListener('keydown', (event) => {\r\n      if (event.key !== 'Enter' && event.key !== ' ') return;\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      openSlotProductModal(slot, item, shopAvailable, thumbWrap);\r\n    });\r\n\r\n    item.append(thumbWrap);\r\n  };\r\n\r\n  const mergeStockIntoSlots = (rows, apiPayload) => {\r\n    const map = new Map();\r\n    (apiPayload?.cards || []).forEach((card) => {\r\n      (card.variants || []).forEach((variant) => {\r\n        map.set(`${normalizeNumber(card.number)}|${variant.key}`, variant);\r\n      });\r\n    });\r\n    return rows.map((slot) => {\r\n      const hit = map.get(`${normalizeNumber(slot.number)}|${slot.variantKey}`);\r\n      if (!hit) return slot;\r\n      const stockState = resolveVariantStock(hit);\r\n      return {\r\n        ...slot,\r\n        imageUrl: hit.image_url || slot.imageUrl,\r\n        in_stock: stockState.in_stock,\r\n        listing: stockState.listing,\r\n      };\r\n    });\r\n  };\r\n\r\n  /** Overlay snapshot/API stock and append checklist slots missing from Cockpit (e.g. holo rare). */\r\n  const applyStockPayload = (rows, stockPayload, setHandle) => {\r\n    if (!stockPayload?.cards?.length) return rows;\r\n\r\n    let merged = mergeStockIntoSlots(rows, stockPayload);\r\n    const handle = String(setHandle || stockPayload.handle || currentSetHandle)\r\n      .trim()\r\n      .toLowerCase();\r\n    const existing = new Set(\r\n      merged.map((slot) => `${normalizeNumber(slot.number)}|${slot.variantKey}`)\r\n    );\r\n    const wishApi = getWish();\r\n    const extras = [];\r\n\r\n    (stockPayload.cards || []).forEach((card) => {\r\n      (card.variants || []).forEach((variant) => {\r\n        const mapKey = `${normalizeNumber(card.number)}|${variant.key}`;\r\n        if (existing.has(mapKey)) return;\r\n        const stockState = resolveVariantStock(variant);\r\n        if (!stockState.in_stock) return;\r\n\r\n        const slotId = wishApi\r\n          ? wishApi.buildSlotId(handle, card.number, variant.key)\r\n          : `${handle}|${card.number}|${variant.key}`;\r\n\r\n        extras.push({\r\n          slotId,\r\n          number: card.number,\r\n          name: card.name,\r\n          variantKey: variant.key,\r\n          variantLabel: variant.label || variant.key,\r\n          setName: setNameForHandle(handle),\r\n          imageUrl: variant.image_url || card.image_url || null,\r\n          in_stock: true,\r\n          listing: stockState.listing,\r\n          selected: false,\r\n          wishlisted: wishApi ? wishApi.isWishlisted(slotId) : false,\r\n        });\r\n        existing.add(mapKey);\r\n      });\r\n    });\r\n\r\n    if (!extras.length) return merged;\r\n    merged = [...merged, ...extras];\r\n    merged.sort((a, b) =>\r\n      a.number.localeCompare(b.number, undefined, { numeric: true })\r\n    );\r\n    return merged;\r\n  };\r\n\r\n  /** @type {Map<string, Map<string, string>>} */\r\n  const englishCardNamesByHandle = new Map();\r\n\r\n  const rememberEnglishCardNames = (keys, enData) => {\r\n    if (!enData) return;\r\n    const official = Number(enData?.cardCount?.official) || 1;\r\n    const names = new Map();\r\n    (enData.cards || []).forEach((card) => {\r\n      const name = String(card?.name || '').trim();\r\n      const localId = String(card?.localId || '').trim();\r\n      if (!name || !localId) return;\r\n      const number = normalizeNumber(formatCardNumber(localId, official));\r\n      names.set(number, name);\r\n      const left = number.split('/')[0];\r\n      if (left) names.set(left, name);\r\n    });\r\n    keys.forEach((key) => {\r\n      const id = String(key || '').trim().toLowerCase();\r\n      if (id) englishCardNamesByHandle.set(id, names);\r\n    });\r\n  };\r\n\r\n  const applyEnglishCardNames = (rows, handle) => {\r\n    if (catalogLanguage !== 'en') return rows;\r\n    const names =\r\n      englishCardNamesByHandle.get(String(handle || '').trim().toLowerCase()) ||\r\n      englishCardNamesByHandle.get(String(currentSetHandle || '').trim().toLowerCase());\r\n    if (!names?.size) return rows;\r\n    return rows.map((slot) => {\r\n      const number = normalizeNumber(slot.number);\r\n      const englishName = names.get(number) || names.get(number.split('/')[0]);\r\n      if (!englishName) return slot;\r\n      return { ...slot, name: englishName };\r\n    });\r\n  };\r\n\r\n  const buildEnImageLookup = (enData) => {\r\n    const lookup = new Map();\r\n    (enData?.cards || []).forEach((card) => {\r\n      if (!card.image) return;\r\n      if (card.id) lookup.set(card.id, card.image);\r\n      if (card.localId != null) lookup.set(String(card.localId), card.image);\r\n    });\r\n    return lookup;\r\n  };\r\n\r\n  const resolveImageBase = (card, enLookup) => {\r\n    if (card.image) return card.image;\r\n    if (card.id && enLookup.has(card.id)) return enLookup.get(card.id);\r\n    const localId = card.localId != null ? String(card.localId) : '';\r\n    if (localId && enLookup.has(localId)) return enLookup.get(localId);\r\n    return '';\r\n  };\r\n\r\n  const toImageUrl = (imageBase) => (imageBase ? `${imageBase}/high.webp` : null);\r\n\r\n  const buildPayloadFromTcgdex = async (tcgdexId) => {\r\n    const [deRes, enRes] = await Promise.all([\r\n      fetchWithTimeout(`${TCGDEX_API_DE}/sets/${tcgdexId}`, {}, 10000),\r\n      fetchWithTimeout(`${TCGDEX_API_EN}/sets/${tcgdexId}`, {}, 10000),\r\n    ]);\r\n    if (!deRes.ok) throw new Error(`TCGdex-Katalog nicht erreichbar (${deRes.status}).`);\r\n    const data = await deRes.json();\r\n    const enData = enRes.ok ? await enRes.json() : null;\r\n    rememberEnglishCardNames([tcgdexId], enData);\r\n    const enLookup = enData ? buildEnImageLookup(enData) : new Map();\r\n    const official = Number(data?.cardCount?.official) || 1;\r\n    const cards = (data.cards || []).map((card) => {\r\n      const localId = String(card.localId || '');\r\n      const number = formatCardNumber(localId, official);\r\n      const image_url = toImageUrl(resolveImageBase(card, enLookup));\r\n      const variants = variantsFromTcgdexCard(card, card.name, localId, official).map((v) => ({\r\n        key: v.key,\r\n        label: v.label,\r\n        image_url,\r\n        in_stock: false,\r\n        listing: null,\r\n      }));\r\n      return {\r\n        number,\r\n        name: card.name,\r\n        image_url,\r\n        variants,\r\n      };\r\n    });\r\n    cards.sort((a, b) => a.number.localeCompare(b.number, undefined, { numeric: true }));\r\n    return {\r\n      handle: tcgdexId,\r\n      name: data.name,\r\n      official_total: official,\r\n      cards,\r\n    };\r\n  };\r\n\r\n  const fetchInventorySnapshot = async () => {\r\n    if (!inventorySnapshotAsset) return null;\r\n    if (inventorySnapshotCache) return inventorySnapshotCache;\r\n    try {\r\n      // Strip theme ?v= from cached HTML so we always load the latest pushed asset.\r\n      const snapshotBase = inventorySnapshotAsset.split('?')[0];\r\n      const res = await fetchWithTimeout(`${snapshotBase}?_cb=${Date.now()}`, { cache: 'no-cache' }, 8000);\r\n      if (!res.ok) return null;\r\n      inventorySnapshotCache = await res.json();\r\n      return inventorySnapshotCache;\r\n    } catch {\r\n      return null;\r\n    }\r\n  };\r\n\r\n  const stockFromSnapshot = async (handle) => {\r\n    const snap = await fetchInventorySnapshot();\r\n    const payload = snap?.by_handle?.[handle];\r\n    if (!payload?.cards?.length) return null;\r\n    return payload;\r\n  };\r\n\r\n  /** Prefer a German-named set with the most in-stock cards from the inventory snapshot. */\r\n  const pickBestStockedSetHandle = async (sets) => {\r\n    const snap = await fetchInventorySnapshot();\r\n    const byHandle = snap?.by_handle || {};\r\n    let best = null;\r\n    (sets || []).forEach((set) => {\r\n      const handle = String(set?.handle || '')\r\n        .trim()\r\n        .toLowerCase();\r\n      if (!handle) return;\r\n      const entry = byHandle[handle];\r\n      const count = Number(entry?.in_stock_count) || 0;\r\n      if (count <= 0) return;\r\n      const name = String(entry?.name || set?.name || '');\r\n      const looksEnglishOnly =\r\n        /\\b(Perfect Order|Obsidian Flames|Surging Sparks)\\b/i.test(name) &&\r\n        !/[\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00DF]/.test(name) &&\r\n        !/\\(/.test(name);\r\n      if (looksEnglishOnly) return;\r\n      if (!best || count > best.count) best = { handle, count };\r\n    });\r\n    if (best?.handle) return best.handle;\r\n    if (sets?.some((s) => String(s.handle).toLowerCase() === defaultSet)) return defaultSet;\r\n    return sets?.[0]?.handle || defaultSet;\r\n  };\r\n\r\n  const fetchCockpitGapFiller = async (handle) => {\r\n    if (!apiBase) return null;\r\n    try {\r\n      const res = await fetchWithTimeout(`${apiBase}/sets/${encodeURIComponent(handle)}/gap-filler`);\r\n      if (res.ok) return res.json();\r\n      console.warn(\r\n        `[L\u00FCckenf\u00FCller] Cockpit API ${res.status} f\u00FCr Set \u201E${handle}\u201C. Nutze Theme-Snapshot falls vorhanden.`\r\n      );\r\n    } catch (error) {\r\n      console.warn('[L\u00FCckenf\u00FCller] Cockpit API nicht erreichbar:', error);\r\n    }\r\n    return null;\r\n  };\r\n\r\n  const fetchStockPayload = async (handle) => {\r\n    const apiPayload = await fetchCockpitGapFiller(handle);\r\n    if (apiPayload) return apiPayload;\r\n    const snapshotPayload = await stockFromSnapshot(handle);\r\n    if (snapshotPayload) return snapshotPayload;\r\n    if (!apiBase && !inventorySnapshotAsset) {\r\n      console.warn(\r\n        '[L\u00FCckenf\u00FCller] Keine Cockpit API URL und kein Bestand-Snapshot. API URL setzen und Sync ausf\u00FChren.'\r\n      );\r\n    }\r\n    return null;\r\n  };\r\n\r\n  const populateSetSelect = (sets, { updateLabel = true } = {}) => {\r\n    if (!setSelect) return defaultSet;\r\n    const shopSets = (sets || []).filter((set) => !isPocketSet(set));\r\n    const previous = setSelect.value;\r\n    setSelect.replaceChildren();\r\n    shopSets.forEach((set) => {\r\n      const option = document.createElement('option');\r\n      option.value = set.handle;\r\n      option.textContent = withGrundsetLabel(set.name || set.handle, set.handle);\r\n      setSelect.append(option);\r\n    });\r\n    let nextHandle = previous;\r\n    if (!previous || !shopSets.some((s) => s.handle === previous)) {\r\n      if (shopSets.some((s) => s.handle === defaultSet)) {\r\n        nextHandle = defaultSet;\r\n      } else if (shopSets.length) {\r\n        nextHandle = shopSets[0].handle;\r\n      }\r\n    }\r\n    setSelect.value = nextHandle;\r\n    if (updateLabel) updateSetPickerLabel(nextHandle, { commitHandle: false });\r\n    renderSetPickerList(setSearchInput?.value || '');\r\n    return nextHandle;\r\n  };\r\n\r\n  const normalizeSetSeries = (rawSeries) => {\r\n    const value = String(rawSeries || '').trim();\r\n    if (!value) return 'Weitere Sets';\r\n    if (value.includes('Pocket') || value.includes('Sammelkartenspiel')) return 'Pok\u00E9mon Pocket';\r\n    if (value.includes('Karmesin')) return 'Karmesin & Purpur';\r\n    if (value.includes('Schwert')) return 'Schwert & Schild';\r\n    if (value.includes('Sonne')) return 'Sonne & Mond';\r\n    if (value.includes('Mega')) return 'Mega-Entwicklung';\r\n    if (value.includes('XY')) return 'XY';\r\n    return value;\r\n  };\r\n\r\n  const MEGA_HANDLES = new Set(['meg', 'mee', 'mep', 'pbl', 'pfl', 'por', 'cri', 'asc']);\r\n  const SV_HANDLES = new Set([\r\n    'svi',\r\n    'pal',\r\n    'obf',\r\n    'mew',\r\n    'par',\r\n    'paf',\r\n    'tef',\r\n    'twm',\r\n    'sfa',\r\n    'scr',\r\n    'ssp',\r\n    'pre',\r\n    'jtg',\r\n    'dri',\r\n    'wht',\r\n    'blk',\r\n  ]);\r\n\r\n  const seriesForSet = (set, germanName) => {\r\n    const handle = String(set?.handle || '').toLowerCase();\r\n    const tcg = String(set?.tcgdex_id || '').trim().toLowerCase();\r\n    if (MEGA_HANDLES.has(handle) || /^me\\d/.test(tcg) || tcg === 'mee' || tcg === 'mep') {\r\n      return 'Mega-Entwicklung';\r\n    }\r\n    if (SV_HANDLES.has(handle) || tcg.startsWith('sv')) {\r\n      return 'Karmesin & Purpur';\r\n    }\r\n    if (tcg.startsWith('swsh') || tcg.startsWith('cel')) return 'Schwert & Schild';\r\n    if (tcg.startsWith('sm') || tcg.startsWith('det')) return 'Sonne & Mond';\r\n    if (tcg.startsWith('xy') || tcg.startsWith('g1')) return 'XY';\r\n    if (/pocket|sammelkartenspiel/i.test(germanName) || /^[ab]\\d/i.test(tcg)) {\r\n      return 'Pok\u00E9mon Pocket';\r\n    }\r\n    const parenMatch = germanName.match(/\\(([^)]+)\\)\\s*$/);\r\n    if (parenMatch) return normalizeSetSeries(parenMatch[1]);\r\n    if (/mega/i.test(germanName)) return 'Mega-Entwicklung';\r\n    if (/karmesin/i.test(germanName)) return 'Karmesin & Purpur';\r\n    return 'Weitere Sets';\r\n  };\r\n\r\n  const parseSetEntry = (set) => {\r\n    const germanName = withGrundsetLabel(String(set?.name || set?.handle || '').trim(), set?.handle);\r\n    const parenMatch = germanName.match(/\\(([^)]+)\\)\\s*$/);\r\n    const series = seriesForSet(set, germanName);\r\n    const germanShort = parenMatch ? germanName.replace(/\\s*\\([^)]+\\)\\s*$/, '').trim() : germanName;\r\n    const englishName = englishNameForSet(set);\r\n    const showEnglish = catalogLanguage === 'en' && Boolean(englishName);\r\n    const name = showEnglish ? englishName : germanName;\r\n    const shortName = showEnglish ? englishName : germanShort;\r\n    return {\r\n      handle: set.handle,\r\n      name,\r\n      shortName,\r\n      series,\r\n      setCode: String(set.set_code || '').trim().toUpperCase(),\r\n      searchText: [germanName, germanShort, englishName, series, set.set_code, set.handle, set.tcgdex_id]\r\n        .filter(Boolean)\r\n        .join(' ')\r\n        .toLowerCase(),\r\n    };\r\n  };\r\n\r\n  const loadRecentSetHandles = () => {\r\n    try {\r\n      const raw = localStorage.getItem(RECENT_SETS_KEY);\r\n      const parsed = raw ? JSON.parse(raw) : [];\r\n      return Array.isArray(parsed) ? parsed.map(String).filter(Boolean).slice(0, MAX_RECENT_SETS) : [];\r\n    } catch {\r\n      return [];\r\n    }\r\n  };\r\n\r\n  const rememberRecentSet = (handle) => {\r\n    if (!handle) return;\r\n    const recent = loadRecentSetHandles().filter((entry) => entry !== handle);\r\n    recent.unshift(handle);\r\n    localStorage.setItem(RECENT_SETS_KEY, JSON.stringify(recent.slice(0, MAX_RECENT_SETS)));\r\n  };\r\n\r\n  const updateSetPickerLabel = (handle, { commitHandle = false } = {}) => {\r\n    const resolved = String(handle || '').trim().toLowerCase();\r\n    if (commitHandle && resolved) {\r\n      currentSetHandle = resolved;\r\n      setResolved = true;\r\n      syncFillRestLink();\r\n    }\r\n    const meta = setsCache.find((s) => s.handle === resolved);\r\n    const parsed = meta ? parseSetEntry(meta) : null;\r\n    const label =\r\n      !setResolved || !resolved\r\n        ? 'Set wird geladen \u2026'\r\n        : parsed?.shortName || parsed?.name || meta?.name || resolved || 'Set w\u00E4hlen';\r\n    if (setTriggerLabel) setTriggerLabel.textContent = label;\r\n    if (setSelect && resolved) setSelect.value = resolved;\r\n    syncSetHeading();\r\n  };\r\n\r\n  const closeSetPicker = () => {\r\n    if (!setDropdown || !setTrigger) return;\r\n    setDropdown.hidden = true;\r\n    setTrigger.setAttribute('aria-expanded', 'false');\r\n    setPickerHighlightIndex = -1;\r\n    if (setSearchInput) setSearchInput.value = '';\r\n  };\r\n\r\n  const openSetPicker = () => {\r\n    if (!setDropdown || !setTrigger || !setList) return;\r\n    renderSetPickerList('');\r\n    setDropdown.hidden = false;\r\n    setTrigger.setAttribute('aria-expanded', 'true');\r\n    setPickerHighlightIndex = setPickerOptionsFlat.findIndex(\r\n      (entry) => entry.handle === currentSetHandle\r\n    );\r\n    window.setTimeout(() => setSearchInput?.focus(), 0);\r\n  };\r\n\r\n  const renderSetPickerList = (query) => {\r\n    if (!setList) return;\r\n    const q = String(query || '').trim().toLowerCase();\r\n    const recentHandles = new Set(loadRecentSetHandles());\r\n    const entries = setsCache.map(parseSetEntry);\r\n    const filtered = q\r\n      ? entries.filter((entry) => entry.searchText.includes(q))\r\n      : entries;\r\n\r\n    const grouped = new Map();\r\n    SET_SERIES_ORDER.forEach((series) => grouped.set(series, []));\r\n\r\n    // Recent sets: pin to top of their series (no separate duplicate row).\r\n    const recentOrder = !q ? [...recentHandles] : [];\r\n\r\n    filtered.forEach((entry) => {\r\n      const bucket = grouped.has(entry.series) ? entry.series : 'Weitere Sets';\r\n      const seriesItems = grouped.get(bucket);\r\n      if (!seriesItems.some((item) => item.handle === entry.handle)) {\r\n        seriesItems.push(entry);\r\n      }\r\n    });\r\n\r\n    recentOrder.forEach((handle) => {\r\n      for (const [, items] of grouped) {\r\n        const idx = items.findIndex((item) => item.handle === handle);\r\n        if (idx > 0) {\r\n          const [hit] = items.splice(idx, 1);\r\n          items.unshift(hit);\r\n        }\r\n      }\r\n    });\r\n\r\n    setList.replaceChildren();\r\n    setPickerOptionsFlat = [];\r\n\r\n    if (!filtered.length) {\r\n      const empty = document.createElement('p');\r\n      empty.className = 'tcg-gap-filler__set-empty';\r\n      empty.textContent = 'Kein Set gefunden.';\r\n      setList.append(empty);\r\n      return;\r\n    }\r\n\r\n    const sections = q\r\n      ? [{ label: 'Suchergebnisse', items: filtered }]\r\n      : SET_SERIES_ORDER.map((label) => ({ label, items: grouped.get(label) || [] })).filter(\r\n          (section) => section.items.length\r\n        );\r\n\r\n    sections.forEach((section) => {\r\n      if (!section.items.length) return;\r\n      const heading = document.createElement('p');\r\n      heading.className = 'tcg-gap-filler__set-group-label';\r\n      heading.textContent = section.label;\r\n      setList.append(heading);\r\n\r\n      section.items.forEach((entry) => {\r\n        const btn = document.createElement('button');\r\n        btn.type = 'button';\r\n        btn.className = 'tcg-gap-filler__set-option';\r\n        btn.dataset.setHandle = entry.handle;\r\n        btn.setAttribute('role', 'option');\r\n        btn.setAttribute('aria-selected', entry.handle === currentSetHandle ? 'true' : 'false');\r\n        if (entry.handle === currentSetHandle) btn.classList.add('is-selected');\r\n\r\n        const name = document.createElement('span');\r\n        name.className = 'tcg-gap-filler__set-option-name';\r\n        name.textContent = entry.shortName || entry.name;\r\n\r\n        btn.append(name);\r\n        if (entry.setCode) {\r\n          const code = document.createElement('span');\r\n          code.className = 'tcg-gap-filler__set-option-code';\r\n          code.textContent = entry.setCode;\r\n          btn.append(code);\r\n        }\r\n\r\n        btn.addEventListener('click', () => {\r\n          chooseSet(entry.handle);\r\n        });\r\n\r\n        setList.append(btn);\r\n        setPickerOptionsFlat.push(entry);\r\n      });\r\n    });\r\n\r\n    highlightSetPickerOption(setPickerHighlightIndex);\r\n  };\r\n\r\n  const highlightSetPickerOption = (index) => {\r\n    if (!setList) return;\r\n    const buttons = [...setList.querySelectorAll('.tcg-gap-filler__set-option')];\r\n    buttons.forEach((btn, idx) => {\r\n      btn.classList.toggle('is-highlighted', idx === index);\r\n    });\r\n    const active = buttons[index];\r\n    if (active) active.scrollIntoView({ block: 'nearest' });\r\n  };\r\n\r\n  const chooseSet = (handle) => {\r\n    if (!handle || handle === currentSetHandle) {\r\n      closeSetPicker();\r\n      return;\r\n    }\r\n    rememberRecentSet(handle);\r\n    closeSetPicker();\r\n    if (setSelect) setSelect.value = handle;\r\n    updateSetPickerLabel(handle, { commitHandle: true });\r\n    // Keep URL ?set= in sync so fill-rest / share links stay correct.\r\n    try {\r\n      const url = new URL(window.location.href);\r\n      url.searchParams.set('set', handle);\r\n      window.history.replaceState({}, '', url);\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n    loadSet(handle).catch((error) => {\r\n      slots = [];\r\n      showFeedback(error.message, 'error');\r\n      render();\r\n    });\r\n  };\r\n\r\n  const initSetPicker = () => {\r\n    setTrigger?.addEventListener('click', (event) => {\r\n      event.stopPropagation();\r\n      const expanded = setTrigger.getAttribute('aria-expanded') === 'true';\r\n      if (expanded) closeSetPicker();\r\n      else openSetPicker();\r\n    });\r\n\r\n    setDropdown?.addEventListener('click', (event) => {\r\n      event.stopPropagation();\r\n    });\r\n\r\n    setSearchInput?.addEventListener('input', () => {\r\n      setPickerHighlightIndex = -1;\r\n      renderSetPickerList(setSearchInput.value);\r\n    });\r\n\r\n    setSearchInput?.addEventListener('keydown', (event) => {\r\n      if (event.key === 'ArrowDown') {\r\n        event.preventDefault();\r\n        setPickerHighlightIndex = Math.min(\r\n          setPickerHighlightIndex + 1,\r\n          setPickerOptionsFlat.length - 1\r\n        );\r\n        highlightSetPickerOption(setPickerHighlightIndex);\r\n      } else if (event.key === 'ArrowUp') {\r\n        event.preventDefault();\r\n        setPickerHighlightIndex = Math.max(setPickerHighlightIndex - 1, 0);\r\n        highlightSetPickerOption(setPickerHighlightIndex);\r\n      } else if (event.key === 'Enter') {\r\n        event.preventDefault();\r\n        const entry = setPickerOptionsFlat[setPickerHighlightIndex];\r\n        if (entry) chooseSet(entry.handle);\r\n      } else if (event.key === 'Escape') {\r\n        event.preventDefault();\r\n        closeSetPicker();\r\n        setTrigger?.focus();\r\n      }\r\n    });\r\n\r\n    document.addEventListener('click', (event) => {\r\n      if (!(event.target instanceof Node)) return;\r\n      if (!setPicker?.contains(event.target)) closeSetPicker();\r\n    });\r\n\r\n    document.addEventListener('keydown', (event) => {\r\n      if (event.key !== 'Escape') return;\r\n      if (setDropdown && !setDropdown.hidden) {\r\n        closeSetPicker();\r\n        setTrigger?.focus();\r\n      }\r\n    });\r\n  };\r\n\r\n  const loadSetCatalog = async () => {\r\n    let apiSets = [];\r\n    let themeSets = [];\r\n    if (apiBase) {\r\n      try {\r\n        const res = await fetchWithTimeout(`${apiBase}/sets`);\r\n        if (res.ok) {\r\n          const payload = await res.json();\r\n          apiSets = Array.isArray(payload) ? payload : payload.sets || [];\r\n        }\r\n      } catch {\r\n        /* theme index fills gaps / offline */\r\n      }\r\n    }\r\n    if (setsIndexAsset) {\r\n      try {\r\n        const res = await fetch(setsIndexAsset);\r\n        if (res.ok) {\r\n          const data = await res.json();\r\n          themeSets = data.sets || [];\r\n        }\r\n      } catch {\r\n        /* ignore */\r\n      }\r\n    }\r\n    // API covers most handles; theme index adds new sets (e.g. pbl) and German names / totals.\r\n    const byHandle = new Map();\r\n    apiSets.forEach((set) => {\r\n      const handle = String(set?.handle || '')\r\n        .trim()\r\n        .toLowerCase();\r\n      if (handle) byHandle.set(handle, set);\r\n    });\r\n    themeSets.forEach((set) => {\r\n      const handle = String(set?.handle || '')\r\n        .trim()\r\n        .toLowerCase();\r\n      if (!handle) return;\r\n      const existing = byHandle.get(handle);\r\n      if (!existing) {\r\n        byHandle.set(handle, set);\r\n        return;\r\n      }\r\n      byHandle.set(handle, {\r\n        ...existing,\r\n        name: set.name || existing.name,\r\n        total_cards: set.total_cards || existing.total_cards || existing.total_cards,\r\n        tcgdex_id: existing.tcgdex_id || set.tcgdex_id,\r\n        set_code: existing.set_code || set.set_code,\r\n      });\r\n    });\r\n    const merged = [...byHandle.values()];\r\n    if (merged.length) return merged;\r\n    if (!apiSets.length && !themeSets.length) {\r\n      throw new Error('Set-Index konnte nicht geladen werden.');\r\n    }\r\n    return [{ handle: defaultSet, name: 'Obsidian Flammen', tcgdex_id: 'sv03' }];\r\n  };\r\n\r\n  const loadSet = async (handle) => {\r\n    const resolved = resolveSetHandle(handle) || handle;\r\n    currentSetHandle = resolved;\r\n    setResolved = true;\r\n    currentSetOfficialTotal = resolveOfficialSetTotal(resolved);\r\n    showLoading('Set wird geladen \u2026');\r\n    rememberRecentSet(resolved);\r\n    syncFillRestLink();\r\n    updateSetPickerLabel(resolved, { commitHandle: true });\r\n    try {\r\n      const meta = setsCache.find((s) => s.handle === resolved);\r\n      // Prefer theme/meta tcgdex id; aliases like pbl \u2192 me05 when API has no payload.\r\n      const tcgdexId =\r\n        String(meta?.tcgdex_id || '').trim() ||\r\n        (resolved === 'pbl' || SET_HANDLE_ALIASES[resolved] === 'pbl' ? 'me05' : '');\r\n      let stockPayload = null;\r\n      try {\r\n        stockPayload = await stockFromSnapshot(resolved);\r\n      } catch (error) {\r\n        console.warn('[L\u00FCckenf\u00FCller] Snapshot:', error);\r\n      }\r\n      let newSlots = null;\r\n      let imagePayload = null;\r\n      let payloadOfficial = 0;\r\n\r\n      let cockpitPayload = null;\r\n      try {\r\n        cockpitPayload = await fetchCockpitGapFiller(resolved);\r\n      } catch (error) {\r\n        console.warn('[L\u00FCckenf\u00FCller] Cockpit gap-filler:', error);\r\n      }\r\n\r\n      if (cockpitPayload?.cards?.length) {\r\n        newSlots = flattenFromPayload(cockpitPayload, resolved);\r\n        imagePayload = cockpitPayload;\r\n        payloadOfficial = Number(cockpitPayload.official_total || cockpitPayload.total_cards) || 0;\r\n        if (tcgdexId) {\r\n          try {\r\n            const tcgPayload = await buildPayloadFromTcgdex(tcgdexId);\r\n            payloadOfficial = payloadOfficial || Number(tcgPayload.official_total) || 0;\r\n            const cachedNames = englishCardNamesByHandle.get(String(tcgdexId).trim().toLowerCase());\r\n            if (cachedNames) englishCardNamesByHandle.set(String(resolved).trim().toLowerCase(), cachedNames);\r\n            imagePayload = mergeImagePayloads(imagePayload, tcgPayload);\r\n            if (newSlots.some((s) => !s.imageUrl)) {\r\n              newSlots = mergeImagesIntoSlots(newSlots, tcgPayload);\r\n            }\r\n          } catch (error) {\r\n            console.warn('[L\u00FCckenf\u00FCller] TCGdex-Bilder-Fallback:', error);\r\n          }\r\n        }\r\n        if (stockPayload) {\r\n          newSlots = applyStockPayload(newSlots, stockPayload, resolved);\r\n        }\r\n      } else if (tcgdexId || meta?.tcgdex_id) {\r\n        const id = tcgdexId || meta.tcgdex_id;\r\n        let tcgError = null;\r\n        for (let attempt = 0; attempt < 2 && !newSlots?.length; attempt += 1) {\r\n          try {\r\n            const tcgPayload = await buildPayloadFromTcgdex(id);\r\n            payloadOfficial = Number(tcgPayload.official_total) || 0;\r\n            const cachedNames = englishCardNamesByHandle.get(String(id).trim().toLowerCase());\r\n            if (cachedNames) {\r\n              englishCardNamesByHandle.set(String(resolved).trim().toLowerCase(), cachedNames);\r\n            }\r\n            newSlots = flattenFromPayload(tcgPayload, resolved);\r\n            imagePayload = tcgPayload;\r\n            let fallbackStock = stockPayload;\r\n            if (!fallbackStock) {\r\n              try {\r\n                fallbackStock = await fetchStockPayload(resolved);\r\n              } catch (error) {\r\n                console.warn('[L\u00FCckenf\u00FCller] Stock-Fallback:', error);\r\n              }\r\n            }\r\n            if (fallbackStock) {\r\n              newSlots = applyStockPayload(newSlots, fallbackStock, resolved);\r\n            }\r\n          } catch (error) {\r\n            tcgError = error;\r\n            console.warn(`[L\u00FCckenf\u00FCller] TCGdex-Fallback Versuch ${attempt + 1}:`, error);\r\n          }\r\n        }\r\n        if (!newSlots?.length && tcgError) {\r\n          console.warn('[L\u00FCckenf\u00FCller] TCGdex-Fallback fehlgeschlagen:', tcgError);\r\n        }\r\n      } else if (resolved === 'obf' && checklistAsset) {\r\n        const checklistRes = await fetchWithTimeout(checklistAsset, {}, 8000);\r\n        if (!checklistRes.ok) throw new Error('Set-Checkliste nicht verf\u00FCgbar.');\r\n        const checklistPayload = await checklistRes.json();\r\n        newSlots = flattenFromPayload(checklistPayload, resolved);\r\n        imagePayload = checklistPayload;\r\n        const fallbackStock = stockPayload || (await fetchStockPayload(resolved).catch(() => null));\r\n        if (fallbackStock) newSlots = applyStockPayload(newSlots, fallbackStock, resolved);\r\n      }\r\n\r\n      // Last resort: build checklist rows from live shop listings for this handle.\r\n      if (!newSlots?.length) {\r\n        await ensureVariantIndex();\r\n        if (storefrontByHandleSlot.size) {\r\n          const fromShop = [];\r\n          storefrontByHandleSlot.forEach((listing, slotKey) => {\r\n            const [slotHandle, num, finish] = slotKey.split('|');\r\n            if (slotHandle !== resolved) return;\r\n            const wishApi = getWish();\r\n            const slotId = wishApi\r\n              ? wishApi.buildSlotId(resolved, num, finish)\r\n              : `${resolved}|${num}|${finish}`;\r\n            fromShop.push({\r\n              slotId,\r\n              number: num,\r\n              name: String(listing.title || '').split('\u2013')[0].trim() || listing.title || num,\r\n              variantKey: normalizeVariantKey(finish),\r\n              variantLabel:\r\n                finish === 'reverse' ? 'Reverse Holo' : finish === 'holo' ? 'Holo' : 'Normal',\r\n              setName: setNameForHandle(resolved),\r\n              imageUrl: null,\r\n              in_stock: true,\r\n              listing,\r\n              selected: false,\r\n              wishlisted: wishApi ? wishApi.isWishlisted(slotId) : false,\r\n            });\r\n          });\r\n          if (fromShop.length) {\r\n            fromShop.sort((a, b) =>\r\n              a.number.localeCompare(b.number, undefined, { numeric: true })\r\n            );\r\n            newSlots = fromShop;\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!newSlots?.length) {\r\n        throw new Error(\r\n          `Set \u201E${meta?.name || resolved}\u201C konnte nicht geladen werden. Bitte sp\u00E4ter erneut versuchen.`\r\n        );\r\n      }\r\n\r\n      currentSetOfficialTotal = resolveOfficialSetTotal(resolved, payloadOfficial);\r\n      rememberImagePayload(resolved, imagePayload);\r\n      slotsBeforeLive = newSlots;\r\n      // Ensure shop index is applied before first paint when possible.\r\n      try {\r\n        await ensureVariantIndex();\r\n      } catch {\r\n        /* index errors already logged */\r\n      }\r\n      slots = refreshSlotsForLanguage();\r\n      if (searchInput) searchInput.value = '';\r\n      resetFilters();\r\n      if (feedback) feedback.hidden = true;\r\n      clearLoading();\r\n      render();\r\n      await syncMarkingsFromShopifyCart();\r\n      grid?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n    } catch (error) {\r\n      clearLoading();\r\n      slots = [];\r\n      slotsBeforeLive = [];\r\n      if (kpiSet) kpiSet.textContent = String(currentSetOfficialTotal || '\u2013');\r\n      if (kpiStock) kpiStock.textContent = '\u2013';\r\n      if (zeroStockNotice) zeroStockNotice.hidden = true;\r\n      throw error;\r\n    }\r\n  };\r\n\r\n  root.querySelector('[data-gap-clear-wishlist]')?.addEventListener('click', (event) => {\r\n    event.preventDefault();\r\n    void handleClearSetWishlist();\r\n  });\r\n\r\n  root.querySelector('[data-gap-clear-wishlist-drawer]')?.addEventListener('click', (event) => {\r\n    event.preventDefault();\r\n    void handleClearSetWishlist();\r\n  });\r\n\r\n  searchInput?.addEventListener('input', () => render());\r\n\r\n  filterVariantGroup?.addEventListener('click', (event) => {\r\n    const chip = event.target.closest('[data-variant-filter]');\r\n    if (!chip) return;\r\n    const key = chip.dataset.variantFilter;\r\n    if (key === 'all') {\r\n      resetFilters();\r\n      render();\r\n      return;\r\n    }\r\n\r\n    filterVariantGroup.querySelector('[data-variant-filter=\"all\"]')?.classList.remove('is-active');\r\n    filterVariantGroup\r\n      .querySelector('[data-variant-filter=\"all\"]')\r\n      ?.setAttribute('aria-pressed', 'false');\r\n\r\n    chip.classList.toggle('is-active');\r\n    const active = chip.classList.contains('is-active');\r\n    chip.setAttribute('aria-pressed', active ? 'true' : 'false');\r\n    if (active) {\r\n      variantFilters.add(key);\r\n    } else {\r\n      variantFilters.delete(key);\r\n    }\r\n    if (variantFilters.size === 0) {\r\n      const allChip = filterVariantGroup.querySelector('[data-variant-filter=\"all\"]');\r\n      allChip?.classList.add('is-active');\r\n      allChip?.setAttribute('aria-pressed', 'true');\r\n    }\r\n    render();\r\n  });\r\n\r\n  filterStockInput?.addEventListener('change', () => render());\r\n\r\n  filterWishlistInput?.addEventListener('change', () => render());\r\n\r\n  viewCartBtn?.addEventListener('click', openCartSelectionDrawer);\r\n\r\n  cartDrawer?.querySelectorAll('[data-gap-cart-close]').forEach((btn) => {\r\n    btn.addEventListener('click', closeCartSelectionDrawer);\r\n  });\r\n\r\n  viewWishlistBtn?.addEventListener('click', openWishlistDrawer);\r\n\r\n  wishlistDrawer?.querySelectorAll('[data-gap-wishlist-close]').forEach((btn) => {\r\n    btn.addEventListener('click', closeWishlistDrawer);\r\n  });\r\n\r\n  wishlistDrawerInquiryBtn?.addEventListener('click', () => {\r\n    closeWishlistDrawer();\r\n    window.TcgGapWishlistInquiry?.open();\r\n  });\r\n\r\n  document.addEventListener('keydown', (event) => {\r\n    if (event.key !== 'Escape') return;\r\n    if (cartDrawer && !cartDrawer.hidden) {\r\n      closeCartSelectionDrawer();\r\n      return;\r\n    }\r\n    if (wishlistDrawer && !wishlistDrawer.hidden) {\r\n      closeWishlistDrawer();\r\n    }\r\n  });\r\n\r\n  document.addEventListener('cart:refresh', () => {\r\n    void syncMarkingsFromShopifyCart();\r\n  });\r\n\r\n  if (typeof subscribe === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\r\n    subscribe(PUB_SUB_EVENTS.cartUpdate, (event) => {\r\n      if (event?.source !== 'product-form') return;\r\n      void syncMarkingsFromShopifyCart();\r\n      updateStats();\r\n      const variantId = event?.productVariantId != null ? String(event.productVariantId) : '';\r\n      if (!variantId) return;\r\n      const slot = slots.find((entry) => getSlotVariantId(entry) === variantId);\r\n      if (!slot) return;\r\n      markSlotSelectedInSidebar(slot, findCardElForSlot(slot));\r\n    });\r\n  }\r\n\r\n  initLegendDismiss();\r\n  initSetPicker();\r\n\r\n  const readInitialCatalogLanguage = () => {\r\n    const fromUrl = new URLSearchParams(window.location.search).get('lang');\r\n    if (fromUrl === 'en' || fromUrl === 'de') return fromUrl;\r\n    try {\r\n      const stored = sessionStorage.getItem('kl24_gap_language');\r\n      if (stored === 'en' || stored === 'de') return stored;\r\n    } catch {\r\n      /* ignore private mode */\r\n    }\r\n    return 'de';\r\n  };\r\n\r\n  catalogLanguage = readInitialCatalogLanguage();\r\n  syncLanguageControls();\r\n  syncFillRestLink();\r\n  syncSetHeading();\r\n\r\n  root.querySelector('[data-gap-language]')?.addEventListener('click', (event) => {\r\n    const button = event.target.closest('[data-gap-language-value]');\r\n    if (!button) return;\r\n    const next = button.dataset.gapLanguageValue === 'en' ? 'en' : 'de';\r\n    if (next === catalogLanguage) return;\r\n    const url = new URL(window.location.href);\r\n    if (next === 'en') url.searchParams.set('lang', 'en');\r\n    else url.searchParams.delete('lang');\r\n    window.history.replaceState({}, '', url);\r\n    void activateCatalogLanguage(next);\r\n  });\r\n\r\n  (async () => {\r\n    try {\r\n      // First visit: German catalog unless URL/session explicitly asks for English.\r\n      if (!new URLSearchParams(window.location.search).get('lang')) {\r\n        try {\r\n          const stored = sessionStorage.getItem('kl24_gap_language');\r\n          if (stored !== 'en' && stored !== 'de') {\r\n            sessionStorage.setItem('kl24_gap_language', 'de');\r\n            catalogLanguage = 'de';\r\n            syncLanguageControls();\r\n          }\r\n        } catch {\r\n          /* ignore */\r\n        }\r\n      }\r\n      const englishNamesPromise = catalogLanguage === 'en' ? fetchEnglishSetNames() : null;\r\n      const allSets = await loadSetCatalog();\r\n      setsCache = (allSets || []).filter((set) => !isPocketSet(set));\r\n      if (englishNamesPromise) await englishNamesPromise;\r\n      const preferredRaw = resolveInitialSetHandle();\r\n      const preferredHandle = preferredRaw ? resolveSetHandle(preferredRaw, setsCache) : '';\r\n      let initialHandle = populateSetSelect(setsCache, { updateLabel: false });\r\n      if (preferredHandle && setsCache.some((s) => s.handle === preferredHandle)) {\r\n        initialHandle = preferredHandle;\r\n      } else if (!preferredHandle) {\r\n        initialHandle = await pickBestStockedSetHandle(setsCache);\r\n      }\r\n      if (initialHandle) {\r\n        if (setSelect) setSelect.value = initialHandle;\r\n        updateSetPickerLabel(initialHandle, { commitHandle: true });\r\n        renderSetPickerList(setSearchInput?.value || '');\r\n        // Reflect resolved set in the URL when opened without ?set=\r\n        if (!preferredRaw) {\r\n          try {\r\n            const url = new URL(window.location.href);\r\n            url.searchParams.set('set', initialHandle);\r\n            window.history.replaceState({}, '', url);\r\n          } catch {\r\n            /* ignore */\r\n          }\r\n        }\r\n      }\r\n      const variantIndexPromise = ensureVariantIndex();\r\n      // Prefer having the shop index ready before the first set paint (stock match).\r\n      await Promise.race([\r\n        variantIndexPromise,\r\n        new Promise((resolve) => window.setTimeout(resolve, 12000)),\r\n      ]);\r\n      await loadSet(initialHandle || preferredHandle || defaultSet);\r\n      await variantIndexPromise;\r\n      if (slotsBeforeLive.length) {\r\n        slots = refreshSlotsForLanguage();\r\n      }\r\n      await syncMarkingsFromShopifyCart();\r\n      clearLoading();\r\n      root.classList.remove('is-hydrating');\r\n      root.classList.add('is-ready');\r\n      render();\r\n    } catch (error) {\r\n      clearLoading();\r\n      root.classList.remove('is-hydrating');\r\n      root.classList.add('is-ready');\r\n      showFeedback(error.message, 'error');\r\n      render();\r\n    }\r\n  })();\r\n})();\r\n"],
  "mappings": "CAAC,IAAM,CACL,MAAM,KAAO,SAAS,cAAc,uBAAuB,EAC3D,GAAI,CAAC,KAAM,OAEX,KAAK,UAAU,IAAI,cAAc,EAEjC,MAAM,SAAW,IAAM,CACrB,MAAM,KAAO,KAAK,QAAQ,SAAW,IAAI,QAAQ,MAAO,EAAE,EAC1D,OAAI,KAAO,sBAAsB,KAAK,OAAO,SAAS,QAAQ,GAAK,IAAI,SAAS,SAAS,GACvF,QAAQ,KAAK,oEAA8D,EACpE,IAEF,GACT,GAAG,EAEG,iBAAmB,MAAO,IAAK,QAAU,CAAC,EAAG,UAAY,MAAS,CACtE,MAAM,WAAa,IAAI,gBACjB,UAAY,OAAO,WAAW,IAAM,WAAW,MAAM,EAAG,SAAS,EACvE,GAAI,CACF,OAAO,MAAM,MAAM,IAAK,CAAE,GAAG,QAAS,OAAQ,WAAW,MAAO,CAAC,CACnE,QAAE,CACA,OAAO,aAAa,SAAS,CAC/B,CACF,EACM,WAAa,KAAK,QAAQ,YAAc,MAE9C,IAAI,YAAc,GAElB,MAAM,mBAAqB,CACzB,IAAK,MACL,YAAa,MACb,cAAe,MACf,WAAY,MACZ,IAAK,MACL,KAAM,MACN,IAAK,MACL,gBAAiB,MACjB,mBAAoB,MACpB,KAAM,MACN,IAAK,KACP,EAEM,YAAe,KAAQ,CAC3B,MAAM,KAAO,OAAO,KAAK,MAAQ,EAAE,EAC7B,OAAS,OAAO,KAAK,QAAU,EAAE,EACvC,MAAO,4DAA4D,KAAK,GAAG,IAAI,IAAI,MAAM,EAAE,CAC7F,EAEM,iBAAmB,CAAC,IAAK,KAAO,YAAc,CAClD,MAAM,IAAM,OAAO,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EACjD,GAAI,CAAC,IAAK,MAAO,GACjB,MAAM,QAAU,mBAAmB,GAAG,GAAK,IAC3C,GAAI,MAAM,KAAM,GAAM,OAAO,EAAE,MAAM,EAAE,YAAY,IAAM,OAAO,EAAG,OAAO,QAC1E,MAAM,OAAS,MAAM,KAClB,GAAM,OAAO,EAAE,UAAY,EAAE,EAAE,KAAK,EAAE,YAAY,IAAM,SAAW,OAAO,EAAE,UAAY,EAAE,EAAE,KAAK,EAAE,YAAY,IAAM,GACxH,EACA,GAAI,OAAQ,OAAO,OAAO,OAC1B,MAAM,MAAQ,MAAM,KACjB,GAAM,OAAO,EAAE,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,IAAM,SAAW,OAAO,EAAE,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,IAAM,GAC1H,EACA,GAAI,MAAO,OAAO,MAAM,OACxB,MAAM,OAAS,MAAM,KAAM,GAAM,CAC/B,MAAM,KAAO,OAAO,EAAE,MAAQ,EAAE,EAAE,YAAY,EAC9C,OAAO,KAAK,WAAW,GAAG,GAAK,KAAK,SAAS,IAAI,GAAG,EAAE,GAAK,KAAK,SAAS,OAAO,CAClF,CAAC,EACD,OAAI,OAAe,OAAO,OACnB,OACT,EAEM,wBAA0B,IAAM,CACpC,MAAM,QAAU,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,KAAK,EAErE,OADmB,OAAO,SAAW,EAAE,EAAE,KAAK,EAAE,YAAY,GACvC,EACvB,EACM,eAAiB,KAAK,QAAQ,gBAAkB,GAChD,eAAiB,KAAK,QAAQ,WAAa,GAC3C,uBAAyB,KAAK,QAAQ,mBAAqB,GAEjE,IAAI,uBAAyB,KAEzB,qBAAuB,KAEvB,sBAAwB,GAC5B,MAAM,KAAO,KAAK,cAAc,iBAAiB,EAC3C,MAAQ,KAAK,cAAc,kBAAkB,EAC7C,SAAW,KAAK,cAAc,qBAAqB,EACnD,UAAY,KAAK,cAAc,uBAAuB,EACtD,UAAY,KAAK,cAAc,uBAAuB,EACtD,WAAa,KAAK,cAAc,wBAAwB,EACxD,gBAAkB,KAAK,cAAc,8BAA8B,EACnE,YAAc,KAAK,cAAc,yBAAyB,EAC1D,eAAiB,KAAK,cAAc,uBAAuB,EAC3D,QAAU,KAAK,cAAc,qBAAqB,EAClD,YAAc,KAAK,cAAc,mBAAmB,EACpD,mBAAqB,KAAK,cAAc,4BAA4B,EACpE,iBAAmB,KAAK,cAAc,yBAAyB,EAC/D,oBAAsB,KAAK,cAAc,4BAA4B,EACrE,YAAc,KAAK,cAAc,yBAAyB,EAC1D,oBAAsB,KAAK,cAAc,kCAAkC,EAC3E,WAAa,KAAK,QAAQ,YAAc,cACxC,OAAS,KAAK,cAAc,oBAAoB,EAChD,SAAW,KAAK,cAAc,sBAAsB,EACpD,eAAiB,KAAK,cAAc,6BAA6B,EACjE,WAAa,KAAK,cAAc,wBAAwB,EACxD,WAAa,KAAK,cAAc,mBAAmB,EACnD,iBAAmB,KAAK,cAAc,2BAA2B,EACjE,gBAAkB,KAAK,cAAc,uBAAuB,EAC5D,uBAAyB,iBAAiB,aAAa,KAAK,GAAK,GACjE,gBAAkB,KAAK,cAAc,8BAA8B,EACnE,YAAc,KAAK,cAAc,sBAAsB,EACvD,WAAa,KAAK,cAAc,wBAAwB,EACxD,eAAiB,KAAK,cAAc,6BAA6B,EACjE,kBAAoB,KAAK,cAAc,gCAAgC,EAC7E,GAAI,WAAY,CACd,WAAW,UAAU,IAAI,2BAA2B,EACpD,MAAM,UAAY,WAAW,cAAc,6BAA6B,EACpE,YACF,UAAU,aAAa,OAAQ,eAAe,EAC9C,UAAU,gBAAgB,YAAY,GAExC,OAAO,wBAAwB,KAAK,UAAU,EAC9C,OAAO,kBAAkB,kBAAkB,UAAU,CACvD,CACA,MAAM,gBAAkB,KAAK,cAAc,8BAA8B,EACnE,gBAAkB,KAAK,cAAc,0BAA0B,EAC/D,eAAiB,KAAK,cAAc,4BAA4B,EAChE,mBAAqB,KAAK,cAAc,iCAAiC,EACzE,sBAAwB,KAAK,cAAc,oCAAoC,EAC/E,yBAA2B,KAAK,cAAc,oCAAoC,EAClF,UAAY,KAAK,QAAQ,WAAa,GACtC,eAAiB,KAAK,cAAc,6BAA6B,EACjE,iBAAmB,KACtB,UAAY,SAAS,eAAe,qBAAqB,SAAS,EAAE,EAAI,OACzE,SAAS,cAAc,2CAA2C,EAC9D,gBAAkB,KAAK,cAAc,yBAAyB,EAC9D,iBAAmB,KAAK,cAAc,+BAA+B,EACrE,gBAAkB,KAAK,cAAc,8BAA8B,EACnE,gBAAkB,KAAK,cAAc,8BAA8B,EACnE,uBAAyB,KAAK,cAAc,qCAAqC,EACjF,qBAAuB,KAAK,iBAChC,kEACF,EAEM,mBAAqB,2BACrB,gBAAkB,sBAClB,gBAAkB,EAClB,iBAAmB,CACvB,qBACA,mBACA,oBACA,oBACA,mBACA,eACA,KACA,cACF,EAGM,oBAAsB,CAC1B,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,GACL,IAAK,IACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,IACL,IAAK,GACP,EAGA,IAAI,wBAA0B,EAE1B,wBAA0B,GAC1B,qBAAuB,CAAC,EAE5B,MAAM,kBAAoB,IAAM,CACzB,aACD,aAAa,QAAQ,kBAAkB,IAAM,KAC/C,WAAW,UAAU,IAAI,cAAc,EAEzC,kBAAkB,iBAAiB,QAAS,IAAM,CAChD,aAAa,QAAQ,mBAAoB,GAAG,EAC5C,WAAW,UAAU,IAAI,cAAc,CACzC,CAAC,EACH,EAGM,qBAAwB,KAAQ,CACpC,MAAM,EAAI,OAAO,KAAO,EAAE,EAAE,KAAK,EACjC,GAAI,CAAC,GAAK,EAAE,SAAS,IAAI,EAAG,OAAO,EACnC,MAAM,IAAM,EAAE,QAAQ,KAAK,EAC3B,GAAI,KAAO,EAAG,OAAO,EACrB,MAAM,OAAS,EAAE,MAAM,EAAG,GAAG,EAAE,KAAK,EAC9B,IAAM,EAAE,MAAM,IAAM,CAAC,EAAE,KAAK,EAClC,MAAI,CAAC,QAAU,CAAC,IAAY,EACrB,GAAG,GAAG,KAAK,MAAM,GAC1B,EAEM,kBAAoB,CAAC,KAAM,SAAW,CAC1C,MAAM,UAAY,qBAAqB,IAAI,EACrC,EAAI,OAAO,QAAU,EAAE,EAAE,YAAY,EAE3C,GADI,IAAM,OAAS,IAAM,OACrB,YAAY,KAAK,SAAS,EAAG,OAAO,UACxC,MAAM,KAAO,UAAU,QAAQ,gBAAiB,EAAE,EAAE,KAAK,EACzD,OAAO,KAAO,GAAG,IAAI,YAAc,SACrC,EAEM,sBAAwB,IAAM,CAClC,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,gBAAgB,EAChE,GAAI,CAAC,KAAM,OAAO,kBAAkB,iBAAkB,gBAAgB,EACtE,GAAI,kBAAoB,KAAM,CAC5B,MAAM,YAAc,kBAAkB,IAAI,EAC1C,GAAI,YAAa,OAAO,kBAAkB,YAAa,gBAAgB,CACzE,CACA,OAAO,kBAAkB,KAAK,MAAQ,iBAAkB,gBAAgB,CAC1E,EAEM,eAAiB,IAAM,CAC3B,GAAI,CAAC,WAAY,OAEjB,GADgB,KAAK,QAAQ,UAAY,KAAO,CAAC,aAAe,CAAC,iBACpD,CACX,WAAW,YAAc,0BACrB,iBACF,eAAe,OAAS,GACxB,eAAe,gBAAgB,QAAQ,GAEzC,MACF,CACA,MAAM,KAAO,sBAAsB,EACrB,UAAU,KAAM,GAAM,EAAE,SAAW,gBAAgB,GACpD,MACX,WAAW,YAAc,KACrB,iBACF,eAAe,OAAS,GACxB,eAAe,gBAAgB,QAAQ,KAGzC,WAAW,YAAc,GACrB,iBACF,eAAe,OAAS,GACxB,eAAe,aAAa,SAAU,EAAE,GAG9C,EAEM,cAAgB,+BAChB,cAAgB,+BAEtB,IAAI,gBAAkB,IAAI,IAEtB,uBAAyB,KAE7B,MAAM,qBAAuB,IACvB,gBAAgB,KAAa,QAAQ,QAAQ,eAAe,GAC3D,yBACH,wBAA0B,SAAY,CACpC,GAAI,CACF,MAAM,IAAM,MAAM,MAAM,GAAG,aAAa,OAAO,EAC/C,GAAI,CAAC,IAAI,GAAI,OAAO,gBACpB,MAAM,KAAO,MAAM,IAAI,KAAK,EACtB,IAAM,IAAI,KACf,MAAM,QAAQ,IAAI,EAAI,KAAO,CAAC,GAAG,QAAS,KAAQ,CACjD,MAAM,GAAK,OAAO,KAAK,IAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAC9C,KAAO,OAAO,KAAK,MAAQ,EAAE,EAAE,KAAK,EACtC,IAAM,MAAM,IAAI,IAAI,GAAI,IAAI,CAClC,CAAC,EACD,gBAAkB,GACpB,OAAS,MAAO,CACd,QAAQ,KAAK,4CAAuC,KAAK,EACzD,uBAAyB,IAC3B,CACA,OAAO,eACT,GAAG,GAEE,wBAGH,kBAAqB,KAAQ,CACjC,MAAM,GAAK,OAAO,KAAK,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EAC3D,OAAK,IACE,gBAAgB,IAAI,EAAE,GAAK,EACpC,EAEA,IAAI,UAAY,CAAC,EAEb,MAAQ,CAAC,EAET,eAAiB,IAAI,IAErB,iBAAmB,GACvB,MAAM,QAAU,IAAM,OAAO,gBAAkB,KACzC,kBAAoB,KAAK,QAAQ,kBAAoB,cAE3D,IAAI,aAAe,IAAI,IAEnB,mBAAqB,IAAI,IAEzB,qBAAuB,IAAI,IAE3B,qBAAuB,IAAI,IAE3B,gBAAkB,KAElB,gBAAkB,CAAC,EAEnB,oBAAsB,IAAI,IAE1B,uBAAyB,IAAI,IAE7B,eAAiB,IAAI,IAErB,eAAiB,IAAI,IAErB,yBAA2B,IAAI,IAE/B,uBAAyB,IAAI,IAE7B,eAAiB,IAAI,IAErB,eAAiB,IAAI,IAErB,mBAAqB,UAErB,wBAA0B,KAE9B,MAAM,mBAAqB,KACpB,0BACH,wBAA0B,2BAA2B,GAEhD,yBAGH,OAAS,gCACT,QAAU,2BAEV,sBAAyB,KAAQ,CACrC,MAAM,IAAM,OAAO,KAAO,EAAE,EAAE,KAAK,EACnC,OAAK,IACD,IAAI,SAAS,iBAAiB,EAAU,IAAI,MAAM,GAAG,EAAE,IAAI,GAAK,KAChE,QAAQ,KAAK,GAAG,EAAU,IACvB,KAHU,IAInB,EAEM,aAAe,CAAC,QAAS,aAAe,CAC5C,MAAM,IAAM,OAAO,SAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAC/C,IAAM,gBAAgB,UAAU,EACtC,OAAO,KAAO,IAAM,GAAG,GAAG,IAAI,GAAG,GAAK,EACxC,EAGM,oBAAsB,CAAC,IAAK,OAAQ,UAAW,SAAW,CAC9D,GAAI,CAAC,UAAU,SAAS,GAAG,EAAG,CAC5B,IAAI,IAAI,GAAG,MAAM,GAAG,UAAU,YAAY,CAAC,GAAI,MAAM,EACrD,MAAM,MAAQ,OAAO,SAAS,UAAW,EAAE,EACtC,OAAO,MAAM,KAAK,GAAG,IAAI,IAAI,GAAG,MAAM,GAAG,KAAK,GAAI,MAAM,EAC7D,MACF,CACA,KAAM,CAAC,MAAO,QAAQ,EAAI,UAAU,MAAM,GAAG,EAC7C,GAAI,CAAC,OAAS,CAAC,SAAU,OACzB,MAAM,WAAa,OAAO,QAAQ,EAAE,MAAM,kBAAkB,EACtD,MAAQ,WAAa,WAAW,CAAC,EAAI,OAAO,QAAQ,EAAE,QAAQ,MAAO,EAAE,EAC7E,GAAI,CAAC,MAAO,OACZ,MAAM,SAAW,OAAO,SAAS,MAAO,EAAE,EACrC,OAAO,MAAM,QAAQ,GACxB,IAAI,IAAI,GAAG,MAAM,GAAG,QAAQ,KAAK,MAAM,YAAY,CAAC,GAAI,MAAM,EAEhE,IAAI,IAAI,GAAG,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,MAAM,YAAY,CAAC,GAAI,MAAM,CAC3E,EAEM,wBAA0B,IAAM,CACpC,MAAM,IAAM,IAAI,IAChB,iBAAU,QAAS,OAAU,CAC3B,MAAM,OAAS,OAAO,MAAM,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EACvD,KAAO,OAAO,MAAM,UAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EACvD,IAAM,OAAO,MAAM,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EACxD,SACD,MAAM,IAAI,IAAI,KAAM,MAAM,EACzB,MACL,IAAI,IAAI,IAAI,YAAY,EAAG,MAAM,EAC7B,IAAI,WAAW,IAAI,EACrB,oBAAoB,IAAK,KAAM,IAAI,MAAM,CAAC,EAAG,MAAM,EAC1C,IAAI,WAAW,MAAM,EAC9B,oBAAoB,IAAK,OAAQ,IAAI,MAAM,CAAC,EAAG,MAAM,EAC5C,IAAI,WAAW,IAAI,GAAK,MAAQ,OAAS,MAAQ,OAC1D,oBAAoB,IAAK,KAAM,IAAI,MAAM,CAAC,EAAG,MAAM,GAEvD,CAAC,EAED,IAAI,IAAI,SAAU,KAAK,EACvB,IAAI,IAAI,MAAO,KAAK,EACpB,IAAI,IAAI,OAAQ,KAAK,EACd,GACT,EAEM,wBAA2B,SAAY,CAC3C,MAAM,KAAO,IAAI,KAAK,QAAQ,MAAQ,CAAC,GAAG,IAAK,KAAQ,OAAO,GAAG,EAAE,YAAY,CAAC,CAAC,EAC3E,KAAO,OAAO,QAAQ,WAAa,EAAE,EAAE,YAAY,EACnD,MAAQ,OAAO,QAAQ,OAAS,EAAE,EAAE,YAAY,EAChD,SAAW,GAAG,IAAI,IAAI,KAAK,GACjC,OAAI,SAAS,SAAS,cAAc,GAAK,SAAS,SAAS,cAAc,EAAU,UAC/E,KAAK,IAAI,MAAM,GAAK,SAAS,SAAS,UAAU,EAAU,SAC1D,KAAK,IAAI,MAAM,GAAK,KAAK,IAAI,SAAS,GAAK,SAAS,SAAS,MAAM,EAAU,OAC1E,QACT,EAEM,yBAA2B,CAAC,KAAM,QAAU,CAChD,MAAM,EAAI,OAAO,SAAS,KAAM,EAAE,EAElC,MAAO,GADQ,OAAO,MAAM,CAAC,EAAI,OAAO,IAAI,EAAI,OAAO,CAAC,EAAE,SAAS,EAAG,GAAG,CACzD,IAAI,KAAK,EAC3B,EAEM,2BAA6B,CAAC,QAAS,QAAS,KAAO,CAC3D,MAAM,IAAM,OAAO,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EACnD,UAAY,QAAQ,IAAM,KAAO,OAAO,QAAQ,EAAE,EAAI,GACtD,cAAgB,OAAO,QAAQ,QAAU,EAAE,EAAE,KAAK,EAClD,MAAQ,OAAO,WAAW,QAAQ,OAAS,GAAG,EACpD,MAAO,CACL,IACA,MAAO,OAAO,QAAQ,OAAS,GAAG,EAAE,KAAK,EACzC,YAAa,OAAO,SAAS,KAAK,EAAI,KAAK,MAAM,MAAQ,GAAG,EAAI,EAChE,MAAO,QAAQ,UAAY,EAAI,EAC/B,mBAAoB,QAAQ,IAAM,KAAO,yBAAyB,QAAQ,EAAE,GAAK,GACjF,uBAAwB,cACxB,oBAAqB,cAAgB,aAAa,aAAa,GAAK,GACpE,mBAAoB,UAAY,gCAAgC,SAAS,GAAK,GAC9E,2BAA4B,UAC5B,UAAW,OAAO,GAAG,CAAC,GAAK,IAAI,EAAE,YAAY,EAC7C,OAAQ,wBAAwB,OAAO,CACzC,CACF,EAGA,IAAI,iBAAmB,CAAC,EAEpB,oBAAsB,KAE1B,MAAM,wBAA2B,QAAW,CAC1C,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,MAAM,EACtD,GAAI,CAAC,KAAM,MAAO,CAAC,EACnB,MAAM,MAAQ,IAAI,IACZ,KAAO,OAAO,KAAK,UAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EACtD,IAAM,OAAO,KAAK,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EAE5D,GADI,MAAM,MAAM,IAAI,IAAI,EACpB,IAAI,WAAW,IAAI,EAAG,CACxB,MAAM,OAAS,IAAI,MAAM,CAAC,EAC1B,MAAM,IAAI,KAAK,OAAO,YAAY,CAAC,EAAE,EACrC,MAAM,MAAQ,OAAO,SAAS,OAAQ,EAAE,EACnC,OAAO,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,EAAE,CAClD,CACA,GAAI,IAAI,WAAW,MAAM,GAAK,IAAI,SAAS,GAAG,EAAG,CAC/C,MAAM,WAAa,IAAI,MAAM,CAAC,EAC9B,MAAM,IAAI,OAAO,WAAW,QAAQ,IAAK,IAAI,EAAE,YAAY,CAAC,EAAE,CAChE,MAAW,IAAI,WAAW,MAAM,GAC9B,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC,EAAE,EAE/C,GAAI,IAAI,WAAW,IAAI,GAAK,MAAQ,OAAS,MAAQ,MAAO,CAC1D,MAAM,OAAS,IAAI,MAAM,CAAC,EAC1B,GAAI,OAAO,SAAS,GAAG,EAAG,CACxB,KAAM,CAAC,MAAO,KAAK,EAAI,OAAO,MAAM,GAAG,EACvC,GAAI,OAAS,MAAO,CAClB,MAAM,SAAW,OAAO,SAAS,MAAO,EAAE,EACrC,OAAO,MAAM,QAAQ,GAAG,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,YAAY,CAAC,EAAE,EAC9E,MAAM,IAAI,KAAK,MAAM,YAAY,CAAC,KAAK,MAAM,YAAY,CAAC,EAAE,CAC9D,CACF,SAAW,QAAQ,KAAK,MAAM,EAAG,CAC/B,MAAM,MAAQ,OAAO,SAAS,OAAQ,EAAE,EACnC,OAAO,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,EAAE,CAClD,CACF,CACA,MAAO,CAAC,GAAG,KAAK,CAClB,EAEM,wBAA2B,MAAS,CACxC,MAAM,QAAU,MAAM,QACtB,GAAI,QAAS,CACX,MAAM,OAAS,OAAO,QAAQ,4BAA8B,EAAE,EAAE,KAAK,EACrE,GAAI,OAAQ,OAAO,OACnB,MAAM,QAAU,sBAAsB,QAAQ,kBAAkB,EAChE,GAAI,QAAS,OAAO,QACpB,MAAM,IAAM,OAAO,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EACzD,GAAI,KAAO,aAAa,IAAI,GAAG,EAAG,OAAO,aAAa,IAAI,GAAG,EAE7D,MAAM,QAAU,aAAa,KAAK,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAG,KAAK,MAAM,EACpE,GAAI,SAAW,mBAAmB,IAAI,OAAO,EAAG,OAAO,mBAAmB,IAAI,OAAO,EAErF,MAAM,IAAM,IAAI,MAAM,OAAO,EAC7B,GAAI,IAAK,CACP,MAAM,OAAS,aAAa,IAAI,CAAC,EAAG,KAAK,MAAM,EAC/C,GAAI,QAAU,mBAAmB,IAAI,MAAM,EAAG,OAAO,mBAAmB,IAAI,MAAM,CACpF,CACF,CAEA,MAAM,OAAS,OAAO,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAK,gBAAgB,EAAE,KAAK,EAAE,YAAY,EACpF,IAAM,gBAAgB,MAAM,MAAM,EACxC,GAAI,CAAC,IAAK,OAAO,KACjB,UAAW,QAAQ,wBAAwB,MAAM,EAAG,CAClD,MAAM,IAAM,aAAa,KAAM,GAAG,EAClC,GAAI,mBAAmB,IAAI,GAAG,EAAG,OAAO,mBAAmB,IAAI,GAAG,CACpE,CACA,MAAM,UAAY,aAAa,OAAQ,GAAG,EAC1C,OAAI,mBAAmB,IAAI,SAAS,EAAU,mBAAmB,IAAI,SAAS,EACvE,IACT,EAEM,oBAAuB,MAAS,CACpC,MAAM,IAAM,OAAO,MAAM,YAAc,EAAE,EACzC,GAAI,CAAC,IAAK,OAAO,KACjB,MAAM,OAAS,MAAM,KAAM,GAAM,iBAAiB,CAAC,IAAM,GAAG,EAC5D,GAAI,OAAQ,OAAO,OAEnB,MAAM,IAAM,OAAO,KAAK,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAChD,YAAc,IAAI,SAAS,KAAK,EACtC,GAAI,kBAAoB,KAAO,CAAC,YAAc,YAAa,OAAO,KAClE,MAAM,GAAK,IAAI,MAAM,MAAM,EAI3B,GAHI,CAAC,IAEU,wBAAwB,EAAE,IAAI,GAAG,CAAC,EAAE,YAAY,CAAC,IACjD,iBAAkB,OAAO,KAExC,MAAM,IAAM,yBAAyB,GAAG,CAAC,EAAG,GAAG,CAAC,CAAC,EAC3C,WAAa,MAAM,OACtB,GAAM,gBAAgB,EAAE,MAAM,IAAM,gBAAgB,GAAG,CAC1D,EACA,OAAK,WAAW,OACT,WAAW,KAAM,GAAM,iBAAiB,CAAC,IAAM,GAAG,GAAK,WAAW,CAAC,EAD3C,IAEjC,EAEM,sBAAwB,IAAM,CAClC,MAAM,KAAO,IAAI,IACX,OAAS,CAAC,EAChB,wBAAiB,QAAS,MAAS,CACjC,MAAM,KAAO,oBAAoB,IAAI,EACjC,CAAC,MAAQ,KAAK,IAAI,KAAK,MAAM,IACjC,KAAK,IAAI,KAAK,MAAM,EACpB,OAAO,KAAK,IAAI,EAClB,CAAC,EACM,MACT,EAEM,gBAAkB,IACtB,iBAAiB,OAAQ,MAAS,CAAC,oBAAoB,IAAI,CAAC,EAExD,iBAAoB,MAAS,CACjC,MAAM,EAAI,OAAO,MAAM,QAAQ,EAC/B,OAAO,OAAO,SAAS,CAAC,GAAK,EAAI,EAAI,KAAK,MAAM,CAAC,EAAI,CACvD,EAEM,kBAAoB,IACxB,iBAAiB,OAAO,CAAC,IAAK,OAAS,IAAM,iBAAiB,IAAI,EAAG,CAAC,EAElE,yBAA2B,IAC/B,iBAAiB,OAAO,CAAC,IAAK,OACvB,oBAAoB,IAAI,EACtB,IAAM,iBAAiB,IAAI,EADK,IAEtC,CAAC,EAEA,mBAAsB,MAAS,CACnC,MAAM,IAAM,KAAK,kBAAoB,KAAK,YAAc,KAAK,aAAe,KAAK,OAAS,EACpF,EAAI,OAAO,GAAG,EACpB,OAAO,OAAO,SAAS,CAAC,EAAI,KAAK,MAAM,CAAC,EAAI,CAC9C,EAEM,gBAAkB,CAAC,IAAK,UACxB,UAAO,KAAO,EAAE,EAAE,YAAY,EAAE,SAAS,KAAK,IACpC,SAAS,MAAQ,CAAC,GAAG,IAAK,KAAQ,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,EACvE,KAAM,KAAQ,MAAQ,YAAc,MAAQ,WAAa,MAAQ,IAAI,GAC1E,4BAA4B,KAAK,OAAO,SAAS,OAAS,EAAE,CAAC,GAC7D,iCAAiC,KAAK,OAAO,SAAS,WAAa,EAAE,CAAC,GAItE,wBAA0B,IAAM,CACpC,MAAM,OAAS,gBAAgB,IAAK,OAAU,CAAE,GAAG,IAAK,EAAE,EACpD,KACJ,kBAAoB,KAChB,OAAO,IAAK,OAAU,CAAE,GAAG,KAAM,SAAU,GAAO,QAAS,IAAK,EAAE,EAClE,OACA,MAAQ,sBAAsB,KAAM,gBAAgB,EAC1D,OAAO,mBAAmB,yBAAyB,MAAO,gBAAgB,EAAG,gBAAgB,CAC/F,EAEM,qBAAuB,IAAM,CACjC,KAAK,QAAQ,gBAAkB,gBAC/B,KAAK,iBAAiB,2BAA2B,EAAE,QAAS,QAAW,CACrE,MAAM,OAAS,OAAO,QAAQ,mBAAqB,gBACnD,OAAO,UAAU,OAAO,YAAa,MAAM,EAC3C,OAAO,aAAa,eAAgB,OAAS,OAAS,OAAO,CAC/D,CAAC,EACD,MAAM,KAAO,KAAK,cAAc,0BAA0B,EACtD,OAAM,KAAK,OAAS,kBAAoB,MACxC,kBACF,gBAAgB,YACd,kBAAoB,KAChB,0HACA,uBAEV,EAEM,iBAAmB,IAAM,CAC7B,MAAM,KAAO,KAAK,cAAc,sBAAsB,EACtD,GAAI,CAAC,KAAM,OACX,MAAM,OAAS,OAAO,kBAAoB,EAAE,EAAE,KAAK,EAAE,YAAY,EACjE,GAAI,CAAC,QAAU,CAAC,YAAa,CAC3B,KAAK,KAAO,oBACZ,KAAK,aAAa,gBAAiB,MAAM,EACzC,MACF,CACA,MAAM,OAAS,IAAI,gBACnB,OAAO,IAAI,MAAO,MAAM,EACxB,OAAO,IAAI,UAAW,kBAAoB,KAAO,KAAO,IAAI,EAC5D,KAAK,KAAO,qBAAqB,OAAO,SAAS,CAAC,GAClD,KAAK,gBAAgB,eAAe,CACtC,EAEM,wBAA0B,MAAO,KAAM,CAAE,SAAW,EAAK,EAAI,CAAC,IAAM,CACxE,gBAAkB,OAAS,KAAO,KAAO,KACrC,kBAAoB,MAAM,MAAM,qBAAqB,EACzD,mBAAqB,kBAAoB,KAAO,qBAAuB,qBACvE,uBAAyB,kBAAoB,KAAO,eAAiB,eACrE,uBAAyB,kBAAoB,KAAO,eAAiB,eACrE,qBAAqB,EACrB,qBAAqB,gBAAgB,EACjC,aAAe,CAAC,YAAY,QAC9B,oBAAoB,gBAAgB,OAAS,EAAE,EAEjD,GAAI,CACF,eAAe,QAAQ,oBAAqB,eAAe,CAC7D,MAAQ,CAER,CACI,gBAAgB,SAClB,MAAQ,wBAAwB,GAElC,iBAAiB,EACb,WACF,OAAO,EACF,4BAA4B,EAErC,EAEM,2BAA6B,SAAY,CAC7C,mBAAqB,UACrB,MAAM,OAAS,OAAO,SAAS,OACzB,MAAQ,IAAI,IACZ,kBAAoB,IAAI,IACxB,kBAAoB,IAAI,IACxB,aAAe,IAAI,IACnB,mBAAqB,IAAI,IACzB,mBAAqB,IAAI,IACzB,mBAAqB,IAAI,IACzB,mBAAqB,IAAI,IACzB,kBAAoB,IAAI,IACxB,eAAiB,wBAAwB,EAC/C,GAAI,CACF,IAAI,SAAW,CAAC,EAChB,MAAM,QAAU,OAAO,mBACvB,GAAI,SAAS,qBAMX,UALe,MAAM,QAAQ,qBAAqB,CAChD,iBAAkB,kBAClB,SAAU,GACV,UAAW,GACb,CAAC,GACiB,UAAY,CAAC,MAC1B,CACL,IAAI,KAAO,EACX,KAAO,MAAQ,IAAI,CACjB,MAAM,IAAM,GAAG,MAAM,gBAAgB,mBAAmB,iBAAiB,CAAC,iCAAiC,IAAI,GACzG,IAAM,MAAM,MAAM,GAAG,EAC3B,GAAI,CAAC,IAAI,GAAI,MAEb,MAAM,OADO,MAAM,IAAI,KAAK,GACT,UAAY,CAAC,EAGhC,GAFI,CAAC,MAAM,SACX,SAAS,KAAK,GAAG,KAAK,EAClB,MAAM,OAAS,KAAK,MACxB,MAAQ,CACV,CACF,CACI,SAAS,QACX,SAAS,QAAS,SAAY,CAC5B,MAAM,cAAgB,OAAO,QAAQ,QAAU,EAAE,EAAE,KAAK,GACvD,QAAQ,UAAY,CAAC,GAAG,QAAS,SAAY,CAC5C,MAAM,UAAY,QAAQ,IAAM,KAAO,OAAO,QAAQ,EAAE,EAAI,GACtD,IAAM,OAAO,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAGzD,GAFI,WAAa,QAAQ,WAAW,aAAa,IAAI,SAAS,EAC1D,WAAa,eAAe,kBAAkB,IAAI,UAAW,aAAa,EAC1E,CAAC,KAAO,CAAC,UAAW,OAExB,MAAM,IAAI,IAAK,SAAS,EACxB,MAAM,cAAgB,gBAAgB,IAAK,OAAO,EAC5C,YAAc,cAAgB,kBAAoB,kBAClD,aAAe,cAAgB,mBAAqB,mBACpD,aAAe,cAAgB,mBAAqB,mBAEpD,GAAK,IAAI,MAAM,MAAM,EACrB,IAAM,IAAI,MAAM,OAAO,EAC7B,GAAI,GAAI,CACN,MAAM,IAAM,aAAa,GAAG,CAAC,EAAG,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,EAC/C,KAAK,YAAY,IAAI,IAAK,SAAS,EACvC,MAAM,OAAS,eAAe,IAAI,GAAG,CAAC,EAAE,YAAY,CAAC,EACrD,GAAI,OAAQ,CACV,MAAM,QAAU,2BAA2B,QAAS,QAAS,EAAE,EAE/D,GADA,aAAa,IAAI,IAAK,CAAE,UAAW,EAAQ,QAAQ,UAAY,OAAQ,CAAC,EACpE,QAAQ,UAAW,CACrB,MAAM,QAAU,GAAG,MAAM,IAAI,gBAAgB,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,oBAAoB,QAAQ,MAAM,CAAC,GACxG,aAAa,IAAI,QAAS,OAAO,CACnC,CACF,CACF,SAAW,IAAK,CACd,MAAM,IAAM,aAAa,IAAI,CAAC,EAAG,IAAI,CAAC,CAAC,EACnC,KAAK,YAAY,IAAI,IAAK,SAAS,EACvC,MAAM,OAAS,eAAe,IAAI,IAAI,CAAC,EAAE,YAAY,CAAC,EACtD,GAAI,QAAU,QAAQ,UAAW,CAC/B,MAAM,QAAU,2BAA2B,QAAS,QAAS,CAC3D,EAAG,IAAI,CAAC,EACR,EAAG,IAAI,CAAC,EACR,EAAG,EACL,CAAC,EACD,aAAa,IAAI,IAAK,CAAE,UAAW,GAAM,OAAQ,CAAC,EAClD,MAAM,QAAU,GAAG,MAAM,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,oBAAoB,QAAQ,MAAM,CAAC,GAC3F,aAAa,IAAI,QAAS,OAAO,CACnC,CACF,CACF,CAAC,CACH,CAAC,EAEH,aAAe,MACf,qBAAuB,kBACvB,qBAAuB,kBACvB,oBAAsB,aACtB,eAAiB,mBACjB,eAAiB,mBACjB,yBAA2B,kBAC3B,eAAiB,mBACjB,eAAiB,mBACjB,mBAAqB,QACrB,MAAM,wBAAwB,gBAAiB,CAAE,SAAU,EAAM,CAAC,CACpE,OAAS,MAAO,CACd,QAAQ,KAAK,mDAA8C,KAAK,EAChE,mBAAqB,OACvB,CACA,OAAO,CACT,EAEM,oBAAuB,KAAQ,CACnC,MAAM,IAAM,OAAO,KAAO,QAAQ,EAAE,KAAK,EAAE,YAAY,EACvD,MAAI,CAAC,KAAO,MAAQ,YAAc,MAAQ,YAAc,MAAQ,WAAa,MAAQ,OAC5E,SAEL,MAAQ,eAAiB,MAAQ,gBAAkB,MAAQ,KAAa,UACrE,GACT,EAEM,sBAAwB,CAAC,QAAS,aAAe,CACrD,GAAI,CAAC,QAAS,MAAO,GACrB,MAAM,SAAW,QAAQ,iBAAmB,QAAQ,OAAS,EACvD,MAAQ,OAAO,QAAQ,EAC7B,GAAI,CAAC,OAAO,SAAS,KAAK,GAAK,OAAS,EAAG,MAAO,GAClD,MAAM,OAAS,oBAAoB,QAAQ,MAAM,EAC3C,IAAM,oBAAoB,UAAU,EAC1C,MAAO,EAAQ,QAAW,SAAW,GACvC,EAEM,oBAAuB,SAAY,CACvC,MAAM,QAAU,SAAS,SAAW,KAC9B,QAAU,sBAAsB,QAAS,SAAS,GAAG,EAC3D,MAAO,CAAE,SAAU,QAAS,QAAS,QAAU,QAAU,IAAK,CAChE,EAGM,yBAA2B,CAAC,KAAM,YAAc,CACpD,GAAI,qBAAuB,SAAW,uBAAuB,OAAS,EAAG,OAAO,KAEhF,MAAM,OAAS,OAAO,WAAa,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAClE,QAAU,QAAQ,EAClB,SAAW,IAAI,IACnB,KAAK,IAAK,MAAS,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CACzE,EAEM,OAAS,KAAK,IAAK,MAAS,CAChC,MAAM,IAAM,gBAAgB,KAAK,MAAM,EACjC,OAAS,oBAAoB,KAAK,UAAU,EAC5C,QAAU,GAAG,MAAM,IAAI,GAAG,IAAI,MAAM,GAC1C,IAAI,YAAc,uBAAuB,IAAI,OAAO,EAIpD,GAHI,CAAC,aAAe,IAAI,SAAS,GAAG,IAClC,YAAc,uBAAuB,IAAI,GAAG,MAAM,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,GAEjF,YACF,MAAO,CAAE,GAAG,KAAM,WAAY,OAAQ,SAAU,GAAM,QAAS,WAAY,EAG7E,MAAM,IAAM,OAAO,KAAK,SAAS,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EACzD,MAAQ,IAAM,uBAAuB,IAAI,GAAG,EAAI,KACtD,OAAI,OAAO,UACF,CAAE,GAAG,KAAM,WAAY,OAAQ,SAAU,GAAM,QAAS,MAAM,OAAQ,EAE3E,OAAS,CAAC,MAAM,UACX,CAAE,GAAG,KAAM,WAAY,OAAQ,SAAU,GAAO,QAAS,IAAK,EAIhE,CAAE,GAAG,KAAM,WAAY,MAAO,CACvC,CAAC,EAEK,cAAgB,IAAI,IAC1B,OAAO,QAAS,MAAS,CAClB,KAAK,UACV,cAAc,IAAI,gBAAgB,KAAK,MAAM,EAAG,KAAK,QAAQ,CAC/D,CAAC,EAED,MAAM,OAAS,CAAC,EAgChB,GA/BA,uBAAuB,QAAQ,CAAC,QAAS,UAAY,CACnD,KAAM,CAAC,WAAY,IAAK,MAAM,EAAI,QAAQ,MAAM,GAAG,EACnD,GAAI,aAAe,OAAQ,OAC3B,MAAM,OAAS,GAAG,GAAG,IAAI,MAAM,GAC/B,GAAI,SAAS,IAAI,MAAM,EAAG,OAE1B,MAAM,GAAK,OAAO,QAAQ,KAAO,EAAE,EAAE,MAAM,MAAM,EAC3C,cAAgB,GAClB,yBAAyB,GAAG,CAAC,EAAG,GAAG,CAAC,CAAC,EACrC,IACE,OAAS,QACX,QAAQ,YAAY,OAAQ,cAAe,MAAM,EACjD,GAAG,MAAM,IAAI,aAAa,IAAI,MAAM,GAClC,KAAO,OAAO,QAAQ,OAAS,EAAE,EAAE,MAAM,QAAG,EAAE,CAAC,EAAE,KAAK,GAAK,QAAQ,OAAS,GAElF,OAAO,KAAK,CACV,OACA,OAAQ,cACR,KACA,WAAY,OACZ,aAAc,SAAW,UAAY,eAAiB,SAAW,OAAS,OAAS,SACnF,QAAS,iBAAiB,MAAM,EAChC,SAAU,cAAc,IAAI,gBAAgB,aAAa,CAAC,GAAK,KAC/D,SAAU,GACV,QACA,SAAU,GACV,WAAY,QAAU,QAAQ,aAAa,MAAM,EAAI,EACvD,CAAC,EACD,SAAS,IAAI,MAAM,CACrB,CAAC,EAEG,CAAC,OAAO,OAAQ,OAAO,OAC3B,MAAM,SAAW,CAAC,GAAG,OAAQ,GAAG,MAAM,EACtC,gBAAS,KAAK,CAAC,EAAG,IAChB,EAAE,OAAO,cAAc,EAAE,OAAQ,OAAW,CAAE,QAAS,EAAK,CAAC,CAC/D,EACO,QACT,EAEM,gBAAmB,OAAU,CACjC,MAAM,IAAM,OAAO,OAAS,EAAE,EAAE,KAAK,EACrC,GAAI,CAAC,IAAI,SAAS,GAAG,EAAG,OAAO,IAC/B,KAAM,CAAC,KAAM,KAAK,EAAI,IAAI,MAAM,GAAG,EAC7B,EAAI,OAAO,SAAS,KAAM,EAAE,EAClC,MAAO,GAAG,OAAO,MAAM,CAAC,EAAI,KAAO,CAAC,IAAI,KAAK,EAC/C,EAEM,iBAAmB,CAAC,QAAS,WAAa,CAC9C,MAAM,EAAI,OAAO,SAAS,QAAS,EAAE,EAErC,MAAO,GADM,OAAO,MAAM,CAAC,EAAI,OAAO,OAAO,EAAI,OAAO,CAAC,EAAE,SAAS,EAAG,GAAG,CAC5D,IAAI,QAAQ,EAC5B,EAEM,YAAe,OAAU,CAC7B,MAAM,IAAM,OAAO,eACnB,OAAI,IAAY,IAAI,gBAAgB,KAAK,EAClC,OACL,IAAI,KAAK,aAAa,QAAS,CAAE,MAAO,WAAY,SAAU,KAAM,CAAC,EAAE,QACpE,OAAS,GAAK,GACjB,CACF,EAAE,QAAQ,QAAS,YAAS,CAC9B,EAEM,aAAe,CAAC,QAAS,OAAS,CACjC,WACL,SAAS,OAAS,GAClB,SAAS,YAAc,QACvB,SAAS,UAAU,OAAO,WAAY,YAAY,EAClD,SAAS,UAAU,IAAI,OAAS,UAAY,aAAe,UAAU,EACvE,EAEM,eAAiB,CACrB,OAAQ,SACR,QAAS,eACT,KAAM,OACN,aAAc,YAChB,EAEM,kBAAoB,CAAC,KAAM,QAAS,WAAa,CACrD,MAAM,MAAQ,OAAO,MAAQ,EAAE,EAAE,YAAY,EAE7C,OADU,OAAO,SAAS,QAAS,EAAE,GAAK,GAClC,SAAiB,CAAC,CAAE,IAAK,OAAQ,MAAO,MAAO,CAAC,EACpD,SAAS,KAAK,KAAK,GAAK,MAAM,SAAS,KAAK,EACvC,CAAC,CAAE,IAAK,OAAQ,MAAO,MAAO,CAAC,EAEpC,MAAM,SAAS,SAAS,GAAK,MAAM,SAAS,QAAQ,EAC/C,CAAC,CAAE,IAAK,SAAU,MAAO,QAAS,CAAC,EAErC,CACL,CAAE,IAAK,SAAU,MAAO,QAAS,EACjC,CAAE,IAAK,UAAW,MAAO,cAAe,CAC1C,CACF,EAEM,uBAAyB,CAAC,KAAM,KAAM,QAAS,WAAa,CAChE,MAAM,MAAQ,MAAM,SACpB,GAAI,OAAS,OAAO,OAAU,SAAU,CACtC,MAAM,IAAM,CAAC,EAIb,GAHA,OAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAK,KAAK,IAAM,CACnD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAE,IAAK,KAAM,CAAC,CACzC,CAAC,EACG,IAAI,OAAQ,OAAO,GACzB,CACA,OAAO,kBAAkB,KAAM,QAAS,QAAQ,CAClD,EAEM,qBAAuB,CAAC,OAAQ,UAAY,CAC3C,SAAS,OAAO,SACrB,sBAAwB,OAAO,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAChE,qBAAuB,QACzB,EAEM,mBAAqB,CAAC,QAAS,YAAc,CACjD,GAAI,CAAC,WAAW,OAAO,OAAQ,OAAO,QACtC,GAAI,CAAC,SAAS,OAAO,OAAQ,OAAO,UACpC,MAAM,SAAW,IAAI,IACrB,OAAC,QAAQ,OAAS,CAAC,GAAG,QAAS,MAAS,CACtC,SAAS,IAAI,gBAAgB,KAAK,MAAM,EAAG,IAAI,CACjD,CAAC,GACA,UAAU,OAAS,CAAC,GAAG,QAAS,MAAS,CACxC,MAAM,IAAM,gBAAgB,KAAK,MAAM,EACjC,SAAW,SAAS,IAAI,GAAG,EACjC,GAAI,CAAC,SAAU,CACb,SAAS,IAAI,IAAK,IAAI,EACtB,MACF,CACA,MAAM,YAAc,IAAI,KAAK,SAAS,UAAY,CAAC,GAAG,IAAK,GAAM,EAAE,GAAG,CAAC,EACjE,eAAiB,CAAC,GAAI,SAAS,UAAY,CAAC,CAAE,GACnD,KAAK,UAAY,CAAC,GAAG,QAAS,SAAY,CACpC,YAAY,IAAI,QAAQ,GAAG,IAC9B,eAAe,KAAK,OAAO,EAC3B,YAAY,IAAI,QAAQ,GAAG,EAE/B,CAAC,EACD,SAAS,IAAI,IAAK,CAChB,GAAG,SACH,UAAW,SAAS,WAAa,KAAK,UACtC,SAAU,cACZ,CAAC,CACH,CAAC,EACM,CAAE,GAAG,QAAS,MAAO,CAAC,GAAG,SAAS,OAAO,CAAC,CAAE,CACrD,EAEM,+BAAkC,MAAS,CAC/C,MAAM,SAAW,IAAI,IACrB,YAAK,QAAS,MAAS,CACrB,GAAI,CAAC,KAAK,SAAU,OACpB,MAAM,IAAM,gBAAgB,KAAK,MAAM,EAClC,SAAS,IAAI,GAAG,GAAG,SAAS,IAAI,IAAK,KAAK,QAAQ,CACzD,CAAC,EACM,KAAK,IAAK,MAAS,CACxB,GAAI,KAAK,SAAU,OAAO,KAC1B,MAAM,IAAM,SAAS,IAAI,gBAAgB,KAAK,MAAM,CAAC,EACrD,OAAO,IAAM,CAAE,GAAG,KAAM,SAAU,GAAI,EAAI,IAC5C,CAAC,CACH,EAEM,mBAAqB,CAAC,KAAM,YAAc,CAC9C,MAAM,OAAS,OAAO,WAAa,gBAAgB,EAAE,KAAK,EAAE,YAAY,EACxE,IAAI,IAAM,KACV,OAAI,sBAAwB,wBAA0B,SACpD,IAAM,qBAAqB,IAAK,oBAAoB,GAE/C,+BAA+B,GAAG,CAC3C,EAEM,YAAe,SAAY,CAC/B,KAAK,QAAQ,QAAU,IACvB,KAAK,UAAU,IAAI,gBAAgB,EAC/B,QACF,MAAM,OAAS,GACf,MAAM,YAAc,SAAW,2BAEjC,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,gBAAgB,EAC1D,WAAa,OAAO,MAAM,WAAW,GAAK,oBAAoB,gBAAgB,GAAK,EAOzF,GANI,SAAQ,OAAO,YAAc,WAAa,EAAI,OAAO,UAAU,EAAI,UACnE,WAAU,SAAS,YAAc,UACrC,eAAe,EACX,cAAa,YAAY,OAAS,IAClC,sBAAqB,oBAAoB,OAAS,IAClD,kBAAiB,gBAAgB,OAAS,IAC1C,CAAC,KAAM,OACX,KAAK,gBAAgB,EACrB,MAAM,OAAS,SAAS,cAAc,GAAG,EACzC,OAAO,UAAY,0BACnB,OAAO,YAAc,SAAW,0BAChC,KAAK,OAAO,MAAM,EAClB,MAAM,SAAW,SAAS,cAAc,KAAK,EAC7C,SAAS,UAAY,gCACrB,SAAS,aAAa,cAAe,MAAM,EAC3C,QAAS,EAAI,EAAG,EAAI,EAAG,GAAK,EAAG,CAC7B,MAAM,KAAO,SAAS,cAAc,KAAK,EACzC,KAAK,UAAY,gCACjB,SAAS,OAAO,IAAI,CACtB,CACA,KAAK,OAAO,QAAQ,CACtB,EAEM,aAAe,IAAM,CACzB,KAAK,QAAQ,QAAU,IACvB,KAAK,UAAU,OAAO,gBAAgB,CACxC,EAEM,oBAAuB,MACvB,eAAe,OAAS,EAAU,GAC/B,eAAe,IAAI,KAAK,UAAU,EAGrC,aAAe,IAAM,CACzB,IAAI,KAAO,MAAM,OAAO,mBAAmB,EACvC,kBAAkB,UACpB,KAAO,KAAK,OAAQ,GAAM,oBAAoB,CAAC,CAAC,GAE9C,qBAAqB,UACvB,KAAO,KAAK,OAAQ,GAAM,EAAE,UAAU,GAExC,MAAM,GAAK,aAAa,OAAS,IAAI,KAAK,EAAE,YAAY,EACxD,OAAK,EACE,KAAK,OACT,GACC,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,GAC/B,EAAE,OAAO,YAAY,EAAE,SAAS,CAAC,GACjC,EAAE,aAAa,YAAY,EAAE,SAAS,CAAC,CAC3C,EANe,IAOjB,EAEM,aAAe,IAAM,CACzB,eAAiB,IAAI,IACrB,oBAAoB,iBAAiB,uBAAuB,EAAE,QAAS,MAAS,CAC9E,MAAM,MAAQ,KAAK,QAAQ,gBAAkB,MAC7C,KAAK,UAAU,OAAO,YAAa,KAAK,EACxC,KAAK,aAAa,eAAgB,MAAQ,OAAS,OAAO,CAC5D,CAAC,CACH,EAEM,kBAAoB,IAAM,CAC9B,MAAM,YAAc,MAAM,KACvB,GAAM,EAAE,UAAY,OAAO,EAAE,QAAQ,EAAE,SAAS,uBAAuB,CAC1E,EACM,iBAAmB,MAAM,KAAM,GAAM,CAAC,EAAE,QAAQ,EAElD,cACF,YAAY,OAAS,CAAC,aAEpB,sBACF,oBAAoB,OAAS,CAAC,iBAElC,EAEM,oBAAsB,IAC1B,MAAM,OAAQ,GAAM,EAAE,UAAU,EAAE,OAE9B,wBAA0B,IAAM,CACpC,MAAM,QAAU,QAAQ,EACxB,GAAI,CAAC,QAAS,MAAO,GAErB,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,gBAAgB,EAC1D,SAAW,CAAC,gBAAgB,EAC9B,MAAM,WAAW,SAAS,KAAK,KAAK,SAAS,EAC7C,MAAM,UAAU,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE,YAAY,CAAC,EAErE,MAAM,kBAAoB,MAAM,IAAK,MAAS,CAC5C,MAAM,MAAQ,OAAO,KAAK,QAAU,EAAE,EAAE,MAAM,GAAG,EACjD,OAAI,MAAM,OAAS,EAAU,GAEtB,IADiB,QAAQ,sBAAyB,GAAM,IACrC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,EACvE,CAAC,EAED,GAAI,OAAO,QAAQ,eAAkB,WACnC,OAAO,QAAQ,cAAc,CAC3B,QAAS,MAAM,IAAK,GAAM,EAAE,MAAM,EAClC,eAAgB,SAChB,iBACF,CAAC,EAGH,IAAI,QAAU,EACd,gBAAS,QAAS,QAAW,CAC3B,MAAM,OAAS,QAAQ,QAAQ,EAAE,OACjC,QAAQ,YAAY,MAAM,EAC1B,SAAW,OAAS,QAAQ,QAAQ,EAAE,MACxC,CAAC,EACM,OACT,EAEM,uBAAyB,SAAY,CACzC,MAAM,QAAU,QAAQ,EAClB,YAAc,MAAM,OAAQ,GAAM,EAAE,UAAU,EAAE,OACtD,IAAI,QAAU,EAEd,GAAI,CACF,QAAU,wBAAwB,CACpC,OAAS,MAAO,CACd,QAAQ,KAAK,2CAAsC,KAAK,CAC1D,CAEA,MAAM,QAAS,MAAS,CACtB,KAAK,WAAa,EACpB,CAAC,EAEG,qBAAqB,UACvB,oBAAoB,QAAU,IAGhC,OAAO,EAEH,gBAAkB,CAAC,eAAe,SACpC,qBAAqB,EAChB,SAAS,QAAQ,EAAE,QAAQ,oBAAoB,GAGlD,SACG,QAAQ,SAAS,QAAQ,QAAQ,CAAC,EAGzC,MAAM,aAAe,KAAK,IAAI,QAAS,WAAW,EAC5C,QACJ,aAAe,EACX,GAAG,YAAY,4DACf,6DAEN,aAAa,QAAS,aAAe,EAAI,UAAY,OAAO,EAExD,iBACF,gBAAgB,YAAc,QAC9B,gBAAgB,QAAQ,kBAAoB,aAAe,EAAI,UAAY,QAC3E,OAAO,WAAW,IAAM,CACtB,OAAO,gBAAgB,QAAQ,kBAC/B,YAAY,CACd,EAAG,IAAI,GAEP,YAAY,CAEhB,EAEM,iBAAoB,QAAW,CACnC,MAAM,IAAM,UAAU,KAAM,GAAM,EAAE,SAAW,MAAM,EACrD,GAAI,CAAC,IAAK,OAAO,kBAAkB,OAAQ,MAAM,EACjD,GAAI,kBAAoB,KAAM,CAC5B,MAAM,YAAc,kBAAkB,GAAG,EACzC,GAAI,YAAa,OAAO,kBAAkB,YAAa,MAAM,CAC/D,CACA,OAAO,kBAAkB,IAAI,MAAQ,OAAQ,MAAM,CACrD,EAEM,qBAAwB,QAAW,CACvC,MAAM,IAAM,MAAM,KAAM,GAAM,EAAE,SAAW,MAAM,EACjD,GAAI,IACF,MAAO,CACL,OACA,KAAM,IAAI,KACV,OAAQ,IAAI,OACZ,aAAc,IAAI,aAClB,QAAS,iBAAiB,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,CAChD,EAEF,MAAM,MAAQ,OAAO,QAAU,EAAE,EAAE,MAAM,GAAG,EAC5C,OAAI,MAAM,QAAU,EACX,CACL,OACA,KAAM,mBACN,OAAQ,MAAM,CAAC,EACf,aAAc,MAAM,CAAC,EACrB,QAAS,iBAAiB,MAAM,CAAC,CAAC,CACpC,EAEK,CAAE,OAAQ,KAAM,OAAQ,OAAQ,GAAI,aAAc,GAAI,QAAS,EAAG,CAC3E,EAEA,OAAO,iCAAmC,qBAC1C,OAAO,6BAA+B,iBAEtC,MAAM,eAAiB,CAAC,KAAM,KAAM,UAAY,CAC9C,KAAK,WAAa,CAAC,KAAK,WACxB,MAAM,QAAU,QAAQ,EACxB,GAAI,QAAS,CACX,MAAM,WAAa,QAAQ,gBACvB,QAAQ,gBAAgB,KAAK,MAAM,EACnC,KAAK,OACT,GAAI,KAAK,WAAY,CACnB,MAAM,KAAO,QAAQ,QAAQ,EACxB,KAAK,SAAS,UAAU,GAC3B,QAAQ,QAAQ,CAAC,GAAG,KAAM,KAAK,MAAM,CAAC,CAE1C,MACE,QAAQ,QACN,QAAQ,QAAQ,EAAE,OAAQ,KACX,QAAQ,gBAAkB,QAAQ,gBAAgB,EAAE,EAAI,MACrD,UACjB,CACH,CAEJ,CACI,MAAM,KAAK,UAAU,OAAO,gBAAiB,KAAK,UAAU,EAC5D,UACF,QAAQ,UAAU,OAAO,YAAa,KAAK,UAAU,EACrD,QAAQ,aAAa,eAAgB,KAAK,WAAa,OAAS,OAAO,GAEzE,YAAY,CACd,EAEM,sBAAyB,eAAkB,CAC/C,IAAI,WAAa,EACb,OAAS,EACb,qBAAc,QAAS,MAAS,CAC9B,GAAI,CAAC,iBAAiB,IAAI,EAAG,OAC7B,MAAM,MAAQ,KAAK,SAAS,YACxB,OAAS,OACX,YAAc,MACd,QAAU,EAEd,CAAC,EACM,CAAE,WAAY,MAAO,CAC9B,EAEM,iBAAoB,MAAS,wBAAwB,IAAI,EAEzD,kBAAqB,MAAS,CAClC,MAAM,QAAU,MAAM,QAChB,UAAY,OAAO,SAAS,qBAAuB,EAAE,EAAE,KAAK,EAClE,GAAI,UAAW,OAAO,UACtB,MAAM,OAAS,OAAO,SAAS,wBAA0B,EAAE,EAAE,KAAK,EAClE,GAAI,OAAQ,MAAO,aAAa,MAAM,GAEtC,MAAM,UAAY,iBAAiB,IAAI,EACvC,GAAI,WAAa,yBAAyB,IAAI,OAAO,SAAS,CAAC,EAC7D,MAAO,aAAa,yBAAyB,IAAI,OAAO,SAAS,CAAC,CAAC,GAGrE,MAAM,IAAM,OAAO,SAAS,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAC1D,GAAI,KAAO,uBAAuB,IAAI,GAAG,EAAG,CAC1C,MAAM,IAAM,uBAAuB,IAAI,GAAG,EACpC,OAAS,OAAO,KAAK,SAAS,qBAAuB,EAAE,EAAE,KAAK,EACpE,GAAI,OAAQ,OAAO,OACnB,MAAM,UAAY,OAAO,KAAK,SAAS,wBAA0B,EAAE,EAAE,KAAK,EAC1E,GAAI,UAAW,MAAO,aAAa,SAAS,EAC9C,CACA,MAAO,EACT,EAEM,qBAAwB,MAAS,CACrC,MAAM,QAAU,kBAAkB,IAAI,EACtC,GAAI,CAAC,QAAS,MAAO,GACrB,MAAM,UAAY,iBAAiB,IAAI,EACvC,GAAI,CAAC,UAAW,OAAO,QACvB,MAAM,OAAS,QAAQ,SAAS,GAAG,EAAI,IAAM,IAC7C,MAAO,GAAG,OAAO,GAAG,MAAM,WAAW,mBAAmB,SAAS,CAAC,EACpE,EAEM,kBAAqB,MAAS,CAClC,MAAM,QAAU,MAAM,QAEtB,GADI,CAAC,SACD,QAAQ,qBAAuB,QAAQ,uBAAwB,OAAO,KAE1E,MAAM,IAAM,OAAO,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EACnD,MAAQ,IAAM,uBAAuB,IAAI,GAAG,EAAI,KACtD,GAAI,OAAO,SAAS,wBAA0B,OAAO,SAAS,oBAC5D,MAAO,CACL,GAAG,KACH,QAAS,CACP,GAAG,QACH,uBACE,MAAM,QAAQ,wBAA0B,QAAQ,uBAClD,oBAAqB,MAAM,QAAQ,qBAAuB,QAAQ,mBACpE,CACF,EAGF,MAAM,UAAY,iBAAiB,IAAI,EACjC,OAAS,UAAY,yBAAyB,IAAI,OAAO,SAAS,CAAC,EAAI,KAC7E,OAAK,OAEE,CACL,GAAG,KACH,QAAS,CACP,GAAG,QACH,uBAAwB,OACxB,oBAAqB,aAAa,MAAM,EAC1C,CACF,EAToB,IAUtB,EAEM,oBAAuB,MAAS,CACpC,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,QAAS,MAAO,GAC5C,MAAM,IAAM,OAAO,KAAK,QAAQ,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAC9D,GAAI,qBAAuB,SAAW,IAAK,CACzC,MAAM,MAAQ,uBAAuB,IAAI,GAAG,EAC5C,GAAI,MAAO,OAAO,MAAM,SAC1B,CACA,MAAM,UAAY,wBAAwB,IAAI,EAC9C,GAAI,WAAa,qBAAuB,QACtC,OAAO,oBAAoB,IAAI,OAAO,SAAS,CAAC,EAGlD,MAAM,MAAQ,OAAO,KAAK,QAAQ,iBAAmB,KAAK,QAAQ,OAAS,CAAC,EAC5E,OAAI,OAAO,SAAS,KAAK,GAAK,MAAQ,EAAU,GACzC,GACL,KAAK,QAAQ,4BAA8B,KAAK,QAAQ,mBAE5D,EAEM,iBAAoB,MAAS,oBAAoB,IAAI,EAErD,wBAA0B,IAAM,CAEpC,MAAM,IAAM,OAAO,yBACnB,OAAI,KAAK,aAAqB,IAAI,aAAa,EACxC,aAAa,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,EAC7C,EAEM,wBAA0B,CAAC,MAAQ,CAAC,IAAM,CAC9C,MAAM,QAAU,CAAE,OAAQ,mBAAoB,GAAG,KAAM,EACvD,OAAI,QAAQ,SAAS,SAAS,IAC5B,QAAQ,wBAAwB,EAAI,QAE/B,OACT,EAEM,oBAAuB,OAAU,CACrC,GAAI,CAAC,MAAO,MAAO,GACnB,MAAM,KAAO,OAAO,MAAM,MAAQ,EAAE,EAC9B,QAAU,OAAO,MAAM,SAAW,EAAE,EAC1C,OACE,OAAS,cACT,OAAS,aACT,mEAAmE,KAAK,OAAO,CAEnF,EAEM,qBAAuB,MAAO,KAAM,OAAS,CACjD,GAAI,CAAC,QAAS,OAAO,KACrB,MAAM,WAAa,IAAI,gBACjB,UAAY,OAAO,WAAW,IAAM,WAAW,MAAM,EAAG,GAAI,EAClE,GAAI,CACF,MAAM,IAAM,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,GAAI,CAC3C,OAAQ,OACR,QAAS,wBAAwB,CAAE,eAAgB,kBAAmB,CAAC,EACvE,KAAM,KAAK,UAAU,IAAI,EACzB,OAAQ,WAAW,MACrB,CAAC,EACD,GAAI,CAAC,IAAI,GAAI,CACX,MAAM,QAAU,MAAM,IAAI,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,EACjD,MAAM,IAAI,MAAM,QAAQ,QAAU,QAAQ,SAAW,WAAW,IAAI,MAAM,EAAE,CAC9E,CACA,OAAO,IAAI,KAAK,CAClB,OAAS,MAAO,CACd,GAAI,oBAAoB,KAAK,EAAG,CAC9B,MAAM,SAAW,IAAI,MAAM,8BAA8B,EACzD,eAAS,gBAAkB,GACrB,QACR,CACA,MAAM,KACR,QAAE,CACA,OAAO,aAAa,SAAS,CAC/B,CACF,EAEM,qBAAuB,MAAO,KAAM,CAAE,YAAc,EAAM,EAAI,CAAC,IAAM,CACzE,MAAM,IAAM,iBAAiB,IAAI,EAC3B,IAAM,OAAO,KAAK,SAAS,KAAO,EAAE,EAAE,KAAK,EACjD,MAAI,CAAC,SAAY,CAAC,KAAO,CAAC,IAAa,CAAE,GAAI,EAAK,EAC3C,qBAAqB,kCAAmC,CAC7D,WAAY,wBAAwB,EACpC,SAAU,EACV,mBAAoB,KAAO,KAC3B,IAAK,KAAO,KACZ,aAAc,WAChB,CAAC,EAAE,MAAO,OAAU,CAClB,GAAI,OAAO,gBACT,eAAQ,KAAK,kEAA0D,MAAM,OAAO,EAC7E,CAAE,GAAI,GAAM,SAAU,EAAK,EAEpC,MAAM,KACR,CAAC,CACH,EAEM,qBAAuB,MAC3B,KACA,CAAE,YAAc,GAAO,WAAa,EAAM,EAAI,CAAC,IAC5C,CACH,GAAI,CAAC,QAAS,MAAO,CAAE,GAAI,GAAM,SAAU,CAAE,EAC7C,MAAM,IAAM,KAAO,iBAAiB,IAAI,EAAI,KACtC,IAAM,KAAO,OAAO,KAAK,SAAS,KAAO,EAAE,EAAE,KAAK,EAAI,GAC5D,MAAI,CAAC,YAAc,CAAC,KAAO,CAAC,IAAY,CAAE,GAAI,GAAM,SAAU,CAAE,EACzD,qBAAqB,kCAAmC,CAC7D,WAAY,wBAAwB,EACpC,mBAAoB,WAAa,KAAO,KAAO,KAC/C,IAAK,WAAa,KAAO,KAAO,KAChC,YAAa,WACb,aAAc,WAChB,CAAC,CACH,EAEM,qBAAuB,MAAOA,OAAO,CAAE,YAAc,EAAM,EAAI,CAAC,IAAM,CAC1E,UAAW,QAAQA,OACjB,GAAI,CACF,MAAM,qBAAqB,KAAM,CAAE,YAAa,EAAM,CAAC,CACzD,OAAS,MAAO,CACd,QAAQ,KAAK,+CAA0C,KAAK,CAC9D,CAEJ,EAEM,iBAAoB,MACxB,KACG,OAAO,gBAAgB,EACvB,IAAK,IAAO,CAAE,GAAI,OAAO,iBAAiB,CAAC,CAAC,EAAG,SAAU,CAAE,EAAE,EAE5D,sBAAwB,IAAM,CAC7B,yBAAyB,KAAM,CAAE,WAAY,EAAK,CAAC,CAC1D,EAEM,qBAAwB,SAC5B,oFAAoF,KAClF,OAAO,SAAW,EAAE,CACtB,EAEI,kBAAqB,MACzB,KACI,CAAC,GAAG,KAAK,iBAAiB,gBAAgB,CAAC,EAAE,KAAM,MAAS,KAAK,QAAQ,SAAW,KAAK,MAAM,EAC/F,KAEA,oBAAsB,CAAC,KAAM,SAAW,CAC5C,MAAM,GAAK,QAAU,kBAAkB,IAAI,EAC3C,GAAI,CAAC,GAAI,OACT,GAAG,UAAU,IAAI,aAAa,EAC9B,MAAM,GAAK,GAAG,cAAc,2BAA2B,EACnD,KAAI,GAAG,QAAU,GACvB,EAEM,oBAAsB,MAAO,MAAS,CAC1C,MAAM,IAAM,iBAAiB,IAAI,EAGjC,GAFI,CAAC,KAED,CADO,MAAM,gCAAgC,CAAC,GAAG,CAAC,EAC7C,OACT,GAAI,CACF,MAAM,qBAAqB,KAAM,CAAE,YAAa,EAAM,CAAC,CACzD,OAAS,MAAO,CACd,QAAQ,KAAK,iDAA4C,KAAK,CAChE,CACA,KAAK,SAAW,GAChB,MAAM,GAAK,kBAAkB,IAAI,EACjC,GAAI,GAAI,CACN,GAAG,UAAU,OAAO,aAAa,EACjC,MAAM,GAAK,GAAG,cAAc,2BAA2B,EACnD,KAAI,GAAG,QAAU,GACvB,CACA,MAAM,4BAA4B,EAC9B,YAAc,CAAC,WAAW,QAAQ,iBAAiB,EACvD,YAAY,CACd,EAEM,oBAAsB,mBACtB,sBAAwB,CAAC,oBAAqB,aAAa,EAE3D,2BAA8B,MAAS,CAC3C,MAAM,OAAS,SAAS,eAAe,kBAAkB,EACzD,GAAI,CAAC,QAAU,CAAC,KAAM,OAEtB,MAAM,QADM,IAAI,UAAU,EAAE,gBAAgB,KAAM,WAAW,EACzC,cAAc,kBAAkB,EAChD,UAAS,OAAO,UAAY,QAAQ,UAC1C,EAEM,wBAA0B,SAAY,CAC1C,GAAI,CACF,MAAM,QAAU,OAAO,QAAQ,UAAY,QACrC,IAAM,MAAM,MAAM,GAAG,OAAO,eAAe,mBAAmB,EAAE,EACtE,GAAI,CAAC,IAAI,GAAI,OACb,2BAA2B,MAAM,IAAI,KAAK,CAAC,CAC7C,OAAS,MAAO,CACd,QAAQ,KAAK,yCAAoC,KAAK,CACxD,CACF,EAEM,yBAA2B,MAAO,YAAa,CAAE,WAAa,EAAM,EAAI,CAAC,IAAM,CACnF,MAAM,WAAa,aAAa,WAAW,mBAAmB,EAC1D,WACF,2BAA2B,UAAU,EAErC,MAAM,wBAAwB,EAGhC,MAAM,cAAgB,SAAS,cAAc,aAAa,EACtD,gBACoB,aAAa,WAAW,aAAa,GACtC,OAAO,cAAc,gBAAmB,YAAc,WACzE,cAAc,eAAe,WAAW,GAEpC,aAAa,YAAc,MAC7B,cAAc,UAAU,OAAO,WAAY,YAAY,aAAe,CAAC,EAErE,YAAc,OAAO,cAAc,MAAS,YAC9C,cAAc,KAAK,IAKrB,OAAO,SAAY,YAAc,OAAO,eAAmB,KAC7D,QAAQ,eAAe,WAAY,CACjC,OAAQ,iBACR,SAAU,aAAe,CAAC,CAC5B,CAAC,EAEH,SAAS,cAAc,IAAI,YAAY,cAAc,CAAC,CACxD,EAEM,gCAAkC,MAAO,YAAe,CAC5D,MAAM,IAAM,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,IAAK,IAAO,OAAO,EAAE,CAAC,EAAE,OAAO,OAAO,CAAC,EAC3E,GAAI,CAAC,IAAI,KAAM,MAAO,GAEtB,GAAI,CACF,MAAM,QAAU,MAAM,MAAM,WAAY,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EACnF,GAAI,CAAC,QAAQ,GAAI,MAAM,IAAI,MAAM,wCAAwC,EACzE,MAAM,KAAO,MAAM,QAAQ,KAAK,EAE1B,QAAU,CAAC,EAMjB,IALC,KAAK,OAAS,CAAC,GAAG,QAAS,MAAS,CAC/B,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,IACjC,QAAQ,KAAK,GAAG,EAAI,EAExB,CAAC,EACG,CAAC,OAAO,KAAK,OAAO,EAAE,OAAQ,MAAO,GAEzC,MAAM,UAAY,MAAM,MAAM,kBAAmB,CAC/C,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAC1E,KAAM,KAAK,UAAU,CACnB,QACA,SAAU,sBACV,aAAc,OAAO,SAAS,QAChC,CAAC,CACH,CAAC,EACD,GAAI,CAAC,UAAU,GAAI,CACjB,MAAM,KAAO,MAAM,UAAU,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,EACpD,MAAM,IAAI,MAAM,KAAK,aAAe,6CAA6C,CACnF,CACA,MAAM,YAAc,MAAM,UAAU,KAAK,EACzC,aAAM,yBAAyB,WAAW,EACnC,EACT,OAAS,MAAO,CACd,eAAQ,KAAK,4CAAuC,KAAK,EACzD,aAAa,MAAM,SAAW,yCAA0C,OAAO,EACxE,EACT,CACF,EAEM,2BAA6B,MAAO,eAAkB,CAC1D,MAAM,WAAa,cAAc,IAAK,GAAM,iBAAiB,CAAC,CAAC,EAAE,OAAO,OAAO,EAC/E,OAAO,gCAAgC,UAAU,CACnD,EAEM,mBAAqB,MAAO,MAAS,CACzC,MAAM,KAAO,oBAAoB,IAAI,EAErC,GADW,MAAM,gCAAgC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,EAE1E,IAAI,KAAM,CACR,GAAI,CACF,MAAM,qBAAqB,KAAM,CAAE,YAAa,EAAM,CAAC,CACzD,OAAS,MAAO,CACd,QAAQ,KAAK,oDAA+C,KAAK,CACnE,CACA,KAAK,SAAW,GAChB,MAAM,GAAK,kBAAkB,IAAI,EACjC,GAAI,GAAI,CACN,GAAG,UAAU,OAAO,aAAa,EACjC,MAAM,GAAK,GAAG,cAAc,2BAA2B,EACnD,KAAI,GAAG,QAAU,GACvB,CACF,CACA,MAAM,4BAA4B,EAC9B,YAAc,CAAC,WAAW,QAAQ,iBAAiB,EACvD,YAAY,EACd,EAEM,qBAAwB,MAAS,CACjC,OAAO,sBAAsB,cAC/B,OAAO,qBAAqB,cAAc,IAAI,EAE9C,OAAO,wBAAwB,KAAK,WAAY,IAAI,CAExD,EAEM,iBAAmB,IAAM,CAC7B,GAAI,CAAC,eAAgB,OACrB,MAAM,GAAK,OAAO,iBACZ,SAAW,yBAAyB,EACpC,SAAW,kBAAkB,EACnC,IAAI,WAAa,EA6BjB,GA5BA,iBAAiB,QAAS,MAAS,CACjC,YAAc,mBAAmB,IAAI,CACvC,CAAC,EACD,eAAe,gBAAgB,EAE3B,oBACG,SAEM,WAAa,SACtB,kBAAkB,YAChB,WAAa,EACT,uBACA,GAAG,QAAQ,uBACR,SAAW,EACpB,kBAAkB,YAAc,GAAG,QAAQ,uBAAoB,QAAQ,UAEvE,kBAAkB,YAChB,WAAa,EACT,0BACA,GAAG,QAAQ,wBAZjB,kBAAkB,YAAc,0CAgBpC,IAAI,kBAAkB,WAAY,CAChC,IAAK,SACL,eAAgB,YAAY,UAAU,CACxC,CAAC,EAEG,CAAC,SAAU,CACb,MAAM,MAAQ,SAAS,cAAc,IAAI,EACzC,MAAM,UAAY,6BAClB,MAAM,YAAc,yCACpB,eAAe,OAAO,KAAK,EAC3B,qBACE,qBAAuB,CAAE,WAAY,EAAG,qBAAsB,EAAG,MAAO,CAAC,CAAE,CAC7E,EACA,MACF,CAEA,iBAAiB,QAAS,MAAS,CACjC,MAAM,KAAO,oBAAoB,IAAI,EAC/B,IAAM,iBAAiB,IAAI,EAC3B,KAAO,KAAO,KAAK,KAAO,KAAK,eAAiB,KAAK,OAAS,QACpE,IAAI,OAAS,GACT,YAAc,GAClB,GAAI,KAAM,CACR,OAAS,KAAK,QAAU,GACxB,MAAM,QAAU,KAAK,cAAgB,GACrC,YACE,UAAY,SACR,OACA,UAAY,gBAAkB,UAAY,OACxC,QACA,OAAO,gBAAgB,mBAAmB,OAAO,GAAK,OAChE,MAGE,QADE,KAAK,eAAiB,KAAK,gBAAkB,gBAAkB,KAAK,cAAgB,KAClE,GACpB,YAAc,OAAO,gBAAgB,sBAAsB,IAAI,GAAK,GAChE,CAAC,QAAU,CAAC,cAAa,OAAS,eAExC,MAAM,SACJ,MAAM,UAAY,IAAI,cAAc,IAAI,GAAK,GACzC,eAAiB,YAAY,mBAAmB,IAAI,CAAC,EAErD,GAAK,IAAI,aAAa,CAC1B,KACA,OACA,YACA,eACA,IACA,SACA,SAAU,IAAM,CACT,mBAAmB,IAAI,CAC9B,CACF,CAAC,EACG,IAAI,eAAe,OAAO,EAAE,CAClC,CAAC,EACD,qBAAqB,mBAAmB,CAC1C,EAEM,oBAAsB,SAAY,CACtC,GAAI,CACF,MAAM,IAAM,MAAM,MAAM,WAAY,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC/E,GAAI,CAAC,IAAI,GAAI,OACb,MAAM,KAAO,MAAM,IAAI,KAAK,EAC5B,oBAAsB,KACtB,iBAAmB,KAAK,OAAS,CAAC,EAClC,YAAY,EACR,YAAc,CAAC,WAAW,QAAQ,iBAAiB,EACvD,qBAAqB,IAAI,EACzB,MAAM,OAAS,OAAO,yBAClB,QAAQ,yBACV,MAAM,OAAO,wBAAwB,CAEzC,OAAS,MAAO,CACd,QAAQ,KAAK,uCAAkC,KAAK,CACtD,CACF,EAEM,wBAA0B,SAAY,CACrC,aACL,MAAM,oBAAoB,EAC1B,iBAAiB,EACjB,WAAW,OAAS,GACpB,WAAW,gBAAgB,QAAQ,EACnC,OAAO,kBAAkB,KAAK,WAAY,wBAAwB,EACpE,EAEM,yBAA2B,IAAM,CAChC,aACL,WAAW,OAAS,GACpB,WAAW,aAAa,SAAU,EAAE,EACpC,OAAO,kBAAkB,MAAM,UAAU,EAC3C,EAGM,0BAA4B,CAAC,KAAM,SAAW,CAC7C,iBAAiB,IAAI,IAC1B,KAAK,SAAW,GAChB,oBAAoB,KAAM,MAAM,EAC5B,YAAc,CAAC,WAAW,QAAQ,iBAAiB,EACvD,YAAY,EACd,EAEM,4BAA8B,SAAY,CAC9C,GAAK,MAAM,OACX,GAAI,CACF,MAAM,IAAM,MAAM,MAAM,WAAY,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAC/E,GAAI,CAAC,IAAI,GAAI,OACb,MAAM,KAAO,MAAM,IAAI,KAAK,EAC5B,oBAAsB,KACtB,iBAAmB,KAAK,OAAS,CAAC,EAClC,MAAM,iBAAmB,IAAI,IAC3B,iBAAiB,IAAK,MAAS,OAAO,KAAK,UAAU,CAAC,CACxD,EAEA,GAAI,qBAAuB,QAAS,CAClC,IAAI,QAAU,GACd,MAAM,QAAS,MAAS,CACtB,MAAM,IAAM,iBAAiB,IAAI,EACjC,GAAI,CAAC,IAAK,OACV,MAAM,OAAS,iBAAiB,IAAI,GAAG,EACnC,QAAU,CAAC,KAAK,UAClB,KAAK,SAAW,GAChB,QAAU,IACD,CAAC,QAAU,KAAK,WACzB,KAAK,SAAW,GAChB,QAAU,GAEd,CAAC,EACD,iBAAiB,QAAS,MAAS,CACjC,MAAM,KAAO,oBAAoB,IAAI,EACjC,MAAQ,CAAC,KAAK,WAChB,KAAK,SAAW,GAChB,QAAU,GAEd,CAAC,EACG,SACF,MAAM,QAAS,MAAS,CACtB,GAAI,KAAK,SAAU,oBAAoB,IAAI,MACtC,CACH,MAAM,GAAK,kBAAkB,IAAI,EACjC,GAAI,GAAI,CACN,GAAG,UAAU,OAAO,aAAa,EACjC,MAAM,GAAK,GAAG,cAAc,2BAA2B,EACnD,KAAI,GAAG,QAAU,GACvB,CACF,CACF,CAAC,CAEL,CAEI,YAAc,CAAC,WAAW,QAAQ,iBAAiB,EACvD,YAAY,EACR,kBAAkB,EAAI,GACnB,wBAAwB,CAEjC,OAAS,MAAO,CACd,QAAQ,KAAK,kDAA6C,KAAK,CACjE,CACF,EAEM,eAAiB,MAAO,MAAO,CAAE,eAAgB,aAAe,CAAC,CAAE,EAAI,CAAC,IAAM,CAClF,GAAI,CAAC,MAAM,OACT,oBAAa,0DAAqD,OAAO,EAClE,GAGT,IAAI,aAAe,MAAM,MAAM,EAC3B,gBAAkB,cAAgB,CAAC,GAAG,OAAO,OAAO,EACxD,MAAM,WAAa,OAAO,yBAC1B,GAAI,YAAY,qBAAsB,CACpC,MAAM,WAAa,aAAa,IAAK,OAAU,CAC7C,UAAW,OAAO,KAAK,EAAE,EACzB,IAAK,EACP,EAAE,EACI,CAAE,OAAQ,EAAI,MAAM,WAAW,qBAAqB,UAAU,EACpE,GAAI,QAAQ,OAAQ,CAClB,MAAM,WAAa,IAAI,IAAI,QAAQ,IAAK,MAAS,OAAO,KAAK,SAAS,CAAC,CAAC,EAKxE,GAJA,aAAe,aAAa,OAAQ,MAAS,CAAC,WAAW,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,EAC7E,eAAiB,eAAe,OAC7B,MAAS,CAAC,WAAW,IAAI,OAAO,iBAAiB,IAAI,GAAK,EAAE,CAAC,CAChE,EACI,CAAC,aAAa,OAChB,oBACE,8DACA,OACF,EACO,GAET,aACE,QAAQ,SAAW,EACf,uFACA,GAAG,QAAQ,MAAM,gFACrB,OACF,CACF,CACF,CAEA,MAAM,cAAgB,CAAC,EAEvB,UAAW,QAAQ,eACjB,GAAI,CACF,MAAM,QAAU,MAAM,qBAAqB,KAAM,CAAE,YAAa,EAAM,CAAC,EACvE,GAAI,CAAC,SAAS,GAAI,CAChB,GAAI,SAAS,QAAU,aAAe,SAAS,SAAW,SAAS,SAAU,CAC3E,QAAQ,KACN,gEACA,SAAS,SAAW,SAAS,KAC/B,EACA,QACF,CACA,aAAM,qBAAqB,cAAe,CAAE,YAAa,EAAM,CAAC,EAChE,aACE,SAAS,SACP,gEACF,OACF,EACO,EACT,CACI,CAAC,SAAS,UAAY,CAAC,SAAS,SAClC,cAAc,KAAK,IAAI,CAE3B,OAAS,MAAO,CACd,GAAI,OAAO,gBAAiB,CAC1B,QAAQ,KAAK,uEAA+D,MAAM,OAAO,EACzF,QACF,CACA,aAAM,qBAAqB,cAAe,CAAE,YAAa,EAAM,CAAC,EAChE,aAAa,MAAM,SAAW,+BAAgC,OAAO,EAC9D,EACT,CAGF,GAAI,CACF,MAAMC,OAAQ,aACR,SAAW,MAAM,MAAM,eAAgB,CAC3C,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAC1E,KAAM,KAAK,UAAU,CACnB,MAAAA,OACA,SAAU,sBACV,aAAc,OAAO,SAAS,QAChC,CAAC,CACH,CAAC,EACD,GAAI,CAAC,SAAS,GAAI,CAChB,MAAM,KAAO,MAAM,SAAS,KAAK,EAAE,MAAM,KAAO,CAAC,EAAE,EAC7C,IAAM,OAAO,KAAK,aAAe,KAAK,SAAW,EAAE,EACzD,GAAI,qBAAqB,GAAG,EAC1B,oBACEA,OAAM,SAAW,EACb,2EACA,0EACJ,SACF,EACA,MAAM,wBAAwB,EAC9B,SAAS,cAAc,IAAI,YAAY,cAAc,CAAC,EAC/C,UAET,YAAM,qBAAqB,cAAe,CAAE,YAAa,EAAM,CAAC,EAC1D,IAAI,MAAM,KAAO,6CAA6C,CACtE,CACA,MAAM,YAAc,MAAM,SAAS,KAAK,EACxC,UAAW,QAAQ,cACjB,GAAI,CACF,MAAM,qBAAqB,KAAM,CAAE,YAAa,EAAM,CAAC,CACzD,OAAS,MAAO,CACd,QAAQ,KAAK,6CAAwC,KAAK,CAC5D,CAEF,aACE,gBAAkB,GAAGA,OAAM,MAAM,4CACjC,SACF,EACA,MAAM,yBAAyB,YAAa,CAAE,WAAY,EAAK,CAAC,EAChE,MAAM,4BAA4B,EAClC,MAAM,QAAU,QAAQ,EACxB,OAAI,SACF,MAAM,QAAQ,SAAS,QAAQ,QAAQ,CAAC,EAEnC,EACT,OAAS,MAAO,CACd,aAAM,qBAAqB,cAAe,CAAE,YAAa,EAAM,CAAC,EAChE,aAAa,MAAM,SAAW,6BAA2B,OAAO,EACzD,EACT,CACF,EAEM,wBAA0B,CAAC,OAAQ,gBAAkB,IAAM,CAC/D,MAAM,IAAM,OAAO,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAC9C,KAAO,UAAU,KAAM,GAAM,OAAO,EAAE,QAAU,EAAE,EAAE,YAAY,IAAM,GAAG,EACzE,UAAY,OAAO,MAAM,WAAW,EAC1C,GAAI,OAAO,SAAS,SAAS,GAAK,UAAY,EAAG,OAAO,UACxD,MAAM,QAAU,OAAO,oBAAoB,GAAG,CAAC,EAC/C,GAAI,OAAO,SAAS,OAAO,GAAK,QAAU,EAAG,OAAO,QACpD,MAAM,YAAc,OAAO,eAAe,EAC1C,OAAI,OAAO,SAAS,WAAW,GAAK,YAAc,EAAU,YAC7C,IAAI,IACjB,MAAM,IAAK,MAAS,gBAAgB,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,OAAO,CAChF,EACc,MAAQ,MAAM,QAAU,CACxC,EAEM,YAAc,IAAM,CACxB,MAAM,QAAU,aAAa,EACvB,cAAgB,oBAAoB,EACpC,cAAgB,QAAQ,GAAG,QAAQ,EAAE,QAAU,cAC/C,WAAa,MAAM,OAAO,mBAAmB,EAAE,OAC/C,SAAW,yBAAyB,EACpC,UAAY,kBAAkB,EACpC,IAAI,eAAiB,EACrB,iBAAiB,QAAS,MAAS,CACjC,gBAAkB,mBAAmB,IAAI,CAC3C,CAAC,EAED,MAAM,SACJ,wBAA0B,EACtB,wBACA,wBAAwB,gBAAgB,EAW9C,GAVI,SAAQ,OAAO,YAAc,OAAO,UAAY,QAAG,GACnD,WAAU,SAAS,YAAc,KAAK,QAAQ,UAAY,IAAM,SAAM,OAAO,UAAU,GAC3F,eAAe,EAEX,kBAEF,gBAAgB,OACd,KAAK,QAAQ,UAAY,KAAO,WAAa,GAAK,MAAM,SAAW,GAGnE,gBACF,GAAI,YAAc,EAChB,gBAAgB,YAAc,yCACrB,WAAa,UACtB,gBAAgB,YACd,YAAc,EACV,iCAA8B,YAAY,cAAc,CAAC,GACzD,GAAG,SAAS,iCAA8B,YAAY,cAAc,CAAC,WAClE,SAAW,EAAG,CACvB,MAAM,QACJ,WAAa,EAAI,kBAAoB,GAAG,QAAQ,iBAC5C,UAAY,YAAc,EAAI,WAAa,GAAG,SAAS,UAC7D,gBAAgB,YAAc,GAAG,OAAO,SAAM,SAAS,aAAU,YAAY,cAAc,CAAC,EAC9F,MACE,gBAAgB,YACd,YAAc,EACV,qCACA,GAAG,SAAS,qCAMtB,GAFI,cAAa,YAAY,SAAW,IAEpC,gBACF,GAAI,gBAAkB,EACpB,gBAAgB,YAAc,oCACrB,gBAAkB,cAC3B,gBAAgB,YACd,gBAAkB,EAAI,0BAA4B,GAAG,aAAa,8BAC/D,CACL,MAAM,QACJ,gBAAkB,EAAI,kBAAoB,GAAG,aAAa,iBACtD,UAAY,gBAAkB,EAAI,WAAa,GAAG,aAAa,UACrE,gBAAgB,YAAc,GAAG,OAAO,SAAM,SAAS,EACzD,CAOF,GAJI,kBAAiB,gBAAgB,SAAW,gBAAkB,GAE9D,2BAA0B,yBAAyB,SAAW,gBAAkB,GAEhF,MAAO,CACT,MAAM,YAAc,IAAI,IACtB,MAAM,IAAK,MAAS,gBAAgB,KAAK,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,OAAO,CAChF,EAAE,KACI,SAAW,UAAY,aAAe,MAAM,OAC5C,aAAe,QAAQ,OAC7B,MAAM,YACJ,GAAG,YAAY,mBAAgB,QAAQ,uBACpC,UAAU,eACjB,CACA,OAAO,uBAAuB,aAAa,CAC7C,EAEM,qBAAuB,IAAM,CACjC,MAAM,QAAU,QAAQ,EACxB,GAAI,CAAC,oBAAsB,CAAC,QAAS,OACrC,MAAM,IAAM,QAAQ,QAAQ,EAU5B,GATA,mBAAmB,gBAAgB,EAE/B,wBACF,sBAAsB,YACpB,IAAI,SAAW,EACX,iCACA,GAAG,IAAI,MAAM,kCAGjB,CAAC,IAAI,OAAQ,CACf,MAAM,MAAQ,SAAS,cAAc,IAAI,EACzC,MAAM,UAAY,iCAClB,MAAM,YAAc,yCACpB,mBAAmB,OAAO,KAAK,EAC/B,MACF,CAEA,IAAI,QAAS,QAAW,CACtB,MAAM,MAAQ,qBAAqB,MAAM,EACnC,GAAK,SAAS,cAAc,IAAI,EACtC,GAAG,UAAY,gCAEf,MAAM,KAAO,SAAS,cAAc,KAAK,EACzC,KAAK,UAAY,qCACjB,MAAM,KAAO,SAAS,cAAc,GAAG,EACvC,KAAK,UAAY,qCACjB,KAAK,YAAc,MAAM,KACzB,MAAM,KAAO,SAAS,cAAc,GAAG,EACvC,KAAK,UAAY,qCACjB,KAAK,YAAc,GAAG,MAAM,OAAO,SAAM,MAAM,MAAM,SAAM,MAAM,YAAY,GAC7E,KAAK,OAAO,KAAM,IAAI,EAEtB,MAAM,UAAY,SAAS,cAAc,QAAQ,EACjD,UAAU,KAAO,SACjB,UAAU,UAAY,uCACtB,UAAU,YAAc,YACxB,UAAU,iBAAiB,QAAS,IAAM,CACxC,MAAM,IAAM,QAAQ,EACpB,GAAI,CAAC,IAAK,OACV,MAAM,WAAa,IAAI,gBAAkB,IAAI,gBAAgB,MAAM,EAAI,OACvE,IAAI,QACF,IAAI,QAAQ,EAAE,OAAQ,KACP,IAAI,gBAAkB,IAAI,gBAAgB,EAAE,EAAI,MAC7C,UACjB,CACH,EACA,MAAM,KAAO,MAAM,KAAM,GAAM,EAAE,SAAW,MAAM,EAC9C,OAAM,KAAK,WAAa,IAC5B,qBAAqB,EACrB,OAAO,CACT,CAAC,EAED,GAAG,OAAO,KAAM,SAAS,EACzB,mBAAmB,OAAO,EAAE,CAC9B,CAAC,CACH,EAEM,mBAAqB,IAAM,CAC/B,MAAM,QAAU,QAAQ,EACpB,CAAC,gBAAkB,CAAC,SAAW,QAAQ,QAAQ,EAAE,SAAW,IAChE,qBAAqB,EACrB,eAAe,OAAS,GACxB,SAAS,KAAK,MAAM,SAAW,SACjC,EAEM,oBAAsB,IAAM,CAC3B,iBACL,eAAe,OAAS,GACxB,SAAS,KAAK,MAAM,SAAW,GACjC,EAEM,OAAS,IAAM,CACnB,GAAI,CAAC,KAAM,OAIX,GAAI,KAAK,QAAQ,UAAY,IAAK,CAChC,YAAY,yBAAoB,EAChC,MACF,CACA,KAAK,gBAAgB,EAErB,MAAM,KAAO,aAAa,EAC1B,GAAI,CAAC,KAAK,OAAQ,CAChB,MAAM,MAAQ,SAAS,cAAc,GAAG,EACxC,MAAM,UAAY,0BAClB,MAAM,YAAc,yBACpB,KAAK,OAAO,KAAK,EACjB,YAAY,EACZ,MACF,CAEA,KAAK,QAAS,MAAS,CACrB,MAAM,cAAgB,oBAAoB,IAAI,EACxC,KAAO,SAAS,cAAc,cAAgB,QAAU,KAAK,EACnE,KAAK,UAAY,uBACjB,KAAK,QAAQ,OAAS,KAAK,OACtB,cACA,KAAK,UAAU,IAAI,aAAa,EADjB,KAAK,UAAU,IAAI,iBAAiB,EAEpD,KAAK,UAAU,KAAK,UAAU,IAAI,aAAa,EAC/C,KAAK,YAAY,KAAK,UAAU,IAAI,eAAe,EACrC,iBAAiB,IAAI,GACxB,KAAK,UAAU,IAAI,eAAe,EAGjD,IAAI,QAAU,KAEd,GAAI,cAAe,CACjB,MAAM,SAAW,SAAS,cAAc,OAAO,EAC/C,SAAS,KAAO,WAChB,SAAS,UAAY,2BACrB,SAAS,QAAU,KAAK,SACxB,SAAS,aAAa,aAAc,4BAAyB,EAC7D,SAAS,iBAAiB,SAAU,IAAM,CACxC,KAAK,SAAW,SAAS,QACzB,KAAK,UAAU,OAAO,cAAe,KAAK,QAAQ,EAClD,YAAY,CACd,CAAC,EACD,KAAK,OAAO,QAAQ,CACtB,MACE,QAAU,SAAS,cAAc,QAAQ,EACzC,QAAQ,KAAO,SACf,QAAQ,UAAY,gCAChB,KAAK,YAAY,QAAQ,UAAU,IAAI,WAAW,EACtD,QAAQ,aAAa,aAAc,wBAAwB,EAC3D,QAAQ,aAAa,eAAgB,KAAK,WAAa,OAAS,OAAO,EACvE,QAAQ,MAAQ,KAAK,WAAa,4BAA8B,yBAChE,QAAQ,UAAY,0EACpB,QAAQ,iBAAiB,QAAU,OAAU,CAC3C,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,eAAe,KAAM,KAAM,OAAO,EAClC,MAAM,QAAU,KAAK,cAAc,mCAAmC,EAClE,SAAS,wBAAwB,QAAS,IAAI,EAClD,QAAQ,MAAQ,KAAK,WAAa,4BAA8B,wBAClE,CAAC,EACD,KAAK,OAAO,OAAO,EAGrB,gBAAgB,KAAM,KAAM,aAAa,EAEzC,MAAM,KAAO,SAAS,cAAc,KAAK,EACzC,KAAK,UAAY,4BAEjB,MAAM,KAAO,SAAS,cAAc,GAAG,EACvC,KAAK,UAAY,4BACjB,KAAK,YAAc,KAAK,KAExB,MAAM,KAAO,SAAS,cAAc,GAAG,EAMvC,GALA,KAAK,UAAY,4BACjB,KAAK,YAAc,GAAG,KAAK,MAAM,SAAM,KAAK,YAAY,GAExD,KAAK,OAAO,KAAM,IAAI,EAElB,eAAiB,KAAK,SAAS,aAAe,KAAM,CACtD,MAAM,UAAY,SAAS,cAAc,KAAK,EAC9C,UAAU,UAAY,mCAEtB,MAAM,aAAe,SAAS,cAAc,MAAM,EAClD,aAAa,UAAY,mCACzB,aAAa,YAAc,WAE3B,MAAM,WAAa,SAAS,cAAc,GAAG,EAC7C,WAAW,UAAY,kCACvB,WAAW,YAAc,YAAY,KAAK,QAAQ,WAAW,EAE7D,UAAU,OAAO,aAAc,UAAU,EACzC,KAAK,OAAO,SAAS,EAErB,MAAM,OAAS,SAAS,cAAc,GAAG,EACzC,OAAO,UAAY,oCACnB,OAAO,YAAc,GAAG,KAAK,QAAQ,WAAa,IAAI,SAAM,KAAK,QAAQ,iBAAmB,KAAK,QAAQ,KAAK,aAC9G,KAAK,OAAO,MAAM,EAElB,MAAM,QAAU,SAAS,cAAc,QAAQ,EAC/C,QAAQ,KAAO,SACf,QAAQ,UAAY,yDACpB,QAAQ,YAAc,mBACtB,QAAQ,aAAa,aAAc,GAAG,KAAK,IAAI,yBAAyB,EACxE,MAAM,kBAAoB,IAAM,CAClB,iBAAiB,IAAI,GAE/B,QAAQ,SAAW,GACnB,QAAQ,YAAc,oBACb,qBAAuB,WAChC,QAAQ,SAAW,GACnB,QAAQ,YAAc,uCAEtB,QAAQ,SAAW,GACnB,QAAQ,YAAc,4BAE1B,EACA,kBAAkB,EAClB,KAAK,mBAAqB,kBAC1B,QAAQ,iBAAiB,QAAS,MAAO,OAAU,CACjD,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,MAAM,IAAM,iBAAiB,IAAI,EACjC,GAAI,CAAC,IAAK,OACV,QAAQ,SAAW,GACnB,MAAM,MAAQ,MAAM,eAAe,CAAC,CAAE,GAAI,OAAO,GAAG,EAAG,SAAU,CAAE,CAAC,EAAG,CACrE,eAAgB,SAAI,KAAK,IAAI,wCAC7B,aAAc,CAAC,IAAI,CACrB,CAAC,GACG,QAAU,IAAQ,QAAU,YAAW,0BAA0B,KAAM,IAAI,EAC/E,kBAAkB,CACpB,CAAC,EACD,KAAK,OAAO,OAAO,CACrB,SAAW,CAAC,cAAe,CACzB,MAAM,QAAU,SAAS,cAAc,GAAG,EAC1C,QAAQ,UAAY,mCACpB,wBAAwB,QAAS,IAAI,EACrC,KAAK,OAAO,OAAO,CACrB,CAEA,KAAK,OAAO,IAAI,EAChB,KAAK,OAAO,IAAI,CAClB,CAAC,EAED,YAAY,EACZ,kBAAkB,CACpB,EAEM,mBAAqB,CAAC,QAAS,YAAc,CACjD,MAAM,OAAS,OAAO,WAAa,SAAS,QAAU,kBAAoB,UAAU,EACjF,KAAK,EACL,YAAY,EACT,KAAO,CAAC,EACd,OAAC,QAAQ,OAAS,CAAC,GAAG,QAAS,MAAS,EACrB,KAAK,UAAU,OAC5B,KAAK,SACL,CAAC,CAAE,IAAK,SAAU,MAAO,SAAU,UAAW,KAAK,SAAU,CAAC,GACzD,QAAS,SAAY,CAC5B,MAAM,OAAS,oBAAoB,QAAQ,GAAG,EACxC,QAAU,QAAQ,EAClB,OAAS,QACX,QAAQ,YAAY,OAAQ,KAAK,OAAQ,MAAM,EAC/C,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,MAAM,GAChC,WAAa,oBAAoB,CAAE,GAAG,QAAS,IAAK,MAAO,CAAC,EAClE,KAAK,KAAK,CACR,OACA,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,WAAY,OACZ,aACE,QAAQ,OACR,eAAe,MAAM,IACpB,SAAW,UAAY,eAAiB,SAAW,OAAS,OAAS,UACxE,QAAS,iBAAiB,MAAM,EAChC,SAAU,QAAQ,WAAa,KAAK,WAAa,KACjD,SAAU,WAAW,SACrB,QAAS,WAAW,QACpB,SAAU,GACV,WAAY,QAAU,QAAQ,aAAa,MAAM,EAAI,EACvD,CAAC,CACH,CAAC,CACH,CAAC,EACM,IACT,EAEM,qBAAuB,CAAC,KAAM,aAAe,CACjD,MAAM,IAAM,IAAI,IAChB,OAAC,YAAY,OAAS,CAAC,GAAG,QAAS,MAAS,CAC1C,MAAM,QAAU,KAAK,WAAa,MACjC,KAAK,UAAY,CAAC,CAAE,IAAK,UAAW,CAAC,GAAG,QAAS,SAAY,CAC5D,MAAM,IAAM,QAAQ,WAAa,QAC5B,KACL,IAAI,IAAI,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,QAAQ,GAAG,GAAI,GAAG,CAC/D,CAAC,EACG,SACF,IAAI,IAAI,GAAG,gBAAgB,KAAK,MAAM,CAAC,KAAM,OAAO,CAExD,CAAC,EACM,KAAK,IAAK,MAAS,CACxB,GAAI,KAAK,SAAU,OAAO,KAC1B,MAAM,IAAM,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,GACxD,IAAM,IAAI,IAAI,GAAG,GAAK,IAAI,IAAI,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,EACvE,OAAO,IAAM,CAAE,GAAG,KAAM,SAAU,GAAI,EAAI,IAC5C,CAAC,CACH,EAEM,wBAA0B,CAAC,GAAI,OAAS,CACvC,KACD,KAAK,YACP,GAAG,YAAc,kBACjB,GAAG,MAAQ,sCAEX,GAAG,YAAc,kBACjB,GAAG,MAAQ,2BAEf,EAEM,uBAA0B,MAAS,CACvC,MAAM,GAAK,SAAS,cAAc,KAAK,EACvC,GAAG,UAAY,oCACf,GAAG,aAAa,cAAe,MAAM,EACrC,MAAM,IAAM,OAAO,KAAK,QAAU,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,GAAK,IACvD,UAAG,UAAY,uDAAuD,GAAG,UAClE,EACT,EAGA,IAAI,mBAAqB,KAEzB,MAAM,yBAA2B,IAAM,CACrC,GAAI,CAAC,iBAAmB,gBAAgB,OAAQ,OAChD,MAAM,YACJ,oBAAoB,WACpB,oBAAoB,MAAM,cAAc,sCAAsC,EAChF,gBAAgB,OAAS,GACzB,gBAAgB,aAAa,SAAU,EAAE,EACzC,SAAS,KAAK,MAAM,SAAW,GAC/B,mBAAqB,KACrB,aAAa,MAAM,CAAE,cAAe,EAAK,CAAC,CAC5C,EAEM,uBAAyB,CAAC,KAAM,gBAAkB,CACjD,yBACL,uBAAuB,OAAS,GAChC,uBAAuB,gBAAgB,QAAQ,EAC/C,uBAAuB,YAAc,KAAK,WACtC,kBACA,cACE,qCACA,kBACN,uBAAuB,MAAQ,KAAK,WAChC,oCACA,cACE,GACA,0BACR,EAEM,iBAAoB,MAAS,CACjC,MAAM,KAAO,OAAO,MAAM,MAAQ,EAAE,EAAE,KAAK,EACrC,OAAS,OAAO,MAAM,QAAU,EAAE,EAAE,KAAK,EACzC,IAAM,qBACV,OAAO,MAAM,SAAW,MAAM,KAAO,EAAE,EAAE,KAAK,GAAK,sBAAsB,CAC3E,EACA,IAAI,OAAS,OAAO,MAAM,cAAgB,MAAM,QAAU,EAAE,EAAE,KAAK,EAC/D,SAAW,WAAU,OAAS,QAClC,IAAI,KAAO,KACP,QAAU,CAAC,KAAK,SAAS,MAAM,IAAG,KAAO,CAAC,KAAM,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACpF,MAAM,QAAU,IAAI,QAAQ,oBAAqB,EAAE,EAAE,KAAK,EAC1D,IAAI,IAAM,KACV,OAAI,KAAO,CAAC,KAAK,SAAS,GAAG,GAAK,EAAE,SAAW,KAAK,SAAS,OAAO,KAClE,IAAM,IAAM,GAAG,GAAG,WAAM,GAAG,GAAK,KAElC,IAAM,IAAM,GAAG,GAAG,2BAAqB,mBACnC,SAAQ,IAAM,GAAG,GAAG,IAAI,MAAM,IAC3B,IAAI,KAAK,CAClB,EAEM,wBAA0B,CAAC,KAAM,KAAM,cAAe,YAAc,CACxE,GAAI,GAAC,iBAAmB,CAAC,kBAAoB,CAAC,iBAAmB,CAAC,iBAIlE,IAHA,mBAAqB,CAAE,KAAM,KAAM,cAAe,SAAU,EAE5D,iBAAiB,gBAAgB,EAC7B,KAAK,SAAU,CACjB,MAAM,IAAM,SAAS,cAAc,KAAK,EACxC,IAAI,IAAM,KAAK,SACf,IAAI,IAAM,iBAAiB,IAAI,EAC/B,IAAI,MAAQ,IACZ,IAAI,OAAS,IACb,IAAI,iBAAiB,QAAS,IAAM,CAClC,iBAAiB,gBAAgB,uBAAuB,IAAI,CAAC,CAC/D,CAAC,EACD,iBAAiB,OAAO,GAAG,CAC7B,MACE,iBAAiB,OAAO,uBAAuB,IAAI,CAAC,EAGtD,gBAAgB,YAAc,KAAK,KACnC,gBAAgB,YAAc,GAAG,KAAK,MAAM,SAAM,KAAK,YAAY,GACnE,uBAAuB,KAAM,aAAa,EAE1C,gBAAgB,OAAS,GACzB,gBAAgB,gBAAgB,QAAQ,EACxC,SAAS,KAAK,MAAM,SAAW,SAC/B,gBAAgB,cAAc,mCAAmC,GAAG,MAAM,EAC5E,EAEM,oBAAsB,MAAO,MAAO,aAAe,CACvD,MAAM,aAAe,MAAM,cAAc,uBAAuB,EAChE,GAAI,CAAC,aAAc,MAAM,IAAI,MAAM,6BAA6B,EAEhE,MAAM,SAAW,MAAM,MAAM,UAAU,EACvC,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,EAAE,EAC3D,MAAM,aAAe,MAAM,SAAS,KAAK,EAEnC,eADM,IAAI,UAAU,EAAE,gBAAgB,aAAc,WAAW,EAC1C,cAAc,cAAc,EACvD,GAAI,CAAC,eAAgB,MAAM,IAAI,MAAM,sBAAsB,EAE3D,GAAI,OAAO,MAAM,gBAAmB,WAAY,CAC9C,GAAI,CACF,MAAM,eAAe,cAAc,CACrC,OAAS,MAAO,CACd,QAAQ,KAAK,8CAAyC,KAAK,CAC7D,CACI,OAAO,kBAAsB,IAC/B,kBAAkB,aAAa,aAAc,eAAe,SAAS,EAErE,aAAa,UAAY,eAAe,SAE5C,MACE,aAAa,UAAY,eAAe,UAGtC,OAAO,SAAS,eAAe,QAAQ,cAAc,KAAK,EAC1D,OAAO,cAAc,OAAO,aAAa,cAAc,CAC7D,EAEM,kBAAoB,CAAC,MAAO,SAAW,CAC3C,MAAM,iBAAmB,OAAO,eAAe,OAAO,eAAe,KAAK,CAAC,EAC3E,GAAI,kBAAoB,OAAO,iBAAiB,MAAS,WAAY,CACnE,iBAAiB,KAAK,KAAK,MAAO,MAAM,EACxC,MACF,CACA,MAAM,SAAW,OACjB,SAAS,KAAK,UAAU,IAAI,iBAAiB,EAC7C,MAAM,aAAa,OAAQ,EAAE,CAC/B,EAEM,mBAAsB,OAAU,CACpC,GAAK,MACL,IAAI,OAAO,MAAM,MAAS,WAAY,CACpC,MAAM,KAAK,EAAI,EACf,MACF,CACA,MAAM,gBAAgB,MAAM,EAC5B,SAAS,KAAK,UAAU,OAAO,iBAAiB,EAClD,EAEM,wBAA0B,CAAC,MAAO,KAAM,OAAS,CACrD,MAAM,YAAc,MAAM,cAAc,cAAc,EAChD,KAAO,aAAa,cAAc,MAAM,EAC9C,GAAI,CAAC,KAAM,OAEX,MAAM,UAAY,YAAY,cAAc,iBAAiB,EACvD,UAAY,iBAAiB,IAAI,EACjC,aAAe,KAAK,cAAc,aAAa,EACjD,cAAgB,YAClB,aAAa,MAAQ,UACrB,aAAa,SAAW,IAEtB,YACF,UAAU,gBAAgB,UAAU,EACpC,UAAU,gBAAgB,eAAe,GAGvC,KAAK,QAAQ,mBAAqB,SACtC,KAAK,QAAQ,iBAAmB,OAEhC,KAAK,iBACH,SACA,MAAO,OAAU,CACf,MAAM,eAAe,EACrB,MAAM,yBAAyB,EAE/B,MAAM,IAAM,iBAAiB,IAAI,GAAK,KAAK,cAAc,aAAa,GAAG,MACzE,GAAI,CAAC,IAAK,CACR,aAAa,6DAAmD,OAAO,EACvE,MACF,CAEI,YACF,UAAU,aAAa,gBAAiB,MAAM,EAC9C,UAAU,UAAU,IAAI,SAAS,EACjC,UAAU,cAAc,mBAAmB,GAAG,UAAU,OAAO,QAAQ,GAGzE,MAAM,MAAQ,MAAM,eAAe,CAAC,CAAE,GAAI,OAAO,GAAG,EAAG,SAAU,CAAE,CAAC,EAAG,CACrE,eAAgB,SAAI,KAAK,IAAI,wCAC7B,aAAc,CAAC,IAAI,CACrB,CAAC,EAEG,YACF,UAAU,UAAU,OAAO,SAAS,EACpC,UAAU,gBAAgB,eAAe,EACzC,UAAU,cAAc,mBAAmB,GAAG,UAAU,IAAI,QAAQ,IAGlE,QAAU,IAAQ,QAAU,aAC9B,0BAA0B,KAAM,IAAI,EACpC,mBAAmB,KAAK,EAE5B,EACA,CAAE,QAAS,EAAK,CAClB,EACF,EAEM,mBAAqB,CAAC,MAAO,KAAM,OAAS,CAC5C,CAAC,OAAS,CAAC,OACf,wBAAwB,MAAO,KAAM,IAAI,EACzC,MAAM,cAAc,cAAc,GAAG,cACnC,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EACF,EAEM,sBAAwB,MAAO,KAAM,KAAM,cAAe,YAAc,CAC5E,MAAM,YACJ,WAAa,MAAM,cAAc,sCAAsC,GAAK,KACxE,aAAe,kBAAkB,IAAI,EACrC,WAAa,qBAAqB,YAAY,EACpD,GAAI,CAAC,WAAY,CACf,wBAAwB,aAAc,KAAM,cAAe,WAAW,EACtE,MACF,CAEA,GAAI,CACF,MAAM,eAAe,YAAY,iBAAiB,EAClD,MAAM,MAAQ,iBAAiB,EACzB,OAAS,eACf,GAAI,CAAC,OAAS,CAAC,OAAQ,MAAM,IAAI,MAAM,yBAAyB,EAGhE,GADA,OAAO,aAAa,mBAAoB,UAAU,EAC9C,CAAC,OAAO,cAAc,mBAAmB,EAAG,CAC9C,MAAM,QAAU,SAAS,cAAc,KAAK,EAC5C,QAAQ,UAAY,0BACpB,OAAO,OAAO,OAAO,CACvB,CAEA,MAAM,oBAAoB,MAAO,UAAU,EAC3C,mBAAmB,MAAO,aAAc,IAAI,EAC5C,kBAAkB,MAAO,WAAW,CACtC,OAAS,MAAO,CACd,QAAQ,KAAK,kDAA6C,KAAK,EAC/D,wBAAwB,aAAc,KAAM,cAAe,WAAW,CACxE,CACF,EAEM,qBAAuB,MAAO,KAAM,KAAM,cAAe,YAAc,CAC3E,GAAI,CACF,MAAM,mBAAmB,CAC3B,OAAS,MAAO,CACd,QAAQ,KAAK,wCAAmC,KAAK,CACvD,CACA,MAAM,sBAAsB,KAAM,KAAM,cAAe,SAAS,CAClE,EAEA,iBAAiB,iBAAiB,QAAU,OAAU,CAChD,MAAM,SAAW,iBAAiB,yBAAyB,CACjE,CAAC,EACD,qBAAqB,QAAS,KAAQ,CACpC,IAAI,iBAAiB,QAAS,wBAAwB,CACxD,CAAC,EACD,SAAS,iBAAiB,UAAY,OAAU,CAC1C,MAAM,MAAQ,UAAY,iBAAmB,CAAC,gBAAgB,QAChE,yBAAyB,CAE7B,CAAC,EAED,MAAM,gBAAkB,CAAC,KAAM,KAAM,gBAAkB,CACrD,MAAM,UAAY,SAAS,cAAc,KAAK,EAU9C,GATA,UAAU,UAAY,iEACtB,UAAU,aAAa,OAAQ,QAAQ,EACvC,UAAU,SAAW,EACrB,UAAU,aAAa,aAAc,GAAG,KAAK,IAAI,4BAAsB,EACvE,UAAU,iBAAiB,YAAc,OAAU,CAC7C,MAAM,OAAO,QAAQ,gCAAgC,GACzD,MAAM,eAAe,CACvB,CAAC,EAEG,KAAK,SAAU,CACjB,MAAM,MAAQ,SAAS,cAAc,KAAK,EAC1C,MAAM,UAAY,wBAClB,MAAM,IAAM,KAAK,SACjB,MAAM,IAAM,iBAAiB,IAAI,EACjC,MAAM,QAAU,OAChB,MAAM,MAAQ,IACd,MAAM,OAAS,IACf,MAAM,iBAAiB,QAAS,IAAM,CACpC,MAAM,OAAO,EACR,UAAU,cAAc,oCAAoC,GAC/D,UAAU,QAAQ,uBAAuB,IAAI,CAAC,CAElD,CAAC,EACD,UAAU,OAAO,KAAK,CACxB,MACE,UAAU,OAAO,uBAAuB,IAAI,CAAC,EAG/C,GAAI,cAAe,CACjB,MAAM,IAAM,SAAS,cAAc,QAAQ,EAC3C,IAAI,KAAO,SACX,IAAI,UAAY,gCAChB,IAAI,aAAa,aAAc,GAAG,KAAK,IAAI,mBAAmB,EAC9D,IAAI,MAAQ,mBACZ,IAAI,UACF,8EACF,MAAM,cAAgB,IAAM,CAC1B,MAAM,IAAM,iBAAiB,IAAI,EACjC,IAAI,SAAW,CAAC,IAChB,IAAI,UAAU,OAAO,WAAY,EAAQ,GAAI,EAC7C,IAAI,UAAU,OAAO,aAAc,qBAAuB,WAAa,CAAC,GAAG,CAC7E,EACA,cAAc,EACd,IAAI,iBAAiB,QAAS,MAAO,OAAU,CAC7C,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,MAAM,IAAM,iBAAiB,IAAI,EACjC,GAAI,CAAC,IAAK,OACV,IAAI,SAAW,GACf,MAAM,MAAQ,MAAM,eAAe,CAAC,CAAE,GAAI,OAAO,GAAG,EAAG,SAAU,CAAE,CAAC,EAAG,CACrE,eAAgB,SAAI,KAAK,IAAI,wCAC7B,aAAc,CAAC,IAAI,CACrB,CAAC,GACG,QAAU,IAAQ,QAAU,YAAW,0BAA0B,KAAM,IAAI,EAC/E,cAAc,CAChB,CAAC,EACD,KAAK,SAAW,IAChB,KAAK,eAAiB,cACtB,UAAU,OAAO,GAAG,CACtB,CAEA,MAAM,qBAAwB,OAAU,CAClC,MAAM,OAAO,QAAQ,gCAAgC,IACzD,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,qBAAqB,KAAM,KAAM,cAAe,SAAS,EAC3D,EACA,UAAU,iBAAiB,QAAS,oBAAoB,EACxD,UAAU,iBAAiB,UAAY,OAAU,CAC3C,MAAM,MAAQ,SAAW,MAAM,MAAQ,MAC3C,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,qBAAqB,KAAM,KAAM,cAAe,SAAS,EAC3D,CAAC,EAED,KAAK,OAAO,SAAS,CACvB,EAEM,oBAAsB,CAAC,KAAM,aAAe,CAChD,MAAM,IAAM,IAAI,IAChB,OAAC,YAAY,OAAS,CAAC,GAAG,QAAS,MAAS,EACzC,KAAK,UAAY,CAAC,GAAG,QAAS,SAAY,CACzC,IAAI,IAAI,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,QAAQ,GAAG,GAAI,OAAO,CACnE,CAAC,CACH,CAAC,EACM,KAAK,IAAK,MAAS,CACxB,MAAM,IAAM,IAAI,IAAI,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,EACxE,GAAI,CAAC,IAAK,OAAO,KACjB,MAAM,WAAa,oBAAoB,GAAG,EAC1C,MAAO,CACL,GAAG,KACH,SAAU,IAAI,WAAa,KAAK,SAChC,SAAU,WAAW,SACrB,QAAS,WAAW,OACtB,CACF,CAAC,CACH,EAGM,kBAAoB,CAAC,KAAM,aAAc,YAAc,CAC3D,GAAI,CAAC,cAAc,OAAO,OAAQ,OAAO,KAEzC,IAAI,OAAS,oBAAoB,KAAM,YAAY,EACnD,MAAM,OAAS,OAAO,WAAa,aAAa,QAAU,gBAAgB,EACvE,KAAK,EACL,YAAY,EACT,SAAW,IAAI,IACnB,OAAO,IAAK,MAAS,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAC3E,EACM,QAAU,QAAQ,EAClB,OAAS,CAAC,EA8BhB,OA5BC,aAAa,OAAS,CAAC,GAAG,QAAS,MAAS,EAC1C,KAAK,UAAY,CAAC,GAAG,QAAS,SAAY,CACzC,MAAM,OAAS,GAAG,gBAAgB,KAAK,MAAM,CAAC,IAAI,QAAQ,GAAG,GAC7D,GAAI,SAAS,IAAI,MAAM,EAAG,OAC1B,MAAM,WAAa,oBAAoB,OAAO,EAC9C,GAAI,CAAC,WAAW,SAAU,OAE1B,MAAM,OAAS,QACX,QAAQ,YAAY,OAAQ,KAAK,OAAQ,QAAQ,GAAG,EACpD,GAAG,MAAM,IAAI,KAAK,MAAM,IAAI,QAAQ,GAAG,GAE3C,OAAO,KAAK,CACV,OACA,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,WAAY,QAAQ,IACpB,aAAc,QAAQ,OAAS,QAAQ,IACvC,QAAS,iBAAiB,MAAM,EAChC,SAAU,QAAQ,WAAa,KAAK,WAAa,KACjD,SAAU,GACV,QAAS,WAAW,QACpB,SAAU,GACV,WAAY,QAAU,QAAQ,aAAa,MAAM,EAAI,EACvD,CAAC,EACD,SAAS,IAAI,MAAM,CACrB,CAAC,CACH,CAAC,EAEI,OAAO,SACZ,OAAS,CAAC,GAAG,OAAQ,GAAG,MAAM,EAC9B,OAAO,KAAK,CAAC,EAAG,IACd,EAAE,OAAO,cAAc,EAAE,OAAQ,OAAW,CAAE,QAAS,EAAK,CAAC,CAC/D,GACO,MACT,EAGM,yBAA2B,IAAI,IAE/B,yBAA2B,CAAC,KAAM,SAAW,CACjD,GAAI,CAAC,OAAQ,OACb,MAAM,SAAW,OAAO,QAAQ,WAAW,QAAQ,GAAK,EAClD,MAAQ,IAAI,KACjB,OAAO,OAAS,CAAC,GAAG,QAAS,MAAS,CACrC,MAAM,KAAO,OAAO,MAAM,MAAQ,EAAE,EAAE,KAAK,EACrC,QAAU,OAAO,MAAM,SAAW,EAAE,EAAE,KAAK,EACjD,GAAI,CAAC,MAAQ,CAAC,QAAS,OACvB,MAAM,OAAS,gBAAgB,iBAAiB,QAAS,QAAQ,CAAC,EAClE,MAAM,IAAI,OAAQ,IAAI,EACtB,MAAM,KAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAC5B,MAAM,MAAM,IAAI,KAAM,IAAI,CAChC,CAAC,EACD,KAAK,QAAS,KAAQ,CACpB,MAAM,GAAK,OAAO,KAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAC5C,IAAI,yBAAyB,IAAI,GAAI,KAAK,CAChD,CAAC,CACH,EAEM,sBAAwB,CAAC,KAAM,SAAW,CAC9C,GAAI,kBAAoB,KAAM,OAAO,KACrC,MAAM,MACJ,yBAAyB,IAAI,OAAO,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,GACtE,yBAAyB,IAAI,OAAO,kBAAoB,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAClF,OAAK,OAAO,KACL,KAAK,IAAK,MAAS,CACxB,MAAM,OAAS,gBAAgB,KAAK,MAAM,EACpC,YAAc,MAAM,IAAI,MAAM,GAAK,MAAM,IAAI,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,EACvE,OAAK,YACE,CAAE,GAAG,KAAM,KAAM,WAAY,EADX,IAE3B,CAAC,EANwB,IAO3B,EAEM,mBAAsB,QAAW,CACrC,MAAM,OAAS,IAAI,IACnB,OAAC,QAAQ,OAAS,CAAC,GAAG,QAAS,MAAS,CACjC,KAAK,QACN,KAAK,IAAI,OAAO,IAAI,KAAK,GAAI,KAAK,KAAK,EACvC,KAAK,SAAW,MAAM,OAAO,IAAI,OAAO,KAAK,OAAO,EAAG,KAAK,KAAK,EACvE,CAAC,EACM,MACT,EAEM,iBAAmB,CAAC,KAAM,WAAa,CAC3C,GAAI,KAAK,MAAO,OAAO,KAAK,MAC5B,GAAI,KAAK,IAAM,SAAS,IAAI,KAAK,EAAE,EAAG,OAAO,SAAS,IAAI,KAAK,EAAE,EACjE,MAAM,QAAU,KAAK,SAAW,KAAO,OAAO,KAAK,OAAO,EAAI,GAC9D,OAAI,SAAW,SAAS,IAAI,OAAO,EAAU,SAAS,IAAI,OAAO,EAC1D,EACT,EAEM,WAAc,WAAe,UAAY,GAAG,SAAS,aAAe,KAEpE,uBAAyB,MAAO,UAAa,CACjD,KAAM,CAAC,MAAO,KAAK,EAAI,MAAM,QAAQ,IAAI,CACvC,iBAAiB,GAAG,aAAa,SAAS,QAAQ,GAAI,CAAC,EAAG,GAAK,EAC/D,iBAAiB,GAAG,aAAa,SAAS,QAAQ,GAAI,CAAC,EAAG,GAAK,CACjE,CAAC,EACD,GAAI,CAAC,MAAM,GAAI,MAAM,IAAI,MAAM,oCAAoC,MAAM,MAAM,IAAI,EACnF,MAAM,KAAO,MAAM,MAAM,KAAK,EACxB,OAAS,MAAM,GAAK,MAAM,MAAM,KAAK,EAAI,KAC/C,yBAAyB,CAAC,QAAQ,EAAG,MAAM,EAC3C,MAAM,SAAW,OAAS,mBAAmB,MAAM,EAAI,IAAI,IACrD,SAAW,OAAO,MAAM,WAAW,QAAQ,GAAK,EAChD,OAAS,KAAK,OAAS,CAAC,GAAG,IAAK,MAAS,CAC7C,MAAM,QAAU,OAAO,KAAK,SAAW,EAAE,EACnC,OAAS,iBAAiB,QAAS,QAAQ,EAC3C,UAAY,WAAW,iBAAiB,KAAM,QAAQ,CAAC,EACvD,SAAW,uBAAuB,KAAM,KAAK,KAAM,QAAS,QAAQ,EAAE,IAAK,IAAO,CACtF,IAAK,EAAE,IACP,MAAO,EAAE,MACT,UACA,SAAU,GACV,QAAS,IACX,EAAE,EACF,MAAO,CACL,OACA,KAAM,KAAK,KACX,UACA,QACF,CACF,CAAC,EACD,aAAM,KAAK,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,OAAQ,OAAW,CAAE,QAAS,EAAK,CAAC,CAAC,EAC5E,CACL,OAAQ,SACR,KAAM,KAAK,KACX,eAAgB,SAChB,KACF,CACF,EAEM,uBAAyB,SAAY,CACzC,GAAI,CAAC,uBAAwB,OAAO,KACpC,GAAI,uBAAwB,OAAO,uBACnC,GAAI,CAEF,MAAM,aAAe,uBAAuB,MAAM,GAAG,EAAE,CAAC,EAClD,IAAM,MAAM,iBAAiB,GAAG,YAAY,QAAQ,KAAK,IAAI,CAAC,GAAI,CAAE,MAAO,UAAW,EAAG,GAAI,EACnG,OAAK,IAAI,IACT,uBAAyB,MAAM,IAAI,KAAK,EACjC,wBAFa,IAGtB,MAAQ,CACN,OAAO,IACT,CACF,EAEM,kBAAoB,MAAO,QAAW,CAE1C,MAAM,SADO,MAAM,uBAAuB,IACpB,YAAY,MAAM,EACxC,OAAK,SAAS,OAAO,OACd,QAD6B,IAEtC,EAGM,yBAA2B,MAAO,MAAS,CAE/C,MAAM,UADO,MAAM,uBAAuB,IACnB,WAAa,CAAC,EACrC,IAAI,KAAO,KAiBX,OAhBC,MAAQ,CAAC,GAAG,QAAS,KAAQ,CAC5B,MAAM,OAAS,OAAO,KAAK,QAAU,EAAE,EACpC,KAAK,EACL,YAAY,EACf,GAAI,CAAC,OAAQ,OACb,MAAM,MAAQ,SAAS,MAAM,EACvB,MAAQ,OAAO,OAAO,cAAc,GAAK,EAC/C,GAAI,OAAS,EAAG,OAChB,MAAM,KAAO,OAAO,OAAO,MAAQ,KAAK,MAAQ,EAAE,EAEhD,sDAAsD,KAAK,IAAI,GAC/D,CAAC,YAAY,KAAK,IAAI,GACtB,CAAC,KAAK,KAAK,IAAI,IAEb,CAAC,MAAQ,MAAQ,KAAK,SAAO,KAAO,CAAE,OAAQ,KAAM,EAC1D,CAAC,EACG,MAAM,OAAe,KAAK,OAC1B,MAAM,KAAM,GAAM,OAAO,EAAE,MAAM,EAAE,YAAY,IAAM,UAAU,EAAU,WACtE,OAAO,CAAC,GAAG,QAAU,UAC9B,EAEM,sBAAwB,MAAO,QAAW,CAC9C,GAAI,CAAC,QAAS,OAAO,KACrB,GAAI,CACF,MAAM,IAAM,MAAM,iBAAiB,GAAG,OAAO,SAAS,mBAAmB,MAAM,CAAC,aAAa,EAC7F,GAAI,IAAI,GAAI,OAAO,IAAI,KAAK,EAC5B,QAAQ,KACN,oCAA8B,IAAI,MAAM,qBAAa,MAAM,+CAC7D,CACF,OAAS,MAAO,CACd,QAAQ,KAAK,qDAAgD,KAAK,CACpE,CACA,OAAO,IACT,EAEM,kBAAoB,MAAO,QAAW,CAC1C,MAAM,WAAa,MAAM,sBAAsB,MAAM,EACrD,GAAI,WAAY,OAAO,WACvB,MAAM,gBAAkB,MAAM,kBAAkB,MAAM,EACtD,OAAI,kBACA,CAAC,SAAW,CAAC,wBACf,QAAQ,KACN,6GACF,EAEK,KACT,EAEM,kBAAoB,CAAC,KAAM,CAAE,YAAc,EAAK,EAAI,CAAC,IAAM,CAC/D,GAAI,CAAC,UAAW,OAAO,WACvB,MAAM,UAAY,MAAQ,CAAC,GAAG,OAAQ,KAAQ,CAAC,YAAY,GAAG,CAAC,EACzD,SAAW,UAAU,MAC3B,UAAU,gBAAgB,EAC1B,SAAS,QAAS,KAAQ,CACxB,MAAM,OAAS,SAAS,cAAc,QAAQ,EAC9C,OAAO,MAAQ,IAAI,OACnB,OAAO,YAAc,kBAAkB,IAAI,MAAQ,IAAI,OAAQ,IAAI,MAAM,EACzE,UAAU,OAAO,MAAM,CACzB,CAAC,EACD,IAAI,WAAa,SACjB,OAAI,CAAC,UAAY,CAAC,SAAS,KAAM,GAAM,EAAE,SAAW,QAAQ,KACtD,SAAS,KAAM,GAAM,EAAE,SAAW,UAAU,EAC9C,WAAa,WACJ,SAAS,SAClB,WAAa,SAAS,CAAC,EAAE,SAG7B,UAAU,MAAQ,WACd,aAAa,qBAAqB,WAAY,CAAE,aAAc,EAAM,CAAC,EACzE,oBAAoB,gBAAgB,OAAS,EAAE,EACxC,UACT,EAEM,mBAAsB,WAAc,CACxC,MAAM,MAAQ,OAAO,WAAa,EAAE,EAAE,KAAK,EAC3C,OAAK,MACD,MAAM,SAAS,QAAQ,GAAK,MAAM,SAAS,mBAAmB,EAAU,oBACxE,MAAM,SAAS,UAAU,EAAU,oBACnC,MAAM,SAAS,SAAS,EAAU,mBAClC,MAAM,SAAS,OAAO,EAAU,eAChC,MAAM,SAAS,MAAM,EAAU,mBAC/B,MAAM,SAAS,IAAI,EAAU,KAC1B,MAPY,cAQrB,EAEM,aAAe,IAAI,IAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CAAC,EAC/E,WAAa,IAAI,IAAI,CACzB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,CAAC,EAEK,aAAe,CAAC,IAAK,aAAe,CACxC,MAAM,OAAS,OAAO,KAAK,QAAU,EAAE,EAAE,YAAY,EAC/C,IAAM,OAAO,KAAK,WAAa,EAAE,EAAE,KAAK,EAAE,YAAY,EAC5D,GAAI,aAAa,IAAI,MAAM,GAAK,QAAQ,KAAK,GAAG,GAAK,MAAQ,OAAS,MAAQ,MAC5E,MAAO,mBAET,GAAI,WAAW,IAAI,MAAM,GAAK,IAAI,WAAW,IAAI,EAC/C,MAAO,oBAET,GAAI,IAAI,WAAW,MAAM,GAAK,IAAI,WAAW,KAAK,EAAG,MAAO,mBAC5D,GAAI,IAAI,WAAW,IAAI,GAAK,IAAI,WAAW,KAAK,EAAG,MAAO,eAC1D,GAAI,IAAI,WAAW,IAAI,GAAK,IAAI,WAAW,IAAI,EAAG,MAAO,KACzD,GAAI,4BAA4B,KAAK,UAAU,GAAK,WAAW,KAAK,GAAG,EACrE,MAAO,oBAET,MAAM,WAAa,WAAW,MAAM,iBAAiB,EACrD,OAAI,WAAmB,mBAAmB,WAAW,CAAC,CAAC,EACnD,QAAQ,KAAK,UAAU,EAAU,mBACjC,YAAY,KAAK,UAAU,EAAU,oBAClC,cACT,EAEM,cAAiB,KAAQ,CAC7B,MAAM,WAAa,kBAAkB,OAAO,KAAK,MAAQ,KAAK,QAAU,EAAE,EAAE,KAAK,EAAG,KAAK,MAAM,EACzF,WAAa,WAAW,MAAM,iBAAiB,EAC/C,OAAS,aAAa,IAAK,UAAU,EACrC,YAAc,WAAa,WAAW,QAAQ,mBAAoB,EAAE,EAAE,KAAK,EAAI,WAC/E,YAAc,kBAAkB,GAAG,EACnC,YAAc,kBAAoB,MAAQ,EAAQ,YAClD,KAAO,YAAc,YAAc,WACnC,UAAY,YAAc,YAAc,YAC9C,MAAO,CACL,OAAQ,IAAI,OACZ,KACA,UACA,OACA,QAAS,OAAO,IAAI,UAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EACvD,WAAY,CAAC,WAAY,YAAa,YAAa,OAAQ,IAAI,SAAU,IAAI,OAAQ,IAAI,SAAS,EAC/F,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAY,CACjB,CACF,EAEM,qBAAuB,IAAM,CACjC,GAAI,CACF,MAAM,IAAM,aAAa,QAAQ,eAAe,EAC1C,OAAS,IAAM,KAAK,MAAM,GAAG,EAAI,CAAC,EACxC,OAAO,MAAM,QAAQ,MAAM,EAAI,OAAO,IAAI,MAAM,EAAE,OAAO,OAAO,EAAE,MAAM,EAAG,eAAe,EAAI,CAAC,CACjG,MAAQ,CACN,MAAO,CAAC,CACV,CACF,EAEM,kBAAqB,QAAW,CACpC,GAAI,CAAC,OAAQ,OACb,MAAM,OAAS,qBAAqB,EAAE,OAAQ,OAAU,QAAU,MAAM,EACxE,OAAO,QAAQ,MAAM,EACrB,aAAa,QAAQ,gBAAiB,KAAK,UAAU,OAAO,MAAM,EAAG,eAAe,CAAC,CAAC,CACxF,EAEM,qBAAuB,CAAC,OAAQ,CAAE,aAAe,EAAM,EAAI,CAAC,IAAM,CACtE,MAAM,SAAW,OAAO,QAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EACrD,cAAgB,WAClB,iBAAmB,SACnB,YAAc,GACd,iBAAiB,GAEnB,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,QAAQ,EAClD,OAAS,KAAO,cAAc,IAAI,EAAI,KACtC,MACJ,CAAC,aAAe,CAAC,SACb,0BACA,QAAQ,WAAa,QAAQ,MAAQ,MAAM,MAAQ,UAAY,gBACjE,kBAAiB,gBAAgB,YAAc,OAC/C,WAAa,WAAU,UAAU,MAAQ,UAC7C,eAAe,CACjB,EAEM,eAAiB,IAAM,CACvB,CAAC,aAAe,CAAC,aACrB,YAAY,OAAS,GACrB,WAAW,aAAa,gBAAiB,OAAO,EAChD,wBAA0B,GACtB,iBAAgB,eAAe,MAAQ,IAC7C,EAEM,cAAgB,IAAM,CACtB,CAAC,aAAe,CAAC,YAAc,CAAC,UACpC,oBAAoB,EAAE,EACtB,YAAY,OAAS,GACrB,WAAW,aAAa,gBAAiB,MAAM,EAC/C,wBAA0B,qBAAqB,UAC5C,OAAU,MAAM,SAAW,gBAC9B,EACA,OAAO,WAAW,IAAM,gBAAgB,MAAM,EAAG,CAAC,EACpD,EAEM,oBAAuB,OAAU,CACrC,GAAI,CAAC,QAAS,OACd,MAAM,EAAI,OAAO,OAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAC3C,cAAgB,IAAI,IAAI,qBAAqB,CAAC,EAC9C,QAAU,UAAU,IAAI,aAAa,EACrC,SAAW,EACb,QAAQ,OAAQ,OAAU,MAAM,WAAW,SAAS,CAAC,CAAC,EACtD,QAEE,QAAU,IAAI,IACpB,iBAAiB,QAAS,QAAW,QAAQ,IAAI,OAAQ,CAAC,CAAC,CAAC,EAG5D,MAAM,YAAe,EAAyB,CAAC,EAAtB,CAAC,GAAG,aAAa,EAuB1C,GArBA,SAAS,QAAS,OAAU,CAC1B,MAAM,OAAS,QAAQ,IAAI,MAAM,MAAM,EAAI,MAAM,OAAS,eACpD,YAAc,QAAQ,IAAI,MAAM,EACjC,YAAY,KAAM,MAAS,KAAK,SAAW,MAAM,MAAM,GAC1D,YAAY,KAAK,KAAK,CAE1B,CAAC,EAED,YAAY,QAAS,QAAW,CAC9B,SAAW,CAAC,CAAE,KAAK,IAAK,QAAS,CAC/B,MAAM,IAAM,MAAM,UAAW,MAAS,KAAK,SAAW,MAAM,EAC5D,GAAI,IAAM,EAAG,CACX,KAAM,CAAC,GAAG,EAAI,MAAM,OAAO,IAAK,CAAC,EACjC,MAAM,QAAQ,GAAG,CACnB,CACF,CACF,CAAC,EAED,QAAQ,gBAAgB,EACxB,qBAAuB,CAAC,EAEpB,CAAC,SAAS,OAAQ,CACpB,MAAM,MAAQ,SAAS,cAAc,GAAG,EACxC,MAAM,UAAY,4BAClB,MAAM,YAAc,qBACpB,QAAQ,OAAO,KAAK,EACpB,MACF,EAEiB,EACb,CAAC,CAAE,MAAO,iBAAkB,MAAO,QAAS,CAAC,EAC7C,iBAAiB,IAAK,QAAW,CAAE,MAAO,MAAO,QAAQ,IAAI,KAAK,GAAK,CAAC,CAAE,EAAE,EAAE,OAC3E,SAAY,QAAQ,MAAM,MAC7B,GAEK,QAAS,SAAY,CAC5B,GAAI,CAAC,QAAQ,MAAM,OAAQ,OAC3B,MAAM,QAAU,SAAS,cAAc,GAAG,EAC1C,QAAQ,UAAY,kCACpB,QAAQ,YAAc,QAAQ,MAC9B,QAAQ,OAAO,OAAO,EAEtB,QAAQ,MAAM,QAAS,OAAU,CAC/B,MAAM,IAAM,SAAS,cAAc,QAAQ,EAC3C,IAAI,KAAO,SACX,IAAI,UAAY,6BAChB,IAAI,QAAQ,UAAY,MAAM,OAC9B,IAAI,aAAa,OAAQ,QAAQ,EACjC,IAAI,aAAa,gBAAiB,MAAM,SAAW,iBAAmB,OAAS,OAAO,EAClF,MAAM,SAAW,kBAAkB,IAAI,UAAU,IAAI,aAAa,EAEtE,MAAM,KAAO,SAAS,cAAc,MAAM,EAK1C,GAJA,KAAK,UAAY,kCACjB,KAAK,YAAc,MAAM,WAAa,MAAM,KAE5C,IAAI,OAAO,IAAI,EACX,MAAM,QAAS,CACjB,MAAM,KAAO,SAAS,cAAc,MAAM,EAC1C,KAAK,UAAY,kCACjB,KAAK,YAAc,MAAM,QACzB,IAAI,OAAO,IAAI,CACjB,CAEA,IAAI,iBAAiB,QAAS,IAAM,CAClC,UAAU,MAAM,MAAM,CACxB,CAAC,EAED,QAAQ,OAAO,GAAG,EAClB,qBAAqB,KAAK,KAAK,CACjC,CAAC,CACH,CAAC,EAED,yBAAyB,uBAAuB,CAClD,EAEM,yBAA4B,OAAU,CAC1C,GAAI,CAAC,QAAS,OACd,MAAM,QAAU,CAAC,GAAG,QAAQ,iBAAiB,6BAA6B,CAAC,EAC3E,QAAQ,QAAQ,CAAC,IAAK,MAAQ,CAC5B,IAAI,UAAU,OAAO,iBAAkB,MAAQ,KAAK,CACtD,CAAC,EACD,MAAM,OAAS,QAAQ,KAAK,EACxB,QAAQ,OAAO,eAAe,CAAE,MAAO,SAAU,CAAC,CACxD,EAEM,UAAa,QAAW,CAC5B,GAAI,CAAC,QAAU,SAAW,iBAAkB,CAC1C,eAAe,EACf,MACF,CACA,kBAAkB,MAAM,EACxB,eAAe,EACX,YAAW,UAAU,MAAQ,QACjC,qBAAqB,OAAQ,CAAE,aAAc,EAAK,CAAC,EAEnD,GAAI,CACF,MAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxC,IAAI,aAAa,IAAI,MAAO,MAAM,EAClC,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,GAAG,CACzC,MAAQ,CAER,CACA,QAAQ,MAAM,EAAE,MAAO,OAAU,CAC/B,MAAQ,CAAC,EACT,aAAa,MAAM,QAAS,OAAO,EACnC,OAAO,CACT,CAAC,CACH,EAEM,cAAgB,IAAM,CAC1B,YAAY,iBAAiB,QAAU,OAAU,CAC/C,MAAM,gBAAgB,EACL,WAAW,aAAa,eAAe,IAAM,OAChD,eAAe,EACxB,cAAc,CACrB,CAAC,EAED,aAAa,iBAAiB,QAAU,OAAU,CAChD,MAAM,gBAAgB,CACxB,CAAC,EAED,gBAAgB,iBAAiB,QAAS,IAAM,CAC9C,wBAA0B,GAC1B,oBAAoB,eAAe,KAAK,CAC1C,CAAC,EAED,gBAAgB,iBAAiB,UAAY,OAAU,CACrD,GAAI,MAAM,MAAQ,YAChB,MAAM,eAAe,EACrB,wBAA0B,KAAK,IAC7B,wBAA0B,EAC1B,qBAAqB,OAAS,CAChC,EACA,yBAAyB,uBAAuB,UACvC,MAAM,MAAQ,UACvB,MAAM,eAAe,EACrB,wBAA0B,KAAK,IAAI,wBAA0B,EAAG,CAAC,EACjE,yBAAyB,uBAAuB,UACvC,MAAM,MAAQ,QAAS,CAChC,MAAM,eAAe,EACrB,MAAM,MAAQ,qBAAqB,uBAAuB,EACtD,OAAO,UAAU,MAAM,MAAM,CACnC,MAAW,MAAM,MAAQ,WACvB,MAAM,eAAe,EACrB,eAAe,EACf,YAAY,MAAM,EAEtB,CAAC,EAED,SAAS,iBAAiB,QAAU,OAAU,CACtC,MAAM,kBAAkB,OACzB,WAAW,SAAS,MAAM,MAAM,GAAG,eAAe,EACzD,CAAC,EAED,SAAS,iBAAiB,UAAY,OAAU,CAC1C,MAAM,MAAQ,UACd,aAAe,CAAC,YAAY,SAC9B,eAAe,EACf,YAAY,MAAM,EAEtB,CAAC,CACH,EAEM,eAAiB,SAAY,CACjC,IAAI,QAAU,CAAC,EACX,UAAY,CAAC,EACjB,GAAI,QACF,GAAI,CACF,MAAM,IAAM,MAAM,iBAAiB,GAAG,OAAO,OAAO,EACpD,GAAI,IAAI,GAAI,CACV,MAAM,QAAU,MAAM,IAAI,KAAK,EAC/B,QAAU,MAAM,QAAQ,OAAO,EAAI,QAAU,QAAQ,MAAQ,CAAC,CAChE,CACF,MAAQ,CAER,CAEF,GAAI,eACF,GAAI,CACF,MAAM,IAAM,MAAM,MAAM,cAAc,EAClC,IAAI,KAEN,WADa,MAAM,IAAI,KAAK,GACX,MAAQ,CAAC,EAE9B,MAAQ,CAER,CAGF,MAAM,SAAW,IAAI,IACrB,QAAQ,QAAS,KAAQ,CACvB,MAAM,OAAS,OAAO,KAAK,QAAU,EAAE,EACpC,KAAK,EACL,YAAY,EACX,QAAQ,SAAS,IAAI,OAAQ,GAAG,CACtC,CAAC,EACD,UAAU,QAAS,KAAQ,CACzB,MAAM,OAAS,OAAO,KAAK,QAAU,EAAE,EACpC,KAAK,EACL,YAAY,EACf,GAAI,CAAC,OAAQ,OACb,MAAM,SAAW,SAAS,IAAI,MAAM,EACpC,GAAI,CAAC,SAAU,CACb,SAAS,IAAI,OAAQ,GAAG,EACxB,MACF,CACA,SAAS,IAAI,OAAQ,CACnB,GAAG,SACH,KAAM,IAAI,MAAQ,SAAS,KAC3B,YAAa,IAAI,aAAe,SAAS,aAAe,SAAS,YACjE,UAAW,SAAS,WAAa,IAAI,UACrC,SAAU,SAAS,UAAY,IAAI,QACrC,CAAC,CACH,CAAC,EACD,MAAM,OAAS,CAAC,GAAG,SAAS,OAAO,CAAC,EACpC,GAAI,OAAO,OAAQ,OAAO,OAC1B,GAAI,CAAC,QAAQ,QAAU,CAAC,UAAU,OAChC,MAAM,IAAI,MAAM,wCAAwC,EAE1D,MAAO,CAAC,CAAE,OAAQ,WAAY,KAAM,mBAAoB,UAAW,MAAO,CAAC,CAC7E,EAEM,QAAU,MAAO,QAAW,CAChC,MAAM,SAAW,iBAAiB,MAAM,GAAK,OAC7C,iBAAmB,SACnB,YAAc,GACd,wBAA0B,wBAAwB,QAAQ,EAC1D,YAAY,yBAAoB,EAChC,kBAAkB,QAAQ,EAC1B,iBAAiB,EACjB,qBAAqB,SAAU,CAAE,aAAc,EAAK,CAAC,EACrD,GAAI,CACF,MAAM,KAAO,UAAU,KAAM,GAAM,EAAE,SAAW,QAAQ,EAElD,SACJ,OAAO,MAAM,WAAa,EAAE,EAAE,KAAK,IAClC,WAAa,OAAS,mBAAmB,QAAQ,IAAM,MAAQ,OAAS,IAC3E,IAAI,aAAe,KACnB,GAAI,CACF,aAAe,MAAM,kBAAkB,QAAQ,CACjD,OAAS,MAAO,CACd,QAAQ,KAAK,iCAA4B,KAAK,CAChD,CACA,IAAI,SAAW,KACX,aAAe,KACf,gBAAkB,EAElB,eAAiB,KACrB,GAAI,CACF,eAAiB,MAAM,sBAAsB,QAAQ,CACvD,OAAS,MAAO,CACd,QAAQ,KAAK,2CAAsC,KAAK,CAC1D,CAEA,GAAI,gBAAgB,OAAO,OAAQ,CAIjC,GAHA,SAAW,mBAAmB,eAAgB,QAAQ,EACtD,aAAe,eACf,gBAAkB,OAAO,eAAe,gBAAkB,eAAe,WAAW,GAAK,EACrF,SACF,GAAI,CACF,MAAM,WAAa,MAAM,uBAAuB,QAAQ,EACxD,gBAAkB,iBAAmB,OAAO,WAAW,cAAc,GAAK,EAC1E,MAAM,YAAc,yBAAyB,IAAI,OAAO,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,EAClF,aAAa,yBAAyB,IAAI,OAAO,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAG,WAAW,EAChG,aAAe,mBAAmB,aAAc,UAAU,EACtD,SAAS,KAAM,GAAM,CAAC,EAAE,QAAQ,IAClC,SAAW,qBAAqB,SAAU,UAAU,EAExD,OAAS,MAAO,CACd,QAAQ,KAAK,+CAA0C,KAAK,CAC9D,CAEE,eACF,SAAW,kBAAkB,SAAU,aAAc,QAAQ,EAEjE,SAAW,UAAY,MAAM,UAAW,CACtC,MAAM,GAAK,UAAY,KAAK,UAC5B,IAAI,SAAW,KACf,QAAS,QAAU,EAAG,QAAU,GAAK,CAAC,UAAU,OAAQ,SAAW,EACjE,GAAI,CACF,MAAM,WAAa,MAAM,uBAAuB,EAAE,EAClD,gBAAkB,OAAO,WAAW,cAAc,GAAK,EACvD,MAAM,YAAc,yBAAyB,IAAI,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAC5E,aACF,yBAAyB,IAAI,OAAO,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAG,WAAW,EAEjF,SAAW,mBAAmB,WAAY,QAAQ,EAClD,aAAe,WACf,IAAI,cAAgB,aACpB,GAAI,CAAC,cACH,GAAI,CACF,cAAgB,MAAM,kBAAkB,QAAQ,CAClD,OAAS,MAAO,CACd,QAAQ,KAAK,uCAAkC,KAAK,CACtD,CAEE,gBACF,SAAW,kBAAkB,SAAU,cAAe,QAAQ,EAElE,OAAS,MAAO,CACd,SAAW,MACX,QAAQ,KAAK,gDAA0C,QAAU,CAAC,IAAK,KAAK,CAC9E,CAEE,CAAC,UAAU,QAAU,UACvB,QAAQ,KAAK,uDAAkD,QAAQ,CAE3E,SAAW,WAAa,OAAS,eAAgB,CAC/C,MAAM,aAAe,MAAM,iBAAiB,eAAgB,CAAC,EAAG,GAAI,EACpE,GAAI,CAAC,aAAa,GAAI,MAAM,IAAI,MAAM,oCAAiC,EACvE,MAAM,iBAAmB,MAAM,aAAa,KAAK,EACjD,SAAW,mBAAmB,iBAAkB,QAAQ,EACxD,aAAe,iBACf,MAAM,cAAgB,cAAiB,MAAM,kBAAkB,QAAQ,EAAE,MAAM,IAAM,IAAI,EACrF,gBAAe,SAAW,kBAAkB,SAAU,cAAe,QAAQ,EACnF,CAGA,GAAI,CAAC,UAAU,SACb,MAAM,mBAAmB,EACrB,uBAAuB,MAAM,CAC/B,MAAM,SAAW,CAAC,EAClB,uBAAuB,QAAQ,CAAC,QAAS,UAAY,CACnD,KAAM,CAAC,WAAY,IAAK,MAAM,EAAI,QAAQ,MAAM,GAAG,EACnD,GAAI,aAAe,SAAU,OAC7B,MAAM,QAAU,QAAQ,EAClB,OAAS,QACX,QAAQ,YAAY,SAAU,IAAK,MAAM,EACzC,GAAG,QAAQ,IAAI,GAAG,IAAI,MAAM,GAChC,SAAS,KAAK,CACZ,OACA,OAAQ,IACR,KAAM,OAAO,QAAQ,OAAS,EAAE,EAAE,MAAM,QAAG,EAAE,CAAC,EAAE,KAAK,GAAK,QAAQ,OAAS,IAC3E,WAAY,oBAAoB,MAAM,EACtC,aACE,SAAW,UAAY,eAAiB,SAAW,OAAS,OAAS,SACvE,QAAS,iBAAiB,QAAQ,EAClC,SAAU,KACV,SAAU,GACV,QACA,SAAU,GACV,WAAY,QAAU,QAAQ,aAAa,MAAM,EAAI,EACvD,CAAC,CACH,CAAC,EACG,SAAS,SACX,SAAS,KAAK,CAAC,EAAG,IAChB,EAAE,OAAO,cAAc,EAAE,OAAQ,OAAW,CAAE,QAAS,EAAK,CAAC,CAC/D,EACA,SAAW,SAEf,CAGF,GAAI,CAAC,UAAU,OACb,MAAM,IAAI,MACR,aAAQ,MAAM,MAAQ,QAAQ,uEAChC,EAGF,wBAA0B,wBAAwB,SAAU,eAAe,EAC3E,qBAAqB,SAAU,YAAY,EAC3C,gBAAkB,SAElB,GAAI,CACF,MAAM,mBAAmB,CAC3B,MAAQ,CAER,CACA,MAAQ,wBAAwB,EAC5B,cAAa,YAAY,MAAQ,IACrC,aAAa,EACT,WAAU,SAAS,OAAS,IAChC,aAAa,EACb,OAAO,EACP,MAAM,4BAA4B,EAClC,MAAM,eAAe,CAAE,SAAU,SAAU,MAAO,SAAU,CAAC,CAC/D,OAAS,MAAO,CACd,mBAAa,EACb,MAAQ,CAAC,EACT,gBAAkB,CAAC,EACf,SAAQ,OAAO,YAAc,OAAO,yBAA2B,QAAG,GAClE,WAAU,SAAS,YAAc,UACjC,kBAAiB,gBAAgB,OAAS,IACxC,KACR,CACF,EAEA,KAAK,cAAc,2BAA2B,GAAG,iBAAiB,QAAU,OAAU,CACpF,MAAM,eAAe,EAChB,uBAAuB,CAC9B,CAAC,EAED,KAAK,cAAc,kCAAkC,GAAG,iBAAiB,QAAU,OAAU,CAC3F,MAAM,eAAe,EAChB,uBAAuB,CAC9B,CAAC,EAED,aAAa,iBAAiB,QAAS,IAAM,OAAO,CAAC,EAErD,oBAAoB,iBAAiB,QAAU,OAAU,CACvD,MAAM,KAAO,MAAM,OAAO,QAAQ,uBAAuB,EACzD,GAAI,CAAC,KAAM,OACX,MAAM,IAAM,KAAK,QAAQ,cACzB,GAAI,MAAQ,MAAO,CACjB,aAAa,EACb,OAAO,EACP,MACF,CAEA,mBAAmB,cAAc,6BAA6B,GAAG,UAAU,OAAO,WAAW,EAC7F,mBACG,cAAc,6BAA6B,GAC1C,aAAa,eAAgB,OAAO,EAExC,KAAK,UAAU,OAAO,WAAW,EACjC,MAAM,OAAS,KAAK,UAAU,SAAS,WAAW,EAOlD,GANA,KAAK,aAAa,eAAgB,OAAS,OAAS,OAAO,EACvD,OACF,eAAe,IAAI,GAAG,EAEtB,eAAe,OAAO,GAAG,EAEvB,eAAe,OAAS,EAAG,CAC7B,MAAM,QAAU,mBAAmB,cAAc,6BAA6B,EAC9E,SAAS,UAAU,IAAI,WAAW,EAClC,SAAS,aAAa,eAAgB,MAAM,CAC9C,CACA,OAAO,CACT,CAAC,EAED,kBAAkB,iBAAiB,SAAU,IAAM,OAAO,CAAC,EAE3D,qBAAqB,iBAAiB,SAAU,IAAM,OAAO,CAAC,EAE9D,aAAa,iBAAiB,QAAS,uBAAuB,EAE9D,YAAY,iBAAiB,uBAAuB,EAAE,QAAS,KAAQ,CACrE,IAAI,iBAAiB,QAAS,wBAAwB,CACxD,CAAC,EAED,iBAAiB,iBAAiB,QAAS,kBAAkB,EAE7D,gBAAgB,iBAAiB,2BAA2B,EAAE,QAAS,KAAQ,CAC7E,IAAI,iBAAiB,QAAS,mBAAmB,CACnD,CAAC,EAED,0BAA0B,iBAAiB,QAAS,IAAM,CACxD,oBAAoB,EACpB,OAAO,uBAAuB,KAAK,CACrC,CAAC,EAED,SAAS,iBAAiB,UAAY,OAAU,CAC9C,GAAI,MAAM,MAAQ,SAClB,IAAI,YAAc,CAAC,WAAW,OAAQ,CACpC,yBAAyB,EACzB,MACF,CACI,gBAAkB,CAAC,eAAe,QACpC,oBAAoB,EAExB,CAAC,EAED,SAAS,iBAAiB,eAAgB,IAAM,CACzC,4BAA4B,CACnC,CAAC,EAEG,OAAO,WAAc,YAAc,OAAO,eAAmB,KAC/D,UAAU,eAAe,WAAa,OAAU,CAC9C,GAAI,OAAO,SAAW,eAAgB,OACjC,4BAA4B,EACjC,YAAY,EACZ,MAAM,UAAY,OAAO,kBAAoB,KAAO,OAAO,MAAM,gBAAgB,EAAI,GACrF,GAAI,CAAC,UAAW,OAChB,MAAM,KAAO,MAAM,KAAM,OAAU,iBAAiB,KAAK,IAAM,SAAS,EACnE,MACL,0BAA0B,KAAM,kBAAkB,IAAI,CAAC,CACzD,CAAC,EAGH,kBAAkB,EAClB,cAAc,EAcd,iBAZmC,IAAM,CACvC,MAAM,QAAU,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,EACtE,GAAI,UAAY,MAAQ,UAAY,KAAM,OAAO,QACjD,GAAI,CACF,MAAM,OAAS,eAAe,QAAQ,mBAAmB,EACzD,GAAI,SAAW,MAAQ,SAAW,KAAM,OAAO,MACjD,MAAQ,CAER,CACA,MAAO,IACT,GAE6C,EAC7C,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAEf,KAAK,cAAc,qBAAqB,GAAG,iBAAiB,QAAU,OAAU,CAC9E,MAAM,OAAS,MAAM,OAAO,QAAQ,2BAA2B,EAC/D,GAAI,CAAC,OAAQ,OACb,MAAM,KAAO,OAAO,QAAQ,mBAAqB,KAAO,KAAO,KAC/D,GAAI,OAAS,gBAAiB,OAC9B,MAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACpC,OAAS,KAAM,IAAI,aAAa,IAAI,OAAQ,IAAI,EAC/C,IAAI,aAAa,OAAO,MAAM,EACnC,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,GAAG,EAClC,wBAAwB,IAAI,CACnC,CAAC,GAEA,SAAY,CACX,GAAI,CAEF,GAAI,CAAC,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,MAAM,EACzD,GAAI,CACF,MAAM,OAAS,eAAe,QAAQ,mBAAmB,EACrD,SAAW,MAAQ,SAAW,OAChC,eAAe,QAAQ,oBAAqB,IAAI,EAChD,gBAAkB,KAClB,qBAAqB,EAEzB,MAAQ,CAER,CAEF,MAAM,oBAAsB,kBAAoB,KAAO,qBAAqB,EAAI,KAEhF,WADgB,MAAM,eAAe,GACb,CAAC,GAAG,OAAQ,KAAQ,CAAC,YAAY,GAAG,CAAC,EACzD,qBAAqB,MAAM,oBAC/B,MAAM,aAAe,wBAAwB,EACvC,gBAAkB,aAAe,iBAAiB,aAAc,SAAS,EAAI,GACnF,IAAI,cAAgB,kBAAkB,UAAW,CAAE,YAAa,EAAM,CAAC,EAMvE,GALI,iBAAmB,UAAU,KAAM,GAAM,EAAE,SAAW,eAAe,EACvE,cAAgB,gBACN,kBACV,cAAgB,MAAM,yBAAyB,SAAS,GAEtD,gBACE,YAAW,UAAU,MAAQ,eACjC,qBAAqB,cAAe,CAAE,aAAc,EAAK,CAAC,EAC1D,oBAAoB,gBAAgB,OAAS,EAAE,EAE3C,CAAC,cACH,GAAI,CACF,MAAM,IAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxC,IAAI,aAAa,IAAI,MAAO,aAAa,EACzC,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAI,GAAG,CACzC,MAAQ,CAER,CAGJ,MAAM,oBAAsB,mBAAmB,EAE/C,MAAM,QAAQ,KAAK,CACjB,oBACA,IAAI,QAAS,SAAY,OAAO,WAAW,QAAS,IAAK,CAAC,CAC5D,CAAC,EACD,MAAM,QAAQ,eAAiB,iBAAmB,UAAU,EAC5D,MAAM,oBACF,gBAAgB,SAClB,MAAQ,wBAAwB,GAElC,MAAM,4BAA4B,EAClC,aAAa,EACb,KAAK,UAAU,OAAO,cAAc,EACpC,KAAK,UAAU,IAAI,UAAU,EAC7B,OAAO,CACT,OAAS,MAAO,CACd,aAAa,EACb,KAAK,UAAU,OAAO,cAAc,EACpC,KAAK,UAAU,IAAI,UAAU,EAC7B,aAAa,MAAM,QAAS,OAAO,EACnC,OAAO,CACT,CACF,GAAG,CACL,GAAG",
  "names": ["slots", "items"]
}
