{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/tdhq-wishlist.js?b=20260923b"],
  "sourcesContent": ["/* ============================================================\n   TDHQ wishlist - tdhq-wishlist.js\n\n   Save products for later. Both competitors checked (MyCarCleaning and Slim's\n   Detailing) have this on every product; TDHQ had none.\n\n   WHY NOT THE THEME'S EXISTING ONE: the Ecomus base ships a wishlist\n   (`<hdt-wishlist>`, `settings.wishlist_mode`) but it is dead here \u2014 the mode is\n   set to \"0\" and `assets/custom.js`, which defines the custom element, is never\n   loaded by the layout. It is the third dead Ecomus subsystem in this theme\n   after the cart drawer and the mobile toolbar. Reviving it would also render\n   Ecomus card markup rather than the theme's own.\n\n   STORAGE is localStorage, so it is per-device and needs no account and no app.\n   The page says so in plain words rather than implying the list follows the\n   shopper around \u2014 a saved list that silently vanishes on another device is\n   worse than one that told you where it lived.\n\n   RENDERING reuses the server. The wishlist page fetches\n   /products/<handle>?view=card and injects the response, so a saved product\n   uses the SAME card snippet as the collections and the homepage. Building card\n   markup again here is how two card designs drift apart, which this theme has\n   already suffered once.\n   ============================================================ */\n(function () {\n  'use strict';\n\n  var KEY = 'tdhq:wishlist:v1';\n\n  function read() {\n    try {\n      var raw = JSON.parse(localStorage.getItem(KEY));\n      return Array.isArray(raw) ? raw.filter(function (h) { return typeof h === 'string' && h; }) : [];\n    } catch (e) {\n      return [];\n    }\n  }\n\n  function write(list) {\n    try { localStorage.setItem(KEY, JSON.stringify(list)); } catch (e) { /* private mode */ }\n  }\n\n  function has(handle) { return read().indexOf(handle) !== -1; }\n\n  function toggle(handle) {\n    var list = read();\n    var i = list.indexOf(handle);\n    if (i === -1) { list.unshift(handle); } else { list.splice(i, 1); }\n    write(list);\n    return i === -1;\n  }\n\n  /* Reflect saved state on every button for a handle \u2014 a product can appear in\n     more than one row on the same page (recently viewed and a product row, say)\n     and both hearts must agree. */\n  function paint(scope) {\n    var list = read();\n    var buttons = (scope || document).querySelectorAll('[data-tdhq-wish]');\n    for (var i = 0; i < buttons.length; i++) {\n      var b = buttons[i];\n      var on = list.indexOf(b.getAttribute('data-handle')) !== -1;\n      /* only what changed: a same-value write still invalidates the element's style */\n      var pressed = on ? 'true' : 'false';\n      if (b.getAttribute('aria-pressed') !== pressed) b.setAttribute('aria-pressed', pressed);\n      if (b.classList.contains('is-saved') !== on) b.classList.toggle('is-saved', on);\n      var label = b.getAttribute(on ? 'data-label-saved' : 'data-label-save');\n      if (label && b.getAttribute('aria-label') !== label) b.setAttribute('aria-label', label);\n      /* The product-page button also carries a VISIBLE label. Card hearts have\n         no text node, so this is skipped there rather than special-cased. */\n      var text = b.querySelector('[data-tdhq-wish-text]');\n      if (text) text.textContent = on ? 'Saved' : 'Save for later';\n    }\n    /* The route to the saved items is worth showing once there is something to\n       look at. It follows the LIST, not a button: it used to be set inside the\n       loop above, so the last heart on the page - a related product's, usually\n       unsaved - decided it, and saving this product left the link hidden. */\n    var links = document.querySelectorAll('[data-tdhq-wish-link]');\n    for (var k = 0; k < links.length; k++) { links[k].hidden = list.length === 0; }\n    var counts = document.querySelectorAll('[data-tdhq-wish-count]');\n    for (var c = 0; c < counts.length; c++) {\n      counts[c].textContent = list.length;\n      counts[c].hidden = list.length === 0;\n    }\n  }\n\n  /* Buttons that arrive after load (quick view) are painted by their owner. */\n  window.tdhqWishPaint = paint;\n\n  function announce(message) {\n    var live = document.getElementById('tdhq-quickadd-live');\n    if (!live) return;\n    live.textContent = '';\n    window.requestAnimationFrame(function () { live.textContent = message; });\n  }\n\n  document.addEventListener('click', function (event) {\n    var btn = event.target.closest ? event.target.closest('[data-tdhq-wish]') : null;\n    if (!btn) return;\n    event.preventDefault();\n    var handle = btn.getAttribute('data-handle');\n    if (!handle) return;\n    var added = toggle(handle);\n    paint(document);\n    announce((btn.getAttribute('data-title') || 'Item') + (added ? ' saved for later' : ' removed from saved items'));\n    if (added) { bump(); }\n\n    /* In a saved list - the page or the panel - removing an item must remove\n       its card too, otherwise the heart goes empty and the product stays. */\n    var grid = btn.closest('[data-tdhq-wishlist-grid], [data-tdhq-saved-list]');\n    if (grid && !added) {\n      var card = btn.closest('.tdhq-pcard');\n      if (card) { leave(card, grid); }\n    }\n\n    /* Saving from the recently viewed row of an empty panel: the panel has a\n       saved list to show now, so it redraws as one (and the row steps aside). */\n    if (added && btn.closest('[data-tdhq-saved-recent]')) {\n      var dlg = btn.closest('[data-tdhq-saved]');\n      var savedGrid = dlg && dlg.querySelector('[data-tdhq-saved-list]');\n      if (savedGrid) { renderList(savedGrid); }\n    }\n  });\n\n  /* The count badges pop once when something is saved, so the shopper sees\n     WHERE it went - the heart in the header, or the Saved tab on a phone. */\n  function bump() {\n    var counts = document.querySelectorAll('[data-tdhq-wish-count]');\n    for (var i = 0; i < counts.length; i++) {\n      var el = counts[i];\n      el.classList.remove('is-bump');\n      void el.offsetWidth; /* restart the animation if it is already running */\n      el.classList.add('is-bump');\n    }\n  }\n\n  /* A removed card fades and shrinks out, and the cards that stay glide into its place instead of jumping\n     (21 Oct): TdhqMotion.leave, then TdhqMotion.flip, the site's one motion system. */\n  function leave(card, grid) {\n    var M = window.TdhqMotion;\n    var done = function () {\n      var drop = function () { if (card.parentNode) { card.parentNode.removeChild(card); } };\n      if (M) { M.flip(grid, '.tdhq-pcard', drop); } else { drop(); }\n      if (!grid.querySelector('.tdhq-pcard')) { renderList(grid); }\n    };\n    if (M) { M.leave(card, done); } else { done(); }\n  }\n\n  /* ---- the wishlist page ---- */\n\n  /* The empty state that belongs to a grid: the page's sits beside its grid,\n     the panel's inside the panel body. */\n  function emptyFor(grid) {\n    if (grid.hasAttribute('data-tdhq-saved-list')) {\n      var panel = grid.closest('[data-tdhq-saved]');\n      return panel ? panel.querySelector('[data-tdhq-saved-empty]') : null;\n    }\n    return document.querySelector('[data-tdhq-wishlist-empty]');\n  }\n\n  function renderPage() {\n    var grid = document.querySelector('[data-tdhq-wishlist-grid]');\n    if (grid) { renderList(grid); }\n  }\n\n  function renderList(grid) {\n    var empty = emptyFor(grid);\n    var list = read();\n    grid.setAttribute('data-rendered', list.join('|'));\n    /* the panel's grid, not the page's: only the panel has a recently viewed row */\n    var dlg = grid.hasAttribute('data-tdhq-saved-list') ? grid.closest('[data-tdhq-saved]') : null;\n\n    if (!list.length) {\n      grid.innerHTML = '';\n      grid.hidden = true;\n      if (empty) { empty.hidden = false; if (window.TdhqMotion) { window.TdhqMotion.show(empty); } }\n      if (dlg) { renderRecent(dlg); }\n      return;\n    }\n    grid.hidden = false;\n    if (empty) empty.hidden = true;\n    if (dlg) { hideRecent(dlg); }\n\n    /* Placeholders while the cards load, one per saved item up to a screenful,\n       so the panel opens at its working size instead of growing as they land. */\n    grid.setAttribute('aria-busy', 'true');\n    grid.innerHTML = '';\n    for (var g = 0; g < Math.min(list.length, 6); g++) {\n      var ghost = document.createElement('div');\n      ghost.className = 'tdhq-saved-ghost';\n      ghost.setAttribute('aria-hidden', 'true');\n      grid.appendChild(ghost);\n    }\n\n    /* Fetch every saved product's card in parallel, then insert in SAVED order.\n       Promise order is not response order, so the results are placed by index\n       rather than appended as they arrive. */\n    Promise.all(list.map(fetchCard)).then(function (cards) {\n      var frag = document.createDocumentFragment();\n      var missing = [];\n      cards.forEach(function (html, i) {\n        if (!html) { missing.push(list[i]); return; }\n        /* innerHTML is deliberate and the input is not user content: this string\n           is the response from OUR OWN storefront rendering OUR OWN card\n           template, same-origin, for a handle that was url-encoded before the\n           request. The stored value is only ever a product handle \u2014 a shopper\n           cannot put markup into it, and a handle that does not resolve returns\n           null above and is dropped. This is the same mechanism Shopify's own\n           Section Rendering pattern uses. */\n        var holder = document.createElement('div');\n        holder.innerHTML = html;\n        var card = holder.firstElementChild;\n        /* the grid carries data-dtc-appear, so the cards stagger in by themselves */\n        if (card) frag.appendChild(card);\n      });\n      grid.innerHTML = '';\n      grid.appendChild(frag);\n      grid.removeAttribute('aria-busy');\n\n      /* A product that no longer resolves has been deleted or unpublished.\n         Drop it from storage rather than leaving a permanent gap. */\n      if (missing.length) {\n        write(read().filter(function (h) { return missing.indexOf(h) === -1; }));\n      }\n      paint(document);\n      if (!grid.querySelector('.tdhq-pcard')) {\n        grid.hidden = true;\n        if (empty) { empty.hidden = false; if (window.TdhqMotion) { window.TdhqMotion.show(empty); } }\n        if (dlg) { renderRecent(dlg); }\n      }\n    });\n  }\n\n  /* One product's card from the card-only template, or null. Shared by the\n     saved list and the recently viewed row, so both render the same card. */\n  function fetchCard(handle) {\n    return fetch('/products/' + encodeURIComponent(handle) + '?view=card', { headers: { 'Accept': 'text/html' } })\n      .then(function (r) { return r.ok ? r.text() : null; })\n      .catch(function () { return null; });\n  }\n\n  /* ---- the empty panel: recently viewed, or the merchant's suggestions ----\n\n     An empty Saved panel was a heart, one sentence and a button at the top of\n     a full-height sheet. Measured at 1440 the button ended at y=360 and the\n     next thing below it was the 'Saved on this device.' note at y=855: 495px\n     of white (audit home-24). Under the message there is now a row of cards:\n     - the shopper's own recently viewed products, which dtc-core.js already\n       records on every product page (dtc_recent_v1), in stock first and sold\n       out last like every product row on the site;\n     - with no history (a first visit), the collection picked in the header's\n       \"Saved panel suggestions\" setting, in the merchant's own order with\n       in-stock products first, under the heading set there.\n     Products already saved and the product on screen are left out. The row is\n     rendered hidden by the header section (so dtc-core.js has armed its drag\n     rail at load) and is moved into the panel body here. With neither source\n     there is no row, and tdhq-fix-chrome.css centres the message instead. */\n  var RECENT_KEY = 'dtc_recent_v1';\n  var RECENT_MAX = 6;\n\n  function handleOf(url) {\n    var h = typeof url === 'string' ? url.split('/products/')[1] : '';\n    return h ? h.split('?')[0].split('#')[0] : '';\n  }\n\n  /* saved products and the one on screen never appear in the row */\n  function rowSkip() {\n    var skip = read();\n    var cur = document.querySelector('[data-dtc-current-product]');\n    if (cur) {\n      try { skip.push(handleOf(JSON.parse(cur.textContent).url)); } catch (e) { /* not a product page */ }\n    }\n    return skip;\n  }\n\n  function recentHandles(skip) {\n    var raw;\n    try { raw = JSON.parse(localStorage.getItem(RECENT_KEY)); } catch (e) { raw = null; }\n    if (!Array.isArray(raw)) { return []; }\n    var out = [];\n    raw.forEach(function (p) {\n      var h = handleOf(p && p.url);\n      if (h && skip.indexOf(h) === -1 && out.indexOf(h) === -1) { out.push(h); }\n    });\n    return out;\n  }\n\n  /* The header prints the suggestion handles, already in-stock first. A blank\n     heading means no collection is set, and a row is never shown unlabelled. */\n  function suggestedHandles(box, skip) {\n    var el = box.querySelector('[data-tdhq-saved-suggest]');\n    var data = null;\n    try { data = el ? JSON.parse(el.textContent) : null; } catch (e) { data = null; }\n    if (!data || typeof data.heading !== 'string' || !data.heading || !Array.isArray(data.handles)) { return null; }\n    var out = data.handles.filter(function (h) { return typeof h === 'string' && h && skip.indexOf(h) === -1; });\n    return out.length ? { heading: data.heading, handles: out } : null;\n  }\n\n  function hideRecent(dlg) {\n    var box = dlg.querySelector('[data-tdhq-saved-recent]');\n    if (box) { box.hidden = true; }\n  }\n\n  function renderRecent(dlg) {\n    var body = dlg.querySelector('.tdhq-saved__body');\n    var box = document.querySelector('[data-tdhq-saved-recent]');\n    if (!body || !box) { return; }\n    if (box.parentNode !== body) { body.appendChild(box); }\n\n    var skip = rowSkip();\n    var heading = 'Recently viewed';\n    var handles = recentHandles(skip);\n    /* History is sorted here, so all of it is fetched (at most eight): a sold-out\n       product has to be known as one before it can go behind the rest. The\n       suggestions arrive sorted, so only as many as the row shows, plus two\n       spare for a product that no longer resolves. */\n    var fetchList = handles;\n    if (!handles.length) {\n      var sug = suggestedHandles(box, skip);\n      if (!sug) { box.hidden = true; return; }\n      heading = sug.heading;\n      handles = sug.handles;\n      fetchList = handles.slice(0, RECENT_MAX + 2);\n    }\n    var key = heading + '|' + handles.join('|');\n    /* the same row as last time: show what was drawn (or nothing, if none of it\n       resolved) rather than fetching it again */\n    if (box.getAttribute('data-rendered') === key) {\n      box.hidden = box.hasAttribute('data-none');\n      return;\n    }\n    var title = box.querySelector('.tdhq-saved__recenttitle');\n    var grid = box.querySelector('[data-tdhq-saved-recent-list]');\n    if (title) { title.textContent = heading; }\n    box.setAttribute('data-rendered', key);\n    box.removeAttribute('data-none');\n    box.hidden = false;\n\n    /* placeholders at the row's final size while the cards load */\n    grid.setAttribute('aria-busy', 'true');\n    grid.innerHTML = '';\n    for (var g = 0; g < Math.min(fetchList.length, RECENT_MAX); g++) {\n      var ghost = document.createElement('div');\n      ghost.className = 'tdhq-saved-ghost';\n      ghost.setAttribute('aria-hidden', 'true');\n      grid.appendChild(ghost);\n    }\n\n    /* innerHTML here is the same same-origin card template as in renderList\n       above, for a handle that was url-encoded before the request. */\n    Promise.all(fetchList.map(fetchCard)).then(function (cards) {\n      if (box.getAttribute('data-rendered') !== key) { return; } /* a newer draw took over */\n      var inStock = [];\n      var soldOut = [];\n      cards.forEach(function (html) {\n        if (!html) { return; }\n        var holder = document.createElement('div');\n        holder.innerHTML = html;\n        var card = holder.firstElementChild;\n        if (card) { (card.classList.contains('tdhq-pcard--out') ? soldOut : inStock).push(card); }\n      });\n      var show = inStock.concat(soldOut).slice(0, RECENT_MAX);\n      grid.innerHTML = '';\n      grid.scrollLeft = 0;\n      show.forEach(function (card) { grid.appendChild(card); });\n      grid.removeAttribute('aria-busy');\n      if (!show.length) {\n        box.setAttribute('data-none', '');\n        box.hidden = true;\n      }\n      paint(dlg);\n    });\n  }\n\n  /* ---- the saved panel ---- */\n\n  /* A PANEL, NOT A MODAL (chrome-07, 2026-09-23). On a phone it rises above\n     the tab bar like the menu and the basket, and the tab bar stays live;\n     showModal put the whole page, tab bar included, behind it. So the panel\n     brings what showModal gave: a scrim, Escape, focus kept inside and handed\n     back to the opener. It moves to <body> on first use: the header it is\n     rendered in is a stacking context that would hold it under the tab bar. */\n  var savedFrom = null;\n  function panel() { return document.querySelector('[data-tdhq-saved]'); }\n  function scrim() { return document.querySelector('[data-tdhq-saved-scrim]'); }\n  function markOpeners(on) {\n    document.querySelectorAll('button[data-tdhq-saved-open]').forEach(function (b) { b.setAttribute('aria-expanded', on ? 'true' : 'false'); });\n  }\n  function closePanel() { var dlg = panel(); if (dlg && dlg.open) { dlg.close(); } }\n  window.tdhqSavedClose = closePanel;\n\n  function openPanel() {\n    var dlg = panel();\n    if (!dlg || typeof dlg.show !== 'function') { return false; }\n    var grid = dlg.querySelector('[data-tdhq-saved-list]');\n    /* re-fetch only when the list changed since the panel last drew it; an\n       empty list still re-checks its recently viewed row, which no-ops when the\n       history is the one it last drew */\n    if (grid && grid.getAttribute('data-rendered') !== read().join('|')) {\n      renderList(grid);\n    } else if (grid && !read().length) {\n      renderRecent(dlg);\n    }\n    if (!dlg.open) {\n      var sc = scrim();\n      /* U.42: into the header section (not <body>), so the phone tab bar and its basket count stay in front of\n         the sheet; the section is lifted while it is open (tdhq-header.css). */\n      var host = document.querySelector('.tdhq-header-section') || document.body;\n      if (dlg.parentNode !== host) {\n        if (sc) { host.appendChild(sc); }\n        host.appendChild(dlg);\n      }\n      if (!dlg.__tdhqBound) {\n        dlg.__tdhqBound = true;\n        dlg.addEventListener('close', function () {\n          var s = scrim();\n          if (s) { s.hidden = true; }\n          document.documentElement.classList.remove('tdhq-saved-open');\n          markOpeners(false);\n          if (savedFrom && savedFrom.focus && document.contains(savedFrom)) { savedFrom.focus({ preventScroll: true }); }\n          savedFrom = null;\n        });\n      }\n      savedFrom = document.activeElement;\n      if (sc) { sc.hidden = false; }\n      dlg.show();\n      document.documentElement.classList.add('tdhq-saved-open');\n      markOpeners(true);\n      var shut = dlg.querySelector('[data-tdhq-saved-close]');\n      if (shut && shut.focus) { shut.focus({ preventScroll: true }); }\n    }\n    return true;\n  }\n\n  /* Escape closes it; Tab and Shift+Tab stay inside it while it is open. */\n  document.addEventListener('keydown', function (e) {\n    var dlg = panel();\n    if (!dlg || !dlg.open) { return; }\n    if (e.key === 'Escape') { e.preventDefault(); dlg.close(); return; }\n    if (e.key !== 'Tab') { return; }\n    var f = [].filter.call(dlg.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select, textarea, [tabindex]:not([tabindex=\"-1\"])'), function (el) {\n      return el.offsetWidth > 0 || el.offsetHeight > 0;\n    });\n    if (!f.length) { return; }\n    if (!dlg.contains(document.activeElement)) { e.preventDefault(); f[0].focus(); return; }\n    if (e.shiftKey && document.activeElement === f[0]) { e.preventDefault(); f[f.length - 1].focus(); }\n    else if (!e.shiftKey && document.activeElement === f[f.length - 1]) { e.preventDefault(); f[0].focus(); }\n  });\n\n  document.addEventListener('click', function (event) {\n    if (!event.target.closest) { return; }\n    var opener = event.target.closest('[data-tdhq-saved-open]');\n    if (opener) {\n      /* the tab bar's Saved tab is a toggle, like its Shop tab */\n      var open = panel();\n      if (open && open.open && opener.closest('[data-tdhq-tabbar]')) { event.preventDefault(); open.close(); return; }\n      if (openPanel()) { event.preventDefault(); }\n      return;\n    }\n    var dlg = panel();\n    if (!dlg || !dlg.open) { return; }\n    /* the close button, or the scrim beside the panel */\n    if (event.target.closest('[data-tdhq-saved-close]') || event.target.closest('[data-tdhq-saved-scrim]')) {\n      dlg.close();\n    }\n  });\n\n  function init() {\n    paint(document);\n    renderPage();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n\n  /* Storage changes in another tab should be reflected here. */\n  window.addEventListener('storage', function (e) {\n    if (e.key !== KEY) { return; }\n    paint(document);\n    var dlg = panel();\n    if (dlg && dlg.open) { renderList(dlg.querySelector('[data-tdhq-saved-list]')); }\n  });\n\n  document.addEventListener('shopify:section:load', function () { paint(document); });\n  /* Filters, sort, pages and the sold-out-last rebuild swap the collection's\n     cards in without a section:load (that event is theme-editor only), so\n     their hearts were drawn unsaved. The collection script announces its swaps. */\n  document.addEventListener('tdhq:collection:updated', function () { paint(document); });\n})();\n"],
  "mappings": "CAwBC,UAAY,CACX,aAEA,IAAI,IAAM,mBAEV,SAAS,MAAO,CACd,GAAI,CACF,IAAI,IAAM,KAAK,MAAM,aAAa,QAAQ,GAAG,CAAC,EAC9C,OAAO,MAAM,QAAQ,GAAG,EAAI,IAAI,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,GAAM,UAAY,CAAG,CAAC,EAAI,CAAC,CACjG,OAAS,EAAG,CACV,MAAO,CAAC,CACV,CACF,CAEA,SAAS,MAAM,KAAM,CACnB,GAAI,CAAE,aAAa,QAAQ,IAAK,KAAK,UAAU,IAAI,CAAC,CAAG,OAAS,EAAG,CAAqB,CAC1F,CAEA,SAAS,IAAI,OAAQ,CAAE,OAAO,KAAK,EAAE,QAAQ,MAAM,IAAM,EAAI,CAE7D,SAAS,OAAO,OAAQ,CACtB,IAAI,KAAO,KAAK,EACZ,EAAI,KAAK,QAAQ,MAAM,EAC3B,OAAI,IAAM,GAAM,KAAK,QAAQ,MAAM,EAAY,KAAK,OAAO,EAAG,CAAC,EAC/D,MAAM,IAAI,EACH,IAAM,EACf,CAKA,SAAS,MAAM,MAAO,CAGpB,QAFI,KAAO,KAAK,EACZ,SAAW,OAAS,UAAU,iBAAiB,kBAAkB,EAC5D,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAAK,CACvC,IAAI,EAAI,QAAQ,CAAC,EACb,GAAK,KAAK,QAAQ,EAAE,aAAa,aAAa,CAAC,IAAM,GAErD,QAAU,GAAK,OAAS,QACxB,EAAE,aAAa,cAAc,IAAM,SAAS,EAAE,aAAa,eAAgB,OAAO,EAClF,EAAE,UAAU,SAAS,UAAU,IAAM,IAAI,EAAE,UAAU,OAAO,WAAY,EAAE,EAC9E,IAAI,MAAQ,EAAE,aAAa,GAAK,mBAAqB,iBAAiB,EAClE,OAAS,EAAE,aAAa,YAAY,IAAM,OAAO,EAAE,aAAa,aAAc,KAAK,EAGvF,IAAI,KAAO,EAAE,cAAc,uBAAuB,EAC9C,OAAM,KAAK,YAAc,GAAK,QAAU,iBAC9C,CAMA,QADI,MAAQ,SAAS,iBAAiB,uBAAuB,EACpD,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAO,MAAM,CAAC,EAAE,OAAS,KAAK,SAAW,EAE3E,QADI,OAAS,SAAS,iBAAiB,wBAAwB,EACtD,EAAI,EAAG,EAAI,OAAO,OAAQ,IACjC,OAAO,CAAC,EAAE,YAAc,KAAK,OAC7B,OAAO,CAAC,EAAE,OAAS,KAAK,SAAW,CAEvC,CAGA,OAAO,cAAgB,MAEvB,SAAS,SAAS,QAAS,CACzB,IAAI,KAAO,SAAS,eAAe,oBAAoB,EAClD,OACL,KAAK,YAAc,GACnB,OAAO,sBAAsB,UAAY,CAAE,KAAK,YAAc,OAAS,CAAC,EAC1E,CAEA,SAAS,iBAAiB,QAAS,SAAU,MAAO,CAClD,IAAI,IAAM,MAAM,OAAO,QAAU,MAAM,OAAO,QAAQ,kBAAkB,EAAI,KAC5E,GAAK,IACL,OAAM,eAAe,EACrB,IAAI,OAAS,IAAI,aAAa,aAAa,EAC3C,GAAK,OACL,KAAI,MAAQ,OAAO,MAAM,EACzB,MAAM,QAAQ,EACd,UAAU,IAAI,aAAa,YAAY,GAAK,SAAW,MAAQ,mBAAqB,4BAA4B,EAC5G,OAAS,KAAK,EAIlB,IAAI,KAAO,IAAI,QAAQ,mDAAmD,EAC1E,GAAI,MAAQ,CAAC,MAAO,CAClB,IAAI,KAAO,IAAI,QAAQ,aAAa,EAChC,MAAQ,MAAM,KAAM,IAAI,CAC9B,CAIA,GAAI,OAAS,IAAI,QAAQ,0BAA0B,EAAG,CACpD,IAAI,IAAM,IAAI,QAAQ,mBAAmB,EACrC,UAAY,KAAO,IAAI,cAAc,wBAAwB,EAC7D,WAAa,WAAW,SAAS,CACvC,GACF,CAAC,EAID,SAAS,MAAO,CAEd,QADI,OAAS,SAAS,iBAAiB,wBAAwB,EACtD,EAAI,EAAG,EAAI,OAAO,OAAQ,IAAK,CACtC,IAAI,GAAK,OAAO,CAAC,EACjB,GAAG,UAAU,OAAO,SAAS,EACxB,GAAG,YACR,GAAG,UAAU,IAAI,SAAS,CAC5B,CACF,CAIA,SAAS,MAAM,KAAM,KAAM,CACzB,IAAI,EAAI,OAAO,WACX,KAAO,UAAY,CACrB,IAAI,KAAO,UAAY,CAAM,KAAK,YAAc,KAAK,WAAW,YAAY,IAAI,CAAK,EACjF,EAAK,EAAE,KAAK,KAAM,cAAe,IAAI,EAAY,KAAK,EACrD,KAAK,cAAc,aAAa,GAAK,WAAW,IAAI,CAC3D,EACI,EAAK,EAAE,MAAM,KAAM,IAAI,EAAY,KAAK,CAC9C,CAMA,SAAS,SAAS,KAAM,CACtB,GAAI,KAAK,aAAa,sBAAsB,EAAG,CAC7C,IAAIA,OAAQ,KAAK,QAAQ,mBAAmB,EAC5C,OAAOA,OAAQA,OAAM,cAAc,yBAAyB,EAAI,IAClE,CACA,OAAO,SAAS,cAAc,4BAA4B,CAC5D,CAEA,SAAS,YAAa,CACpB,IAAI,KAAO,SAAS,cAAc,2BAA2B,EACzD,MAAQ,WAAW,IAAI,CAC7B,CAEA,SAAS,WAAW,KAAM,CACxB,IAAI,MAAQ,SAAS,IAAI,EACrB,KAAO,KAAK,EAChB,KAAK,aAAa,gBAAiB,KAAK,KAAK,GAAG,CAAC,EAEjD,IAAI,IAAM,KAAK,aAAa,sBAAsB,EAAI,KAAK,QAAQ,mBAAmB,EAAI,KAE1F,GAAI,CAAC,KAAK,OAAQ,CAChB,KAAK,UAAY,GACjB,KAAK,OAAS,GACV,QAAS,MAAM,OAAS,GAAW,OAAO,YAAc,OAAO,WAAW,KAAK,KAAK,GACpF,KAAO,aAAa,GAAG,EAC3B,MACF,CACA,KAAK,OAAS,GACV,QAAO,MAAM,OAAS,IACtB,KAAO,WAAW,GAAG,EAIzB,KAAK,aAAa,YAAa,MAAM,EACrC,KAAK,UAAY,GACjB,QAAS,EAAI,EAAG,EAAI,KAAK,IAAI,KAAK,OAAQ,CAAC,EAAG,IAAK,CACjD,IAAI,MAAQ,SAAS,cAAc,KAAK,EACxC,MAAM,UAAY,mBAClB,MAAM,aAAa,cAAe,MAAM,EACxC,KAAK,YAAY,KAAK,CACxB,CAKA,QAAQ,IAAI,KAAK,IAAI,SAAS,CAAC,EAAE,KAAK,SAAU,MAAO,CACrD,IAAI,KAAO,SAAS,uBAAuB,EACvC,QAAU,CAAC,EACf,MAAM,QAAQ,SAAU,KAAM,EAAG,CAC/B,GAAI,CAAC,KAAM,CAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,EAAG,MAAQ,CAQ5C,IAAI,OAAS,SAAS,cAAc,KAAK,EACzC,OAAO,UAAY,KACnB,IAAI,KAAO,OAAO,kBAEd,MAAM,KAAK,YAAY,IAAI,CACjC,CAAC,EACD,KAAK,UAAY,GACjB,KAAK,YAAY,IAAI,EACrB,KAAK,gBAAgB,WAAW,EAI5B,QAAQ,QACV,MAAM,KAAK,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,QAAQ,QAAQ,CAAC,IAAM,EAAI,CAAC,CAAC,EAEzE,MAAM,QAAQ,EACT,KAAK,cAAc,aAAa,IACnC,KAAK,OAAS,GACV,QAAS,MAAM,OAAS,GAAW,OAAO,YAAc,OAAO,WAAW,KAAK,KAAK,GACpF,KAAO,aAAa,GAAG,EAE/B,CAAC,CACH,CAIA,SAAS,UAAU,OAAQ,CACzB,OAAO,MAAM,aAAe,mBAAmB,MAAM,EAAI,aAAc,CAAE,QAAS,CAAE,OAAU,WAAY,CAAE,CAAC,EAC1G,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,GAAK,EAAE,KAAK,EAAI,IAAM,CAAC,EACpD,MAAM,UAAY,CAAE,OAAO,IAAM,CAAC,CACvC,CAkBA,IAAI,WAAa,gBACb,WAAa,EAEjB,SAAS,SAAS,IAAK,CACrB,IAAI,EAAI,OAAO,KAAQ,SAAW,IAAI,MAAM,YAAY,EAAE,CAAC,EAAI,GAC/D,OAAO,EAAI,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAI,EAC7C,CAGA,SAAS,SAAU,CACjB,IAAI,KAAO,KAAK,EACZ,IAAM,SAAS,cAAc,4BAA4B,EAC7D,GAAI,IACF,GAAI,CAAE,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,WAAW,EAAE,GAAG,CAAC,CAAG,OAAS,EAAG,CAA2B,CAErG,OAAO,IACT,CAEA,SAAS,cAAc,KAAM,CAC3B,IAAI,IACJ,GAAI,CAAE,IAAM,KAAK,MAAM,aAAa,QAAQ,UAAU,CAAC,CAAG,OAAS,EAAG,CAAE,IAAM,IAAM,CACpF,GAAI,CAAC,MAAM,QAAQ,GAAG,EAAK,MAAO,CAAC,EACnC,IAAI,IAAM,CAAC,EACX,WAAI,QAAQ,SAAU,EAAG,CACvB,IAAI,EAAI,SAAS,GAAK,EAAE,GAAG,EACvB,GAAK,KAAK,QAAQ,CAAC,IAAM,IAAM,IAAI,QAAQ,CAAC,IAAM,IAAM,IAAI,KAAK,CAAC,CACxE,CAAC,EACM,GACT,CAIA,SAAS,iBAAiB,IAAK,KAAM,CACnC,IAAI,GAAK,IAAI,cAAc,2BAA2B,EAClD,KAAO,KACX,GAAI,CAAE,KAAO,GAAK,KAAK,MAAM,GAAG,WAAW,EAAI,IAAM,OAAS,EAAG,CAAE,KAAO,IAAM,CAChF,GAAI,CAAC,MAAQ,OAAO,KAAK,SAAY,UAAY,CAAC,KAAK,SAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAK,OAAO,KACzG,IAAI,IAAM,KAAK,QAAQ,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,GAAM,UAAY,GAAK,KAAK,QAAQ,CAAC,IAAM,EAAI,CAAC,EAC3G,OAAO,IAAI,OAAS,CAAE,QAAS,KAAK,QAAS,QAAS,GAAI,EAAI,IAChE,CAEA,SAAS,WAAW,IAAK,CACvB,IAAI,IAAM,IAAI,cAAc,0BAA0B,EAClD,MAAO,IAAI,OAAS,GAC1B,CAEA,SAAS,aAAa,IAAK,CACzB,IAAI,KAAO,IAAI,cAAc,mBAAmB,EAC5C,IAAM,SAAS,cAAc,0BAA0B,EAC3D,GAAI,GAAC,MAAQ,CAAC,KACd,CAAI,IAAI,aAAe,MAAQ,KAAK,YAAY,GAAG,EAEnD,IAAI,KAAO,QAAQ,EACf,QAAU,kBACV,QAAU,cAAc,IAAI,EAK5B,UAAY,QAChB,GAAI,CAAC,QAAQ,OAAQ,CACnB,IAAI,IAAM,iBAAiB,IAAK,IAAI,EACpC,GAAI,CAAC,IAAK,CAAE,IAAI,OAAS,GAAM,MAAQ,CACvC,QAAU,IAAI,QACd,QAAU,IAAI,QACd,UAAY,QAAQ,MAAM,EAAG,WAAa,CAAC,CAC7C,CACA,IAAI,IAAM,QAAU,IAAM,QAAQ,KAAK,GAAG,EAG1C,GAAI,IAAI,aAAa,eAAe,IAAM,IAAK,CAC7C,IAAI,OAAS,IAAI,aAAa,WAAW,EACzC,MACF,CACA,IAAI,MAAQ,IAAI,cAAc,0BAA0B,EACpD,KAAO,IAAI,cAAc,+BAA+B,EACxD,QAAS,MAAM,YAAc,SACjC,IAAI,aAAa,gBAAiB,GAAG,EACrC,IAAI,gBAAgB,WAAW,EAC/B,IAAI,OAAS,GAGb,KAAK,aAAa,YAAa,MAAM,EACrC,KAAK,UAAY,GACjB,QAAS,EAAI,EAAG,EAAI,KAAK,IAAI,UAAU,OAAQ,UAAU,EAAG,IAAK,CAC/D,IAAI,MAAQ,SAAS,cAAc,KAAK,EACxC,MAAM,UAAY,mBAClB,MAAM,aAAa,cAAe,MAAM,EACxC,KAAK,YAAY,KAAK,CACxB,CAIA,QAAQ,IAAI,UAAU,IAAI,SAAS,CAAC,EAAE,KAAK,SAAU,MAAO,CAC1D,GAAI,IAAI,aAAa,eAAe,IAAM,IAC1C,KAAI,QAAU,CAAC,EACX,QAAU,CAAC,EACf,MAAM,QAAQ,SAAU,KAAM,CAC5B,GAAK,KACL,KAAI,OAAS,SAAS,cAAc,KAAK,EACzC,OAAO,UAAY,KACnB,IAAI,KAAO,OAAO,kBACd,OAAS,KAAK,UAAU,SAAS,iBAAiB,EAAI,QAAU,SAAS,KAAK,IAAI,EACxF,CAAC,EACD,IAAI,KAAO,QAAQ,OAAO,OAAO,EAAE,MAAM,EAAG,UAAU,EACtD,KAAK,UAAY,GACjB,KAAK,WAAa,EAClB,KAAK,QAAQ,SAAU,KAAM,CAAE,KAAK,YAAY,IAAI,CAAG,CAAC,EACxD,KAAK,gBAAgB,WAAW,EAC3B,KAAK,SACR,IAAI,aAAa,YAAa,EAAE,EAChC,IAAI,OAAS,IAEf,MAAM,GAAG,EACX,CAAC,EACH,CAUA,IAAI,UAAY,KAChB,SAAS,OAAQ,CAAE,OAAO,SAAS,cAAc,mBAAmB,CAAG,CACvE,SAAS,OAAQ,CAAE,OAAO,SAAS,cAAc,yBAAyB,CAAG,CAC7E,SAAS,YAAY,GAAI,CACvB,SAAS,iBAAiB,8BAA8B,EAAE,QAAQ,SAAU,EAAG,CAAE,EAAE,aAAa,gBAAiB,GAAK,OAAS,OAAO,CAAG,CAAC,CAC5I,CACA,SAAS,YAAa,CAAE,IAAI,IAAM,MAAM,EAAO,KAAO,IAAI,MAAQ,IAAI,MAAM,CAAK,CACjF,OAAO,eAAiB,WAExB,SAAS,WAAY,CACnB,IAAI,IAAM,MAAM,EAChB,GAAI,CAAC,KAAO,OAAO,IAAI,MAAS,WAAc,MAAO,GACrD,IAAI,KAAO,IAAI,cAAc,wBAAwB,EASrD,GALI,MAAQ,KAAK,aAAa,eAAe,IAAM,KAAK,EAAE,KAAK,GAAG,EAChE,WAAW,IAAI,EACN,MAAQ,CAAC,KAAK,EAAE,QACzB,aAAa,GAAG,EAEd,CAAC,IAAI,KAAM,CACb,IAAI,GAAK,MAAM,EAGX,KAAO,SAAS,cAAc,sBAAsB,GAAK,SAAS,KAClE,IAAI,aAAe,OACjB,IAAM,KAAK,YAAY,EAAE,EAC7B,KAAK,YAAY,GAAG,GAEjB,IAAI,cACP,IAAI,YAAc,GAClB,IAAI,iBAAiB,QAAS,UAAY,CACxC,IAAI,EAAI,MAAM,EACV,IAAK,EAAE,OAAS,IACpB,SAAS,gBAAgB,UAAU,OAAO,iBAAiB,EAC3D,YAAY,EAAK,EACb,WAAa,UAAU,OAAS,SAAS,SAAS,SAAS,GAAK,UAAU,MAAM,CAAE,cAAe,EAAK,CAAC,EAC3G,UAAY,IACd,CAAC,GAEH,UAAY,SAAS,cACjB,KAAM,GAAG,OAAS,IACtB,IAAI,KAAK,EACT,SAAS,gBAAgB,UAAU,IAAI,iBAAiB,EACxD,YAAY,EAAI,EAChB,IAAI,KAAO,IAAI,cAAc,yBAAyB,EAClD,MAAQ,KAAK,OAAS,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,CAC9D,CACA,MAAO,EACT,CAGA,SAAS,iBAAiB,UAAW,SAAU,EAAG,CAChD,IAAI,IAAM,MAAM,EAChB,GAAI,GAAC,KAAO,CAAC,IAAI,MACjB,IAAI,EAAE,MAAQ,SAAU,CAAE,EAAE,eAAe,EAAG,IAAI,MAAM,EAAG,MAAQ,CACnE,GAAI,EAAE,MAAQ,MACd,KAAI,EAAI,CAAC,EAAE,OAAO,KAAK,IAAI,iBAAiB,2GAA2G,EAAG,SAAU,GAAI,CACtK,OAAO,GAAG,YAAc,GAAK,GAAG,aAAe,CACjD,CAAC,EACD,GAAK,EAAE,OACP,IAAI,CAAC,IAAI,SAAS,SAAS,aAAa,EAAG,CAAE,EAAE,eAAe,EAAG,EAAE,CAAC,EAAE,MAAM,EAAG,MAAQ,CACnF,EAAE,UAAY,SAAS,gBAAkB,EAAE,CAAC,GAAK,EAAE,eAAe,EAAG,EAAE,EAAE,OAAS,CAAC,EAAE,MAAM,GACtF,CAAC,EAAE,UAAY,SAAS,gBAAkB,EAAE,EAAE,OAAS,CAAC,IAAK,EAAE,eAAe,EAAG,EAAE,CAAC,EAAE,MAAM,KACvG,CAAC,EAED,SAAS,iBAAiB,QAAS,SAAU,MAAO,CAClD,GAAK,MAAM,OAAO,QAClB,KAAI,OAAS,MAAM,OAAO,QAAQ,wBAAwB,EAC1D,GAAI,OAAQ,CAEV,IAAI,KAAO,MAAM,EACjB,GAAI,MAAQ,KAAK,MAAQ,OAAO,QAAQ,oBAAoB,EAAG,CAAE,MAAM,eAAe,EAAG,KAAK,MAAM,EAAG,MAAQ,CAC3G,UAAU,GAAK,MAAM,eAAe,EACxC,MACF,CACA,IAAI,IAAM,MAAM,EACZ,CAAC,KAAO,CAAC,IAAI,OAEb,MAAM,OAAO,QAAQ,yBAAyB,GAAK,MAAM,OAAO,QAAQ,yBAAyB,IACnG,IAAI,MAAM,EAEd,CAAC,EAED,SAAS,MAAO,CACd,MAAM,QAAQ,EACd,WAAW,CACb,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAIP,OAAO,iBAAiB,UAAW,SAAU,EAAG,CAC9C,GAAI,EAAE,MAAQ,IACd,OAAM,QAAQ,EACd,IAAI,IAAM,MAAM,EACZ,KAAO,IAAI,MAAQ,WAAW,IAAI,cAAc,wBAAwB,CAAC,EAC/E,CAAC,EAED,SAAS,iBAAiB,uBAAwB,UAAY,CAAE,MAAM,QAAQ,CAAG,CAAC,EAIlF,SAAS,iBAAiB,0BAA2B,UAAY,CAAE,MAAM,QAAQ,CAAG,CAAC,CACvF,GAAG",
  "names": ["panel"]
}
