{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/theme.dev.js?section_id=api-cart-items"],
  "sourcesContent": ["/*\n * @license\n * Broadcast Theme (c) Presidio Creative\n *\n * This file is included for advanced development by\n * Shopify Agencies.  Modified versions of the theme\n * code are not supported by Shopify or Presidio Creative.\n *\n * In order to use this file you will need to change\n * theme.js to theme.dev.js in /layout/theme.liquid\n *\n */\n\n(function (scrollLock) {\n  \"use strict\";\n\n  (function () {\n    const env = { NODE_ENV: \"production\" };\n    try {\n      if (process) {\n        process.env = Object.assign({}, process.env);\n        Object.assign(process.env, env);\n        return;\n      }\n    } catch (e) {} // avoid ReferenceError: process is not defined\n    globalThis.process = { env: env };\n  })();\n\n  window.theme = window.theme || {};\n\n  window.theme.sizes = {\n    mobile: 480,\n    small: 750,\n    large: 990,\n    widescreen: 1400,\n  };\n\n  window.theme.focusable =\n    'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\n  window.theme.getWindowWidth = function () {\n    return (\n      document.documentElement.clientWidth ||\n      document.body.clientWidth ||\n      window.innerWidth\n    );\n  };\n\n  window.theme.getWindowHeight = function () {\n    return (\n      document.documentElement.clientHeight ||\n      document.body.clientHeight ||\n      window.innerHeight\n    );\n  };\n\n  window.theme.isMobile = function () {\n    return window.theme.getWindowWidth() < window.theme.sizes.small;\n  };\n\n  /**\n   * Currency Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help with currency formatting\n   *\n   * Current contents\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n   *\n   */\n\n  const moneyFormat = \"${{amount}}\";\n\n  /**\n   * Format money values based on your shop currency settings\n   * @param  {Number|string} cents - value in cents or dollar amount e.g. 300 cents\n   * or 3.00 dollars\n   * @param  {String} format - shop money_format setting\n   * @return {String} value - formatted value\n   */\n  window.theme.formatMoney = function (cents, format) {\n    if (typeof cents === \"string\") {\n      cents = cents.replace(\".\", \"\");\n    }\n    let value = \"\";\n    const placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n    const formatString = format || moneyFormat;\n\n    function formatWithDelimiters(\n      number,\n      precision = 2,\n      thousands = \",\",\n      decimal = \".\",\n    ) {\n      if (isNaN(number) || number == null) {\n        return 0;\n      }\n\n      number = (number / 100.0).toFixed(precision);\n\n      const parts = number.split(\".\");\n      const dollarsAmount = parts[0].replace(\n        /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n        `$1${thousands}`,\n      );\n      const centsAmount = parts[1] ? decimal + parts[1] : \"\";\n\n      return dollarsAmount + centsAmount;\n    }\n\n    switch (formatString.match(placeholderRegex)[1]) {\n      case \"amount\":\n        value = formatWithDelimiters(cents, 2);\n        break;\n      case \"amount_no_decimals\":\n        value = formatWithDelimiters(cents, 0);\n        break;\n      case \"amount_with_comma_separator\":\n        value = formatWithDelimiters(cents, 2, \".\", \",\");\n        break;\n      case \"amount_no_decimals_with_comma_separator\":\n        value = formatWithDelimiters(cents, 0, \".\", \",\");\n        break;\n      case \"amount_with_apostrophe_separator\":\n        value = formatWithDelimiters(cents, 2, \"'\", \".\");\n        break;\n      case \"amount_no_decimals_with_space_separator\":\n        value = formatWithDelimiters(cents, 0, \" \", \"\");\n        break;\n      case \"amount_with_space_separator\":\n        value = formatWithDelimiters(cents, 2, \" \", \",\");\n        break;\n      case \"amount_with_period_and_space_separator\":\n        value = formatWithDelimiters(cents, 2, \" \", \".\");\n        break;\n    }\n\n    return formatString.replace(placeholderRegex, value);\n  };\n\n  window.theme.debounce = function (fn, time) {\n    let timeout;\n    return function () {\n      // eslint-disable-next-line prefer-rest-params\n      if (fn) {\n        const functionCall = () => fn.apply(this, arguments);\n        clearTimeout(timeout);\n        timeout = setTimeout(functionCall, time);\n      }\n    };\n  };\n\n  let screenOrientation = getScreenOrientation();\n  let firstLoad = true;\n\n  window.theme.readHeights = function () {\n    const h = {};\n    h.windowHeight = Math.min(window.screen.height, window.innerHeight);\n    h.footerHeight = getHeight('[data-section-type*=\"footer\"]');\n    h.headerHeight = getHeight(\"[data-header-height]\");\n    h.stickyHeaderHeight = document.querySelector(\"[data-header-sticky]\")\n      ? h.headerHeight\n      : 0;\n    h.collectionNavHeight = getHeight(\"[data-collection-nav]\");\n    h.logoHeight = getFooterLogoWithPadding();\n\n    return h;\n  };\n\n  function setVars() {\n    const {\n      windowHeight,\n      headerHeight,\n      logoHeight,\n      footerHeight,\n      collectionNavHeight,\n    } = window.theme.readHeights();\n    const currentScreenOrientation = getScreenOrientation();\n\n    if (\n      !firstLoad ||\n      currentScreenOrientation !== screenOrientation ||\n      window.innerWidth > window.theme.sizes.mobile\n    ) {\n      // Only update the heights on screen orientation change or larger than mobile devices\n      document.documentElement.style.setProperty(\n        \"--full-height\",\n        `${windowHeight}px`,\n      );\n      document.documentElement.style.setProperty(\n        \"--three-quarters\",\n        `${windowHeight * (3 / 4)}px`,\n      );\n      document.documentElement.style.setProperty(\n        \"--two-thirds\",\n        `${windowHeight * (2 / 3)}px`,\n      );\n      document.documentElement.style.setProperty(\n        \"--one-half\",\n        `${windowHeight / 2}px`,\n      );\n      document.documentElement.style.setProperty(\n        \"--one-third\",\n        `${windowHeight / 3}px`,\n      );\n\n      // Update the screen orientation state\n      screenOrientation = currentScreenOrientation;\n      firstLoad = false;\n    }\n\n    document.documentElement.style.setProperty(\n      \"--collection-nav-height\",\n      `${collectionNavHeight}px`,\n    );\n    document.documentElement.style.setProperty(\n      \"--header-height\",\n      `${headerHeight}px`,\n    );\n    document.documentElement.style.setProperty(\n      \"--footer-height\",\n      `${footerHeight}px`,\n    );\n    document.documentElement.style.setProperty(\n      \"--content-full\",\n      `${windowHeight - headerHeight - logoHeight / 2}px`,\n    );\n    document.documentElement.style.setProperty(\n      \"--content-min\",\n      `${windowHeight - headerHeight - footerHeight}px`,\n    );\n  }\n\n  function getScreenOrientation() {\n    if (window.matchMedia(\"(orientation: portrait)\").matches) {\n      return \"portrait\";\n    }\n\n    if (window.matchMedia(\"(orientation: landscape)\").matches) {\n      return \"landscape\";\n    }\n  }\n\n  function getHeight(selector) {\n    const el = document.querySelector(selector);\n    if (el) {\n      return el.offsetHeight;\n    } else {\n      return 0;\n    }\n  }\n\n  function getFooterLogoWithPadding() {\n    const height = getHeight(\"[data-footer-logo]\");\n    if (height > 0) {\n      return height + 20;\n    } else {\n      return 0;\n    }\n  }\n\n  setVars();\n\n  window.addEventListener(\"DOMContentLoaded\", setVars);\n  document.addEventListener(\"theme:resize\", setVars);\n  document.addEventListener(\"shopify:section:load\", setVars);\n\n  window.theme.scrollTo = (elementTop) => {\n    const stickyHeaderHeight = document.querySelector(\"[data-header-sticky]\")\n      ? document.querySelector(\"[data-header-height]\").offsetHeight\n      : 0;\n\n    window.scrollTo({\n      top: elementTop + window.scrollY - stickyHeaderHeight,\n      left: 0,\n      behavior: \"smooth\",\n    });\n  };\n\n  /**\n   * A11y Helpers\n   * -----------------------------------------------------------------------------\n   * A collection of useful functions that help make your theme more accessible\n   */\n\n  // Define trapFocusHandlers as a global variable within the module.\n  const trapFocusHandlers = {};\n\n  const a11y = {\n    /**\n     * Moves focus to an HTML element\n     * @param {Element} element - The element to focus on.\n     * @param {Object} options - Settings unique to your theme.\n     * @param {string} options.className - Class name to apply to element on focus.\n     */\n    forceFocus(element, options) {\n      options = options || {};\n\n      var savedTabIndex = element.tabIndex;\n\n      element.tabIndex = -1;\n      element.dataset.tabIndex = savedTabIndex;\n      element.focus();\n      if (typeof options.className !== \"undefined\") {\n        element.classList.add(options.className);\n      }\n      element.addEventListener(\"blur\", callback);\n\n      function callback(event) {\n        event.target.removeEventListener(event.type, callback);\n\n        element.tabIndex = savedTabIndex;\n        delete element.dataset.tabIndex;\n        if (typeof options.className !== \"undefined\") {\n          element.classList.remove(options.className);\n        }\n      }\n    },\n\n    /**\n     * Focus the appropriate element based on the URL hash.\n     * @param {Object} options - Settings unique to your theme.\n     */\n    focusHash(options) {\n      options = options || {};\n      var hash = window.location.hash;\n      var element = document.getElementById(hash.slice(1));\n\n      if (element && options.ignore && element.matches(options.ignore)) {\n        return false;\n      }\n\n      if (hash && element) {\n        this.forceFocus(element, options);\n      }\n    },\n\n    /**\n     * Bind in-page links to focus the appropriate element.\n     * @param {Object} options - Settings unique to your theme.\n     */\n    bindInPageLinks(options) {\n      options = options || {};\n      var links = Array.prototype.slice.call(\n        document.querySelectorAll('a[href^=\"#\"]'),\n      );\n\n      function queryCheck(selector) {\n        return document.getElementById(selector) !== null;\n      }\n\n      return links.filter((link) => {\n        if (link.hash === \"#\" || link.hash === \"\") {\n          return false;\n        }\n\n        if (options.ignore && link.matches(options.ignore)) {\n          return false;\n        }\n\n        if (!queryCheck(link.hash.substr(1))) {\n          return false;\n        }\n\n        var element = document.querySelector(link.hash);\n\n        if (!element) {\n          return false;\n        }\n\n        link.addEventListener(\"click\", () => {\n          this.forceFocus(element, options);\n        });\n\n        return true;\n      });\n    },\n\n    focusable(container) {\n      var elements = Array.prototype.slice.call(\n        container.querySelectorAll(\n          \"[tabindex],\" +\n            \"[draggable],\" +\n            \"a[href],\" +\n            \"area,\" +\n            \"button:enabled,\" +\n            \"input:not([type=hidden]):enabled,\" +\n            \"object,\" +\n            \"select:enabled,\" +\n            \"textarea:enabled\",\n        ),\n      );\n\n      return elements.filter(\n        (element) =>\n          !!(\n            (element.offsetWidth ||\n              element.offsetHeight ||\n              element.getClientRects().length) &&\n            this.isVisible(element)\n          ),\n      );\n    },\n\n    trapFocus(container, options) {\n      options = options || {};\n      var elements = this.focusable(container);\n      var elementToFocus = options.elementToFocus || container;\n      var first = elements[0];\n      var last = elements[elements.length - 1];\n\n      this.removeTrapFocus();\n\n      trapFocusHandlers.focusin = function (event) {\n        if (\n          container !== event.target &&\n          !container.contains(event.target) &&\n          first &&\n          first === event.target\n        ) {\n          first.focus();\n        }\n\n        if (\n          event.target !== container &&\n          event.target !== last &&\n          event.target !== first\n        )\n          return;\n        document.addEventListener(\"keydown\", trapFocusHandlers.keydown);\n      };\n\n      trapFocusHandlers.focusout = function () {\n        document.removeEventListener(\"keydown\", trapFocusHandlers.keydown);\n      };\n\n      trapFocusHandlers.keydown = function (event) {\n        if (event.code !== \"Tab\") return;\n\n        if (event.target === last && !event.shiftKey) {\n          event.preventDefault();\n          first.focus();\n        }\n\n        if (\n          (event.target === container || event.target === first) &&\n          event.shiftKey\n        ) {\n          event.preventDefault();\n          last.focus();\n        }\n      };\n\n      document.addEventListener(\"focusout\", trapFocusHandlers.focusout);\n      document.addEventListener(\"focusin\", trapFocusHandlers.focusin);\n\n      this.forceFocus(elementToFocus, options);\n    },\n\n    removeTrapFocus() {\n      document.removeEventListener(\"focusin\", trapFocusHandlers.focusin);\n      document.removeEventListener(\"focusout\", trapFocusHandlers.focusout);\n      document.removeEventListener(\"keydown\", trapFocusHandlers.keydown);\n    },\n\n    autoFocusLastElement() {\n      if (\n        window.a11y.lastElement &&\n        document.body.classList.contains(\"is-focused\")\n      ) {\n        setTimeout(() => {\n          window.a11y.lastElement?.focus();\n        });\n      }\n    },\n\n    accessibleLinks(elements, options) {\n      if (typeof elements !== \"string\") {\n        throw new TypeError(elements + \" is not a String.\");\n      }\n\n      elements = document.querySelectorAll(elements);\n\n      if (elements.length === 0) {\n        return;\n      }\n\n      options = options || {};\n      options.messages = options.messages || {};\n\n      var messages = {\n        newWindow: options.messages.newWindow || \"Opens in a new window.\",\n        external: options.messages.external || \"Opens external website.\",\n        newWindowExternal:\n          options.messages.newWindowExternal ||\n          \"Opens external website in a new window.\",\n      };\n\n      var prefix = options.prefix || \"a11y\";\n\n      var messageSelectors = {\n        newWindow: prefix + \"-new-window-message\",\n        external: prefix + \"-external-message\",\n        newWindowExternal: prefix + \"-new-window-external-message\",\n      };\n\n      function generateHTML(messages) {\n        var container = document.createElement(\"ul\");\n        var htmlMessages = Object.keys(messages).reduce((html, key) => {\n          return (html +=\n            \"<li id=\" + messageSelectors[key] + \">\" + messages[key] + \"</li>\");\n        }, \"\");\n\n        container.setAttribute(\"hidden\", true);\n        container.innerHTML = htmlMessages;\n\n        document.body.appendChild(container);\n      }\n\n      function externalSite(link) {\n        return link.hostname !== window.location.hostname;\n      }\n\n      elements.forEach((link) => {\n        var target = link.getAttribute(\"target\");\n        var rel = link.getAttribute(\"rel\");\n        var isExternal = externalSite(link);\n        var isTargetBlank = target === \"_blank\";\n        var missingRelNoopener = rel === null || rel.indexOf(\"noopener\") === -1;\n\n        if (isTargetBlank && missingRelNoopener) {\n          var relValue = rel === null ? \"noopener\" : rel + \" noopener\";\n          link.setAttribute(\"rel\", relValue);\n        }\n\n        if (isExternal && isTargetBlank) {\n          link.setAttribute(\n            \"aria-describedby\",\n            messageSelectors.newWindowExternal,\n          );\n        } else if (isExternal) {\n          link.setAttribute(\"aria-describedby\", messageSelectors.external);\n        } else if (isTargetBlank) {\n          link.setAttribute(\"aria-describedby\", messageSelectors.newWindow);\n        }\n      });\n\n      generateHTML(messages);\n    },\n\n    isVisible(el) {\n      var style = window.getComputedStyle(el);\n      return style.display !== \"none\" && style.visibility !== \"hidden\";\n    },\n  };\n\n  window.theme = window.theme || {};\n  window.theme.a11y = a11y;\n\n  window.theme.throttle = (fn, wait) => {\n    let prev, next;\n    return function invokeFn(...args) {\n      const now = Date.now();\n      next = clearTimeout(next);\n      if (!prev || now - prev >= wait) {\n        // eslint-disable-next-line prefer-spread\n        fn.apply(null, args);\n        prev = now;\n      } else {\n        next = setTimeout(invokeFn.bind(null, ...args), wait - (now - prev));\n      }\n    };\n  };\n\n  function appendCartItems() {\n    if (document.querySelector(\"cart-items\")) return;\n\n    // Add cart items tag when the cart drawer section is missing so we can still run the JS associated with the error handling\n    const cartItems = document.createElement(\"cart-items\");\n    document.body.appendChild(cartItems);\n  }\n\n  function floatLabels(container) {\n    const floats = container.querySelectorAll(\".form-field\");\n    floats.forEach((element) => {\n      const label = element.querySelector(\"label\");\n      const input = element.querySelector(\"input, textarea\");\n      if (label && input) {\n        input.addEventListener(\"keyup\", (event) => {\n          if (event.target.value !== \"\") {\n            label.classList.add(\"label--float\");\n          } else {\n            label.classList.remove(\"label--float\");\n          }\n        });\n        if (input.value && input.value.length) {\n          label.classList.add(\"label--float\");\n        }\n      }\n    });\n  }\n\n  let lastWindowWidth = window.theme.getWindowWidth();\n  let lastWindowHeight = window.theme.getWindowHeight();\n\n  function dispatch$1() {\n    document.dispatchEvent(\n      new CustomEvent(\"theme:resize\", {\n        bubbles: true,\n      }),\n    );\n\n    if (lastWindowWidth !== window.theme.getWindowWidth()) {\n      document.dispatchEvent(\n        new CustomEvent(\"theme:resize:width\", {\n          bubbles: true,\n        }),\n      );\n\n      lastWindowWidth = window.theme.getWindowWidth();\n    }\n\n    if (lastWindowHeight !== window.theme.getWindowHeight()) {\n      document.dispatchEvent(\n        new CustomEvent(\"theme:resize:height\", {\n          bubbles: true,\n        }),\n      );\n\n      lastWindowHeight = window.theme.getWindowHeight();\n    }\n  }\n\n  function resizeListener() {\n    window.addEventListener(\n      \"resize\",\n      window.theme.debounce(function () {\n        dispatch$1();\n      }, 50),\n    );\n  }\n\n  let prev = window.scrollY;\n  let up = null;\n  let down = null;\n  let wasUp = null;\n  let wasDown = null;\n  let scrollLockTimer = 0;\n\n  function dispatch() {\n    const position = window.scrollY;\n    if (position > prev) {\n      down = true;\n      up = false;\n    } else if (position < prev) {\n      down = false;\n      up = true;\n    } else {\n      up = null;\n      down = null;\n    }\n    prev = position;\n    document.dispatchEvent(\n      new CustomEvent(\"theme:scroll\", {\n        detail: {\n          up,\n          down,\n          position,\n        },\n        bubbles: false,\n      }),\n    );\n    if (up && !wasUp) {\n      document.dispatchEvent(\n        new CustomEvent(\"theme:scroll:up\", {\n          detail: { position },\n          bubbles: false,\n        }),\n      );\n    }\n    if (down && !wasDown) {\n      document.dispatchEvent(\n        new CustomEvent(\"theme:scroll:down\", {\n          detail: { position },\n          bubbles: false,\n        }),\n      );\n    }\n    wasDown = down;\n    wasUp = up;\n  }\n\n  function lock(e) {\n    // Prevent body scroll lock race conditions\n    setTimeout(() => {\n      if (scrollLockTimer) {\n        clearTimeout(scrollLockTimer);\n      }\n\n      scrollLock.disablePageScroll(e.detail, {\n        allowTouchMove: (el) => el.tagName === \"TEXTAREA\",\n      });\n\n      document.documentElement.setAttribute(\"data-scroll-locked\", \"\");\n    });\n  }\n\n  function unlock(e) {\n    const timeout = e.detail;\n\n    if (timeout) {\n      scrollLockTimer = setTimeout(removeScrollLock, timeout);\n    } else {\n      removeScrollLock();\n    }\n  }\n\n  function removeScrollLock() {\n    scrollLock.clearQueueScrollLocks();\n    scrollLock.enablePageScroll();\n    document.documentElement.removeAttribute(\"data-scroll-locked\");\n  }\n\n  function scrollListener() {\n    let timeout;\n    window.addEventListener(\n      \"scroll\",\n      function () {\n        if (timeout) {\n          window.cancelAnimationFrame(timeout);\n        }\n        timeout = window.requestAnimationFrame(function () {\n          dispatch();\n        });\n      },\n      { passive: true },\n    );\n\n    window.addEventListener(\"theme:scroll:lock\", lock);\n    window.addEventListener(\"theme:scroll:unlock\", unlock);\n  }\n\n  const wrap = (toWrap, wrapperClass = \"\", wrapperOption) => {\n    const wrapper = wrapperOption || document.createElement(\"div\");\n    wrapper.classList.add(wrapperClass);\n    toWrap.parentNode.insertBefore(wrapper, toWrap);\n    return wrapper.appendChild(toWrap);\n  };\n\n  function wrapElements(container) {\n    // Target tables to make them scrollable\n    const tableSelectors = \".rte table\";\n    const tables = container.querySelectorAll(tableSelectors);\n    tables.forEach((table) => {\n      wrap(table, \"rte__table-wrapper\");\n      table.setAttribute(\"data-scroll-lock-scrollable\", \"\");\n    });\n\n    // Target iframes to make them responsive\n    const iframeSelectors =\n      '.rte iframe[src*=\"youtube.com/embed\"], .rte iframe[src*=\"player.vimeo\"], .rte iframe#admin_bar_iframe';\n    const frames = container.querySelectorAll(iframeSelectors);\n    frames.forEach((frame) => {\n      wrap(frame, \"rte__video-wrapper\");\n    });\n  }\n\n  function isTouchDevice() {\n    return (\n      \"ontouchstart\" in window ||\n      navigator.maxTouchPoints > 0 ||\n      navigator.msMaxTouchPoints > 0\n    );\n  }\n\n  function isTouch() {\n    if (isTouchDevice()) {\n      document.documentElement.className =\n        document.documentElement.className.replace(\n          \"no-touch\",\n          \"supports-touch\",\n        );\n      window.theme.touch = true;\n    } else {\n      window.theme.touch = false;\n    }\n  }\n\n  function ariaToggle(container) {\n    const toggleButtons = container.querySelectorAll(\"[data-aria-toggle]\");\n    if (toggleButtons.length) {\n      toggleButtons.forEach((element) => {\n        element.addEventListener(\"click\", function (event) {\n          event.preventDefault();\n          const currentTarget = event.currentTarget;\n          currentTarget.setAttribute(\n            \"aria-expanded\",\n            currentTarget.getAttribute(\"aria-expanded\") == \"false\"\n              ? \"true\"\n              : \"false\",\n          );\n          const toggleID = currentTarget.getAttribute(\"aria-controls\");\n          const toggleElement = document.querySelector(`#${toggleID}`);\n          const removeExpandingClass = () => {\n            toggleElement.classList.remove(\"expanding\");\n            toggleElement.removeEventListener(\n              \"transitionend\",\n              removeExpandingClass,\n            );\n          };\n          const addExpandingClass = () => {\n            toggleElement.classList.add(\"expanding\");\n            toggleElement.removeEventListener(\n              \"transitionstart\",\n              addExpandingClass,\n            );\n          };\n\n          toggleElement.addEventListener(\"transitionstart\", addExpandingClass);\n          toggleElement.addEventListener(\"transitionend\", removeExpandingClass);\n\n          toggleElement.classList.toggle(\"expanded\");\n        });\n      });\n    }\n  }\n\n  function loading() {\n    document.body.classList.add(\"is-loaded\");\n  }\n\n  const classes$q = {\n    loading: \"is-loading\",\n  };\n\n  const selectors$u = {\n    img: \"img.is-loading\",\n  };\n\n  /*\n      Catch images loaded events and add class \"is-loaded\" to them and their containers\n    */\n  function loadedImagesEventHook() {\n    document.addEventListener(\n      \"load\",\n      (e) => {\n        if (\n          e.target.tagName.toLowerCase() == \"img\" &&\n          e.target.classList.contains(classes$q.loading)\n        ) {\n          e.target.classList.remove(classes$q.loading);\n          e.target.parentNode.classList.remove(classes$q.loading);\n\n          if (\n            e.target.parentNode.parentNode.classList.contains(classes$q.loading)\n          ) {\n            e.target.parentNode.parentNode.classList.remove(classes$q.loading);\n          }\n        }\n      },\n      true,\n    );\n  }\n\n  /*\n      Remove \"is-loading\" class to the loaded images and their containers\n    */\n  function removeLoadingClassFromLoadedImages(container) {\n    container.querySelectorAll(selectors$u.img).forEach((img) => {\n      if (img.complete) {\n        img.classList.remove(classes$q.loading);\n        img.parentNode.classList.remove(classes$q.loading);\n\n        if (img.parentNode.parentNode.classList.contains(classes$q.loading)) {\n          img.parentNode.parentNode.classList.remove(classes$q.loading);\n        }\n      }\n    });\n  }\n\n  const selectors$t = {\n    aos: \"[data-aos]:not(.aos-animate)\",\n    aosAnchor: \"[data-aos-anchor]\",\n    aosIndividual: \"[data-aos]:not([data-aos-anchor]):not(.aos-animate)\",\n  };\n\n  const classes$p = {\n    aosAnimate: \"aos-animate\",\n  };\n\n  const observerConfig = {\n    attributes: false,\n    childList: true,\n    subtree: true,\n  };\n\n  let anchorContainers = [];\n\n  const mutationCallback = (mutationList) => {\n    for (const mutation of mutationList) {\n      if (mutation.type === \"childList\") {\n        const element = mutation.target;\n        const elementsToAnimate = element.querySelectorAll(selectors$t.aos);\n        const anchors = element.querySelectorAll(selectors$t.aosAnchor);\n\n        if (elementsToAnimate.length) {\n          elementsToAnimate.forEach((element) => {\n            aosItemObserver.observe(element);\n          });\n        }\n\n        if (anchors.length) {\n          // Get all anchors and attach observers\n          initAnchorObservers(anchors);\n        }\n      }\n    }\n  };\n\n  /*\n      Observe each element that needs to be animated\n    */\n  const aosItemObserver = new IntersectionObserver(\n    (entries, observer) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          entry.target.classList.add(classes$p.aosAnimate);\n\n          // Stop observing element after it was animated\n          observer.unobserve(entry.target);\n        }\n      });\n    },\n    {\n      root: null,\n      rootMargin: \"0px\",\n      threshold: [0, 0.1, 0.25, 0.5, 0.75, 1],\n    },\n  );\n\n  /*\n      Observe anchor elements\n    */\n  const aosAnchorObserver = new IntersectionObserver(\n    (entries, observer) => {\n      entries.forEach((entry) => {\n        if (entry.intersectionRatio) {\n          const elementsToAnimate = entry.target.querySelectorAll(\n            selectors$t.aos,\n          );\n\n          if (elementsToAnimate.length) {\n            elementsToAnimate.forEach((item) => {\n              item.classList.add(classes$p.aosAnimate);\n            });\n          }\n\n          // Stop observing anchor element after inner elements were animated\n          observer.unobserve(entry.target);\n\n          // Remove the container from the anchorContainers array\n          const sectionIndex = anchorContainers.indexOf(\"#\" + entry.target.id);\n          if (sectionIndex !== -1) {\n            anchorContainers.splice(sectionIndex, 1);\n          }\n        }\n      });\n    },\n    {\n      root: null,\n      rootMargin: \"0px\",\n      threshold: [0.1, 0.25, 0.5, 0.75, 1],\n    },\n  );\n\n  /*\n      Watch for mutations in the body and start observing the newly added animated elements and anchors\n    */\n  function bodyMutationObserver() {\n    const bodyObserver = new MutationObserver(mutationCallback);\n    bodyObserver.observe(document.body, observerConfig);\n  }\n\n  /*\n      Observe animated elements that have attribute [data-aos]\n    */\n  function elementsIntersectionObserver() {\n    const elementsToAnimate = document.querySelectorAll(\n      selectors$t.aosIndividual,\n    );\n\n    if (elementsToAnimate.length) {\n      elementsToAnimate.forEach((element) => {\n        aosItemObserver.observe(element);\n      });\n    }\n  }\n\n  /*\n      Observe animated elements that have attribute [data-aos]\n    */\n  function anchorsIntersectionObserver() {\n    const anchors = document.querySelectorAll(selectors$t.aosAnchor);\n\n    if (anchors.length) {\n      // Get all anchors and attach observers\n      initAnchorObservers(anchors);\n    }\n  }\n\n  function initAnchorObservers(anchors) {\n    if (!anchors.length || Shopify.visualPreviewMode) return;\n\n    anchors.forEach((anchor) => {\n      const containerId = anchor.dataset.aosAnchor;\n\n      // Avoid adding multiple observers to the same element\n      if (containerId && anchorContainers.indexOf(containerId) === -1) {\n        const container = document.querySelector(containerId);\n\n        if (container) {\n          aosAnchorObserver.observe(container);\n          anchorContainers.push(containerId);\n        }\n      }\n    });\n  }\n\n  function initAnimations() {\n    elementsIntersectionObserver();\n    anchorsIntersectionObserver();\n    bodyMutationObserver();\n\n    // Remove unloaded section from the anchors array on section:unload event\n    document.addEventListener(\"shopify:section:unload\", (e) => {\n      const sectionId = \"#\" + e.target.querySelector(\"[data-section-id]\")?.id;\n      const sectionIndex = anchorContainers.indexOf(sectionId);\n\n      if (sectionIndex !== -1) {\n        anchorContainers.splice(sectionIndex, 1);\n      }\n    });\n  }\n\n  // Safari requestIdleCallback polyfill\n  window.requestIdleCallback =\n    window.requestIdleCallback ||\n    function (cb) {\n      var start = Date.now();\n      return setTimeout(function () {\n        cb({\n          didTimeout: false,\n          timeRemaining: function () {\n            return Math.max(0, 50 - (Date.now() - start));\n          },\n        });\n      }, 1);\n    };\n  window.cancelIdleCallback =\n    window.cancelIdleCallback ||\n    function (id) {\n      clearTimeout(id);\n    };\n\n  if (window.theme.settings.enableAnimations) {\n    initAnimations();\n  }\n\n  resizeListener();\n  scrollListener();\n  isTouch();\n  loadedImagesEventHook();\n\n  window.addEventListener(\"DOMContentLoaded\", () => {\n    ariaToggle(document);\n    floatLabels(document);\n    wrapElements(document);\n    removeLoadingClassFromLoadedImages(document);\n    loading();\n    appendCartItems();\n\n    requestIdleCallback(() => {\n      if (Shopify.visualPreviewMode) {\n        document.documentElement.classList.add(\"preview-mode\");\n      }\n    });\n  });\n\n  document.addEventListener(\"shopify:section:load\", (e) => {\n    const container = e.target;\n    floatLabels(container);\n    wrapElements(container);\n    ariaToggle(document);\n  });\n\n  const classes$o = {\n    focus: \"is-focused\",\n  };\n\n  const selectors$s = {\n    inPageLink: \"[data-skip-content]\",\n    linkesWithOnlyHash: 'a[href=\"#\"]',\n  };\n\n  class Accessibility {\n    constructor() {\n      this.init();\n    }\n\n    init() {\n      this.a11y = window.theme.a11y;\n\n      // DOM Elements\n      this.html = document.documentElement;\n      this.body = document.body;\n      this.inPageLink = document.querySelector(selectors$s.inPageLink);\n      this.linkesWithOnlyHash = document.querySelectorAll(\n        selectors$s.linkesWithOnlyHash,\n      );\n\n      // A11Y init methods\n      this.a11y.focusHash();\n      this.a11y.bindInPageLinks();\n\n      // Events\n      this.clickEvents();\n      this.focusEvents();\n    }\n\n    /**\n     * Clicked events accessibility\n     *\n     * @return  {Void}\n     */\n\n    clickEvents() {\n      if (this.inPageLink) {\n        this.inPageLink.addEventListener(\"click\", (event) => {\n          event.preventDefault();\n        });\n      }\n\n      if (this.linkesWithOnlyHash) {\n        this.linkesWithOnlyHash.forEach((item) => {\n          item.addEventListener(\"click\", (event) => {\n            event.preventDefault();\n          });\n        });\n      }\n    }\n\n    /**\n     * Focus events\n     *\n     * @return  {Void}\n     */\n\n    focusEvents() {\n      document.addEventListener(\"mousedown\", () => {\n        this.body.classList.remove(classes$o.focus);\n      });\n\n      document.addEventListener(\"keyup\", (event) => {\n        if (event.code !== \"Tab\") {\n          return;\n        }\n\n        this.body.classList.add(classes$o.focus);\n      });\n    }\n  }\n\n  window.a11y = new Accessibility();\n\n  /*\n      Trigger event after animation completes\n    */\n  window.theme.waitForAnimationEnd = function (element) {\n    return new Promise((resolve) => {\n      function onAnimationEnd(event) {\n        if (event.target != element) return;\n\n        element.removeEventListener(\"animationend\", onAnimationEnd);\n        resolve();\n      }\n\n      element?.addEventListener(\"animationend\", onAnimationEnd);\n    });\n  };\n\n  /*\n      Trigger event after all animations complete in a specific section\n    */\n  window.theme.waitForAllAnimationsEnd = function (section) {\n    return new Promise((resolve, rejected) => {\n      const animatedElements = section.querySelectorAll(\"[data-aos]\");\n      let animationCount = 0;\n\n      function onAnimationEnd(event) {\n        animationCount++;\n\n        if (animationCount === animatedElements.length) {\n          // All animations have ended\n          resolve();\n        }\n\n        event.target.removeEventListener(\"animationend\", onAnimationEnd);\n      }\n\n      animatedElements.forEach((element) => {\n        element.addEventListener(\"animationend\", onAnimationEnd);\n      });\n\n      if (!animationCount) rejected();\n    });\n  };\n\n  function FetchError(object) {\n    this.status = object.status || null;\n    this.headers = object.headers || null;\n    this.json = object.json || null;\n    this.body = object.body || null;\n  }\n  FetchError.prototype = Error.prototype;\n\n  const classes$n = {\n    animated: \"is-animated\",\n    active: \"is-active\",\n    added: \"is-added\",\n    disabled: \"is-disabled\",\n    empty: \"is-empty\",\n    error: \"has-error\",\n    headerStuck: \"js__header__stuck\",\n    hidden: \"is-hidden\",\n    hiding: \"is-hiding\",\n    loading: \"is-loading\",\n    open: \"is-open\",\n    removed: \"is-removed\",\n    success: \"is-success\",\n    visible: \"is-visible\",\n    expanded: \"is-expanded\",\n    updated: \"is-updated\",\n    variantSoldOut: \"variant--soldout\",\n    variantUnavailable: \"variant--unavailable\",\n  };\n\n  const selectors$r = {\n    apiContent: \"[data-api-content]\",\n    apiLineItems: \"[data-api-line-items]\",\n    apiUpsellItems: \"[data-api-upsell-items]\",\n    apiBundleItems: \"[data-api-bundle-items]\",\n    apiCartPrice: \"[data-api-cart-price]\",\n    animation: \"[data-animation]\",\n    additionalCheckoutButtons: \".additional-checkout-buttons\",\n    buttonSkipUpsellProduct: \"[data-skip-upsell-product]\",\n    cartBarAdd: \"[data-add-to-cart-bar]\",\n    cartCloseError: \"[data-cart-error-close]\",\n    cartDrawer: \"cart-drawer\",\n    cartDrawerClose: \"[data-cart-drawer-close]\",\n    cartEmpty: \"[data-cart-empty]\",\n    cartErrors: \"[data-cart-errors]\",\n    cartItemRemove: \"[data-item-remove]\",\n    cartPage: \"[data-cart-page]\",\n    cartForm: \"[data-cart-form]\",\n    cartTermsCheckbox: \"[data-cart-acceptance-checkbox]\",\n    cartCheckoutButtonWrapper: \"[data-cart-checkout-buttons]\",\n    cartCheckoutButton: \"[data-cart-checkout-button]\",\n    cartTotal: \"[data-cart-total]\",\n    checkoutButtons: \"[data-checkout-buttons]\",\n    errorMessage: \"[data-error-message]\",\n    formCloseError: \"[data-close-error]\",\n    formErrorsContainer: \"[data-cart-errors-container]\",\n    formWrapper: \"[data-form-wrapper]\",\n    freeShipping: \"[data-free-shipping]\",\n    freeShippingGraph: \"[data-progress-graph]\",\n    freeShippingProgress: \"[data-progress-bar]\",\n    headerWrapper: \"[data-header-wrapper]\",\n    item: \"[data-item]\",\n    itemsHolder: \"[data-items-holder]\",\n    leftToSpend: \"[data-left-to-spend]\",\n    navDrawer: \"[data-drawer]\",\n    outerSection: \"[data-section-id]\",\n    priceHolder: \"[data-cart-price-holder]\",\n    quickAddHolder: \"[data-quick-add-holder]\",\n    quickAddModal: \"[data-quick-add-modal]\",\n    qtyInput: 'input[name=\"updates[]\"]',\n    upsellProductsHolder: \"[data-upsell-products]\",\n    bundleProductsHolder: \"[data-bundle-products]\",\n    upsellWidget: \"[data-upsell-widget]\",\n    bundleWidget: \"[data-bundle-widget]\",\n    termsErrorMessage: \"[data-terms-error-message]\",\n    collapsibleBody: \"[data-collapsible-body]\",\n    discountInput: \"[data-discount-input]\",\n    discountField: \"[data-discount-field]\",\n    discountButton: \"[data-apply-discount]\",\n    discountBody: \"[data-discount-body]\",\n    discountCode: \"[data-discount-code]\",\n    discountErrorMessage: \"[data-discount-error-message]\",\n    removeDiscount: \"[data-remove-discount]\",\n    noscript: \"noscript\",\n  };\n\n  const attributes$h = {\n    cartTotal: \"data-cart-total\",\n    disabled: \"disabled\",\n    freeShipping: \"data-free-shipping\",\n    freeShippingLimit: \"data-free-shipping-limit\",\n    item: \"data-item\",\n    itemIndex: \"data-item-index\",\n    itemTitle: \"data-item-title\",\n    open: \"open\",\n    quickAddHolder: \"data-quick-add-holder\",\n    quickAddVariant: \"data-quick-add-variant\",\n    scrollLocked: \"data-scroll-locked\",\n    upsellAutoOpen: \"data-upsell-auto-open\",\n    name: \"name\",\n    maxInventoryReached: \"data-max-inventory-reached\",\n    errorMessagePosition: \"data-error-message-position\",\n    discountButton: \"data-cart-discount-button\",\n  };\n\n  class CartItems extends HTMLElement {\n    constructor() {\n      super();\n\n      this.a11y = window.theme.a11y;\n    }\n\n    connectedCallback() {\n      // DOM Elements\n      this.cartPage = document.querySelector(selectors$r.cartPage);\n      this.cartForm = document.querySelector(selectors$r.cartForm);\n      this.cartDrawer = document.querySelector(selectors$r.cartDrawer);\n      this.cartEmpty = document.querySelector(selectors$r.cartEmpty);\n      this.cartTermsCheckbox = document.querySelector(\n        selectors$r.cartTermsCheckbox,\n      );\n      this.cartCheckoutButtonWrapper = document.querySelector(\n        selectors$r.cartCheckoutButtonWrapper,\n      );\n      this.cartCheckoutButton = document.querySelector(\n        selectors$r.cartCheckoutButton,\n      );\n      this.checkoutButtons = document.querySelector(\n        selectors$r.checkoutButtons,\n      );\n      this.itemsHolder = document.querySelector(selectors$r.itemsHolder);\n      this.priceHolder = document.querySelector(selectors$r.priceHolder);\n      this.items = document.querySelectorAll(selectors$r.item);\n      this.cartTotal = document.querySelector(selectors$r.cartTotal);\n      this.freeShipping = document.querySelectorAll(selectors$r.freeShipping);\n      this.cartErrorHolder = document.querySelector(selectors$r.cartErrors);\n      this.cartCloseErrorMessage = document.querySelector(\n        selectors$r.cartCloseError,\n      );\n      this.headerWrapper = document.querySelector(selectors$r.headerWrapper);\n      this.navDrawer = document.querySelector(selectors$r.navDrawer);\n      this.upsellProductsHolder = document.querySelector(\n        selectors$r.upsellProductsHolder,\n      );\n      this.bundleProductsHolder = document.querySelector(\n        selectors$r.bundleProductsHolder,\n      );\n      this.subtotal = window.theme.subtotal;\n      this.discountInput = document.querySelector(selectors$r.discountInput);\n      this.discountField = document.querySelector(selectors$r.discountField);\n      this.discountButton = document.querySelector(selectors$r.discountButton);\n      this.hasDiscountBlock = !!document.querySelector(\n        selectors$r.discountButton,\n      );\n      this.discountErrorMessage = document.querySelector(\n        selectors$r.discountErrorMessage,\n      );\n      this.existingDiscountCodes = [];\n      this.discounts = document.querySelectorAll(selectors$r.discountBody);\n\n      // Define Cart object depending on if we have cart drawer or cart page\n      this.cart = this.cartDrawer || this.cartPage;\n\n      // Discounts: apply UI is optional; cart-level rows (remove) still need listeners\n      if (this.hasDiscountBlock) {\n        this.discountButton.addEventListener(\"click\", (event) => {\n          event.preventDefault();\n\n          const newDiscountCode = this.discountInput.value.trim();\n          this.discountInput.value = \"\";\n\n          if (newDiscountCode) {\n            this.applyDiscount(newDiscountCode);\n          }\n        });\n      }\n\n      const discountRowsRoot = this.cart || document;\n      if (\n        this.hasDiscountBlock ||\n        discountRowsRoot.querySelector(selectors$r.discountBody)\n      ) {\n        this.bindDiscountEventListeners();\n      }\n\n      // Cart events\n      this.animateItems = this.animateItems.bind(this);\n      this.addToCart = this.addToCart.bind(this);\n      this.cartAddEvent = this.cartAddEvent.bind(this);\n      this.updateProgress = this.updateProgress.bind(this);\n      this.onCartDrawerClose = this.onCartDrawerClose.bind(this);\n\n      // Set global event listeners for \"Add to cart\" and Announcement bar wheel progress\n      document.addEventListener(\"theme:cart:add\", this.cartAddEvent);\n      document.addEventListener(\"theme:announcement:init\", this.updateProgress);\n\n      if (theme.settings.cartType == \"drawer\") {\n        document.addEventListener(\"theme:cart-drawer:open\", this.animateItems);\n        document.addEventListener(\n          \"theme:cart-drawer:close\",\n          this.onCartDrawerClose,\n        );\n      }\n\n      // Upsell or bundle products\n      this.skipUpsellProductsArray = [];\n      this.skipBundleProductsArray = [];\n      this.skipUpsellOrBundleProductEvent();\n      this.checkSkippedUpsellOrBundleProductsFromStorage();\n      this.toggleCartUpsellOrBundleWidgetVisibility();\n\n      // Free Shipping values\n      this.circumference = 28 * Math.PI; // radius - stroke * 4 * PI\n      this.freeShippingLimit = this.freeShipping.length\n        ? Number(\n            this.freeShipping[0].getAttribute(attributes$h.freeShippingLimit),\n          ) *\n          100 *\n          window.Shopify.currency.rate\n        : 0;\n\n      this.freeShippingMessageHandle(this.subtotal);\n      this.updateProgress();\n\n      this.build = this.build.bind(this);\n      this.updateCart = this.updateCart.bind(this);\n      this.productAddCallback = this.productAddCallback.bind(this);\n      this.formSubmitHandler = window.theme.throttle(\n        this.formSubmitHandler.bind(this),\n        50,\n      );\n\n      if (this.cartPage) {\n        this.animateItems();\n      }\n\n      if (this.cart) {\n        // Checking\n        this.hasItemsInCart = this.hasItemsInCart.bind(this);\n        this.cartCount = this.getCartItemCount();\n      }\n\n      // Set classes\n      this.toggleClassesOnContainers =\n        this.toggleClassesOnContainers.bind(this);\n\n      // Flags\n      this.totalItems = this.items.length;\n      this.showCannotAddMoreInCart = false;\n      this.cartUpdateFailed = false;\n      this.discountError = false;\n\n      // Cart Events\n      this.cartEvents();\n      this.cartRemoveEvents();\n      this.cartUpdateEvents();\n\n      document.addEventListener(\"theme:product:add\", this.productAddCallback);\n      document.addEventListener(\n        \"theme:product:add-error\",\n        this.productAddCallback,\n      );\n      document.addEventListener(\"theme:cart:refresh\", this.getCart.bind(this));\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:cart:add\", this.cartAddEvent);\n      document.removeEventListener(\"theme:cart:refresh\", this.cartAddEvent);\n      document.removeEventListener(\n        \"theme:announcement:init\",\n        this.updateProgress,\n      );\n      document.removeEventListener(\n        \"theme:product:add\",\n        this.productAddCallback,\n      );\n      document.removeEventListener(\n        \"theme:product:add-error\",\n        this.productAddCallback,\n      );\n\n      if (document.documentElement.hasAttribute(attributes$h.scrollLocked)) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n        );\n      }\n    }\n\n    onCartDrawerClose() {\n      this.resetAnimatedItems();\n\n      if (this.cartDrawer?.classList.contains(classes$n.open)) {\n        this.cart.classList.remove(classes$n.updated);\n      }\n\n      this.cartEmpty.classList.remove(classes$n.updated);\n      this.cartErrorHolder.classList.remove(classes$n.expanded);\n      this.cart.querySelectorAll(selectors$r.animation).forEach((item) => {\n        const removeHidingClass = () => {\n          item.classList.remove(classes$n.hiding);\n          item.removeEventListener(\"animationend\", removeHidingClass);\n        };\n\n        item.classList.add(classes$n.hiding);\n        item.addEventListener(\"animationend\", removeHidingClass);\n      });\n\n      if (this.hasDiscountBlock) {\n        this.discountErrorMessage?.classList.add(\"hidden\");\n      }\n    }\n\n    /**\n     * Cart update event hook\n     *\n     * @return  {Void}\n     */\n\n    cartUpdateEvents() {\n      this.items = document.querySelectorAll(selectors$r.item);\n\n      this.items.forEach((item) => {\n        item.addEventListener(\"theme:cart:update\", (event) => {\n          this.updateCart(\n            {\n              id: event.detail.id,\n              quantity: event.detail.quantity,\n            },\n            item,\n          );\n        });\n      });\n    }\n\n    /**\n     * Cart events\n     *\n     * @return  {Void}\n     */\n\n    cartRemoveEvents() {\n      const cartItemRemove = document.querySelectorAll(\n        selectors$r.cartItemRemove,\n      );\n\n      cartItemRemove.forEach((button) => {\n        const item = button.closest(selectors$r.item);\n        button.addEventListener(\"click\", (event) => {\n          event.preventDefault();\n\n          if (button.classList.contains(classes$n.disabled)) return;\n\n          this.updateCart(\n            {\n              id: button.dataset.id,\n              quantity: 0,\n            },\n            item,\n          );\n        });\n      });\n\n      if (this.cartCloseErrorMessage) {\n        this.cartCloseErrorMessage.addEventListener(\"click\", (event) => {\n          event.preventDefault();\n\n          this.cartErrorHolder.classList.remove(classes$n.expanded);\n        });\n      }\n    }\n\n    /**\n     * Cart event add product to cart\n     *\n     * @return  {Void}\n     */\n\n    cartAddEvent(event) {\n      let formData = \"\";\n      let button = event.detail.button;\n\n      if (button.hasAttribute(\"disabled\")) return;\n      const form = button.closest(\"form\");\n      // Validate form\n\n      if (!form.checkValidity()) {\n        form.reportValidity();\n        return;\n      }\n      formData = new FormData(form);\n\n      const hasInputsInNoScript = [...form.elements].some((el) =>\n        el.closest(selectors$r.noscript),\n      );\n      if (hasInputsInNoScript) {\n        formData = this.handleFormDataDuplicates([...form.elements], formData);\n      }\n\n      if (form !== null && form.querySelector('[type=\"file\"]')) {\n        return;\n      }\n      if (theme.settings.cartType === \"drawer\" && this.cartDrawer) {\n        event.preventDefault();\n      }\n\n      const maxInventoryReached = form.getAttribute(\n        attributes$h.maxInventoryReached,\n      );\n      const errorMessagePosition = form.getAttribute(\n        attributes$h.errorMessagePosition,\n      );\n      this.showCannotAddMoreInCart = false;\n      if (maxInventoryReached === \"true\" && errorMessagePosition === \"cart\") {\n        this.showCannotAddMoreInCart = true;\n      }\n\n      this.addToCart(formData, button);\n    }\n\n    /**\n     * Bind event listeners for discount elements\n     *\n     * @return  {Void}\n     */\n    bindDiscountEventListeners() {\n      const discountRowsRoot = this.cart || document;\n      if (\n        !this.hasDiscountBlock &&\n        !discountRowsRoot.querySelector(selectors$r.discountBody)\n      ) {\n        return;\n      }\n\n      this.discounts = discountRowsRoot.querySelectorAll(\n        selectors$r.discountBody,\n      );\n\n      this.discounts.forEach((discount) => {\n        const discountCode = discount.dataset.discountCode;\n\n        if (!this.existingDiscountCodes.includes(discountCode)) {\n          this.existingDiscountCodes.push(discountCode);\n        }\n\n        // Add event listener to remove discount\n        const removeButton = discount.querySelector(selectors$r.removeDiscount);\n        if (removeButton) {\n          // Remove existing listener to prevent duplicates\n          removeButton.removeEventListener(\"click\", this.handleRemoveDiscount);\n\n          // Add new listener\n          removeButton.addEventListener(\"click\", (event) => {\n            event.preventDefault();\n            this.removeDiscount(discountCode);\n          });\n        }\n      });\n    }\n\n    applyDiscount(discountCode) {\n      if (this.existingDiscountCodes.includes(discountCode)) {\n        this.discountErrorMessage.classList.remove(\"hidden\");\n        this.discountErrorMessage.textContent =\n          window.theme.strings.discount_already_applied;\n        return;\n      }\n\n      this.existingDiscountCodes.push(discountCode);\n      this.updateCartDiscounts(this.existingDiscountCodes.join(\",\"));\n    }\n\n    removeDiscount(discountCode) {\n      if (!this.existingDiscountCodes.includes(discountCode)) return;\n\n      this.existingDiscountCodes = this.existingDiscountCodes.filter(\n        (code) => code !== discountCode,\n      );\n      this.updateCartDiscounts(this.existingDiscountCodes.join(\",\"));\n    }\n\n    updateCartDiscounts(discountString) {\n      const lastAttemptedDiscount = discountString\n        .split(\",\")\n        .filter((c) => c)\n        .pop()\n        ?.trim();\n\n      this.disableCartButtons();\n      this.discountErrorMessage?.classList.add(\"hidden\");\n\n      fetch(window.theme.routes.cart_update_url, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Accept: \"application/json\",\n        },\n        body: JSON.stringify({\n          discount: discountString,\n        }),\n      })\n        .then((response) => {\n          if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n          }\n          return response.text();\n        })\n        .then((text) => {\n          let data;\n          try {\n            data = JSON.parse(text);\n          } catch (e) {\n            console.error(\"Failed to parse cart update response:\", text);\n            throw new Error(\"Invalid JSON response from server.\");\n          }\n\n          if (lastAttemptedDiscount) {\n            const wasApplied =\n              data.discount_codes &&\n              Array.isArray(data.discount_codes) &&\n              data.discount_codes.some(\n                (d) => d.code === lastAttemptedDiscount && d.applicable,\n              );\n\n            if (!wasApplied) {\n              this.discountError = true;\n              this.existingDiscountCodes = this.existingDiscountCodes.filter(\n                (code) => code !== lastAttemptedDiscount,\n              );\n            } else {\n              this.discountError = false;\n            }\n          } else {\n            this.discountError = false;\n          }\n\n          this.getCart();\n        })\n        .catch((error) => {\n          console.log(error);\n        });\n    }\n\n    /**\n     * Modify the `formData` object in case there are key/value pairs with an overlapping `key`\n     *  - the presence of form input fields inside a `noscript` tag leads to a duplicate `key`, which overwrites the existing `value` when the `FormData` is constructed\n     *  - such key/value pairs discrepancies occur in the Theme editor, when any setting is updated, and right before one presses the \"Save\" button\n     *\n     * @param   {Array}  A list of all `HTMLFormElement.elements` DOM nodes\n     * @param   {Object}  `FormData` object, created with the `FormData()` constructor\n     *\n     * @return  {Object} Updated `FormData` object that does not contain any duplicate keys\n     */\n    handleFormDataDuplicates(elements, formData) {\n      if (!elements.length || typeof formData !== \"object\") return formData;\n\n      elements.forEach((element) => {\n        if (element.closest(selectors$r.noscript)) {\n          const key = element.getAttribute(attributes$h.name);\n          const value = element.value;\n\n          if (key) {\n            const values = formData.getAll(key);\n            if (values.length > 1) values.splice(values.indexOf(value), 1);\n\n            formData.delete(key);\n            formData.set(key, values[0]);\n          }\n        }\n      });\n\n      return formData;\n    }\n\n    /**\n     * Cart events\n     *\n     * @return  {Void}\n     */\n\n    cartEvents() {\n      if (this.cartTermsCheckbox) {\n        this.cartTermsCheckbox.removeEventListener(\n          \"change\",\n          this.formSubmitHandler,\n        );\n        this.cartCheckoutButtonWrapper.removeEventListener(\n          \"click\",\n          this.formSubmitHandler,\n        );\n        this.cartForm.removeEventListener(\"submit\", this.formSubmitHandler);\n\n        this.cartTermsCheckbox.addEventListener(\n          \"change\",\n          this.formSubmitHandler,\n        );\n        this.cartCheckoutButtonWrapper.addEventListener(\n          \"click\",\n          this.formSubmitHandler,\n        );\n        this.cartForm.addEventListener(\"submit\", this.formSubmitHandler);\n      }\n    }\n\n    formSubmitHandler() {\n      const termsAccepted = document.querySelector(\n        selectors$r.cartTermsCheckbox,\n      ).checked;\n      const termsError = document.querySelector(selectors$r.termsErrorMessage);\n\n      // Disable form submit if terms and conditions are not accepted\n      if (!termsAccepted) {\n        if (document.querySelector(selectors$r.termsErrorMessage).length > 0) {\n          return;\n        }\n\n        termsError.innerText = theme.strings.cartAcceptanceError;\n        this.cartCheckoutButton.setAttribute(attributes$h.disabled, true);\n        termsError.classList.add(classes$n.expanded);\n      } else {\n        termsError.classList.remove(classes$n.expanded);\n        this.cartCheckoutButton.removeAttribute(attributes$h.disabled);\n      }\n    }\n\n    /**\n     * Cart event remove out of stock error\n     *\n     * @return  {Void}\n     */\n\n    formErrorsEvents(errorContainer) {\n      const buttonErrorClose = errorContainer.querySelector(\n        selectors$r.formCloseError,\n      );\n      buttonErrorClose?.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n\n        if (errorContainer) {\n          errorContainer.classList.remove(classes$n.visible);\n        }\n      });\n    }\n\n    /**\n     * Get response from the cart\n     *\n     * @return  {Void}\n     */\n\n    getCart() {\n      fetch(theme.routes.cart_url + \"?section_id=api-cart-items\")\n        .then(this.cartErrorsHandler)\n        .then((response) => response.text())\n        .then((response) => {\n          const element = document.createElement(\"div\");\n          element.innerHTML = response;\n\n          const cleanResponse = element.querySelector(selectors$r.apiContent);\n          this.build(cleanResponse);\n        })\n        .catch((error) => console.log(error));\n    }\n\n    /**\n     * Add item(s) to the cart and show the added item(s)\n     *\n     * @param   {String}  formData\n     * @param   {DOM Element}  button\n     *\n     * @return  {Void}\n     */\n\n    addToCart(formData, button) {\n      if (this.cart) {\n        this.cart.classList.add(classes$n.loading);\n      }\n\n      const quickAddHolder = button?.closest(selectors$r.quickAddHolder);\n\n      if (button) {\n        button.classList.add(classes$n.loading);\n        button.disabled = true;\n      }\n\n      if (quickAddHolder) {\n        quickAddHolder.classList.add(classes$n.visible);\n      }\n\n      fetch(theme.routes.cart_add_url, {\n        method: \"POST\",\n        headers: {\n          \"X-Requested-With\": \"XMLHttpRequest\",\n          Accept: \"application/javascript\",\n        },\n        body: formData,\n      })\n        .then((response) => response.json())\n        .then((response) => {\n          if (response.status) {\n            this.addToCartError(response, button);\n\n            if (button) {\n              button.classList.remove(classes$n.loading);\n              button.disabled = false;\n            }\n\n            if (!this.showCannotAddMoreInCart) return;\n          }\n\n          if (this.cart) {\n            if (button) {\n              button.classList.remove(classes$n.loading);\n              button.classList.add(classes$n.added);\n\n              button.dispatchEvent(\n                new CustomEvent(\"theme:product:add\", {\n                  detail: {\n                    response: response,\n                    button: button,\n                  },\n                  bubbles: true,\n                }),\n              );\n            }\n            if (theme.settings.cartType === \"page\") {\n              window.location = theme.routes.cart_url;\n            }\n            this.getCart();\n          } else {\n            // Redirect to cart page if \"Add to cart\" is successful\n            window.location = theme.routes.cart_url;\n          }\n        })\n        .catch((error) => {\n          this.addToCartError(error, button);\n          this.enableCartButtons();\n        });\n    }\n\n    /**\n     * Update cart\n     *\n     * @param   {Object}  updateData\n     *\n     * @return  {Void}\n     */\n\n    updateCart(updateData = {}, currentItem = null) {\n      this.cart.classList.add(classes$n.loading);\n\n      let updatedQuantity = updateData.quantity;\n      if (currentItem !== null) {\n        if (updatedQuantity) {\n          currentItem.classList.add(classes$n.loading);\n        } else {\n          currentItem.classList.add(classes$n.removed);\n        }\n      }\n      this.disableCartButtons();\n\n      const newItem =\n        this.cart.querySelector(`[${attributes$h.item}=\"${updateData.id}\"]`) ||\n        currentItem;\n      const lineIndex = newItem?.hasAttribute(attributes$h.itemIndex)\n        ? parseInt(newItem.getAttribute(attributes$h.itemIndex))\n        : 0;\n      const itemTitle = newItem?.hasAttribute(attributes$h.itemTitle)\n        ? newItem.getAttribute(attributes$h.itemTitle)\n        : null;\n\n      if (lineIndex === 0) return;\n\n      const data = {\n        line: lineIndex,\n        quantity: updatedQuantity,\n      };\n\n      fetch(theme.routes.cart_change_url, {\n        method: \"post\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Accept: \"application/json\",\n        },\n        body: JSON.stringify(data),\n      })\n        .then((response) => {\n          return response.text();\n        })\n        .then((state) => {\n          const parsedState = JSON.parse(state);\n\n          if (parsedState.errors) {\n            this.cartUpdateFailed = true;\n            this.updateErrorText(itemTitle);\n            this.toggleErrorMessage();\n            this.resetLineItem(currentItem);\n            this.enableCartButtons();\n            this.bindDiscountEventListeners();\n\n            return;\n          }\n\n          this.getCart();\n        })\n        .catch((error) => {\n          console.log(error);\n          this.enableCartButtons();\n        });\n    }\n\n    /**\n     * Reset line item initial state\n     *\n     * @return  {Void}\n     */\n    resetLineItem(item) {\n      const qtyInput = item.querySelector(selectors$r.qtyInput);\n      const qty = qtyInput.getAttribute(\"value\");\n      qtyInput.value = qty;\n      item.classList.remove(classes$n.loading);\n    }\n\n    /**\n     * Disable cart buttons and inputs\n     *\n     * @return  {Void}\n     */\n    disableCartButtons() {\n      const inputs = this.cart.querySelectorAll(\"input\");\n      const buttons = this.cart.querySelectorAll(\n        `button, ${selectors$r.cartItemRemove}`,\n      );\n\n      if (inputs.length) {\n        inputs.forEach((item) => {\n          item.classList.add(classes$n.disabled);\n          item.blur();\n          item.disabled = true;\n        });\n      }\n\n      if (buttons.length) {\n        buttons.forEach((item) => {\n          item.setAttribute(attributes$h.disabled, true);\n        });\n      }\n    }\n\n    /**\n     * Enable cart buttons and inputs\n     *\n     * @return  {Void}\n     */\n    enableCartButtons() {\n      const inputs = this.cart.querySelectorAll(\"input\");\n      const buttons = this.cart.querySelectorAll(\n        `button, ${selectors$r.cartItemRemove}`,\n      );\n\n      if (inputs.length) {\n        inputs.forEach((item) => {\n          item.classList.remove(classes$n.disabled);\n          item.disabled = false;\n        });\n      }\n\n      if (buttons.length) {\n        buttons.forEach((item) => {\n          item.removeAttribute(attributes$h.disabled);\n        });\n      }\n\n      this.cart.classList.remove(classes$n.loading);\n    }\n\n    /**\n     * Update error text\n     *\n     * @param   {String}  itemTitle\n     *\n     * @return  {Void}\n     */\n\n    updateErrorText(itemTitle) {\n      this.cartErrorHolder.querySelector(selectors$r.errorMessage).innerText =\n        itemTitle;\n    }\n\n    /**\n     * Toggle error message\n     *\n     * @return  {Void}\n     */\n\n    toggleErrorMessage() {\n      if (!this.cartErrorHolder) return;\n\n      this.cartErrorHolder.classList.toggle(\n        classes$n.expanded,\n        this.cartUpdateFailed || this.showCannotAddMoreInCart,\n      );\n\n      // Reset cart error events flag\n      this.showCannotAddMoreInCart = false;\n      this.cartUpdateFailed = false;\n    }\n\n    /**\n     * Handle errors\n     *\n     * @param   {Object}  response\n     *\n     * @return  {Object}\n     */\n\n    cartErrorsHandler(response) {\n      if (!response.ok) {\n        return response.json().then(function (json) {\n          const e = new FetchError({\n            status: response.statusText,\n            headers: response.headers,\n            json: json,\n          });\n          throw e;\n        });\n      }\n      return response;\n    }\n\n    /**\n     * Add to cart error handle\n     *\n     * @param   {Object}  data\n     * @param   {DOM Element/Null} button\n     *\n     * @return  {Void}\n     */\n\n    /**\n     * Hide error message container as soon as an item is successfully added to the cart\n     */\n    hideAddToCartErrorMessage() {\n      const holder = this.button.closest(selectors$r.upsellHolder)\n        ? this.button.closest(selectors$r.upsellHolder)\n        : this.button.closest(selectors$r.productForm);\n      const errorContainer = holder?.querySelector(\n        selectors$r.formErrorsContainer,\n      );\n\n      errorContainer?.classList.remove(classes$n.visible);\n    }\n\n    addToCartError(data, button) {\n      if (this.showCannotAddMoreInCart) return; // Show error in cart drawer instead of product form\n\n      if (button !== null) {\n        const outerContainer =\n          button.closest(selectors$r.outerSection) ||\n          button.closest(selectors$r.quickAddHolder) ||\n          button.closest(selectors$r.quickAddModal);\n        let errorContainer = outerContainer?.querySelector(\n          selectors$r.formErrorsContainer,\n        );\n        const buttonUpsellHolder = button.closest(selectors$r.quickAddHolder);\n\n        if (\n          buttonUpsellHolder &&\n          buttonUpsellHolder.querySelector(selectors$r.formErrorsContainer)\n        ) {\n          errorContainer = buttonUpsellHolder.querySelector(\n            selectors$r.formErrorsContainer,\n          );\n        }\n\n        if (errorContainer) {\n          let errorMessage = `${data.message}: ${data.description}`;\n\n          if (data.message == data.description) {\n            errorMessage = data.message;\n          }\n\n          errorContainer.innerHTML = `<div class=\"errors\">${errorMessage}<button type=\"button\" class=\"errors__close\" data-close-error><svg aria-hidden=\"true\" focusable=\"false\" role=\"presentation\" width=\"24px\" height=\"24px\" stroke-width=\"1\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" color=\"currentColor\" class=\"icon icon-cancel\"><path d=\"M6.758 17.243L12.001 12m5.243-5.243L12 12m0 0L6.758 6.757M12.001 12l5.243 5.243\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg></button></div>`;\n          errorContainer.classList.add(classes$n.visible);\n          this.formErrorsEvents(errorContainer);\n        }\n\n        button.dispatchEvent(\n          new CustomEvent(\"theme:product:add-error\", {\n            detail: {\n              response: data,\n              button: button,\n            },\n            bubbles: true,\n          }),\n        );\n      }\n\n      const quickAddHolder = button?.closest(selectors$r.quickAddHolder);\n\n      if (quickAddHolder) {\n        quickAddHolder.dispatchEvent(\n          new CustomEvent(\"theme:cart:error\", {\n            bubbles: true,\n            detail: {\n              message: data.message,\n              description: data.description,\n              holder: quickAddHolder,\n            },\n          }),\n        );\n      }\n\n      this.cart?.classList.remove(classes$n.loading);\n    }\n\n    /**\n     * Add product to cart events\n     *\n     * @return  {Void}\n     */\n    productAddCallback(event) {\n      let buttons = [];\n      let quickAddHolder = null;\n      const hasError = event.type == \"theme:product:add-error\";\n      const buttonATC = event.detail.button;\n      const cartBarButtonATC = document.querySelector(selectors$r.cartBarAdd);\n\n      buttons.push(buttonATC);\n      quickAddHolder = buttonATC.closest(selectors$r.quickAddHolder);\n\n      if (cartBarButtonATC) {\n        buttons.push(cartBarButtonATC);\n      }\n\n      buttons.forEach((button) => {\n        button.classList.remove(classes$n.loading);\n        if (!hasError) {\n          button.classList.add(classes$n.added);\n        }\n      });\n\n      setTimeout(() => {\n        buttons.forEach((button) => {\n          button.classList.remove(classes$n.added);\n          const isVariantUnavailable =\n            button\n              .closest(selectors$r.formWrapper)\n              ?.classList.contains(classes$n.variantSoldOut) ||\n            button\n              .closest(selectors$r.formWrapper)\n              ?.classList.contains(classes$n.variantUnavailable);\n\n          if (!isVariantUnavailable) {\n            button.disabled = false;\n          }\n        });\n\n        quickAddHolder?.classList.remove(classes$n.visible);\n      }, 1000);\n    }\n\n    /**\n     * Toggle classes on different containers and messages\n     *\n     * @return  {Void}\n     */\n\n    toggleClassesOnContainers() {\n      const hasItemsInCart = this.hasItemsInCart();\n\n      this.cart.classList.toggle(classes$n.empty, !hasItemsInCart);\n\n      if (!hasItemsInCart && this.cartDrawer) {\n        setTimeout(() => {\n          this.a11y.trapFocus(this.cartDrawer, {\n            elementToFocus: this.cartDrawer.querySelector(\n              selectors$r.cartDrawerClose,\n            ),\n          });\n        }, 100);\n      }\n    }\n\n    /**\n     * Build cart depends on results\n     *\n     * @param   {Object}  data\n     *\n     * @return  {Void}\n     */\n\n    build(data) {\n      const cartItemsData = data.querySelector(selectors$r.apiLineItems);\n      const upsellItemsData = data.querySelector(selectors$r.apiUpsellItems);\n      const bundleItemsData = data.querySelector(selectors$r.apiBundleItems);\n\n      const cartEmptyData = Boolean(\n        cartItemsData === null &&\n        upsellItemsData === null &&\n        bundleItemsData === null,\n      );\n      const priceData = data.querySelector(selectors$r.apiCartPrice);\n      const cartTotal = data.querySelector(selectors$r.cartTotal);\n\n      if (this.priceHolder && priceData) {\n        this.priceHolder.innerHTML = priceData.innerHTML;\n      }\n\n      if (cartEmptyData) {\n        this.itemsHolder.innerHTML = data.innerHTML;\n\n        if (this.upsellProductsHolder) {\n          this.upsellProductsHolder.innerHTML = \"\";\n        }\n\n        if (this.bundleProductsHolder) {\n          this.bundleProductsHolder.innerHTML = \"\";\n        }\n      } else {\n        this.itemsHolder.innerHTML = cartItemsData.innerHTML;\n\n        if (this.upsellProductsHolder) {\n          this.upsellProductsHolder.innerHTML = upsellItemsData.innerHTML;\n        }\n\n        if (this.bundleProductsHolder) {\n          this.bundleProductsHolder.innerHTML = bundleItemsData.innerHTML;\n        }\n\n        this.skipUpsellOrBundleProductEvent();\n        this.checkSkippedUpsellOrBundleProductsFromStorage();\n        this.toggleCartUpsellOrBundleWidgetVisibility();\n      }\n\n      this.newTotalItems =\n        cartItemsData && cartItemsData.querySelectorAll(selectors$r.item).length\n          ? cartItemsData.querySelectorAll(selectors$r.item).length\n          : 0;\n      this.subtotal =\n        cartTotal && cartTotal.hasAttribute(attributes$h.cartTotal)\n          ? parseInt(cartTotal.getAttribute(attributes$h.cartTotal))\n          : 0;\n      this.cartCount = this.getCartItemCount();\n\n      document.dispatchEvent(\n        new CustomEvent(\"theme:cart:change\", {\n          bubbles: true,\n          detail: {\n            cartCount: this.cartCount,\n          },\n        }),\n      );\n\n      // Update cart total price\n      this.cartTotal.innerHTML =\n        this.subtotal === 0\n          ? window.theme.strings.free\n          : window.theme.formatMoney(\n              this.subtotal,\n              theme.moneyWithCurrencyFormat,\n            );\n\n      if (this.totalItems !== this.newTotalItems) {\n        this.totalItems = this.newTotalItems;\n\n        this.toggleClassesOnContainers();\n      }\n\n      // Add class \"is-updated\" line items holder to reduce cart items animation delay via CSS variables\n      if (this.cartDrawer?.classList.contains(classes$n.open)) {\n        this.cart.classList.add(classes$n.updated);\n      }\n\n      // Remove cart loading class\n      this.cart.classList.remove(classes$n.loading);\n\n      // Prepare empty cart buttons for animation\n      if (!this.hasItemsInCart()) {\n        this.cartEmpty\n          .querySelectorAll(selectors$r.animation)\n          .forEach((item) => {\n            item.classList.remove(classes$n.animated);\n          });\n      }\n\n      if (this.hasDiscountBlock) {\n        if (this.discountField) {\n          this.discountField.value = this.existingDiscountCodes.join(\",\");\n        }\n\n        if (this.discountError) {\n          this.discountErrorMessage.textContent =\n            window.theme.strings.discount_not_applicable;\n          this.discountErrorMessage.classList.remove(\"hidden\");\n        } else {\n          this.discountErrorMessage.classList.add(\"hidden\");\n        }\n      }\n\n      this.freeShippingMessageHandle(this.subtotal);\n      this.cartRemoveEvents();\n      this.cartUpdateEvents();\n      this.toggleErrorMessage();\n      this.enableCartButtons();\n      this.updateProgress();\n      this.animateItems();\n      this.bindDiscountEventListeners();\n\n      document.dispatchEvent(\n        new CustomEvent(\"theme:product:added\", {\n          bubbles: true,\n        }),\n      );\n    }\n\n    /**\n     * Get cart item count\n     *\n     * @return  {Void}\n     */\n\n    getCartItemCount() {\n      return Array.from(\n        this.cart.querySelectorAll(selectors$r.qtyInput),\n      ).reduce(\n        (total, quantityInput) => total + parseInt(quantityInput.value),\n        0,\n      );\n    }\n\n    /**\n     * Check for items in the cart\n     *\n     * @return  {Void}\n     */\n\n    hasItemsInCart() {\n      return this.totalItems > 0;\n    }\n\n    /**\n     * Show/hide free shipping message\n     *\n     * @param   {Number}  total\n     *\n     * @return  {Void}\n     */\n\n    freeShippingMessageHandle(total) {\n      if (!this.freeShipping.length) return;\n\n      this.freeShipping.forEach((message) => {\n        const hasQualifiedShippingMessage =\n          message.hasAttribute(attributes$h.freeShipping) &&\n          message.getAttribute(attributes$h.freeShipping) === \"true\" &&\n          total >= 0;\n        message.classList.toggle(\n          classes$n.success,\n          hasQualifiedShippingMessage && total >= this.freeShippingLimit,\n        );\n      });\n    }\n\n    /**\n     * Update progress when update cart\n     *\n     * @return  {Void}\n     */\n\n    updateProgress() {\n      this.freeShipping = document.querySelectorAll(selectors$r.freeShipping);\n\n      if (!this.freeShipping.length) return;\n\n      const percentValue = isNaN(this.subtotal / this.freeShippingLimit)\n        ? 100\n        : this.subtotal / this.freeShippingLimit;\n      const percent = Math.min(percentValue * 100, 100);\n      const dashoffset =\n        this.circumference - ((percent / 100) * this.circumference) / 2;\n      const leftToSpend = window.theme.formatMoney(\n        this.freeShippingLimit - this.subtotal,\n        theme.moneyFormat,\n      );\n\n      this.freeShipping.forEach((item) => {\n        const progressBar = item.querySelector(\n          selectors$r.freeShippingProgress,\n        );\n        const progressGraph = item.querySelector(selectors$r.freeShippingGraph);\n        const leftToSpendMessage = item.querySelector(selectors$r.leftToSpend);\n\n        if (leftToSpendMessage) {\n          leftToSpendMessage.innerHTML = leftToSpend.replace(\".00\", \"\");\n        }\n\n        // Set progress bar value\n        if (progressBar) {\n          progressBar.value = percent;\n        }\n\n        // Set circle progress\n        if (progressGraph) {\n          progressGraph.style.setProperty(\n            \"--stroke-dashoffset\",\n            `${dashoffset}`,\n          );\n        }\n      });\n    }\n\n    /**\n     * Skip upsell or bundle product\n     */\n    skipUpsellOrBundleProductEvent() {\n      if (\n        this.upsellProductsHolder === null &&\n        this.bundleProductsHolder === null\n      ) {\n        return;\n      }\n\n      const upsellSkipButtons =\n        this.upsellProductsHolder?.querySelectorAll(\n          selectors$r.buttonSkipUpsellProduct,\n        ) || [];\n      const bundleSkipButtons =\n        this.bundleProductsHolder?.querySelectorAll(\n          selectors$r.buttonSkipUpsellProduct,\n        ) || [];\n      const allSkipButtons = [...upsellSkipButtons, ...bundleSkipButtons];\n\n      if (allSkipButtons.length) {\n        allSkipButtons.forEach((button) => {\n          button.addEventListener(\"click\", (event) => {\n            event.preventDefault();\n\n            const productID = button\n              .closest(selectors$r.quickAddHolder)\n              .getAttribute(attributes$h.quickAddHolder);\n            const isUpsell = !!button.closest(selectors$r.upsellWidget);\n            const isBundle = !!button.closest(selectors$r.bundleWidget);\n\n            if (isUpsell && !this.skipUpsellProductsArray.includes(productID)) {\n              this.skipUpsellProductsArray.push(productID);\n              window.sessionStorage.setItem(\n                \"skip_upsell_products\",\n                this.skipUpsellProductsArray,\n              );\n              this.removeUpsellOrBundleProduct(productID, \"upsell\");\n            }\n\n            if (isBundle && !this.skipBundleProductsArray.includes(productID)) {\n              this.skipBundleProductsArray.push(productID);\n              window.sessionStorage.setItem(\n                \"skip_bundle_products\",\n                this.skipBundleProductsArray,\n              );\n              this.removeUpsellOrBundleProduct(productID, \"bundle\");\n            }\n\n            this.toggleCartUpsellOrBundleWidgetVisibility();\n          });\n        });\n      }\n    }\n\n    /**\n     * Check for skipped upsell or bundle product added to session storage\n     */\n    checkSkippedUpsellOrBundleProductsFromStorage() {\n      const types = [\n        {\n          key: \"upsell\",\n          storageKey: \"skip_upsell_products\",\n          array: this.skipUpsellProductsArray,\n        },\n        {\n          key: \"bundle\",\n          storageKey: \"skip_bundle_products\",\n          array: this.skipBundleProductsArray,\n        },\n      ];\n\n      types.forEach(({ key, storageKey, array }) => {\n        const skippedItems = window.sessionStorage.getItem(storageKey);\n        if (skippedItems) {\n          skippedItems.split(\",\").forEach((productID) => {\n            if (!array.includes(productID)) {\n              array.push(productID);\n            }\n            this.removeUpsellOrBundleProduct(productID, key);\n          });\n        }\n      });\n    }\n\n    removeUpsellOrBundleProduct(productID, type = \"upsell\") {\n      const holders = {\n        upsell: this.upsellProductsHolder,\n        bundle: this.bundleProductsHolder,\n      };\n      const holder = holders[type];\n      if (!holder) return;\n\n      const product = holder.querySelector(\n        `[${attributes$h.quickAddHolder}=\"${productID}\"]`,\n      );\n      if (product && product.parentNode) {\n        product.parentNode.remove();\n      }\n    }\n\n    /**\n     * Show or hide cart upsell or bundle products widget visibility\n     */\n    toggleCartUpsellOrBundleWidgetVisibility() {\n      if (!this.upsellProductsHolder && !this.bundleProductsHolder) return;\n\n      const upsellItems = this.upsellProductsHolder?.querySelectorAll(\n        selectors$r.quickAddHolder,\n      );\n      const bundleItems = this.bundleProductsHolder?.querySelectorAll(\n        selectors$r.quickAddHolder,\n      );\n      const upsellWidget = this.upsellProductsHolder?.closest(\n        selectors$r.upsellWidget,\n      );\n      const bundleWidget = this.bundleProductsHolder?.closest(\n        selectors$r.bundleWidget,\n      );\n\n      if (!upsellWidget && !bundleWidget) return;\n\n      // Helper to toggle and auto-open widget\n      const toggleWidget = (widget, items, autoOpenAttr) => {\n        if (!widget) return;\n        widget.classList.toggle(classes$n.hidden, !items.length);\n        if (\n          items.length &&\n          !widget.hasAttribute(attributes$h.open) &&\n          widget.hasAttribute(autoOpenAttr)\n        ) {\n          widget.setAttribute(attributes$h.open, true);\n          const widgetBody = widget.querySelector(selectors$r.collapsibleBody);\n          if (widgetBody) {\n            widgetBody.style.height = \"auto\";\n          }\n        }\n      };\n\n      toggleWidget(upsellWidget, upsellItems, attributes$h.upsellAutoOpen);\n      toggleWidget(bundleWidget, bundleItems, attributes$h.upsellAutoOpen);\n    }\n\n    /**\n     * Remove initially added AOS classes to allow animation on cart drawer open\n     *\n     * @return  {Void}\n     */\n    resetAnimatedItems() {\n      this.cart.querySelectorAll(selectors$r.animation).forEach((item) => {\n        item.classList.remove(classes$n.animated);\n        item.classList.remove(classes$n.hiding);\n      });\n    }\n\n    /**\n     * Cart elements opening animation\n     *\n     * @return  {Void}\n     */\n    animateItems(e) {\n      requestAnimationFrame(() => {\n        let cart = this.cart;\n\n        if (e && e.detail && e.detail.target) {\n          cart = e.detail.target;\n        }\n\n        cart?.querySelectorAll(selectors$r.animation).forEach((item) => {\n          item.classList.add(classes$n.animated);\n        });\n      });\n    }\n  }\n\n  if (!customElements.get(\"cart-items\")) {\n    customElements.define(\"cart-items\", CartItems);\n  }\n\n  const attributes$g = {\n    count: \"data-cart-count\",\n    limit: \"data-limit\",\n  };\n\n  class CartCount extends HTMLElement {\n    constructor() {\n      super();\n\n      this.cartCount = null;\n      this.limit = this.getAttribute(attributes$g.limit);\n      this.onCartChangeCallback = this.onCartChange.bind(this);\n    }\n\n    connectedCallback() {\n      document.addEventListener(\"theme:cart:change\", this.onCartChangeCallback);\n    }\n\n    disconnectedCallback() {\n      document.addEventListener(\"theme:cart:change\", this.onCartChangeCallback);\n    }\n\n    onCartChange(event) {\n      this.cartCount = event.detail.cartCount;\n      this.update();\n    }\n\n    update() {\n      if (this.cartCount !== null) {\n        this.setAttribute(attributes$g.count, this.cartCount);\n        let countValue = this.cartCount;\n\n        if (this.limit && this.cartCount >= this.limit) {\n          countValue = \"9+\";\n        }\n\n        this.innerText = countValue;\n      }\n    }\n  }\n\n  if (!customElements.get(\"cart-count\")) {\n    customElements.define(\"cart-count\", CartCount);\n  }\n\n  const classes$m = {\n    open: \"is-open\",\n    closing: \"is-closing\",\n    duplicate: \"drawer--duplicate\",\n    drawerEditorError: \"drawer-editor-error\",\n  };\n\n  const selectors$q = {\n    cartDrawer: \"cart-drawer\",\n    cartDrawerClose: \"[data-cart-drawer-close]\",\n    cartDrawerSection: '[data-section-type=\"cart-drawer\"]',\n    cartDrawerInner: \"[data-cart-drawer-inner]\",\n    shopifySection: \".shopify-section\",\n  };\n\n  const attributes$f = {\n    drawerUnderlay: \"data-drawer-underlay\",\n  };\n\n  class CartDrawer extends HTMLElement {\n    constructor() {\n      super();\n\n      this.cartDrawerIsOpen = false;\n\n      this.cartDrawerClose = this.querySelector(selectors$q.cartDrawerClose);\n      this.cartDrawerInner = this.querySelector(selectors$q.cartDrawerInner);\n      this.openCartDrawer = this.openCartDrawer.bind(this);\n      this.closeCartDrawer = this.closeCartDrawer.bind(this);\n      this.toggleCartDrawer = this.toggleCartDrawer.bind(this);\n      this.openCartDrawerOnProductAdded =\n        this.openCartDrawerOnProductAdded.bind(this);\n      this.openCartDrawerOnSelect = this.openCartDrawerOnSelect.bind(this);\n      this.closeCartDrawerOnDeselect =\n        this.closeCartDrawerOnDeselect.bind(this);\n      this.cartDrawerSection = this.closest(selectors$q.shopifySection);\n      this.a11y = window.theme.a11y;\n\n      this.closeCartEvents();\n    }\n\n    connectedCallback() {\n      const drawerSection = this.closest(selectors$q.shopifySection);\n\n      /* Prevent duplicated cart drawers */\n      if (window.theme.hasCartDrawer) {\n        if (!window.Shopify.designMode) {\n          drawerSection.remove();\n          return;\n        } else {\n          const errorMessage = document.createElement(\"div\");\n          errorMessage.classList.add(classes$m.drawerEditorError);\n          errorMessage.innerText = \"Cart drawer section already exists.\";\n\n          if (!this.querySelector(`.${classes$m.drawerEditorError}`)) {\n            this.querySelector(selectors$q.cartDrawerInner).append(\n              errorMessage,\n            );\n          }\n\n          this.classList.add(classes$m.duplicate);\n        }\n      }\n\n      window.theme.hasCartDrawer = true;\n\n      this.addEventListener(\"theme:cart-drawer:show\", this.openCartDrawer);\n      document.addEventListener(\"theme:cart:toggle\", this.toggleCartDrawer);\n      document.addEventListener(\"theme:quick-add:open\", this.closeCartDrawer);\n      document.addEventListener(\n        \"theme:product:added\",\n        this.openCartDrawerOnProductAdded,\n      );\n      document.addEventListener(\n        \"shopify:block:select\",\n        this.openCartDrawerOnSelect,\n      );\n      document.addEventListener(\n        \"shopify:section:select\",\n        this.openCartDrawerOnSelect,\n      );\n      document.addEventListener(\n        \"shopify:section:deselect\",\n        this.closeCartDrawerOnDeselect,\n      );\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\n        \"theme:product:added\",\n        this.openCartDrawerOnProductAdded,\n      );\n      document.removeEventListener(\"theme:cart:toggle\", this.toggleCartDrawer);\n      document.removeEventListener(\n        \"theme:quick-add:open\",\n        this.closeCartDrawer,\n      );\n      document.removeEventListener(\n        \"shopify:block:select\",\n        this.openCartDrawerOnSelect,\n      );\n      document.removeEventListener(\n        \"shopify:section:select\",\n        this.openCartDrawerOnSelect,\n      );\n      document.removeEventListener(\n        \"shopify:section:deselect\",\n        this.closeCartDrawerOnDeselect,\n      );\n\n      if (document.querySelectorAll(selectors$q.cartDrawer).length <= 1) {\n        window.theme.hasCartDrawer = false;\n      }\n\n      appendCartItems();\n    }\n\n    /**\n     * Open cart drawer when product is added to cart\n     *\n     * @return  {Void}\n     */\n    openCartDrawerOnProductAdded() {\n      if (!this.cartDrawerIsOpen) {\n        this.openCartDrawer();\n      }\n    }\n\n    /**\n     * Open cart drawer on block or section select\n     *\n     * @return  {Void}\n     */\n    openCartDrawerOnSelect(e) {\n      const cartDrawerSection =\n        e.target.querySelector(selectors$q.shopifySection) ||\n        e.target.closest(selectors$q.shopifySection) ||\n        e.target;\n\n      if (cartDrawerSection === this.cartDrawerSection) {\n        this.openCartDrawer(true);\n      }\n    }\n\n    /**\n     * Close cart drawer on section deselect\n     *\n     * @return  {Void}\n     */\n    closeCartDrawerOnDeselect() {\n      if (this.cartDrawerIsOpen) {\n        this.closeCartDrawer();\n      }\n    }\n\n    /**\n     * Open cart drawer and add class on body\n     *\n     * @return  {Void}\n     */\n\n    openCartDrawer(forceOpen = false) {\n      if (!forceOpen && this.classList.contains(classes$m.duplicate)) return;\n\n      this.cartDrawerIsOpen = true;\n      this.onBodyClickEvent =\n        this.onBodyClickEvent || this.onBodyClick.bind(this);\n      document.body.addEventListener(\"click\", this.onBodyClickEvent);\n\n      document.dispatchEvent(\n        new CustomEvent(\"theme:cart-drawer:open\", {\n          detail: {\n            target: this,\n          },\n          bubbles: true,\n        }),\n      );\n      document.dispatchEvent(\n        new CustomEvent(\"theme:scroll:lock\", { bubbles: true }),\n      );\n\n      this.classList.add(classes$m.open);\n\n      // Observe Additional Checkout Buttons\n      this.observeAdditionalCheckoutButtons();\n\n      window.theme.waitForAnimationEnd(this.cartDrawerInner).then(() => {\n        this.a11y.trapFocus(this, {\n          elementToFocus: this.querySelector(selectors$q.cartDrawerClose),\n        });\n      });\n    }\n\n    /**\n     * Close cart drawer and remove class on body\n     *\n     * @return  {Void}\n     */\n\n    closeCartDrawer() {\n      if (!this.classList.contains(classes$m.open)) return;\n\n      this.classList.add(classes$m.closing);\n      this.classList.remove(classes$m.open);\n\n      this.cartDrawerIsOpen = false;\n\n      document.dispatchEvent(\n        new CustomEvent(\"theme:cart-drawer:close\", {\n          bubbles: true,\n        }),\n      );\n\n      this.a11y.removeTrapFocus();\n      this.a11y.autoFocusLastElement();\n\n      document.body.removeEventListener(\"click\", this.onBodyClickEvent);\n      document.dispatchEvent(\n        new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n      );\n\n      window.theme.waitForAnimationEnd(this.cartDrawerInner).then(() => {\n        this.classList.remove(classes$m.closing);\n      });\n    }\n\n    /**\n     * Toggle cart drawer\n     *\n     * @return  {Void}\n     */\n\n    toggleCartDrawer() {\n      if (!this.cartDrawerIsOpen) {\n        this.openCartDrawer();\n      } else {\n        this.closeCartDrawer();\n      }\n    }\n\n    /**\n     * Event click to element to close cart drawer\n     *\n     * @return  {Void}\n     */\n\n    closeCartEvents() {\n      this.cartDrawerClose.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        this.closeCartDrawer();\n      });\n\n      this.addEventListener(\"keyup\", (e) => {\n        if (e.code === \"Escape\") {\n          this.closeCartDrawer();\n        }\n      });\n    }\n\n    onBodyClick(e) {\n      if (e.target.hasAttribute(attributes$f.drawerUnderlay))\n        this.closeCartDrawer();\n    }\n\n    observeAdditionalCheckoutButtons() {\n      // identify an element to observe\n      const additionalCheckoutButtons = this.querySelector(\n        selectors$q.additionalCheckoutButtons,\n      );\n      if (additionalCheckoutButtons) {\n        // create a new instance of `MutationObserver` named `observer`,\n        // passing it a callback function\n        const observer = new MutationObserver(() => {\n          this.a11y.trapFocus(this, {\n            elementToFocus: this.querySelector(selectors$q.cartDrawerClose),\n          });\n          observer.disconnect();\n        });\n\n        // call `observe()` on that MutationObserver instance,\n        // passing it the element to observe, and the options object\n        observer.observe(additionalCheckoutButtons, {\n          subtree: true,\n          childList: true,\n        });\n      }\n    }\n  }\n\n  if (!customElements.get(\"cart-drawer\")) {\n    customElements.define(\"cart-drawer\", CartDrawer);\n  }\n\n  class CollapsibleElements extends HTMLElement {\n    constructor() {\n      super();\n\n      this.single = this.hasAttribute(\"single\");\n      this.toggle = this.toggle.bind(this);\n\n      // Bind event handlers once and store references\n      this.onCollapsibleClickBound = this.onCollapsibleClick.bind(this);\n      this.onTransitionEndBound = this.onTransitionEnd.bind(this);\n    }\n\n    connectedCallback() {\n      // Query fresh DOM elements first\n      this.collapsibles = this.querySelectorAll(\"[data-collapsible]\");\n\n      this.toggle();\n      document.addEventListener(\"theme:resize:width\", this.toggle);\n\n      this.collapsibles.forEach((collapsible) => {\n        const trigger = collapsible.querySelector(\"[data-collapsible-trigger]\");\n        const body = collapsible.querySelector(\"[data-collapsible-body]\");\n\n        trigger?.addEventListener(\"click\", this.onCollapsibleClickBound);\n\n        body?.addEventListener(\"transitionend\", this.onTransitionEndBound);\n      });\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:resize:width\", this.toggle);\n\n      // Only proceed if collapsibles exist\n      if (this.collapsibles) {\n        this.collapsibles.forEach((collapsible) => {\n          const trigger = collapsible.querySelector(\n            \"[data-collapsible-trigger]\",\n          );\n          const body = collapsible.querySelector(\"[data-collapsible-body]\");\n\n          trigger?.removeEventListener(\"click\", this.onCollapsibleClickBound);\n          body?.removeEventListener(\"transitionend\", this.onTransitionEndBound);\n        });\n      }\n\n      // Clear the reference\n      this.collapsibles = null;\n    }\n\n    toggle() {\n      const isDesktopView = !window.theme.isMobile();\n\n      this.collapsibles.forEach((collapsible) => {\n        if (\n          !collapsible.hasAttribute(\"desktop\") &&\n          !collapsible.hasAttribute(\"mobile\")\n        )\n          return;\n\n        const enableDesktop = collapsible.hasAttribute(\"desktop\")\n          ? collapsible.getAttribute(\"desktop\")\n          : \"true\";\n        const enableMobile = collapsible.hasAttribute(\"mobile\")\n          ? collapsible.getAttribute(\"mobile\")\n          : \"true\";\n        const isEligible =\n          (isDesktopView && enableDesktop == \"true\") ||\n          (!isDesktopView && enableMobile == \"true\");\n        const body = collapsible.querySelector(\"[data-collapsible-body]\");\n\n        if (isEligible) {\n          collapsible.removeAttribute(\"disabled\");\n          collapsible\n            .querySelector(\"[data-collapsible-trigger]\")\n            .removeAttribute(\"tabindex\");\n          collapsible.removeAttribute(\"open\");\n\n          this.setBodyHeight(body, \"\");\n        } else {\n          collapsible.setAttribute(\"disabled\", \"\");\n          collapsible.setAttribute(\"open\", true);\n          collapsible\n            .querySelector(\"[data-collapsible-trigger]\")\n            .setAttribute(\"tabindex\", -1);\n        }\n      });\n    }\n\n    open(collapsible) {\n      if (collapsible.getAttribute(\"open\") == \"true\") return;\n\n      const body = collapsible.querySelector(\"[data-collapsible-body]\");\n      const content = collapsible.querySelector(\"[data-collapsible-content]\");\n\n      collapsible.setAttribute(\"open\", true);\n\n      this.setBodyHeight(body, content.offsetHeight);\n    }\n\n    close(collapsible) {\n      if (!collapsible.hasAttribute(\"open\")) return;\n\n      const body = collapsible.querySelector(\"[data-collapsible-body]\");\n      const content = collapsible.querySelector(\"[data-collapsible-content]\");\n\n      this.setBodyHeight(body, content.offsetHeight);\n\n      collapsible.setAttribute(\"open\", false);\n\n      setTimeout(() => {\n        requestAnimationFrame(() => {\n          this.setBodyHeight(body, 0);\n        });\n      });\n    }\n\n    setBodyHeight(body, contentHeight) {\n      body.style.height =\n        contentHeight !== \"auto\" && contentHeight !== \"\"\n          ? `${contentHeight}px`\n          : contentHeight;\n    }\n\n    onTransitionEnd(event) {\n      const body = event.target;\n      const collapsible = body.closest(\"[data-collapsible]\");\n\n      if (event.target !== body || !collapsible) return;\n\n      if (collapsible.getAttribute(\"open\") == \"true\") {\n        this.setBodyHeight(body, \"auto\");\n      }\n\n      if (collapsible.getAttribute(\"open\") == \"false\") {\n        collapsible.removeAttribute(\"open\");\n        this.setBodyHeight(body, \"\");\n      }\n    }\n\n    onCollapsibleClick(event) {\n      event.preventDefault();\n\n      const trigger = event.target;\n      const collapsible = trigger.closest(\"[data-collapsible]\");\n\n      // When we want only one item expanded at the same time\n      if (this.single) {\n        this.collapsibles.forEach((otherCollapsible) => {\n          // if otherCollapsible has attribute open and it's not the one we clicked on, remove the open attribute\n          if (\n            otherCollapsible.hasAttribute(\"open\") &&\n            otherCollapsible != collapsible\n          ) {\n            requestAnimationFrame(() => {\n              this.close(otherCollapsible);\n            });\n          }\n        });\n      }\n\n      if (collapsible.hasAttribute(\"open\")) {\n        this.close(collapsible);\n      } else {\n        this.open(collapsible);\n      }\n\n      collapsible.dispatchEvent(\n        new CustomEvent(\"theme:form:sticky\", {\n          bubbles: true,\n          detail: {\n            element: \"accordion\",\n          },\n        }),\n      );\n      collapsible.dispatchEvent(\n        new CustomEvent(\"theme:collapsible:toggle\", {\n          bubbles: true,\n        }),\n      );\n    }\n  }\n\n  if (!customElements.get(\"collapsible-elements\")) {\n    customElements.define(\"collapsible-elements\", CollapsibleElements);\n  }\n\n  const selectors$p = {\n    deferredMediaButton: \"[data-deferred-media-button]\",\n    media: \"video, model-viewer, iframe\",\n    youtube: '[data-host=\"youtube\"]',\n    vimeo: '[data-host=\"vimeo\"]',\n    template: \"template\",\n    video: \"video\",\n    productModel: \"product-model\",\n  };\n\n  const attributes$e = {\n    loaded: \"loaded\",\n    autoplay: \"autoplay\",\n  };\n\n  class DeferredMedia extends HTMLElement {\n    constructor() {\n      super();\n\n      const poster = this.querySelector(selectors$p.deferredMediaButton);\n      poster?.addEventListener(\"click\", this.loadContent.bind(this));\n    }\n\n    loadContent(focus = true) {\n      this.pauseAllMedia();\n\n      if (!this.getAttribute(attributes$e.loaded)) {\n        const content = document.createElement(\"div\");\n        const templateContent = this.querySelector(\n          selectors$p.template,\n        ).content.firstElementChild.cloneNode(true);\n        content.appendChild(templateContent);\n        this.setAttribute(attributes$e.loaded, true);\n\n        const mediaElement = this.appendChild(\n          content.querySelector(selectors$p.media),\n        );\n        if (focus) mediaElement.focus();\n        if (\n          mediaElement.nodeName == \"VIDEO\" &&\n          mediaElement.getAttribute(attributes$e.autoplay)\n        ) {\n          // Force autoplay on Safari browsers\n          mediaElement.play();\n        }\n      }\n    }\n\n    pauseAllMedia() {\n      document.querySelectorAll(selectors$p.youtube).forEach((video) => {\n        video.contentWindow.postMessage(\n          '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}',\n          \"*\",\n        );\n      });\n      document.querySelectorAll(selectors$p.vimeo).forEach((video) => {\n        video.contentWindow.postMessage('{\"method\":\"pause\"}', \"*\");\n      });\n      document\n        .querySelectorAll(selectors$p.video)\n        .forEach((video) => video.pause());\n      document.querySelectorAll(selectors$p.productModel).forEach((model) => {\n        if (model.modelViewerUI) model.modelViewerUI.pause();\n      });\n    }\n  }\n\n  if (!customElements.get(\"deferred-media\")) {\n    customElements.define(\"deferred-media\", DeferredMedia);\n  }\n\n  window.theme.DeferredMedia = window.theme.DeferredMedia || DeferredMedia;\n\n  /*\n      Observe whether or not elements are visible in their container.\n      Used for sections with horizontal sliders built by native scrolling\n    */\n\n  const classes$l = {\n    visible: \"is-visible\",\n  };\n\n  class IsInView {\n    constructor(container, itemSelector) {\n      if (!container || !itemSelector) return;\n\n      this.observer = null;\n      this.container = container;\n      this.itemSelector = itemSelector;\n\n      this.init();\n    }\n\n    init() {\n      const options = {\n        root: this.container,\n        threshold: [0.01, 0.5, 0.75, 0.99],\n      };\n\n      this.observer = new IntersectionObserver((entries) => {\n        entries.forEach((entry) => {\n          if (entry.intersectionRatio >= 0.99) {\n            entry.target.classList.add(classes$l.visible);\n          } else {\n            entry.target.classList.remove(classes$l.visible);\n          }\n        });\n      }, options);\n\n      this.container.querySelectorAll(this.itemSelector)?.forEach((item) => {\n        this.observer.observe(item);\n      });\n    }\n\n    destroy() {\n      this.observer.disconnect();\n    }\n  }\n\n  const classes$k = {\n    dragging: \"is-dragging\",\n    enabled: \"is-enabled\",\n    scrolling: \"is-scrolling\",\n    visible: \"is-visible\",\n  };\n\n  const selectors$o = {\n    image: \"img, svg\",\n    productImage: \"[data-product-image]\",\n    slide: \"[data-grid-item]\",\n    slider: \"[data-grid-slider]\",\n  };\n\n  class DraggableSlider {\n    constructor(sliderElement) {\n      this.slider = sliderElement;\n      this.isDown = false;\n      this.startX = 0;\n      this.scrollLeft = 0;\n      this.velX = 0;\n      this.scrollAnimation = null;\n      this.isScrolling = false;\n      this.duration = 800; // Change this value if you want to increase or decrease the velocity\n\n      this.scrollStep = this.scrollStep.bind(this);\n      this.scrollToSlide = this.scrollToSlide.bind(this);\n      this.handleMouseDown = this.handleMouseDown.bind(this);\n      this.handleMouseLeave = this.handleMouseLeave.bind(this);\n      this.handleMouseUp = this.handleMouseUp.bind(this);\n      this.handleMouseMove = this.handleMouseMove.bind(this);\n      this.handleMouseWheel = this.handleMouseWheel.bind(this);\n\n      this.slider.addEventListener(\"mousedown\", this.handleMouseDown);\n      this.slider.addEventListener(\"mouseleave\", this.handleMouseLeave);\n      this.slider.addEventListener(\"mouseup\", this.handleMouseUp);\n      this.slider.addEventListener(\"mousemove\", this.handleMouseMove);\n      this.slider.addEventListener(\"wheel\", this.handleMouseWheel, {\n        passive: true,\n      });\n\n      this.slider.classList.add(classes$k.enabled);\n    }\n\n    handleMouseDown(e) {\n      e.preventDefault();\n      this.isDown = true;\n      this.startX = e.pageX - this.slider.offsetLeft;\n      this.scrollLeft = this.slider.scrollLeft;\n      this.cancelMomentumTracking();\n    }\n\n    handleMouseLeave() {\n      if (!this.isDown) return;\n      this.isDown = false;\n      this.beginMomentumTracking();\n    }\n\n    handleMouseUp() {\n      this.isDown = false;\n      this.beginMomentumTracking();\n    }\n\n    handleMouseMove(e) {\n      if (!this.isDown) return;\n      e.preventDefault();\n\n      const x = e.pageX - this.slider.offsetLeft;\n      const ratio = 1; // Increase the number to make it scroll-fast\n      const walk = (x - this.startX) * ratio;\n      const prevScrollLeft = this.slider.scrollLeft;\n      const direction = walk > 0 ? 1 : -1;\n\n      this.slider.classList.add(classes$k.dragging, classes$k.scrolling);\n      this.slider.scrollLeft = this.scrollLeft - walk;\n\n      if (this.slider.scrollLeft !== prevScrollLeft) {\n        this.velX = this.slider.scrollLeft - prevScrollLeft || direction;\n      }\n    }\n\n    handleMouseWheel() {\n      this.cancelMomentumTracking();\n      this.slider.classList.remove(classes$k.scrolling);\n    }\n\n    beginMomentumTracking() {\n      this.isScrolling = false;\n      this.slider.classList.remove(classes$k.dragging);\n      this.cancelMomentumTracking();\n      this.scrollToSlide();\n    }\n\n    cancelMomentumTracking() {\n      cancelAnimationFrame(this.scrollAnimation);\n    }\n\n    scrollToSlide() {\n      if (!this.velX && !this.isScrolling) return;\n\n      const slide = this.slider.querySelector(\n        `${selectors$o.slide}.${classes$k.visible}`,\n      );\n      if (!slide) return;\n\n      const gap = parseInt(window.getComputedStyle(slide).marginRight) || 0;\n      const slideWidth = slide.offsetWidth + gap;\n      const targetPosition = slide.offsetLeft;\n      const direction = this.velX > 0 ? 1 : -1;\n      const slidesToScroll = Math.floor(Math.abs(this.velX) / 100) || 1;\n\n      this.startPosition = this.slider.scrollLeft;\n      this.distance = targetPosition - this.startPosition;\n      this.startTime = performance.now();\n      this.isScrolling = true;\n\n      // Make sure it will move to the next slide if you don't drag far enough\n      if (direction < 0 && this.velX < slideWidth) {\n        this.distance -= slideWidth * slidesToScroll;\n      }\n\n      // Make sure it will move to the previous slide if you don't drag far enough\n      if (direction > 0 && this.velX < slideWidth) {\n        this.distance += slideWidth * slidesToScroll;\n      }\n\n      // Run scroll animation\n      this.scrollAnimation = requestAnimationFrame(this.scrollStep);\n    }\n\n    scrollStep() {\n      const currentTime = performance.now() - this.startTime;\n      const scrollPosition = parseFloat(\n        this.easeOutCubic(Math.min(currentTime, this.duration)),\n      ).toFixed(1);\n\n      this.slider.scrollLeft = scrollPosition;\n\n      if (currentTime < this.duration) {\n        this.scrollAnimation = requestAnimationFrame(this.scrollStep);\n      } else {\n        this.slider.classList.remove(classes$k.scrolling);\n\n        // Reset velocity\n        this.velX = 0;\n        this.isScrolling = false;\n      }\n    }\n\n    easeOutCubic(t) {\n      t /= this.duration;\n      t--;\n      return this.distance * (t * t * t + 1) + this.startPosition;\n    }\n\n    destroy() {\n      this.slider.classList.remove(classes$k.enabled);\n      this.slider.removeEventListener(\"mousedown\", this.handleMouseDown);\n      this.slider.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n      this.slider.removeEventListener(\"mouseup\", this.handleMouseUp);\n      this.slider.removeEventListener(\"mousemove\", this.handleMouseMove);\n      this.slider.removeEventListener(\"wheel\", this.handleMouseWheel);\n    }\n  }\n\n  const selectors$n = {\n    buttonArrow: \"[data-button-arrow]\",\n    collectionImage: \"[data-collection-image]\",\n    columnImage: \"[data-column-image]\",\n    productImage: \"[data-product-image]\",\n    slide: \"[data-grid-item]\",\n    slider: \"[data-grid-slider]\",\n  };\n\n  const attributes$d = {\n    buttonPrev: \"data-button-prev\",\n    buttonNext: \"data-button-next\",\n    alignArrows: \"align-arrows\",\n    imagesWidthsDifferent: \"images-widths-different\",\n  };\n\n  const classes$j = {\n    arrows: \"slider__arrows\",\n    visible: \"is-visible\",\n    scrollSnapDisabled: \"scroll-snap-disabled\",\n  };\n\n  if (!customElements.get(\"grid-slider\")) {\n    customElements.define(\n      \"grid-slider\",\n\n      class GridSlider extends HTMLElement {\n        constructor() {\n          super();\n\n          this.isInitialized = false;\n          this.draggableSlider = null;\n          this.positionArrows = this.positionArrows.bind(this);\n          this.onButtonArrowClick = (e) => this.buttonArrowClickEvent(e);\n          this.slidesObserver = null;\n          this.firstLastSlidesObserver = null;\n          this.isDragging = false;\n          this.toggleSlider = this.toggleSlider.bind(this);\n        }\n\n        connectedCallback() {\n          this.init();\n          this.addEventListener(\"theme:grid-slider:init\", this.init);\n        }\n\n        init() {\n          this.slider = this.querySelector(selectors$n.slider);\n          this.slides = this.querySelectorAll(selectors$n.slide);\n          this.buttons = this.querySelectorAll(selectors$n.buttonArrow);\n          this.slider.classList.add(classes$j.scrollSnapDisabled);\n          this.toggleSlider();\n          document.addEventListener(\"theme:resize:width\", this.toggleSlider);\n\n          window.theme\n            .waitForAllAnimationsEnd(this)\n            .then(() => {\n              this.slider.classList.remove(classes$j.scrollSnapDisabled);\n            })\n            .catch(() => {\n              this.slider.classList.remove(classes$j.scrollSnapDisabled);\n            });\n        }\n\n        toggleSlider() {\n          const sliderWidth = this.slider.clientWidth;\n          const slidesWidth = this.getSlidesWidth();\n          const isEnabled = sliderWidth < slidesWidth;\n\n          if (isEnabled && (!window.theme.isMobile() || !window.theme.touch)) {\n            if (this.isInitialized) return;\n\n            this.slidesObserver = new IsInView(this.slider, selectors$n.slide);\n\n            this.initArrows();\n            this.isInitialized = true;\n\n            // Create an instance of DraggableSlider\n            this.draggableSlider = new DraggableSlider(this.slider);\n          } else {\n            this.destroy();\n          }\n        }\n\n        initArrows() {\n          // Create arrow buttons if don't exist\n          if (!this.buttons.length) {\n            const buttonsWrap = document.createElement(\"div\");\n            buttonsWrap.classList.add(classes$j.arrows);\n            buttonsWrap.innerHTML =\n              theme.sliderArrows.prev + theme.sliderArrows.next;\n\n            // Append buttons outside the slider element\n            this.append(buttonsWrap);\n            this.buttons = this.querySelectorAll(selectors$n.buttonArrow);\n            this.buttonPrev = this.querySelector(\n              `[${attributes$d.buttonPrev}]`,\n            );\n            this.buttonNext = this.querySelector(\n              `[${attributes$d.buttonNext}]`,\n            );\n          }\n\n          this.toggleArrowsObserver();\n\n          if (this.hasAttribute(attributes$d.alignArrows)) {\n            this.positionArrows();\n            this.arrowsResizeObserver();\n          }\n\n          this.buttons.forEach((buttonArrow) => {\n            buttonArrow.addEventListener(\"click\", this.onButtonArrowClick);\n          });\n        }\n\n        buttonArrowClickEvent(e) {\n          e.preventDefault();\n\n          const firstVisibleSlide = this.slider.querySelector(\n            `${selectors$n.slide}.${classes$j.visible}`,\n          );\n          let slide = null;\n\n          if (e.target.hasAttribute(attributes$d.buttonPrev)) {\n            slide = firstVisibleSlide?.previousElementSibling;\n          }\n\n          if (e.target.hasAttribute(attributes$d.buttonNext)) {\n            slide = firstVisibleSlide?.nextElementSibling;\n          }\n\n          this.goToSlide(slide);\n        }\n\n        removeArrows() {\n          this.querySelector(`.${classes$j.arrows}`)?.remove();\n        }\n\n        // Go to prev/next slide on arrow click\n        goToSlide(slide) {\n          if (!slide) return;\n\n          this.slider.scrollTo({\n            top: 0,\n            left: slide.offsetLeft,\n            behavior: \"smooth\",\n          });\n        }\n\n        getSlidesWidth() {\n          return (\n            this.slider.querySelector(selectors$n.slide)?.clientWidth *\n            this.slider.querySelectorAll(selectors$n.slide).length\n          );\n        }\n\n        toggleArrowsObserver() {\n          // Add disable class/attribute on prev/next button\n\n          if (this.buttonPrev && this.buttonNext) {\n            const slidesCount = this.slides.length;\n            const firstSlide = this.slides[0];\n            const lastSlide = this.slides[slidesCount - 1];\n\n            const config = {\n              attributes: true,\n              childList: false,\n              subtree: false,\n            };\n\n            const callback = (mutationList) => {\n              for (const mutation of mutationList) {\n                if (mutation.type === \"attributes\") {\n                  const slide = mutation.target;\n                  const isDisabled = Boolean(\n                    slide.classList.contains(classes$j.visible),\n                  );\n\n                  if (slide == firstSlide) {\n                    this.buttonPrev.disabled = isDisabled;\n                  }\n\n                  if (slide == lastSlide) {\n                    this.buttonNext.disabled = isDisabled;\n                  }\n                }\n              }\n            };\n\n            if (firstSlide && lastSlide) {\n              this.firstLastSlidesObserver = new MutationObserver(callback);\n              this.firstLastSlidesObserver.observe(firstSlide, config);\n              this.firstLastSlidesObserver.observe(lastSlide, config);\n            }\n          }\n        }\n\n        positionArrows() {\n          if (this.hasAttribute(attributes$d.imagesWidthsDifferent)) {\n            const figureElements = this.slider.querySelectorAll(\"figure\");\n\n            const biggestHeight = Math.max(\n              0,\n              ...Array.from(figureElements).map(\n                (figure) => figure.clientHeight,\n              ),\n            );\n\n            this.style.setProperty(\n              \"--button-position\",\n              `${biggestHeight / 2}px`,\n            );\n            return;\n          }\n\n          const targetElement =\n            this.slider.querySelector(selectors$n.productImage) ||\n            this.slider.querySelector(selectors$n.collectionImage) ||\n            this.slider.querySelector(selectors$n.columnImage) ||\n            this.slider;\n\n          if (!targetElement) return;\n\n          this.style.setProperty(\n            \"--button-position\",\n            `${targetElement.clientHeight / 2}px`,\n          );\n        }\n\n        arrowsResizeObserver() {\n          document.addEventListener(\"theme:resize:width\", this.positionArrows);\n        }\n\n        disconnectedCallback() {\n          this.destroy();\n          document.removeEventListener(\"theme:resize:width\", this.toggleSlider);\n        }\n\n        destroy() {\n          this.isInitialized = false;\n          this.draggableSlider?.destroy();\n          this.draggableSlider = null;\n          this.slidesObserver?.destroy();\n          this.slidesObserver = null;\n          this.removeArrows();\n\n          document.removeEventListener(\n            \"theme:resize:width\",\n            this.positionArrows,\n          );\n        }\n      },\n    );\n  }\n\n  /*\n      Observe whether or not there are open modals that require scroll lock\n    */\n\n  window.theme.hasOpenModals = function () {\n    const openModals = Boolean(\n      document.querySelectorAll(\"dialog[open][data-scroll-lock-required]\")\n        .length,\n    );\n    const openDrawers = Boolean(\n      document.querySelectorAll(\".drawer.is-open\").length,\n    );\n\n    return openModals || openDrawers;\n  };\n\n  const selectors$m = {\n    cartDrawer: \"cart-drawer\",\n    cartToggleButton: \"[data-cart-toggle]\",\n    deadLink: '.navlink[href=\"#\"]',\n    desktop: \"[data-header-desktop]\",\n    firstSectionOverlayHeader:\n      \".main-content > .shopify-section.section-overlay-header:first-of-type\",\n    pageHeader: \".page-header\",\n    preventTransparent: \"[data-prevent-transparent-header]\",\n    style: \"data-header-style\",\n    widthContent: \"[data-child-takes-space]\",\n    widthContentWrapper: \"[data-takes-space-wrapper]\",\n    wrapper: \"[data-header-wrapper]\",\n  };\n\n  const classes$i = {\n    clone: \"js__header__clone\",\n    firstSectionOverlayHeader: \"has-first-section-overlay-header\",\n    headerGroup: \"shopify-section-group-header-group\",\n    showMobileClass: \"js__show__mobile\",\n    sticky: \"has-header-sticky\",\n    stuck: \"js__header__stuck\",\n    transparent: \"has-header-transparent\",\n    headerWrapper: \"header-wrapper\",\n  };\n\n  const attributes$c = {\n    drawer: \"data-drawer\",\n    drawerToggle: \"data-drawer-toggle\",\n    scrollLock: \"data-scroll-locked\",\n    stickyHeader: \"data-header-sticky\",\n    transparent: \"data-header-transparent\",\n  };\n\n  if (!customElements.get(\"header-component\")) {\n    customElements.define(\n      \"header-component\",\n      class HeaderComponent extends HTMLElement {\n        constructor() {\n          super();\n\n          this.style = this.dataset.style;\n          this.desktop = this.querySelector(selectors$m.desktop);\n          this.deadLinks = document.querySelectorAll(selectors$m.deadLink);\n          this.resizeObserver = null;\n          this.checkWidth = this.checkWidth.bind(this);\n          this.isSticky = this.hasAttribute(attributes$c.stickyHeader);\n\n          document.body.classList.toggle(classes$i.sticky, this.isSticky);\n\n          // Fallback for CSS :has() selectors\n          let enableTransparentHeader = false;\n          const firstSectionOverlayHeader = document.querySelector(\n            selectors$m.firstSectionOverlayHeader,\n          );\n          if (\n            firstSectionOverlayHeader &&\n            !firstSectionOverlayHeader.querySelector(\n              selectors$m.preventTransparent,\n            )\n          ) {\n            enableTransparentHeader = true;\n          }\n\n          document.body.classList.toggle(\n            classes$i.transparent,\n            this.hasAttribute(attributes$c.transparent),\n          );\n          document.body.classList.toggle(\n            classes$i.firstSectionOverlayHeader,\n            enableTransparentHeader,\n          );\n        }\n\n        connectedCallback() {\n          this.killDeadLinks();\n          this.drawerToggleEvent();\n          this.cartToggleEvent();\n          this.initSticky();\n\n          if (this.style !== \"drawer\" && this.desktop) {\n            this.minWidth = this.getMinWidth();\n            this.listenWidth();\n          }\n        }\n\n        listenWidth() {\n          if (\"ResizeObserver\" in window) {\n            this.resizeObserver = new ResizeObserver(this.checkWidth);\n            this.resizeObserver.observe(this);\n          } else {\n            document.addEventListener(\"theme:resize\", this.checkWidth);\n          }\n        }\n\n        drawerToggleEvent() {\n          this.querySelectorAll(`[${attributes$c.drawerToggle}]`)?.forEach(\n            (button) => {\n              button.addEventListener(\"click\", () => {\n                let drawer;\n                const key = button.hasAttribute(attributes$c.drawerToggle)\n                  ? button.getAttribute(attributes$c.drawerToggle)\n                  : \"\";\n                const desktopDrawer = document.querySelector(\n                  `[${attributes$c.drawer}=\"${key}\"]`,\n                );\n                const mobileDrawer = document.querySelector(\n                  `mobile-menu > [${attributes$c.drawer}]`,\n                );\n\n                drawer =\n                  theme.settings.mobileMenuType === \"new\" &&\n                  !this.hasAttribute(\"data-prefer-header-drawer\")\n                    ? mobileDrawer || desktopDrawer\n                    : desktopDrawer;\n\n                drawer.dispatchEvent(\n                  new CustomEvent(\"theme:drawer:toggle\", {\n                    bubbles: false,\n                    detail: {\n                      button: button,\n                    },\n                  }),\n                );\n              });\n            },\n          );\n        }\n\n        killDeadLinks() {\n          this.deadLinks.forEach((el) => {\n            el.onclick = (e) => {\n              e.preventDefault();\n            };\n          });\n        }\n\n        checkWidth() {\n          if (document.body.clientWidth < this.minWidth) {\n            this.classList.add(classes$i.showMobileClass);\n\n            // Update --header-height CSS variable when switching to a mobile nav\n            const { headerHeight } = window.theme.readHeights();\n            document.documentElement.style.setProperty(\n              \"--header-height\",\n              `${headerHeight}px`,\n            );\n          } else {\n            this.classList.remove(classes$i.showMobileClass);\n          }\n        }\n\n        getMinWidth() {\n          const comparitor = document.createElement(\"div\");\n          comparitor.classList.add(classes$i.clone, classes$i.headerWrapper);\n          comparitor.appendChild(this.querySelector(\"header\").cloneNode(true));\n          document.body.appendChild(comparitor);\n          const widthWrappers = comparitor.querySelectorAll(\n            selectors$m.widthContentWrapper,\n          );\n          let minWidth = 0;\n          let spaced = 0;\n\n          widthWrappers.forEach((context) => {\n            const wideElements = context.querySelectorAll(\n              selectors$m.widthContent,\n            );\n            let thisWidth = 0;\n            if (wideElements.length === 3) {\n              thisWidth = this._sumSplitWidths(wideElements);\n            } else {\n              thisWidth = this._sumWidths(wideElements);\n            }\n            if (thisWidth > minWidth) {\n              minWidth = thisWidth;\n              spaced = wideElements.length * 20;\n            }\n          });\n\n          document.body.removeChild(comparitor);\n          return minWidth + spaced;\n        }\n\n        cartToggleEvent() {\n          if (theme.settings.cartType !== \"drawer\") return;\n\n          this.querySelectorAll(selectors$m.cartToggleButton)?.forEach(\n            (button) => {\n              button.addEventListener(\"click\", (e) => {\n                const cartDrawer = document.querySelector(\n                  selectors$m.cartDrawer,\n                );\n\n                if (cartDrawer) {\n                  e.preventDefault();\n                  cartDrawer.dispatchEvent(\n                    new CustomEvent(\"theme:cart-drawer:show\"),\n                  );\n                  window.a11y.lastElement = button;\n                }\n              });\n            },\n          );\n        }\n\n        toggleButtonClick(e) {\n          e.preventDefault();\n          document.dispatchEvent(\n            new CustomEvent(\"theme:cart:toggle\", { bubbles: true }),\n          );\n        }\n\n        initSticky() {\n          if (!this.isSticky) return;\n\n          this.isStuck = false;\n          this.cls = this.classList;\n          this.headerOffset = document.querySelector(\n            selectors$m.pageHeader,\n          )?.offsetTop;\n          this.updateHeaderOffset = this.updateHeaderOffset.bind(this);\n          this.scrollEvent = (e) => this.onScroll(e);\n\n          this.listen();\n          this.stickOnLoad();\n        }\n\n        listen() {\n          document.addEventListener(\"theme:scroll\", this.scrollEvent);\n          document.addEventListener(\n            \"shopify:section:load\",\n            this.updateHeaderOffset,\n          );\n          document.addEventListener(\n            \"shopify:section:unload\",\n            this.updateHeaderOffset,\n          );\n        }\n\n        onScroll(e) {\n          if (e.detail.down) {\n            if (!this.isStuck && e.detail.position > this.headerOffset) {\n              this.stickSimple();\n            }\n          } else if (e.detail.position <= this.headerOffset) {\n            this.unstickSimple();\n          }\n        }\n\n        updateHeaderOffset(event) {\n          if (!event.target.classList.contains(classes$i.headerGroup)) return;\n\n          // Update header offset after any \"Header group\" section has been changed\n          setTimeout(() => {\n            this.headerOffset = document.querySelector(\n              selectors$m.pageHeader,\n            )?.offsetTop;\n          });\n        }\n\n        stickOnLoad() {\n          if (window.scrollY > this.headerOffset) {\n            this.stickSimple();\n          }\n        }\n\n        stickSimple() {\n          this.cls.add(classes$i.stuck);\n          this.isStuck = true;\n        }\n\n        unstickSimple() {\n          if (!document.documentElement.hasAttribute(attributes$c.scrollLock)) {\n            // check for scroll lock\n            this.cls.remove(classes$i.stuck);\n            this.isStuck = false;\n          }\n        }\n\n        _sumSplitWidths(nodes) {\n          let arr = [];\n          nodes.forEach((el) => {\n            if (el.firstElementChild) {\n              arr.push(el.firstElementChild.clientWidth);\n            }\n          });\n          if (arr[0] > arr[2]) {\n            arr[2] = arr[0];\n          } else {\n            arr[0] = arr[2];\n          }\n          const width = arr.reduce((a, b) => a + b);\n          return width;\n        }\n\n        _sumWidths(nodes) {\n          let width = 0;\n          nodes.forEach((el) => {\n            width += el.clientWidth;\n          });\n          return width;\n        }\n\n        disconnectedCallback() {\n          if (\"ResizeObserver\" in window) {\n            this.resizeObserver?.unobserve(this);\n          } else {\n            document.removeEventListener(\"theme:resize\", this.checkWidth);\n          }\n\n          if (this.isSticky) {\n            document.removeEventListener(\"theme:scroll\", this.scrollEvent);\n            document.removeEventListener(\n              \"shopify:section:load\",\n              this.updateHeaderOffset,\n            );\n            document.removeEventListener(\n              \"shopify:section:unload\",\n              this.updateHeaderOffset,\n            );\n          }\n        }\n      },\n    );\n  }\n\n  const selectors$l = {\n    link: \"[data-top-link]\",\n    wrapper: \"[data-header-wrapper]\",\n    stagger: \"[data-stagger]\",\n    staggerPair: \"[data-stagger-first]\",\n    staggerAfter: \"[data-stagger-second]\",\n    focusable:\n      'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n  };\n\n  const classes$h = {\n    isVisible: \"is-visible\",\n    meganavVisible: \"meganav--visible\",\n    meganavIsTransitioning: \"meganav--is-transitioning\",\n  };\n\n  if (!customElements.get(\"hover-disclosure\")) {\n    customElements.define(\n      \"hover-disclosure\",\n\n      class HoverDisclosure extends HTMLElement {\n        constructor() {\n          super();\n\n          this.wrapper = this.closest(selectors$l.wrapper);\n          this.key = this.getAttribute(\"aria-controls\");\n          this.link = this.querySelector(selectors$l.link);\n          this.grandparent = this.classList.contains(\"grandparent\");\n          this.disclosure = document.getElementById(this.key);\n          this.transitionTimeout = 0;\n        }\n\n        connectedCallback() {\n          this.setAttribute(\"aria-haspopup\", true);\n          this.setAttribute(\"aria-expanded\", false);\n          this.setAttribute(\"aria-controls\", this.key);\n\n          this.connectHoverToggle();\n          this.handleTablets();\n          this.staggerChildAnimations();\n\n          this.addEventListener(\"theme:disclosure:show\", (evt) => {\n            this.showDisclosure(evt);\n          });\n          this.addEventListener(\"theme:disclosure:hide\", (evt) => {\n            this.hideDisclosure(evt);\n          });\n        }\n\n        showDisclosure(e) {\n          if (e && e.type && e.type === \"mouseenter\") {\n            this.wrapper.classList.add(classes$h.meganavIsTransitioning);\n          }\n\n          if (this.grandparent) {\n            this.wrapper.classList.add(classes$h.meganavVisible);\n          } else {\n            this.wrapper.classList.remove(classes$h.meganavVisible);\n          }\n          this.setAttribute(\"aria-expanded\", true);\n          this.classList.add(classes$h.isVisible);\n          this.disclosure.classList.add(classes$h.isVisible);\n\n          if (this.transitionTimeout) {\n            clearTimeout(this.transitionTimeout);\n          }\n\n          this.transitionTimeout = setTimeout(() => {\n            this.wrapper.classList.remove(classes$h.meganavIsTransitioning);\n          }, 200);\n        }\n\n        hideDisclosure() {\n          this.classList.remove(classes$h.isVisible);\n          this.disclosure.classList.remove(classes$h.isVisible);\n          this.setAttribute(\"aria-expanded\", false);\n          this.wrapper.classList.remove(\n            classes$h.meganavVisible,\n            classes$h.meganavIsTransitioning,\n          );\n        }\n\n        staggerChildAnimations() {\n          const simple = this.querySelectorAll(selectors$l.stagger);\n          let step = 50;\n          simple.forEach((el, index) => {\n            el.style.transitionDelay = `${index * step + 10}ms`;\n            step *= 0.95;\n          });\n\n          const pairs = this.querySelectorAll(selectors$l.staggerPair);\n          pairs.forEach((child, i) => {\n            const d1 = i * 100;\n            child.style.transitionDelay = `${d1}ms`;\n            child.parentElement\n              .querySelectorAll(selectors$l.staggerAfter)\n              .forEach((grandchild, i2) => {\n                const di1 = i2 + 1;\n                const d2 = di1 * 20;\n                grandchild.style.transitionDelay = `${d1 + d2}ms`;\n              });\n          });\n        }\n\n        handleTablets() {\n          // first click opens the popup, second click opens the link\n          this.addEventListener(\n            \"touchstart\",\n            function (e) {\n              const isOpen = this.classList.contains(classes$h.isVisible);\n              if (!isOpen) {\n                e.preventDefault();\n                this.showDisclosure(e);\n              }\n            }.bind(this),\n            { passive: true },\n          );\n        }\n\n        connectHoverToggle() {\n          this.addEventListener(\"mouseenter\", (e) => this.showDisclosure(e));\n          this.link.addEventListener(\"focus\", (e) => this.showDisclosure(e));\n\n          this.addEventListener(\"mouseleave\", () => this.hideDisclosure());\n          this.addEventListener(\"focusout\", (e) => {\n            const inMenu = this.contains(e.relatedTarget);\n            if (!inMenu) {\n              this.hideDisclosure();\n            }\n          });\n          this.addEventListener(\"keyup\", (evt) => {\n            if (evt.code !== \"Escape\") {\n              return;\n            }\n            this.hideDisclosure();\n          });\n        }\n      },\n    );\n  }\n\n  const selectors$k = {\n    drawerInner: \"[data-drawer-inner]\",\n    drawerClose: \"[data-drawer-close]\",\n    underlay: \"[data-drawer-underlay]\",\n    stagger: \"[data-stagger-animation]\",\n    wrapper: \"[data-header-wrapper]\",\n    focusable:\n      'button, [href], select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n  };\n\n  const classes$g = {\n    animated: \"drawer--animated\",\n    open: \"is-open\",\n    closing: \"is-closing\",\n    isFocused: \"is-focused\",\n    headerStuck: \"js__header__stuck\",\n  };\n\n  if (!customElements.get(\"header-drawer\")) {\n    customElements.define(\n      \"header-drawer\",\n      class HeaderDrawer extends HTMLElement {\n        constructor() {\n          super();\n\n          this.a11y = window.theme.a11y;\n          this.isAnimating = false;\n          this.drawer = this;\n          this.drawerInner = this.querySelector(selectors$k.drawerInner);\n          this.underlay = this.querySelector(selectors$k.underlay);\n          this.triggerButton = null;\n\n          this.staggers = this.querySelectorAll(selectors$k.stagger);\n          this.showDrawer = this.showDrawer.bind(this);\n          this.hideDrawer = this.hideDrawer.bind(this);\n\n          this.connectDrawer();\n          this.closers();\n        }\n\n        connectDrawer() {\n          this.addEventListener(\"theme:drawer:toggle\", (e) => {\n            this.triggerButton = e.detail?.button;\n\n            if (this.classList.contains(classes$g.open)) {\n              this.dispatchEvent(\n                new CustomEvent(\"theme:drawer:close\", {\n                  bubbles: true,\n                }),\n              );\n            } else {\n              this.dispatchEvent(\n                new CustomEvent(\"theme:drawer:open\", {\n                  bubbles: true,\n                }),\n              );\n            }\n          });\n\n          this.addEventListener(\"theme:drawer:close\", this.hideDrawer);\n          this.addEventListener(\"theme:drawer:open\", this.showDrawer);\n\n          document.addEventListener(\"theme:cart-drawer:open\", this.hideDrawer);\n        }\n\n        closers() {\n          this.querySelectorAll(selectors$k.drawerClose)?.forEach((button) => {\n            button.addEventListener(\"click\", () => {\n              this.hideDrawer();\n            });\n          });\n\n          document.addEventListener(\"keyup\", (event) => {\n            if (event.code !== \"Escape\") {\n              return;\n            }\n\n            this.hideDrawer();\n          });\n\n          this.underlay.addEventListener(\"click\", () => {\n            this.hideDrawer();\n          });\n        }\n\n        showDrawer() {\n          if (this.isAnimating) return;\n\n          this.isAnimating = true;\n\n          this.triggerButton?.setAttribute(\"aria-expanded\", true);\n          this.classList.add(classes$g.open, classes$g.animated);\n\n          document.dispatchEvent(\n            new CustomEvent(\"theme:scroll:lock\", { bubbles: true }),\n          );\n\n          if (this.drawerInner) {\n            this.a11y.removeTrapFocus();\n\n            window.theme.waitForAnimationEnd(this.drawerInner).then(() => {\n              this.isAnimating = false;\n\n              this.a11y.trapFocus(this.drawerInner, {\n                elementToFocus: this.querySelector(selectors$k.focusable),\n              });\n            });\n          }\n        }\n\n        hideDrawer() {\n          if (this.isAnimating || !this.classList.contains(classes$g.open))\n            return;\n\n          this.isAnimating = true;\n\n          this.classList.add(classes$g.closing);\n          this.classList.remove(classes$g.open);\n\n          this.a11y.removeTrapFocus();\n\n          if (this.triggerButton) {\n            this.triggerButton.setAttribute(\"aria-expanded\", false);\n\n            if (document.body.classList.contains(classes$g.isFocused)) {\n              this.triggerButton.focus();\n            }\n          }\n\n          document.dispatchEvent(\n            new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n          );\n\n          window.theme.waitForAnimationEnd(this.drawerInner).then(() => {\n            this.classList.remove(classes$g.closing, classes$g.animated);\n\n            this.isAnimating = false;\n\n            // Reset menu items state after drawer hiding animation completes\n            document.dispatchEvent(\n              new CustomEvent(\"theme:sliderule:close\", { bubbles: false }),\n            );\n          });\n        }\n\n        disconnectedCallback() {\n          document.removeEventListener(\n            \"theme:cart-drawer:open\",\n            this.hideDrawer,\n          );\n        }\n      },\n    );\n  }\n\n  const selectors$j = {\n    animates: \"data-animates\",\n    sliderule: \"[data-sliderule]\",\n    slideruleOpen: \"data-sliderule-open\",\n    slideruleClose: \"data-sliderule-close\",\n    sliderulePane: \"data-sliderule-pane\",\n    drawerContent: \"[data-drawer-content]\",\n    focusable:\n      'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n    children: `:scope > [data-animates],\n             :scope > * > [data-animates],\n             :scope > * > * > [data-animates],\n             :scope > * > .sliderule-grid  > *`,\n  };\n\n  const classes$f = {\n    isVisible: \"is-visible\",\n    isHiding: \"is-hiding\",\n    isHidden: \"is-hidden\",\n    focused: \"is-focused\",\n    scrolling: \"is-scrolling\",\n  };\n\n  if (!customElements.get(\"mobile-sliderule\")) {\n    customElements.define(\n      \"mobile-sliderule\",\n\n      class HeaderMobileSliderule extends HTMLElement {\n        constructor() {\n          super();\n\n          this.key = this.id;\n          this.sliderule = this.querySelector(selectors$j.sliderule);\n          const btnSelector = `[${selectors$j.slideruleOpen}='${this.key}']`;\n          this.exitSelector = `[${selectors$j.slideruleClose}='${this.key}']`;\n          this.trigger = this.querySelector(btnSelector);\n          this.exit = document.querySelectorAll(this.exitSelector);\n          this.pane = this.trigger.closest(`[${selectors$j.sliderulePane}]`);\n          this.childrenElements = this.querySelectorAll(selectors$j.children);\n          this.drawerContent = this.closest(selectors$j.drawerContent);\n          this.cachedButton = null;\n          this.a11y = window.theme.a11y;\n\n          this.trigger.setAttribute(\"aria-haspopup\", true);\n          this.trigger.setAttribute(\"aria-expanded\", false);\n          this.trigger.setAttribute(\"aria-controls\", this.key);\n          this.closeSliderule = this.closeSliderule.bind(this);\n\n          this.clickEvents();\n          this.keyboardEvents();\n\n          document.addEventListener(\n            \"theme:sliderule:close\",\n            this.closeSliderule,\n          );\n        }\n\n        clickEvents() {\n          this.trigger.addEventListener(\"click\", () => {\n            this.cachedButton = this.trigger;\n            this.showSliderule();\n          });\n          this.exit.forEach((element) => {\n            element.addEventListener(\"click\", () => {\n              this.hideSliderule();\n            });\n          });\n        }\n\n        keyboardEvents() {\n          this.addEventListener(\"keyup\", (evt) => {\n            evt.stopPropagation();\n            if (evt.code !== \"Escape\") {\n              return;\n            }\n\n            this.hideSliderule();\n          });\n        }\n\n        trapFocusSliderule(showSliderule = true) {\n          const trapFocusButton = showSliderule\n            ? this.querySelector(this.exitSelector)\n            : this.cachedButton;\n\n          this.a11y.removeTrapFocus();\n\n          if (trapFocusButton && this.drawerContent) {\n            this.a11y.trapFocus(this.drawerContent, {\n              elementToFocus: document.body.classList.contains(\n                classes$f.focused,\n              )\n                ? trapFocusButton\n                : null,\n            });\n          }\n        }\n\n        hideSliderule(close = false) {\n          const newPosition = parseInt(this.pane.dataset.sliderulePane, 10) - 1;\n          this.pane.setAttribute(selectors$j.sliderulePane, newPosition);\n          this.pane.classList.add(classes$f.isHiding);\n          this.sliderule.classList.add(classes$f.isHiding);\n          const hiddenSelector = close\n            ? `[${selectors$j.animates}].${classes$f.isHidden}`\n            : `[${selectors$j.animates}=\"${newPosition}\"]`;\n          const hiddenItems = this.pane.querySelectorAll(hiddenSelector);\n          if (hiddenItems.length) {\n            hiddenItems.forEach((element) => {\n              element.classList.remove(classes$f.isHidden);\n            });\n          }\n\n          const children = close\n            ? this.pane.querySelectorAll(\n                `.${classes$f.isVisible}, .${classes$f.isHiding}`,\n              )\n            : this.childrenElements;\n          children.forEach((element, index) => {\n            const lastElement = children.length - 1 == index;\n            element.classList.remove(classes$f.isVisible);\n            if (close) {\n              element.classList.remove(classes$f.isHiding);\n              this.pane.classList.remove(classes$f.isHiding);\n            }\n            const removeHidingClass = () => {\n              if (\n                parseInt(this.pane.getAttribute(selectors$j.sliderulePane)) ===\n                newPosition\n              ) {\n                this.sliderule.classList.remove(classes$f.isVisible);\n              }\n              this.sliderule.classList.remove(classes$f.isHiding);\n              this.pane.classList.remove(classes$f.isHiding);\n\n              if (lastElement) {\n                this.a11y.removeTrapFocus();\n                if (!close) {\n                  this.trapFocusSliderule(false);\n                }\n              }\n\n              element.removeEventListener(\"animationend\", removeHidingClass);\n            };\n\n            if (window.theme.settings.enableAnimations) {\n              element.addEventListener(\"animationend\", removeHidingClass);\n            } else {\n              removeHidingClass();\n            }\n          });\n        }\n\n        showSliderule() {\n          let lastScrollableFrame = null;\n          const parent = this.closest(`.${classes$f.isVisible}`);\n          let lastScrollableElement = this.pane;\n\n          if (parent) {\n            lastScrollableElement = parent;\n          }\n\n          lastScrollableElement.scrollTo({\n            top: 0,\n            left: 0,\n            behavior: \"smooth\",\n          });\n\n          lastScrollableElement.classList.add(classes$f.scrolling);\n\n          const lastScrollableIsScrolling = () => {\n            if (lastScrollableElement.scrollTop <= 0) {\n              lastScrollableElement.classList.remove(classes$f.scrolling);\n              if (lastScrollableFrame) {\n                cancelAnimationFrame(lastScrollableFrame);\n              }\n            } else {\n              lastScrollableFrame = requestAnimationFrame(\n                lastScrollableIsScrolling,\n              );\n            }\n          };\n\n          lastScrollableFrame = requestAnimationFrame(\n            lastScrollableIsScrolling,\n          );\n\n          const oldPosition = parseInt(this.pane.dataset.sliderulePane, 10);\n          const newPosition = oldPosition + 1;\n          this.sliderule.classList.add(classes$f.isVisible);\n          this.pane.setAttribute(selectors$j.sliderulePane, newPosition);\n\n          const hiddenItems = this.pane.querySelectorAll(\n            `[${selectors$j.animates}=\"${oldPosition}\"]`,\n          );\n          if (hiddenItems.length) {\n            hiddenItems.forEach((element, index) => {\n              const lastElement = hiddenItems.length - 1 == index;\n              element.classList.add(classes$f.isHiding);\n              const removeHidingClass = () => {\n                element.classList.remove(classes$f.isHiding);\n                if (\n                  parseInt(\n                    this.pane.getAttribute(selectors$j.sliderulePane),\n                  ) !== oldPosition\n                ) {\n                  element.classList.add(classes$f.isHidden);\n                }\n\n                if (lastElement) {\n                  this.trapFocusSliderule();\n                }\n                element.removeEventListener(\"animationend\", removeHidingClass);\n              };\n\n              if (window.theme.settings.enableAnimations) {\n                element.addEventListener(\"animationend\", removeHidingClass);\n              } else {\n                removeHidingClass();\n              }\n            });\n          }\n        }\n\n        closeSliderule() {\n          if (\n            this.pane &&\n            this.pane.hasAttribute(selectors$j.sliderulePane) &&\n            parseInt(this.pane.getAttribute(selectors$j.sliderulePane)) > 0\n          ) {\n            this.hideSliderule(true);\n            if (\n              parseInt(this.pane.getAttribute(selectors$j.sliderulePane)) > 0\n            ) {\n              this.pane.setAttribute(selectors$j.sliderulePane, 0);\n            }\n          }\n        }\n\n        disconnectedCallback() {\n          document.removeEventListener(\n            \"theme:sliderule:close\",\n            this.closeSliderule,\n          );\n        }\n      },\n    );\n  }\n\n  const selectors$i = {\n    details: \"details\",\n    popdown: \"[data-popdown]\",\n    popdownClose: \"[data-popdown-close]\",\n    input: 'input:not([type=\"hidden\"])',\n    mobileMenu: \"mobile-menu\",\n  };\n\n  const attributes$b = {\n    popdownUnderlay: \"data-popdown-underlay\",\n    scrollLocked: \"data-scroll-locked\",\n  };\n\n  const classes$e = {\n    open: \"is-open\",\n  };\n  class SearchPopdown extends HTMLElement {\n    constructor() {\n      super();\n      this.popdown = this.querySelector(selectors$i.popdown);\n      this.popdownContainer = this.querySelector(selectors$i.details);\n      this.popdownClose = this.querySelector(selectors$i.popdownClose);\n      this.popdownTransitionCallback =\n        this.popdownTransitionCallback.bind(this);\n      this.detailsToggleCallback = this.detailsToggleCallback.bind(this);\n      this.mobileMenu = this.closest(selectors$i.mobileMenu);\n      this.a11y = window.theme.a11y;\n    }\n\n    connectedCallback() {\n      this.popdown.addEventListener(\n        \"transitionend\",\n        this.popdownTransitionCallback,\n      );\n      this.popdownContainer.addEventListener(\n        \"keyup\",\n        (event) => event.code.toUpperCase() === \"ESCAPE\" && this.close(),\n      );\n      this.popdownContainer.addEventListener(\n        \"toggle\",\n        this.detailsToggleCallback,\n      );\n      this.popdownClose.addEventListener(\"click\", this.close.bind(this));\n    }\n\n    detailsToggleCallback(event) {\n      if (event.target.hasAttribute(\"open\")) {\n        this.open();\n      }\n    }\n\n    popdownTransitionCallback(event) {\n      if (event.target !== this.popdown) return;\n\n      if (!this.classList.contains(classes$e.open)) {\n        this.popdownContainer.removeAttribute(\"open\");\n        this.a11y.removeTrapFocus();\n      } else if (\n        event.propertyName === \"transform\" ||\n        event.propertyName === \"opacity\"\n      ) {\n        // Wait for the 'transform' transition to complete in order to prevent jumping content issues because of the trapFocus\n        this.a11y.trapFocus(this.popdown, {\n          elementToFocus: this.popdown.querySelector(selectors$i.input),\n        });\n      }\n    }\n\n    onBodyClick(event) {\n      if (\n        !this.contains(event.target) ||\n        event.target.hasAttribute(attributes$b.popdownUnderlay)\n      )\n        this.close();\n    }\n\n    open() {\n      this.onBodyClickEvent =\n        this.onBodyClickEvent || this.onBodyClick.bind(this);\n\n      document.body.addEventListener(\"click\", this.onBodyClickEvent);\n\n      if (!document.documentElement.hasAttribute(attributes$b.scrollLocked)) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:lock\", { bubbles: true }),\n        );\n      }\n\n      requestAnimationFrame(() => {\n        this.classList.add(classes$e.open);\n      });\n    }\n\n    close() {\n      this.classList.remove(classes$e.open);\n\n      document.body.removeEventListener(\"click\", this.onBodyClickEvent);\n\n      if (!this.mobileMenu) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n        );\n      }\n    }\n  }\n\n  if (!customElements.get(\"header-search-popdown\")) {\n    customElements.define(\"header-search-popdown\", SearchPopdown);\n  }\n\n  const selectors$h = {\n    inputSearch: 'input[type=\"search\"]',\n    focusedElements: '[aria-selected=\"true\"] a',\n    resetButton: 'button[type=\"reset\"]',\n  };\n\n  const classes$d = {\n    hidden: \"hidden\",\n  };\n\n  class HeaderSearchForm extends HTMLElement {\n    constructor() {\n      super();\n\n      this.input = this.querySelector(selectors$h.inputSearch);\n      this.resetButton = this.querySelector(selectors$h.resetButton);\n\n      if (this.input) {\n        this.input.form.addEventListener(\"reset\", this.onFormReset.bind(this));\n        this.input.addEventListener(\n          \"input\",\n          window.theme\n            .debounce((event) => {\n              this.onChange(event);\n            }, 300)\n            .bind(this),\n        );\n      }\n    }\n\n    toggleResetButton() {\n      const resetIsHidden = this.resetButton.classList.contains(\n        classes$d.hidden,\n      );\n      if (this.input.value.length > 0 && resetIsHidden) {\n        this.resetButton.classList.remove(classes$d.hidden);\n      } else if (this.input.value.length === 0 && !resetIsHidden) {\n        this.resetButton.classList.add(classes$d.hidden);\n      }\n    }\n\n    onChange() {\n      this.toggleResetButton();\n    }\n\n    shouldResetForm() {\n      return !document.querySelector(selectors$h.focusedElements);\n    }\n\n    onFormReset(event) {\n      // Prevent default so the form reset doesn't set the value gotten from the url on page load\n      event.preventDefault();\n      // Don't reset if the user has selected an element on the predictive search dropdown\n      if (this.shouldResetForm()) {\n        this.input.value = \"\";\n        this.toggleResetButton();\n        event.target.querySelector(selectors$h.inputSearch).focus();\n      }\n    }\n  }\n\n  customElements.define(\"header-search-form\", HeaderSearchForm);\n\n  const selectors$g = {\n    inputSearch: 'input[type=\"search\"]',\n  };\n\n  class MainSearch extends HeaderSearchForm {\n    constructor() {\n      super();\n\n      this.allSearchInputs = document.querySelectorAll(selectors$g.inputSearch);\n      this.setupEventListeners();\n    }\n\n    setupEventListeners() {\n      let allSearchForms = [];\n      this.allSearchInputs.forEach((input) => allSearchForms.push(input.form));\n      this.input.addEventListener(\"focus\", this.onInputFocus.bind(this));\n      if (allSearchForms.length < 2) return;\n      allSearchForms.forEach((form) =>\n        form.addEventListener(\"reset\", this.onFormReset.bind(this)),\n      );\n      this.allSearchInputs.forEach((input) =>\n        input.addEventListener(\"input\", this.onInput.bind(this)),\n      );\n    }\n\n    onFormReset(event) {\n      super.onFormReset(event);\n      if (super.shouldResetForm()) {\n        this.keepInSync(\"\", this.input);\n      }\n    }\n\n    onInput(event) {\n      const target = event.target;\n      this.keepInSync(target.value, target);\n    }\n\n    onInputFocus() {\n      if (window.theme.isMobile()) {\n        this.scrollIntoView({ behavior: \"smooth\" });\n      }\n    }\n\n    keepInSync(value, target) {\n      this.allSearchInputs.forEach((input) => {\n        if (input !== target) {\n          input.value = value;\n        }\n      });\n    }\n  }\n\n  if (!customElements.get(\"main-search\")) {\n    customElements.define(\"main-search\", MainSearch);\n  }\n\n  const selectors$f = {\n    scrollbar: \"[data-scrollbar]\",\n    scrollbarArrowPrev: \"[data-scrollbar-arrow-prev]\",\n    scrollbarArrowNext: \"[data-scrollbar-arrow-next]\",\n  };\n\n  const classes$c = {\n    hidden: \"is-hidden\",\n  };\n\n  const attributes$a = {\n    scrollbarSlider: \"data-scrollbar-slider\",\n    scrollbarSlideFullWidth: \"data-scrollbar-slide-fullwidth\",\n  };\n\n  if (!customElements.get(\"native-scrollbar\")) {\n    customElements.define(\n      \"native-scrollbar\",\n      class NativeScrollbar extends HTMLElement {\n        constructor() {\n          super();\n\n          this.scrollbar = this.querySelector(selectors$f.scrollbar);\n          this.arrowNext = this.querySelector(selectors$f.scrollbarArrowNext);\n          this.arrowPrev = this.querySelector(selectors$f.scrollbarArrowPrev);\n          this.toggleNextArrow = this.toggleNextArrow.bind(this);\n          this.addEventListener(\"theme:swatches:loaded\", this.toggleNextArrow);\n        }\n\n        connectedCallback() {\n          document.addEventListener(\"theme:resize\", this.toggleNextArrow);\n\n          if (this.scrollbar.hasAttribute(attributes$a.scrollbarSlider)) {\n            this.scrollToVisibleElement();\n          }\n\n          if (this.arrowNext && this.arrowPrev) {\n            this.events();\n            this.toggleNextArrow(); // Show arrow next on page load if there are items to scroll to\n          }\n        }\n\n        disconnectedCallback() {\n          document.removeEventListener(\"theme:resize\", this.toggleNextArrow);\n        }\n\n        events() {\n          this.arrowNext.addEventListener(\"click\", (event) => {\n            event.preventDefault();\n\n            this.goToNext();\n          });\n\n          this.arrowPrev.addEventListener(\"click\", (event) => {\n            event.preventDefault();\n\n            this.goToPrev();\n          });\n\n          this.scrollbar.addEventListener(\"scroll\", () => {\n            this.togglePrevArrow();\n            this.toggleNextArrow();\n          });\n        }\n\n        goToNext() {\n          const moveWith = this.scrollbar.hasAttribute(\n            attributes$a.scrollbarSlideFullWidth,\n          )\n            ? this.scrollbar.getBoundingClientRect().width\n            : this.scrollbar.getBoundingClientRect().width / 2;\n          const position = moveWith + this.scrollbar.scrollLeft;\n\n          this.move(position);\n\n          this.arrowPrev.classList.remove(classes$c.hidden);\n\n          this.toggleNextArrow();\n        }\n\n        goToPrev() {\n          const moveWith = this.scrollbar.hasAttribute(\n            attributes$a.scrollbarSlideFullWidth,\n          )\n            ? this.scrollbar.getBoundingClientRect().width\n            : this.scrollbar.getBoundingClientRect().width / 2;\n          const position = this.scrollbar.scrollLeft - moveWith;\n\n          this.move(position);\n\n          this.arrowNext.classList.remove(classes$c.hidden);\n\n          this.togglePrevArrow();\n        }\n\n        toggleNextArrow() {\n          requestAnimationFrame(() => {\n            this.arrowNext?.classList.toggle(\n              classes$c.hidden,\n              Math.round(\n                this.scrollbar.scrollLeft +\n                  this.scrollbar.getBoundingClientRect().width +\n                  1,\n              ) >= this.scrollbar.scrollWidth,\n            );\n          });\n        }\n\n        togglePrevArrow() {\n          requestAnimationFrame(() => {\n            this.arrowPrev.classList.toggle(\n              classes$c.hidden,\n              this.scrollbar.scrollLeft <= 0,\n            );\n          });\n        }\n\n        scrollToVisibleElement() {\n          [].forEach.call(this.scrollbar.children, (element) => {\n            element.addEventListener(\"click\", (event) => {\n              event.preventDefault();\n\n              this.move(element.offsetLeft - element.clientWidth);\n            });\n          });\n        }\n\n        move(offsetLeft) {\n          this.scrollbar.scrollTo({\n            top: 0,\n            left: offsetLeft,\n            behavior: \"smooth\",\n          });\n        }\n      },\n    );\n  }\n\n  const selectors$e = {\n    popoutList: \"[data-popout-list]\",\n    popoutToggle: \"[data-popout-toggle]\",\n    popoutToggleText: \"[data-popout-toggle-text]\",\n    popoutInput: \"[data-popout-input]\",\n    popoutOptions: \"[data-popout-option]\",\n    productGridImage: \"[data-product-image]\",\n    productGridItem: \"[data-grid-item]\",\n    section: \"[data-section-type]\",\n  };\n\n  const classes$b = {\n    listVisible: \"popout-list--visible\",\n    visible: \"is-visible\",\n    active: \"is-active\",\n    popoutListTop: \"popout-list--top\",\n  };\n\n  const attributes$9 = {\n    ariaExpanded: \"aria-expanded\",\n    ariaCurrent: \"aria-current\",\n    dataValue: \"data-value\",\n    popoutToggleText: \"data-popout-toggle-text\",\n    submit: \"submit\",\n  };\n\n  if (!customElements.get(\"popout-select\")) {\n    customElements.define(\n      \"popout-select\",\n      class Popout extends HTMLElement {\n        constructor() {\n          super();\n        }\n\n        connectedCallback() {\n          this.popoutList = this.querySelector(selectors$e.popoutList);\n          this.popoutToggle = this.querySelector(selectors$e.popoutToggle);\n          this.popoutToggleText = this.querySelector(\n            selectors$e.popoutToggleText,\n          );\n          this.popoutInput =\n            this.querySelector(selectors$e.popoutInput) ||\n            this.parentNode.querySelector(selectors$e.popoutInput);\n          this.popoutOptions = this.querySelectorAll(selectors$e.popoutOptions);\n          this.productGridItem = this.popoutList.closest(\n            selectors$e.productGridItem,\n          );\n          this.fireSubmitEvent = this.hasAttribute(attributes$9.submit);\n\n          this.popupToggleFocusoutEvent = (evt) =>\n            this.onPopupToggleFocusout(evt);\n          this.popupListFocusoutEvent = (evt) => this.onPopupListFocusout(evt);\n          this.popupToggleClickEvent = (evt) => this.onPopupToggleClick(evt);\n          this.keyUpEvent = (evt) => this.onKeyUp(evt);\n          this.bodyClickEvent = (evt) => this.onBodyClick(evt);\n\n          this._connectOptions();\n          this._connectToggle();\n          this._onFocusOut();\n          this.popupListSetDimensions();\n        }\n\n        onPopupToggleClick(evt) {\n          const button = evt.currentTarget;\n          const ariaExpanded =\n            button.getAttribute(attributes$9.ariaExpanded) === \"true\";\n\n          if (this.productGridItem) {\n            const productGridItemImage = this.productGridItem.querySelector(\n              selectors$e.productGridImage,\n            );\n\n            if (productGridItemImage) {\n              productGridItemImage.classList.toggle(\n                classes$b.visible,\n                !ariaExpanded,\n              );\n            }\n\n            this.popoutList.style.maxHeight = `${Math.abs(this.popoutToggle.getBoundingClientRect().bottom - this.productGridItem.getBoundingClientRect().bottom)}px`;\n          }\n\n          evt.currentTarget.setAttribute(\n            attributes$9.ariaExpanded,\n            !ariaExpanded,\n          );\n          this.popoutList.classList.toggle(classes$b.listVisible);\n          this.popupListSetDimensions();\n          this.toggleListPosition();\n\n          document.body.addEventListener(\"click\", this.bodyClickEvent);\n        }\n\n        onPopupToggleFocusout(evt) {\n          const popoutLostFocus = this.contains(evt.relatedTarget);\n\n          if (!popoutLostFocus) {\n            this._hideList();\n          }\n        }\n\n        onPopupListFocusout(evt) {\n          const childInFocus = evt.currentTarget.contains(evt.relatedTarget);\n          const isVisible = this.popoutList.classList.contains(\n            classes$b.listVisible,\n          );\n\n          if (isVisible && !childInFocus) {\n            this._hideList();\n          }\n        }\n\n        toggleListPosition() {\n          const button = this.querySelector(selectors$e.popoutToggle);\n          const popoutTop =\n            this.getBoundingClientRect().top + this.clientHeight;\n\n          const removeTopClass = () => {\n            if (button.getAttribute(attributes$9.ariaExpanded) !== \"true\") {\n              this.popoutList.classList.remove(classes$b.popoutListTop);\n            }\n\n            this.popoutList.removeEventListener(\n              \"transitionend\",\n              removeTopClass,\n            );\n          };\n\n          if (button.getAttribute(attributes$9.ariaExpanded) === \"true\") {\n            if (window.innerHeight / 2 < popoutTop) {\n              this.popoutList.classList.add(classes$b.popoutListTop);\n            }\n          } else {\n            this.popoutList.addEventListener(\"transitionend\", removeTopClass);\n          }\n        }\n\n        popupListSetDimensions() {\n          this.popoutList.style.setProperty(\"--max-width\", \"100vw\");\n          this.popoutList.style.setProperty(\"--max-height\", \"100vh\");\n\n          requestAnimationFrame(() => {\n            this.popoutList.style.setProperty(\n              \"--max-width\",\n              `${parseInt(document.body.clientWidth - this.popoutList.getBoundingClientRect().left)}px`,\n            );\n            this.popoutList.style.setProperty(\n              \"--max-height\",\n              `${parseInt(document.body.clientHeight - this.popoutList.getBoundingClientRect().top)}px`,\n            );\n          });\n        }\n\n        popupOptionsClick(evt) {\n          const link = evt.target.closest(selectors$e.popoutOptions);\n\n          if (link.attributes.href.value === \"#\") {\n            evt.preventDefault();\n\n            const attrValue = evt.currentTarget.hasAttribute(\n              attributes$9.dataValue,\n            )\n              ? evt.currentTarget.getAttribute(attributes$9.dataValue)\n              : \"\";\n            this.popoutInput.value = attrValue;\n\n            if (this.popoutInput.disabled) {\n              this.popoutInput.removeAttribute(\"disabled\");\n            }\n\n            if (this.fireSubmitEvent) {\n              this._submitForm(attrValue);\n            } else {\n              const currentTarget = evt.currentTarget.parentElement;\n              const listTargetElement = this.popoutList.querySelector(\n                `.${classes$b.active}`,\n              );\n              const targetAttribute = this.popoutList.querySelector(\n                `[${attributes$9.ariaCurrent}]`,\n              );\n\n              this.popoutInput.dispatchEvent(new Event(\"change\"));\n\n              if (listTargetElement) {\n                listTargetElement.classList.remove(classes$b.active);\n                currentTarget.classList.add(classes$b.active);\n              }\n\n              if (\n                this.popoutInput.name == \"quantity\" &&\n                !currentTarget.nextSibling\n              ) {\n                this.classList.add(classes$b.active);\n              }\n\n              if (\n                targetAttribute &&\n                targetAttribute.hasAttribute(`${attributes$9.ariaCurrent}`)\n              ) {\n                targetAttribute.removeAttribute(`${attributes$9.ariaCurrent}`);\n                evt.currentTarget.setAttribute(\n                  `${attributes$9.ariaCurrent}`,\n                  \"true\",\n                );\n              }\n\n              if (attrValue !== \"\") {\n                this.popoutToggleText.innerHTML = attrValue;\n\n                if (\n                  this.popoutToggleText.hasAttribute(\n                    attributes$9.popoutToggleText,\n                  ) &&\n                  this.popoutToggleText.getAttribute(\n                    attributes$9.popoutToggleText,\n                  ) !== \"\"\n                ) {\n                  this.popoutToggleText.setAttribute(\n                    attributes$9.popoutToggleText,\n                    attrValue,\n                  );\n                }\n              }\n              this.onPopupToggleFocusout(evt);\n              this.onPopupListFocusout(evt);\n            }\n          }\n        }\n\n        onKeyUp(evt) {\n          if (evt.code !== \"Escape\") {\n            return;\n          }\n          this._hideList();\n          this.popoutToggle.focus();\n        }\n\n        onBodyClick(evt) {\n          const isOption = this.contains(evt.target);\n          const isVisible = this.popoutList.classList.contains(\n            classes$b.listVisible,\n          );\n\n          if (isVisible && !isOption) {\n            this._hideList();\n          }\n        }\n\n        _connectToggle() {\n          this.popoutToggle.addEventListener(\n            \"click\",\n            this.popupToggleClickEvent,\n          );\n        }\n\n        _connectOptions() {\n          if (this.popoutOptions.length) {\n            this.popoutOptions.forEach((element) => {\n              element.addEventListener(\"click\", (evt) =>\n                this.popupOptionsClick(evt),\n              );\n            });\n          }\n        }\n\n        _onFocusOut() {\n          this.addEventListener(\"keyup\", this.keyUpEvent);\n          this.popoutToggle.addEventListener(\n            \"focusout\",\n            this.popupToggleFocusoutEvent,\n          );\n          this.popoutList.addEventListener(\n            \"focusout\",\n            this.popupListFocusoutEvent,\n          );\n        }\n\n        _submitForm() {\n          const form = this.closest(\"form\");\n          if (form) {\n            form.submit();\n          }\n        }\n\n        _hideList() {\n          this.popoutList.classList.remove(classes$b.listVisible);\n          this.popoutToggle.setAttribute(attributes$9.ariaExpanded, false);\n          this.toggleListPosition();\n          document.body.removeEventListener(\"click\", this.bodyClickEvent);\n        }\n      },\n    );\n  }\n\n  class PopupCookie {\n    constructor(name, value, daysToExpire = 7) {\n      const today = new Date();\n      const expiresDate = new Date();\n      expiresDate.setTime(today.getTime() + 3600000 * 24 * daysToExpire);\n\n      this.config = {\n        expires: expiresDate.toGMTString(), // session cookie\n        path: \"/\",\n        domain: window.location.hostname,\n        sameSite: \"none\",\n        secure: true,\n      };\n      this.name = name;\n      this.value = value;\n    }\n\n    write() {\n      const hasCookie =\n        document.cookie.indexOf(\"; \") !== -1 &&\n        !document.cookie.split(\"; \").find((row) => row.startsWith(this.name));\n\n      if (hasCookie || document.cookie.indexOf(\"; \") === -1) {\n        document.cookie = `${this.name}=${this.value}; expires=${this.config.expires}; path=${this.config.path}; domain=${this.config.domain}; sameSite=${this.config.sameSite}; secure=${this.config.secure}`;\n      }\n    }\n\n    read() {\n      if (\n        document.cookie.indexOf(\"; \") !== -1 &&\n        document.cookie.split(\"; \").find((row) => row.startsWith(this.name))\n      ) {\n        const returnCookie = document.cookie\n          .split(\"; \")\n          .find((row) => row.startsWith(this.name))\n          .split(\"=\")[1];\n\n        return returnCookie;\n      } else {\n        return false;\n      }\n    }\n\n    destroy() {\n      if (\n        document.cookie.split(\"; \").find((row) => row.startsWith(this.name))\n      ) {\n        document.cookie = `${this.name}=null; expires=${this.config.expires}; path=${this.config.path}; domain=${this.config.domain}`;\n      }\n    }\n  }\n\n  const selectors$d = {\n    open: \"[data-popup-open]\",\n    close: \"[data-popup-close]\",\n    dialog: \"dialog\",\n    focusable:\n      'button, [href], select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n    newsletterForm: \"[data-newsletter-form]\",\n    newsletterHeading: \"[data-newsletter-heading]\",\n    newsletterField: \"[data-newsletter-field]\",\n  };\n\n  const attributes$8 = {\n    closing: \"closing\",\n    delay: \"data-popup-delay\",\n    scrollLock: \"data-scroll-lock-required\",\n    cookieName: \"data-cookie-name\",\n    cookieValue: \"data-cookie-value\",\n    preventTopLayer: \"data-prevent-top-layer\",\n  };\n\n  const classes$a = {\n    hidden: \"hidden\",\n    hasValue: \"has-value\",\n    cartBarVisible: \"cart-bar-visible\",\n    isVisible: \"is-visible\",\n    success: \"has-success\",\n    mobile: \"mobile\",\n    desktop: \"desktop\",\n    bottom: \"bottom\",\n  };\n\n  class PopupComponent extends HTMLElement {\n    constructor() {\n      super();\n      this.popup = this.querySelector(selectors$d.dialog);\n      this.preventTopLayer = this.popup.hasAttribute(\n        attributes$8.preventTopLayer,\n      );\n      this.enableScrollLock = this.popup.hasAttribute(attributes$8.scrollLock);\n      this.buttonPopupOpen = this.querySelector(selectors$d.open);\n      this.a11y = window.theme.a11y;\n      this.isAnimating = false;\n      this.cookie = new PopupCookie(\n        this.popup.getAttribute(attributes$8.cookieName),\n        this.popup.getAttribute(attributes$8.cookieValue),\n      );\n\n      this.checkTargetReferrer();\n      this.checkCookie();\n      this.bindListeners();\n    }\n\n    checkTargetReferrer() {\n      if (!this.popup.hasAttribute(attributes$8.referrer)) return;\n\n      if (\n        location.href.indexOf(\n          this.popup.getAttribute(attributes$8.referrer),\n        ) === -1 &&\n        !window.Shopify.designMode\n      ) {\n        this.popup.parentNode.removeChild(this.popup);\n      }\n    }\n\n    checkCookie() {\n      const cookieExists = this.cookie && this.cookie.read() !== false;\n\n      if (!cookieExists) {\n        this.showPopupEvents();\n\n        this.popup.addEventListener(\"theme:popup:onclose\", () =>\n          this.cookie.write(),\n        );\n      }\n    }\n\n    bindListeners() {\n      // Open button click event\n      this.buttonPopupOpen?.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        this.popupOpen();\n        window.theme.a11y.lastElement = this.buttonPopupOpen;\n      });\n\n      // Close button click event\n      this.popup.querySelectorAll(selectors$d.close)?.forEach((closeButton) => {\n        closeButton.addEventListener(\"click\", (e) => {\n          e.preventDefault();\n          this.popupClose();\n        });\n      });\n\n      // Close dialog on click outside content\n      this.popup.addEventListener(\"click\", (event) => {\n        if (event.target.nodeName === \"DIALOG\" && event.type === \"click\") {\n          this.popupClose();\n        }\n      });\n\n      // Close dialog on click ESC key pressed\n      this.popup.addEventListener(\"keydown\", (event) => {\n        if (event.code === \"Escape\") {\n          event.preventDefault();\n          this.popupClose();\n        }\n      });\n\n      this.popup.addEventListener(\"close\", () => this.popupCloseActions());\n    }\n\n    popupOpen() {\n      this.isAnimating = true;\n\n      // Check if browser supports Dialog tags\n      if (typeof this.popup.showModal === \"function\" && !this.preventTopLayer) {\n        this.popup.showModal();\n      } else if (typeof this.popup.show === \"function\") {\n        this.popup.show();\n      } else {\n        this.popup.setAttribute(\"open\", \"\");\n      }\n\n      this.popup.removeAttribute(\"inert\");\n      this.popup.setAttribute(\"aria-hidden\", false);\n      this.popup.focus(); // Focus <dialog> tag element to prevent immediate closing on Escape keypress\n\n      if (this.enableScrollLock) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:lock\", { bubbles: true }),\n        );\n      }\n\n      window.theme.waitForAnimationEnd(this.popup).then(() => {\n        this.isAnimating = false;\n\n        if (this.enableScrollLock) {\n          this.a11y.trapFocus(this.popup);\n        }\n\n        const focusTarget =\n          this.popup.querySelector(\"[autofocus]\") ||\n          this.popup.querySelector(selectors$d.focusable);\n        focusTarget?.focus();\n      });\n    }\n\n    popupClose() {\n      if (this.isAnimating || this.popup.hasAttribute(\"inert\")) {\n        return;\n      }\n\n      if (!this.popup.hasAttribute(attributes$8.closing)) {\n        this.popup.setAttribute(attributes$8.closing, \"\");\n        this.isAnimating = true;\n\n        window.theme.waitForAnimationEnd(this.popup).then(() => {\n          this.isAnimating = false;\n          this.popupClose();\n        });\n\n        return;\n      }\n\n      // Check if browser supports Dialog tags\n      if (typeof this.popup.close === \"function\") {\n        this.popup.close();\n      } else {\n        this.popup.removeAttribute(\"open\");\n        this.popup.setAttribute(\"aria-hidden\", true);\n      }\n\n      this.popupCloseActions();\n    }\n\n    popupCloseActions() {\n      if (this.popup.hasAttribute(\"inert\")) return;\n\n      this.popup.setAttribute(\"inert\", \"\");\n      this.popup.setAttribute(\"aria-hidden\", true);\n      this.popup.removeAttribute(attributes$8.closing);\n\n      // Unlock scroll if no other popups & modals are open\n      if (!window.theme.hasOpenModals() && this.enableScrollLock) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n        );\n      }\n\n      this.popup.dispatchEvent(\n        new CustomEvent(\"theme:popup:onclose\", { bubbles: false }),\n      );\n\n      if (this.enableScrollLock) {\n        this.a11y.removeTrapFocus();\n        this.a11y.autoFocusLastElement();\n      }\n    }\n\n    showPopupEvents() {\n      // Auto show popup if it has open attribute\n      if (\n        this.popup.hasAttribute(\"open\") &&\n        this.popup.getAttribute(\"open\") == true\n      ) {\n        this.popupOpen();\n      }\n\n      this.delay = this.popup.hasAttribute(attributes$8.delay)\n        ? this.popup.getAttribute(attributes$8.delay)\n        : null;\n      this.isSubmitted =\n        window.location.href.indexOf(\"accepts_marketing\") !== -1 ||\n        window.location.href.indexOf(\"customer_posted=true\") !== -1;\n      this.showOnScrollEvent = window.theme.throttle(\n        this.showOnScroll.bind(this),\n        200,\n      );\n\n      if (this.delay === \"always\" || this.isSubmitted) {\n        this.popupOpen();\n      }\n\n      if (this.delay && this.delay.includes(\"delayed\") && !this.isSubmitted) {\n        this.showDelayed();\n      }\n\n      if (this.delay === \"bottom\" && !this.isSubmitted) {\n        this.showOnBottomReached();\n      }\n\n      if (this.delay === \"idle\" && !this.isSubmitted) {\n        this.showOnIdle();\n      }\n    }\n\n    showDelayed() {\n      const seconds = this.delay.includes(\"_\")\n        ? parseInt(this.delay.split(\"_\")[1])\n        : 10;\n\n      // Show popup after specific seconds\n      setTimeout(() => {\n        this.popupOpen();\n      }, seconds * 1000);\n    }\n\n    showOnIdle() {\n      let timer = 0;\n      let idleTime = 60000;\n      const documentEvents = [\n        \"mousemove\",\n        \"mousedown\",\n        \"click\",\n        \"touchmove\",\n        \"touchstart\",\n        \"touchend\",\n        \"keydown\",\n        \"keypress\",\n      ];\n      const windowEvents = [\"load\", \"resize\", \"scroll\"];\n\n      const startTimer = () => {\n        timer = setTimeout(() => {\n          timer = 0;\n          this.popupOpen();\n        }, idleTime);\n\n        documentEvents.forEach((eventType) => {\n          document.addEventListener(eventType, resetTimer);\n        });\n\n        windowEvents.forEach((eventType) => {\n          window.addEventListener(eventType, resetTimer);\n        });\n      };\n\n      const resetTimer = () => {\n        if (timer) {\n          clearTimeout(timer);\n        }\n\n        documentEvents.forEach((eventType) => {\n          document.removeEventListener(eventType, resetTimer);\n        });\n\n        windowEvents.forEach((eventType) => {\n          window.removeEventListener(eventType, resetTimer);\n        });\n\n        startTimer();\n      };\n\n      startTimer();\n    }\n\n    showOnBottomReached() {\n      document.addEventListener(\"theme:scroll\", this.showOnScrollEvent);\n    }\n\n    showOnScroll() {\n      if (window.scrollY + window.innerHeight >= document.body.clientHeight) {\n        this.popupOpen();\n        document.removeEventListener(\"theme:scroll\", this.showOnScrollEvent);\n      }\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:scroll\", this.showOnScrollEvent);\n    }\n  }\n\n  class PopupNewsletter extends PopupComponent {\n    constructor() {\n      super();\n      this.form = this.popup.querySelector(selectors$d.newsletterForm);\n      this.heading = this.popup.querySelector(selectors$d.newsletterHeading);\n      this.newsletterField = this.popup.querySelector(\n        selectors$d.newsletterField,\n      );\n    }\n\n    connectedCallback() {\n      const cookieExists = this.cookie?.read() !== false;\n      const submissionSuccess =\n        window.location.search.indexOf(\"?customer_posted=true\") !== -1;\n      const classesString = [...this.classList].toString();\n      const isPositionBottom = classesString.includes(classes$a.bottom);\n      const targetMobile = this.popup.classList.contains(classes$a.mobile);\n      const targetDesktop = this.popup.classList.contains(classes$a.desktop);\n      const isMobileView = window.theme.isMobile();\n\n      let targetMatches = true;\n\n      if ((targetMobile && !isMobileView) || (targetDesktop && isMobileView)) {\n        targetMatches = false;\n      }\n\n      if (!targetMatches) {\n        super.a11y.removeTrapFocus();\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n        );\n        return;\n      }\n\n      if (!cookieExists || window.Shopify.designMode) {\n        if (\n          !window.Shopify.designMode &&\n          !window.location.pathname.endsWith(\"/challenge\")\n        ) {\n          super.showPopupEvents();\n        }\n\n        if (this.form && this.form.classList.contains(classes$a.success)) {\n          super.popupOpen();\n          this.cookie.write();\n        }\n\n        this.popup.addEventListener(\"theme:popup:onclose\", () =>\n          this.cookie.write(),\n        );\n      }\n\n      if (submissionSuccess) {\n        this.delay = 0;\n      }\n\n      if (!cookieExists || window.Shopify.designMode) {\n        this.show();\n\n        if (this.form.classList.contains(classes$a.success)) {\n          this.popupOpen();\n          this.cookie.write();\n        }\n      }\n\n      if (isPositionBottom) {\n        this.observeCartBar();\n      }\n    }\n\n    show() {\n      if (!window.location.pathname.endsWith(\"/challenge\")) {\n        if (!window.Shopify.designMode) {\n          super.showPopupEvents();\n        } else {\n          super.popupOpen();\n        }\n      }\n\n      this.showForm();\n      this.inputField();\n\n      this.popup.addEventListener(\"theme:popup:onclose\", () =>\n        this.cookie.write(),\n      );\n    }\n\n    observeCartBar() {\n      this.cartBar = document.getElementById(selectors$d.cartBar);\n\n      if (!this.cartBar) return;\n\n      const config = { attributes: true, childList: false, subtree: false };\n      let isVisible = this.cartBar.classList.contains(classes$a.isVisible);\n      document.body.classList.toggle(classes$a.cartBarVisible, isVisible);\n\n      // Callback function to execute when mutations are observed\n      const callback = (mutationList) => {\n        for (const mutation of mutationList) {\n          if (mutation.type === \"attributes\") {\n            isVisible = mutation.target.classList.contains(classes$a.isVisible);\n            document.body.classList.toggle(classes$a.cartBarVisible, isVisible);\n          }\n        }\n      };\n\n      this.observer = new MutationObserver(callback);\n      this.observer.observe(this.cartBar, config);\n    }\n\n    showForm() {\n      this.heading?.addEventListener(\"click\", (event) => {\n        event.preventDefault();\n\n        this.heading.classList.add(classes$a.hidden);\n        this.form.classList.remove(classes$a.hidden);\n        this.newsletterField.focus();\n      });\n\n      this.heading?.addEventListener(\"keyup\", (event) => {\n        if (event.code === \"Enter\") {\n          this.heading.dispatchEvent(new Event(\"click\"));\n        }\n      });\n    }\n\n    inputField() {\n      const setClass = () => {\n        // Reset timer if exists and is active\n        if (this.resetClassTimer) {\n          clearTimeout(this.resetClassTimer);\n        }\n\n        if (this.newsletterField.value !== \"\") {\n          this.popup.classList.add(classes$a.hasValue);\n        }\n      };\n\n      const unsetClass = () => {\n        // Reset timer if exists and is active\n        if (this.resetClassTimer) {\n          clearTimeout(this.resetClassTimer);\n        }\n\n        // Reset class\n        this.resetClassTimer = setTimeout(() => {\n          this.popup.classList.remove(classes$a.hasValue);\n        }, 2000);\n      };\n\n      this.newsletterField.addEventListener(\"input\", setClass);\n      this.newsletterField.addEventListener(\"focus\", setClass);\n      this.newsletterField.addEventListener(\"focusout\", unsetClass);\n    }\n\n    disconnectedCallback() {\n      if (this.observer) {\n        this.observer.disconnect();\n      }\n    }\n  }\n\n  if (!customElements.get(\"popup-component\")) {\n    customElements.define(\"popup-component\", PopupComponent);\n  }\n\n  if (!customElements.get(\"popup-newsletter\")) {\n    customElements.define(\"popup-newsletter\", PopupNewsletter);\n  }\n\n  const selectors$c = {\n    allVisibleElements: '[role=\"option\"]',\n    ariaSelected: '[aria-selected=\"true\"]',\n    popularSearches: \"[data-popular-searches]\",\n    predictiveSearch: \"predictive-search\",\n    predictiveSearchResults: \"[data-predictive-search-results]\",\n    predictiveSearchStatus: \"[data-predictive-search-status]\",\n    searchInput: 'input[type=\"search\"]',\n    searchPopdown: \"[data-popdown]\",\n    searchResultsLiveRegion: \"[data-predictive-search-live-region-count-value]\",\n    searchResultsGroupsWrapper: \"[data-search-results-groups-wrapper]\",\n    searchForText: \"[data-predictive-search-search-for-text]\",\n    sectionPredictiveSearch: \"#shopify-section-predictive-search\",\n    selectedLink: '[aria-selected=\"true\"] a',\n    selectedOption: '[aria-selected=\"true\"] a, button[aria-selected=\"true\"]',\n  };\n\n  if (!customElements.get(\"predictive-search\")) {\n    customElements.define(\n      \"predictive-search\",\n\n      class PredictiveSearch extends HeaderSearchForm {\n        constructor() {\n          super();\n\n          this.a11y = window.theme.a11y;\n          this.abortController = new AbortController();\n          this.allPredictiveSearchInstances = document.querySelectorAll(\n            selectors$c.predictiveSearch,\n          );\n          this.cachedResults = {};\n          this.input = this.querySelector(selectors$c.searchInput);\n          this.isOpen = false;\n          this.predictiveSearchResults = this.querySelector(\n            selectors$c.predictiveSearchResults,\n          );\n          this.searchPopdown = this.closest(selectors$c.searchPopdown);\n          this.popularSearches = this.searchPopdown?.querySelector(\n            selectors$c.popularSearches,\n          );\n          this.searchTerm = \"\";\n        }\n\n        connectedCallback() {\n          this.input.addEventListener(\"focus\", this.onFocus.bind(this));\n          this.input.form.addEventListener(\n            \"submit\",\n            this.onFormSubmit.bind(this),\n          );\n\n          this.addEventListener(\"focusout\", this.onFocusOut.bind(this));\n          this.addEventListener(\"keyup\", this.onKeyup.bind(this));\n          this.addEventListener(\"keydown\", this.onKeydown.bind(this));\n        }\n\n        getQuery() {\n          return this.input.value.trim();\n        }\n\n        onChange() {\n          super.onChange();\n          const newSearchTerm = this.getQuery();\n\n          if (!this.searchTerm || !newSearchTerm.startsWith(this.searchTerm)) {\n            // Remove the results when they are no longer relevant for the new search term\n            // so they don't show up when the dropdown opens again\n            this.querySelector(\n              selectors$c.searchResultsGroupsWrapper,\n            )?.remove();\n          }\n\n          // Update the term asap, don't wait for the predictive search query to finish loading\n          this.updateSearchForTerm(this.searchTerm, newSearchTerm);\n\n          this.searchTerm = newSearchTerm;\n\n          if (!this.searchTerm.length) {\n            this.reset();\n            return;\n          }\n\n          this.getSearchResults(this.searchTerm);\n        }\n\n        onFormSubmit(event) {\n          if (\n            !this.getQuery().length ||\n            this.querySelector(selectors$c.selectedLink)\n          )\n            event.preventDefault();\n        }\n\n        onFormReset(event) {\n          super.onFormReset(event);\n          if (super.shouldResetForm()) {\n            this.searchTerm = \"\";\n            this.abortController.abort();\n            this.abortController = new AbortController();\n            this.closeResults(true);\n          }\n        }\n\n        shouldResetForm() {\n          return !document.querySelector(selectors$c.selectedLink);\n        }\n\n        onFocus() {\n          const currentSearchTerm = this.getQuery();\n\n          if (!currentSearchTerm.length) return;\n\n          if (this.searchTerm !== currentSearchTerm) {\n            // Search term was changed from other search input, treat it as a user change\n            this.onChange();\n          } else if (this.getAttribute(\"results\") === \"true\") {\n            this.open();\n          } else {\n            this.getSearchResults(this.searchTerm);\n          }\n        }\n\n        onFocusOut() {\n          setTimeout(() => {\n            if (!this.contains(document.activeElement)) this.close();\n          });\n        }\n\n        onKeyup(event) {\n          if (!this.getQuery().length) this.close(true);\n          event.preventDefault();\n\n          switch (event.code) {\n            case \"ArrowUp\":\n              this.switchOption(\"up\");\n              break;\n            case \"ArrowDown\":\n              this.switchOption(\"down\");\n              break;\n            case \"Enter\":\n              this.selectOption();\n              break;\n          }\n        }\n\n        onKeydown(event) {\n          // Prevent the cursor from moving in the input when using the up and down arrow keys\n          if (event.code === \"ArrowUp\" || event.code === \"ArrowDown\") {\n            event.preventDefault();\n          }\n        }\n\n        updateSearchForTerm(previousTerm, newTerm) {\n          const searchForTextElement = this.querySelector(\n            selectors$c.searchForText,\n          );\n          const currentButtonText = searchForTextElement?.innerText;\n\n          if (currentButtonText) {\n            if (\n              currentButtonText.match(new RegExp(previousTerm, \"g\"))?.length > 1\n            ) {\n              // The new term matches part of the button text and not just the search term, do not replace to avoid mistakes\n              return;\n            }\n            const newButtonText = currentButtonText.replace(\n              previousTerm,\n              newTerm,\n            );\n            searchForTextElement.innerText = newButtonText;\n          }\n        }\n\n        switchOption(direction) {\n          if (!this.getAttribute(\"open\")) return;\n\n          const moveUp = direction === \"up\";\n          const selectedElement = this.querySelector(selectors$c.ariaSelected);\n\n          // Filter out hidden elements (duplicated page and article resources) thanks\n          // to this https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n          const allVisibleElements = Array.from(\n            this.querySelectorAll(selectors$c.allVisibleElements),\n          ).filter((element) => element.offsetParent !== null);\n\n          let activeElementIndex = 0;\n\n          if (moveUp && !selectedElement) return;\n\n          let selectedElementIndex = -1;\n          let i = 0;\n\n          while (\n            selectedElementIndex === -1 &&\n            i <= allVisibleElements.length\n          ) {\n            if (allVisibleElements[i] === selectedElement) {\n              selectedElementIndex = i;\n            }\n            i++;\n          }\n\n          this.statusElement.textContent = \"\";\n\n          if (!moveUp && selectedElement) {\n            activeElementIndex =\n              selectedElementIndex === allVisibleElements.length - 1\n                ? 0\n                : selectedElementIndex + 1;\n          } else if (moveUp) {\n            activeElementIndex =\n              selectedElementIndex === 0\n                ? allVisibleElements.length - 1\n                : selectedElementIndex - 1;\n          }\n\n          if (activeElementIndex === selectedElementIndex) return;\n\n          const activeElement = allVisibleElements[activeElementIndex];\n\n          activeElement.setAttribute(\"aria-selected\", true);\n          if (selectedElement)\n            selectedElement.setAttribute(\"aria-selected\", false);\n\n          this.input.setAttribute(\"aria-activedescendant\", activeElement.id);\n        }\n\n        selectOption() {\n          const selectedOption = this.querySelector(selectors$c.selectedOption);\n\n          if (selectedOption) selectedOption.click();\n        }\n\n        getSearchResults(searchTerm) {\n          const queryKey = searchTerm.replace(\" \", \"-\").toLowerCase();\n          this.setLiveRegionLoadingState();\n\n          if (this.cachedResults[queryKey]) {\n            this.renderSearchResults(this.cachedResults[queryKey]);\n            return;\n          }\n\n          fetch(\n            `${theme.routes.predictive_search_url}?q=${encodeURIComponent(searchTerm)}&section_id=predictive-search`,\n            { signal: this.abortController.signal },\n          )\n            .then((response) => {\n              if (!response.ok) {\n                var error = new Error(response.status);\n                this.close();\n                throw error;\n              }\n\n              return response.text();\n            })\n            .then((text) => {\n              const resultsMarkup = new DOMParser()\n                .parseFromString(text, \"text/html\")\n                .querySelector(selectors$c.sectionPredictiveSearch).innerHTML;\n              // Save bandwidth keeping the cache in all instances synced\n              this.allPredictiveSearchInstances.forEach(\n                (predictiveSearchInstance) => {\n                  predictiveSearchInstance.cachedResults[queryKey] =\n                    resultsMarkup;\n                },\n              );\n              this.renderSearchResults(resultsMarkup);\n            })\n            .catch((error) => {\n              if (error?.code === 20) {\n                // Code 20 means the call was aborted\n                return;\n              }\n              this.close();\n              throw error;\n            });\n        }\n\n        setLiveRegionLoadingState() {\n          this.statusElement =\n            this.statusElement ||\n            this.querySelector(selectors$c.predictiveSearchStatus);\n          this.loadingText =\n            this.loadingText || this.getAttribute(\"data-loading-text\");\n\n          this.setLiveRegionText(this.loadingText);\n          this.setAttribute(\"loading\", true);\n        }\n\n        setLiveRegionText(statusText) {\n          this.statusElement.setAttribute(\"aria-hidden\", \"false\");\n          this.statusElement.textContent = statusText;\n\n          setTimeout(() => {\n            this.statusElement.setAttribute(\"aria-hidden\", \"true\");\n          }, 1000);\n        }\n\n        renderSearchResults(resultsMarkup) {\n          this.predictiveSearchResults.innerHTML = resultsMarkup;\n\n          this.setAttribute(\"results\", true);\n\n          this.setLiveRegionResults();\n          this.open();\n        }\n\n        setLiveRegionResults() {\n          this.removeAttribute(\"loading\");\n          this.setLiveRegionText(\n            this.querySelector(selectors$c.searchResultsLiveRegion).textContent,\n          );\n        }\n\n        open() {\n          this.setAttribute(\"open\", true);\n          this.input.setAttribute(\"aria-expanded\", true);\n          this.isOpen = true;\n          this.predictiveSearchResults.style.setProperty(\n            \"--results-height\",\n            `${window.visualViewport.height - this.predictiveSearchResults.getBoundingClientRect().top}px`,\n          );\n        }\n\n        close(clearSearchTerm = false) {\n          this.closeResults(clearSearchTerm);\n          this.isOpen = false;\n          this.predictiveSearchResults.style.removeProperty(\"--results-height\");\n        }\n\n        closeResults(clearSearchTerm = false) {\n          if (clearSearchTerm) {\n            this.input.value = \"\";\n            this.removeAttribute(\"results\");\n          }\n          const selected = this.querySelector(selectors$c.ariaSelected);\n\n          if (selected) selected.setAttribute(\"aria-selected\", false);\n\n          this.input.setAttribute(\"aria-activedescendant\", \"\");\n          this.removeAttribute(\"loading\");\n          this.removeAttribute(\"open\");\n          this.input.setAttribute(\"aria-expanded\", false);\n          this.predictiveSearchResults?.removeAttribute(\"style\");\n        }\n\n        reset() {\n          this.predictiveSearchResults.innerHTML = \"\";\n\n          this.input.val = \"\";\n          this.a11y.removeTrapFocus();\n\n          if (this.popularSearches) {\n            this.input.dispatchEvent(new Event(\"blur\", { bubbles: false }));\n            this.a11y.trapFocus(this.searchPopdown, {\n              elementToFocus: this.input,\n            });\n          }\n        }\n      },\n    );\n  }\n\n  function Listeners() {\n    this.entries = [];\n  }\n\n  Listeners.prototype.add = function (element, event, fn) {\n    this.entries.push({ element: element, event: event, fn: fn });\n    element.addEventListener(event, fn);\n  };\n\n  Listeners.prototype.removeAll = function () {\n    this.entries = this.entries.filter(function (listener) {\n      listener.element.removeEventListener(listener.event, listener.fn);\n      return false;\n    });\n  };\n\n  /**\n   * Convert the Object (with 'name' and 'value' keys) into an Array of values, then find a match & return the variant (as an Object)\n   * @param {Object} product Product JSON object\n   * @param {Object} collection Object with 'name' and 'value' keys (e.g. [{ name: \"Size\", value: \"36\" }, { name: \"Color\", value: \"Black\" }])\n   * @returns {Object || null} The variant object once a match has been successful. Otherwise null will be returned\n   */\n  function getVariantFromSerializedArray(product, collection) {\n    _validateProductStructure(product);\n\n    // If value is an array of options\n    var optionArray = _createOptionArrayFromOptionCollection(\n      product,\n      collection,\n    );\n    return getVariantFromOptionArray(product, optionArray);\n  }\n\n  /**\n   * Find a match in the project JSON (using Array with option values) and return the variant (as an Object)\n   * @param {Object} product Product JSON object\n   * @param {Array} options List of submitted values (e.g. ['36', 'Black'])\n   * @returns {Object || null} The variant object once a match has been successful. Otherwise null will be returned\n   */\n  function getVariantFromOptionArray(product, options) {\n    _validateProductStructure(product);\n    _validateOptionsArray(options);\n\n    var result = product.variants.filter(function (variant) {\n      return options.every(function (option, index) {\n        return variant.options[index] === option;\n      });\n    });\n\n    return result[0] || null;\n  }\n\n  /**\n   * Creates an array of selected options from the object\n   * Loops through the project.options and check if the \"option name\" exist (product.options.name) and matches the target\n   * @param {Object} product Product JSON object\n   * @param {Array} collection Array of object (e.g. [{ name: \"Size\", value: \"36\" }, { name: \"Color\", value: \"Black\" }])\n   * @returns {Array} The result of the matched values. (e.g. ['36', 'Black'])\n   */\n  function _createOptionArrayFromOptionCollection(product, collection) {\n    _validateProductStructure(product);\n    _validateSerializedArray(collection);\n\n    var optionArray = [];\n\n    collection.forEach(function (option) {\n      for (var i = 0; i < product.options.length; i++) {\n        var name = product.options[i].name || product.options[i];\n        if (name.toLowerCase() === option.name.toLowerCase()) {\n          optionArray[i] = option.value;\n          break;\n        }\n      }\n    });\n\n    return optionArray;\n  }\n\n  /**\n   * Check if the product data is a valid JS object\n   * Error will be thrown if type is invalid\n   * @param {object} product Product JSON object\n   */\n  function _validateProductStructure(product) {\n    if (typeof product !== \"object\") {\n      throw new TypeError(product + \" is not an object.\");\n    }\n\n    if (Object.keys(product).length === 0 && product.constructor === Object) {\n      throw new Error(product + \" is empty.\");\n    }\n  }\n\n  /**\n   * Validate the structure of the array\n   * It must be formatted like jQuery's serializeArray()\n   * @param {Array} collection Array of object [{ name: \"Size\", value: \"36\" }, { name: \"Color\", value: \"Black\" }]\n   */\n  function _validateSerializedArray(collection) {\n    if (!Array.isArray(collection)) {\n      throw new TypeError(collection + \" is not an array.\");\n    }\n\n    if (collection.length === 0) {\n      throw new Error(collection + \" is empty.\");\n    }\n\n    if (collection[0].hasOwnProperty(\"name\")) {\n      if (typeof collection[0].name !== \"string\") {\n        throw new TypeError(\n          \"Invalid value type passed for name of option \" +\n            collection[0].name +\n            \". Value should be string.\",\n        );\n      }\n    } else {\n      throw new Error(collection[0] + \"does not contain name key.\");\n    }\n  }\n\n  /**\n   * Validate the structure of the array\n   * It must be formatted as list of values\n   * @param {Array} collection Array of object (e.g. ['36', 'Black'])\n   */\n  function _validateOptionsArray(options) {\n    if (Array.isArray(options) && typeof options[0] === \"object\") {\n      throw new Error(options + \"is not a valid array of options.\");\n    }\n  }\n\n  var selectors$b = {\n    idInput: '[name=\"id\"]',\n    planInput: '[name=\"selling_plan\"]',\n    optionInput: '[name^=\"options\"]',\n    quantityInput: '[name=\"quantity\"]',\n    propertyInput: '[name^=\"properties\"]',\n  };\n\n  // Public Methods\n  // -----------------------------------------------------------------------------\n\n  /**\n   * Returns a URL with a variant ID query parameter. Useful for updating window.history\n   * with a new URL based on the currently select product variant.\n   * @param {string} url - The URL you wish to append the variant ID to\n   * @param {number} id  - The variant ID you wish to append to the URL\n   * @returns {string} - The new url which includes the variant ID query parameter\n   */\n\n  function getUrlWithVariant(url, id) {\n    if (/variant=/.test(url)) {\n      return url.replace(/(variant=)[^&]+/, \"$1\" + id);\n    } else if (/\\?/.test(url)) {\n      return url.concat(\"&variant=\").concat(id);\n    }\n\n    return url.concat(\"?variant=\").concat(id);\n  }\n\n  /**\n   * Constructor class that creates a new instance of a product form controller.\n   *\n   * @param {Element} element - DOM element which is equal to the <form> node wrapping product form inputs\n   * @param {Object} product - A product object\n   * @param {Object} options - Optional options object\n   * @param {Function} options.onOptionChange - Callback for whenever an option input changes\n   * @param {Function} options.onPlanChange - Callback for changes to name=selling_plan\n   * @param {Function} options.onQuantityChange - Callback for whenever an quantity input changes\n   * @param {Function} options.onPropertyChange - Callback for whenever a property input changes\n   * @param {Function} options.onFormSubmit - Callback for whenever the product form is submitted\n   */\n  class ProductFormReader {\n    constructor(element, product, options) {\n      this.element = element;\n      this.product = this._validateProductObject(product);\n      this.variantElement = this.element.querySelector(selectors$b.idInput);\n\n      options = options || {};\n\n      this._listeners = new Listeners();\n      this._listeners.add(\n        this.element,\n        \"submit\",\n        this._onSubmit.bind(this, options),\n      );\n\n      this.optionInputs = this._initInputs(\n        selectors$b.optionInput,\n        options.onOptionChange,\n      );\n\n      this.planInputs = this._initInputs(\n        selectors$b.planInput,\n        options.onPlanChange,\n      );\n\n      this.quantityInputs = this._initInputs(\n        selectors$b.quantityInput,\n        options.onQuantityChange,\n      );\n\n      this.propertyInputs = this._initInputs(\n        selectors$b.propertyInput,\n        options.onPropertyChange,\n      );\n    }\n\n    /**\n     * Cleans up all event handlers that were assigned when the Product Form was constructed.\n     * Useful for use when a section needs to be reloaded in the theme editor.\n     */\n    destroy() {\n      this._listeners.removeAll();\n    }\n\n    /**\n     * Getter method which returns the array of currently selected option values\n     *\n     * @returns {Array} An array of option values\n     */\n    options() {\n      return this._serializeInputValues(this.optionInputs, function (item) {\n        var regex = /(?:^(options\\[))(.*?)(?:\\])/;\n        item.name = regex.exec(item.name)[2]; // Use just the value between 'options[' and ']'\n        return item;\n      });\n    }\n\n    /**\n     * Getter method which returns the currently selected variant, or `null` if variant\n     * doesn't exist.\n     *\n     * @returns {Object|null} Variant object\n     */\n    variant() {\n      const opts = this.options();\n      if (opts.length) {\n        return getVariantFromSerializedArray(this.product, opts);\n      } else {\n        return this.product.variants[0];\n      }\n    }\n\n    /**\n     * Getter method which returns the current selling plan, or `null` if plan\n     * doesn't exist.\n     *\n     * @returns {Object|null} Variant object\n     */\n    plan(variant) {\n      let plan = {\n        allocation: null,\n        group: null,\n        detail: null,\n      };\n      const sellingPlanChecked = this.element.querySelector(\n        `${selectors$b.planInput}:checked`,\n      );\n      if (!sellingPlanChecked) return null;\n      const sellingPlanCheckedValue = sellingPlanChecked.value;\n      const id =\n        sellingPlanCheckedValue && sellingPlanCheckedValue !== \"\"\n          ? sellingPlanCheckedValue\n          : null;\n\n      if (id && variant) {\n        plan.allocation = variant.selling_plan_allocations.find(\n          function (item) {\n            return item.selling_plan_id.toString() === id.toString();\n          },\n        );\n      }\n      if (plan.allocation) {\n        plan.group = this.product.selling_plan_groups.find(function (item) {\n          return (\n            item.id.toString() ===\n            plan.allocation.selling_plan_group_id.toString()\n          );\n        });\n      }\n      if (plan.group) {\n        plan.detail = plan.group.selling_plans.find(function (item) {\n          return item.id.toString() === id.toString();\n        });\n      }\n\n      if (plan && plan.allocation && plan.detail && plan.allocation) {\n        return plan;\n      } else return null;\n    }\n\n    /**\n     * Getter method which returns a collection of objects containing name and values\n     * of property inputs\n     *\n     * @returns {Array} Collection of objects with name and value keys\n     */\n    properties() {\n      return this._serializeInputValues(this.propertyInputs, function (item) {\n        var regex = /(?:^(properties\\[))(.*?)(?:\\])/;\n        item.name = regex.exec(item.name)[2]; // Use just the value between 'properties[' and ']'\n        return item;\n      });\n    }\n\n    /**\n     * Getter method which returns the current quantity or 1 if no quantity input is\n     * included in the form\n     *\n     * @returns {Array} Collection of objects with name and value keys\n     */\n    quantity() {\n      return this.quantityInputs[0]\n        ? Number.parseInt(this.quantityInputs[0].value, 10)\n        : 1;\n    }\n\n    getFormState() {\n      const variant = this.variant();\n      return {\n        options: this.options(),\n        variant: variant,\n        properties: this.properties(),\n        quantity: this.quantity(),\n        plan: this.plan(variant),\n      };\n    }\n\n    // Private Methods\n    // -----------------------------------------------------------------------------\n    _setIdInputValue(variant) {\n      if (variant && variant.id) {\n        this.variantElement.value = variant.id.toString();\n      } else {\n        this.variantElement.value = \"\";\n      }\n\n      this.variantElement.dispatchEvent(new Event(\"change\"));\n    }\n\n    _onSubmit(options, event) {\n      event.dataset = this.getFormState();\n      if (options.onFormSubmit) {\n        options.onFormSubmit(event);\n      }\n    }\n\n    _onOptionChange(event) {\n      this._setIdInputValue(event.dataset.variant);\n    }\n\n    _onFormEvent(cb) {\n      if (typeof cb === \"undefined\") {\n        return Function.prototype.bind();\n      }\n\n      return function (event) {\n        event.dataset = this.getFormState();\n        this._setIdInputValue(event.dataset.variant);\n        cb(event);\n      }.bind(this);\n    }\n\n    _initInputs(selector, cb) {\n      var elements = Array.prototype.slice.call(\n        this.element.querySelectorAll(selector),\n      );\n\n      return elements.map(\n        function (element) {\n          this._listeners.add(element, \"change\", this._onFormEvent(cb));\n          return element;\n        }.bind(this),\n      );\n    }\n\n    _serializeInputValues(inputs, transform) {\n      return inputs.reduce(function (options, input) {\n        if (\n          input.checked || // If input is a checked (means type radio or checkbox)\n          (input.type !== \"radio\" && input.type !== \"checkbox\") // Or if its any other type of input\n        ) {\n          options.push(transform({ name: input.name, value: input.value }));\n        }\n\n        return options;\n      }, []);\n    }\n\n    _validateProductObject(product) {\n      if (typeof product !== \"object\") {\n        throw new TypeError(product + \" is not an object.\");\n      }\n\n      if (typeof product.variants[0].options === \"undefined\") {\n        throw new TypeError(\n          \"Product object is invalid. Make sure you use the product object that is output from {{ product | json }} or from the http://[your-product-url].js route\",\n        );\n      }\n      return product;\n    }\n  }\n\n  const selectors$a = {\n    optionPosition: \"data-option-position\",\n    optionInput: '[name^=\"options\"], [data-popout-option]',\n    optionInputCurrent:\n      '[name^=\"options\"]:checked, [name^=\"options\"][type=\"hidden\"]',\n    selectOptionValue: \"data-value\",\n    popout: \"[data-popout]\",\n  };\n\n  const classes$9 = {\n    soldOut: \"sold-out\",\n    unavailable: \"unavailable\",\n    sale: \"sale\",\n  };\n\n  /**\n   * Variant Sellout Precrime Click Preview\n   * I think of this like the precrime machine in Minority report.  It gives a preview\n   * of every possible click action, given the current form state.  The logic is:\n   *\n   * for each clickable name=options[] variant selection element\n   * find the value of the form if the element were clicked\n   * lookup the variant with those value in the product json\n   * clear the classes, add .unavailable if it's not found,\n   * and add .sold-out if it is out of stock\n   *\n   * Caveat: we rely on the option position so we don't need\n   * to keep a complex map of keys and values.\n   */\n\n  class SelloutVariants {\n    constructor(section, productJSON) {\n      this.container = section;\n      this.productJSON = productJSON;\n      this.optionElements = this.container.querySelectorAll(\n        selectors$a.optionInput,\n      );\n\n      if (this.productJSON && this.optionElements.length) {\n        this.init();\n      }\n    }\n\n    init() {\n      this.update();\n    }\n\n    update() {\n      this.getCurrentState();\n\n      this.optionElements.forEach((el) => {\n        const parent = el.closest(`[${selectors$a.optionPosition}]`);\n        if (!parent) return;\n        const val = el.value || el.getAttribute(selectors$a.selectOptionValue);\n        const positionString = parent.getAttribute(selectors$a.optionPosition);\n        // subtract one because option.position in liquid does not count form zero, but JS arrays do\n        const position = parseInt(positionString, 10) - 1;\n        const selectPopout = el.closest(selectors$a.popout);\n\n        let newVals = [...this.selections];\n        newVals[position] = val;\n\n        const found = this.productJSON.variants.find((element) => {\n          // only return true if every option matches our hypothetical selection\n          let perfectMatch = true;\n          for (let index = 0; index < newVals.length; index++) {\n            if (element.options[index] !== newVals[index]) {\n              perfectMatch = false;\n            }\n          }\n          return perfectMatch;\n        });\n\n        el.classList.remove(classes$9.soldOut, classes$9.unavailable);\n        el.parentNode.classList.remove(classes$9.sale);\n\n        if (selectPopout) {\n          selectPopout.classList.remove(\n            classes$9.soldOut,\n            classes$9.unavailable,\n            classes$9.sale,\n          );\n        }\n\n        if (typeof found === \"undefined\") {\n          el.classList.add(classes$9.unavailable);\n\n          if (selectPopout) {\n            selectPopout.classList.add(classes$9.unavailable);\n          }\n        } else if (found && found.available === false) {\n          el.classList.add(classes$9.soldOut);\n\n          if (selectPopout) {\n            selectPopout.classList.add(classes$9.soldOut);\n          }\n        }\n\n        if (\n          found &&\n          found.compare_at_price > found.price &&\n          theme.settings.variantOnSale\n        ) {\n          el.parentNode.classList.add(classes$9.sale);\n        }\n      });\n    }\n\n    getCurrentState() {\n      this.selections = [];\n\n      const options = this.container.querySelectorAll(\n        selectors$a.optionInputCurrent,\n      );\n      if (options.length) {\n        options.forEach((element) => {\n          const elemValue = element.value;\n          if (elemValue && elemValue !== \"\") {\n            this.selections.push(elemValue);\n          }\n        });\n      }\n    }\n  }\n\n  const selectors$9 = {\n    product: \"[data-product]\",\n    productForm: \"[data-product-form]\",\n    productNotification: \"product-notification\",\n    variantTitle: \"[data-variant-title]\",\n    notificationProduct: \"[data-notification-product]\",\n    itemCountForVariant: \"[data-item-count-for-variant]\",\n    maxInventory: \"[data-max-inventory]\",\n    addToCart: \"[data-add-to-cart]\",\n    addToCartText: \"[data-add-to-cart-text]\",\n    cartPage: \"[data-cart-page]\",\n    comparePrice: \"[data-compare-price]\",\n    comparePriceText: \"[data-compare-text]\",\n    finalSaleBadge: \"[data-final-sale-badge]\",\n    colorDescriptionMetafield: \"[data-color-description-metafield]\",\n    colorDescription: \"[data-color-description]\",\n    formWrapper: \"[data-form-wrapper]\",\n    originalSelectorId: \"[data-product-select]\",\n    priceWrapper: \"[data-price-wrapper]\",\n    productImages: \"product-images\",\n    productImage: \"[data-product-image]\",\n    productMediaList: \"[data-product-media-list]\",\n    productJson: \"[data-product-json]\",\n    productPrice: \"[data-product-price]\",\n    productUpsell: \"[data-product-upsell-ajax]\",\n    unitPrice: \"[data-product-unit-price]\",\n    unitBase: \"[data-product-base]\",\n    unitWrapper: \"[data-product-unit]\",\n    productPreorderInput: \"[data-product-preorder]\",\n    productSlide: \".product__slide\",\n    subPrices: \"[data-subscription-watch-price]\",\n    subSelectors: \"[data-subscription-selectors]\",\n    subsToggle: \"[data-toggles-group]\",\n    subsChild: \"data-group-toggle\",\n    subDescription: \"[data-plan-description]\",\n    section: \"[data-section-type]\",\n    variantSku: \"[data-variant-sku]\",\n    variantMetafields: \"[data-variant-metafields]\",\n    variantButtons: \"[data-variant-buttons]\",\n    variantOptionImage: \"[data-variant-option-image]\",\n    quickAddModal: \"[data-quick-add-modal]\",\n    priceOffAmount: \"[data-price-off-amount]\",\n    priceOffBadge: \"[data-price-off-badge]\",\n    priceOffType: \"[data-price-off-type]\",\n    priceOffWrap: \"[data-price-off]\",\n    remainingCount: \"[data-remaining-count]\",\n    remainingMax: \"[data-remaining-max]\",\n    remainingWrapper: \"[data-remaining-wrapper]\",\n    remainingJSON: \"[data-product-remaining-json]\",\n    optionValue: \"[data-option-value]\",\n    optionPosition: \"[data-option-position]\",\n    installment: \"[data-product-form-installment]\",\n    inputId: 'input[name=\"id\"]',\n  };\n\n  const classes$8 = {\n    hidden: \"hidden\",\n    variantSoldOut: \"variant--soldout\",\n    variantUnavailable: \"variant--unavailable\",\n    productPriceSale: \"product__price--sale\",\n    remainingLow: \"count-is-low\",\n    remainingIn: \"count-is-in\",\n    remainingOut: \"count-is-out\",\n    remainingUnavailable: \"count-is-unavailable\",\n  };\n\n  const attributes$7 = {\n    remainingMaxAttr: \"data-remaining-max\",\n    enableHistoryState: \"data-enable-history-state\",\n    notificationPopup: \"data-notification-popup\",\n    faderDesktop: \"data-fader-desktop\",\n    faderMobile: \"data-fader-mobile\",\n    optionPosition: \"data-option-position\",\n    imageId: \"data-image-id\",\n    mediaId: \"data-media-id\",\n    quickAddButton: \"data-quick-add-btn\",\n    finalSale: \"data-final-sale\",\n    variantImageScroll: \"data-variant-image-scroll\",\n    maxInventoryReached: \"data-max-inventory-reached\",\n    errorMessagePosition: \"data-error-message-position\",\n    preorderTypeProduct: \"data-preorder-type-product\",\n  };\n\n  if (!customElements.get(\"product-form\")) {\n    customElements.define(\n      \"product-form\",\n\n      class ProductForm extends HTMLElement {\n        constructor() {\n          super();\n        }\n\n        connectedCallback() {\n          if (this.hasAttribute(\"onboarding\")) return;\n\n          this.cartAddEvents();\n\n          this.container =\n            this.closest(selectors$9.section) ||\n            this.closest(selectors$9.quickAddModal);\n          if (!this.container) return;\n\n          this.sectionId = this.container.dataset.sectionId;\n          this.product = this.container.querySelector(selectors$9.product);\n          this.productForm = this.container.querySelector(\n            selectors$9.productForm,\n          );\n          this.productNotification = this.container.querySelector(\n            selectors$9.productNotification,\n          );\n          this.productImages = this.container.querySelector(\n            selectors$9.productImages,\n          );\n          this.productMediaList = this.container.querySelector(\n            selectors$9.productMediaList,\n          );\n          this.installmentForm = this.container.querySelector(\n            selectors$9.installment,\n          );\n          this.skuWrapper = this.container.querySelector(\n            selectors$9.variantSku,\n          );\n          this.sellout = null;\n          this.variantImageScroll =\n            this.container.getAttribute(attributes$7.variantImageScroll) ===\n            \"true\";\n\n          this.priceOffWrap = this.container.querySelector(\n            selectors$9.priceOffWrap,\n          );\n          this.priceOffAmount = this.container.querySelector(\n            selectors$9.priceOffAmount,\n          );\n          this.priceOffType = this.container.querySelector(\n            selectors$9.priceOffType,\n          );\n          this.planDescription = this.container.querySelector(\n            selectors$9.subDescription,\n          );\n\n          this.remainingWrapper = this.container.querySelector(\n            selectors$9.remainingWrapper,\n          );\n\n          this.colorDescriptionMetafield = this.container.querySelector(\n            selectors$9.colorDescriptionMetafield,\n          );\n          this.colorDescription = this.container.querySelector(\n            selectors$9.colorDescription,\n          );\n          this.colorDescriptionData = null;\n\n          if (\n            this.colorDescriptionMetafield &&\n            this.colorDescriptionMetafield.textContent\n          ) {\n            try {\n              this.colorDescriptionData = JSON.parse(\n                this.colorDescriptionMetafield.textContent,\n              );\n            } catch (e) {\n              console.warn(\n                \"Error parsing color description metafield data:\",\n                e,\n              );\n            }\n          }\n\n          if (this.remainingWrapper) {\n            const remainingMaxWrap = this.container.querySelector(\n              selectors$9.remainingMax,\n            );\n            if (remainingMaxWrap) {\n              this.remainingMaxInt = parseInt(\n                remainingMaxWrap.getAttribute(attributes$7.remainingMaxAttr),\n                10,\n              );\n              this.remainingCount = this.container.querySelector(\n                selectors$9.remainingCount,\n              );\n              this.remainingJSONWrapper = this.container.querySelector(\n                selectors$9.remainingJSON,\n              );\n              this.remainingJSON = null;\n\n              if (\n                this.remainingJSONWrapper &&\n                this.remainingJSONWrapper.innerHTML !== \"\"\n              ) {\n                this.remainingJSON = JSON.parse(\n                  this.remainingJSONWrapper.innerHTML,\n                );\n              } else {\n                console.warn(\"Missing product quantity JSON\");\n              }\n            }\n          }\n\n          this.preorderInput = this.container.querySelector(\n            selectors$9.productPreorderInput,\n          );\n          this.enableHistoryState =\n            this.container.getAttribute(attributes$7.enableHistoryState) ===\n            \"true\";\n          this.hasUnitPricing = this.container.querySelector(\n            selectors$9.unitWrapper,\n          );\n          this.subSelectors = this.container.querySelector(\n            selectors$9.subSelectors,\n          );\n          this.subPrices = this.container.querySelector(selectors$9.subPrices);\n          this.isPreOrder = this.container.querySelector(\n            selectors$9.isPreOrder,\n          );\n\n          let productJSON = null;\n          const productElemJSON = this.container.querySelector(\n            selectors$9.productJson,\n          );\n          if (productElemJSON) {\n            productJSON = productElemJSON.innerHTML;\n          }\n          if (productJSON) {\n            this.productJSON = JSON.parse(productJSON);\n            this.linkForm();\n            this.sellout = new SelloutVariants(\n              this.container,\n              this.productJSON,\n            );\n          } else {\n            console.error(\"Missing product JSON\");\n          }\n\n          this.variantOptionImages = this.container.querySelectorAll(\n            selectors$9.variantOptionImage,\n          );\n          this.variantButtons = this.container.querySelectorAll(\n            selectors$9.variantButtons,\n          );\n          if (this.variantOptionImages.length > 1) {\n            this.optionImagesWidth();\n          }\n        }\n\n        cartAddEvents() {\n          this.buttonATC = this.querySelector(selectors$9.addToCart);\n\n          this.buttonATC.addEventListener(\"click\", (e) => {\n            e.preventDefault();\n\n            document.dispatchEvent(\n              new CustomEvent(\"theme:cart:add\", {\n                detail: {\n                  button: this.buttonATC,\n                },\n                bubbles: false,\n              }),\n            );\n\n            if (!this.closest(selectors$9.quickAddModal)) {\n              window.a11y.lastElement = this.buttonATC;\n            }\n          });\n        }\n\n        destroy() {\n          this.productForm.destroy();\n        }\n\n        linkForm() {\n          this.productForm = new ProductFormReader(\n            this.container,\n            this.productJSON,\n            {\n              onOptionChange: this.onOptionChange.bind(this),\n              onPlanChange: this.onPlanChange.bind(this),\n              onQuantityChange: this.onQuantityChange.bind(this),\n            },\n          );\n          this.pushState(this.productForm.getFormState(), true);\n          this.subsToggleListeners();\n\n          this.checkLiveCartInfoCallback = () => this.checkLiveCartInfo();\n          document.addEventListener(\n            \"theme:cart-drawer:close\",\n            this.checkLiveCartInfoCallback,\n          );\n        }\n\n        onOptionChange(evt) {\n          this.pushState(evt.dataset);\n        }\n\n        onPlanChange(evt) {\n          if (this.subPrices) {\n            this.pushState(evt.dataset);\n          }\n        }\n\n        onQuantityChange(evt) {\n          this.pushState(evt.dataset);\n        }\n\n        pushState(formState, init = false) {\n          this.productState = this.setProductState(formState);\n          this.updateAddToCartState(formState);\n          this.updateNotificationForm(formState);\n          this.updateProductPrices(formState);\n          this.updateProductImage(formState);\n          this.updateSaleText(formState);\n          this.updateSku(formState);\n          this.updateSubscriptionText(formState);\n          this.updateRemaining(formState);\n          this.checkLiveCartInfo(formState);\n          this.updateLegend(formState);\n          this.updateColorDescription(formState);\n          this.updatePreorderState(formState);\n          this.fireHookEvent(formState);\n          this.sellout?.update(formState);\n\n          if (this.enableHistoryState && !init) {\n            this.updateHistoryState(formState);\n          }\n        }\n\n        updateAddToCartState(formState) {\n          const variant = formState.variant;\n\n          let addText = theme.strings.addToCart;\n          const priceWrapper = this.container.querySelectorAll(\n            selectors$9.priceWrapper,\n          );\n          const addToCart = this.container.querySelectorAll(\n            selectors$9.addToCart,\n          );\n          const addToCartText = this.container.querySelectorAll(\n            selectors$9.addToCartText,\n          );\n          const formWrapper = this.container.querySelectorAll(\n            selectors$9.formWrapper,\n          );\n\n          if (this.installmentForm && variant) {\n            const installmentInput = this.installmentForm.querySelector(\n              selectors$9.inputId,\n            );\n            installmentInput.value = variant.id;\n            installmentInput.dispatchEvent(\n              new Event(\"change\", { bubbles: true }),\n            );\n          }\n\n          const variantPreorder = this.isVariantPreorder(variant);\n          const productPreorder = this.hasAttribute(\n            attributes$7.preorderTypeProduct,\n          );\n          const preorderBadge = this.container.querySelector(\n            \"[data-preorder-badge]\",\n          );\n\n          if (variantPreorder || productPreorder) {\n            addText = theme.strings.preOrder;\n          }\n\n          if (!productPreorder) {\n            preorderBadge?.classList.toggle(\"hidden\", !variantPreorder);\n          }\n\n          if (theme.settings.atcButtonShowPrice) {\n            const quantity =\n              this.container.querySelector(\"quantity-counter input\")?.value ||\n              1;\n            const totalPrice = variant.price * quantity;\n            let priceText =\n              totalPrice === 0\n                ? window.theme.strings.free\n                : window.theme.formatMoney(totalPrice, theme.moneyFormat);\n\n            if (\n              variant.compare_at_price &&\n              variant.compare_at_price > variant.price\n            ) {\n              const totalComparePrice = variant.compare_at_price * quantity;\n              priceText = `${priceText} <s>${window.theme.formatMoney(totalComparePrice, theme.moneyFormat)}</s>`;\n            }\n\n            addText = `${addText} <span class=\"btn__price\">${priceText}</span>`;\n          }\n\n          if (priceWrapper.length && variant) {\n            priceWrapper.forEach((element) => {\n              element.classList.remove(classes$8.hidden);\n            });\n          }\n\n          addToCart?.forEach((button) => {\n            if (button.hasAttribute(attributes$7.quickAddButton)) return;\n\n            if (variant) {\n              if (variant.available) {\n                button.disabled = false;\n              } else {\n                button.disabled = true;\n              }\n            } else {\n              button.disabled = true;\n            }\n          });\n\n          addToCartText?.forEach((element) => {\n            let btnText = addText;\n            if (variant) {\n              if (!variant.available) {\n                btnText = theme.strings.soldOut;\n              }\n            } else {\n              btnText = theme.strings.unavailable;\n            }\n\n            element.innerHTML = btnText;\n          });\n\n          if (formWrapper.length) {\n            formWrapper.forEach((element) => {\n              if (variant) {\n                if (variant.available) {\n                  element.classList.remove(\n                    classes$8.variantSoldOut,\n                    classes$8.variantUnavailable,\n                  );\n                } else {\n                  element.classList.add(classes$8.variantSoldOut);\n                  element.classList.remove(classes$8.variantUnavailable);\n                }\n\n                const formSelect = element.querySelector(\n                  selectors$9.originalSelectorId,\n                );\n                if (formSelect) {\n                  formSelect.value = variant.id;\n                }\n\n                const inputId = element.querySelector(\n                  `${selectors$9.inputId}[form]`,\n                );\n                if (inputId) {\n                  inputId.value = variant.id;\n                  inputId.dispatchEvent(new Event(\"change\"));\n                }\n              } else {\n                element.classList.add(classes$8.variantUnavailable);\n                element.classList.remove(classes$8.variantSoldOut);\n              }\n            });\n          }\n        }\n\n        updateNotificationForm(formState) {\n          if (!this.productNotification) return;\n\n          const variantTitle = this.productNotification.querySelector(\n            selectors$9.variantTitle,\n          );\n          const notificationProduct = this.productNotification.querySelector(\n            selectors$9.notificationProduct,\n          );\n\n          if (variantTitle != null && notificationProduct != null) {\n            variantTitle.textContent = formState.variant.title;\n            if (notificationProduct) {\n              notificationProduct.value = formState.variant.name;\n            }\n          }\n        }\n\n        updatePreorderState(formState) {\n          if (!this.preorderInput) return;\n\n          const isPreorder =\n            this.isVariantPreorder(formState.variant) ||\n            this.hasAttribute(attributes$7.preorderTypeProduct);\n\n          this.preorderInput.toggleAttribute(\"disabled\", !isPreorder);\n        }\n\n        updateHistoryState(formState) {\n          const variant = formState.variant;\n          const plan = formState.plan;\n          const location = window.location.href;\n          if (variant && location.includes(\"/product\")) {\n            const url = new window.URL(location);\n            const params = url.searchParams;\n            params.set(\"variant\", variant.id);\n            if (\n              plan &&\n              plan.detail &&\n              plan.detail.id &&\n              this.productState.hasPlan\n            ) {\n              params.set(\"selling_plan\", plan.detail.id);\n            } else {\n              params.delete(\"selling_plan\");\n            }\n            url.search = params.toString();\n            const urlString = url.toString();\n            window.history.replaceState({ path: urlString }, \"\", urlString);\n          }\n        }\n\n        updateRemaining(formState) {\n          const variant = formState.variant;\n\n          this.remainingWrapper?.classList.remove(\n            classes$8.remainingIn,\n            classes$8.remainingOut,\n            classes$8.remainingUnavailable,\n            classes$8.remainingLow,\n          );\n\n          if (variant && this.remainingWrapper && this.remainingJSON) {\n            const remaining = this.remainingJSON[variant.id];\n\n            if (remaining === \"out\" || remaining < 1) {\n              this.remainingWrapper.classList.add(classes$8.remainingOut);\n            }\n\n            if (remaining === \"in\" || remaining >= this.remainingMaxInt) {\n              this.remainingWrapper.classList.add(classes$8.remainingIn);\n            }\n\n            if (\n              remaining === \"low\" ||\n              (remaining > 0 && remaining < this.remainingMaxInt)\n            ) {\n              this.remainingWrapper.classList.add(classes$8.remainingLow);\n\n              if (this.remainingCount) {\n                this.remainingCount.innerHTML = remaining;\n              }\n            }\n          } else if (!variant && this.remainingWrapper) {\n            this.remainingWrapper.classList.add(classes$8.remainingUnavailable);\n          }\n        }\n\n        checkLiveCartInfo(formState) {\n          const state = formState ? formState : this.productForm.getFormState();\n          const variant = state.variant;\n          if (!variant) return;\n\n          const productUrl = `${theme.routes.root}products/${this.productJSON.handle}?section_id=api-live-cart-info&variant=${variant.id}`;\n\n          fetch(productUrl)\n            .then((response) => response.text())\n            .then((data) => {\n              const markup = new DOMParser().parseFromString(data, \"text/html\");\n              const itemCountForVariant = Number(\n                markup.querySelector(selectors$9.itemCountForVariant).innerHTML,\n              );\n              const maxInventory = markup.querySelector(\n                selectors$9.maxInventory,\n              ).innerHTML;\n              const maxInventoryCount = Number(maxInventory);\n              const addingMoreThanAvailable = Boolean(\n                this.productForm.quantity() + itemCountForVariant >\n                maxInventoryCount,\n              );\n\n              const maxInventoryReached =\n                maxInventory !== \"\" ? addingMoreThanAvailable : false;\n              const errorMessagePosition =\n                maxInventory !== \"\" && itemCountForVariant === maxInventoryCount\n                  ? \"form\"\n                  : \"cart\";\n\n              if (this.productForm.element.form) {\n                this.productForm.element.form.setAttribute(\n                  attributes$7.maxInventoryReached,\n                  maxInventoryReached,\n                );\n                this.productForm.element.form.setAttribute(\n                  attributes$7.errorMessagePosition,\n                  errorMessagePosition,\n                );\n              }\n            })\n            .catch((error) => console.log(\"error: \", error));\n        }\n\n        optionImagesWidth() {\n          if (!this.variantButtons) return;\n\n          let maxItemWidth = 0;\n\n          requestAnimationFrame(() => {\n            this.variantOptionImages.forEach((item) => {\n              const itemWidth = item.clientWidth;\n              if (itemWidth > maxItemWidth) {\n                maxItemWidth = itemWidth;\n              }\n            });\n\n            this.variantButtons.forEach((item) => {\n              item.style?.setProperty(\n                \"--option-image-width\",\n                maxItemWidth + \"px\",\n              );\n            });\n          });\n        }\n\n        getBaseUnit(variant) {\n          return variant.unit_price_measurement.reference_value === 1\n            ? variant.unit_price_measurement.reference_unit\n            : variant.unit_price_measurement.reference_value +\n                variant.unit_price_measurement.reference_unit;\n        }\n\n        subsToggleListeners() {\n          const toggles = this.container.querySelectorAll(\n            selectors$9.subsToggle,\n          );\n\n          toggles.forEach((toggle) => {\n            toggle.addEventListener(\n              \"change\",\n              function (e) {\n                const val = e.target.value.toString();\n                const selected = this.container.querySelector(\n                  `[${selectors$9.subsChild}=\"${val}\"]`,\n                );\n                const groups = this.container.querySelectorAll(\n                  `[${selectors$9.subsChild}]`,\n                );\n                if (selected) {\n                  selected.classList.remove(classes$8.hidden);\n                  const first = selected.querySelector(`[name=\"selling_plan\"]`);\n                  first.checked = true;\n                  first.dispatchEvent(new Event(\"change\"));\n                }\n                groups.forEach((group) => {\n                  if (group !== selected) {\n                    group.classList.add(classes$8.hidden);\n                    const plans = group.querySelectorAll(\n                      `[name=\"selling_plan\"]`,\n                    );\n                    plans.forEach((plan) => {\n                      plan.checked = false;\n                      plan.dispatchEvent(new Event(\"change\"));\n                    });\n                  }\n                });\n              }.bind(this),\n            );\n          });\n        }\n\n        updateSaleText(formState) {\n          if (!this.priceOffWrap) return;\n\n          if (this.productState.planSale) {\n            this.updateSaleTextSubscription(formState);\n          } else if (this.productState.onSale) {\n            this.updateSaleTextStandard(formState);\n          } else {\n            this.priceOffWrap.classList.add(classes$8.hidden);\n          }\n        }\n\n        isVariantMetafield(variant, metafieldType) {\n          const searchScope =\n            this.closest(selectors$9.productUpsell) || this.container;\n          const metafieldsElement = searchScope.querySelector(\n            selectors$9.variantMetafields,\n          );\n          const metafieldsData = metafieldsElement\n            ? metafieldsElement.textContent\n            : null;\n\n          if (!metafieldsData) return false;\n\n          const variantsMetafields = JSON.parse(metafieldsData);\n          let variantHasMetafield = false;\n\n          variantsMetafields.forEach((variantMetafield) => {\n            if (Number(variantMetafield.variant_id) === variant.id) {\n              variantHasMetafield = variantMetafield[metafieldType] === \"true\";\n            }\n          });\n\n          return variantHasMetafield;\n        }\n\n        isVariantFinalSale(variant) {\n          return this.isVariantMetafield(variant, \"final_sale\");\n        }\n\n        isVariantPreorder(variant) {\n          return this.isVariantMetafield(variant, \"preorder\");\n        }\n\n        updateSaleTextStandard(formState) {\n          const variant = formState.variant;\n          const finalSaleBadge = this.priceOffWrap?.querySelector(\n            selectors$9.finalSaleBadge,\n          );\n          const priceOffBadge = this.priceOffWrap?.querySelector(\n            selectors$9.priceOffBadge,\n          );\n          const comparePrice = variant?.compare_at_price;\n          const salePrice = variant?.price;\n\n          // Set sale type text if element exists\n          if (this.priceOffType) {\n            this.priceOffType.innerHTML = window.theme.strings.sale || \"sale\";\n          }\n\n          // If priceOffBadge or priceOffAmount are missing, hide priceOffBadge and exit early\n          if (\n            !priceOffBadge ||\n            !this.priceOffAmount ||\n            !comparePrice ||\n            comparePrice <= salePrice\n          ) {\n            priceOffBadge?.classList.add(classes$8.hidden);\n          } else {\n            // Calculate and display discount\n            const { saleType } = priceOffBadge.dataset;\n            let discountText;\n\n            if (saleType == \"money\") {\n              discountText = window.theme.formatMoney(\n                Math.round(comparePrice - salePrice),\n                theme.moneyFormat,\n              );\n            }\n\n            if (saleType == \"percentage\") {\n              discountText = `${Math.round(((comparePrice - salePrice) / comparePrice) * 100)}%`;\n            }\n\n            if (discountText) {\n              this.priceOffAmount.innerHTML = discountText;\n              priceOffBadge.classList.remove(classes$8.hidden);\n            }\n          }\n\n          // Display or hide the final sale badge\n          const isFinalSale =\n            this.priceOffWrap?.hasAttribute(attributes$7.finalSale) ||\n            this.isVariantFinalSale(variant);\n          if (finalSaleBadge) {\n            finalSaleBadge.classList.toggle(classes$8.hidden, !isFinalSale);\n          }\n\n          this.priceOffWrap.classList.remove(classes$8.hidden);\n        }\n\n        updateSubscriptionText(formState) {\n          if (formState.plan && this.planDescription) {\n            this.planDescription.innerHTML = formState.plan.detail.description;\n            this.planDescription.classList.remove(classes$8.hidden);\n          } else if (this.planDescription) {\n            this.planDescription.classList.add(classes$8.hidden);\n          }\n        }\n\n        updateSaleTextSubscription(formState) {\n          if (this.priceOffType) {\n            this.priceOffType.innerHTML =\n              window.theme.strings.subscription || \"subscripton\";\n          }\n          if (this.priceOffAmount && this.priceOffWrap) {\n            const adjustment = formState.plan.detail.price_adjustments[0];\n            const discount = adjustment.value;\n            if (adjustment && adjustment.value_type === \"percentage\") {\n              this.priceOffAmount.innerHTML = `${discount}%`;\n            } else {\n              this.priceOffAmount.innerHTML = window.theme.formatMoney(\n                discount,\n                theme.moneyFormat,\n              );\n            }\n            this.priceOffWrap.classList.remove(classes$8.hidden);\n          }\n        }\n\n        updateProductPrices(formState) {\n          const variant = formState.variant;\n          const plan = formState.plan;\n          const priceWrappers = this.container.querySelectorAll(\n            selectors$9.priceWrapper,\n          );\n\n          priceWrappers.forEach((wrap) => {\n            const comparePriceEl = wrap.querySelector(selectors$9.comparePrice);\n            const productPriceEl = wrap.querySelector(selectors$9.productPrice);\n            const comparePriceText = wrap.querySelector(\n              selectors$9.comparePriceText,\n            );\n\n            let comparePrice = \"\";\n            let price = \"\";\n\n            if (this.productState.available) {\n              comparePrice = variant.compare_at_price;\n              price = variant.price;\n            }\n\n            if (this.productState.hasPlan) {\n              price = plan.allocation.price;\n            }\n\n            if (this.productState.planSale) {\n              comparePrice = plan.allocation.compare_at_price;\n              price = plan.allocation.price;\n            }\n\n            if (comparePriceEl) {\n              if (this.productState.onSale || this.productState.planSale) {\n                comparePriceEl.classList.remove(classes$8.hidden);\n                comparePriceText.classList.remove(classes$8.hidden);\n                productPriceEl.classList.add(classes$8.productPriceSale);\n              } else {\n                comparePriceEl.classList.add(classes$8.hidden);\n                comparePriceText.classList.add(classes$8.hidden);\n                productPriceEl.classList.remove(classes$8.productPriceSale);\n              }\n              comparePriceEl.innerHTML = window.theme.formatMoney(\n                comparePrice,\n                theme.moneyFormat,\n              );\n            }\n\n            productPriceEl.innerHTML =\n              price === 0\n                ? window.theme.strings.free\n                : window.theme.formatMoney(price, theme.moneyFormat);\n          });\n\n          if (this.hasUnitPricing) {\n            this.updateProductUnits(formState);\n          }\n        }\n\n        updateProductUnits(formState) {\n          const variant = formState.variant;\n          const plan = formState.plan;\n          let unitPrice = null;\n\n          if (variant && variant.unit_price) {\n            unitPrice = variant.unit_price;\n          }\n          if (plan && plan.allocation && plan.allocation.unit_price) {\n            unitPrice = plan.allocation.unit_price;\n          }\n\n          if (unitPrice) {\n            const base = this.getBaseUnit(variant);\n            const formattedPrice = window.theme.formatMoney(\n              unitPrice,\n              theme.moneyFormat,\n            );\n            this.container.querySelector(selectors$9.unitPrice).innerHTML =\n              formattedPrice;\n            this.container.querySelector(selectors$9.unitBase).innerHTML = base;\n            this.container\n              .querySelector(selectors$9.unitWrapper)\n              .classList.remove(classes$8.hidden);\n          } else {\n            this.container\n              .querySelector(selectors$9.unitWrapper)\n              .classList.add(classes$8.hidden);\n          }\n        }\n\n        updateSku(formState) {\n          if (!this.skuWrapper) return;\n\n          this.skuWrapper.innerHTML = `${theme.strings.sku}: ${formState.variant.sku}`;\n        }\n\n        fireHookEvent(formState) {\n          const variant = formState.variant;\n          this.container.dispatchEvent(\n            new CustomEvent(\"theme:variant:change\", {\n              detail: {\n                variant: variant,\n              },\n              bubbles: true,\n            }),\n          );\n        }\n\n        /**\n         * Tracks aspects of the product state that are relevant to UI updates\n         * @param {object} evt - variant change event\n         * @return {object} productState - represents state of variant + plans\n         *  productState.available - current variant and selling plan options result in valid offer\n         *  productState.soldOut - variant is sold out\n         *  productState.onSale - variant is on sale\n         *  productState.showUnitPrice - variant has unit price\n         *  productState.requiresPlan - all the product variants requires a selling plan\n         *  productState.hasPlan - there is a valid selling plan\n         *  productState.planSale - plan has a discount to show next to price\n         *  productState.planPerDelivery - plan price does not equal per_delivery_price - a prepaid subscription\n         */\n        setProductState(dataset) {\n          const variant = dataset.variant;\n          const plan = dataset.plan;\n\n          const productState = {\n            available: true,\n            soldOut: false,\n            onSale: false,\n            showUnitPrice: false,\n            requiresPlan: false,\n            hasPlan: false,\n            planPerDelivery: false,\n            planSale: false,\n          };\n\n          if (!variant || (variant.requires_selling_plan && !plan)) {\n            productState.available = false;\n          } else {\n            if (!variant.available) {\n              productState.soldOut = true;\n            }\n\n            if (variant.compare_at_price > variant.price) {\n              productState.onSale = true;\n            }\n\n            if (variant.unit_price) {\n              productState.showUnitPrice = true;\n            }\n\n            if (this.product && this.product.requires_selling_plan) {\n              productState.requiresPlan = true;\n            }\n\n            if (plan && this.subPrices) {\n              productState.hasPlan = true;\n              if (\n                plan.allocation.per_delivery_price !== plan.allocation.price\n              ) {\n                productState.planPerDelivery = true;\n              }\n              if (variant.price > plan.allocation.price) {\n                productState.planSale = true;\n              }\n            }\n          }\n          return productState;\n        }\n\n        updateProductImage(evt) {\n          const variant = evt.dataset?.variant || evt.variant;\n\n          if (variant) {\n            // Update variant image, if one is set\n            if (variant.featured_media) {\n              const selectedImage = this.container.querySelector(\n                `[${attributes$7.imageId}=\"${variant.featured_media.id}\"]`,\n              );\n              // If we have a mobile breakpoint or the tall layout is disabled,\n              // just switch the slideshow.\n\n              if (selectedImage) {\n                const selectedImageId = selectedImage.getAttribute(\n                  attributes$7.mediaId,\n                );\n                const isDesktopView = !window.theme.isMobile();\n                const isFlickityGallery =\n                  this.productImages?.getAttribute(\n                    \"data-gallery-technology\",\n                  ) === \"flickity\";\n\n                selectedImage.dispatchEvent(\n                  new CustomEvent(\"theme:media:select\", {\n                    bubbles: true,\n                    detail: {\n                      id: selectedImageId,\n                    },\n                  }),\n                );\n\n                if (\n                  isDesktopView &&\n                  !this.productImages.hasAttribute(attributes$7.faderDesktop) &&\n                  !isFlickityGallery &&\n                  this.variantImageScroll\n                ) {\n                  const selectedImageTop =\n                    selectedImage.getBoundingClientRect().top;\n\n                  // Scroll to variant image\n                  document.dispatchEvent(\n                    new CustomEvent(\"theme:tooltip:close\", {\n                      bubbles: false,\n                      detail: {\n                        hideTransition: false,\n                      },\n                    }),\n                  );\n\n                  window.theme.scrollTo(selectedImageTop);\n                }\n\n                if (\n                  !isDesktopView &&\n                  !this.productImages.hasAttribute(attributes$7.faderMobile) &&\n                  !isFlickityGallery\n                ) {\n                  this.productMediaList.scrollTo({\n                    left: selectedImage.offsetLeft,\n                  });\n                }\n              }\n            }\n          }\n        }\n\n        updateLegend(formState) {\n          const variant = formState.variant;\n          if (variant) {\n            const optionValues = this.container.querySelectorAll(\n              selectors$9.optionValue,\n            );\n            if (optionValues.length) {\n              optionValues.forEach((optionValue) => {\n                const selectorWrapper = optionValue.closest(\n                  selectors$9.optionPosition,\n                );\n                if (selectorWrapper) {\n                  const optionPosition = selectorWrapper.getAttribute(\n                    attributes$7.optionPosition,\n                  );\n                  const optionIndex = parseInt(optionPosition, 10) - 1;\n                  const selectedOptionValue = variant.options[optionIndex];\n                  optionValue.innerHTML = selectedOptionValue;\n                }\n              });\n            }\n          }\n        }\n\n        /**\n         * Updates the color description based on the selected variant\n         *\n         * @param {Object} formState - The current form state\n         * @return {Void}\n         */\n        updateColorDescription(formState) {\n          const variant = formState.variant;\n\n          if (\n            !variant ||\n            !this.colorDescription ||\n            !this.colorDescriptionData.length\n          )\n            return;\n\n          const variantId = variant.id.toString();\n          let description = \"\";\n\n          for (const item of this.colorDescriptionData) {\n            const itemVariantId = item.variant_id.toString();\n            if (itemVariantId === variantId && item.metafield_value) {\n              description = item.metafield_value;\n              break;\n            }\n          }\n\n          this.colorDescription.textContent = description;\n\n          if (description) {\n            this.colorDescription.classList.remove(classes$8.hidden);\n          } else {\n            this.colorDescription.classList.add(classes$8.hidden);\n          }\n        }\n      },\n    );\n  }\n\n  function fetchProduct(handle) {\n    const requestRoute = `${window.theme.routes.root}products/${handle}.js`;\n\n    return window\n      .fetch(requestRoute)\n      .then((response) => {\n        return response.json();\n      })\n      .catch((e) => {\n        console.error(e);\n      });\n  }\n\n  const selectors$8 = {\n    gridSwatchFieldset: \"[data-grid-swatch-fieldset]\",\n    input: \"[data-swatch-input]\",\n    productItem: \"[data-grid-item]\",\n    productInfo: \"[data-product-information]\",\n    sectionId: \"[data-section-id]\",\n    productImage: \"[data-product-image]\",\n    swatchButton: \"[data-swatch-button]\",\n    swatchLink: \"[data-swatch-link]\",\n    swatchText: \"[data-swatch-text]\",\n    template: \"[data-swatch-template]\",\n    nativeScrollbar: \"native-scrollbar\",\n  };\n\n  const classes$7 = {\n    visible: \"is-visible\",\n    hidden: \"hidden\",\n    stopEvents: \"no-events\",\n    swatch: \"swatch\",\n  };\n\n  const attributes$6 = {\n    image: \"data-swatch-image\",\n    handle: \"data-swatch-handle\",\n    label: \"data-swatch-label\",\n    scrollbar: \"data-scrollbar\",\n    swatchCount: \"data-swatch-count\",\n    variant: \"data-swatch-variant\",\n    variantName: \"data-swatch-variant-name\",\n    variantTitle: \"data-variant-title\",\n    swatchValues: \"data-swatch-values\",\n    mobileColumnsSmall: \"data-mobile-columns-small\",\n  };\n\n  class GridSwatch extends HTMLElement {\n    constructor() {\n      super();\n\n      this.productItemMouseLeaveEvent = () => this.hideVariantImages();\n      this.showVariantImageEvent = (swatchButton) =>\n        this.showVariantImage(swatchButton);\n      this.resizeEvent = () => this.init();\n    }\n\n    connectedCallback() {\n      this.handle = this.getAttribute(attributes$6.handle);\n      this.nativeScrollbar = this.closest(selectors$8.nativeScrollbar);\n      this.productItem = this.closest(selectors$8.productItem);\n      this.productInfo = this.closest(selectors$8.productInfo);\n      this.productImage = this.productItem.querySelector(\n        selectors$8.productImage,\n      );\n      this.template = document.querySelector(selectors$8.template).innerHTML;\n      this.swatchesJSON = this.getSwatchesJSON();\n      this.swatchesStyle = theme.settings.collectionSwatchStyle;\n      document.addEventListener(\"theme:resize:width\", this.resizeEvent);\n\n      const label = this.getAttribute(attributes$6.label).trim().toLowerCase();\n\n      fetchProduct(this.handle).then((product) => {\n        this.product = product;\n        this.colorOption = product.options.find(function (element) {\n          return element.name.toLowerCase() === label || null;\n        });\n\n        if (this.colorOption) {\n          this.init();\n        }\n      });\n    }\n\n    init() {\n      this.innerHTML = \"\";\n      this.count = 0;\n      this.limitedCount = 0;\n      this.swatches = this.colorOption.values;\n      this.swatchesCount = 0;\n      this.mobileSwatches = false;\n      const maxSwatches = 2;\n\n      if (\n        this.getAttribute(attributes$6.mobileColumnsSmall) == \"true\" &&\n        window.theme.isMobile() &&\n        (this.swatchesStyle == \"slider\" ||\n          this.swatchesStyle == \"grid\" ||\n          this.swatchesStyle == \"limited\")\n      ) {\n        this.mobileSwatches = true;\n      }\n\n      this.swatches.forEach((swatch) => {\n        let variant = null;\n        let variantAvailable = false;\n        let image = \"\";\n\n        for (const productVariant of this.product.variants) {\n          const optionWithSwatch = productVariant.options.includes(swatch);\n\n          if (!variant && optionWithSwatch) {\n            variant = productVariant;\n          }\n\n          // Use a variant with image if exists\n          if (optionWithSwatch && productVariant.featured_media) {\n            image = productVariant.featured_media.preview_image.src;\n            variant = productVariant;\n            break;\n          }\n        }\n\n        for (const productVariant of this.product.variants) {\n          const optionWithSwatch = productVariant.options.includes(swatch);\n\n          if (optionWithSwatch && productVariant.available) {\n            variantAvailable = true;\n            break;\n          }\n        }\n\n        if (variant) {\n          const swatchTemplate = document.createElement(\"div\");\n          swatchTemplate.innerHTML = this.template;\n          const swatchButton = swatchTemplate.querySelector(\n            selectors$8.swatchButton,\n          );\n          const swatchLink = swatchTemplate.querySelector(\n            selectors$8.swatchLink,\n          );\n          const swatchText = swatchTemplate.querySelector(\n            selectors$8.swatchText,\n          );\n          const swatchHandle = this.swatchesJSON[swatch];\n          const swatchStyle =\n            theme.settings.swatchesType == \"native\"\n              ? swatchHandle\n              : `var(--${swatchHandle})`;\n          const variantTitle = variant.title.replaceAll('\"', \"'\");\n\n          swatchButton.style = `--animation-delay: ${(100 * this.count) / 1250}s`;\n          swatchButton.classList.add(`${classes$7.swatch}-${swatchHandle}`);\n          swatchButton.dataset.tooltip = swatch;\n          swatchButton.dataset.swatchVariant = variant.id;\n          swatchButton.dataset.swatchVariantName = variantTitle;\n          swatchButton.dataset.swatchImage = image;\n          swatchButton.dataset.variant = variant.id;\n          swatchButton.style.setProperty(\"--swatch\", swatchStyle);\n          swatchLink.href = getUrlWithVariant(this.product.url, variant.id);\n          swatchLink.dataset.swatch = swatch;\n          swatchLink.disabled = !variantAvailable;\n          swatchText.innerText = swatch;\n\n          if (!this.mobileSwatches) {\n            if (this.swatchesStyle != \"limited\") {\n              this.innerHTML += swatchTemplate.innerHTML;\n            } else if (this.count <= 4) {\n              this.innerHTML += swatchTemplate.innerHTML;\n              this.limitedCount++;\n            }\n          } else if (this.count <= maxSwatches && this.mobileSwatches) {\n            this.innerHTML += swatchTemplate.innerHTML;\n            this.limitedCount++;\n          }\n          this.count++;\n        }\n        this.swatchesCount++;\n\n        if (this.swatchesCount == this.swatches.length) {\n          this.nativeScrollbar?.dispatchEvent(\n            new Event(\"theme:swatches:loaded\"),\n          );\n        }\n      });\n\n      this.swatchCount = this.productInfo.querySelector(\n        `[${attributes$6.swatchCount}]`,\n      );\n      this.swatchElements = this.querySelectorAll(selectors$8.swatchLink);\n      this.swatchFieldset = this.productInfo.querySelector(\n        selectors$8.gridSwatchFieldset,\n      );\n      this.hideSwatchesTimer = 0;\n\n      if (this.swatchCount.hasAttribute(attributes$6.swatchCount)) {\n        if (\n          this.swatchesStyle == \"text\" ||\n          this.swatchesStyle == \"text-slider\"\n        ) {\n          this.swatchCount.innerText = `${this.count} ${this.count > 1 ? theme.strings.otherColor : theme.strings.oneColor}`;\n\n          if (this.swatchesStyle == \"text\") return;\n\n          this.swatchCount.addEventListener(\"mouseenter\", () => {\n            if (this.hideSwatchesTimer) clearTimeout(this.hideSwatchesTimer);\n\n            this.productInfo.classList.add(classes$7.stopEvents);\n            this.swatchFieldset.classList.add(classes$7.visible);\n          });\n\n          // Prevent color swatches blinking on mouse move\n          this.productInfo.addEventListener(\"mouseleave\", () => {\n            this.hideSwatchesTimer = setTimeout(() => {\n              this.productInfo.classList.remove(classes$7.stopEvents);\n              this.swatchFieldset.classList.remove(classes$7.visible);\n            }, 100);\n          });\n        }\n\n        if (this.swatchesStyle == \"slider\" || this.swatchesStyle == \"grid\") {\n          this.swatchFieldset.classList.add(classes$7.visible);\n        }\n\n        if (\n          this.swatchesStyle == \"limited\" ||\n          (this.count >= maxSwatches && this.mobileSwatches)\n        ) {\n          const swatchesLeft = this.count - this.limitedCount;\n\n          this.swatchFieldset.classList.add(classes$7.visible);\n\n          if (swatchesLeft > 0) {\n            this.innerHTML += `<div class=\"swatch-limited\">+${swatchesLeft}</div>`;\n          }\n        }\n      }\n\n      this.bindSwatchButtonEvents();\n    }\n\n    bindSwatchButtonEvents() {\n      this.querySelectorAll(selectors$8.swatchButton)?.forEach(\n        (swatchButton) => {\n          // Show variant image when hover on color swatch\n          swatchButton.addEventListener(\n            \"mouseenter\",\n            this.showVariantImageEvent,\n          );\n        },\n      );\n\n      this.productItem.addEventListener(\n        \"mouseleave\",\n        this.productItemMouseLeaveEvent,\n      );\n    }\n\n    showVariantImage(event) {\n      const swatchButton = event.target;\n      const variantName = swatchButton\n        .getAttribute(attributes$6.variantName)\n        ?.replaceAll('\"', \"'\");\n      const variantImages = this.productImage.querySelectorAll(\n        `[${attributes$6.variantTitle}]`,\n      );\n      const variantImageSelected = this.productImage.querySelector(\n        `[${attributes$6.variantTitle}=\"${variantName}\"]`,\n      );\n\n      // Hide all variant images\n      variantImages?.forEach((image) => {\n        image.classList.remove(classes$7.visible);\n      });\n\n      // Show selected variant image\n      variantImageSelected?.classList.add(classes$7.visible);\n    }\n\n    hideVariantImages() {\n      // Hide all variant images\n      this.productImage\n        .querySelectorAll(`[${attributes$6.variantTitle}].${classes$7.visible}`)\n        ?.forEach((image) => {\n          image.classList.remove(classes$7.visible);\n        });\n    }\n\n    getSwatchesJSON() {\n      if (!this.hasAttribute(attributes$6.swatchValues)) return {};\n\n      // Splitting the string by commas to get individual key-value pairs\n      const pairs = this.getAttribute(attributes$6.swatchValues).split(\",\");\n\n      // Creating an empty object to store the key-value pairs\n      const jsonObject = {};\n\n      // Iterating through the pairs and constructing the JSON object\n      pairs?.forEach((pair) => {\n        const [key, value] = pair.split(\":\");\n        jsonObject[key.trim()] = value.trim();\n      });\n\n      return jsonObject;\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:resize:width\", this.resizeEvent);\n    }\n  }\n\n  const selectors$7 = {\n    flickityButton: \".flickity-prev-next-button\",\n    productLink: \"[data-product-link]\",\n    slide: \"[data-hover-slide]\",\n    slideTouch: \"[data-hover-slide-touch]\",\n    slider: \"[data-hover-slider]\",\n    recentlyViewed: \"recently-viewed\",\n    video: \"video\",\n    vimeo: '[data-host=\"vimeo\"]',\n    youtube: '[data-host=\"youtube\"]',\n  };\n\n  class HoverImages extends HTMLElement {\n    constructor() {\n      super();\n\n      this.flkty = null;\n      this.slider = this.querySelector(selectors$7.slider);\n      this.handleScroll = this.handleScroll.bind(this);\n      this.recentlyViewed = this.closest(selectors$7.recentlyViewed);\n      this.hovered = false;\n\n      this.mouseEnterEvent = () => this.mouseEnterActions();\n      this.mouseLeaveEvent = () => this.mouseLeaveActions();\n\n      this.addEventListener(\"mouseenter\", this.mouseEnterEvent);\n      this.addEventListener(\"mouseleave\", this.mouseLeaveEvent);\n    }\n\n    connectedCallback() {\n      this.addArrowClickHandler();\n\n      if (this.recentlyViewed) {\n        this.recentlyViewed.addEventListener(\n          \"theme:recently-viewed:loaded\",\n          () => {\n            this.initBasedOnDevice();\n          },\n        );\n      } else {\n        this.initBasedOnDevice();\n      }\n    }\n\n    disconnectedCallback() {\n      if (this.flkty) {\n        this.flkty.options.watchCSS = false;\n        this.flkty.destroy();\n        this.flkty = null;\n      }\n\n      this.removeEventListener(\"mouseenter\", this.mouseEnterEvent);\n      this.removeEventListener(\"mouseleave\", this.mouseLeaveEvent);\n    }\n\n    initBasedOnDevice() {\n      if (window.theme.touch) {\n        this.initTouch();\n      } else {\n        this.initFlickity();\n      }\n    }\n\n    addArrowClickHandler() {\n      const productLink = this.closest(selectors$7.productLink);\n      if (productLink) {\n        productLink.addEventListener(\"click\", (e) => {\n          if (e.target.matches(selectors$7.flickityButton)) {\n            e.preventDefault();\n          }\n        });\n      }\n    }\n\n    initTouch() {\n      this.style.setProperty(\n        \"--slides-count\",\n        this.querySelectorAll(selectors$7.slideTouch).length,\n      );\n      this.slider.addEventListener(\"scroll\", this.handleScroll);\n    }\n\n    handleScroll() {\n      const slideIndex = this.slider.scrollLeft / this.slider.clientWidth;\n      this.style.setProperty(\"--slider-index\", slideIndex);\n    }\n\n    initFlickity() {\n      if (\n        this.flkty ||\n        !this.slider ||\n        this.slider.classList.contains(\"flickity-enabled\") ||\n        this.querySelectorAll(selectors$7.slide).length < 2\n      )\n        return;\n\n      this.flkty = new window.theme.Flickity(this.slider, {\n        cellSelector: selectors$7.slide,\n        contain: true,\n        wrapAround: true,\n        watchCSS: true,\n        autoPlay: false,\n        draggable: false,\n        pageDots: false,\n        prevNextButtons: true,\n      });\n\n      this.flkty.pausePlayer();\n\n      this.addEventListener(\"mouseenter\", () => {\n        this.flkty.unpausePlayer();\n      });\n\n      this.addEventListener(\"mouseleave\", () => {\n        this.flkty.pausePlayer();\n      });\n    }\n\n    mouseEnterActions() {\n      this.hovered = true;\n\n      this.videoActions();\n    }\n\n    mouseLeaveActions() {\n      this.hovered = false;\n\n      this.videoActions();\n    }\n\n    videoActions() {\n      const youtube = this.querySelector(selectors$7.youtube);\n      const vimeo = this.querySelector(selectors$7.vimeo);\n      const mediaExternal = youtube || vimeo;\n      const mediaNative = this.querySelector(selectors$7.video);\n\n      if (mediaExternal) {\n        let action = this.hovered ? \"playVideo\" : \"pauseVideo\";\n        let string = `{\"event\":\"command\",\"func\":\"${action}\",\"args\":\"\"}`;\n\n        if (vimeo) {\n          action = this.hovered ? \"play\" : \"pause\";\n          string = `{\"method\":\"${action}\"}`;\n        }\n\n        mediaExternal.contentWindow.postMessage(string, \"*\");\n\n        mediaExternal.addEventListener(\"load\", (e) => {\n          // Call videoActions() again when iframe is loaded to prevent autoplay being triggered if it loads after the \"mouseleave\" event\n          this.videoActions();\n        });\n      } else if (mediaNative) {\n        if (this.hovered) {\n          mediaNative.play();\n        } else {\n          mediaNative.pause();\n        }\n      }\n    }\n  }\n\n  const classes$6 = {\n    added: \"is-added\",\n    animated: \"is-animated\",\n    disabled: \"is-disabled\",\n    error: \"has-error\",\n    loading: \"is-loading\",\n    open: \"is-open\",\n    overlayText: \"product-item--overlay-text\",\n    visible: \"is-visible\",\n    siblingLinkCurrent: \"sibling__link--current\",\n  };\n\n  const selectors$6 = {\n    animation: \"[data-animation]\",\n    apiContent: \"[data-api-content]\",\n    buttonQuickAdd: \"[data-quick-add-btn]\",\n    buttonAddToCart: \"[data-add-to-cart]\",\n    cartDrawer: \"cart-drawer\",\n    cartPage: \"[data-cart-page]\",\n    cartLineItems: \"[data-line-items]\",\n    dialog: \"dialog\",\n    focusable:\n      'button, [href], select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n    messageError: \"[data-message-error]\",\n    modalButton: \"[data-quick-add-modal-handle]\",\n    modalContainer: \"[data-product-upsell-container]\",\n    modalContent: \"[data-product-upsell-ajax]\",\n    modalClose: \"[data-quick-add-modal-close]\",\n    productGridItem: \"data-grid-item\",\n    productInformationHolder: \"[data-product-information]\",\n    quickAddHolder: \"[data-quick-add-holder]\",\n    quickAddModal: \"[data-quick-add-modal]\",\n    quickAddModalTemplate: \"[data-quick-add-modal-template]\",\n    tooltip: \"[data-tooltip]\",\n  };\n\n  const attributes$5 = {\n    closing: \"closing\",\n    productId: \"data-product-id\",\n    modalHandle: \"data-quick-add-modal-handle\",\n    siblingSwapper: \"data-sibling-swapper\",\n    quickAddHolder: \"data-quick-add-holder\",\n  };\n\n  class QuickAddProduct extends HTMLElement {\n    constructor() {\n      super();\n\n      this.quickAddHolder = this.querySelector(selectors$6.quickAddHolder);\n\n      if (this.quickAddHolder) {\n        this.modal = null;\n        this.currentModal = null;\n        this.productId = this.quickAddHolder.getAttribute(\n          attributes$5.quickAddHolder,\n        );\n        this.modalButton = this.quickAddHolder.querySelector(\n          selectors$6.modalButton,\n        );\n        this.handle = this.modalButton?.getAttribute(attributes$5.modalHandle);\n        this.buttonQuickAdd = this.quickAddHolder.querySelector(\n          selectors$6.buttonQuickAdd,\n        );\n        this.buttonATC = this.quickAddHolder.querySelector(\n          selectors$6.buttonAddToCart,\n        );\n        this.button = this.modalButton || this.buttonATC;\n        this.modalClose = this.modalClose.bind(this);\n        this.modalCloseOnProductAdded =\n          this.modalCloseOnProductAdded.bind(this);\n        this.a11y = window.theme.a11y;\n        this.isAnimating = false;\n\n        this.modalButtonClickEvent = this.modalButtonClickEvent.bind(this);\n        this.quickAddLoadingToggle = this.quickAddLoadingToggle.bind(this);\n      }\n    }\n\n    connectedCallback() {\n      /**\n       * Modal button works for multiple variants products\n       */\n      if (this.modalButton) {\n        this.modalButton.addEventListener(\"click\", this.modalButtonClickEvent);\n      }\n\n      /**\n       * Quick add button works for single variant products\n       */\n      if (this.buttonATC) {\n        this.buttonATC.addEventListener(\"click\", (e) => {\n          e.preventDefault();\n\n          window.a11y.lastElement = this.buttonATC;\n\n          document.dispatchEvent(\n            new CustomEvent(\"theme:cart:add\", {\n              detail: {\n                button: this.buttonATC,\n              },\n            }),\n          );\n        });\n      }\n\n      if (this.quickAddHolder) {\n        this.quickAddHolder.addEventListener(\n          \"animationend\",\n          this.quickAddLoadingToggle,\n        );\n        this.errorHandler();\n      }\n    }\n\n    modalButtonClickEvent(e) {\n      e.preventDefault();\n\n      const isSiblingSwapper = this.modalButton.hasAttribute(\n        attributes$5.siblingSwapper,\n      );\n      const isSiblingLinkCurrent = this.modalButton.classList.contains(\n        classes$6.siblingLinkCurrent,\n      );\n\n      if (isSiblingLinkCurrent) return;\n\n      this.modalButton.classList.add(classes$6.loading);\n      this.modalButton.disabled = true;\n\n      // Siblings product modal swapper\n      if (isSiblingSwapper && !isSiblingLinkCurrent) {\n        this.currentModal = e.target.closest(selectors$6.quickAddModal);\n        this.currentModal.classList.add(classes$6.loading);\n      }\n\n      this.renderModal();\n    }\n\n    modalCreate(response) {\n      const cachedModal = document.querySelector(\n        `${selectors$6.quickAddModal}[${attributes$5.productId}=\"${this.productId}\"]`,\n      );\n\n      if (cachedModal) {\n        this.modal = cachedModal;\n        this.modalOpen();\n      } else {\n        const modalTemplate = this.quickAddHolder.querySelector(\n          selectors$6.quickAddModalTemplate,\n        );\n        if (!modalTemplate) return;\n\n        const htmlObject = document.createElement(\"div\");\n        htmlObject.innerHTML = modalTemplate.innerHTML;\n\n        // Add dialog to the body\n        document.body.appendChild(\n          htmlObject.querySelector(selectors$6.quickAddModal),\n        );\n        modalTemplate.remove();\n\n        this.modal = document.querySelector(\n          `${selectors$6.quickAddModal}[${attributes$5.productId}=\"${this.productId}\"]`,\n        );\n        this.modal.querySelector(selectors$6.modalContent).innerHTML =\n          new DOMParser()\n            .parseFromString(response, \"text/html\")\n            .querySelector(selectors$6.apiContent).innerHTML;\n\n        this.modalCreatedCallback();\n      }\n    }\n\n    modalOpen() {\n      if (this.currentModal) {\n        this.currentModal.dispatchEvent(\n          new CustomEvent(\"theme:modal:close\", { bubbles: false }),\n        );\n      }\n\n      // Check if browser supports Dialog tags\n      if (typeof this.modal.show === \"function\") {\n        this.modal.show();\n      }\n\n      this.modal.setAttribute(\"open\", true);\n      this.modal.removeAttribute(\"inert\");\n\n      this.quickAddHolder.classList.add(classes$6.disabled);\n\n      if (this.modalButton) {\n        this.modalButton.classList.remove(classes$6.loading);\n        this.modalButton.disabled = false;\n        window.a11y.lastElement = this.modalButton;\n      }\n\n      // Animate items\n      requestAnimationFrame(() => {\n        this.modal.querySelectorAll(selectors$6.animation).forEach((item) => {\n          item.classList.add(classes$6.animated);\n        });\n      });\n\n      document.dispatchEvent(\n        new CustomEvent(\"theme:quick-add:open\", { bubbles: true }),\n      );\n      document.dispatchEvent(\n        new CustomEvent(\"theme:scroll:lock\", { bubbles: true }),\n      );\n      document.addEventListener(\n        \"theme:product:added\",\n        this.modalCloseOnProductAdded,\n        { once: true },\n      );\n    }\n\n    modalClose() {\n      if (this.isAnimating) {\n        return;\n      }\n\n      if (!this.modal.hasAttribute(attributes$5.closing)) {\n        this.modal.setAttribute(attributes$5.closing, \"\");\n        this.isAnimating = true;\n        return;\n      }\n\n      // Check if browser supports Dialog tags\n      if (typeof this.modal.close === \"function\") {\n        this.modal.close();\n      } else {\n        this.modal.removeAttribute(\"open\");\n      }\n\n      this.modal.removeAttribute(attributes$5.closing);\n      this.modal.setAttribute(\"inert\", \"\");\n      this.modal.classList.remove(classes$6.loading);\n\n      if (this.modalButton) {\n        this.modalButton.disabled = false;\n      }\n\n      if (\n        this.quickAddHolder &&\n        this.quickAddHolder.classList.contains(classes$6.disabled)\n      ) {\n        this.quickAddHolder.classList.remove(classes$6.disabled);\n      }\n\n      this.resetAnimatedItems();\n\n      // Unlock scroll if no other drawers & modals are open\n      if (!window.theme.hasOpenModals()) {\n        document.dispatchEvent(\n          new CustomEvent(\"theme:scroll:unlock\", { bubbles: true }),\n        );\n      }\n\n      document.removeEventListener(\n        \"theme:product:added\",\n        this.modalCloseOnProductAdded,\n      );\n\n      this.a11y.removeTrapFocus();\n      this.a11y.autoFocusLastElement();\n    }\n\n    modalEvents() {\n      // Close button click event\n      this.modal\n        .querySelector(selectors$6.modalClose)\n        ?.addEventListener(\"click\", (e) => {\n          e.preventDefault();\n          this.modalClose();\n        });\n\n      // Close dialog on click outside content\n      this.modal.addEventListener(\"click\", (event) => {\n        if (event.target.nodeName === \"DIALOG\" && event.type === \"click\") {\n          this.modalClose();\n        }\n      });\n\n      // Close dialog on click ESC key pressed\n      this.modal.addEventListener(\"keydown\", (event) => {\n        if (event.code == \"Escape\") {\n          event.preventDefault();\n          this.modalClose();\n        }\n      });\n\n      this.modal.addEventListener(\"theme:modal:close\", () => {\n        this.modalClose();\n      });\n\n      // Close dialog after animation completes\n      this.modal.addEventListener(\"animationend\", (event) => {\n        if (event.target !== this.modal) return;\n        this.isAnimating = false;\n\n        if (this.modal.hasAttribute(attributes$5.closing)) {\n          this.modalClose();\n        } else {\n          setTimeout(() => {\n            this.a11y.trapFocus(this.modal);\n            const focusTarget =\n              this.modal.querySelector(\"[autofocus]\") ||\n              this.modal.querySelector(selectors$6.focusable);\n            focusTarget?.focus();\n          }, 50);\n        }\n      });\n    }\n\n    modalCloseOnProductAdded() {\n      this.resetQuickAddButtons();\n      if (this.modal && this.modal.hasAttribute(\"open\")) {\n        this.modalClose();\n      }\n    }\n\n    quickAddLoadingToggle(e) {\n      if (e.target != this.quickAddHolder) return;\n\n      this.quickAddHolder.classList.remove(classes$6.disabled);\n    }\n\n    /**\n     * Handle error cart response\n     */\n    errorHandler() {\n      this.quickAddHolder.addEventListener(\"theme:cart:error\", (event) => {\n        const holder = event.detail.holder;\n        const parentProduct = holder.closest(\n          `[${selectors$6.productGridItem}]`,\n        );\n        if (!parentProduct) return;\n\n        const errorMessageHolder = holder.querySelector(\n          selectors$6.messageError,\n        );\n        const hasOverlayText = parentProduct.classList.contains(\n          classes$6.overlayText,\n        );\n        const productInfo = parentProduct.querySelector(\n          selectors$6.productInformationHolder,\n        );\n        const button = holder.querySelector(selectors$6.buttonAddToCart);\n\n        if (button) {\n          button.classList.remove(classes$6.added, classes$6.loading);\n          holder.classList.add(classes$6.error);\n\n          const removeErrorClass = () => {\n            this.resetQuickAddButtons();\n\n            if (hasOverlayText) {\n              productInfo.classList.remove(classes$6.hidden);\n            }\n\n            holder.removeEventListener(\"animationend\", removeErrorClass);\n          };\n\n          holder.addEventListener(\"animationend\", removeErrorClass);\n        }\n\n        if (errorMessageHolder) {\n          errorMessageHolder.innerText = event.detail.description;\n        }\n\n        if (hasOverlayText) {\n          productInfo.classList.add(classes$6.hidden);\n        }\n      });\n    }\n\n    /**\n     * Reset buttons to default states\n     */\n    resetQuickAddButtons() {\n      if (this.quickAddHolder) {\n        this.quickAddHolder.classList.remove(\n          classes$6.visible,\n          classes$6.error,\n        );\n      }\n\n      if (this.buttonQuickAdd) {\n        this.buttonQuickAdd.classList.remove(classes$6.added);\n        this.buttonQuickAdd.disabled = false;\n      }\n    }\n\n    renderModal() {\n      if (this.modal) {\n        this.modalOpen();\n      } else {\n        window\n          .fetch(\n            `${window.theme.routes.root}products/${this.handle}?section_id=api-product-upsell`,\n          )\n          .then(this.upsellErrorsHandler)\n          .then((response) => {\n            return response.text();\n          })\n          .then((response) => {\n            this.modalCreate(response);\n          });\n      }\n    }\n\n    modalCreatedCallback() {\n      this.modalEvents();\n      this.modalOpen();\n\n      wrapElements(this.modal);\n    }\n\n    upsellErrorsHandler(response) {\n      if (!response.ok) {\n        return response.json().then(function (json) {\n          const e = new FetchError({\n            status: response.statusText,\n            headers: response.headers,\n            json: json,\n          });\n          throw e;\n        });\n      }\n      return response;\n    }\n\n    resetAnimatedItems() {\n      this.modal?.querySelectorAll(selectors$6.animation).forEach((item) => {\n        item.classList.remove(classes$6.animated);\n      });\n    }\n  }\n\n  if (!customElements.get(\"quick-add-product\")) {\n    customElements.define(\"quick-add-product\", QuickAddProduct);\n  }\n\n  if (!customElements.get(\"grid-swatch\")) {\n    customElements.define(\"grid-swatch\", GridSwatch);\n  }\n\n  if (!customElements.get(\"hover-images\")) {\n    customElements.define(\"hover-images\", HoverImages);\n  }\n\n  const selectors$5 = {\n    buttonArrow: \"[data-button-arrow]\",\n    deferredMediaButton: \"[data-deferred-media-button]\",\n    focusedElement:\n      \"model-viewer, video, iframe, button, [href], input, [tabindex]\",\n    productMedia: \"[data-image-id]\",\n    productMediaList: \"[data-product-media-list]\",\n    section: \"[data-section-type]\",\n  };\n\n  const classes$5 = {\n    arrows: \"slider__arrows\",\n    dragging: \"is-dragging\",\n    hidden: \"hidden\",\n    isFocused: \"is-focused\",\n    mediaActive: \"media--active\",\n    mediaHidden: \"media--hidden\",\n    mediaHiding: \"media--hiding\",\n  };\n\n  const attributes$4 = {\n    activeMedia: \"data-active-media\",\n    buttonPrev: \"data-button-prev\",\n    buttonNext: \"data-button-next\",\n    imageId: \"data-image-id\",\n    mediaId: \"data-media-id\",\n    type: \"data-type\",\n    faderDesktop: \"data-fader-desktop\",\n    faderMobile: \"data-fader-mobile\",\n    galleryTechnology: \"data-gallery-technology\",\n  };\n\n  if (!customElements.get(\"product-images\")) {\n    customElements.define(\n      \"product-images\",\n      class ProductImages extends HTMLElement {\n        constructor() {\n          super();\n\n          this.initialized = false;\n          this.buttons = false;\n          this.isDown = false;\n          this.startX = 0;\n          this.startY = 0;\n          this.scrollLeft = 0;\n          this.onButtonArrowClick = (e) => this.buttonArrowClickEvent(e);\n          this.container = this.closest(selectors$5.section);\n          this.handleMouseDown = this.handleMouseDown.bind(this);\n          this.handleMouseLeave = this.handleMouseLeave.bind(this);\n          this.handleMouseUp = this.handleMouseUp.bind(this);\n          this.handleMouseMove = this.handleMouseMove.bind(this);\n          this.handleKeyUp = this.handleKeyUp.bind(this);\n          this.productMediaItems = this.querySelectorAll(\n            selectors$5.productMedia,\n          );\n          this.productMediaList = this.querySelector(\n            selectors$5.productMediaList,\n          );\n          this.setHeight = this.setHeight.bind(this);\n          this.toggleEvents = this.toggleEvents.bind(this);\n          this.selectMediaEvent = (e) => this.showMediaOnVariantSelect(e);\n          this.galleryTechnology =\n            this.getAttribute(attributes$4.galleryTechnology) || \"legacy\";\n          this.desktopVerticalStacked = this.classList.contains(\n            \"product__images--desktop-vertical-hover\",\n          );\n          this.flickityMode = this.computeFlickityMode();\n          this.handleFlickityChange = this.handleFlickityChange.bind(this);\n        }\n\n        computeFlickityMode() {\n          if (this.galleryTechnology !== \"flickity\") return false;\n          if (this.desktopVerticalStacked && !window.theme.isMobile()) {\n            return false;\n          }\n          return true;\n        }\n\n        connectedCallback() {\n          if (Object.keys(this.productMediaItems).length < 2) return;\n\n          if (this.flickityMode) {\n            this.listen();\n            this.initFlickityMode();\n            this.setHeight();\n            return;\n          }\n\n          this.productMediaObserver();\n          this.toggleEvents();\n          this.listen();\n          this.setHeight();\n        }\n\n        disconnectedCallback() {\n          this.unlisten();\n          this.destroyFlickityMode();\n        }\n\n        listen() {\n          document.addEventListener(\"theme:resize:width\", this.toggleEvents);\n          document.addEventListener(\"theme:resize:width\", this.setHeight);\n          this.addEventListener(\"theme:media:select\", this.selectMediaEvent);\n        }\n\n        unlisten() {\n          document.removeEventListener(\"theme:resize:width\", this.toggleEvents);\n          document.removeEventListener(\"theme:resize:width\", this.setHeight);\n          this.removeEventListener(\"theme:media:select\", this.selectMediaEvent);\n        }\n\n        toggleEvents() {\n          if (this.desktopVerticalStacked) {\n            const targetFlickity = this.computeFlickityMode();\n            if (targetFlickity !== this.flickityMode) {\n              if (this.flickityMode) {\n                this.destroyFlickityMode();\n              }\n              this.unbindEventListeners();\n              this.flickityMode = targetFlickity;\n              if (this.flickityMode) {\n                this.initFlickityMode();\n              } else {\n                this.productMediaObserver();\n              }\n              this.setHeight();\n            }\n          }\n\n          if (this.flickityMode) return;\n\n          const isMobileView = window.theme.isMobile();\n\n          if (\n            (isMobileView && this.hasAttribute(attributes$4.faderMobile)) ||\n            (!isMobileView && this.hasAttribute(attributes$4.faderDesktop))\n          ) {\n            this.bindEventListeners();\n          } else {\n            this.unbindEventListeners();\n          }\n        }\n\n        initFlickityMode() {\n          if (!window.theme.Flickity || !this.productMediaList) return;\n\n          this.productMediaItems.forEach((media) => {\n            media.classList.remove(\n              classes$5.mediaHidden,\n              classes$5.mediaHiding,\n            );\n          });\n\n          this.querySelectorAll(\"img\").forEach((img) => {\n            img.setAttribute(\"loading\", \"eager\");\n            img.removeAttribute(\"fetchpriority\");\n          });\n\n          const activeMediaId = this.getAttribute(attributes$4.activeMedia);\n          const initialIndex = [...this.productMediaItems].findIndex(\n            (media) =>\n              media.getAttribute(attributes$4.mediaId) === activeMediaId,\n          );\n\n          this.flkty = new window.theme.Flickity(this.productMediaList, {\n            cellSelector: selectors$5.productMedia,\n            cellAlign: \"left\",\n            contain: true,\n            adaptiveHeight: false,\n            wrapAround: false,\n            pageDots: false,\n            prevNextButtons: true,\n            arrowShape: \"M 18,32 L 32,16 M 18,32 L 32,48 M 18,32 L 60,32\",\n            draggable: true,\n            dragThreshold: 20,\n            initialIndex: initialIndex >= 0 ? initialIndex : 0,\n          });\n\n          this.flkty.on(\"change\", this.handleFlickityChange);\n          this.handleFlickityChange(this.flkty.selectedIndex || 0);\n\n          window.requestAnimationFrame(() => {\n            this.flkty?.resize();\n          });\n\n          this.querySelectorAll(\"img\").forEach((img) => {\n            if (img.complete) return;\n            img.addEventListener(\"load\", () => this.flkty?.resize(), {\n              once: true,\n            });\n          });\n\n          this.bindFlickityWheelEvents();\n        }\n\n        bindFlickityWheelEvents() {\n          this.wheelDelta = 0;\n          this.wheelResetTimeout = null;\n          this.wheelCooldown = false;\n          this.handleWheelEvent = this.handleWheelEvent.bind(this);\n\n          this.productMediaList.addEventListener(\n            \"wheel\",\n            this.handleWheelEvent,\n            { passive: false },\n          );\n        }\n\n        handleWheelEvent(e) {\n          if (window.theme.isMobile() || !this.flkty) return;\n\n          const delta =\n            Math.abs(e.deltaX) > Math.abs(e.deltaY) ? e.deltaX : e.deltaY;\n          if (delta === 0) return;\n\n          e.preventDefault();\n\n          if (this.wheelCooldown) return;\n\n          this.wheelDelta += delta;\n\n          window.clearTimeout(this.wheelResetTimeout);\n          this.wheelResetTimeout = window.setTimeout(() => {\n            this.wheelDelta = 0;\n          }, 200);\n\n          const threshold = 15;\n          if (Math.abs(this.wheelDelta) >= threshold) {\n            if (this.wheelDelta > 0) {\n              this.flkty.next();\n            } else {\n              this.flkty.previous();\n            }\n\n            this.wheelDelta = 0;\n            this.wheelCooldown = true;\n            window.setTimeout(() => {\n              this.wheelCooldown = false;\n            }, 180);\n          }\n        }\n\n        destroyFlickityMode() {\n          if (!this.flkty) return;\n\n          if (this.handleWheelEvent && this.productMediaList) {\n            this.productMediaList.removeEventListener(\n              \"wheel\",\n              this.handleWheelEvent,\n            );\n          }\n          window.clearTimeout(this.wheelResetTimeout);\n\n          this.flkty.off(\"change\", this.handleFlickityChange);\n          this.flkty.destroy();\n          this.flkty = null;\n        }\n\n        handleFlickityChange(index) {\n          const selectedImage = this.productMediaItems[index];\n          if (!selectedImage) return;\n\n          const selectedMediaId = selectedImage.getAttribute(\n            attributes$4.mediaId,\n          );\n          this.setActiveMedia(selectedMediaId, { skipFlickitySelect: true });\n        }\n\n        bindEventListeners() {\n          if (this.initialized) return;\n\n          this.productMediaList.addEventListener(\n            \"mousedown\",\n            this.handleMouseDown,\n          );\n          this.productMediaList.addEventListener(\n            \"mouseleave\",\n            this.handleMouseLeave,\n          );\n          this.productMediaList.addEventListener(\"mouseup\", this.handleMouseUp);\n          this.productMediaList.addEventListener(\n            \"mousemove\",\n            this.handleMouseMove,\n          );\n          this.productMediaList.addEventListener(\n            \"touchstart\",\n            this.handleMouseDown,\n            { passive: true },\n          );\n          this.productMediaList.addEventListener(\n            \"touchend\",\n            this.handleMouseUp,\n            { passive: true },\n          );\n          this.productMediaList.addEventListener(\n            \"touchmove\",\n            this.handleMouseMove,\n            { passive: true },\n          );\n          this.productMediaList.addEventListener(\"keyup\", this.handleKeyUp);\n          this.initArrows();\n          this.resetScrollPosition();\n\n          this.initialized = true;\n        }\n\n        unbindEventListeners() {\n          if (!this.initialized) return;\n\n          this.productMediaList.removeEventListener(\n            \"mousedown\",\n            this.handleMouseDown,\n          );\n          this.productMediaList.removeEventListener(\n            \"mouseleave\",\n            this.handleMouseLeave,\n          );\n          this.productMediaList.removeEventListener(\n            \"mouseup\",\n            this.handleMouseUp,\n          );\n          this.productMediaList.removeEventListener(\n            \"mousemove\",\n            this.handleMouseMove,\n          );\n          this.productMediaList.removeEventListener(\n            \"touchstart\",\n            this.handleMouseDown,\n          );\n          this.productMediaList.removeEventListener(\n            \"touchend\",\n            this.handleMouseUp,\n          );\n          this.productMediaList.removeEventListener(\n            \"touchmove\",\n            this.handleMouseMove,\n          );\n          this.productMediaList.removeEventListener(\"keyup\", this.handleKeyUp);\n          this.removeArrows();\n\n          this.initialized = false;\n        }\n\n        handleMouseDown(e) {\n          this.isDown = true;\n          this.startX =\n            (e.pageX || e.changedTouches[0].screenX) - this.offsetLeft;\n          this.startY =\n            (e.pageY || e.changedTouches[0].screenY) - this.offsetTop;\n        }\n\n        handleMouseLeave() {\n          if (!this.isDown) return;\n          this.isDown = false;\n        }\n\n        handleMouseUp(e) {\n          const x = (e.pageX || e.changedTouches[0].screenX) - this.offsetLeft;\n          const y = (e.pageY || e.changedTouches[0].screenY) - this.offsetTop;\n          const distanceX = x - this.startX;\n          const distanceY = y - this.startY;\n          const direction = distanceX > 0 ? 1 : -1;\n          const isImage =\n            this.getCurrentMedia().hasAttribute(attributes$4.type) &&\n            this.getCurrentMedia().getAttribute(attributes$4.type) === \"image\";\n\n          if (\n            Math.abs(distanceX) > 10 &&\n            Math.abs(distanceX) > Math.abs(distanceY) &&\n            isImage\n          ) {\n            direction < 0 ? this.showNextImage() : this.showPreviousImage();\n          }\n\n          this.isDown = false;\n\n          requestAnimationFrame(() => {\n            this.classList.remove(classes$5.dragging);\n          });\n        }\n\n        handleMouseMove() {\n          if (!this.isDown) return;\n\n          this.classList.add(classes$5.dragging);\n        }\n\n        handleKeyUp(e) {\n          if (e.code === \"ArrowLeft\") {\n            this.showPreviousImage();\n          }\n\n          if (e.code === \"ArrowRight\") {\n            this.showNextImage();\n          }\n        }\n\n        handleArrowsClickEvent() {\n          this.querySelectorAll(selectors$5.buttonArrow)?.forEach((button) => {\n            button.addEventListener(\"click\", (e) => {\n              e.preventDefault();\n\n              if (e.target.hasAttribute(attributes$4.buttonPrev)) {\n                this.showPreviousImage();\n              }\n\n              if (e.target.hasAttribute(attributes$4.buttonNext)) {\n                this.showNextImage();\n              }\n            });\n          });\n        }\n\n        // When changing from Mobile do Desktop view\n        resetScrollPosition() {\n          if (this.productMediaList.scrollLeft !== 0) {\n            this.productMediaList.scrollLeft = 0;\n          }\n        }\n\n        initArrows() {\n          // Create arrow buttons if don't exist\n          if (!this.buttons.length) {\n            const buttonsWrap = document.createElement(\"div\");\n            buttonsWrap.classList.add(classes$5.arrows);\n            buttonsWrap.innerHTML =\n              theme.sliderArrows.prev + theme.sliderArrows.next;\n\n            // Append buttons outside the slider element\n            this.productMediaList.append(buttonsWrap);\n            this.buttons = this.querySelectorAll(selectors$5.buttonArrow);\n            this.buttonPrev = this.querySelector(\n              `[${attributes$4.buttonPrev}]`,\n            );\n            this.buttonNext = this.querySelector(\n              `[${attributes$4.buttonNext}]`,\n            );\n          }\n\n          this.handleArrowsClickEvent();\n          this.preloadImageOnArrowHover();\n        }\n\n        removeArrows() {\n          this.querySelector(`.${classes$5.arrows}`)?.remove();\n        }\n\n        preloadImageOnArrowHover() {\n          this.buttonPrev?.addEventListener(\"mouseover\", () => {\n            const id = this.getPreviousMediaId();\n            this.preloadImage(id);\n          });\n\n          this.buttonNext?.addEventListener(\"mouseover\", () => {\n            const id = this.getNextMediaId();\n            this.preloadImage(id);\n          });\n        }\n\n        preloadImage(id) {\n          this.querySelector(\n            `[${attributes$4.mediaId}=\"${id}\"] img`,\n          )?.setAttribute(\"loading\", \"eager\");\n        }\n\n        showMediaOnVariantSelect(e) {\n          const id = e.detail.id;\n          this.setActiveMedia(id);\n        }\n\n        getCurrentMedia() {\n          return this.querySelector(\n            `${selectors$5.productMedia}.${classes$5.mediaActive}`,\n          );\n        }\n\n        getNextMediaId() {\n          const currentMedia = this.getCurrentMedia();\n          const nextMedia = currentMedia?.nextElementSibling.hasAttribute(\n            attributes$4.imageId,\n          )\n            ? currentMedia?.nextElementSibling\n            : this.querySelector(selectors$5.productMedia);\n          return nextMedia?.getAttribute(attributes$4.mediaId);\n        }\n\n        getPreviousMediaId() {\n          const currentMedia = this.getCurrentMedia();\n          const lastIndex = this.productMediaItems.length - 1;\n          const previousMedia =\n            currentMedia?.previousElementSibling ||\n            this.productMediaItems[lastIndex];\n\n          return previousMedia?.getAttribute(attributes$4.mediaId);\n        }\n\n        showNextImage() {\n          const id = this.getNextMediaId();\n          this.selectMedia(id);\n        }\n\n        showPreviousImage() {\n          const id = this.getPreviousMediaId();\n          this.selectMedia(id);\n        }\n\n        selectMedia(id) {\n          this.dispatchEvent(\n            new CustomEvent(\"theme:media:select\", {\n              detail: {\n                id: id,\n              },\n            }),\n          );\n        }\n\n        setActiveMedia(id, options = {}) {\n          if (!id) return;\n\n          this.setAttribute(attributes$4.activeMedia, id);\n\n          const activeImage = this.querySelector(\n            `${selectors$5.productMedia}.${classes$5.mediaActive}`,\n          );\n          const selectedImage = this.querySelector(\n            `[${attributes$4.mediaId}=\"${id}\"]`,\n          );\n          if (!selectedImage) return;\n          const selectedImageFocus = selectedImage?.querySelector(\n            selectors$5.focusedElement,\n          );\n          const deferredMedia = selectedImage.querySelector(\"deferred-media\");\n\n          if (this.flickityMode) {\n            this.productMediaItems.forEach((media) => {\n              const isSelected =\n                media.getAttribute(attributes$4.mediaId) === id;\n              media.classList.toggle(classes$5.mediaActive, isSelected);\n              media.classList.remove(\n                classes$5.mediaHidden,\n                classes$5.mediaHiding,\n              );\n            });\n\n            if (!options.skipFlickitySelect && this.flkty) {\n              const targetIndex = [...this.productMediaItems].findIndex(\n                (media) => media.getAttribute(attributes$4.mediaId) === id,\n              );\n              if (\n                targetIndex >= 0 &&\n                this.flkty.selectedIndex !== targetIndex\n              ) {\n                this.flkty.select(targetIndex);\n              }\n            }\n\n            if (\n              deferredMedia &&\n              deferredMedia.getAttribute(\"loaded\") !== true\n            ) {\n              selectedImage\n                .querySelector(selectors$5.deferredMediaButton)\n                ?.dispatchEvent(new Event(\"click\", { bubbles: false }));\n            }\n\n            requestAnimationFrame(() => {\n              if (document.body.classList.contains(classes$5.isFocused)) {\n                selectedImageFocus?.focus();\n              }\n            });\n\n            return;\n          }\n\n          activeImage?.classList.add(classes$5.mediaHiding);\n          activeImage?.classList.remove(classes$5.mediaActive);\n\n          selectedImage?.classList.remove(\n            classes$5.mediaHiding,\n            classes$5.mediaHidden,\n          );\n          selectedImage?.classList.add(classes$5.mediaActive);\n\n          // Force media loading if slide becomes visible\n          if (deferredMedia && deferredMedia.getAttribute(\"loaded\") !== true) {\n            selectedImage\n              .querySelector(selectors$5.deferredMediaButton)\n              ?.dispatchEvent(new Event(\"click\", { bubbles: false }));\n          }\n\n          requestAnimationFrame(() => {\n            this.setHeight();\n\n            // Move focus to the selected media\n            if (document.body.classList.contains(classes$5.isFocused)) {\n              selectedImageFocus?.focus();\n            }\n          });\n        }\n\n        // Set current product image height variable to product images container\n        setHeight() {\n          if (this.flickityMode) {\n            this.style.removeProperty(\"--height\");\n            return;\n          }\n\n          const mediaHeight =\n            this.querySelector(\n              `${selectors$5.productMedia}.${classes$5.mediaActive}`,\n            )?.offsetHeight || this.productMediaItems[0]?.offsetHeight;\n          this.style.setProperty(\"--height\", `${mediaHeight}px`);\n        }\n\n        productMediaObserver() {\n          if (this.flickityMode) return;\n\n          this.productMediaItems.forEach((media) => {\n            media.addEventListener(\"transitionend\", (e) => {\n              if (\n                e.target == media &&\n                media.classList.contains(classes$5.mediaHiding)\n              ) {\n                media.classList.remove(classes$5.mediaHiding);\n                media.classList.add(classes$5.mediaHidden);\n              }\n            });\n            media.addEventListener(\"transitioncancel\", (e) => {\n              if (\n                e.target == media &&\n                media.classList.contains(classes$5.mediaHiding)\n              ) {\n                media.classList.remove(classes$5.mediaHiding);\n                media.classList.add(classes$5.mediaHidden);\n              }\n            });\n          });\n        }\n      },\n    );\n  }\n\n  /**\n   * Adds a Shopify size attribute to a URL\n   *\n   * @param src\n   * @param size\n   * @returns {*}\n   */\n  function getSizedImageUrl(src, size) {\n    if (size === null) {\n      return src;\n    }\n\n    if (size === \"master\") {\n      return removeProtocol(src);\n    }\n\n    const match = src.match(\n      /\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i,\n    );\n\n    if (match) {\n      const prefix = src.split(match[0]);\n      const suffix = match[0];\n\n      return removeProtocol(`${prefix[0]}_${size}${suffix}`);\n    } else {\n      return null;\n    }\n  }\n\n  function removeProtocol(path) {\n    return path.replace(/http(s)?:/, \"\");\n  }\n\n  const selectors$4 = {\n    productCutline: \"[data-product-cutline]\",\n    productLink: \"[data-product-link]\",\n    productGridItem: \"[data-grid-item]\",\n    productInfo: \"[data-product-information]\",\n    productImage: \"[data-product-image-default]\",\n    productImageSibling: \"[data-product-image-sibling]\",\n    productPrice: \"[data-product-price]\",\n    siblingCount: \"[data-sibling-count]\",\n    siblingFieldset: \"[data-sibling-fieldset]\",\n    siblingLink: \"[data-sibling-link]\",\n  };\n\n  const classes$4 = {\n    visible: \"is-visible\",\n    fade: \"is-fade\",\n    stopEvents: \"no-events\",\n    active: \"is-active\",\n  };\n\n  const attributes$3 = {\n    siblingAddedImage: \"data-sibling-added-image\",\n    siblingCutline: \"data-sibling-cutline\",\n    siblingImage: \"data-sibling-image\",\n    siblingLink: \"data-sibling-link\",\n    siblingPrice: \"data-sibling-price\",\n    productLink: \"data-product-link\",\n    mobileColumnsSmall: \"data-mobile-columns-small\",\n  };\n\n  class SiblingSwatches {\n    constructor(swatches, product) {\n      this.swatches = swatches;\n      this.product = product;\n      this.productLinks = this.product.querySelectorAll(\n        selectors$4.productLink,\n      );\n      this.productCutline = this.product.querySelector(\n        selectors$4.productCutline,\n      );\n      this.productPrice = this.product.querySelector(selectors$4.productPrice);\n      this.productImage = this.product.querySelector(selectors$4.productImage);\n      this.productImageSibling = this.product.querySelector(\n        selectors$4.productImageSibling,\n      );\n\n      this.init();\n    }\n\n    init() {\n      this.cacheDefaultValues();\n\n      this.product.addEventListener(\"mouseleave\", () =>\n        this.resetProductValues(),\n      );\n\n      this.swatches.forEach((swatch) => {\n        swatch.addEventListener(\"mouseenter\", (event) =>\n          this.showSibling(event),\n        );\n      });\n\n      if (this.productLinks.length) {\n        this.swatches.forEach((swatch) => {\n          swatch.addEventListener(\"click\", () => {\n            this.productLinks[0].click();\n          });\n        });\n      }\n    }\n\n    cacheDefaultValues() {\n      this.productLinkValue = this.productLinks[0].hasAttribute(\n        attributes$3.productLink,\n      )\n        ? this.productLinks[0].getAttribute(attributes$3.productLink)\n        : \"\";\n      this.productPriceValue = this.productPrice.innerHTML;\n\n      if (this.productCutline) {\n        this.productCutlineValue = this.productCutline.innerHTML;\n      }\n    }\n\n    resetProductValues() {\n      this.product.classList.remove(classes$4.active);\n\n      if (this.productLinkValue) {\n        this.productLinks.forEach((productLink) => {\n          productLink.href = this.productLinkValue;\n        });\n      }\n\n      if (this.productPrice) {\n        this.productPrice.innerHTML = this.productPriceValue;\n      }\n\n      if (this.productCutline && this.productCutline) {\n        this.productCutline.innerHTML = this.productCutlineValue;\n        this.productCutline.title = this.productCutlineValue;\n      }\n\n      this.hideSiblingImage();\n    }\n\n    showSibling(event) {\n      const swatch = event.target;\n      const siblingLink = swatch.hasAttribute(attributes$3.siblingLink)\n        ? swatch.getAttribute(attributes$3.siblingLink)\n        : \"\";\n      const siblingPrice = swatch.hasAttribute(attributes$3.siblingPrice)\n        ? swatch.getAttribute(attributes$3.siblingPrice)\n        : \"\";\n      const siblingCutline = swatch.hasAttribute(attributes$3.siblingCutline)\n        ? swatch.getAttribute(attributes$3.siblingCutline)\n        : \"\";\n      const siblingImage = swatch.hasAttribute(attributes$3.siblingImage)\n        ? swatch.getAttribute(attributes$3.siblingImage)\n        : \"\";\n\n      if (siblingLink) {\n        this.productLinks.forEach((productLink) => {\n          productLink.href = siblingLink;\n        });\n      }\n\n      if (siblingPrice) {\n        this.productPrice.innerHTML = `<span class=\"price\">${siblingPrice}</span>`;\n      }\n\n      if (this.productCutline) {\n        if (siblingCutline) {\n          this.productCutline.innerHTML = siblingCutline;\n          this.productCutline.title = siblingCutline;\n        } else {\n          this.productCutline.innerHTML = \"\";\n          this.productCutline.title = \"\";\n        }\n      }\n\n      if (siblingImage) {\n        this.showSiblingImage(siblingImage);\n      }\n    }\n\n    showSiblingImage(siblingImage) {\n      if (!this.productImageSibling) return;\n\n      // Add current sibling swatch image to PGI image\n      const ratio = window.devicePixelRatio || 1;\n      const pixels = this.productImage.offsetWidth * ratio;\n      const widthRounded = Math.ceil(pixels / 180) * 180;\n      const imageSrc = getSizedImageUrl(siblingImage, `${widthRounded}x`);\n      const imageExists = this.productImageSibling.querySelector(\n        `[src=\"${imageSrc}\"]`,\n      );\n      const showCurrentImage = () => {\n        this.productImageSibling.classList.add(classes$4.visible);\n        this.productImageSibling\n          .querySelector(`[src=\"${imageSrc}\"]`)\n          .classList.add(classes$4.fade);\n      };\n      const swapImages = () => {\n        this.productImageSibling.querySelectorAll(\"img\").forEach((image) => {\n          image.classList.remove(classes$4.fade);\n        });\n        requestAnimationFrame(showCurrentImage);\n      };\n\n      if (imageExists) {\n        swapImages();\n      } else {\n        const imageTag = document.createElement(\"img\");\n\n        imageTag.src = imageSrc;\n\n        if (this.productCutline) {\n          imageTag.alt = this.productCutline.innerText;\n        }\n\n        imageTag.addEventListener(\"load\", () => {\n          this.productImageSibling.append(imageTag);\n\n          swapImages();\n        });\n      }\n    }\n\n    hideSiblingImage() {\n      if (!this.productImageSibling) return;\n\n      this.productImageSibling.classList.remove(classes$4.visible);\n      this.productImageSibling.querySelectorAll(\"img\").forEach((image) => {\n        image.classList.remove(classes$4.fade);\n      });\n    }\n  }\n\n  class ProductSiblings extends HTMLElement {\n    constructor() {\n      super();\n      // this.maxSwatches = 3;\n      this.resizeEvent = () => this.handleResize();\n    }\n\n    handleResize() {\n      if (this.siblingFieldset && this.productInfo) {\n        if (\n          this.swatchesStyle == \"grid\" ||\n          this.swatchesStyle == \"slider\" ||\n          this.swatchesStyle == \"limited\"\n        ) {\n          this.siblingFieldset.classList.add(classes$4.visible);\n          this.limitVisibleSwatches();\n        }\n      }\n    }\n\n    connectedCallback() {\n      this.product = this.closest(selectors$4.productGridItem);\n      this.siblingCount = this.querySelector(selectors$4.siblingCount);\n      this.siblingFieldset = this.querySelector(selectors$4.siblingFieldset);\n      this.siblingLinks = this.querySelectorAll(selectors$4.siblingLink);\n      this.productInfo = this.closest(selectors$4.productInfo);\n      this.productLink = this.closest(selectors$4.link);\n      this.hideSwatchesTimer = 0;\n      this.swatchesStyle = theme.settings.collectionSwatchStyle;\n\n      document.addEventListener(\"theme:resize:width\", this.resizeEvent);\n\n      if (this.siblingFieldset && this.productInfo) {\n        if (\n          this.swatchesStyle == \"grid\" ||\n          this.swatchesStyle == \"slider\" ||\n          this.swatchesStyle == \"limited\"\n        ) {\n          this.siblingFieldset.classList.add(classes$4.visible);\n          this.limitVisibleSwatches();\n        }\n\n        if (this.siblingCount) {\n          this.siblingCount.addEventListener(\"mouseenter\", () =>\n            this.showSiblings(),\n          );\n\n          // Prevent color swatches blinking on mouse move\n          this.productInfo.addEventListener(\"mouseleave\", () =>\n            this.hideSiblings(),\n          );\n        }\n      }\n\n      if (this.siblingLinks.length) {\n        new SiblingSwatches(this.siblingLinks, this.product);\n      }\n    }\n\n    limitVisibleSwatches() {\n      const isMobile = window.theme.isMobile();\n      const mobileColumnsElement = this.querySelector(\n        `[${attributes$3.mobileColumnsSmall}]`,\n      );\n      const isMobileSwatches =\n        mobileColumnsElement?.getAttribute(attributes$3.mobileColumnsSmall) ===\n        \"true\";\n\n      // Early return if no swatches or mobile conditions not met\n      if (!this.siblingLinks?.length || (isMobile && !isMobileSwatches)) {\n        return;\n      }\n\n      // For desktop, only proceed if style is 'limited'\n      if (!isMobile && this.swatchesStyle !== \"limited\") {\n        // Reset display for all swatches on desktop for other styles\n        this.siblingLinks.forEach((swatch) => {\n          swatch.style.display = \"\";\n        });\n        // Remove the limited count element if it exists\n        const limitedCountElement = this.querySelector(\".swatch-limited\");\n        if (limitedCountElement) {\n          limitedCountElement.remove();\n        }\n        return;\n      }\n\n      const maxVisible = isMobile ? 3 : 5;\n      const totalSwatches = this.siblingLinks.length;\n      const visibleSwatches = Math.min(maxVisible, totalSwatches);\n      const remainingSwatches = totalSwatches - visibleSwatches;\n\n      // Update swatch visibility in a single pass\n      this.siblingLinks.forEach((swatch, index) => {\n        swatch.style.display = index < visibleSwatches ? \"\" : \"none\";\n      });\n\n      // Handle remaining count display\n      const limitedCountElement = this.querySelector(\".swatch-limited\");\n      if (remainingSwatches > 0) {\n        if (!limitedCountElement) {\n          const newCountElement = document.createElement(\"div\");\n          newCountElement.className = \"swatch-limited\";\n          newCountElement.textContent = `+${remainingSwatches}`;\n          mobileColumnsElement?.appendChild(newCountElement);\n        } else {\n          limitedCountElement.textContent = `+${remainingSwatches}`;\n        }\n      } else if (limitedCountElement) {\n        limitedCountElement.remove();\n      }\n    }\n\n    showSiblings() {\n      if (this.hideSwatchesTimer) clearTimeout(this.hideSwatchesTimer);\n\n      if (this.productLink) {\n        this.productLink.classList.add(classes$4.stopEvents);\n      }\n\n      if (this.swatchesStyle == \"text\") return;\n\n      this.siblingFieldset.classList.add(classes$4.visible);\n    }\n\n    hideSiblings() {\n      this.hideSwatchesTimer = setTimeout(() => {\n        if (this.productLink) {\n          this.productLink.classList.remove(classes$4.stopEvents);\n        }\n\n        this.siblingFieldset.classList.remove(classes$4.visible);\n      }, 100);\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:resize:width\", this.resizeEvent);\n    }\n  }\n\n  if (!customElements.get(\"product-siblings\")) {\n    customElements.define(\"product-siblings\", ProductSiblings);\n  }\n\n  /**\n   * Module to show Recently Viewed Products\n   *\n   * Copyright (c) 2014 Caroline Schnapp (11heavens.com)\n   * Dual licensed under the MIT and GPL licenses:\n   * http://www.opensource.org/licenses/mit-license.php\n   * http://www.gnu.org/licenses/gpl.html\n   *\n   */\n\n  Shopify.Products = (function () {\n    const config = {\n      howManyToShow: 4,\n      howManyToStoreInMemory: 10,\n      wrapperId: \"recently-viewed-products\",\n      section: null,\n      target: \"api-product-grid-item\",\n      onComplete: null,\n    };\n\n    let productHandleQueue = [];\n    let wrapper = null;\n    let howManyToShowItems = null;\n\n    const today = new Date();\n    const expiresDate = new Date();\n    const daysToExpire = 90;\n    expiresDate.setTime(today.getTime() + 3600000 * 24 * daysToExpire);\n\n    const cookie = {\n      configuration: {\n        expires: expiresDate.toGMTString(),\n        path: \"/\",\n        domain: window.location.hostname,\n        sameSite: \"none\",\n        secure: true,\n      },\n      name: \"shopify_recently_viewed\",\n      write: function (recentlyViewed) {\n        const recentlyViewedString = encodeURIComponent(\n          recentlyViewed.join(\" \"),\n        );\n        document.cookie = `${this.name}=${recentlyViewedString}; expires=${this.configuration.expires}; path=${this.configuration.path}; domain=${this.configuration.domain}; sameSite=${this.configuration.sameSite}; secure=${this.configuration.secure}`;\n      },\n      read: function () {\n        let recentlyViewed = [];\n        let cookieValue = null;\n\n        if (\n          document.cookie.indexOf(\"; \") !== -1 &&\n          document.cookie.split(\"; \").find((row) => row.startsWith(this.name))\n        ) {\n          cookieValue = document.cookie\n            .split(\"; \")\n            .find((row) => row.startsWith(this.name))\n            .split(\"=\")[1];\n        }\n\n        if (cookieValue !== null) {\n          recentlyViewed = decodeURIComponent(cookieValue).split(\" \");\n        }\n\n        return recentlyViewed;\n      },\n      destroy: function () {\n        const cookieVal = null;\n        document.cookie = `${this.name}=${cookieVal}; expires=${this.configuration.expires}; path=${this.configuration.path}; domain=${this.configuration.domain}`;\n      },\n      remove: function (productHandle) {\n        const recentlyViewed = this.read();\n        const position = recentlyViewed.indexOf(productHandle);\n        if (position !== -1) {\n          recentlyViewed.splice(position, 1);\n          this.write(recentlyViewed);\n        }\n      },\n    };\n\n    const finalize = (wrapper, section) => {\n      wrapper.classList.remove(\"hidden\");\n      const cookieItemsLength = cookie.read().length;\n\n      if (\n        Shopify.recentlyViewed &&\n        howManyToShowItems &&\n        cookieItemsLength &&\n        cookieItemsLength < howManyToShowItems &&\n        wrapper.children.length\n      ) {\n        let allClassesArr = [];\n        let addClassesArr = [];\n        let objCounter = 0;\n        for (const property in Shopify.recentlyViewed) {\n          objCounter += 1;\n          const objString = Shopify.recentlyViewed[property];\n          const objArr = objString.split(\" \");\n          const propertyIdx = parseInt(property.split(\"_\")[1]);\n          allClassesArr = [...allClassesArr, ...objArr];\n\n          if (\n            cookie.read().length === propertyIdx ||\n            (objCounter === Object.keys(Shopify.recentlyViewed).length &&\n              !addClassesArr.length)\n          ) {\n            addClassesArr = [...addClassesArr, ...objArr];\n          }\n        }\n\n        for (let i = 0; i < wrapper.children.length; i++) {\n          const element = wrapper.children[i];\n          if (allClassesArr.length) {\n            element.classList.remove(...allClassesArr);\n          }\n\n          if (addClassesArr.length) {\n            element.classList.add(...addClassesArr);\n          }\n        }\n      }\n\n      // If we have a callback.\n      if (config.onComplete) {\n        try {\n          config.onComplete(wrapper, section);\n        } catch (error) {\n          console.log(error);\n        }\n      }\n    };\n\n    const moveAlong = (\n      shown,\n      productHandleQueue,\n      wrapper,\n      section,\n      target,\n      howManyToShow,\n    ) => {\n      if (productHandleQueue.length && shown < howManyToShow) {\n        fetch(\n          `${window.theme.routes.root}products/${productHandleQueue[0]}?section_id=${target}`,\n        )\n          .then((response) => response.text())\n          .then((product) => {\n            const aosDelay = shown * 100;\n            const aosAnchor = wrapper.id ? `#${wrapper.id}` : \"\";\n            const fresh = document.createElement(\"div\");\n            let productReplaced = product;\n            productReplaced = productReplaced.includes(\"||itemAnimationDelay||\")\n              ? productReplaced.replaceAll(\"||itemAnimationDelay||\", aosDelay)\n              : productReplaced;\n            productReplaced = productReplaced.includes(\n              \"||itemAnimationAnchor||\",\n            )\n              ? productReplaced.replaceAll(\"||itemAnimationAnchor||\", aosAnchor)\n              : productReplaced;\n            fresh.innerHTML = productReplaced;\n\n            wrapper.innerHTML +=\n              fresh.querySelector(\"[data-api-content]\").innerHTML;\n\n            productHandleQueue.shift();\n            shown++;\n            moveAlong(\n              shown,\n              productHandleQueue,\n              wrapper,\n              section,\n              target,\n              howManyToShow,\n            );\n          })\n          .catch(() => {\n            cookie.remove(productHandleQueue[0]);\n            productHandleQueue.shift();\n            moveAlong(\n              shown,\n              productHandleQueue,\n              wrapper,\n              section,\n              target,\n              howManyToShow,\n            );\n          });\n      } else {\n        finalize(wrapper, section);\n      }\n    };\n\n    return {\n      showRecentlyViewed: function (params) {\n        if (Shopify.visualPreviewMode) return;\n\n        const paramsNew = params || {};\n        const shown = 0;\n\n        // Update defaults.\n        Object.assign(config, paramsNew);\n\n        // Read cookie.\n        productHandleQueue = cookie.read();\n\n        // Element where to insert.\n        wrapper = document.querySelector(`#${config.wrapperId}`);\n\n        // How many products to show.\n        howManyToShowItems = config.howManyToShow;\n        config.howManyToShow = Math.min(\n          productHandleQueue.length,\n          config.howManyToShow,\n        );\n\n        // If we have any to show.\n        if (config.howManyToShow && wrapper) {\n          // Getting each product with an Ajax call and rendering it on the page.\n          moveAlong(\n            shown,\n            productHandleQueue,\n            wrapper,\n            config.section,\n            config.target,\n            howManyToShowItems,\n          );\n        }\n      },\n\n      getConfig: function () {\n        return config;\n      },\n\n      clearList: function () {\n        cookie.destroy();\n      },\n\n      recordRecentlyViewed: function (params) {\n        const paramsNew = params || {};\n\n        // Update defaults.\n        Object.assign(config, paramsNew);\n\n        // Read cookie.\n        let recentlyViewed = cookie.read();\n\n        // If we are on a product page.\n        if (window.location.pathname.indexOf(\"/products/\") !== -1) {\n          // What is the product handle on this page.\n          let productHandle = decodeURIComponent(window.location.pathname)\n            .match(\n              /\\/products\\/([a-z0-9\\-]|[\\u3000-\\u303F]|[\\u3040-\\u309F]|[\\u30A0-\\u30FF]|[\\uFF00-\\uFFEF]|[\\u4E00-\\u9FAF]|[\\u2605-\\u2606]|[\\u2190-\\u2195]|[\\u203B]|[\\w\\u0430-\\u044f]|[\\u0400-\\u04FF]|[\\u0900-\\u097F]|[\\u0590-\\u05FF\\u200f\\u200e]|[\\u0621-\\u064A\\u0660-\\u0669 ])+/,\n            )[0]\n            .split(\"/products/\")[1];\n\n          if (config.handle) {\n            productHandle = config.handle;\n          }\n\n          // In what position is that product in memory.\n          const position = recentlyViewed.indexOf(productHandle);\n\n          // If not in memory.\n          if (position === -1) {\n            // Add product at the start of the list.\n            recentlyViewed.unshift(productHandle);\n            // Only keep what we need.\n            recentlyViewed = recentlyViewed.splice(\n              0,\n              config.howManyToStoreInMemory,\n            );\n          } else {\n            // Remove the product and place it at start of list.\n            recentlyViewed.splice(position, 1);\n            recentlyViewed.unshift(productHandle);\n          }\n\n          // Update cookie.\n          cookie.write(recentlyViewed);\n        }\n      },\n\n      hasProducts: cookie.read().length > 0,\n    };\n  })();\n\n  const selectors$3 = {\n    aos: \"[data-aos]\",\n    collectionImage: \".collection-item__image\",\n    columnImage: \"[data-column-image]\",\n    flickityNextArrow: \".flickity-button.next\",\n    flickityPrevArrow: \".flickity-button.previous\",\n    link: \"a:not(.btn)\",\n    productItemImage: \".product-item__image\",\n    section: \"[data-section-type]\",\n    slide: \"[data-slide]\",\n    slideValue: \"data-slide\",\n    sliderThumb: \"[data-slider-thumb]\",\n  };\n\n  const attributes$2 = {\n    arrowPositionMiddle: \"data-arrow-position-middle\",\n    slideIndex: \"data-slide-index\",\n    sliderOptions: \"data-options\",\n    slideTextColor: \"data-slide-text-color\",\n  };\n\n  const classes$3 = {\n    aosAnimate: \"aos-animate\",\n    desktop: \"desktop\",\n    focused: \"is-focused\",\n    flickityEnabled: \"flickity-enabled\",\n    heroContentTransparent: \"hero__content--transparent\",\n    hidden: \"hidden\",\n    initialized: \"is-initialized\",\n    isLoading: \"is-loading\",\n    isSelected: \"is-selected\",\n    mobile: \"mobile\",\n    singleSlide: \"single-slide\",\n  };\n\n  if (!customElements.get(\"slider-component\")) {\n    customElements.define(\n      \"slider-component\",\n      class SliderComponent extends HTMLElement {\n        constructor() {\n          super();\n\n          this.flkty = null;\n          this.slides = this.querySelectorAll(selectors$3.slide);\n          this.thumbs = this.querySelectorAll(selectors$3.sliderThumb);\n          this.section = this.closest(selectors$3.section);\n          this.bindEvents();\n        }\n\n        connectedCallback() {\n          this.initSlider();\n        }\n\n        initSlider() {\n          if (this.slides.length <= 1) return;\n\n          if (this.hasAttribute(attributes$2.sliderOptions)) {\n            this.customOptions = JSON.parse(\n              decodeURIComponent(this.getAttribute(attributes$2.sliderOptions)),\n            );\n          }\n\n          this.classList.add(classes$3.isLoading);\n\n          let slideSelector = selectors$3.slide;\n          const isDesktopView = !window.theme.isMobile();\n          const slideDesktop = `${selectors$3.slide}:not(.${classes$3.mobile})`;\n          const slideMobile = `${selectors$3.slide}:not(.${classes$3.desktop})`;\n          const hasDeviceSpecificSelectors =\n            this.querySelectorAll(slideDesktop).length ||\n            this.querySelectorAll(slideMobile).length;\n\n          if (hasDeviceSpecificSelectors) {\n            if (isDesktopView) {\n              slideSelector = slideDesktop;\n            } else {\n              slideSelector = slideMobile;\n            }\n\n            this.flkty?.destroy();\n          }\n\n          if (this.querySelectorAll(slideSelector).length <= 1) {\n            this.classList.add(classes$3.singleSlide);\n            this.classList.remove(classes$3.isLoading);\n            return;\n          }\n\n          this.sliderOptions = {\n            cellSelector: slideSelector,\n            contain: true,\n            wrapAround: true,\n            adaptiveHeight: true,\n            ...this.customOptions,\n            on: {\n              ready: () => {\n                requestAnimationFrame(() => {\n                  this.classList.add(classes$3.initialized);\n                  this.classList.remove(classes$3.isLoading);\n                  this.parentNode.dispatchEvent(\n                    new CustomEvent(\"theme:slider:loaded\", {\n                      bubbles: true,\n                      detail: {\n                        slider: this,\n                      },\n                    }),\n                  );\n                });\n\n                this.slideActions();\n\n                if (this.sliderOptions.prevNextButtons) {\n                  this.positionArrows();\n                }\n              },\n              change: (index) => {\n                const slide = this.slides[index];\n                if (!slide || this.sliderOptions.groupCells) return;\n\n                const elementsToAnimate = slide.querySelectorAll(\n                  selectors$3.aos,\n                );\n                if (elementsToAnimate.length) {\n                  elementsToAnimate.forEach((el) => {\n                    el.classList.remove(classes$3.aosAnimate);\n                    requestAnimationFrame(() => {\n                      // setTimeout with `0` delay fixes functionality on Mobile and Firefox\n                      setTimeout(() => {\n                        el.classList.add(classes$3.aosAnimate);\n                      }, 0);\n                    });\n                  });\n                }\n              },\n              resize: () => {\n                if (this.sliderOptions.prevNextButtons) {\n                  this.positionArrows();\n                }\n              },\n            },\n          };\n\n          this.initFlickity();\n\n          this.flkty.on(\"change\", () => this.slideActions(true));\n\n          this.thumbs?.forEach((thumb) => {\n            thumb.addEventListener(\"click\", (e) => {\n              e.preventDefault();\n              const slideIndex = [...thumb.parentElement.children].indexOf(\n                thumb,\n              );\n              this.flkty.select(slideIndex);\n            });\n          });\n\n          if (!this.flkty || !this.flkty.isActive) {\n            this.classList.remove(classes$3.isLoading);\n          }\n        }\n\n        initFlickity() {\n          if (this.sliderOptions.fade) {\n            this.flkty = new window.theme.FlickityFade(\n              this,\n              this.sliderOptions,\n            );\n          } else {\n            this.flkty = new window.theme.Flickity(this, this.sliderOptions);\n          }\n        }\n\n        bindEvents() {\n          this.addEventListener(\"theme:slider:init\", () => {\n            this.initSlider();\n          });\n\n          this.addEventListener(\"theme:slider:select\", (e) => {\n            this.flkty.selectCell(e.detail.index);\n            this.flkty.stopPlayer();\n          });\n\n          this.addEventListener(\"theme:slider:deselect\", () => {\n            if (\n              this.flkty &&\n              this.sliderOptions.hasOwnProperty(\"autoPlay\") &&\n              this.sliderOptions.autoPlay\n            ) {\n              this.flkty.playPlayer();\n            }\n          });\n\n          this.addEventListener(\"theme:slider:reposition\", () => {\n            this.flkty?.reposition();\n          });\n\n          this.addEventListener(\"theme:slider:destroy\", () => {\n            this.flkty?.destroy();\n          });\n\n          this.addEventListener(\"theme:slider:remove-slide\", (e) => {\n            if (!e.detail.slide) return;\n\n            this.flkty?.remove(e.detail.slide);\n\n            if (this.flkty?.cells.length === 0) {\n              this.section.classList.add(classes$3.hidden);\n            }\n          });\n        }\n\n        slideActions(changeEvent = false) {\n          const currentSlide = this.querySelector(`.${classes$3.isSelected}`);\n          if (!currentSlide) return;\n\n          const currentSlideTextColor = currentSlide.hasAttribute(\n            attributes$2.slideTextColor,\n          )\n            ? currentSlide.getAttribute(attributes$2.slideTextColor)\n            : \"\";\n          const currentSlideLink = currentSlide.querySelector(selectors$3.link);\n          const buttons = this.querySelectorAll(\n            `${selectors$3.slide} a, ${selectors$3.slide} button`,\n          );\n\n          if (\n            document.body.classList.contains(classes$3.focused) &&\n            currentSlideLink &&\n            this.sliderOptions.groupCells &&\n            changeEvent\n          ) {\n            currentSlideLink.focus();\n          }\n\n          if (buttons.length) {\n            buttons.forEach((button) => {\n              const slide = button.closest(selectors$3.slide);\n              if (slide) {\n                const tabIndex = slide.classList.contains(classes$3.isSelected)\n                  ? 0\n                  : -1;\n                button.setAttribute(\"tabindex\", tabIndex);\n              }\n            });\n          }\n\n          this.style.setProperty(\"--text\", currentSlideTextColor);\n\n          if (\n            this.thumbs.length &&\n            this.thumbs.length === this.slides.length &&\n            currentSlide.hasAttribute(attributes$2.slideIndex)\n          ) {\n            const slideIndex = parseInt(\n              currentSlide.getAttribute(attributes$2.slideIndex),\n            );\n            const currentThumb = this.querySelector(\n              `${selectors$3.sliderThumb}.${classes$3.isSelected}`,\n            );\n            if (currentThumb) {\n              currentThumb.classList.remove(classes$3.isSelected);\n            }\n            this.thumbs[slideIndex].classList.add(classes$3.isSelected);\n          }\n        }\n\n        positionArrows() {\n          if (\n            !this.hasAttribute(attributes$2.arrowPositionMiddle) ||\n            !this.sliderOptions.prevNextButtons\n          )\n            return;\n\n          const itemImage =\n            this.querySelector(selectors$3.collectionImage) ||\n            this.querySelector(selectors$3.productItemImage) ||\n            this.querySelector(selectors$3.columnImage);\n\n          // Prevent 'clientHeight' of null error if no image\n          if (!itemImage) return;\n\n          this.querySelector(selectors$3.flickityPrevArrow).style.top =\n            itemImage.clientHeight / 2 + \"px\";\n          this.querySelector(selectors$3.flickityNextArrow).style.top =\n            itemImage.clientHeight / 2 + \"px\";\n        }\n\n        disconnectedCallback() {\n          if (this.flkty) {\n            this.flkty.options.watchCSS = false;\n            this.flkty.destroy();\n          }\n        }\n      },\n    );\n  }\n\n  const selectors$2 = {\n    relatedSection: \"[data-related-section]\",\n    aos: \"[data-aos]\",\n    tabsLi: \"[data-tab]\",\n    tabLink: \".tab-link\",\n    tabLinkRecent: \".tab-link__recent\",\n    tabContent: \".tab-content\",\n  };\n\n  const classes$2 = {\n    current: \"current\",\n    hidden: \"hidden\",\n    aosAnimate: \"aos-animate\",\n    aosNoTransition: \"aos-no-transition\",\n    focused: \"is-focused\",\n  };\n\n  const attributes$1 = {\n    dataTab: \"data-tab\",\n    dataTabIndex: \"data-tab-index\",\n  };\n\n  if (!customElements.get(\"tabs-component\")) {\n    customElements.define(\n      \"tabs-component\",\n      class GlobalTabs extends HTMLElement {\n        constructor() {\n          super();\n\n          this.a11y = window.a11y;\n        }\n\n        connectedCallback() {\n          const tabsNavList = this.querySelectorAll(selectors$2.tabsLi);\n\n          this.addEventListener(\"theme:tab:check\", () => this.checkRecentTab());\n          this.addEventListener(\"theme:tab:hide\", () => this.hideRelatedTab());\n\n          tabsNavList?.forEach((element) => {\n            const tabId = parseInt(element.getAttribute(attributes$1.dataTab));\n            const tab = this.querySelector(\n              `${selectors$2.tabContent}-${tabId}`,\n            );\n\n            element.addEventListener(\"click\", () => {\n              this.tabChange(element, tab);\n            });\n\n            element.addEventListener(\"keyup\", (event) => {\n              if (\n                (event.code === \"Space\" || event.code === \"Enter\") &&\n                document.body.classList.contains(classes$2.focused)\n              ) {\n                this.tabChange(element, tab);\n              }\n            });\n          });\n        }\n\n        tabChange(element, tab) {\n          if (element.classList.contains(classes$2.current)) {\n            return;\n          }\n\n          const currentTab = this.querySelector(\n            `${selectors$2.tabsLi}.${classes$2.current}`,\n          );\n          const currentTabContent = this.querySelector(\n            `${selectors$2.tabContent}.${classes$2.current}`,\n          );\n\n          currentTab?.classList.remove(classes$2.current);\n          currentTabContent?.classList.remove(classes$2.current);\n\n          element.classList.add(classes$2.current);\n          tab.classList.add(classes$2.current);\n\n          if (element.classList.contains(classes$2.hidden)) {\n            tab.classList.add(classes$2.hidden);\n          }\n\n          this.a11y.a11y.removeTrapFocus();\n\n          this.dispatchEvent(\n            new CustomEvent(\"theme:tab:change\", { bubbles: true }),\n          );\n\n          element.dispatchEvent(\n            new CustomEvent(\"theme:form:sticky\", {\n              bubbles: true,\n              detail: {\n                element: \"tab\",\n              },\n            }),\n          );\n\n          this.animateItems(tab);\n        }\n\n        animateItems(tab, animated = true) {\n          const animatedItems = tab.querySelectorAll(selectors$2.aos);\n\n          if (animatedItems.length) {\n            animatedItems.forEach((animatedItem) => {\n              animatedItem.classList.remove(classes$2.aosAnimate);\n\n              if (animated) {\n                animatedItem.classList.add(classes$2.aosNoTransition);\n\n                requestAnimationFrame(() => {\n                  animatedItem.classList.remove(classes$2.aosNoTransition);\n                  animatedItem.classList.add(classes$2.aosAnimate);\n                });\n              }\n            });\n          }\n        }\n\n        checkRecentTab() {\n          const tabLink = this.querySelector(selectors$2.tabLinkRecent);\n\n          if (tabLink) {\n            tabLink.classList.remove(classes$2.hidden);\n            const tabLinkIdx = parseInt(\n              tabLink.getAttribute(attributes$1.dataTab),\n            );\n            const tabContent = this.querySelector(\n              `${selectors$2.tabContent}[${attributes$1.dataTabIndex}=\"${tabLinkIdx}\"]`,\n            );\n\n            if (tabContent) {\n              tabContent.classList.remove(classes$2.hidden);\n\n              this.animateItems(tabContent, false);\n            }\n          }\n        }\n\n        hideRelatedTab() {\n          const relatedSection = this.querySelector(selectors$2.relatedSection);\n          if (!relatedSection) {\n            return;\n          }\n\n          const parentTabContent = relatedSection.closest(\n            `${selectors$2.tabContent}.${classes$2.current}`,\n          );\n          if (!parentTabContent) {\n            return;\n          }\n          const parentTabContentIdx = parseInt(\n            parentTabContent.getAttribute(attributes$1.dataTabIndex),\n          );\n          const tabsNavList = this.querySelectorAll(selectors$2.tabsLi);\n\n          if (tabsNavList.length > parentTabContentIdx) {\n            const nextTabsNavLink =\n              tabsNavList[parentTabContentIdx].nextSibling;\n\n            if (nextTabsNavLink) {\n              tabsNavList[parentTabContentIdx].classList.add(classes$2.hidden);\n              nextTabsNavLink.dispatchEvent(new Event(\"click\"));\n            }\n          }\n        }\n      },\n    );\n  }\n\n  const selectors$1 = {\n    actions: \"[data-actions]\",\n    content: \"[data-content]\",\n    trigger: \"[data-button]\",\n  };\n\n  const attributes = {\n    height: \"data-height\",\n  };\n\n  const classes$1 = {\n    open: \"is-open\",\n    enabled: \"is-enabled\",\n  };\n\n  class ToggleEllipsis extends HTMLElement {\n    constructor() {\n      super();\n\n      this.initialHeight = this.getAttribute(attributes.height);\n      this.content = this.querySelector(selectors$1.content);\n      this.trigger = this.querySelector(selectors$1.trigger);\n      this.actions = this.querySelector(selectors$1.actions);\n      this.toggleActions = this.toggleActions.bind(this);\n    }\n\n    connectedCallback() {\n      // Make sure the data attribute height value matches the CSS value\n      this.setHeight(this.initialHeight);\n\n      this.trigger.addEventListener(\"click\", () => {\n        this.setHeight(this.content.offsetHeight);\n        this.classList.add(classes$1.open);\n      });\n\n      this.setHeight(this.initialHeight);\n      this.toggleActions();\n\n      document.addEventListener(\"theme:resize\", this.toggleActions);\n      document.addEventListener(\"theme:collapsible:toggle\", this.toggleActions);\n    }\n\n    disconnectedCallback() {\n      document.removeEventListener(\"theme:resize\", this.toggleActions);\n      document.removeEventListener(\n        \"theme:collapsible:toggle\",\n        this.toggleActions,\n      );\n    }\n\n    setHeight(contentHeight) {\n      this.style.setProperty(\"--height\", `${contentHeight}px`);\n    }\n\n    toggleActions() {\n      this.classList.toggle(\n        classes$1.enabled,\n        this.content.offsetHeight + this.actions.offsetHeight >\n          this.initialHeight,\n      );\n    }\n  }\n\n  if (!customElements.get(\"toggle-ellipsis\")) {\n    customElements.define(\"toggle-ellipsis\", ToggleEllipsis);\n  }\n\n  const selectors = {\n    sectionId: \"[data-section-id]\",\n    tooltip: \"data-tooltip\",\n    tooltipStopMouseEnter: \"data-tooltip-stop-mouseenter\",\n  };\n\n  const classes = {\n    tooltipDefault: \"tooltip-default\",\n    visible: \"is-visible\",\n    hiding: \"is-hiding\",\n  };\n\n  if (!customElements.get(\"tooltip-component\")) {\n    customElements.define(\n      \"tooltip-component\",\n      class Tooltip extends HTMLElement {\n        constructor() {\n          super();\n\n          this.label = this.hasAttribute(selectors.tooltip)\n            ? this.getAttribute(selectors.tooltip)\n            : \"\";\n          this.transitionSpeed = 200;\n          this.hideTransitionTimeout = 0;\n          this.addPinEvent = () => this.addPin();\n          this.addPinMouseEvent = () => this.addPin(true);\n          this.removePinEvent = (event) =>\n            window.theme.throttle(this.removePin(event), 50);\n          this.removePinMouseEvent = (event) =>\n            this.removePin(event, true, true);\n        }\n\n        connectedCallback() {\n          if (!document.querySelector(`.${classes.tooltipDefault}`)) {\n            const tooltipTemplate = `<div class=\"${classes.tooltipDefault}__arrow\"></div><div class=\"${classes.tooltipDefault}__inner\"><div class=\"${classes.tooltipDefault}__text\"></div></div>`;\n            const tooltipElement = document.createElement(\"div\");\n            tooltipElement.className = classes.tooltipDefault;\n            tooltipElement.innerHTML = tooltipTemplate;\n            document.body.appendChild(tooltipElement);\n          }\n\n          this.addEventListener(\"mouseenter\", this.addPinMouseEvent);\n          this.addEventListener(\"mouseleave\", this.removePinMouseEvent);\n          this.addEventListener(\"theme:tooltip:init\", this.addPinEvent);\n          document.addEventListener(\"theme:tooltip:close\", this.removePinEvent);\n        }\n\n        addPin(stopMouseEnter = false) {\n          const tooltipTarget = document.querySelector(\n            `.${classes.tooltipDefault}`,\n          );\n\n          const section = this.closest(selectors.sectionId);\n          const colorSchemeClass = Array.from(section.classList).find((cls) =>\n            cls.startsWith(\"color-scheme-\"),\n          );\n          tooltipTarget?.classList.add(colorSchemeClass); // add the section's color scheme class to the tooltip\n\n          if (\n            this.label &&\n            tooltipTarget &&\n            ((stopMouseEnter &&\n              !this.hasAttribute(selectors.tooltipStopMouseEnter)) ||\n              !stopMouseEnter)\n          ) {\n            const tooltipTargetArrow = tooltipTarget.querySelector(\n              `.${classes.tooltipDefault}__arrow`,\n            );\n            const tooltipTargetInner = tooltipTarget.querySelector(\n              `.${classes.tooltipDefault}__inner`,\n            );\n            const tooltipTargetText = tooltipTarget.querySelector(\n              `.${classes.tooltipDefault}__text`,\n            );\n            tooltipTargetText.innerHTML = this.label;\n\n            const tooltipTargetWidth = tooltipTargetInner.offsetWidth;\n            const tooltipRect = this.getBoundingClientRect();\n            const tooltipTop = tooltipRect.top;\n            const tooltipWidth = tooltipRect.width;\n            const tooltipHeight = tooltipRect.height;\n            const tooltipTargetPositionTop =\n              tooltipTop + tooltipHeight + window.scrollY;\n            let tooltipTargetPositionLeft =\n              tooltipRect.left - tooltipTargetWidth / 2 + tooltipWidth / 2;\n            const tooltipLeftWithWidth =\n              tooltipTargetPositionLeft + tooltipTargetWidth;\n            const sideOffset = 24;\n            const tooltipTargetWindowDifference =\n              tooltipLeftWithWidth - window.theme.getWindowWidth() + sideOffset;\n\n            if (tooltipTargetWindowDifference > 0) {\n              tooltipTargetPositionLeft -= tooltipTargetWindowDifference;\n            }\n\n            if (tooltipTargetPositionLeft < 0) {\n              tooltipTargetPositionLeft = 0;\n            }\n\n            tooltipTargetArrow.style.left = `${tooltipRect.left + tooltipWidth / 2}px`;\n            tooltipTarget.style.setProperty(\n              \"--tooltip-top\",\n              `${tooltipTargetPositionTop}px`,\n            );\n\n            tooltipTargetInner.style.transform = `translateX(${tooltipTargetPositionLeft}px)`;\n            tooltipTarget.classList.remove(classes.hiding);\n            tooltipTarget.classList.add(classes.visible);\n\n            document.addEventListener(\"theme:scroll\", this.removePinEvent);\n          }\n        }\n\n        removePin(event, stopMouseEnter = false, hideTransition = false) {\n          const tooltipTarget = document.querySelector(\n            `.${classes.tooltipDefault}`,\n          );\n          const tooltipVisible = tooltipTarget.classList.contains(\n            classes.visible,\n          );\n\n          if (\n            tooltipTarget &&\n            ((stopMouseEnter &&\n              !this.hasAttribute(selectors.tooltipStopMouseEnter)) ||\n              !stopMouseEnter)\n          ) {\n            if (\n              tooltipVisible &&\n              (hideTransition || event.detail.hideTransition)\n            ) {\n              tooltipTarget.classList.add(classes.hiding);\n\n              if (this.hideTransitionTimeout) {\n                clearTimeout(this.hideTransitionTimeout);\n              }\n\n              this.hideTransitionTimeout = setTimeout(() => {\n                tooltipTarget.classList.remove(classes.hiding);\n              }, this.transitionSpeed);\n            }\n\n            tooltipTarget.classList.remove(classes.visible);\n\n            document.removeEventListener(\"theme:scroll\", this.removePinEvent);\n          }\n        }\n\n        disconnectedCallback() {\n          this.removeEventListener(\"mouseenter\", this.addPinMouseEvent);\n          this.removeEventListener(\"mouseleave\", this.removePinMouseEvent);\n          this.removeEventListener(\"theme:tooltip:init\", this.addPinEvent);\n          document.removeEventListener(\n            \"theme:tooltip:close\",\n            this.removePinEvent,\n          );\n          document.removeEventListener(\"theme:scroll\", this.removePinEvent);\n        }\n      },\n    );\n  }\n\n  function getScript(url, callback, callbackError) {\n    let head = document.getElementsByTagName(\"head\")[0];\n    let done = false;\n    let script = document.createElement(\"script\");\n    script.src = url;\n\n    // Attach handlers for all browsers\n    script.onload = script.onreadystatechange = function () {\n      if (\n        !done &&\n        (!this.readyState ||\n          this.readyState == \"loaded\" ||\n          this.readyState == \"complete\")\n      ) {\n        done = true;\n        callback();\n      } else {\n        callbackError();\n      }\n    };\n\n    head.appendChild(script);\n  }\n\n  const loaders = {};\n\n  function loadScript(options = {}) {\n    if (!options.type) {\n      options.type = \"json\";\n    }\n\n    if (options.url) {\n      if (loaders[options.url]) {\n        return loaders[options.url];\n      } else {\n        return getScriptWithPromise(options.url, options.type);\n      }\n    } else if (options.json) {\n      if (loaders[options.json]) {\n        return Promise.resolve(loaders[options.json]);\n      } else {\n        return window\n          .fetch(options.json)\n          .then((response) => {\n            return response.json();\n          })\n          .then((response) => {\n            loaders[options.json] = response;\n            return response;\n          });\n      }\n    } else if (options.name) {\n      const key = \"\".concat(options.name, options.version);\n      if (loaders[key]) {\n        return loaders[key];\n      } else {\n        return loadShopifyWithPromise(options);\n      }\n    } else {\n      return Promise.reject();\n    }\n  }\n\n  function getScriptWithPromise(url, type) {\n    const loader = new Promise((resolve, reject) => {\n      if (type === \"text\") {\n        fetch(url)\n          .then((response) => response.text())\n          .then((data) => {\n            resolve(data);\n          })\n          .catch((error) => {\n            reject(error);\n          });\n      } else {\n        getScript(\n          url,\n          function () {\n            resolve();\n          },\n          function () {\n            reject();\n          },\n        );\n      }\n    });\n\n    loaders[url] = loader;\n    return loader;\n  }\n\n  function loadShopifyWithPromise(options) {\n    const key = \"\".concat(options.name, options.version);\n    const loader = new Promise((resolve, reject) => {\n      try {\n        window.Shopify.loadFeatures([\n          {\n            name: options.name,\n            version: options.version,\n            onLoad: (err) => {\n              onLoadFromShopify(resolve, reject, err);\n            },\n          },\n        ]);\n      } catch (err) {\n        reject(err);\n      }\n    });\n    loaders[key] = loader;\n    return loader;\n  }\n\n  function onLoadFromShopify(resolve, reject, err) {\n    if (err) {\n      return reject(err);\n    } else {\n      return resolve();\n    }\n  }\n\n  document.addEventListener(\"DOMContentLoaded\", function () {\n    // Scroll to top button\n    const scrollTopButton = document.querySelector(\"[data-scroll-top-button]\");\n    if (scrollTopButton) {\n      scrollTopButton.addEventListener(\"click\", () => {\n        window.scrollTo({\n          top: 0,\n          left: 0,\n          behavior: \"smooth\",\n        });\n      });\n      document.addEventListener(\"theme:scroll\", () => {\n        scrollTopButton.classList.toggle(\n          \"is-visible\",\n          window.scrollY > window.innerHeight,\n        );\n      });\n    }\n\n    if (window.self !== window.top) {\n      document.querySelector(\"html\").classList.add(\"iframe\");\n    }\n\n    // Safari smoothscroll polyfill\n    let hasNativeSmoothScroll =\n      \"scrollBehavior\" in document.documentElement.style;\n    if (!hasNativeSmoothScroll) {\n      loadScript({ url: window.theme.assets.smoothscroll });\n    }\n  });\n\n  // Apply a specific class to the html element for browser support of cookies.\n  if (window.navigator.cookieEnabled) {\n    document.documentElement.className =\n      document.documentElement.className.replace(\n        \"supports-no-cookies\",\n        \"supports-cookies\",\n      );\n  }\n})(themeVendor.ScrollLock);\n"],
  "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaC,SAAU,WAAY,CACrB,cAEC,UAAY,CACX,MAAM,IAAM,CAAE,SAAU,YAAa,EACrC,GAAI,CACF,GAAI,QAAS,CACX,QAAQ,IAAM,OAAO,OAAO,CAAC,EAAG,QAAQ,GAAG,EAC3C,OAAO,OAAO,QAAQ,IAAK,GAAG,EAC9B,MACF,CACF,MAAY,CAAC,CACb,WAAW,QAAU,CAAE,GAAS,CAClC,GAAG,EAEH,OAAO,MAAQ,OAAO,OAAS,CAAC,EAEhC,OAAO,MAAM,MAAQ,CACnB,OAAQ,IACR,MAAO,IACP,MAAO,IACP,WAAY,IACd,EAEA,OAAO,MAAM,UACX,2EAEF,OAAO,MAAM,eAAiB,UAAY,CACxC,OACE,SAAS,gBAAgB,aACzB,SAAS,KAAK,aACd,OAAO,UAEX,EAEA,OAAO,MAAM,gBAAkB,UAAY,CACzC,OACE,SAAS,gBAAgB,cACzB,SAAS,KAAK,cACd,OAAO,WAEX,EAEA,OAAO,MAAM,SAAW,UAAY,CAClC,OAAO,OAAO,MAAM,eAAe,EAAI,OAAO,MAAM,MAAM,KAC5D,EAYA,MAAM,YAAc,cASpB,OAAO,MAAM,YAAc,SAAU,MAAO,OAAQ,CAC9C,OAAO,OAAU,WACnB,MAAQ,MAAM,QAAQ,IAAK,EAAE,GAE/B,IAAI,MAAQ,GACZ,MAAM,iBAAmB,sBACnB,aAAe,QAAU,YAE/B,SAAS,qBACP,OACA,UAAY,EACZ,UAAY,IACZ,QAAU,IACV,CACA,GAAI,MAAM,MAAM,GAAK,QAAU,KAC7B,MAAO,GAGT,QAAU,OAAS,KAAO,QAAQ,SAAS,EAE3C,MAAM,MAAQ,OAAO,MAAM,GAAG,EACxB,cAAgB,MAAM,CAAC,EAAE,QAC7B,2BACA,KAAK,SAAS,EAChB,EACM,YAAc,MAAM,CAAC,EAAI,QAAU,MAAM,CAAC,EAAI,GAEpD,OAAO,cAAgB,WACzB,CAEA,OAAQ,aAAa,MAAM,gBAAgB,EAAE,CAAC,EAAG,CAC/C,IAAK,SACH,MAAQ,qBAAqB,MAAO,CAAC,EACrC,MACF,IAAK,qBACH,MAAQ,qBAAqB,MAAO,CAAC,EACrC,MACF,IAAK,8BACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,MACF,IAAK,0CACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,MACF,IAAK,mCACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,MACF,IAAK,0CACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,EAAE,EAC9C,MACF,IAAK,8BACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,MACF,IAAK,yCACH,MAAQ,qBAAqB,MAAO,EAAG,IAAK,GAAG,EAC/C,KACJ,CAEA,OAAO,aAAa,QAAQ,iBAAkB,KAAK,CACrD,EAEA,OAAO,MAAM,SAAW,SAAU,GAAI,KAAM,CAC1C,IAAI,QACJ,OAAO,UAAY,CAEjB,GAAI,GAAI,CACN,MAAM,aAAe,IAAM,GAAG,MAAM,KAAM,SAAS,EACnD,aAAa,OAAO,EACpB,QAAU,WAAW,aAAc,IAAI,CACzC,CACF,CACF,EAEA,IAAI,kBAAoB,qBAAqB,EACzC,UAAY,GAEhB,OAAO,MAAM,YAAc,UAAY,CACrC,MAAM,EAAI,CAAC,EACX,SAAE,aAAe,KAAK,IAAI,OAAO,OAAO,OAAQ,OAAO,WAAW,EAClE,EAAE,aAAe,UAAU,+BAA+B,EAC1D,EAAE,aAAe,UAAU,sBAAsB,EACjD,EAAE,mBAAqB,SAAS,cAAc,sBAAsB,EAChE,EAAE,aACF,EACJ,EAAE,oBAAsB,UAAU,uBAAuB,EACzD,EAAE,WAAa,yBAAyB,EAEjC,CACT,EAEA,SAAS,SAAU,CACjB,KAAM,CACJ,aACA,aACA,WACA,aACA,mBACF,EAAI,OAAO,MAAM,YAAY,EACvB,yBAA2B,qBAAqB,GAGpD,CAAC,WACD,2BAA6B,mBAC7B,OAAO,WAAa,OAAO,MAAM,MAAM,UAGvC,SAAS,gBAAgB,MAAM,YAC7B,gBACA,GAAG,YAAY,IACjB,EACA,SAAS,gBAAgB,MAAM,YAC7B,mBACA,GAAG,cAAgB,EAAI,EAAE,IAC3B,EACA,SAAS,gBAAgB,MAAM,YAC7B,eACA,GAAG,cAAgB,EAAI,EAAE,IAC3B,EACA,SAAS,gBAAgB,MAAM,YAC7B,aACA,GAAG,aAAe,CAAC,IACrB,EACA,SAAS,gBAAgB,MAAM,YAC7B,cACA,GAAG,aAAe,CAAC,IACrB,EAGA,kBAAoB,yBACpB,UAAY,IAGd,SAAS,gBAAgB,MAAM,YAC7B,0BACA,GAAG,mBAAmB,IACxB,EACA,SAAS,gBAAgB,MAAM,YAC7B,kBACA,GAAG,YAAY,IACjB,EACA,SAAS,gBAAgB,MAAM,YAC7B,kBACA,GAAG,YAAY,IACjB,EACA,SAAS,gBAAgB,MAAM,YAC7B,iBACA,GAAG,aAAe,aAAe,WAAa,CAAC,IACjD,EACA,SAAS,gBAAgB,MAAM,YAC7B,gBACA,GAAG,aAAe,aAAe,YAAY,IAC/C,CACF,CAEA,SAAS,sBAAuB,CAC9B,GAAI,OAAO,WAAW,yBAAyB,EAAE,QAC/C,MAAO,WAGT,GAAI,OAAO,WAAW,0BAA0B,EAAE,QAChD,MAAO,WAEX,CAEA,SAAS,UAAU,SAAU,CAC3B,MAAM,GAAK,SAAS,cAAc,QAAQ,EAC1C,OAAI,GACK,GAAG,aAEH,CAEX,CAEA,SAAS,0BAA2B,CAClC,MAAM,OAAS,UAAU,oBAAoB,EAC7C,OAAI,OAAS,EACJ,OAAS,GAET,CAEX,CAEA,QAAQ,EAER,OAAO,iBAAiB,mBAAoB,OAAO,EACnD,SAAS,iBAAiB,eAAgB,OAAO,EACjD,SAAS,iBAAiB,uBAAwB,OAAO,EAEzD,OAAO,MAAM,SAAY,YAAe,CACtC,MAAM,mBAAqB,SAAS,cAAc,sBAAsB,EACpE,SAAS,cAAc,sBAAsB,EAAE,aAC/C,EAEJ,OAAO,SAAS,CACd,IAAK,WAAa,OAAO,QAAU,mBACnC,KAAM,EACN,SAAU,QACZ,CAAC,CACH,EASA,MAAM,kBAAoB,CAAC,EAErB,KAAO,CAOX,WAAW,QAAS,QAAS,CAC3B,QAAU,SAAW,CAAC,EAEtB,IAAI,cAAgB,QAAQ,SAE5B,QAAQ,SAAW,GACnB,QAAQ,QAAQ,SAAW,cAC3B,QAAQ,MAAM,EACV,OAAO,QAAQ,UAAc,KAC/B,QAAQ,UAAU,IAAI,QAAQ,SAAS,EAEzC,QAAQ,iBAAiB,OAAQ,QAAQ,EAEzC,SAAS,SAAS,MAAO,CACvB,MAAM,OAAO,oBAAoB,MAAM,KAAM,QAAQ,EAErD,QAAQ,SAAW,cACnB,OAAO,QAAQ,QAAQ,SACnB,OAAO,QAAQ,UAAc,KAC/B,QAAQ,UAAU,OAAO,QAAQ,SAAS,CAE9C,CACF,EAMA,UAAU,QAAS,CACjB,QAAU,SAAW,CAAC,EACtB,IAAI,KAAO,OAAO,SAAS,KACvB,QAAU,SAAS,eAAe,KAAK,MAAM,CAAC,CAAC,EAEnD,GAAI,SAAW,QAAQ,QAAU,QAAQ,QAAQ,QAAQ,MAAM,EAC7D,MAAO,GAGL,MAAQ,SACV,KAAK,WAAW,QAAS,OAAO,CAEpC,EAMA,gBAAgB,QAAS,CACvB,QAAU,SAAW,CAAC,EACtB,IAAI,MAAQ,MAAM,UAAU,MAAM,KAChC,SAAS,iBAAiB,cAAc,CAC1C,EAEA,SAAS,WAAW,SAAU,CAC5B,OAAO,SAAS,eAAe,QAAQ,IAAM,IAC/C,CAEA,OAAO,MAAM,OAAQ,MAAS,CAS5B,GARI,KAAK,OAAS,KAAO,KAAK,OAAS,IAInC,QAAQ,QAAU,KAAK,QAAQ,QAAQ,MAAM,GAI7C,CAAC,WAAW,KAAK,KAAK,OAAO,CAAC,CAAC,EACjC,MAAO,GAGT,IAAI,QAAU,SAAS,cAAc,KAAK,IAAI,EAE9C,OAAK,SAIL,KAAK,iBAAiB,QAAS,IAAM,CACnC,KAAK,WAAW,QAAS,OAAO,CAClC,CAAC,EAEM,IAPE,EAQX,CAAC,CACH,EAEA,UAAU,UAAW,CACnB,IAAI,SAAW,MAAM,UAAU,MAAM,KACnC,UAAU,iBACR,4HASF,CACF,EAEA,OAAO,SAAS,OACb,SACC,CAAC,GACE,QAAQ,aACP,QAAQ,cACR,QAAQ,eAAe,EAAE,SAC3B,KAAK,UAAU,OAAO,EAE5B,CACF,EAEA,UAAU,UAAW,QAAS,CAC5B,QAAU,SAAW,CAAC,EACtB,IAAI,SAAW,KAAK,UAAU,SAAS,EACnC,eAAiB,QAAQ,gBAAkB,UAC3C,MAAQ,SAAS,CAAC,EAClB,KAAO,SAAS,SAAS,OAAS,CAAC,EAEvC,KAAK,gBAAgB,EAErB,kBAAkB,QAAU,SAAU,MAAO,CAEzC,YAAc,MAAM,QACpB,CAAC,UAAU,SAAS,MAAM,MAAM,GAChC,OACA,QAAU,MAAM,QAEhB,MAAM,MAAM,EAIZ,QAAM,SAAW,WACjB,MAAM,SAAW,MACjB,MAAM,SAAW,QAGnB,SAAS,iBAAiB,UAAW,kBAAkB,OAAO,CAChE,EAEA,kBAAkB,SAAW,UAAY,CACvC,SAAS,oBAAoB,UAAW,kBAAkB,OAAO,CACnE,EAEA,kBAAkB,QAAU,SAAU,MAAO,CACvC,MAAM,OAAS,QAEf,MAAM,SAAW,MAAQ,CAAC,MAAM,WAClC,MAAM,eAAe,EACrB,MAAM,MAAM,IAIX,MAAM,SAAW,WAAa,MAAM,SAAW,QAChD,MAAM,WAEN,MAAM,eAAe,EACrB,KAAK,MAAM,GAEf,EAEA,SAAS,iBAAiB,WAAY,kBAAkB,QAAQ,EAChE,SAAS,iBAAiB,UAAW,kBAAkB,OAAO,EAE9D,KAAK,WAAW,eAAgB,OAAO,CACzC,EAEA,iBAAkB,CAChB,SAAS,oBAAoB,UAAW,kBAAkB,OAAO,EACjE,SAAS,oBAAoB,WAAY,kBAAkB,QAAQ,EACnE,SAAS,oBAAoB,UAAW,kBAAkB,OAAO,CACnE,EAEA,sBAAuB,CAEnB,OAAO,KAAK,aACZ,SAAS,KAAK,UAAU,SAAS,YAAY,GAE7C,WAAW,IAAM,CACf,OAAO,KAAK,aAAa,MAAM,CACjC,CAAC,CAEL,EAEA,gBAAgB,SAAU,QAAS,CACjC,GAAI,OAAO,UAAa,SACtB,MAAM,IAAI,UAAU,SAAW,mBAAmB,EAKpD,GAFA,SAAW,SAAS,iBAAiB,QAAQ,EAEzC,SAAS,SAAW,EACtB,OAGF,QAAU,SAAW,CAAC,EACtB,QAAQ,SAAW,QAAQ,UAAY,CAAC,EAExC,IAAI,SAAW,CACb,UAAW,QAAQ,SAAS,WAAa,yBACzC,SAAU,QAAQ,SAAS,UAAY,0BACvC,kBACE,QAAQ,SAAS,mBACjB,yCACJ,EAEI,OAAS,QAAQ,QAAU,OAE3B,iBAAmB,CACrB,UAAW,OAAS,sBACpB,SAAU,OAAS,oBACnB,kBAAmB,OAAS,8BAC9B,EAEA,SAAS,aAAaA,UAAU,CAC9B,IAAI,UAAY,SAAS,cAAc,IAAI,EACvC,aAAe,OAAO,KAAKA,SAAQ,EAAE,OAAO,CAAC,KAAM,MAC7C,MACN,UAAY,iBAAiB,GAAG,EAAI,IAAMA,UAAS,GAAG,EAAI,QAC3D,EAAE,EAEL,UAAU,aAAa,SAAU,EAAI,EACrC,UAAU,UAAY,aAEtB,SAAS,KAAK,YAAY,SAAS,CACrC,CAEA,SAAS,aAAa,KAAM,CAC1B,OAAO,KAAK,WAAa,OAAO,SAAS,QAC3C,CAEA,SAAS,QAAS,MAAS,CACzB,IAAI,OAAS,KAAK,aAAa,QAAQ,EACnC,IAAM,KAAK,aAAa,KAAK,EAC7B,WAAa,aAAa,IAAI,EAC9B,cAAgB,SAAW,SAC3B,mBAAqB,MAAQ,MAAQ,IAAI,QAAQ,UAAU,IAAM,GAErE,GAAI,eAAiB,mBAAoB,CACvC,IAAI,SAAW,MAAQ,KAAO,WAAa,IAAM,YACjD,KAAK,aAAa,MAAO,QAAQ,CACnC,CAEI,YAAc,cAChB,KAAK,aACH,mBACA,iBAAiB,iBACnB,EACS,WACT,KAAK,aAAa,mBAAoB,iBAAiB,QAAQ,EACtD,eACT,KAAK,aAAa,mBAAoB,iBAAiB,SAAS,CAEpE,CAAC,EAED,aAAa,QAAQ,CACvB,EAEA,UAAU,GAAI,CACZ,IAAI,MAAQ,OAAO,iBAAiB,EAAE,EACtC,OAAO,MAAM,UAAY,QAAU,MAAM,aAAe,QAC1D,CACF,EAEA,OAAO,MAAQ,OAAO,OAAS,CAAC,EAChC,OAAO,MAAM,KAAO,KAEpB,OAAO,MAAM,SAAW,CAAC,GAAI,OAAS,CACpC,IAAIC,MAAM,KACV,OAAO,SAAS,YAAY,KAAM,CAChC,MAAM,IAAM,KAAK,IAAI,EACrB,KAAO,aAAa,IAAI,EACpB,CAACA,OAAQ,IAAMA,OAAQ,MAEzB,GAAG,MAAM,KAAM,IAAI,EACnBA,MAAO,KAEP,KAAO,WAAW,SAAS,KAAK,KAAM,GAAG,IAAI,EAAG,MAAQ,IAAMA,MAAK,CAEvE,CACF,EAEA,SAAS,iBAAkB,CACzB,GAAI,SAAS,cAAc,YAAY,EAAG,OAG1C,MAAM,UAAY,SAAS,cAAc,YAAY,EACrD,SAAS,KAAK,YAAY,SAAS,CACrC,CAEA,SAAS,YAAY,UAAW,CACf,UAAU,iBAAiB,aAAa,EAChD,QAAS,SAAY,CAC1B,MAAM,MAAQ,QAAQ,cAAc,OAAO,EACrC,MAAQ,QAAQ,cAAc,iBAAiB,EACjD,OAAS,QACX,MAAM,iBAAiB,QAAU,OAAU,CACrC,MAAM,OAAO,QAAU,GACzB,MAAM,UAAU,IAAI,cAAc,EAElC,MAAM,UAAU,OAAO,cAAc,CAEzC,CAAC,EACG,MAAM,OAAS,MAAM,MAAM,QAC7B,MAAM,UAAU,IAAI,cAAc,EAGxC,CAAC,CACH,CAEA,IAAI,gBAAkB,OAAO,MAAM,eAAe,EAC9C,iBAAmB,OAAO,MAAM,gBAAgB,EAEpD,SAAS,YAAa,CACpB,SAAS,cACP,IAAI,YAAY,eAAgB,CAC9B,QAAS,EACX,CAAC,CACH,EAEI,kBAAoB,OAAO,MAAM,eAAe,IAClD,SAAS,cACP,IAAI,YAAY,qBAAsB,CACpC,QAAS,EACX,CAAC,CACH,EAEA,gBAAkB,OAAO,MAAM,eAAe,GAG5C,mBAAqB,OAAO,MAAM,gBAAgB,IACpD,SAAS,cACP,IAAI,YAAY,sBAAuB,CACrC,QAAS,EACX,CAAC,CACH,EAEA,iBAAmB,OAAO,MAAM,gBAAgB,EAEpD,CAEA,SAAS,gBAAiB,CACxB,OAAO,iBACL,SACA,OAAO,MAAM,SAAS,UAAY,CAChC,WAAW,CACb,EAAG,EAAE,CACP,CACF,CAEA,IAAI,KAAO,OAAO,QACd,GAAK,KACL,KAAO,KACP,MAAQ,KACR,QAAU,KACV,gBAAkB,EAEtB,SAAS,UAAW,CAClB,MAAM,SAAW,OAAO,QACpB,SAAW,MACb,KAAO,GACP,GAAK,IACI,SAAW,MACpB,KAAO,GACP,GAAK,KAEL,GAAK,KACL,KAAO,MAET,KAAO,SACP,SAAS,cACP,IAAI,YAAY,eAAgB,CAC9B,OAAQ,CACN,GACA,KACA,QACF,EACA,QAAS,EACX,CAAC,CACH,EACI,IAAM,CAAC,OACT,SAAS,cACP,IAAI,YAAY,kBAAmB,CACjC,OAAQ,CAAE,QAAS,EACnB,QAAS,EACX,CAAC,CACH,EAEE,MAAQ,CAAC,SACX,SAAS,cACP,IAAI,YAAY,oBAAqB,CACnC,OAAQ,CAAE,QAAS,EACnB,QAAS,EACX,CAAC,CACH,EAEF,QAAU,KACV,MAAQ,EACV,CAEA,SAAS,KAAK,EAAG,CAEf,WAAW,IAAM,CACX,iBACF,aAAa,eAAe,EAG9B,WAAW,kBAAkB,EAAE,OAAQ,CACrC,eAAiB,IAAO,GAAG,UAAY,UACzC,CAAC,EAED,SAAS,gBAAgB,aAAa,qBAAsB,EAAE,CAChE,CAAC,CACH,CAEA,SAAS,OAAO,EAAG,CACjB,MAAM,QAAU,EAAE,OAEd,QACF,gBAAkB,WAAW,iBAAkB,OAAO,EAEtD,iBAAiB,CAErB,CAEA,SAAS,kBAAmB,CAC1B,WAAW,sBAAsB,EACjC,WAAW,iBAAiB,EAC5B,SAAS,gBAAgB,gBAAgB,oBAAoB,CAC/D,CAEA,SAAS,gBAAiB,CACxB,IAAI,QACJ,OAAO,iBACL,SACA,UAAY,CACN,SACF,OAAO,qBAAqB,OAAO,EAErC,QAAU,OAAO,sBAAsB,UAAY,CACjD,SAAS,CACX,CAAC,CACH,EACA,CAAE,QAAS,EAAK,CAClB,EAEA,OAAO,iBAAiB,oBAAqB,IAAI,EACjD,OAAO,iBAAiB,sBAAuB,MAAM,CACvD,CAEA,MAAM,KAAO,CAAC,OAAQ,aAAe,GAAI,gBAAkB,CACzD,MAAM,QAAU,eAAiB,SAAS,cAAc,KAAK,EAC7D,eAAQ,UAAU,IAAI,YAAY,EAClC,OAAO,WAAW,aAAa,QAAS,MAAM,EACvC,QAAQ,YAAY,MAAM,CACnC,EAEA,SAAS,aAAa,UAAW,CAGhB,UAAU,iBADF,YACiC,EACjD,QAAS,OAAU,CACxB,KAAK,MAAO,oBAAoB,EAChC,MAAM,aAAa,8BAA+B,EAAE,CACtD,CAAC,EAKc,UAAU,iBADvB,uGACuD,EAClD,QAAS,OAAU,CACxB,KAAK,MAAO,oBAAoB,CAClC,CAAC,CACH,CAEA,SAAS,eAAgB,CACvB,MACE,iBAAkB,QAClB,UAAU,eAAiB,GAC3B,UAAU,iBAAmB,CAEjC,CAEA,SAAS,SAAU,CACb,cAAc,GAChB,SAAS,gBAAgB,UACvB,SAAS,gBAAgB,UAAU,QACjC,WACA,gBACF,EACF,OAAO,MAAM,MAAQ,IAErB,OAAO,MAAM,MAAQ,EAEzB,CAEA,SAAS,WAAW,UAAW,CAC7B,MAAM,cAAgB,UAAU,iBAAiB,oBAAoB,EACjE,cAAc,QAChB,cAAc,QAAS,SAAY,CACjC,QAAQ,iBAAiB,QAAS,SAAU,MAAO,CACjD,MAAM,eAAe,EACrB,MAAM,cAAgB,MAAM,cAC5B,cAAc,aACZ,gBACA,cAAc,aAAa,eAAe,GAAK,QAC3C,OACA,OACN,EACA,MAAM,SAAW,cAAc,aAAa,eAAe,EACrD,cAAgB,SAAS,cAAc,IAAI,QAAQ,EAAE,EACrD,qBAAuB,IAAM,CACjC,cAAc,UAAU,OAAO,WAAW,EAC1C,cAAc,oBACZ,gBACA,oBACF,CACF,EACM,kBAAoB,IAAM,CAC9B,cAAc,UAAU,IAAI,WAAW,EACvC,cAAc,oBACZ,kBACA,iBACF,CACF,EAEA,cAAc,iBAAiB,kBAAmB,iBAAiB,EACnE,cAAc,iBAAiB,gBAAiB,oBAAoB,EAEpE,cAAc,UAAU,OAAO,UAAU,CAC3C,CAAC,CACH,CAAC,CAEL,CAEA,SAAS,SAAU,CACjB,SAAS,KAAK,UAAU,IAAI,WAAW,CACzC,CAEA,MAAM,UAAY,CAChB,QAAS,YACX,EAEM,YAAc,CAClB,IAAK,gBACP,EAKA,SAAS,uBAAwB,CAC/B,SAAS,iBACP,OACC,GAAM,CAEH,EAAE,OAAO,QAAQ,YAAY,GAAK,OAClC,EAAE,OAAO,UAAU,SAAS,UAAU,OAAO,IAE7C,EAAE,OAAO,UAAU,OAAO,UAAU,OAAO,EAC3C,EAAE,OAAO,WAAW,UAAU,OAAO,UAAU,OAAO,EAGpD,EAAE,OAAO,WAAW,WAAW,UAAU,SAAS,UAAU,OAAO,GAEnE,EAAE,OAAO,WAAW,WAAW,UAAU,OAAO,UAAU,OAAO,EAGvE,EACA,EACF,CACF,CAKA,SAAS,mCAAmC,UAAW,CACrD,UAAU,iBAAiB,YAAY,GAAG,EAAE,QAAS,KAAQ,CACvD,IAAI,WACN,IAAI,UAAU,OAAO,UAAU,OAAO,EACtC,IAAI,WAAW,UAAU,OAAO,UAAU,OAAO,EAE7C,IAAI,WAAW,WAAW,UAAU,SAAS,UAAU,OAAO,GAChE,IAAI,WAAW,WAAW,UAAU,OAAO,UAAU,OAAO,EAGlE,CAAC,CACH,CAEA,MAAM,YAAc,CAClB,IAAK,+BACL,UAAW,oBACX,cAAe,qDACjB,EAEM,UAAY,CAChB,WAAY,aACd,EAEM,eAAiB,CACrB,WAAY,GACZ,UAAW,GACX,QAAS,EACX,EAEA,IAAI,iBAAmB,CAAC,EAExB,MAAM,iBAAoB,cAAiB,CACzC,UAAW,YAAY,aACrB,GAAI,SAAS,OAAS,YAAa,CACjC,MAAM,QAAU,SAAS,OACnB,kBAAoB,QAAQ,iBAAiB,YAAY,GAAG,EAC5D,QAAU,QAAQ,iBAAiB,YAAY,SAAS,EAE1D,kBAAkB,QACpB,kBAAkB,QAASC,UAAY,CACrC,gBAAgB,QAAQA,QAAO,CACjC,CAAC,EAGC,QAAQ,QAEV,oBAAoB,OAAO,CAE/B,CAEJ,EAKM,gBAAkB,IAAI,qBAC1B,CAAC,QAAS,WAAa,CACrB,QAAQ,QAAS,OAAU,CACrB,MAAM,iBACR,MAAM,OAAO,UAAU,IAAI,UAAU,UAAU,EAG/C,SAAS,UAAU,MAAM,MAAM,EAEnC,CAAC,CACH,EACA,CACE,KAAM,KACN,WAAY,MACZ,UAAW,CAAC,EAAG,GAAK,IAAM,GAAK,IAAM,CAAC,CACxC,CACF,EAKM,kBAAoB,IAAI,qBAC5B,CAAC,QAAS,WAAa,CACrB,QAAQ,QAAS,OAAU,CACzB,GAAI,MAAM,kBAAmB,CAC3B,MAAM,kBAAoB,MAAM,OAAO,iBACrC,YAAY,GACd,EAEI,kBAAkB,QACpB,kBAAkB,QAAS,MAAS,CAClC,KAAK,UAAU,IAAI,UAAU,UAAU,CACzC,CAAC,EAIH,SAAS,UAAU,MAAM,MAAM,EAG/B,MAAM,aAAe,iBAAiB,QAAQ,IAAM,MAAM,OAAO,EAAE,EAC/D,eAAiB,IACnB,iBAAiB,OAAO,aAAc,CAAC,CAE3C,CACF,CAAC,CACH,EACA,CACE,KAAM,KACN,WAAY,MACZ,UAAW,CAAC,GAAK,IAAM,GAAK,IAAM,CAAC,CACrC,CACF,EAKA,SAAS,sBAAuB,CACT,IAAI,iBAAiB,gBAAgB,EAC7C,QAAQ,SAAS,KAAM,cAAc,CACpD,CAKA,SAAS,8BAA+B,CACtC,MAAM,kBAAoB,SAAS,iBACjC,YAAY,aACd,EAEI,kBAAkB,QACpB,kBAAkB,QAAS,SAAY,CACrC,gBAAgB,QAAQ,OAAO,CACjC,CAAC,CAEL,CAKA,SAAS,6BAA8B,CACrC,MAAM,QAAU,SAAS,iBAAiB,YAAY,SAAS,EAE3D,QAAQ,QAEV,oBAAoB,OAAO,CAE/B,CAEA,SAAS,oBAAoB,QAAS,CAChC,CAAC,QAAQ,QAAU,QAAQ,mBAE/B,QAAQ,QAAS,QAAW,CAC1B,MAAM,YAAc,OAAO,QAAQ,UAGnC,GAAI,aAAe,iBAAiB,QAAQ,WAAW,IAAM,GAAI,CAC/D,MAAM,UAAY,SAAS,cAAc,WAAW,EAEhD,YACF,kBAAkB,QAAQ,SAAS,EACnC,iBAAiB,KAAK,WAAW,EAErC,CACF,CAAC,CACH,CAEA,SAAS,gBAAiB,CACxB,6BAA6B,EAC7B,4BAA4B,EAC5B,qBAAqB,EAGrB,SAAS,iBAAiB,yBAA2B,GAAM,CACzD,MAAM,UAAY,IAAM,EAAE,OAAO,cAAc,mBAAmB,GAAG,GAC/D,aAAe,iBAAiB,QAAQ,SAAS,EAEnD,eAAiB,IACnB,iBAAiB,OAAO,aAAc,CAAC,CAE3C,CAAC,CACH,CAGA,OAAO,oBACL,OAAO,qBACP,SAAU,GAAI,CACZ,IAAI,MAAQ,KAAK,IAAI,EACrB,OAAO,WAAW,UAAY,CAC5B,GAAG,CACD,WAAY,GACZ,cAAe,UAAY,CACzB,OAAO,KAAK,IAAI,EAAG,IAAM,KAAK,IAAI,EAAI,MAAM,CAC9C,CACF,CAAC,CACH,EAAG,CAAC,CACN,EACF,OAAO,mBACL,OAAO,oBACP,SAAU,GAAI,CACZ,aAAa,EAAE,CACjB,EAEE,OAAO,MAAM,SAAS,kBACxB,eAAe,EAGjB,eAAe,EACf,eAAe,EACf,QAAQ,EACR,sBAAsB,EAEtB,OAAO,iBAAiB,mBAAoB,IAAM,CAChD,WAAW,QAAQ,EACnB,YAAY,QAAQ,EACpB,aAAa,QAAQ,EACrB,mCAAmC,QAAQ,EAC3C,QAAQ,EACR,gBAAgB,EAEhB,oBAAoB,IAAM,CACpB,QAAQ,mBACV,SAAS,gBAAgB,UAAU,IAAI,cAAc,CAEzD,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,uBAAyB,GAAM,CACvD,MAAM,UAAY,EAAE,OACpB,YAAY,SAAS,EACrB,aAAa,SAAS,EACtB,WAAW,QAAQ,CACrB,CAAC,EAED,MAAM,UAAY,CAChB,MAAO,YACT,EAEM,YAAc,CAClB,WAAY,sBACZ,mBAAoB,aACtB,EAEA,MAAM,aAAc,CAClB,aAAc,CACZ,KAAK,KAAK,CACZ,CAEA,MAAO,CACL,KAAK,KAAO,OAAO,MAAM,KAGzB,KAAK,KAAO,SAAS,gBACrB,KAAK,KAAO,SAAS,KACrB,KAAK,WAAa,SAAS,cAAc,YAAY,UAAU,EAC/D,KAAK,mBAAqB,SAAS,iBACjC,YAAY,kBACd,EAGA,KAAK,KAAK,UAAU,EACpB,KAAK,KAAK,gBAAgB,EAG1B,KAAK,YAAY,EACjB,KAAK,YAAY,CACnB,CAQA,aAAc,CACR,KAAK,YACP,KAAK,WAAW,iBAAiB,QAAU,OAAU,CACnD,MAAM,eAAe,CACvB,CAAC,EAGC,KAAK,oBACP,KAAK,mBAAmB,QAAS,MAAS,CACxC,KAAK,iBAAiB,QAAU,OAAU,CACxC,MAAM,eAAe,CACvB,CAAC,CACH,CAAC,CAEL,CAQA,aAAc,CACZ,SAAS,iBAAiB,YAAa,IAAM,CAC3C,KAAK,KAAK,UAAU,OAAO,UAAU,KAAK,CAC5C,CAAC,EAED,SAAS,iBAAiB,QAAU,OAAU,CACxC,MAAM,OAAS,OAInB,KAAK,KAAK,UAAU,IAAI,UAAU,KAAK,CACzC,CAAC,CACH,CACF,CAEA,OAAO,KAAO,IAAI,cAKlB,OAAO,MAAM,oBAAsB,SAAU,QAAS,CACpD,OAAO,IAAI,QAAS,SAAY,CAC9B,SAAS,eAAe,MAAO,CACzB,MAAM,QAAU,UAEpB,QAAQ,oBAAoB,eAAgB,cAAc,EAC1D,QAAQ,EACV,CAEA,SAAS,iBAAiB,eAAgB,cAAc,CAC1D,CAAC,CACH,EAKA,OAAO,MAAM,wBAA0B,SAAU,QAAS,CACxD,OAAO,IAAI,QAAQ,CAAC,QAAS,WAAa,CACxC,MAAM,iBAAmB,QAAQ,iBAAiB,YAAY,EAC9D,IAAI,eAAiB,EAErB,SAAS,eAAe,MAAO,CAC7B,iBAEI,iBAAmB,iBAAiB,QAEtC,QAAQ,EAGV,MAAM,OAAO,oBAAoB,eAAgB,cAAc,CACjE,CAEA,iBAAiB,QAAS,SAAY,CACpC,QAAQ,iBAAiB,eAAgB,cAAc,CACzD,CAAC,EAEI,gBAAgB,SAAS,CAChC,CAAC,CACH,EAEA,SAAS,WAAW,OAAQ,CAC1B,KAAK,OAAS,OAAO,QAAU,KAC/B,KAAK,QAAU,OAAO,SAAW,KACjC,KAAK,KAAO,OAAO,MAAQ,KAC3B,KAAK,KAAO,OAAO,MAAQ,IAC7B,CACA,WAAW,UAAY,MAAM,UAE7B,MAAM,UAAY,CAChB,SAAU,cACV,OAAQ,YACR,MAAO,WACP,SAAU,cACV,MAAO,WACP,MAAO,YACP,YAAa,oBACb,OAAQ,YACR,OAAQ,YACR,QAAS,aACT,KAAM,UACN,QAAS,aACT,QAAS,aACT,QAAS,aACT,SAAU,cACV,QAAS,aACT,eAAgB,mBAChB,mBAAoB,sBACtB,EAEM,YAAc,CAClB,WAAY,qBACZ,aAAc,wBACd,eAAgB,0BAChB,eAAgB,0BAChB,aAAc,wBACd,UAAW,mBACX,0BAA2B,+BAC3B,wBAAyB,6BACzB,WAAY,yBACZ,eAAgB,0BAChB,WAAY,cACZ,gBAAiB,2BACjB,UAAW,oBACX,WAAY,qBACZ,eAAgB,qBAChB,SAAU,mBACV,SAAU,mBACV,kBAAmB,kCACnB,0BAA2B,+BAC3B,mBAAoB,8BACpB,UAAW,oBACX,gBAAiB,0BACjB,aAAc,uBACd,eAAgB,qBAChB,oBAAqB,+BACrB,YAAa,sBACb,aAAc,uBACd,kBAAmB,wBACnB,qBAAsB,sBACtB,cAAe,wBACf,KAAM,cACN,YAAa,sBACb,YAAa,uBACb,UAAW,gBACX,aAAc,oBACd,YAAa,2BACb,eAAgB,0BAChB,cAAe,yBACf,SAAU,0BACV,qBAAsB,yBACtB,qBAAsB,yBACtB,aAAc,uBACd,aAAc,uBACd,kBAAmB,6BACnB,gBAAiB,0BACjB,cAAe,wBACf,cAAe,wBACf,eAAgB,wBAChB,aAAc,uBACd,aAAc,uBACd,qBAAsB,gCACtB,eAAgB,yBAChB,SAAU,UACZ,EAEM,aAAe,CACnB,UAAW,kBACX,SAAU,WACV,aAAc,qBACd,kBAAmB,2BACnB,KAAM,YACN,UAAW,kBACX,UAAW,kBACX,KAAM,OACN,eAAgB,wBAChB,gBAAiB,yBACjB,aAAc,qBACd,eAAgB,wBAChB,KAAM,OACN,oBAAqB,6BACrB,qBAAsB,8BACtB,eAAgB,2BAClB,EAEA,MAAM,kBAAkB,WAAY,CAClC,aAAc,CACZ,MAAM,EAEN,KAAK,KAAO,OAAO,MAAM,IAC3B,CAEA,mBAAoB,CAElB,KAAK,SAAW,SAAS,cAAc,YAAY,QAAQ,EAC3D,KAAK,SAAW,SAAS,cAAc,YAAY,QAAQ,EAC3D,KAAK,WAAa,SAAS,cAAc,YAAY,UAAU,EAC/D,KAAK,UAAY,SAAS,cAAc,YAAY,SAAS,EAC7D,KAAK,kBAAoB,SAAS,cAChC,YAAY,iBACd,EACA,KAAK,0BAA4B,SAAS,cACxC,YAAY,yBACd,EACA,KAAK,mBAAqB,SAAS,cACjC,YAAY,kBACd,EACA,KAAK,gBAAkB,SAAS,cAC9B,YAAY,eACd,EACA,KAAK,YAAc,SAAS,cAAc,YAAY,WAAW,EACjE,KAAK,YAAc,SAAS,cAAc,YAAY,WAAW,EACjE,KAAK,MAAQ,SAAS,iBAAiB,YAAY,IAAI,EACvD,KAAK,UAAY,SAAS,cAAc,YAAY,SAAS,EAC7D,KAAK,aAAe,SAAS,iBAAiB,YAAY,YAAY,EACtE,KAAK,gBAAkB,SAAS,cAAc,YAAY,UAAU,EACpE,KAAK,sBAAwB,SAAS,cACpC,YAAY,cACd,EACA,KAAK,cAAgB,SAAS,cAAc,YAAY,aAAa,EACrE,KAAK,UAAY,SAAS,cAAc,YAAY,SAAS,EAC7D,KAAK,qBAAuB,SAAS,cACnC,YAAY,oBACd,EACA,KAAK,qBAAuB,SAAS,cACnC,YAAY,oBACd,EACA,KAAK,SAAW,OAAO,MAAM,SAC7B,KAAK,cAAgB,SAAS,cAAc,YAAY,aAAa,EACrE,KAAK,cAAgB,SAAS,cAAc,YAAY,aAAa,EACrE,KAAK,eAAiB,SAAS,cAAc,YAAY,cAAc,EACvE,KAAK,iBAAmB,CAAC,CAAC,SAAS,cACjC,YAAY,cACd,EACA,KAAK,qBAAuB,SAAS,cACnC,YAAY,oBACd,EACA,KAAK,sBAAwB,CAAC,EAC9B,KAAK,UAAY,SAAS,iBAAiB,YAAY,YAAY,EAGnE,KAAK,KAAO,KAAK,YAAc,KAAK,SAGhC,KAAK,kBACP,KAAK,eAAe,iBAAiB,QAAU,OAAU,CACvD,MAAM,eAAe,EAErB,MAAM,gBAAkB,KAAK,cAAc,MAAM,KAAK,EACtD,KAAK,cAAc,MAAQ,GAEvB,iBACF,KAAK,cAAc,eAAe,CAEtC,CAAC,EAGH,MAAM,iBAAmB,KAAK,MAAQ,UAEpC,KAAK,kBACL,iBAAiB,cAAc,YAAY,YAAY,IAEvD,KAAK,2BAA2B,EAIlC,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,EAC/C,KAAK,UAAY,KAAK,UAAU,KAAK,IAAI,EACzC,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,EAC/C,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EACnD,KAAK,kBAAoB,KAAK,kBAAkB,KAAK,IAAI,EAGzD,SAAS,iBAAiB,iBAAkB,KAAK,YAAY,EAC7D,SAAS,iBAAiB,0BAA2B,KAAK,cAAc,EAEpE,MAAM,SAAS,UAAY,WAC7B,SAAS,iBAAiB,yBAA0B,KAAK,YAAY,EACrE,SAAS,iBACP,0BACA,KAAK,iBACP,GAIF,KAAK,wBAA0B,CAAC,EAChC,KAAK,wBAA0B,CAAC,EAChC,KAAK,+BAA+B,EACpC,KAAK,8CAA8C,EACnD,KAAK,yCAAyC,EAG9C,KAAK,cAAgB,GAAK,KAAK,GAC/B,KAAK,kBAAoB,KAAK,aAAa,OACvC,OACE,KAAK,aAAa,CAAC,EAAE,aAAa,aAAa,iBAAiB,CAClE,EACA,IACA,OAAO,QAAQ,SAAS,KACxB,EAEJ,KAAK,0BAA0B,KAAK,QAAQ,EAC5C,KAAK,eAAe,EAEpB,KAAK,MAAQ,KAAK,MAAM,KAAK,IAAI,EACjC,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,mBAAqB,KAAK,mBAAmB,KAAK,IAAI,EAC3D,KAAK,kBAAoB,OAAO,MAAM,SACpC,KAAK,kBAAkB,KAAK,IAAI,EAChC,EACF,EAEI,KAAK,UACP,KAAK,aAAa,EAGhB,KAAK,OAEP,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EACnD,KAAK,UAAY,KAAK,iBAAiB,GAIzC,KAAK,0BACH,KAAK,0BAA0B,KAAK,IAAI,EAG1C,KAAK,WAAa,KAAK,MAAM,OAC7B,KAAK,wBAA0B,GAC/B,KAAK,iBAAmB,GACxB,KAAK,cAAgB,GAGrB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEtB,SAAS,iBAAiB,oBAAqB,KAAK,kBAAkB,EACtE,SAAS,iBACP,0BACA,KAAK,kBACP,EACA,SAAS,iBAAiB,qBAAsB,KAAK,QAAQ,KAAK,IAAI,CAAC,CACzE,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,iBAAkB,KAAK,YAAY,EAChE,SAAS,oBAAoB,qBAAsB,KAAK,YAAY,EACpE,SAAS,oBACP,0BACA,KAAK,cACP,EACA,SAAS,oBACP,oBACA,KAAK,kBACP,EACA,SAAS,oBACP,0BACA,KAAK,kBACP,EAEI,SAAS,gBAAgB,aAAa,aAAa,YAAY,GACjE,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,CAEJ,CAEA,mBAAoB,CAClB,KAAK,mBAAmB,EAEpB,KAAK,YAAY,UAAU,SAAS,UAAU,IAAI,GACpD,KAAK,KAAK,UAAU,OAAO,UAAU,OAAO,EAG9C,KAAK,UAAU,UAAU,OAAO,UAAU,OAAO,EACjD,KAAK,gBAAgB,UAAU,OAAO,UAAU,QAAQ,EACxD,KAAK,KAAK,iBAAiB,YAAY,SAAS,EAAE,QAAS,MAAS,CAClE,MAAM,kBAAoB,IAAM,CAC9B,KAAK,UAAU,OAAO,UAAU,MAAM,EACtC,KAAK,oBAAoB,eAAgB,iBAAiB,CAC5D,EAEA,KAAK,UAAU,IAAI,UAAU,MAAM,EACnC,KAAK,iBAAiB,eAAgB,iBAAiB,CACzD,CAAC,EAEG,KAAK,kBACP,KAAK,sBAAsB,UAAU,IAAI,QAAQ,CAErD,CAQA,kBAAmB,CACjB,KAAK,MAAQ,SAAS,iBAAiB,YAAY,IAAI,EAEvD,KAAK,MAAM,QAAS,MAAS,CAC3B,KAAK,iBAAiB,oBAAsB,OAAU,CACpD,KAAK,WACH,CACE,GAAI,MAAM,OAAO,GACjB,SAAU,MAAM,OAAO,QACzB,EACA,IACF,CACF,CAAC,CACH,CAAC,CACH,CAQA,kBAAmB,CACM,SAAS,iBAC9B,YAAY,cACd,EAEe,QAAS,QAAW,CACjC,MAAM,KAAO,OAAO,QAAQ,YAAY,IAAI,EAC5C,OAAO,iBAAiB,QAAU,OAAU,CAC1C,MAAM,eAAe,EAEjB,QAAO,UAAU,SAAS,UAAU,QAAQ,GAEhD,KAAK,WACH,CACE,GAAI,OAAO,QAAQ,GACnB,SAAU,CACZ,EACA,IACF,CACF,CAAC,CACH,CAAC,EAEG,KAAK,uBACP,KAAK,sBAAsB,iBAAiB,QAAU,OAAU,CAC9D,MAAM,eAAe,EAErB,KAAK,gBAAgB,UAAU,OAAO,UAAU,QAAQ,CAC1D,CAAC,CAEL,CAQA,aAAa,MAAO,CAClB,IAAI,SAAW,GACX,OAAS,MAAM,OAAO,OAE1B,GAAI,OAAO,aAAa,UAAU,EAAG,OACrC,MAAM,KAAO,OAAO,QAAQ,MAAM,EAGlC,GAAI,CAAC,KAAK,cAAc,EAAG,CACzB,KAAK,eAAe,EACpB,MACF,CAUA,GATA,SAAW,IAAI,SAAS,IAAI,EAEA,CAAC,GAAG,KAAK,QAAQ,EAAE,KAAM,IACnD,GAAG,QAAQ,YAAY,QAAQ,CACjC,IAEE,SAAW,KAAK,yBAAyB,CAAC,GAAG,KAAK,QAAQ,EAAG,QAAQ,GAGnE,OAAS,MAAQ,KAAK,cAAc,eAAe,EACrD,OAEE,MAAM,SAAS,WAAa,UAAY,KAAK,YAC/C,MAAM,eAAe,EAGvB,MAAM,oBAAsB,KAAK,aAC/B,aAAa,mBACf,EACM,qBAAuB,KAAK,aAChC,aAAa,oBACf,EACA,KAAK,wBAA0B,GAC3B,sBAAwB,QAAU,uBAAyB,SAC7D,KAAK,wBAA0B,IAGjC,KAAK,UAAU,SAAU,MAAM,CACjC,CAOA,4BAA6B,CAC3B,MAAM,iBAAmB,KAAK,MAAQ,SAEpC,CAAC,KAAK,kBACN,CAAC,iBAAiB,cAAc,YAAY,YAAY,IAK1D,KAAK,UAAY,iBAAiB,iBAChC,YAAY,YACd,EAEA,KAAK,UAAU,QAAS,UAAa,CACnC,MAAM,aAAe,SAAS,QAAQ,aAEjC,KAAK,sBAAsB,SAAS,YAAY,GACnD,KAAK,sBAAsB,KAAK,YAAY,EAI9C,MAAM,aAAe,SAAS,cAAc,YAAY,cAAc,EAClE,eAEF,aAAa,oBAAoB,QAAS,KAAK,oBAAoB,EAGnE,aAAa,iBAAiB,QAAU,OAAU,CAChD,MAAM,eAAe,EACrB,KAAK,eAAe,YAAY,CAClC,CAAC,EAEL,CAAC,EACH,CAEA,cAAc,aAAc,CAC1B,GAAI,KAAK,sBAAsB,SAAS,YAAY,EAAG,CACrD,KAAK,qBAAqB,UAAU,OAAO,QAAQ,EACnD,KAAK,qBAAqB,YACxB,OAAO,MAAM,QAAQ,yBACvB,MACF,CAEA,KAAK,sBAAsB,KAAK,YAAY,EAC5C,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,GAAG,CAAC,CAC/D,CAEA,eAAe,aAAc,CACtB,KAAK,sBAAsB,SAAS,YAAY,IAErD,KAAK,sBAAwB,KAAK,sBAAsB,OACrD,MAAS,OAAS,YACrB,EACA,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,GAAG,CAAC,EAC/D,CAEA,oBAAoB,eAAgB,CAClC,MAAM,sBAAwB,eAC3B,MAAM,GAAG,EACT,OAAQ,GAAM,CAAC,EACf,IAAI,GACH,KAAK,EAET,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,UAAU,IAAI,QAAQ,EAEjD,MAAM,OAAO,MAAM,OAAO,gBAAiB,CACzC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,OAAQ,kBACV,EACA,KAAM,KAAK,UAAU,CACnB,SAAU,cACZ,CAAC,CACH,CAAC,EACE,KAAM,UAAa,CAClB,GAAI,CAAC,SAAS,GACZ,MAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE,EAE1D,OAAO,SAAS,KAAK,CACvB,CAAC,EACA,KAAM,MAAS,CACd,IAAI,KACJ,GAAI,CACF,KAAO,KAAK,MAAM,IAAI,CACxB,MAAY,CACV,cAAQ,MAAM,wCAAyC,IAAI,EACrD,IAAI,MAAM,oCAAoC,CACtD,CAEI,sBAEA,KAAK,gBACL,MAAM,QAAQ,KAAK,cAAc,GACjC,KAAK,eAAe,KACjB,GAAM,EAAE,OAAS,uBAAyB,EAAE,UAC/C,EAQA,KAAK,cAAgB,IALrB,KAAK,cAAgB,GACrB,KAAK,sBAAwB,KAAK,sBAAsB,OACrD,MAAS,OAAS,qBACrB,GAKF,KAAK,cAAgB,GAGvB,KAAK,QAAQ,CACf,CAAC,EACA,MAAO,OAAU,CAChB,QAAQ,IAAI,KAAK,CACnB,CAAC,CACL,CAYA,yBAAyB,SAAU,SAAU,CAC3C,MAAI,CAAC,SAAS,QAAU,OAAO,UAAa,UAE5C,SAAS,QAAS,SAAY,CAC5B,GAAI,QAAQ,QAAQ,YAAY,QAAQ,EAAG,CACzC,MAAM,IAAM,QAAQ,aAAa,aAAa,IAAI,EAC5C,MAAQ,QAAQ,MAEtB,GAAI,IAAK,CACP,MAAM,OAAS,SAAS,OAAO,GAAG,EAC9B,OAAO,OAAS,GAAG,OAAO,OAAO,OAAO,QAAQ,KAAK,EAAG,CAAC,EAE7D,SAAS,OAAO,GAAG,EACnB,SAAS,IAAI,IAAK,OAAO,CAAC,CAAC,CAC7B,CACF,CACF,CAAC,EAEM,QACT,CAQA,YAAa,CACP,KAAK,oBACP,KAAK,kBAAkB,oBACrB,SACA,KAAK,iBACP,EACA,KAAK,0BAA0B,oBAC7B,QACA,KAAK,iBACP,EACA,KAAK,SAAS,oBAAoB,SAAU,KAAK,iBAAiB,EAElE,KAAK,kBAAkB,iBACrB,SACA,KAAK,iBACP,EACA,KAAK,0BAA0B,iBAC7B,QACA,KAAK,iBACP,EACA,KAAK,SAAS,iBAAiB,SAAU,KAAK,iBAAiB,EAEnE,CAEA,mBAAoB,CAClB,MAAM,cAAgB,SAAS,cAC7B,YAAY,iBACd,EAAE,QACI,WAAa,SAAS,cAAc,YAAY,iBAAiB,EAGvE,GAAK,cASH,WAAW,UAAU,OAAO,UAAU,QAAQ,EAC9C,KAAK,mBAAmB,gBAAgB,aAAa,QAAQ,MAV3C,CAClB,GAAI,SAAS,cAAc,YAAY,iBAAiB,EAAE,OAAS,EACjE,OAGF,WAAW,UAAY,MAAM,QAAQ,oBACrC,KAAK,mBAAmB,aAAa,aAAa,SAAU,EAAI,EAChE,WAAW,UAAU,IAAI,UAAU,QAAQ,CAC7C,CAIF,CAQA,iBAAiB,eAAgB,CACN,eAAe,cACtC,YAAY,cACd,GACkB,iBAAiB,QAAU,GAAM,CACjD,EAAE,eAAe,EAEb,gBACF,eAAe,UAAU,OAAO,UAAU,OAAO,CAErD,CAAC,CACH,CAQA,SAAU,CACR,MAAM,MAAM,OAAO,SAAW,4BAA4B,EACvD,KAAK,KAAK,iBAAiB,EAC3B,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,UAAa,CAClB,MAAM,QAAU,SAAS,cAAc,KAAK,EAC5C,QAAQ,UAAY,SAEpB,MAAM,cAAgB,QAAQ,cAAc,YAAY,UAAU,EAClE,KAAK,MAAM,aAAa,CAC1B,CAAC,EACA,MAAO,OAAU,QAAQ,IAAI,KAAK,CAAC,CACxC,CAWA,UAAU,SAAU,OAAQ,CACtB,KAAK,MACP,KAAK,KAAK,UAAU,IAAI,UAAU,OAAO,EAG3C,MAAM,eAAiB,QAAQ,QAAQ,YAAY,cAAc,EAE7D,SACF,OAAO,UAAU,IAAI,UAAU,OAAO,EACtC,OAAO,SAAW,IAGhB,gBACF,eAAe,UAAU,IAAI,UAAU,OAAO,EAGhD,MAAM,MAAM,OAAO,aAAc,CAC/B,OAAQ,OACR,QAAS,CACP,mBAAoB,iBACpB,OAAQ,wBACV,EACA,KAAM,QACR,CAAC,EACE,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,UAAa,CACd,SAAS,SACX,KAAK,eAAe,SAAU,MAAM,EAEhC,SACF,OAAO,UAAU,OAAO,UAAU,OAAO,EACzC,OAAO,SAAW,IAGhB,CAAC,KAAK,2BAGR,KAAK,MACH,SACF,OAAO,UAAU,OAAO,UAAU,OAAO,EACzC,OAAO,UAAU,IAAI,UAAU,KAAK,EAEpC,OAAO,cACL,IAAI,YAAY,oBAAqB,CACnC,OAAQ,CACN,SACA,MACF,EACA,QAAS,EACX,CAAC,CACH,GAEE,MAAM,SAAS,WAAa,SAC9B,OAAO,SAAW,MAAM,OAAO,UAEjC,KAAK,QAAQ,GAGb,OAAO,SAAW,MAAM,OAAO,SAEnC,CAAC,EACA,MAAO,OAAU,CAChB,KAAK,eAAe,MAAO,MAAM,EACjC,KAAK,kBAAkB,CACzB,CAAC,CACL,CAUA,WAAW,WAAa,CAAC,EAAG,YAAc,KAAM,CAC9C,KAAK,KAAK,UAAU,IAAI,UAAU,OAAO,EAEzC,IAAI,gBAAkB,WAAW,SAC7B,cAAgB,OACd,gBACF,YAAY,UAAU,IAAI,UAAU,OAAO,EAE3C,YAAY,UAAU,IAAI,UAAU,OAAO,GAG/C,KAAK,mBAAmB,EAExB,MAAM,QACJ,KAAK,KAAK,cAAc,IAAI,aAAa,IAAI,KAAK,WAAW,EAAE,IAAI,GACnE,YACI,UAAY,SAAS,aAAa,aAAa,SAAS,EAC1D,SAAS,QAAQ,aAAa,aAAa,SAAS,CAAC,EACrD,EACE,UAAY,SAAS,aAAa,aAAa,SAAS,EAC1D,QAAQ,aAAa,aAAa,SAAS,EAC3C,KAEJ,GAAI,YAAc,EAAG,OAErB,MAAM,KAAO,CACX,KAAM,UACN,SAAU,eACZ,EAEA,MAAM,MAAM,OAAO,gBAAiB,CAClC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,OAAQ,kBACV,EACA,KAAM,KAAK,UAAU,IAAI,CAC3B,CAAC,EACE,KAAM,UACE,SAAS,KAAK,CACtB,EACA,KAAM,OAAU,CAGf,GAFoB,KAAK,MAAM,KAAK,EAEpB,OAAQ,CACtB,KAAK,iBAAmB,GACxB,KAAK,gBAAgB,SAAS,EAC9B,KAAK,mBAAmB,EACxB,KAAK,cAAc,WAAW,EAC9B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAEhC,MACF,CAEA,KAAK,QAAQ,CACf,CAAC,EACA,MAAO,OAAU,CAChB,QAAQ,IAAI,KAAK,EACjB,KAAK,kBAAkB,CACzB,CAAC,CACL,CAOA,cAAc,KAAM,CAClB,MAAM,SAAW,KAAK,cAAc,YAAY,QAAQ,EAClD,IAAM,SAAS,aAAa,OAAO,EACzC,SAAS,MAAQ,IACjB,KAAK,UAAU,OAAO,UAAU,OAAO,CACzC,CAOA,oBAAqB,CACnB,MAAM,OAAS,KAAK,KAAK,iBAAiB,OAAO,EAC3C,QAAU,KAAK,KAAK,iBACxB,WAAW,YAAY,cAAc,EACvC,EAEI,OAAO,QACT,OAAO,QAAS,MAAS,CACvB,KAAK,UAAU,IAAI,UAAU,QAAQ,EACrC,KAAK,KAAK,EACV,KAAK,SAAW,EAClB,CAAC,EAGC,QAAQ,QACV,QAAQ,QAAS,MAAS,CACxB,KAAK,aAAa,aAAa,SAAU,EAAI,CAC/C,CAAC,CAEL,CAOA,mBAAoB,CAClB,MAAM,OAAS,KAAK,KAAK,iBAAiB,OAAO,EAC3C,QAAU,KAAK,KAAK,iBACxB,WAAW,YAAY,cAAc,EACvC,EAEI,OAAO,QACT,OAAO,QAAS,MAAS,CACvB,KAAK,UAAU,OAAO,UAAU,QAAQ,EACxC,KAAK,SAAW,EAClB,CAAC,EAGC,QAAQ,QACV,QAAQ,QAAS,MAAS,CACxB,KAAK,gBAAgB,aAAa,QAAQ,CAC5C,CAAC,EAGH,KAAK,KAAK,UAAU,OAAO,UAAU,OAAO,CAC9C,CAUA,gBAAgB,UAAW,CACzB,KAAK,gBAAgB,cAAc,YAAY,YAAY,EAAE,UAC3D,SACJ,CAQA,oBAAqB,CACd,KAAK,kBAEV,KAAK,gBAAgB,UAAU,OAC7B,UAAU,SACV,KAAK,kBAAoB,KAAK,uBAChC,EAGA,KAAK,wBAA0B,GAC/B,KAAK,iBAAmB,GAC1B,CAUA,kBAAkB,SAAU,CAC1B,OAAK,SAAS,GAUP,SATE,SAAS,KAAK,EAAE,KAAK,SAAU,KAAM,CAM1C,MALU,IAAI,WAAW,CACvB,OAAQ,SAAS,WACjB,QAAS,SAAS,QAClB,IACF,CAAC,CAEH,CAAC,CAGL,CAcA,2BAA4B,EACX,KAAK,OAAO,QAAQ,YAAY,YAAY,EACvD,KAAK,OAAO,QAAQ,YAAY,YAAY,EAC5C,KAAK,OAAO,QAAQ,YAAY,WAAW,IAChB,cAC7B,YAAY,mBACd,GAEgB,UAAU,OAAO,UAAU,OAAO,CACpD,CAEA,eAAe,KAAM,OAAQ,CAC3B,GAAI,KAAK,wBAAyB,OAElC,GAAI,SAAW,KAAM,CAKnB,IAAI,gBAHF,OAAO,QAAQ,YAAY,YAAY,GACvC,OAAO,QAAQ,YAAY,cAAc,GACzC,OAAO,QAAQ,YAAY,aAAa,IACL,cACnC,YAAY,mBACd,EACA,MAAM,mBAAqB,OAAO,QAAQ,YAAY,cAAc,EAWpE,GARE,oBACA,mBAAmB,cAAc,YAAY,mBAAmB,IAEhE,eAAiB,mBAAmB,cAClC,YAAY,mBACd,GAGE,eAAgB,CAClB,IAAI,aAAe,GAAG,KAAK,OAAO,KAAK,KAAK,WAAW,GAEnD,KAAK,SAAW,KAAK,cACvB,aAAe,KAAK,SAGtB,eAAe,UAAY,uBAAuB,YAAY,ueAC9D,eAAe,UAAU,IAAI,UAAU,OAAO,EAC9C,KAAK,iBAAiB,cAAc,CACtC,CAEA,OAAO,cACL,IAAI,YAAY,0BAA2B,CACzC,OAAQ,CACN,SAAU,KACV,MACF,EACA,QAAS,EACX,CAAC,CACH,CACF,CAEA,MAAM,eAAiB,QAAQ,QAAQ,YAAY,cAAc,EAE7D,gBACF,eAAe,cACb,IAAI,YAAY,mBAAoB,CAClC,QAAS,GACT,OAAQ,CACN,QAAS,KAAK,QACd,YAAa,KAAK,YAClB,OAAQ,cACV,CACF,CAAC,CACH,EAGF,KAAK,MAAM,UAAU,OAAO,UAAU,OAAO,CAC/C,CAOA,mBAAmB,MAAO,CACxB,IAAI,QAAU,CAAC,EACX,eAAiB,KACrB,MAAM,SAAW,MAAM,MAAQ,0BACzB,UAAY,MAAM,OAAO,OACzB,iBAAmB,SAAS,cAAc,YAAY,UAAU,EAEtE,QAAQ,KAAK,SAAS,EACtB,eAAiB,UAAU,QAAQ,YAAY,cAAc,EAEzD,kBACF,QAAQ,KAAK,gBAAgB,EAG/B,QAAQ,QAAS,QAAW,CAC1B,OAAO,UAAU,OAAO,UAAU,OAAO,EACpC,UACH,OAAO,UAAU,IAAI,UAAU,KAAK,CAExC,CAAC,EAED,WAAW,IAAM,CACf,QAAQ,QAAS,QAAW,CAC1B,OAAO,UAAU,OAAO,UAAU,KAAK,EAErC,OACG,QAAQ,YAAY,WAAW,GAC9B,UAAU,SAAS,UAAU,cAAc,GAC/C,OACG,QAAQ,YAAY,WAAW,GAC9B,UAAU,SAAS,UAAU,kBAAkB,IAGnD,OAAO,SAAW,GAEtB,CAAC,EAED,gBAAgB,UAAU,OAAO,UAAU,OAAO,CACpD,EAAG,GAAI,CACT,CAQA,2BAA4B,CAC1B,MAAM,eAAiB,KAAK,eAAe,EAE3C,KAAK,KAAK,UAAU,OAAO,UAAU,MAAO,CAAC,cAAc,EAEvD,CAAC,gBAAkB,KAAK,YAC1B,WAAW,IAAM,CACf,KAAK,KAAK,UAAU,KAAK,WAAY,CACnC,eAAgB,KAAK,WAAW,cAC9B,YAAY,eACd,CACF,CAAC,CACH,EAAG,GAAG,CAEV,CAUA,MAAM,KAAM,CACV,MAAM,cAAgB,KAAK,cAAc,YAAY,YAAY,EAC3D,gBAAkB,KAAK,cAAc,YAAY,cAAc,EAC/D,gBAAkB,KAAK,cAAc,YAAY,cAAc,EAE/D,cACJ,gBAAkB,MAClB,kBAAoB,MACpB,kBAAoB,KAEhB,UAAY,KAAK,cAAc,YAAY,YAAY,EACvD,UAAY,KAAK,cAAc,YAAY,SAAS,EAEtD,KAAK,aAAe,YACtB,KAAK,YAAY,UAAY,UAAU,WAGrC,eACF,KAAK,YAAY,UAAY,KAAK,UAE9B,KAAK,uBACP,KAAK,qBAAqB,UAAY,IAGpC,KAAK,uBACP,KAAK,qBAAqB,UAAY,MAGxC,KAAK,YAAY,UAAY,cAAc,UAEvC,KAAK,uBACP,KAAK,qBAAqB,UAAY,gBAAgB,WAGpD,KAAK,uBACP,KAAK,qBAAqB,UAAY,gBAAgB,WAGxD,KAAK,+BAA+B,EACpC,KAAK,8CAA8C,EACnD,KAAK,yCAAyC,GAGhD,KAAK,cACH,eAAiB,cAAc,iBAAiB,YAAY,IAAI,EAAE,OAC9D,cAAc,iBAAiB,YAAY,IAAI,EAAE,OACjD,EACN,KAAK,SACH,WAAa,UAAU,aAAa,aAAa,SAAS,EACtD,SAAS,UAAU,aAAa,aAAa,SAAS,CAAC,EACvD,EACN,KAAK,UAAY,KAAK,iBAAiB,EAEvC,SAAS,cACP,IAAI,YAAY,oBAAqB,CACnC,QAAS,GACT,OAAQ,CACN,UAAW,KAAK,SAClB,CACF,CAAC,CACH,EAGA,KAAK,UAAU,UACb,KAAK,WAAa,EACd,OAAO,MAAM,QAAQ,KACrB,OAAO,MAAM,YACX,KAAK,SACL,MAAM,uBACR,EAEF,KAAK,aAAe,KAAK,gBAC3B,KAAK,WAAa,KAAK,cAEvB,KAAK,0BAA0B,GAI7B,KAAK,YAAY,UAAU,SAAS,UAAU,IAAI,GACpD,KAAK,KAAK,UAAU,IAAI,UAAU,OAAO,EAI3C,KAAK,KAAK,UAAU,OAAO,UAAU,OAAO,EAGvC,KAAK,eAAe,GACvB,KAAK,UACF,iBAAiB,YAAY,SAAS,EACtC,QAAS,MAAS,CACjB,KAAK,UAAU,OAAO,UAAU,QAAQ,CAC1C,CAAC,EAGD,KAAK,mBACH,KAAK,gBACP,KAAK,cAAc,MAAQ,KAAK,sBAAsB,KAAK,GAAG,GAG5D,KAAK,eACP,KAAK,qBAAqB,YACxB,OAAO,MAAM,QAAQ,wBACvB,KAAK,qBAAqB,UAAU,OAAO,QAAQ,GAEnD,KAAK,qBAAqB,UAAU,IAAI,QAAQ,GAIpD,KAAK,0BAA0B,KAAK,QAAQ,EAC5C,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,2BAA2B,EAEhC,SAAS,cACP,IAAI,YAAY,sBAAuB,CACrC,QAAS,EACX,CAAC,CACH,CACF,CAQA,kBAAmB,CACjB,OAAO,MAAM,KACX,KAAK,KAAK,iBAAiB,YAAY,QAAQ,CACjD,EAAE,OACA,CAAC,MAAO,gBAAkB,MAAQ,SAAS,cAAc,KAAK,EAC9D,CACF,CACF,CAQA,gBAAiB,CACf,OAAO,KAAK,WAAa,CAC3B,CAUA,0BAA0B,MAAO,CAC1B,KAAK,aAAa,QAEvB,KAAK,aAAa,QAAS,SAAY,CACrC,MAAM,4BACJ,QAAQ,aAAa,aAAa,YAAY,GAC9C,QAAQ,aAAa,aAAa,YAAY,IAAM,QACpD,OAAS,EACX,QAAQ,UAAU,OAChB,UAAU,QACV,6BAA+B,OAAS,KAAK,iBAC/C,CACF,CAAC,CACH,CAQA,gBAAiB,CAGf,GAFA,KAAK,aAAe,SAAS,iBAAiB,YAAY,YAAY,EAElE,CAAC,KAAK,aAAa,OAAQ,OAE/B,MAAM,aAAe,MAAM,KAAK,SAAW,KAAK,iBAAiB,EAC7D,IACA,KAAK,SAAW,KAAK,kBACnB,QAAU,KAAK,IAAI,aAAe,IAAK,GAAG,EAC1C,WACJ,KAAK,cAAkB,QAAU,IAAO,KAAK,cAAiB,EAC1D,YAAc,OAAO,MAAM,YAC/B,KAAK,kBAAoB,KAAK,SAC9B,MAAM,WACR,EAEA,KAAK,aAAa,QAAS,MAAS,CAClC,MAAM,YAAc,KAAK,cACvB,YAAY,oBACd,EACM,cAAgB,KAAK,cAAc,YAAY,iBAAiB,EAChE,mBAAqB,KAAK,cAAc,YAAY,WAAW,EAEjE,qBACF,mBAAmB,UAAY,YAAY,QAAQ,MAAO,EAAE,GAI1D,cACF,YAAY,MAAQ,SAIlB,eACF,cAAc,MAAM,YAClB,sBACA,GAAG,UAAU,EACf,CAEJ,CAAC,CACH,CAKA,gCAAiC,CAC/B,GACE,KAAK,uBAAyB,MAC9B,KAAK,uBAAyB,KAE9B,OAGF,MAAM,kBACJ,KAAK,sBAAsB,iBACzB,YAAY,uBACd,GAAK,CAAC,EACF,kBACJ,KAAK,sBAAsB,iBACzB,YAAY,uBACd,GAAK,CAAC,EACF,eAAiB,CAAC,GAAG,kBAAmB,GAAG,iBAAiB,EAE9D,eAAe,QACjB,eAAe,QAAS,QAAW,CACjC,OAAO,iBAAiB,QAAU,OAAU,CAC1C,MAAM,eAAe,EAErB,MAAM,UAAY,OACf,QAAQ,YAAY,cAAc,EAClC,aAAa,aAAa,cAAc,EACrC,SAAW,CAAC,CAAC,OAAO,QAAQ,YAAY,YAAY,EACpD,SAAW,CAAC,CAAC,OAAO,QAAQ,YAAY,YAAY,EAEtD,UAAY,CAAC,KAAK,wBAAwB,SAAS,SAAS,IAC9D,KAAK,wBAAwB,KAAK,SAAS,EAC3C,OAAO,eAAe,QACpB,uBACA,KAAK,uBACP,EACA,KAAK,4BAA4B,UAAW,QAAQ,GAGlD,UAAY,CAAC,KAAK,wBAAwB,SAAS,SAAS,IAC9D,KAAK,wBAAwB,KAAK,SAAS,EAC3C,OAAO,eAAe,QACpB,uBACA,KAAK,uBACP,EACA,KAAK,4BAA4B,UAAW,QAAQ,GAGtD,KAAK,yCAAyC,CAChD,CAAC,CACH,CAAC,CAEL,CAKA,+CAAgD,CAChC,CACZ,CACE,IAAK,SACL,WAAY,uBACZ,MAAO,KAAK,uBACd,EACA,CACE,IAAK,SACL,WAAY,uBACZ,MAAO,KAAK,uBACd,CACF,EAEM,QAAQ,CAAC,CAAE,IAAK,WAAY,KAAM,IAAM,CAC5C,MAAM,aAAe,OAAO,eAAe,QAAQ,UAAU,EACzD,cACF,aAAa,MAAM,GAAG,EAAE,QAAS,WAAc,CACxC,MAAM,SAAS,SAAS,GAC3B,MAAM,KAAK,SAAS,EAEtB,KAAK,4BAA4B,UAAW,GAAG,CACjD,CAAC,CAEL,CAAC,CACH,CAEA,4BAA4B,UAAW,KAAO,SAAU,CAKtD,MAAM,OAJU,CACd,OAAQ,KAAK,qBACb,OAAQ,KAAK,oBACf,EACuB,IAAI,EAC3B,GAAI,CAAC,OAAQ,OAEb,MAAM,QAAU,OAAO,cACrB,IAAI,aAAa,cAAc,KAAK,SAAS,IAC/C,EACI,SAAW,QAAQ,YACrB,QAAQ,WAAW,OAAO,CAE9B,CAKA,0CAA2C,CACzC,GAAI,CAAC,KAAK,sBAAwB,CAAC,KAAK,qBAAsB,OAE9D,MAAM,YAAc,KAAK,sBAAsB,iBAC7C,YAAY,cACd,EACM,YAAc,KAAK,sBAAsB,iBAC7C,YAAY,cACd,EACM,aAAe,KAAK,sBAAsB,QAC9C,YAAY,YACd,EACM,aAAe,KAAK,sBAAsB,QAC9C,YAAY,YACd,EAEA,GAAI,CAAC,cAAgB,CAAC,aAAc,OAGpC,MAAM,aAAe,CAAC,OAAQ,MAAO,eAAiB,CACpD,GAAK,SACL,OAAO,UAAU,OAAO,UAAU,OAAQ,CAAC,MAAM,MAAM,EAErD,MAAM,QACN,CAAC,OAAO,aAAa,aAAa,IAAI,GACtC,OAAO,aAAa,YAAY,GAChC,CACA,OAAO,aAAa,aAAa,KAAM,EAAI,EAC3C,MAAM,WAAa,OAAO,cAAc,YAAY,eAAe,EAC/D,aACF,WAAW,MAAM,OAAS,OAE9B,CACF,EAEA,aAAa,aAAc,YAAa,aAAa,cAAc,EACnE,aAAa,aAAc,YAAa,aAAa,cAAc,CACrE,CAOA,oBAAqB,CACnB,KAAK,KAAK,iBAAiB,YAAY,SAAS,EAAE,QAAS,MAAS,CAClE,KAAK,UAAU,OAAO,UAAU,QAAQ,EACxC,KAAK,UAAU,OAAO,UAAU,MAAM,CACxC,CAAC,CACH,CAOA,aAAa,EAAG,CACd,sBAAsB,IAAM,CAC1B,IAAI,KAAO,KAAK,KAEZ,GAAK,EAAE,QAAU,EAAE,OAAO,SAC5B,KAAO,EAAE,OAAO,QAGlB,MAAM,iBAAiB,YAAY,SAAS,EAAE,QAAS,MAAS,CAC9D,KAAK,UAAU,IAAI,UAAU,QAAQ,CACvC,CAAC,CACH,CAAC,CACH,CACF,CAEK,eAAe,IAAI,YAAY,GAClC,eAAe,OAAO,aAAc,SAAS,EAG/C,MAAM,aAAe,CACnB,MAAO,kBACP,MAAO,YACT,EAEA,MAAM,kBAAkB,WAAY,CAClC,aAAc,CACZ,MAAM,EAEN,KAAK,UAAY,KACjB,KAAK,MAAQ,KAAK,aAAa,aAAa,KAAK,EACjD,KAAK,qBAAuB,KAAK,aAAa,KAAK,IAAI,CACzD,CAEA,mBAAoB,CAClB,SAAS,iBAAiB,oBAAqB,KAAK,oBAAoB,CAC1E,CAEA,sBAAuB,CACrB,SAAS,iBAAiB,oBAAqB,KAAK,oBAAoB,CAC1E,CAEA,aAAa,MAAO,CAClB,KAAK,UAAY,MAAM,OAAO,UAC9B,KAAK,OAAO,CACd,CAEA,QAAS,CACP,GAAI,KAAK,YAAc,KAAM,CAC3B,KAAK,aAAa,aAAa,MAAO,KAAK,SAAS,EACpD,IAAI,WAAa,KAAK,UAElB,KAAK,OAAS,KAAK,WAAa,KAAK,QACvC,WAAa,MAGf,KAAK,UAAY,UACnB,CACF,CACF,CAEK,eAAe,IAAI,YAAY,GAClC,eAAe,OAAO,aAAc,SAAS,EAG/C,MAAM,UAAY,CAChB,KAAM,UACN,QAAS,aACT,UAAW,oBACX,kBAAmB,qBACrB,EAEM,YAAc,CAClB,WAAY,cACZ,gBAAiB,2BACjB,kBAAmB,oCACnB,gBAAiB,2BACjB,eAAgB,kBAClB,EAEM,aAAe,CACnB,eAAgB,sBAClB,EAEA,MAAM,mBAAmB,WAAY,CACnC,aAAc,CACZ,MAAM,EAEN,KAAK,iBAAmB,GAExB,KAAK,gBAAkB,KAAK,cAAc,YAAY,eAAe,EACrE,KAAK,gBAAkB,KAAK,cAAc,YAAY,eAAe,EACrE,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EACnD,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,iBAAmB,KAAK,iBAAiB,KAAK,IAAI,EACvD,KAAK,6BACH,KAAK,6BAA6B,KAAK,IAAI,EAC7C,KAAK,uBAAyB,KAAK,uBAAuB,KAAK,IAAI,EACnE,KAAK,0BACH,KAAK,0BAA0B,KAAK,IAAI,EAC1C,KAAK,kBAAoB,KAAK,QAAQ,YAAY,cAAc,EAChE,KAAK,KAAO,OAAO,MAAM,KAEzB,KAAK,gBAAgB,CACvB,CAEA,mBAAoB,CAClB,MAAM,cAAgB,KAAK,QAAQ,YAAY,cAAc,EAG7D,GAAI,OAAO,MAAM,cACf,GAAK,OAAO,QAAQ,WAGb,CACL,MAAM,aAAe,SAAS,cAAc,KAAK,EACjD,aAAa,UAAU,IAAI,UAAU,iBAAiB,EACtD,aAAa,UAAY,sCAEpB,KAAK,cAAc,IAAI,UAAU,iBAAiB,EAAE,GACvD,KAAK,cAAc,YAAY,eAAe,EAAE,OAC9C,YACF,EAGF,KAAK,UAAU,IAAI,UAAU,SAAS,CACxC,KAfgC,CAC9B,cAAc,OAAO,EACrB,MACF,CAeF,OAAO,MAAM,cAAgB,GAE7B,KAAK,iBAAiB,yBAA0B,KAAK,cAAc,EACnE,SAAS,iBAAiB,oBAAqB,KAAK,gBAAgB,EACpE,SAAS,iBAAiB,uBAAwB,KAAK,eAAe,EACtE,SAAS,iBACP,sBACA,KAAK,4BACP,EACA,SAAS,iBACP,uBACA,KAAK,sBACP,EACA,SAAS,iBACP,yBACA,KAAK,sBACP,EACA,SAAS,iBACP,2BACA,KAAK,yBACP,CACF,CAEA,sBAAuB,CACrB,SAAS,oBACP,sBACA,KAAK,4BACP,EACA,SAAS,oBAAoB,oBAAqB,KAAK,gBAAgB,EACvE,SAAS,oBACP,uBACA,KAAK,eACP,EACA,SAAS,oBACP,uBACA,KAAK,sBACP,EACA,SAAS,oBACP,yBACA,KAAK,sBACP,EACA,SAAS,oBACP,2BACA,KAAK,yBACP,EAEI,SAAS,iBAAiB,YAAY,UAAU,EAAE,QAAU,IAC9D,OAAO,MAAM,cAAgB,IAG/B,gBAAgB,CAClB,CAOA,8BAA+B,CACxB,KAAK,kBACR,KAAK,eAAe,CAExB,CAOA,uBAAuB,EAAG,EAEtB,EAAE,OAAO,cAAc,YAAY,cAAc,GACjD,EAAE,OAAO,QAAQ,YAAY,cAAc,GAC3C,EAAE,UAEsB,KAAK,mBAC7B,KAAK,eAAe,EAAI,CAE5B,CAOA,2BAA4B,CACtB,KAAK,kBACP,KAAK,gBAAgB,CAEzB,CAQA,eAAe,UAAY,GAAO,CAC5B,CAAC,WAAa,KAAK,UAAU,SAAS,UAAU,SAAS,IAE7D,KAAK,iBAAmB,GACxB,KAAK,iBACH,KAAK,kBAAoB,KAAK,YAAY,KAAK,IAAI,EACrD,SAAS,KAAK,iBAAiB,QAAS,KAAK,gBAAgB,EAE7D,SAAS,cACP,IAAI,YAAY,yBAA0B,CACxC,OAAQ,CACN,OAAQ,IACV,EACA,QAAS,EACX,CAAC,CACH,EACA,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,EAEA,KAAK,UAAU,IAAI,UAAU,IAAI,EAGjC,KAAK,iCAAiC,EAEtC,OAAO,MAAM,oBAAoB,KAAK,eAAe,EAAE,KAAK,IAAM,CAChE,KAAK,KAAK,UAAU,KAAM,CACxB,eAAgB,KAAK,cAAc,YAAY,eAAe,CAChE,CAAC,CACH,CAAC,EACH,CAQA,iBAAkB,CACX,KAAK,UAAU,SAAS,UAAU,IAAI,IAE3C,KAAK,UAAU,IAAI,UAAU,OAAO,EACpC,KAAK,UAAU,OAAO,UAAU,IAAI,EAEpC,KAAK,iBAAmB,GAExB,SAAS,cACP,IAAI,YAAY,0BAA2B,CACzC,QAAS,EACX,CAAC,CACH,EAEA,KAAK,KAAK,gBAAgB,EAC1B,KAAK,KAAK,qBAAqB,EAE/B,SAAS,KAAK,oBAAoB,QAAS,KAAK,gBAAgB,EAChE,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EAEA,OAAO,MAAM,oBAAoB,KAAK,eAAe,EAAE,KAAK,IAAM,CAChE,KAAK,UAAU,OAAO,UAAU,OAAO,CACzC,CAAC,EACH,CAQA,kBAAmB,CACZ,KAAK,iBAGR,KAAK,gBAAgB,EAFrB,KAAK,eAAe,CAIxB,CAQA,iBAAkB,CAChB,KAAK,gBAAgB,iBAAiB,QAAU,GAAM,CACpD,EAAE,eAAe,EACjB,KAAK,gBAAgB,CACvB,CAAC,EAED,KAAK,iBAAiB,QAAU,GAAM,CAChC,EAAE,OAAS,UACb,KAAK,gBAAgB,CAEzB,CAAC,CACH,CAEA,YAAY,EAAG,CACT,EAAE,OAAO,aAAa,aAAa,cAAc,GACnD,KAAK,gBAAgB,CACzB,CAEA,kCAAmC,CAEjC,MAAM,0BAA4B,KAAK,cACrC,YAAY,yBACd,EACA,GAAI,0BAA2B,CAG7B,MAAM,SAAW,IAAI,iBAAiB,IAAM,CAC1C,KAAK,KAAK,UAAU,KAAM,CACxB,eAAgB,KAAK,cAAc,YAAY,eAAe,CAChE,CAAC,EACD,SAAS,WAAW,CACtB,CAAC,EAID,SAAS,QAAQ,0BAA2B,CAC1C,QAAS,GACT,UAAW,EACb,CAAC,CACH,CACF,CACF,CAEK,eAAe,IAAI,aAAa,GACnC,eAAe,OAAO,cAAe,UAAU,EAGjD,MAAM,4BAA4B,WAAY,CAC5C,aAAc,CACZ,MAAM,EAEN,KAAK,OAAS,KAAK,aAAa,QAAQ,EACxC,KAAK,OAAS,KAAK,OAAO,KAAK,IAAI,EAGnC,KAAK,wBAA0B,KAAK,mBAAmB,KAAK,IAAI,EAChE,KAAK,qBAAuB,KAAK,gBAAgB,KAAK,IAAI,CAC5D,CAEA,mBAAoB,CAElB,KAAK,aAAe,KAAK,iBAAiB,oBAAoB,EAE9D,KAAK,OAAO,EACZ,SAAS,iBAAiB,qBAAsB,KAAK,MAAM,EAE3D,KAAK,aAAa,QAAS,aAAgB,CACzC,MAAM,QAAU,YAAY,cAAc,4BAA4B,EAChE,KAAO,YAAY,cAAc,yBAAyB,EAEhE,SAAS,iBAAiB,QAAS,KAAK,uBAAuB,EAE/D,MAAM,iBAAiB,gBAAiB,KAAK,oBAAoB,CACnE,CAAC,CACH,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,qBAAsB,KAAK,MAAM,EAG1D,KAAK,cACP,KAAK,aAAa,QAAS,aAAgB,CACzC,MAAM,QAAU,YAAY,cAC1B,4BACF,EACM,KAAO,YAAY,cAAc,yBAAyB,EAEhE,SAAS,oBAAoB,QAAS,KAAK,uBAAuB,EAClE,MAAM,oBAAoB,gBAAiB,KAAK,oBAAoB,CACtE,CAAC,EAIH,KAAK,aAAe,IACtB,CAEA,QAAS,CACP,MAAM,cAAgB,CAAC,OAAO,MAAM,SAAS,EAE7C,KAAK,aAAa,QAAS,aAAgB,CACzC,GACE,CAAC,YAAY,aAAa,SAAS,GACnC,CAAC,YAAY,aAAa,QAAQ,EAElC,OAEF,MAAM,cAAgB,YAAY,aAAa,SAAS,EACpD,YAAY,aAAa,SAAS,EAClC,OACE,aAAe,YAAY,aAAa,QAAQ,EAClD,YAAY,aAAa,QAAQ,EACjC,OACE,WACH,eAAiB,eAAiB,QAClC,CAAC,eAAiB,cAAgB,OAC/B,KAAO,YAAY,cAAc,yBAAyB,EAE5D,YACF,YAAY,gBAAgB,UAAU,EACtC,YACG,cAAc,4BAA4B,EAC1C,gBAAgB,UAAU,EAC7B,YAAY,gBAAgB,MAAM,EAElC,KAAK,cAAc,KAAM,EAAE,IAE3B,YAAY,aAAa,WAAY,EAAE,EACvC,YAAY,aAAa,OAAQ,EAAI,EACrC,YACG,cAAc,4BAA4B,EAC1C,aAAa,WAAY,EAAE,EAElC,CAAC,CACH,CAEA,KAAK,YAAa,CAChB,GAAI,YAAY,aAAa,MAAM,GAAK,OAAQ,OAEhD,MAAM,KAAO,YAAY,cAAc,yBAAyB,EAC1D,QAAU,YAAY,cAAc,4BAA4B,EAEtE,YAAY,aAAa,OAAQ,EAAI,EAErC,KAAK,cAAc,KAAM,QAAQ,YAAY,CAC/C,CAEA,MAAM,YAAa,CACjB,GAAI,CAAC,YAAY,aAAa,MAAM,EAAG,OAEvC,MAAM,KAAO,YAAY,cAAc,yBAAyB,EAC1D,QAAU,YAAY,cAAc,4BAA4B,EAEtE,KAAK,cAAc,KAAM,QAAQ,YAAY,EAE7C,YAAY,aAAa,OAAQ,EAAK,EAEtC,WAAW,IAAM,CACf,sBAAsB,IAAM,CAC1B,KAAK,cAAc,KAAM,CAAC,CAC5B,CAAC,CACH,CAAC,CACH,CAEA,cAAc,KAAM,cAAe,CACjC,KAAK,MAAM,OACT,gBAAkB,QAAU,gBAAkB,GAC1C,GAAG,aAAa,KAChB,aACR,CAEA,gBAAgB,MAAO,CACrB,MAAM,KAAO,MAAM,OACb,YAAc,KAAK,QAAQ,oBAAoB,EAEjD,MAAM,SAAW,MAAQ,CAAC,cAE1B,YAAY,aAAa,MAAM,GAAK,QACtC,KAAK,cAAc,KAAM,MAAM,EAG7B,YAAY,aAAa,MAAM,GAAK,UACtC,YAAY,gBAAgB,MAAM,EAClC,KAAK,cAAc,KAAM,EAAE,GAE/B,CAEA,mBAAmB,MAAO,CACxB,MAAM,eAAe,EAGrB,MAAM,YADU,MAAM,OACM,QAAQ,oBAAoB,EAGpD,KAAK,QACP,KAAK,aAAa,QAAS,kBAAqB,CAG5C,iBAAiB,aAAa,MAAM,GACpC,kBAAoB,aAEpB,sBAAsB,IAAM,CAC1B,KAAK,MAAM,gBAAgB,CAC7B,CAAC,CAEL,CAAC,EAGC,YAAY,aAAa,MAAM,EACjC,KAAK,MAAM,WAAW,EAEtB,KAAK,KAAK,WAAW,EAGvB,YAAY,cACV,IAAI,YAAY,oBAAqB,CACnC,QAAS,GACT,OAAQ,CACN,QAAS,WACX,CACF,CAAC,CACH,EACA,YAAY,cACV,IAAI,YAAY,2BAA4B,CAC1C,QAAS,EACX,CAAC,CACH,CACF,CACF,CAEK,eAAe,IAAI,sBAAsB,GAC5C,eAAe,OAAO,uBAAwB,mBAAmB,EAGnE,MAAM,YAAc,CAClB,oBAAqB,+BACrB,MAAO,8BACP,QAAS,wBACT,MAAO,sBACP,SAAU,WACV,MAAO,QACP,aAAc,eAChB,EAEM,aAAe,CACnB,OAAQ,SACR,SAAU,UACZ,EAEA,MAAM,sBAAsB,WAAY,CACtC,aAAc,CACZ,MAAM,EAES,KAAK,cAAc,YAAY,mBAAmB,GACzD,iBAAiB,QAAS,KAAK,YAAY,KAAK,IAAI,CAAC,CAC/D,CAEA,YAAY,MAAQ,GAAM,CAGxB,GAFA,KAAK,cAAc,EAEf,CAAC,KAAK,aAAa,aAAa,MAAM,EAAG,CAC3C,MAAM,QAAU,SAAS,cAAc,KAAK,EACtC,gBAAkB,KAAK,cAC3B,YAAY,QACd,EAAE,QAAQ,kBAAkB,UAAU,EAAI,EAC1C,QAAQ,YAAY,eAAe,EACnC,KAAK,aAAa,aAAa,OAAQ,EAAI,EAE3C,MAAM,aAAe,KAAK,YACxB,QAAQ,cAAc,YAAY,KAAK,CACzC,EACI,OAAO,aAAa,MAAM,EAE5B,aAAa,UAAY,SACzB,aAAa,aAAa,aAAa,QAAQ,GAG/C,aAAa,KAAK,CAEtB,CACF,CAEA,eAAgB,CACd,SAAS,iBAAiB,YAAY,OAAO,EAAE,QAAS,OAAU,CAChE,MAAM,cAAc,YAClB,oDACA,GACF,CACF,CAAC,EACD,SAAS,iBAAiB,YAAY,KAAK,EAAE,QAAS,OAAU,CAC9D,MAAM,cAAc,YAAY,qBAAsB,GAAG,CAC3D,CAAC,EACD,SACG,iBAAiB,YAAY,KAAK,EAClC,QAAS,OAAU,MAAM,MAAM,CAAC,EACnC,SAAS,iBAAiB,YAAY,YAAY,EAAE,QAAS,OAAU,CACjE,MAAM,eAAe,MAAM,cAAc,MAAM,CACrD,CAAC,CACH,CACF,CAEK,eAAe,IAAI,gBAAgB,GACtC,eAAe,OAAO,iBAAkB,aAAa,EAGvD,OAAO,MAAM,cAAgB,OAAO,MAAM,eAAiB,cAO3D,MAAM,UAAY,CAChB,QAAS,YACX,EAEA,MAAM,QAAS,CACb,YAAY,UAAW,aAAc,CAC/B,CAAC,WAAa,CAAC,eAEnB,KAAK,SAAW,KAChB,KAAK,UAAY,UACjB,KAAK,aAAe,aAEpB,KAAK,KAAK,EACZ,CAEA,MAAO,CACL,MAAM,QAAU,CACd,KAAM,KAAK,UACX,UAAW,CAAC,IAAM,GAAK,IAAM,GAAI,CACnC,EAEA,KAAK,SAAW,IAAI,qBAAsB,SAAY,CACpD,QAAQ,QAAS,OAAU,CACrB,MAAM,mBAAqB,IAC7B,MAAM,OAAO,UAAU,IAAI,UAAU,OAAO,EAE5C,MAAM,OAAO,UAAU,OAAO,UAAU,OAAO,CAEnD,CAAC,CACH,EAAG,OAAO,EAEV,KAAK,UAAU,iBAAiB,KAAK,YAAY,GAAG,QAAS,MAAS,CACpE,KAAK,SAAS,QAAQ,IAAI,CAC5B,CAAC,CACH,CAEA,SAAU,CACR,KAAK,SAAS,WAAW,CAC3B,CACF,CAEA,MAAM,UAAY,CAChB,SAAU,cACV,QAAS,aACT,UAAW,eACX,QAAS,YACX,EAEM,YAAc,CAClB,MAAO,WACP,aAAc,uBACd,MAAO,mBACP,OAAQ,oBACV,EAEA,MAAM,eAAgB,CACpB,YAAY,cAAe,CACzB,KAAK,OAAS,cACd,KAAK,OAAS,GACd,KAAK,OAAS,EACd,KAAK,WAAa,EAClB,KAAK,KAAO,EACZ,KAAK,gBAAkB,KACvB,KAAK,YAAc,GACnB,KAAK,SAAW,IAEhB,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EACjD,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,iBAAmB,KAAK,iBAAiB,KAAK,IAAI,EACvD,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EACjD,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,iBAAmB,KAAK,iBAAiB,KAAK,IAAI,EAEvD,KAAK,OAAO,iBAAiB,YAAa,KAAK,eAAe,EAC9D,KAAK,OAAO,iBAAiB,aAAc,KAAK,gBAAgB,EAChE,KAAK,OAAO,iBAAiB,UAAW,KAAK,aAAa,EAC1D,KAAK,OAAO,iBAAiB,YAAa,KAAK,eAAe,EAC9D,KAAK,OAAO,iBAAiB,QAAS,KAAK,iBAAkB,CAC3D,QAAS,EACX,CAAC,EAED,KAAK,OAAO,UAAU,IAAI,UAAU,OAAO,CAC7C,CAEA,gBAAgB,EAAG,CACjB,EAAE,eAAe,EACjB,KAAK,OAAS,GACd,KAAK,OAAS,EAAE,MAAQ,KAAK,OAAO,WACpC,KAAK,WAAa,KAAK,OAAO,WAC9B,KAAK,uBAAuB,CAC9B,CAEA,kBAAmB,CACZ,KAAK,SACV,KAAK,OAAS,GACd,KAAK,sBAAsB,EAC7B,CAEA,eAAgB,CACd,KAAK,OAAS,GACd,KAAK,sBAAsB,CAC7B,CAEA,gBAAgB,EAAG,CACjB,GAAI,CAAC,KAAK,OAAQ,OAClB,EAAE,eAAe,EAIjB,MAAM,MAFI,EAAE,MAAQ,KAAK,OAAO,WAEd,KAAK,QADT,EAER,eAAiB,KAAK,OAAO,WAC7B,UAAY,KAAO,EAAI,EAAI,GAEjC,KAAK,OAAO,UAAU,IAAI,UAAU,SAAU,UAAU,SAAS,EACjE,KAAK,OAAO,WAAa,KAAK,WAAa,KAEvC,KAAK,OAAO,aAAe,iBAC7B,KAAK,KAAO,KAAK,OAAO,WAAa,gBAAkB,UAE3D,CAEA,kBAAmB,CACjB,KAAK,uBAAuB,EAC5B,KAAK,OAAO,UAAU,OAAO,UAAU,SAAS,CAClD,CAEA,uBAAwB,CACtB,KAAK,YAAc,GACnB,KAAK,OAAO,UAAU,OAAO,UAAU,QAAQ,EAC/C,KAAK,uBAAuB,EAC5B,KAAK,cAAc,CACrB,CAEA,wBAAyB,CACvB,qBAAqB,KAAK,eAAe,CAC3C,CAEA,eAAgB,CACd,GAAI,CAAC,KAAK,MAAQ,CAAC,KAAK,YAAa,OAErC,MAAM,MAAQ,KAAK,OAAO,cACxB,GAAG,YAAY,KAAK,IAAI,UAAU,OAAO,EAC3C,EACA,GAAI,CAAC,MAAO,OAEZ,MAAM,IAAM,SAAS,OAAO,iBAAiB,KAAK,EAAE,WAAW,GAAK,EAC9D,WAAa,MAAM,YAAc,IACjC,eAAiB,MAAM,WACvB,UAAY,KAAK,KAAO,EAAI,EAAI,GAChC,eAAiB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAI,GAAG,GAAK,EAEhE,KAAK,cAAgB,KAAK,OAAO,WACjC,KAAK,SAAW,eAAiB,KAAK,cACtC,KAAK,UAAY,YAAY,IAAI,EACjC,KAAK,YAAc,GAGf,UAAY,GAAK,KAAK,KAAO,aAC/B,KAAK,UAAY,WAAa,gBAI5B,UAAY,GAAK,KAAK,KAAO,aAC/B,KAAK,UAAY,WAAa,gBAIhC,KAAK,gBAAkB,sBAAsB,KAAK,UAAU,CAC9D,CAEA,YAAa,CACX,MAAM,YAAc,YAAY,IAAI,EAAI,KAAK,UACvC,eAAiB,WACrB,KAAK,aAAa,KAAK,IAAI,YAAa,KAAK,QAAQ,CAAC,CACxD,EAAE,QAAQ,CAAC,EAEX,KAAK,OAAO,WAAa,eAErB,YAAc,KAAK,SACrB,KAAK,gBAAkB,sBAAsB,KAAK,UAAU,GAE5D,KAAK,OAAO,UAAU,OAAO,UAAU,SAAS,EAGhD,KAAK,KAAO,EACZ,KAAK,YAAc,GAEvB,CAEA,aAAa,EAAG,CACd,UAAK,KAAK,SACV,IACO,KAAK,UAAY,EAAI,EAAI,EAAI,GAAK,KAAK,aAChD,CAEA,SAAU,CACR,KAAK,OAAO,UAAU,OAAO,UAAU,OAAO,EAC9C,KAAK,OAAO,oBAAoB,YAAa,KAAK,eAAe,EACjE,KAAK,OAAO,oBAAoB,aAAc,KAAK,gBAAgB,EACnE,KAAK,OAAO,oBAAoB,UAAW,KAAK,aAAa,EAC7D,KAAK,OAAO,oBAAoB,YAAa,KAAK,eAAe,EACjE,KAAK,OAAO,oBAAoB,QAAS,KAAK,gBAAgB,CAChE,CACF,CAEA,MAAM,YAAc,CAClB,YAAa,sBACb,gBAAiB,0BACjB,YAAa,sBACb,aAAc,uBACd,MAAO,mBACP,OAAQ,oBACV,EAEM,aAAe,CACnB,WAAY,mBACZ,WAAY,mBACZ,YAAa,eACb,sBAAuB,yBACzB,EAEM,UAAY,CAChB,OAAQ,iBACR,QAAS,aACT,mBAAoB,sBACtB,EAEK,eAAe,IAAI,aAAa,GACnC,eAAe,OACb,cAEA,cAAyB,WAAY,CACnC,aAAc,CACZ,MAAM,EAEN,KAAK,cAAgB,GACrB,KAAK,gBAAkB,KACvB,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EACnD,KAAK,mBAAsB,GAAM,KAAK,sBAAsB,CAAC,EAC7D,KAAK,eAAiB,KACtB,KAAK,wBAA0B,KAC/B,KAAK,WAAa,GAClB,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,CACjD,CAEA,mBAAoB,CAClB,KAAK,KAAK,EACV,KAAK,iBAAiB,yBAA0B,KAAK,IAAI,CAC3D,CAEA,MAAO,CACL,KAAK,OAAS,KAAK,cAAc,YAAY,MAAM,EACnD,KAAK,OAAS,KAAK,iBAAiB,YAAY,KAAK,EACrD,KAAK,QAAU,KAAK,iBAAiB,YAAY,WAAW,EAC5D,KAAK,OAAO,UAAU,IAAI,UAAU,kBAAkB,EACtD,KAAK,aAAa,EAClB,SAAS,iBAAiB,qBAAsB,KAAK,YAAY,EAEjE,OAAO,MACJ,wBAAwB,IAAI,EAC5B,KAAK,IAAM,CACV,KAAK,OAAO,UAAU,OAAO,UAAU,kBAAkB,CAC3D,CAAC,EACA,MAAM,IAAM,CACX,KAAK,OAAO,UAAU,OAAO,UAAU,kBAAkB,CAC3D,CAAC,CACL,CAEA,cAAe,CACb,MAAM,YAAc,KAAK,OAAO,YAC1B,YAAc,KAAK,eAAe,EAGxC,GAFkB,YAAc,cAEd,CAAC,OAAO,MAAM,SAAS,GAAK,CAAC,OAAO,MAAM,OAAQ,CAClE,GAAI,KAAK,cAAe,OAExB,KAAK,eAAiB,IAAI,SAAS,KAAK,OAAQ,YAAY,KAAK,EAEjE,KAAK,WAAW,EAChB,KAAK,cAAgB,GAGrB,KAAK,gBAAkB,IAAI,gBAAgB,KAAK,MAAM,CACxD,MACE,KAAK,QAAQ,CAEjB,CAEA,YAAa,CAEX,GAAI,CAAC,KAAK,QAAQ,OAAQ,CACxB,MAAM,YAAc,SAAS,cAAc,KAAK,EAChD,YAAY,UAAU,IAAI,UAAU,MAAM,EAC1C,YAAY,UACV,MAAM,aAAa,KAAO,MAAM,aAAa,KAG/C,KAAK,OAAO,WAAW,EACvB,KAAK,QAAU,KAAK,iBAAiB,YAAY,WAAW,EAC5D,KAAK,WAAa,KAAK,cACrB,IAAI,aAAa,UAAU,GAC7B,EACA,KAAK,WAAa,KAAK,cACrB,IAAI,aAAa,UAAU,GAC7B,CACF,CAEA,KAAK,qBAAqB,EAEtB,KAAK,aAAa,aAAa,WAAW,IAC5C,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAG5B,KAAK,QAAQ,QAAS,aAAgB,CACpC,YAAY,iBAAiB,QAAS,KAAK,kBAAkB,CAC/D,CAAC,CACH,CAEA,sBAAsB,EAAG,CACvB,EAAE,eAAe,EAEjB,MAAM,kBAAoB,KAAK,OAAO,cACpC,GAAG,YAAY,KAAK,IAAI,UAAU,OAAO,EAC3C,EACA,IAAI,MAAQ,KAER,EAAE,OAAO,aAAa,aAAa,UAAU,IAC/C,MAAQ,mBAAmB,wBAGzB,EAAE,OAAO,aAAa,aAAa,UAAU,IAC/C,MAAQ,mBAAmB,oBAG7B,KAAK,UAAU,KAAK,CACtB,CAEA,cAAe,CACb,KAAK,cAAc,IAAI,UAAU,MAAM,EAAE,GAAG,OAAO,CACrD,CAGA,UAAU,MAAO,CACV,OAEL,KAAK,OAAO,SAAS,CACnB,IAAK,EACL,KAAM,MAAM,WACZ,SAAU,QACZ,CAAC,CACH,CAEA,gBAAiB,CACf,OACE,KAAK,OAAO,cAAc,YAAY,KAAK,GAAG,YAC9C,KAAK,OAAO,iBAAiB,YAAY,KAAK,EAAE,MAEpD,CAEA,sBAAuB,CAGrB,GAAI,KAAK,YAAc,KAAK,WAAY,CACtC,MAAM,YAAc,KAAK,OAAO,OAC1B,WAAa,KAAK,OAAO,CAAC,EAC1B,UAAY,KAAK,OAAO,YAAc,CAAC,EAEvC,OAAS,CACb,WAAY,GACZ,UAAW,GACX,QAAS,EACX,EAEM,SAAY,cAAiB,CACjC,UAAW,YAAY,aACrB,GAAI,SAAS,OAAS,aAAc,CAClC,MAAM,MAAQ,SAAS,OACjB,WAAa,EACjB,MAAM,UAAU,SAAS,UAAU,OAAO,EAGxC,OAAS,aACX,KAAK,WAAW,SAAW,YAGzB,OAAS,YACX,KAAK,WAAW,SAAW,WAE/B,CAEJ,EAEI,YAAc,YAChB,KAAK,wBAA0B,IAAI,iBAAiB,QAAQ,EAC5D,KAAK,wBAAwB,QAAQ,WAAY,MAAM,EACvD,KAAK,wBAAwB,QAAQ,UAAW,MAAM,EAE1D,CACF,CAEA,gBAAiB,CACf,GAAI,KAAK,aAAa,aAAa,qBAAqB,EAAG,CACzD,MAAM,eAAiB,KAAK,OAAO,iBAAiB,QAAQ,EAEtD,cAAgB,KAAK,IACzB,EACA,GAAG,MAAM,KAAK,cAAc,EAAE,IAC3B,QAAW,OAAO,YACrB,CACF,EAEA,KAAK,MAAM,YACT,oBACA,GAAG,cAAgB,CAAC,IACtB,EACA,MACF,CAEA,MAAM,cACJ,KAAK,OAAO,cAAc,YAAY,YAAY,GAClD,KAAK,OAAO,cAAc,YAAY,eAAe,GACrD,KAAK,OAAO,cAAc,YAAY,WAAW,GACjD,KAAK,OAEF,eAEL,KAAK,MAAM,YACT,oBACA,GAAG,cAAc,aAAe,CAAC,IACnC,CACF,CAEA,sBAAuB,CACrB,SAAS,iBAAiB,qBAAsB,KAAK,cAAc,CACrE,CAEA,sBAAuB,CACrB,KAAK,QAAQ,EACb,SAAS,oBAAoB,qBAAsB,KAAK,YAAY,CACtE,CAEA,SAAU,CACR,KAAK,cAAgB,GACrB,KAAK,iBAAiB,QAAQ,EAC9B,KAAK,gBAAkB,KACvB,KAAK,gBAAgB,QAAQ,EAC7B,KAAK,eAAiB,KACtB,KAAK,aAAa,EAElB,SAAS,oBACP,qBACA,KAAK,cACP,CACF,CACF,CACF,EAOF,OAAO,MAAM,cAAgB,UAAY,CACvC,MAAM,WAAa,EACjB,SAAS,iBAAiB,yCAAyC,EAChE,OAEC,YAAc,EAClB,SAAS,iBAAiB,iBAAiB,EAAE,OAG/C,OAAO,YAAc,WACvB,EAEA,MAAM,YAAc,CAClB,WAAY,cACZ,iBAAkB,qBAClB,SAAU,qBACV,QAAS,wBACT,0BACE,wEACF,WAAY,eACZ,mBAAoB,oCACpB,MAAO,oBACP,aAAc,2BACd,oBAAqB,6BACrB,QAAS,uBACX,EAEM,UAAY,CAChB,MAAO,oBACP,0BAA2B,mCAC3B,YAAa,qCACb,gBAAiB,mBACjB,OAAQ,oBACR,MAAO,oBACP,YAAa,yBACb,cAAe,gBACjB,EAEM,aAAe,CACnB,OAAQ,cACR,aAAc,qBACd,WAAY,qBACZ,aAAc,qBACd,YAAa,yBACf,EAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OACb,mBACA,cAA8B,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,MAAQ,KAAK,QAAQ,MAC1B,KAAK,QAAU,KAAK,cAAc,YAAY,OAAO,EACrD,KAAK,UAAY,SAAS,iBAAiB,YAAY,QAAQ,EAC/D,KAAK,eAAiB,KACtB,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,SAAW,KAAK,aAAa,aAAa,YAAY,EAE3D,SAAS,KAAK,UAAU,OAAO,UAAU,OAAQ,KAAK,QAAQ,EAG9D,IAAI,wBAA0B,GAC9B,MAAM,0BAA4B,SAAS,cACzC,YAAY,yBACd,EAEE,2BACA,CAAC,0BAA0B,cACzB,YAAY,kBACd,IAEA,wBAA0B,IAG5B,SAAS,KAAK,UAAU,OACtB,UAAU,YACV,KAAK,aAAa,aAAa,WAAW,CAC5C,EACA,SAAS,KAAK,UAAU,OACtB,UAAU,0BACV,uBACF,CACF,CAEA,mBAAoB,CAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAEZ,KAAK,QAAU,UAAY,KAAK,UAClC,KAAK,SAAW,KAAK,YAAY,EACjC,KAAK,YAAY,EAErB,CAEA,aAAc,CACR,mBAAoB,QACtB,KAAK,eAAiB,IAAI,eAAe,KAAK,UAAU,EACxD,KAAK,eAAe,QAAQ,IAAI,GAEhC,SAAS,iBAAiB,eAAgB,KAAK,UAAU,CAE7D,CAEA,mBAAoB,CAClB,KAAK,iBAAiB,IAAI,aAAa,YAAY,GAAG,GAAG,QACtD,QAAW,CACV,OAAO,iBAAiB,QAAS,IAAM,CACrC,IAAI,OACJ,MAAM,IAAM,OAAO,aAAa,aAAa,YAAY,EACrD,OAAO,aAAa,aAAa,YAAY,EAC7C,GACE,cAAgB,SAAS,cAC7B,IAAI,aAAa,MAAM,KAAK,GAAG,IACjC,EACM,aAAe,SAAS,cAC5B,kBAAkB,aAAa,MAAM,GACvC,EAEA,OACE,MAAM,SAAS,iBAAmB,OAClC,CAAC,KAAK,aAAa,2BAA2B,GAC1C,cAAgB,cAGtB,OAAO,cACL,IAAI,YAAY,sBAAuB,CACrC,QAAS,GACT,OAAQ,CACN,MACF,CACF,CAAC,CACH,CACF,CAAC,CACH,CACF,CACF,CAEA,eAAgB,CACd,KAAK,UAAU,QAAS,IAAO,CAC7B,GAAG,QAAW,GAAM,CAClB,EAAE,eAAe,CACnB,CACF,CAAC,CACH,CAEA,YAAa,CACX,GAAI,SAAS,KAAK,YAAc,KAAK,SAAU,CAC7C,KAAK,UAAU,IAAI,UAAU,eAAe,EAG5C,KAAM,CAAE,YAAa,EAAI,OAAO,MAAM,YAAY,EAClD,SAAS,gBAAgB,MAAM,YAC7B,kBACA,GAAG,YAAY,IACjB,CACF,MACE,KAAK,UAAU,OAAO,UAAU,eAAe,CAEnD,CAEA,aAAc,CACZ,MAAM,WAAa,SAAS,cAAc,KAAK,EAC/C,WAAW,UAAU,IAAI,UAAU,MAAO,UAAU,aAAa,EACjE,WAAW,YAAY,KAAK,cAAc,QAAQ,EAAE,UAAU,EAAI,CAAC,EACnE,SAAS,KAAK,YAAY,UAAU,EACpC,MAAM,cAAgB,WAAW,iBAC/B,YAAY,mBACd,EACA,IAAI,SAAW,EACX,OAAS,EAEb,qBAAc,QAAS,SAAY,CACjC,MAAM,aAAe,QAAQ,iBAC3B,YAAY,YACd,EACA,IAAI,UAAY,EACZ,aAAa,SAAW,EAC1B,UAAY,KAAK,gBAAgB,YAAY,EAE7C,UAAY,KAAK,WAAW,YAAY,EAEtC,UAAY,WACd,SAAW,UACX,OAAS,aAAa,OAAS,GAEnC,CAAC,EAED,SAAS,KAAK,YAAY,UAAU,EAC7B,SAAW,MACpB,CAEA,iBAAkB,CACZ,MAAM,SAAS,WAAa,UAEhC,KAAK,iBAAiB,YAAY,gBAAgB,GAAG,QAClD,QAAW,CACV,OAAO,iBAAiB,QAAU,GAAM,CACtC,MAAM,WAAa,SAAS,cAC1B,YAAY,UACd,EAEI,aACF,EAAE,eAAe,EACjB,WAAW,cACT,IAAI,YAAY,wBAAwB,CAC1C,EACA,OAAO,KAAK,YAAc,OAE9B,CAAC,CACH,CACF,CACF,CAEA,kBAAkB,EAAG,CACnB,EAAE,eAAe,EACjB,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,CACF,CAEA,YAAa,CACN,KAAK,WAEV,KAAK,QAAU,GACf,KAAK,IAAM,KAAK,UAChB,KAAK,aAAe,SAAS,cAC3B,YAAY,UACd,GAAG,UACH,KAAK,mBAAqB,KAAK,mBAAmB,KAAK,IAAI,EAC3D,KAAK,YAAe,GAAM,KAAK,SAAS,CAAC,EAEzC,KAAK,OAAO,EACZ,KAAK,YAAY,EACnB,CAEA,QAAS,CACP,SAAS,iBAAiB,eAAgB,KAAK,WAAW,EAC1D,SAAS,iBACP,uBACA,KAAK,kBACP,EACA,SAAS,iBACP,yBACA,KAAK,kBACP,CACF,CAEA,SAAS,EAAG,CACN,EAAE,OAAO,KACP,CAAC,KAAK,SAAW,EAAE,OAAO,SAAW,KAAK,cAC5C,KAAK,YAAY,EAEV,EAAE,OAAO,UAAY,KAAK,cACnC,KAAK,cAAc,CAEvB,CAEA,mBAAmB,MAAO,CACnB,MAAM,OAAO,UAAU,SAAS,UAAU,WAAW,GAG1D,WAAW,IAAM,CACf,KAAK,aAAe,SAAS,cAC3B,YAAY,UACd,GAAG,SACL,CAAC,CACH,CAEA,aAAc,CACR,OAAO,QAAU,KAAK,cACxB,KAAK,YAAY,CAErB,CAEA,aAAc,CACZ,KAAK,IAAI,IAAI,UAAU,KAAK,EAC5B,KAAK,QAAU,EACjB,CAEA,eAAgB,CACT,SAAS,gBAAgB,aAAa,aAAa,UAAU,IAEhE,KAAK,IAAI,OAAO,UAAU,KAAK,EAC/B,KAAK,QAAU,GAEnB,CAEA,gBAAgB,MAAO,CACrB,IAAI,IAAM,CAAC,EACX,aAAM,QAAS,IAAO,CAChB,GAAG,mBACL,IAAI,KAAK,GAAG,kBAAkB,WAAW,CAE7C,CAAC,EACG,IAAI,CAAC,EAAI,IAAI,CAAC,EAChB,IAAI,CAAC,EAAI,IAAI,CAAC,EAEd,IAAI,CAAC,EAAI,IAAI,CAAC,EAEF,IAAI,OAAO,CAAC,EAAG,IAAM,EAAI,CAAC,CAE1C,CAEA,WAAW,MAAO,CAChB,IAAI,MAAQ,EACZ,aAAM,QAAS,IAAO,CACpB,OAAS,GAAG,WACd,CAAC,EACM,KACT,CAEA,sBAAuB,CACjB,mBAAoB,OACtB,KAAK,gBAAgB,UAAU,IAAI,EAEnC,SAAS,oBAAoB,eAAgB,KAAK,UAAU,EAG1D,KAAK,WACP,SAAS,oBAAoB,eAAgB,KAAK,WAAW,EAC7D,SAAS,oBACP,uBACA,KAAK,kBACP,EACA,SAAS,oBACP,yBACA,KAAK,kBACP,EAEJ,CACF,CACF,EAGF,MAAM,YAAc,CAClB,KAAM,kBACN,QAAS,wBACT,QAAS,iBACT,YAAa,uBACb,aAAc,wBACd,UACE,0EACJ,EAEM,UAAY,CAChB,UAAW,aACX,eAAgB,mBAChB,uBAAwB,2BAC1B,EAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OACb,mBAEA,cAA8B,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,QAAU,KAAK,QAAQ,YAAY,OAAO,EAC/C,KAAK,IAAM,KAAK,aAAa,eAAe,EAC5C,KAAK,KAAO,KAAK,cAAc,YAAY,IAAI,EAC/C,KAAK,YAAc,KAAK,UAAU,SAAS,aAAa,EACxD,KAAK,WAAa,SAAS,eAAe,KAAK,GAAG,EAClD,KAAK,kBAAoB,CAC3B,CAEA,mBAAoB,CAClB,KAAK,aAAa,gBAAiB,EAAI,EACvC,KAAK,aAAa,gBAAiB,EAAK,EACxC,KAAK,aAAa,gBAAiB,KAAK,GAAG,EAE3C,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAE5B,KAAK,iBAAiB,wBAA0B,KAAQ,CACtD,KAAK,eAAe,GAAG,CACzB,CAAC,EACD,KAAK,iBAAiB,wBAA0B,KAAQ,CACtD,KAAK,eAAe,GAAG,CACzB,CAAC,CACH,CAEA,eAAe,EAAG,CACZ,GAAK,EAAE,MAAQ,EAAE,OAAS,cAC5B,KAAK,QAAQ,UAAU,IAAI,UAAU,sBAAsB,EAGzD,KAAK,YACP,KAAK,QAAQ,UAAU,IAAI,UAAU,cAAc,EAEnD,KAAK,QAAQ,UAAU,OAAO,UAAU,cAAc,EAExD,KAAK,aAAa,gBAAiB,EAAI,EACvC,KAAK,UAAU,IAAI,UAAU,SAAS,EACtC,KAAK,WAAW,UAAU,IAAI,UAAU,SAAS,EAE7C,KAAK,mBACP,aAAa,KAAK,iBAAiB,EAGrC,KAAK,kBAAoB,WAAW,IAAM,CACxC,KAAK,QAAQ,UAAU,OAAO,UAAU,sBAAsB,CAChE,EAAG,GAAG,CACR,CAEA,gBAAiB,CACf,KAAK,UAAU,OAAO,UAAU,SAAS,EACzC,KAAK,WAAW,UAAU,OAAO,UAAU,SAAS,EACpD,KAAK,aAAa,gBAAiB,EAAK,EACxC,KAAK,QAAQ,UAAU,OACrB,UAAU,eACV,UAAU,sBACZ,CACF,CAEA,wBAAyB,CACvB,MAAM,OAAS,KAAK,iBAAiB,YAAY,OAAO,EACxD,IAAI,KAAO,GACX,OAAO,QAAQ,CAAC,GAAI,QAAU,CAC5B,GAAG,MAAM,gBAAkB,GAAG,MAAQ,KAAO,EAAE,KAC/C,MAAQ,GACV,CAAC,EAEa,KAAK,iBAAiB,YAAY,WAAW,EACrD,QAAQ,CAAC,MAAO,IAAM,CAC1B,MAAM,GAAK,EAAI,IACf,MAAM,MAAM,gBAAkB,GAAG,EAAE,KACnC,MAAM,cACH,iBAAiB,YAAY,YAAY,EACzC,QAAQ,CAAC,WAAY,KAAO,CAE3B,MAAM,IADM,GAAK,GACA,GACjB,WAAW,MAAM,gBAAkB,GAAG,GAAK,EAAE,IAC/C,CAAC,CACL,CAAC,CACH,CAEA,eAAgB,CAEd,KAAK,iBACH,aACA,SAAU,EAAG,CACI,KAAK,UAAU,SAAS,UAAU,SAAS,IAExD,EAAE,eAAe,EACjB,KAAK,eAAe,CAAC,EAEzB,EAAE,KAAK,IAAI,EACX,CAAE,QAAS,EAAK,CAClB,CACF,CAEA,oBAAqB,CACnB,KAAK,iBAAiB,aAAe,GAAM,KAAK,eAAe,CAAC,CAAC,EACjE,KAAK,KAAK,iBAAiB,QAAU,GAAM,KAAK,eAAe,CAAC,CAAC,EAEjE,KAAK,iBAAiB,aAAc,IAAM,KAAK,eAAe,CAAC,EAC/D,KAAK,iBAAiB,WAAa,GAAM,CACxB,KAAK,SAAS,EAAE,aAAa,GAE1C,KAAK,eAAe,CAExB,CAAC,EACD,KAAK,iBAAiB,QAAU,KAAQ,CAClC,IAAI,OAAS,UAGjB,KAAK,eAAe,CACtB,CAAC,CACH,CACF,CACF,EAGF,MAAM,YAAc,CAClB,YAAa,sBACb,YAAa,sBACb,SAAU,yBACV,QAAS,2BACT,QAAS,wBACT,UACE,mEACJ,EAEM,UAAY,CAChB,SAAU,mBACV,KAAM,UACN,QAAS,aACT,UAAW,aACX,YAAa,mBACf,EAEK,eAAe,IAAI,eAAe,GACrC,eAAe,OACb,gBACA,cAA2B,WAAY,CACrC,aAAc,CACZ,MAAM,EAEN,KAAK,KAAO,OAAO,MAAM,KACzB,KAAK,YAAc,GACnB,KAAK,OAAS,KACd,KAAK,YAAc,KAAK,cAAc,YAAY,WAAW,EAC7D,KAAK,SAAW,KAAK,cAAc,YAAY,QAAQ,EACvD,KAAK,cAAgB,KAErB,KAAK,SAAW,KAAK,iBAAiB,YAAY,OAAO,EACzD,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAE3C,KAAK,cAAc,EACnB,KAAK,QAAQ,CACf,CAEA,eAAgB,CACd,KAAK,iBAAiB,sBAAwB,GAAM,CAClD,KAAK,cAAgB,EAAE,QAAQ,OAE3B,KAAK,UAAU,SAAS,UAAU,IAAI,EACxC,KAAK,cACH,IAAI,YAAY,qBAAsB,CACpC,QAAS,EACX,CAAC,CACH,EAEA,KAAK,cACH,IAAI,YAAY,oBAAqB,CACnC,QAAS,EACX,CAAC,CACH,CAEJ,CAAC,EAED,KAAK,iBAAiB,qBAAsB,KAAK,UAAU,EAC3D,KAAK,iBAAiB,oBAAqB,KAAK,UAAU,EAE1D,SAAS,iBAAiB,yBAA0B,KAAK,UAAU,CACrE,CAEA,SAAU,CACR,KAAK,iBAAiB,YAAY,WAAW,GAAG,QAAS,QAAW,CAClE,OAAO,iBAAiB,QAAS,IAAM,CACrC,KAAK,WAAW,CAClB,CAAC,CACH,CAAC,EAED,SAAS,iBAAiB,QAAU,OAAU,CACxC,MAAM,OAAS,UAInB,KAAK,WAAW,CAClB,CAAC,EAED,KAAK,SAAS,iBAAiB,QAAS,IAAM,CAC5C,KAAK,WAAW,CAClB,CAAC,CACH,CAEA,YAAa,CACP,KAAK,cAET,KAAK,YAAc,GAEnB,KAAK,eAAe,aAAa,gBAAiB,EAAI,EACtD,KAAK,UAAU,IAAI,UAAU,KAAM,UAAU,QAAQ,EAErD,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,EAEI,KAAK,cACP,KAAK,KAAK,gBAAgB,EAE1B,OAAO,MAAM,oBAAoB,KAAK,WAAW,EAAE,KAAK,IAAM,CAC5D,KAAK,YAAc,GAEnB,KAAK,KAAK,UAAU,KAAK,YAAa,CACpC,eAAgB,KAAK,cAAc,YAAY,SAAS,CAC1D,CAAC,CACH,CAAC,GAEL,CAEA,YAAa,CACP,KAAK,aAAe,CAAC,KAAK,UAAU,SAAS,UAAU,IAAI,IAG/D,KAAK,YAAc,GAEnB,KAAK,UAAU,IAAI,UAAU,OAAO,EACpC,KAAK,UAAU,OAAO,UAAU,IAAI,EAEpC,KAAK,KAAK,gBAAgB,EAEtB,KAAK,gBACP,KAAK,cAAc,aAAa,gBAAiB,EAAK,EAElD,SAAS,KAAK,UAAU,SAAS,UAAU,SAAS,GACtD,KAAK,cAAc,MAAM,GAI7B,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EAEA,OAAO,MAAM,oBAAoB,KAAK,WAAW,EAAE,KAAK,IAAM,CAC5D,KAAK,UAAU,OAAO,UAAU,QAAS,UAAU,QAAQ,EAE3D,KAAK,YAAc,GAGnB,SAAS,cACP,IAAI,YAAY,wBAAyB,CAAE,QAAS,EAAM,CAAC,CAC7D,CACF,CAAC,EACH,CAEA,sBAAuB,CACrB,SAAS,oBACP,yBACA,KAAK,UACP,CACF,CACF,CACF,EAGF,MAAM,YAAc,CAClB,SAAU,gBACV,UAAW,mBACX,cAAe,sBACf,eAAgB,uBAChB,cAAe,sBACf,cAAe,wBACf,UACE,2EACF,SAAU;AAAA;AAAA;AAAA,+CAIZ,EAEM,UAAY,CAChB,UAAW,aACX,SAAU,YACV,SAAU,YACV,QAAS,aACT,UAAW,cACb,EAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OACb,mBAEA,cAAoC,WAAY,CAC9C,aAAc,CACZ,MAAM,EAEN,KAAK,IAAM,KAAK,GAChB,KAAK,UAAY,KAAK,cAAc,YAAY,SAAS,EACzD,MAAM,YAAc,IAAI,YAAY,aAAa,KAAK,KAAK,GAAG,KAC9D,KAAK,aAAe,IAAI,YAAY,cAAc,KAAK,KAAK,GAAG,KAC/D,KAAK,QAAU,KAAK,cAAc,WAAW,EAC7C,KAAK,KAAO,SAAS,iBAAiB,KAAK,YAAY,EACvD,KAAK,KAAO,KAAK,QAAQ,QAAQ,IAAI,YAAY,aAAa,GAAG,EACjE,KAAK,iBAAmB,KAAK,iBAAiB,YAAY,QAAQ,EAClE,KAAK,cAAgB,KAAK,QAAQ,YAAY,aAAa,EAC3D,KAAK,aAAe,KACpB,KAAK,KAAO,OAAO,MAAM,KAEzB,KAAK,QAAQ,aAAa,gBAAiB,EAAI,EAC/C,KAAK,QAAQ,aAAa,gBAAiB,EAAK,EAChD,KAAK,QAAQ,aAAa,gBAAiB,KAAK,GAAG,EACnD,KAAK,eAAiB,KAAK,eAAe,KAAK,IAAI,EAEnD,KAAK,YAAY,EACjB,KAAK,eAAe,EAEpB,SAAS,iBACP,wBACA,KAAK,cACP,CACF,CAEA,aAAc,CACZ,KAAK,QAAQ,iBAAiB,QAAS,IAAM,CAC3C,KAAK,aAAe,KAAK,QACzB,KAAK,cAAc,CACrB,CAAC,EACD,KAAK,KAAK,QAAS,SAAY,CAC7B,QAAQ,iBAAiB,QAAS,IAAM,CACtC,KAAK,cAAc,CACrB,CAAC,CACH,CAAC,CACH,CAEA,gBAAiB,CACf,KAAK,iBAAiB,QAAU,KAAQ,CACtC,IAAI,gBAAgB,EAChB,IAAI,OAAS,UAIjB,KAAK,cAAc,CACrB,CAAC,CACH,CAEA,mBAAmB,cAAgB,GAAM,CACvC,MAAM,gBAAkB,cACpB,KAAK,cAAc,KAAK,YAAY,EACpC,KAAK,aAET,KAAK,KAAK,gBAAgB,EAEtB,iBAAmB,KAAK,eAC1B,KAAK,KAAK,UAAU,KAAK,cAAe,CACtC,eAAgB,SAAS,KAAK,UAAU,SACtC,UAAU,OACZ,EACI,gBACA,IACN,CAAC,CAEL,CAEA,cAAc,MAAQ,GAAO,CAC3B,MAAM,YAAc,SAAS,KAAK,KAAK,QAAQ,cAAe,EAAE,EAAI,EACpE,KAAK,KAAK,aAAa,YAAY,cAAe,WAAW,EAC7D,KAAK,KAAK,UAAU,IAAI,UAAU,QAAQ,EAC1C,KAAK,UAAU,UAAU,IAAI,UAAU,QAAQ,EAC/C,MAAM,eAAiB,MACnB,IAAI,YAAY,QAAQ,KAAK,UAAU,QAAQ,GAC/C,IAAI,YAAY,QAAQ,KAAK,WAAW,KACtC,YAAc,KAAK,KAAK,iBAAiB,cAAc,EACzD,YAAY,QACd,YAAY,QAAS,SAAY,CAC/B,QAAQ,UAAU,OAAO,UAAU,QAAQ,CAC7C,CAAC,EAGH,MAAM,SAAW,MACb,KAAK,KAAK,iBACR,IAAI,UAAU,SAAS,MAAM,UAAU,QAAQ,EACjD,EACA,KAAK,iBACT,SAAS,QAAQ,CAAC,QAAS,QAAU,CACnC,MAAM,YAAc,SAAS,OAAS,GAAK,MAC3C,QAAQ,UAAU,OAAO,UAAU,SAAS,EACxC,QACF,QAAQ,UAAU,OAAO,UAAU,QAAQ,EAC3C,KAAK,KAAK,UAAU,OAAO,UAAU,QAAQ,GAE/C,MAAM,kBAAoB,IAAM,CAE5B,SAAS,KAAK,KAAK,aAAa,YAAY,aAAa,CAAC,IAC1D,aAEA,KAAK,UAAU,UAAU,OAAO,UAAU,SAAS,EAErD,KAAK,UAAU,UAAU,OAAO,UAAU,QAAQ,EAClD,KAAK,KAAK,UAAU,OAAO,UAAU,QAAQ,EAEzC,cACF,KAAK,KAAK,gBAAgB,EACrB,OACH,KAAK,mBAAmB,EAAK,GAIjC,QAAQ,oBAAoB,eAAgB,iBAAiB,CAC/D,EAEI,OAAO,MAAM,SAAS,iBACxB,QAAQ,iBAAiB,eAAgB,iBAAiB,EAE1D,kBAAkB,CAEtB,CAAC,CACH,CAEA,eAAgB,CACd,IAAI,oBAAsB,KAC1B,MAAM,OAAS,KAAK,QAAQ,IAAI,UAAU,SAAS,EAAE,EACrD,IAAI,sBAAwB,KAAK,KAE7B,SACF,sBAAwB,QAG1B,sBAAsB,SAAS,CAC7B,IAAK,EACL,KAAM,EACN,SAAU,QACZ,CAAC,EAED,sBAAsB,UAAU,IAAI,UAAU,SAAS,EAEvD,MAAM,0BAA4B,IAAM,CAClC,sBAAsB,WAAa,GACrC,sBAAsB,UAAU,OAAO,UAAU,SAAS,EACtD,qBACF,qBAAqB,mBAAmB,GAG1C,oBAAsB,sBACpB,yBACF,CAEJ,EAEA,oBAAsB,sBACpB,yBACF,EAEA,MAAM,YAAc,SAAS,KAAK,KAAK,QAAQ,cAAe,EAAE,EAC1D,YAAc,YAAc,EAClC,KAAK,UAAU,UAAU,IAAI,UAAU,SAAS,EAChD,KAAK,KAAK,aAAa,YAAY,cAAe,WAAW,EAE7D,MAAM,YAAc,KAAK,KAAK,iBAC5B,IAAI,YAAY,QAAQ,KAAK,WAAW,IAC1C,EACI,YAAY,QACd,YAAY,QAAQ,CAAC,QAAS,QAAU,CACtC,MAAM,YAAc,YAAY,OAAS,GAAK,MAC9C,QAAQ,UAAU,IAAI,UAAU,QAAQ,EACxC,MAAM,kBAAoB,IAAM,CAC9B,QAAQ,UAAU,OAAO,UAAU,QAAQ,EAEzC,SACE,KAAK,KAAK,aAAa,YAAY,aAAa,CAClD,IAAM,aAEN,QAAQ,UAAU,IAAI,UAAU,QAAQ,EAGtC,aACF,KAAK,mBAAmB,EAE1B,QAAQ,oBAAoB,eAAgB,iBAAiB,CAC/D,EAEI,OAAO,MAAM,SAAS,iBACxB,QAAQ,iBAAiB,eAAgB,iBAAiB,EAE1D,kBAAkB,CAEtB,CAAC,CAEL,CAEA,gBAAiB,CAEb,KAAK,MACL,KAAK,KAAK,aAAa,YAAY,aAAa,GAChD,SAAS,KAAK,KAAK,aAAa,YAAY,aAAa,CAAC,EAAI,IAE9D,KAAK,cAAc,EAAI,EAErB,SAAS,KAAK,KAAK,aAAa,YAAY,aAAa,CAAC,EAAI,GAE9D,KAAK,KAAK,aAAa,YAAY,cAAe,CAAC,EAGzD,CAEA,sBAAuB,CACrB,SAAS,oBACP,wBACA,KAAK,cACP,CACF,CACF,CACF,EAGF,MAAM,YAAc,CAClB,QAAS,UACT,QAAS,iBACT,aAAc,uBACd,MAAO,6BACP,WAAY,aACd,EAEM,aAAe,CACnB,gBAAiB,wBACjB,aAAc,oBAChB,EAEM,UAAY,CAChB,KAAM,SACR,EACA,MAAM,sBAAsB,WAAY,CACtC,aAAc,CACZ,MAAM,EACN,KAAK,QAAU,KAAK,cAAc,YAAY,OAAO,EACrD,KAAK,iBAAmB,KAAK,cAAc,YAAY,OAAO,EAC9D,KAAK,aAAe,KAAK,cAAc,YAAY,YAAY,EAC/D,KAAK,0BACH,KAAK,0BAA0B,KAAK,IAAI,EAC1C,KAAK,sBAAwB,KAAK,sBAAsB,KAAK,IAAI,EACjE,KAAK,WAAa,KAAK,QAAQ,YAAY,UAAU,EACrD,KAAK,KAAO,OAAO,MAAM,IAC3B,CAEA,mBAAoB,CAClB,KAAK,QAAQ,iBACX,gBACA,KAAK,yBACP,EACA,KAAK,iBAAiB,iBACpB,QACC,OAAU,MAAM,KAAK,YAAY,IAAM,UAAY,KAAK,MAAM,CACjE,EACA,KAAK,iBAAiB,iBACpB,SACA,KAAK,qBACP,EACA,KAAK,aAAa,iBAAiB,QAAS,KAAK,MAAM,KAAK,IAAI,CAAC,CACnE,CAEA,sBAAsB,MAAO,CACvB,MAAM,OAAO,aAAa,MAAM,GAClC,KAAK,KAAK,CAEd,CAEA,0BAA0B,MAAO,CAC3B,MAAM,SAAW,KAAK,UAErB,KAAK,UAAU,SAAS,UAAU,IAAI,GAIzC,MAAM,eAAiB,aACvB,MAAM,eAAiB,YAGvB,KAAK,KAAK,UAAU,KAAK,QAAS,CAChC,eAAgB,KAAK,QAAQ,cAAc,YAAY,KAAK,CAC9D,CAAC,GATD,KAAK,iBAAiB,gBAAgB,MAAM,EAC5C,KAAK,KAAK,gBAAgB,GAU9B,CAEA,YAAY,MAAO,EAEf,CAAC,KAAK,SAAS,MAAM,MAAM,GAC3B,MAAM,OAAO,aAAa,aAAa,eAAe,IAEtD,KAAK,MAAM,CACf,CAEA,MAAO,CACL,KAAK,iBACH,KAAK,kBAAoB,KAAK,YAAY,KAAK,IAAI,EAErD,SAAS,KAAK,iBAAiB,QAAS,KAAK,gBAAgB,EAExD,SAAS,gBAAgB,aAAa,aAAa,YAAY,GAClE,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,EAGF,sBAAsB,IAAM,CAC1B,KAAK,UAAU,IAAI,UAAU,IAAI,CACnC,CAAC,CACH,CAEA,OAAQ,CACN,KAAK,UAAU,OAAO,UAAU,IAAI,EAEpC,SAAS,KAAK,oBAAoB,QAAS,KAAK,gBAAgB,EAE3D,KAAK,YACR,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,CAEJ,CACF,CAEK,eAAe,IAAI,uBAAuB,GAC7C,eAAe,OAAO,wBAAyB,aAAa,EAG9D,MAAM,YAAc,CAClB,YAAa,uBACb,gBAAiB,2BACjB,YAAa,sBACf,EAEM,UAAY,CAChB,OAAQ,QACV,EAEA,MAAM,yBAAyB,WAAY,CACzC,aAAc,CACZ,MAAM,EAEN,KAAK,MAAQ,KAAK,cAAc,YAAY,WAAW,EACvD,KAAK,YAAc,KAAK,cAAc,YAAY,WAAW,EAEzD,KAAK,QACP,KAAK,MAAM,KAAK,iBAAiB,QAAS,KAAK,YAAY,KAAK,IAAI,CAAC,EACrE,KAAK,MAAM,iBACT,QACA,OAAO,MACJ,SAAU,OAAU,CACnB,KAAK,SAAS,KAAK,CACrB,EAAG,GAAG,EACL,KAAK,IAAI,CACd,EAEJ,CAEA,mBAAoB,CAClB,MAAM,cAAgB,KAAK,YAAY,UAAU,SAC/C,UAAU,MACZ,EACI,KAAK,MAAM,MAAM,OAAS,GAAK,cACjC,KAAK,YAAY,UAAU,OAAO,UAAU,MAAM,EACzC,KAAK,MAAM,MAAM,SAAW,GAAK,CAAC,eAC3C,KAAK,YAAY,UAAU,IAAI,UAAU,MAAM,CAEnD,CAEA,UAAW,CACT,KAAK,kBAAkB,CACzB,CAEA,iBAAkB,CAChB,MAAO,CAAC,SAAS,cAAc,YAAY,eAAe,CAC5D,CAEA,YAAY,MAAO,CAEjB,MAAM,eAAe,EAEjB,KAAK,gBAAgB,IACvB,KAAK,MAAM,MAAQ,GACnB,KAAK,kBAAkB,EACvB,MAAM,OAAO,cAAc,YAAY,WAAW,EAAE,MAAM,EAE9D,CACF,CAEA,eAAe,OAAO,qBAAsB,gBAAgB,EAE5D,MAAM,YAAc,CAClB,YAAa,sBACf,EAEA,MAAM,mBAAmB,gBAAiB,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,gBAAkB,SAAS,iBAAiB,YAAY,WAAW,EACxE,KAAK,oBAAoB,CAC3B,CAEA,qBAAsB,CACpB,IAAI,eAAiB,CAAC,EACtB,KAAK,gBAAgB,QAAS,OAAU,eAAe,KAAK,MAAM,IAAI,CAAC,EACvE,KAAK,MAAM,iBAAiB,QAAS,KAAK,aAAa,KAAK,IAAI,CAAC,EAC7D,iBAAe,OAAS,KAC5B,eAAe,QAAS,MACtB,KAAK,iBAAiB,QAAS,KAAK,YAAY,KAAK,IAAI,CAAC,CAC5D,EACA,KAAK,gBAAgB,QAAS,OAC5B,MAAM,iBAAiB,QAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,CACzD,EACF,CAEA,YAAY,MAAO,CACjB,MAAM,YAAY,KAAK,EACnB,MAAM,gBAAgB,GACxB,KAAK,WAAW,GAAI,KAAK,KAAK,CAElC,CAEA,QAAQ,MAAO,CACb,MAAM,OAAS,MAAM,OACrB,KAAK,WAAW,OAAO,MAAO,MAAM,CACtC,CAEA,cAAe,CACT,OAAO,MAAM,SAAS,GACxB,KAAK,eAAe,CAAE,SAAU,QAAS,CAAC,CAE9C,CAEA,WAAW,MAAO,OAAQ,CACxB,KAAK,gBAAgB,QAAS,OAAU,CAClC,QAAU,SACZ,MAAM,MAAQ,MAElB,CAAC,CACH,CACF,CAEK,eAAe,IAAI,aAAa,GACnC,eAAe,OAAO,cAAe,UAAU,EAGjD,MAAM,YAAc,CAClB,UAAW,mBACX,mBAAoB,8BACpB,mBAAoB,6BACtB,EAEM,UAAY,CAChB,OAAQ,WACV,EAEM,aAAe,CACnB,gBAAiB,wBACjB,wBAAyB,gCAC3B,EAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OACb,mBACA,cAA8B,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,UAAY,KAAK,cAAc,YAAY,SAAS,EACzD,KAAK,UAAY,KAAK,cAAc,YAAY,kBAAkB,EAClE,KAAK,UAAY,KAAK,cAAc,YAAY,kBAAkB,EAClE,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,iBAAiB,wBAAyB,KAAK,eAAe,CACrE,CAEA,mBAAoB,CAClB,SAAS,iBAAiB,eAAgB,KAAK,eAAe,EAE1D,KAAK,UAAU,aAAa,aAAa,eAAe,GAC1D,KAAK,uBAAuB,EAG1B,KAAK,WAAa,KAAK,YACzB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EAEzB,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,eAAgB,KAAK,eAAe,CACnE,CAEA,QAAS,CACP,KAAK,UAAU,iBAAiB,QAAU,OAAU,CAClD,MAAM,eAAe,EAErB,KAAK,SAAS,CAChB,CAAC,EAED,KAAK,UAAU,iBAAiB,QAAU,OAAU,CAClD,MAAM,eAAe,EAErB,KAAK,SAAS,CAChB,CAAC,EAED,KAAK,UAAU,iBAAiB,SAAU,IAAM,CAC9C,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,CACvB,CAAC,CACH,CAEA,UAAW,CAMT,MAAM,UALW,KAAK,UAAU,aAC9B,aAAa,uBACf,EACI,KAAK,UAAU,sBAAsB,EAAE,MACvC,KAAK,UAAU,sBAAsB,EAAE,MAAQ,GACvB,KAAK,UAAU,WAE3C,KAAK,KAAK,QAAQ,EAElB,KAAK,UAAU,UAAU,OAAO,UAAU,MAAM,EAEhD,KAAK,gBAAgB,CACvB,CAEA,UAAW,CACT,MAAM,SAAW,KAAK,UAAU,aAC9B,aAAa,uBACf,EACI,KAAK,UAAU,sBAAsB,EAAE,MACvC,KAAK,UAAU,sBAAsB,EAAE,MAAQ,EAC7C,SAAW,KAAK,UAAU,WAAa,SAE7C,KAAK,KAAK,QAAQ,EAElB,KAAK,UAAU,UAAU,OAAO,UAAU,MAAM,EAEhD,KAAK,gBAAgB,CACvB,CAEA,iBAAkB,CAChB,sBAAsB,IAAM,CAC1B,KAAK,WAAW,UAAU,OACxB,UAAU,OACV,KAAK,MACH,KAAK,UAAU,WACb,KAAK,UAAU,sBAAsB,EAAE,MACvC,CACJ,GAAK,KAAK,UAAU,WACtB,CACF,CAAC,CACH,CAEA,iBAAkB,CAChB,sBAAsB,IAAM,CAC1B,KAAK,UAAU,UAAU,OACvB,UAAU,OACV,KAAK,UAAU,YAAc,CAC/B,CACF,CAAC,CACH,CAEA,wBAAyB,CACvB,CAAC,EAAE,QAAQ,KAAK,KAAK,UAAU,SAAW,SAAY,CACpD,QAAQ,iBAAiB,QAAU,OAAU,CAC3C,MAAM,eAAe,EAErB,KAAK,KAAK,QAAQ,WAAa,QAAQ,WAAW,CACpD,CAAC,CACH,CAAC,CACH,CAEA,KAAK,WAAY,CACf,KAAK,UAAU,SAAS,CACtB,IAAK,EACL,KAAM,WACN,SAAU,QACZ,CAAC,CACH,CACF,CACF,EAGF,MAAM,YAAc,CAClB,WAAY,qBACZ,aAAc,uBACd,iBAAkB,4BAClB,YAAa,sBACb,cAAe,uBACf,iBAAkB,uBAClB,gBAAiB,mBACjB,QAAS,qBACX,EAEM,UAAY,CAChB,YAAa,uBACb,QAAS,aACT,OAAQ,YACR,cAAe,kBACjB,EAEM,aAAe,CACnB,aAAc,gBACd,YAAa,eACb,UAAW,aACX,iBAAkB,0BAClB,OAAQ,QACV,EAEK,eAAe,IAAI,eAAe,GACrC,eAAe,OACb,gBACA,cAAqB,WAAY,CAC/B,aAAc,CACZ,MAAM,CACR,CAEA,mBAAoB,CAClB,KAAK,WAAa,KAAK,cAAc,YAAY,UAAU,EAC3D,KAAK,aAAe,KAAK,cAAc,YAAY,YAAY,EAC/D,KAAK,iBAAmB,KAAK,cAC3B,YAAY,gBACd,EACA,KAAK,YACH,KAAK,cAAc,YAAY,WAAW,GAC1C,KAAK,WAAW,cAAc,YAAY,WAAW,EACvD,KAAK,cAAgB,KAAK,iBAAiB,YAAY,aAAa,EACpE,KAAK,gBAAkB,KAAK,WAAW,QACrC,YAAY,eACd,EACA,KAAK,gBAAkB,KAAK,aAAa,aAAa,MAAM,EAE5D,KAAK,yBAA4B,KAC/B,KAAK,sBAAsB,GAAG,EAChC,KAAK,uBAA0B,KAAQ,KAAK,oBAAoB,GAAG,EACnE,KAAK,sBAAyB,KAAQ,KAAK,mBAAmB,GAAG,EACjE,KAAK,WAAc,KAAQ,KAAK,QAAQ,GAAG,EAC3C,KAAK,eAAkB,KAAQ,KAAK,YAAY,GAAG,EAEnD,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,uBAAuB,CAC9B,CAEA,mBAAmB,IAAK,CAEtB,MAAM,aADS,IAAI,cAEV,aAAa,aAAa,YAAY,IAAM,OAErD,GAAI,KAAK,gBAAiB,CACxB,MAAM,qBAAuB,KAAK,gBAAgB,cAChD,YAAY,gBACd,EAEI,sBACF,qBAAqB,UAAU,OAC7B,UAAU,QACV,CAAC,YACH,EAGF,KAAK,WAAW,MAAM,UAAY,GAAG,KAAK,IAAI,KAAK,aAAa,sBAAsB,EAAE,OAAS,KAAK,gBAAgB,sBAAsB,EAAE,MAAM,CAAC,IACvJ,CAEA,IAAI,cAAc,aAChB,aAAa,aACb,CAAC,YACH,EACA,KAAK,WAAW,UAAU,OAAO,UAAU,WAAW,EACtD,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAExB,SAAS,KAAK,iBAAiB,QAAS,KAAK,cAAc,CAC7D,CAEA,sBAAsB,IAAK,CACD,KAAK,SAAS,IAAI,aAAa,GAGrD,KAAK,UAAU,CAEnB,CAEA,oBAAoB,IAAK,CACvB,MAAM,aAAe,IAAI,cAAc,SAAS,IAAI,aAAa,EAC/C,KAAK,WAAW,UAAU,SAC1C,UAAU,WACZ,GAEiB,CAAC,cAChB,KAAK,UAAU,CAEnB,CAEA,oBAAqB,CACnB,MAAM,OAAS,KAAK,cAAc,YAAY,YAAY,EACpD,UACJ,KAAK,sBAAsB,EAAE,IAAM,KAAK,aAEpC,eAAiB,IAAM,CACvB,OAAO,aAAa,aAAa,YAAY,IAAM,QACrD,KAAK,WAAW,UAAU,OAAO,UAAU,aAAa,EAG1D,KAAK,WAAW,oBACd,gBACA,cACF,CACF,EAEI,OAAO,aAAa,aAAa,YAAY,IAAM,OACjD,OAAO,YAAc,EAAI,WAC3B,KAAK,WAAW,UAAU,IAAI,UAAU,aAAa,EAGvD,KAAK,WAAW,iBAAiB,gBAAiB,cAAc,CAEpE,CAEA,wBAAyB,CACvB,KAAK,WAAW,MAAM,YAAY,cAAe,OAAO,EACxD,KAAK,WAAW,MAAM,YAAY,eAAgB,OAAO,EAEzD,sBAAsB,IAAM,CAC1B,KAAK,WAAW,MAAM,YACpB,cACA,GAAG,SAAS,SAAS,KAAK,YAAc,KAAK,WAAW,sBAAsB,EAAE,IAAI,CAAC,IACvF,EACA,KAAK,WAAW,MAAM,YACpB,eACA,GAAG,SAAS,SAAS,KAAK,aAAe,KAAK,WAAW,sBAAsB,EAAE,GAAG,CAAC,IACvF,CACF,CAAC,CACH,CAEA,kBAAkB,IAAK,CAGrB,GAFa,IAAI,OAAO,QAAQ,YAAY,aAAa,EAEhD,WAAW,KAAK,QAAU,IAAK,CACtC,IAAI,eAAe,EAEnB,MAAM,UAAY,IAAI,cAAc,aAClC,aAAa,SACf,EACI,IAAI,cAAc,aAAa,aAAa,SAAS,EACrD,GAOJ,GANA,KAAK,YAAY,MAAQ,UAErB,KAAK,YAAY,UACnB,KAAK,YAAY,gBAAgB,UAAU,EAGzC,KAAK,gBACP,KAAK,YAAY,SAAS,MACrB,CACL,MAAM,cAAgB,IAAI,cAAc,cAClC,kBAAoB,KAAK,WAAW,cACxC,IAAI,UAAU,MAAM,EACtB,EACM,gBAAkB,KAAK,WAAW,cACtC,IAAI,aAAa,WAAW,GAC9B,EAEA,KAAK,YAAY,cAAc,IAAI,MAAM,QAAQ,CAAC,EAE9C,oBACF,kBAAkB,UAAU,OAAO,UAAU,MAAM,EACnD,cAAc,UAAU,IAAI,UAAU,MAAM,GAI5C,KAAK,YAAY,MAAQ,YACzB,CAAC,cAAc,aAEf,KAAK,UAAU,IAAI,UAAU,MAAM,EAInC,iBACA,gBAAgB,aAAa,GAAG,aAAa,WAAW,EAAE,IAE1D,gBAAgB,gBAAgB,GAAG,aAAa,WAAW,EAAE,EAC7D,IAAI,cAAc,aAChB,GAAG,aAAa,WAAW,GAC3B,MACF,GAGE,YAAc,KAChB,KAAK,iBAAiB,UAAY,UAGhC,KAAK,iBAAiB,aACpB,aAAa,gBACf,GACA,KAAK,iBAAiB,aACpB,aAAa,gBACf,IAAM,IAEN,KAAK,iBAAiB,aACpB,aAAa,iBACb,SACF,GAGJ,KAAK,sBAAsB,GAAG,EAC9B,KAAK,oBAAoB,GAAG,CAC9B,CACF,CACF,CAEA,QAAQ,IAAK,CACP,IAAI,OAAS,WAGjB,KAAK,UAAU,EACf,KAAK,aAAa,MAAM,EAC1B,CAEA,YAAY,IAAK,CACf,MAAM,SAAW,KAAK,SAAS,IAAI,MAAM,EACvB,KAAK,WAAW,UAAU,SAC1C,UAAU,WACZ,GAEiB,CAAC,UAChB,KAAK,UAAU,CAEnB,CAEA,gBAAiB,CACf,KAAK,aAAa,iBAChB,QACA,KAAK,qBACP,CACF,CAEA,iBAAkB,CACZ,KAAK,cAAc,QACrB,KAAK,cAAc,QAAS,SAAY,CACtC,QAAQ,iBAAiB,QAAU,KACjC,KAAK,kBAAkB,GAAG,CAC5B,CACF,CAAC,CAEL,CAEA,aAAc,CACZ,KAAK,iBAAiB,QAAS,KAAK,UAAU,EAC9C,KAAK,aAAa,iBAChB,WACA,KAAK,wBACP,EACA,KAAK,WAAW,iBACd,WACA,KAAK,sBACP,CACF,CAEA,aAAc,CACZ,MAAM,KAAO,KAAK,QAAQ,MAAM,EAC5B,MACF,KAAK,OAAO,CAEhB,CAEA,WAAY,CACV,KAAK,WAAW,UAAU,OAAO,UAAU,WAAW,EACtD,KAAK,aAAa,aAAa,aAAa,aAAc,EAAK,EAC/D,KAAK,mBAAmB,EACxB,SAAS,KAAK,oBAAoB,QAAS,KAAK,cAAc,CAChE,CACF,CACF,EAGF,MAAM,WAAY,CAChB,YAAY,KAAM,MAAO,aAAe,EAAG,CACzC,MAAM,MAAQ,IAAI,KACZ,YAAc,IAAI,KACxB,YAAY,QAAQ,MAAM,QAAQ,EAAI,KAAU,GAAK,YAAY,EAEjE,KAAK,OAAS,CACZ,QAAS,YAAY,YAAY,EACjC,KAAM,IACN,OAAQ,OAAO,SAAS,SACxB,SAAU,OACV,OAAQ,EACV,EACA,KAAK,KAAO,KACZ,KAAK,MAAQ,KACf,CAEA,OAAQ,EAEJ,SAAS,OAAO,QAAQ,IAAI,IAAM,IAClC,CAAC,SAAS,OAAO,MAAM,IAAI,EAAE,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,GAErD,SAAS,OAAO,QAAQ,IAAI,IAAM,MACjD,SAAS,OAAS,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,aAAa,KAAK,OAAO,OAAO,UAAU,KAAK,OAAO,IAAI,YAAY,KAAK,OAAO,MAAM,cAAc,KAAK,OAAO,QAAQ,YAAY,KAAK,OAAO,MAAM,GAExM,CAEA,MAAO,CACL,OACE,SAAS,OAAO,QAAQ,IAAI,IAAM,IAClC,SAAS,OAAO,MAAM,IAAI,EAAE,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,EAE9C,SAAS,OAC3B,MAAM,IAAI,EACV,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,EACvC,MAAM,GAAG,EAAE,CAAC,EAIR,EAEX,CAEA,SAAU,CAEN,SAAS,OAAO,MAAM,IAAI,EAAE,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,IAEnE,SAAS,OAAS,GAAG,KAAK,IAAI,kBAAkB,KAAK,OAAO,OAAO,UAAU,KAAK,OAAO,IAAI,YAAY,KAAK,OAAO,MAAM,GAE/H,CACF,CAEA,MAAM,YAAc,CAClB,KAAM,oBACN,MAAO,qBACP,OAAQ,SACR,UACE,oEACF,eAAgB,yBAChB,kBAAmB,4BACnB,gBAAiB,yBACnB,EAEM,aAAe,CACnB,QAAS,UACT,MAAO,mBACP,WAAY,4BACZ,WAAY,mBACZ,YAAa,oBACb,gBAAiB,wBACnB,EAEM,UAAY,CAChB,OAAQ,SACR,SAAU,YACV,eAAgB,mBAChB,UAAW,aACX,QAAS,cACT,OAAQ,SACR,QAAS,UACT,OAAQ,QACV,EAEA,MAAM,uBAAuB,WAAY,CACvC,aAAc,CACZ,MAAM,EACN,KAAK,MAAQ,KAAK,cAAc,YAAY,MAAM,EAClD,KAAK,gBAAkB,KAAK,MAAM,aAChC,aAAa,eACf,EACA,KAAK,iBAAmB,KAAK,MAAM,aAAa,aAAa,UAAU,EACvE,KAAK,gBAAkB,KAAK,cAAc,YAAY,IAAI,EAC1D,KAAK,KAAO,OAAO,MAAM,KACzB,KAAK,YAAc,GACnB,KAAK,OAAS,IAAI,YAChB,KAAK,MAAM,aAAa,aAAa,UAAU,EAC/C,KAAK,MAAM,aAAa,aAAa,WAAW,CAClD,EAEA,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,cAAc,CACrB,CAEA,qBAAsB,CACf,KAAK,MAAM,aAAa,aAAa,QAAQ,GAGhD,SAAS,KAAK,QACZ,KAAK,MAAM,aAAa,aAAa,QAAQ,CAC/C,IAAM,IACN,CAAC,OAAO,QAAQ,YAEhB,KAAK,MAAM,WAAW,YAAY,KAAK,KAAK,CAEhD,CAEA,aAAc,CACS,KAAK,QAAU,KAAK,OAAO,KAAK,IAAM,KAGzD,KAAK,gBAAgB,EAErB,KAAK,MAAM,iBAAiB,sBAAuB,IACjD,KAAK,OAAO,MAAM,CACpB,EAEJ,CAEA,eAAgB,CAEd,KAAK,iBAAiB,iBAAiB,QAAU,GAAM,CACrD,EAAE,eAAe,EACjB,KAAK,UAAU,EACf,OAAO,MAAM,KAAK,YAAc,KAAK,eACvC,CAAC,EAGD,KAAK,MAAM,iBAAiB,YAAY,KAAK,GAAG,QAAS,aAAgB,CACvE,YAAY,iBAAiB,QAAU,GAAM,CAC3C,EAAE,eAAe,EACjB,KAAK,WAAW,CAClB,CAAC,CACH,CAAC,EAGD,KAAK,MAAM,iBAAiB,QAAU,OAAU,CAC1C,MAAM,OAAO,WAAa,UAAY,MAAM,OAAS,SACvD,KAAK,WAAW,CAEpB,CAAC,EAGD,KAAK,MAAM,iBAAiB,UAAY,OAAU,CAC5C,MAAM,OAAS,WACjB,MAAM,eAAe,EACrB,KAAK,WAAW,EAEpB,CAAC,EAED,KAAK,MAAM,iBAAiB,QAAS,IAAM,KAAK,kBAAkB,CAAC,CACrE,CAEA,WAAY,CACV,KAAK,YAAc,GAGf,OAAO,KAAK,MAAM,WAAc,YAAc,CAAC,KAAK,gBACtD,KAAK,MAAM,UAAU,EACZ,OAAO,KAAK,MAAM,MAAS,WACpC,KAAK,MAAM,KAAK,EAEhB,KAAK,MAAM,aAAa,OAAQ,EAAE,EAGpC,KAAK,MAAM,gBAAgB,OAAO,EAClC,KAAK,MAAM,aAAa,cAAe,EAAK,EAC5C,KAAK,MAAM,MAAM,EAEb,KAAK,kBACP,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,EAGF,OAAO,MAAM,oBAAoB,KAAK,KAAK,EAAE,KAAK,IAAM,CACtD,KAAK,YAAc,GAEf,KAAK,kBACP,KAAK,KAAK,UAAU,KAAK,KAAK,GAI9B,KAAK,MAAM,cAAc,aAAa,GACtC,KAAK,MAAM,cAAc,YAAY,SAAS,IACnC,MAAM,CACrB,CAAC,CACH,CAEA,YAAa,CACX,GAAI,OAAK,aAAe,KAAK,MAAM,aAAa,OAAO,GAIvD,IAAI,CAAC,KAAK,MAAM,aAAa,aAAa,OAAO,EAAG,CAClD,KAAK,MAAM,aAAa,aAAa,QAAS,EAAE,EAChD,KAAK,YAAc,GAEnB,OAAO,MAAM,oBAAoB,KAAK,KAAK,EAAE,KAAK,IAAM,CACtD,KAAK,YAAc,GACnB,KAAK,WAAW,CAClB,CAAC,EAED,MACF,CAGI,OAAO,KAAK,MAAM,OAAU,WAC9B,KAAK,MAAM,MAAM,GAEjB,KAAK,MAAM,gBAAgB,MAAM,EACjC,KAAK,MAAM,aAAa,cAAe,EAAI,GAG7C,KAAK,kBAAkB,EACzB,CAEA,mBAAoB,CACd,KAAK,MAAM,aAAa,OAAO,IAEnC,KAAK,MAAM,aAAa,QAAS,EAAE,EACnC,KAAK,MAAM,aAAa,cAAe,EAAI,EAC3C,KAAK,MAAM,gBAAgB,aAAa,OAAO,EAG3C,CAAC,OAAO,MAAM,cAAc,GAAK,KAAK,kBACxC,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EAGF,KAAK,MAAM,cACT,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAM,CAAC,CAC3D,EAEI,KAAK,mBACP,KAAK,KAAK,gBAAgB,EAC1B,KAAK,KAAK,qBAAqB,GAEnC,CAEA,iBAAkB,CAGd,KAAK,MAAM,aAAa,MAAM,GAC9B,KAAK,MAAM,aAAa,MAAM,GAAK,IAEnC,KAAK,UAAU,EAGjB,KAAK,MAAQ,KAAK,MAAM,aAAa,aAAa,KAAK,EACnD,KAAK,MAAM,aAAa,aAAa,KAAK,EAC1C,KACJ,KAAK,YACH,OAAO,SAAS,KAAK,QAAQ,mBAAmB,IAAM,IACtD,OAAO,SAAS,KAAK,QAAQ,sBAAsB,IAAM,GAC3D,KAAK,kBAAoB,OAAO,MAAM,SACpC,KAAK,aAAa,KAAK,IAAI,EAC3B,GACF,GAEI,KAAK,QAAU,UAAY,KAAK,cAClC,KAAK,UAAU,EAGb,KAAK,OAAS,KAAK,MAAM,SAAS,SAAS,GAAK,CAAC,KAAK,aACxD,KAAK,YAAY,EAGf,KAAK,QAAU,UAAY,CAAC,KAAK,aACnC,KAAK,oBAAoB,EAGvB,KAAK,QAAU,QAAU,CAAC,KAAK,aACjC,KAAK,WAAW,CAEpB,CAEA,aAAc,CACZ,MAAM,QAAU,KAAK,MAAM,SAAS,GAAG,EACnC,SAAS,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,EACjC,GAGJ,WAAW,IAAM,CACf,KAAK,UAAU,CACjB,EAAG,QAAU,GAAI,CACnB,CAEA,YAAa,CACX,IAAI,MAAQ,EACR,SAAW,IACf,MAAM,eAAiB,CACrB,YACA,YACA,QACA,YACA,aACA,WACA,UACA,UACF,EACM,aAAe,CAAC,OAAQ,SAAU,QAAQ,EAE1C,WAAa,IAAM,CACvB,MAAQ,WAAW,IAAM,CACvB,MAAQ,EACR,KAAK,UAAU,CACjB,EAAG,QAAQ,EAEX,eAAe,QAAS,WAAc,CACpC,SAAS,iBAAiB,UAAW,UAAU,CACjD,CAAC,EAED,aAAa,QAAS,WAAc,CAClC,OAAO,iBAAiB,UAAW,UAAU,CAC/C,CAAC,CACH,EAEM,WAAa,IAAM,CACnB,OACF,aAAa,KAAK,EAGpB,eAAe,QAAS,WAAc,CACpC,SAAS,oBAAoB,UAAW,UAAU,CACpD,CAAC,EAED,aAAa,QAAS,WAAc,CAClC,OAAO,oBAAoB,UAAW,UAAU,CAClD,CAAC,EAED,WAAW,CACb,EAEA,WAAW,CACb,CAEA,qBAAsB,CACpB,SAAS,iBAAiB,eAAgB,KAAK,iBAAiB,CAClE,CAEA,cAAe,CACT,OAAO,QAAU,OAAO,aAAe,SAAS,KAAK,eACvD,KAAK,UAAU,EACf,SAAS,oBAAoB,eAAgB,KAAK,iBAAiB,EAEvE,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,eAAgB,KAAK,iBAAiB,CACrE,CACF,CAEA,MAAM,wBAAwB,cAAe,CAC3C,aAAc,CACZ,MAAM,EACN,KAAK,KAAO,KAAK,MAAM,cAAc,YAAY,cAAc,EAC/D,KAAK,QAAU,KAAK,MAAM,cAAc,YAAY,iBAAiB,EACrE,KAAK,gBAAkB,KAAK,MAAM,cAChC,YAAY,eACd,CACF,CAEA,mBAAoB,CAClB,MAAM,aAAe,KAAK,QAAQ,KAAK,IAAM,GACvC,kBACJ,OAAO,SAAS,OAAO,QAAQ,uBAAuB,IAAM,GAExD,iBADgB,CAAC,GAAG,KAAK,SAAS,EAAE,SAAS,EACZ,SAAS,UAAU,MAAM,EAC1D,aAAe,KAAK,MAAM,UAAU,SAAS,UAAU,MAAM,EAC7D,cAAgB,KAAK,MAAM,UAAU,SAAS,UAAU,OAAO,EAC/D,aAAe,OAAO,MAAM,SAAS,EAE3C,IAAI,cAAgB,GAMpB,IAJK,cAAgB,CAAC,cAAkB,eAAiB,gBACvD,cAAgB,IAGd,CAAC,cAAe,CAClB,MAAM,KAAK,gBAAgB,EAC3B,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EACA,MACF,EAEI,CAAC,cAAgB,OAAO,QAAQ,cAEhC,CAAC,OAAO,QAAQ,YAChB,CAAC,OAAO,SAAS,SAAS,SAAS,YAAY,GAE/C,MAAM,gBAAgB,EAGpB,KAAK,MAAQ,KAAK,KAAK,UAAU,SAAS,UAAU,OAAO,IAC7D,MAAM,UAAU,EAChB,KAAK,OAAO,MAAM,GAGpB,KAAK,MAAM,iBAAiB,sBAAuB,IACjD,KAAK,OAAO,MAAM,CACpB,GAGE,oBACF,KAAK,MAAQ,IAGX,CAAC,cAAgB,OAAO,QAAQ,cAClC,KAAK,KAAK,EAEN,KAAK,KAAK,UAAU,SAAS,UAAU,OAAO,IAChD,KAAK,UAAU,EACf,KAAK,OAAO,MAAM,IAIlB,kBACF,KAAK,eAAe,CAExB,CAEA,MAAO,CACA,OAAO,SAAS,SAAS,SAAS,YAAY,IAC5C,OAAO,QAAQ,WAGlB,MAAM,UAAU,EAFhB,MAAM,gBAAgB,GAM1B,KAAK,SAAS,EACd,KAAK,WAAW,EAEhB,KAAK,MAAM,iBAAiB,sBAAuB,IACjD,KAAK,OAAO,MAAM,CACpB,CACF,CAEA,gBAAiB,CAGf,GAFA,KAAK,QAAU,SAAS,eAAe,YAAY,OAAO,EAEtD,CAAC,KAAK,QAAS,OAEnB,MAAM,OAAS,CAAE,WAAY,GAAM,UAAW,GAAO,QAAS,EAAM,EACpE,IAAI,UAAY,KAAK,QAAQ,UAAU,SAAS,UAAU,SAAS,EACnE,SAAS,KAAK,UAAU,OAAO,UAAU,eAAgB,SAAS,EAGlE,MAAM,SAAY,cAAiB,CACjC,UAAW,YAAY,aACjB,SAAS,OAAS,eACpB,UAAY,SAAS,OAAO,UAAU,SAAS,UAAU,SAAS,EAClE,SAAS,KAAK,UAAU,OAAO,UAAU,eAAgB,SAAS,EAGxE,EAEA,KAAK,SAAW,IAAI,iBAAiB,QAAQ,EAC7C,KAAK,SAAS,QAAQ,KAAK,QAAS,MAAM,CAC5C,CAEA,UAAW,CACT,KAAK,SAAS,iBAAiB,QAAU,OAAU,CACjD,MAAM,eAAe,EAErB,KAAK,QAAQ,UAAU,IAAI,UAAU,MAAM,EAC3C,KAAK,KAAK,UAAU,OAAO,UAAU,MAAM,EAC3C,KAAK,gBAAgB,MAAM,CAC7B,CAAC,EAED,KAAK,SAAS,iBAAiB,QAAU,OAAU,CAC7C,MAAM,OAAS,SACjB,KAAK,QAAQ,cAAc,IAAI,MAAM,OAAO,CAAC,CAEjD,CAAC,CACH,CAEA,YAAa,CACX,MAAM,SAAW,IAAM,CAEjB,KAAK,iBACP,aAAa,KAAK,eAAe,EAG/B,KAAK,gBAAgB,QAAU,IACjC,KAAK,MAAM,UAAU,IAAI,UAAU,QAAQ,CAE/C,EAEM,WAAa,IAAM,CAEnB,KAAK,iBACP,aAAa,KAAK,eAAe,EAInC,KAAK,gBAAkB,WAAW,IAAM,CACtC,KAAK,MAAM,UAAU,OAAO,UAAU,QAAQ,CAChD,EAAG,GAAI,CACT,EAEA,KAAK,gBAAgB,iBAAiB,QAAS,QAAQ,EACvD,KAAK,gBAAgB,iBAAiB,QAAS,QAAQ,EACvD,KAAK,gBAAgB,iBAAiB,WAAY,UAAU,CAC9D,CAEA,sBAAuB,CACjB,KAAK,UACP,KAAK,SAAS,WAAW,CAE7B,CACF,CAEK,eAAe,IAAI,iBAAiB,GACvC,eAAe,OAAO,kBAAmB,cAAc,EAGpD,eAAe,IAAI,kBAAkB,GACxC,eAAe,OAAO,mBAAoB,eAAe,EAG3D,MAAM,YAAc,CAClB,mBAAoB,kBACpB,aAAc,yBACd,gBAAiB,0BACjB,iBAAkB,oBAClB,wBAAyB,mCACzB,uBAAwB,kCACxB,YAAa,uBACb,cAAe,iBACf,wBAAyB,mDACzB,2BAA4B,uCAC5B,cAAe,2CACf,wBAAyB,qCACzB,aAAc,2BACd,eAAgB,wDAClB,EAEK,eAAe,IAAI,mBAAmB,GACzC,eAAe,OACb,oBAEA,cAA+B,gBAAiB,CAC9C,aAAc,CACZ,MAAM,EAEN,KAAK,KAAO,OAAO,MAAM,KACzB,KAAK,gBAAkB,IAAI,gBAC3B,KAAK,6BAA+B,SAAS,iBAC3C,YAAY,gBACd,EACA,KAAK,cAAgB,CAAC,EACtB,KAAK,MAAQ,KAAK,cAAc,YAAY,WAAW,EACvD,KAAK,OAAS,GACd,KAAK,wBAA0B,KAAK,cAClC,YAAY,uBACd,EACA,KAAK,cAAgB,KAAK,QAAQ,YAAY,aAAa,EAC3D,KAAK,gBAAkB,KAAK,eAAe,cACzC,YAAY,eACd,EACA,KAAK,WAAa,EACpB,CAEA,mBAAoB,CAClB,KAAK,MAAM,iBAAiB,QAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,EAC5D,KAAK,MAAM,KAAK,iBACd,SACA,KAAK,aAAa,KAAK,IAAI,CAC7B,EAEA,KAAK,iBAAiB,WAAY,KAAK,WAAW,KAAK,IAAI,CAAC,EAC5D,KAAK,iBAAiB,QAAS,KAAK,QAAQ,KAAK,IAAI,CAAC,EACtD,KAAK,iBAAiB,UAAW,KAAK,UAAU,KAAK,IAAI,CAAC,CAC5D,CAEA,UAAW,CACT,OAAO,KAAK,MAAM,MAAM,KAAK,CAC/B,CAEA,UAAW,CACT,MAAM,SAAS,EACf,MAAM,cAAgB,KAAK,SAAS,EAepC,IAbI,CAAC,KAAK,YAAc,CAAC,cAAc,WAAW,KAAK,UAAU,IAG/D,KAAK,cACH,YAAY,0BACd,GAAG,OAAO,EAIZ,KAAK,oBAAoB,KAAK,WAAY,aAAa,EAEvD,KAAK,WAAa,cAEd,CAAC,KAAK,WAAW,OAAQ,CAC3B,KAAK,MAAM,EACX,MACF,CAEA,KAAK,iBAAiB,KAAK,UAAU,CACvC,CAEA,aAAa,MAAO,EAEhB,CAAC,KAAK,SAAS,EAAE,QACjB,KAAK,cAAc,YAAY,YAAY,IAE3C,MAAM,eAAe,CACzB,CAEA,YAAY,MAAO,CACjB,MAAM,YAAY,KAAK,EACnB,MAAM,gBAAgB,IACxB,KAAK,WAAa,GAClB,KAAK,gBAAgB,MAAM,EAC3B,KAAK,gBAAkB,IAAI,gBAC3B,KAAK,aAAa,EAAI,EAE1B,CAEA,iBAAkB,CAChB,MAAO,CAAC,SAAS,cAAc,YAAY,YAAY,CACzD,CAEA,SAAU,CACR,MAAM,kBAAoB,KAAK,SAAS,EAEnC,kBAAkB,SAEnB,KAAK,aAAe,kBAEtB,KAAK,SAAS,EACL,KAAK,aAAa,SAAS,IAAM,OAC1C,KAAK,KAAK,EAEV,KAAK,iBAAiB,KAAK,UAAU,EAEzC,CAEA,YAAa,CACX,WAAW,IAAM,CACV,KAAK,SAAS,SAAS,aAAa,GAAG,KAAK,MAAM,CACzD,CAAC,CACH,CAEA,QAAQ,MAAO,CAIb,OAHK,KAAK,SAAS,EAAE,QAAQ,KAAK,MAAM,EAAI,EAC5C,MAAM,eAAe,EAEb,MAAM,KAAM,CAClB,IAAK,UACH,KAAK,aAAa,IAAI,EACtB,MACF,IAAK,YACH,KAAK,aAAa,MAAM,EACxB,MACF,IAAK,QACH,KAAK,aAAa,EAClB,KACJ,CACF,CAEA,UAAU,MAAO,EAEX,MAAM,OAAS,WAAa,MAAM,OAAS,cAC7C,MAAM,eAAe,CAEzB,CAEA,oBAAoB,aAAc,QAAS,CACzC,MAAM,qBAAuB,KAAK,cAChC,YAAY,aACd,EACM,kBAAoB,sBAAsB,UAEhD,GAAI,kBAAmB,CACrB,GACE,kBAAkB,MAAM,IAAI,OAAO,aAAc,GAAG,CAAC,GAAG,OAAS,EAGjE,OAEF,MAAM,cAAgB,kBAAkB,QACtC,aACA,OACF,EACA,qBAAqB,UAAY,aACnC,CACF,CAEA,aAAa,UAAW,CACtB,GAAI,CAAC,KAAK,aAAa,MAAM,EAAG,OAEhC,MAAM,OAAS,YAAc,KACvB,gBAAkB,KAAK,cAAc,YAAY,YAAY,EAI7D,mBAAqB,MAAM,KAC/B,KAAK,iBAAiB,YAAY,kBAAkB,CACtD,EAAE,OAAQ,SAAY,QAAQ,eAAiB,IAAI,EAEnD,IAAI,mBAAqB,EAEzB,GAAI,QAAU,CAAC,gBAAiB,OAEhC,IAAI,qBAAuB,GACvB,EAAI,EAER,KACE,uBAAyB,IACzB,GAAK,mBAAmB,QAEpB,mBAAmB,CAAC,IAAM,kBAC5B,qBAAuB,GAEzB,IAiBF,GAdA,KAAK,cAAc,YAAc,GAE7B,CAAC,QAAU,gBACb,mBACE,uBAAyB,mBAAmB,OAAS,EACjD,EACA,qBAAuB,EACpB,SACT,mBACE,uBAAyB,EACrB,mBAAmB,OAAS,EAC5B,qBAAuB,GAG3B,qBAAuB,qBAAsB,OAEjD,MAAM,cAAgB,mBAAmB,kBAAkB,EAE3D,cAAc,aAAa,gBAAiB,EAAI,EAC5C,iBACF,gBAAgB,aAAa,gBAAiB,EAAK,EAErD,KAAK,MAAM,aAAa,wBAAyB,cAAc,EAAE,CACnE,CAEA,cAAe,CACb,MAAM,eAAiB,KAAK,cAAc,YAAY,cAAc,EAEhE,gBAAgB,eAAe,MAAM,CAC3C,CAEA,iBAAiB,WAAY,CAC3B,MAAM,SAAW,WAAW,QAAQ,IAAK,GAAG,EAAE,YAAY,EAG1D,GAFA,KAAK,0BAA0B,EAE3B,KAAK,cAAc,QAAQ,EAAG,CAChC,KAAK,oBAAoB,KAAK,cAAc,QAAQ,CAAC,EACrD,MACF,CAEA,MACE,GAAG,MAAM,OAAO,qBAAqB,MAAM,mBAAmB,UAAU,CAAC,gCACzE,CAAE,OAAQ,KAAK,gBAAgB,MAAO,CACxC,EACG,KAAM,UAAa,CAClB,GAAI,CAAC,SAAS,GAAI,CAChB,IAAI,MAAQ,IAAI,MAAM,SAAS,MAAM,EACrC,WAAK,MAAM,EACL,KACR,CAEA,OAAO,SAAS,KAAK,CACvB,CAAC,EACA,KAAM,MAAS,CACd,MAAM,cAAgB,IAAI,UAAU,EACjC,gBAAgB,KAAM,WAAW,EACjC,cAAc,YAAY,uBAAuB,EAAE,UAEtD,KAAK,6BAA6B,QAC/B,0BAA6B,CAC5B,yBAAyB,cAAc,QAAQ,EAC7C,aACJ,CACF,EACA,KAAK,oBAAoB,aAAa,CACxC,CAAC,EACA,MAAO,OAAU,CAChB,GAAI,OAAO,OAAS,GAIpB,WAAK,MAAM,EACL,KACR,CAAC,CACL,CAEA,2BAA4B,CAC1B,KAAK,cACH,KAAK,eACL,KAAK,cAAc,YAAY,sBAAsB,EACvD,KAAK,YACH,KAAK,aAAe,KAAK,aAAa,mBAAmB,EAE3D,KAAK,kBAAkB,KAAK,WAAW,EACvC,KAAK,aAAa,UAAW,EAAI,CACnC,CAEA,kBAAkB,WAAY,CAC5B,KAAK,cAAc,aAAa,cAAe,OAAO,EACtD,KAAK,cAAc,YAAc,WAEjC,WAAW,IAAM,CACf,KAAK,cAAc,aAAa,cAAe,MAAM,CACvD,EAAG,GAAI,CACT,CAEA,oBAAoB,cAAe,CACjC,KAAK,wBAAwB,UAAY,cAEzC,KAAK,aAAa,UAAW,EAAI,EAEjC,KAAK,qBAAqB,EAC1B,KAAK,KAAK,CACZ,CAEA,sBAAuB,CACrB,KAAK,gBAAgB,SAAS,EAC9B,KAAK,kBACH,KAAK,cAAc,YAAY,uBAAuB,EAAE,WAC1D,CACF,CAEA,MAAO,CACL,KAAK,aAAa,OAAQ,EAAI,EAC9B,KAAK,MAAM,aAAa,gBAAiB,EAAI,EAC7C,KAAK,OAAS,GACd,KAAK,wBAAwB,MAAM,YACjC,mBACA,GAAG,OAAO,eAAe,OAAS,KAAK,wBAAwB,sBAAsB,EAAE,GAAG,IAC5F,CACF,CAEA,MAAM,gBAAkB,GAAO,CAC7B,KAAK,aAAa,eAAe,EACjC,KAAK,OAAS,GACd,KAAK,wBAAwB,MAAM,eAAe,kBAAkB,CACtE,CAEA,aAAa,gBAAkB,GAAO,CAChC,kBACF,KAAK,MAAM,MAAQ,GACnB,KAAK,gBAAgB,SAAS,GAEhC,MAAM,SAAW,KAAK,cAAc,YAAY,YAAY,EAExD,UAAU,SAAS,aAAa,gBAAiB,EAAK,EAE1D,KAAK,MAAM,aAAa,wBAAyB,EAAE,EACnD,KAAK,gBAAgB,SAAS,EAC9B,KAAK,gBAAgB,MAAM,EAC3B,KAAK,MAAM,aAAa,gBAAiB,EAAK,EAC9C,KAAK,yBAAyB,gBAAgB,OAAO,CACvD,CAEA,OAAQ,CACN,KAAK,wBAAwB,UAAY,GAEzC,KAAK,MAAM,IAAM,GACjB,KAAK,KAAK,gBAAgB,EAEtB,KAAK,kBACP,KAAK,MAAM,cAAc,IAAI,MAAM,OAAQ,CAAE,QAAS,EAAM,CAAC,CAAC,EAC9D,KAAK,KAAK,UAAU,KAAK,cAAe,CACtC,eAAgB,KAAK,KACvB,CAAC,EAEL,CACF,CACF,EAGF,SAAS,WAAY,CACnB,KAAK,QAAU,CAAC,CAClB,CAEA,UAAU,UAAU,IAAM,SAAU,QAAS,MAAO,GAAI,CACtD,KAAK,QAAQ,KAAK,CAAE,QAAkB,MAAc,EAAO,CAAC,EAC5D,QAAQ,iBAAiB,MAAO,EAAE,CACpC,EAEA,UAAU,UAAU,UAAY,UAAY,CAC1C,KAAK,QAAU,KAAK,QAAQ,OAAO,SAAU,SAAU,CACrD,gBAAS,QAAQ,oBAAoB,SAAS,MAAO,SAAS,EAAE,EACzD,EACT,CAAC,CACH,EAQA,SAAS,8BAA8B,QAAS,WAAY,CAC1D,0BAA0B,OAAO,EAGjC,IAAI,YAAc,uCAChB,QACA,UACF,EACA,OAAO,0BAA0B,QAAS,WAAW,CACvD,CAQA,SAAS,0BAA0B,QAAS,QAAS,CACnD,0BAA0B,OAAO,EACjC,sBAAsB,OAAO,EAE7B,IAAI,OAAS,QAAQ,SAAS,OAAO,SAAU,QAAS,CACtD,OAAO,QAAQ,MAAM,SAAU,OAAQ,MAAO,CAC5C,OAAO,QAAQ,QAAQ,KAAK,IAAM,MACpC,CAAC,CACH,CAAC,EAED,OAAO,OAAO,CAAC,GAAK,IACtB,CASA,SAAS,uCAAuC,QAAS,WAAY,CACnE,0BAA0B,OAAO,EACjC,yBAAyB,UAAU,EAEnC,IAAI,YAAc,CAAC,EAEnB,kBAAW,QAAQ,SAAU,OAAQ,CACnC,QAAS,EAAI,EAAG,EAAI,QAAQ,QAAQ,OAAQ,IAAK,CAC/C,IAAI,KAAO,QAAQ,QAAQ,CAAC,EAAE,MAAQ,QAAQ,QAAQ,CAAC,EACvD,GAAI,KAAK,YAAY,IAAM,OAAO,KAAK,YAAY,EAAG,CACpD,YAAY,CAAC,EAAI,OAAO,MACxB,KACF,CACF,CACF,CAAC,EAEM,WACT,CAOA,SAAS,0BAA0B,QAAS,CAC1C,GAAI,OAAO,SAAY,SACrB,MAAM,IAAI,UAAU,QAAU,oBAAoB,EAGpD,GAAI,OAAO,KAAK,OAAO,EAAE,SAAW,GAAK,QAAQ,cAAgB,OAC/D,MAAM,IAAI,MAAM,QAAU,YAAY,CAE1C,CAOA,SAAS,yBAAyB,WAAY,CAC5C,GAAI,CAAC,MAAM,QAAQ,UAAU,EAC3B,MAAM,IAAI,UAAU,WAAa,mBAAmB,EAGtD,GAAI,WAAW,SAAW,EACxB,MAAM,IAAI,MAAM,WAAa,YAAY,EAG3C,GAAI,WAAW,CAAC,EAAE,eAAe,MAAM,GACrC,GAAI,OAAO,WAAW,CAAC,EAAE,MAAS,SAChC,MAAM,IAAI,UACR,gDACE,WAAW,CAAC,EAAE,KACd,2BACJ,MAGF,OAAM,IAAI,MAAM,WAAW,CAAC,EAAI,4BAA4B,CAEhE,CAOA,SAAS,sBAAsB,QAAS,CACtC,GAAI,MAAM,QAAQ,OAAO,GAAK,OAAO,QAAQ,CAAC,GAAM,SAClD,MAAM,IAAI,MAAM,QAAU,kCAAkC,CAEhE,CAEA,IAAI,YAAc,CAChB,QAAS,cACT,UAAW,wBACX,YAAa,oBACb,cAAe,oBACf,cAAe,sBACjB,EAaA,SAAS,kBAAkB,IAAK,GAAI,CAClC,MAAI,WAAW,KAAK,GAAG,EACd,IAAI,QAAQ,kBAAmB,KAAO,EAAE,EACtC,KAAK,KAAK,GAAG,EACf,IAAI,OAAO,WAAW,EAAE,OAAO,EAAE,EAGnC,IAAI,OAAO,WAAW,EAAE,OAAO,EAAE,CAC1C,CAcA,MAAM,iBAAkB,CACtB,YAAY,QAAS,QAAS,QAAS,CACrC,KAAK,QAAU,QACf,KAAK,QAAU,KAAK,uBAAuB,OAAO,EAClD,KAAK,eAAiB,KAAK,QAAQ,cAAc,YAAY,OAAO,EAEpE,QAAU,SAAW,CAAC,EAEtB,KAAK,WAAa,IAAI,UACtB,KAAK,WAAW,IACd,KAAK,QACL,SACA,KAAK,UAAU,KAAK,KAAM,OAAO,CACnC,EAEA,KAAK,aAAe,KAAK,YACvB,YAAY,YACZ,QAAQ,cACV,EAEA,KAAK,WAAa,KAAK,YACrB,YAAY,UACZ,QAAQ,YACV,EAEA,KAAK,eAAiB,KAAK,YACzB,YAAY,cACZ,QAAQ,gBACV,EAEA,KAAK,eAAiB,KAAK,YACzB,YAAY,cACZ,QAAQ,gBACV,CACF,CAMA,SAAU,CACR,KAAK,WAAW,UAAU,CAC5B,CAOA,SAAU,CACR,OAAO,KAAK,sBAAsB,KAAK,aAAc,SAAU,KAAM,CACnE,IAAI,MAAQ,8BACZ,YAAK,KAAO,MAAM,KAAK,KAAK,IAAI,EAAE,CAAC,EAC5B,IACT,CAAC,CACH,CAQA,SAAU,CACR,MAAM,KAAO,KAAK,QAAQ,EAC1B,OAAI,KAAK,OACA,8BAA8B,KAAK,QAAS,IAAI,EAEhD,KAAK,QAAQ,SAAS,CAAC,CAElC,CAQA,KAAK,QAAS,CACZ,IAAI,KAAO,CACT,WAAY,KACZ,MAAO,KACP,OAAQ,IACV,EACA,MAAM,mBAAqB,KAAK,QAAQ,cACtC,GAAG,YAAY,SAAS,UAC1B,EACA,GAAI,CAAC,mBAAoB,OAAO,KAChC,MAAM,wBAA0B,mBAAmB,MAC7C,GACJ,yBAA2B,0BAA4B,GACnD,wBACA,KAuBN,OArBI,IAAM,UACR,KAAK,WAAa,QAAQ,yBAAyB,KACjD,SAAU,KAAM,CACd,OAAO,KAAK,gBAAgB,SAAS,IAAM,GAAG,SAAS,CACzD,CACF,GAEE,KAAK,aACP,KAAK,MAAQ,KAAK,QAAQ,oBAAoB,KAAK,SAAU,KAAM,CACjE,OACE,KAAK,GAAG,SAAS,IACjB,KAAK,WAAW,sBAAsB,SAAS,CAEnD,CAAC,GAEC,KAAK,QACP,KAAK,OAAS,KAAK,MAAM,cAAc,KAAK,SAAU,KAAM,CAC1D,OAAO,KAAK,GAAG,SAAS,IAAM,GAAG,SAAS,CAC5C,CAAC,GAGC,MAAQ,KAAK,YAAc,KAAK,QAAU,KAAK,WAC1C,KACK,IAChB,CAQA,YAAa,CACX,OAAO,KAAK,sBAAsB,KAAK,eAAgB,SAAU,KAAM,CACrE,IAAI,MAAQ,iCACZ,YAAK,KAAO,MAAM,KAAK,KAAK,IAAI,EAAE,CAAC,EAC5B,IACT,CAAC,CACH,CAQA,UAAW,CACT,OAAO,KAAK,eAAe,CAAC,EACxB,OAAO,SAAS,KAAK,eAAe,CAAC,EAAE,MAAO,EAAE,EAChD,CACN,CAEA,cAAe,CACb,MAAM,QAAU,KAAK,QAAQ,EAC7B,MAAO,CACL,QAAS,KAAK,QAAQ,EACtB,QACA,WAAY,KAAK,WAAW,EAC5B,SAAU,KAAK,SAAS,EACxB,KAAM,KAAK,KAAK,OAAO,CACzB,CACF,CAIA,iBAAiB,QAAS,CACpB,SAAW,QAAQ,GACrB,KAAK,eAAe,MAAQ,QAAQ,GAAG,SAAS,EAEhD,KAAK,eAAe,MAAQ,GAG9B,KAAK,eAAe,cAAc,IAAI,MAAM,QAAQ,CAAC,CACvD,CAEA,UAAU,QAAS,MAAO,CACxB,MAAM,QAAU,KAAK,aAAa,EAC9B,QAAQ,cACV,QAAQ,aAAa,KAAK,CAE9B,CAEA,gBAAgB,MAAO,CACrB,KAAK,iBAAiB,MAAM,QAAQ,OAAO,CAC7C,CAEA,aAAa,GAAI,CACf,OAAI,OAAO,GAAO,IACT,SAAS,UAAU,KAAK,EAG1B,SAAU,MAAO,CACtB,MAAM,QAAU,KAAK,aAAa,EAClC,KAAK,iBAAiB,MAAM,QAAQ,OAAO,EAC3C,GAAG,KAAK,CACV,EAAE,KAAK,IAAI,CACb,CAEA,YAAY,SAAU,GAAI,CACxB,IAAI,SAAW,MAAM,UAAU,MAAM,KACnC,KAAK,QAAQ,iBAAiB,QAAQ,CACxC,EAEA,OAAO,SAAS,IACd,SAAU,QAAS,CACjB,YAAK,WAAW,IAAI,QAAS,SAAU,KAAK,aAAa,EAAE,CAAC,EACrD,OACT,EAAE,KAAK,IAAI,CACb,CACF,CAEA,sBAAsB,OAAQ,UAAW,CACvC,OAAO,OAAO,OAAO,SAAU,QAAS,MAAO,CAC7C,OACE,MAAM,SACL,MAAM,OAAS,SAAW,MAAM,OAAS,aAE1C,QAAQ,KAAK,UAAU,CAAE,KAAM,MAAM,KAAM,MAAO,MAAM,KAAM,CAAC,CAAC,EAG3D,OACT,EAAG,CAAC,CAAC,CACP,CAEA,uBAAuB,QAAS,CAC9B,GAAI,OAAO,SAAY,SACrB,MAAM,IAAI,UAAU,QAAU,oBAAoB,EAGpD,GAAI,OAAO,QAAQ,SAAS,CAAC,EAAE,QAAY,IACzC,MAAM,IAAI,UACR,yJACF,EAEF,OAAO,OACT,CACF,CAEA,MAAM,YAAc,CAClB,eAAgB,uBAChB,YAAa,0CACb,mBACE,8DACF,kBAAmB,aACnB,OAAQ,eACV,EAEM,UAAY,CAChB,QAAS,WACT,YAAa,cACb,KAAM,MACR,EAiBA,MAAM,eAAgB,CACpB,YAAY,QAAS,YAAa,CAChC,KAAK,UAAY,QACjB,KAAK,YAAc,YACnB,KAAK,eAAiB,KAAK,UAAU,iBACnC,YAAY,WACd,EAEI,KAAK,aAAe,KAAK,eAAe,QAC1C,KAAK,KAAK,CAEd,CAEA,MAAO,CACL,KAAK,OAAO,CACd,CAEA,QAAS,CACP,KAAK,gBAAgB,EAErB,KAAK,eAAe,QAAS,IAAO,CAClC,MAAM,OAAS,GAAG,QAAQ,IAAI,YAAY,cAAc,GAAG,EAC3D,GAAI,CAAC,OAAQ,OACb,MAAM,IAAM,GAAG,OAAS,GAAG,aAAa,YAAY,iBAAiB,EAC/D,eAAiB,OAAO,aAAa,YAAY,cAAc,EAE/D,SAAW,SAAS,eAAgB,EAAE,EAAI,EAC1C,aAAe,GAAG,QAAQ,YAAY,MAAM,EAElD,IAAI,QAAU,CAAC,GAAG,KAAK,UAAU,EACjC,QAAQ,QAAQ,EAAI,IAEpB,MAAM,MAAQ,KAAK,YAAY,SAAS,KAAM,SAAY,CAExD,IAAI,aAAe,GACnB,QAAS,MAAQ,EAAG,MAAQ,QAAQ,OAAQ,QACtC,QAAQ,QAAQ,KAAK,IAAM,QAAQ,KAAK,IAC1C,aAAe,IAGnB,OAAO,YACT,CAAC,EAED,GAAG,UAAU,OAAO,UAAU,QAAS,UAAU,WAAW,EAC5D,GAAG,WAAW,UAAU,OAAO,UAAU,IAAI,EAEzC,cACF,aAAa,UAAU,OACrB,UAAU,QACV,UAAU,YACV,UAAU,IACZ,EAGE,OAAO,MAAU,KACnB,GAAG,UAAU,IAAI,UAAU,WAAW,EAElC,cACF,aAAa,UAAU,IAAI,UAAU,WAAW,GAEzC,OAAS,MAAM,YAAc,KACtC,GAAG,UAAU,IAAI,UAAU,OAAO,EAE9B,cACF,aAAa,UAAU,IAAI,UAAU,OAAO,GAK9C,OACA,MAAM,iBAAmB,MAAM,OAC/B,MAAM,SAAS,eAEf,GAAG,WAAW,UAAU,IAAI,UAAU,IAAI,CAE9C,CAAC,CACH,CAEA,iBAAkB,CAChB,KAAK,WAAa,CAAC,EAEnB,MAAM,QAAU,KAAK,UAAU,iBAC7B,YAAY,kBACd,EACI,QAAQ,QACV,QAAQ,QAAS,SAAY,CAC3B,MAAM,UAAY,QAAQ,MACtB,WAAa,YAAc,IAC7B,KAAK,WAAW,KAAK,SAAS,CAElC,CAAC,CAEL,CACF,CAEA,MAAM,YAAc,CAClB,QAAS,iBACT,YAAa,sBACb,oBAAqB,uBACrB,aAAc,uBACd,oBAAqB,8BACrB,oBAAqB,gCACrB,aAAc,uBACd,UAAW,qBACX,cAAe,0BACf,SAAU,mBACV,aAAc,uBACd,iBAAkB,sBAClB,eAAgB,0BAChB,0BAA2B,qCAC3B,iBAAkB,2BAClB,YAAa,sBACb,mBAAoB,wBACpB,aAAc,uBACd,cAAe,iBACf,aAAc,uBACd,iBAAkB,4BAClB,YAAa,sBACb,aAAc,uBACd,cAAe,6BACf,UAAW,4BACX,SAAU,sBACV,YAAa,sBACb,qBAAsB,0BACtB,aAAc,kBACd,UAAW,kCACX,aAAc,gCACd,WAAY,uBACZ,UAAW,oBACX,eAAgB,0BAChB,QAAS,sBACT,WAAY,qBACZ,kBAAmB,4BACnB,eAAgB,yBAChB,mBAAoB,8BACpB,cAAe,yBACf,eAAgB,0BAChB,cAAe,yBACf,aAAc,wBACd,aAAc,mBACd,eAAgB,yBAChB,aAAc,uBACd,iBAAkB,2BAClB,cAAe,gCACf,YAAa,sBACb,eAAgB,yBAChB,YAAa,kCACb,QAAS,kBACX,EAEM,UAAY,CAChB,OAAQ,SACR,eAAgB,mBAChB,mBAAoB,uBACpB,iBAAkB,uBAClB,aAAc,eACd,YAAa,cACb,aAAc,eACd,qBAAsB,sBACxB,EAEM,aAAe,CACnB,iBAAkB,qBAClB,mBAAoB,4BACpB,kBAAmB,0BACnB,aAAc,qBACd,YAAa,oBACb,eAAgB,uBAChB,QAAS,gBACT,QAAS,gBACT,eAAgB,qBAChB,UAAW,kBACX,mBAAoB,4BACpB,oBAAqB,6BACrB,qBAAsB,8BACtB,oBAAqB,4BACvB,EAEK,eAAe,IAAI,cAAc,GACpC,eAAe,OACb,eAEA,cAA0B,WAAY,CACpC,aAAc,CACZ,MAAM,CACR,CAEA,mBAAoB,CAQlB,GAPI,KAAK,aAAa,YAAY,IAElC,KAAK,cAAc,EAEnB,KAAK,UACH,KAAK,QAAQ,YAAY,OAAO,GAChC,KAAK,QAAQ,YAAY,aAAa,EACpC,CAAC,KAAK,WAAW,OAoDrB,GAlDA,KAAK,UAAY,KAAK,UAAU,QAAQ,UACxC,KAAK,QAAU,KAAK,UAAU,cAAc,YAAY,OAAO,EAC/D,KAAK,YAAc,KAAK,UAAU,cAChC,YAAY,WACd,EACA,KAAK,oBAAsB,KAAK,UAAU,cACxC,YAAY,mBACd,EACA,KAAK,cAAgB,KAAK,UAAU,cAClC,YAAY,aACd,EACA,KAAK,iBAAmB,KAAK,UAAU,cACrC,YAAY,gBACd,EACA,KAAK,gBAAkB,KAAK,UAAU,cACpC,YAAY,WACd,EACA,KAAK,WAAa,KAAK,UAAU,cAC/B,YAAY,UACd,EACA,KAAK,QAAU,KACf,KAAK,mBACH,KAAK,UAAU,aAAa,aAAa,kBAAkB,IAC3D,OAEF,KAAK,aAAe,KAAK,UAAU,cACjC,YAAY,YACd,EACA,KAAK,eAAiB,KAAK,UAAU,cACnC,YAAY,cACd,EACA,KAAK,aAAe,KAAK,UAAU,cACjC,YAAY,YACd,EACA,KAAK,gBAAkB,KAAK,UAAU,cACpC,YAAY,cACd,EAEA,KAAK,iBAAmB,KAAK,UAAU,cACrC,YAAY,gBACd,EAEA,KAAK,0BAA4B,KAAK,UAAU,cAC9C,YAAY,yBACd,EACA,KAAK,iBAAmB,KAAK,UAAU,cACrC,YAAY,gBACd,EACA,KAAK,qBAAuB,KAG1B,KAAK,2BACL,KAAK,0BAA0B,YAE/B,GAAI,CACF,KAAK,qBAAuB,KAAK,MAC/B,KAAK,0BAA0B,WACjC,CACF,OAAS,EAAG,CACV,QAAQ,KACN,kDACA,CACF,CACF,CAGF,GAAI,KAAK,iBAAkB,CACzB,MAAM,iBAAmB,KAAK,UAAU,cACtC,YAAY,YACd,EACI,mBACF,KAAK,gBAAkB,SACrB,iBAAiB,aAAa,aAAa,gBAAgB,EAC3D,EACF,EACA,KAAK,eAAiB,KAAK,UAAU,cACnC,YAAY,cACd,EACA,KAAK,qBAAuB,KAAK,UAAU,cACzC,YAAY,aACd,EACA,KAAK,cAAgB,KAGnB,KAAK,sBACL,KAAK,qBAAqB,YAAc,GAExC,KAAK,cAAgB,KAAK,MACxB,KAAK,qBAAqB,SAC5B,EAEA,QAAQ,KAAK,+BAA+B,EAGlD,CAEA,KAAK,cAAgB,KAAK,UAAU,cAClC,YAAY,oBACd,EACA,KAAK,mBACH,KAAK,UAAU,aAAa,aAAa,kBAAkB,IAC3D,OACF,KAAK,eAAiB,KAAK,UAAU,cACnC,YAAY,WACd,EACA,KAAK,aAAe,KAAK,UAAU,cACjC,YAAY,YACd,EACA,KAAK,UAAY,KAAK,UAAU,cAAc,YAAY,SAAS,EACnE,KAAK,WAAa,KAAK,UAAU,cAC/B,YAAY,UACd,EAEA,IAAI,YAAc,KAClB,MAAM,gBAAkB,KAAK,UAAU,cACrC,YAAY,WACd,EACI,kBACF,YAAc,gBAAgB,WAE5B,aACF,KAAK,YAAc,KAAK,MAAM,WAAW,EACzC,KAAK,SAAS,EACd,KAAK,QAAU,IAAI,gBACjB,KAAK,UACL,KAAK,WACP,GAEA,QAAQ,MAAM,sBAAsB,EAGtC,KAAK,oBAAsB,KAAK,UAAU,iBACxC,YAAY,kBACd,EACA,KAAK,eAAiB,KAAK,UAAU,iBACnC,YAAY,cACd,EACI,KAAK,oBAAoB,OAAS,GACpC,KAAK,kBAAkB,CAE3B,CAEA,eAAgB,CACd,KAAK,UAAY,KAAK,cAAc,YAAY,SAAS,EAEzD,KAAK,UAAU,iBAAiB,QAAU,GAAM,CAC9C,EAAE,eAAe,EAEjB,SAAS,cACP,IAAI,YAAY,iBAAkB,CAChC,OAAQ,CACN,OAAQ,KAAK,SACf,EACA,QAAS,EACX,CAAC,CACH,EAEK,KAAK,QAAQ,YAAY,aAAa,IACzC,OAAO,KAAK,YAAc,KAAK,UAEnC,CAAC,CACH,CAEA,SAAU,CACR,KAAK,YAAY,QAAQ,CAC3B,CAEA,UAAW,CACT,KAAK,YAAc,IAAI,kBACrB,KAAK,UACL,KAAK,YACL,CACE,eAAgB,KAAK,eAAe,KAAK,IAAI,EAC7C,aAAc,KAAK,aAAa,KAAK,IAAI,EACzC,iBAAkB,KAAK,iBAAiB,KAAK,IAAI,CACnD,CACF,EACA,KAAK,UAAU,KAAK,YAAY,aAAa,EAAG,EAAI,EACpD,KAAK,oBAAoB,EAEzB,KAAK,0BAA4B,IAAM,KAAK,kBAAkB,EAC9D,SAAS,iBACP,0BACA,KAAK,yBACP,CACF,CAEA,eAAe,IAAK,CAClB,KAAK,UAAU,IAAI,OAAO,CAC5B,CAEA,aAAa,IAAK,CACZ,KAAK,WACP,KAAK,UAAU,IAAI,OAAO,CAE9B,CAEA,iBAAiB,IAAK,CACpB,KAAK,UAAU,IAAI,OAAO,CAC5B,CAEA,UAAU,UAAW,KAAO,GAAO,CACjC,KAAK,aAAe,KAAK,gBAAgB,SAAS,EAClD,KAAK,qBAAqB,SAAS,EACnC,KAAK,uBAAuB,SAAS,EACrC,KAAK,oBAAoB,SAAS,EAClC,KAAK,mBAAmB,SAAS,EACjC,KAAK,eAAe,SAAS,EAC7B,KAAK,UAAU,SAAS,EACxB,KAAK,uBAAuB,SAAS,EACrC,KAAK,gBAAgB,SAAS,EAC9B,KAAK,kBAAkB,SAAS,EAChC,KAAK,aAAa,SAAS,EAC3B,KAAK,uBAAuB,SAAS,EACrC,KAAK,oBAAoB,SAAS,EAClC,KAAK,cAAc,SAAS,EAC5B,KAAK,SAAS,OAAO,SAAS,EAE1B,KAAK,oBAAsB,CAAC,MAC9B,KAAK,mBAAmB,SAAS,CAErC,CAEA,qBAAqB,UAAW,CAC9B,MAAM,QAAU,UAAU,QAE1B,IAAI,QAAU,MAAM,QAAQ,UAC5B,MAAM,aAAe,KAAK,UAAU,iBAClC,YAAY,YACd,EACM,UAAY,KAAK,UAAU,iBAC/B,YAAY,SACd,EACM,cAAgB,KAAK,UAAU,iBACnC,YAAY,aACd,EACM,YAAc,KAAK,UAAU,iBACjC,YAAY,WACd,EAEA,GAAI,KAAK,iBAAmB,QAAS,CACnC,MAAM,iBAAmB,KAAK,gBAAgB,cAC5C,YAAY,OACd,EACA,iBAAiB,MAAQ,QAAQ,GACjC,iBAAiB,cACf,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CACvC,CACF,CAEA,MAAM,gBAAkB,KAAK,kBAAkB,OAAO,EAChD,gBAAkB,KAAK,aAC3B,aAAa,mBACf,EACM,cAAgB,KAAK,UAAU,cACnC,uBACF,EAUA,IARI,iBAAmB,mBACrB,QAAU,MAAM,QAAQ,UAGrB,iBACH,eAAe,UAAU,OAAO,SAAU,CAAC,eAAe,EAGxD,MAAM,SAAS,mBAAoB,CACrC,MAAM,SACJ,KAAK,UAAU,cAAc,wBAAwB,GAAG,OACxD,EACI,WAAa,QAAQ,MAAQ,SACnC,IAAI,UACF,aAAe,EACX,OAAO,MAAM,QAAQ,KACrB,OAAO,MAAM,YAAY,WAAY,MAAM,WAAW,EAE5D,GACE,QAAQ,kBACR,QAAQ,iBAAmB,QAAQ,MACnC,CACA,MAAM,kBAAoB,QAAQ,iBAAmB,SACrD,UAAY,GAAG,SAAS,OAAO,OAAO,MAAM,YAAY,kBAAmB,MAAM,WAAW,CAAC,MAC/F,CAEA,QAAU,GAAG,OAAO,6BAA6B,SAAS,SAC5D,CAEI,aAAa,QAAU,SACzB,aAAa,QAAS,SAAY,CAChC,QAAQ,UAAU,OAAO,UAAU,MAAM,CAC3C,CAAC,EAGH,WAAW,QAAS,QAAW,CACzB,OAAO,aAAa,aAAa,cAAc,IAE/C,SACE,QAAQ,UACV,OAAO,SAAW,GAKpB,OAAO,SAAW,GAEtB,CAAC,EAED,eAAe,QAAS,SAAY,CAClC,IAAI,QAAU,QACV,QACG,QAAQ,YACX,QAAU,MAAM,QAAQ,SAG1B,QAAU,MAAM,QAAQ,YAG1B,QAAQ,UAAY,OACtB,CAAC,EAEG,YAAY,QACd,YAAY,QAAS,SAAY,CAC/B,GAAI,QAAS,CACP,QAAQ,UACV,QAAQ,UAAU,OAChB,UAAU,eACV,UAAU,kBACZ,GAEA,QAAQ,UAAU,IAAI,UAAU,cAAc,EAC9C,QAAQ,UAAU,OAAO,UAAU,kBAAkB,GAGvD,MAAM,WAAa,QAAQ,cACzB,YAAY,kBACd,EACI,aACF,WAAW,MAAQ,QAAQ,IAG7B,MAAM,QAAU,QAAQ,cACtB,GAAG,YAAY,OAAO,QACxB,EACI,UACF,QAAQ,MAAQ,QAAQ,GACxB,QAAQ,cAAc,IAAI,MAAM,QAAQ,CAAC,EAE7C,MACE,QAAQ,UAAU,IAAI,UAAU,kBAAkB,EAClD,QAAQ,UAAU,OAAO,UAAU,cAAc,CAErD,CAAC,CAEL,CAEA,uBAAuB,UAAW,CAChC,GAAI,CAAC,KAAK,oBAAqB,OAE/B,MAAM,aAAe,KAAK,oBAAoB,cAC5C,YAAY,YACd,EACM,oBAAsB,KAAK,oBAAoB,cACnD,YAAY,mBACd,EAEI,cAAgB,MAAQ,qBAAuB,OACjD,aAAa,YAAc,UAAU,QAAQ,MACzC,sBACF,oBAAoB,MAAQ,UAAU,QAAQ,MAGpD,CAEA,oBAAoB,UAAW,CAC7B,GAAI,CAAC,KAAK,cAAe,OAEzB,MAAM,WACJ,KAAK,kBAAkB,UAAU,OAAO,GACxC,KAAK,aAAa,aAAa,mBAAmB,EAEpD,KAAK,cAAc,gBAAgB,WAAY,CAAC,UAAU,CAC5D,CAEA,mBAAmB,UAAW,CAC5B,MAAM,QAAU,UAAU,QACpB,KAAO,UAAU,KACjBC,UAAW,OAAO,SAAS,KACjC,GAAI,SAAWA,UAAS,SAAS,UAAU,EAAG,CAC5C,MAAM,IAAM,IAAI,OAAO,IAAIA,SAAQ,EAC7B,OAAS,IAAI,aACnB,OAAO,IAAI,UAAW,QAAQ,EAAE,EAE9B,MACA,KAAK,QACL,KAAK,OAAO,IACZ,KAAK,aAAa,QAElB,OAAO,IAAI,eAAgB,KAAK,OAAO,EAAE,EAEzC,OAAO,OAAO,cAAc,EAE9B,IAAI,OAAS,OAAO,SAAS,EAC7B,MAAM,UAAY,IAAI,SAAS,EAC/B,OAAO,QAAQ,aAAa,CAAE,KAAM,SAAU,EAAG,GAAI,SAAS,CAChE,CACF,CAEA,gBAAgB,UAAW,CACzB,MAAM,QAAU,UAAU,QAS1B,GAPA,KAAK,kBAAkB,UAAU,OAC/B,UAAU,YACV,UAAU,aACV,UAAU,qBACV,UAAU,YACZ,EAEI,SAAW,KAAK,kBAAoB,KAAK,cAAe,CAC1D,MAAM,UAAY,KAAK,cAAc,QAAQ,EAAE,GAE3C,YAAc,OAAS,UAAY,IACrC,KAAK,iBAAiB,UAAU,IAAI,UAAU,YAAY,GAGxD,YAAc,MAAQ,WAAa,KAAK,kBAC1C,KAAK,iBAAiB,UAAU,IAAI,UAAU,WAAW,GAIzD,YAAc,OACb,UAAY,GAAK,UAAY,KAAK,mBAEnC,KAAK,iBAAiB,UAAU,IAAI,UAAU,YAAY,EAEtD,KAAK,iBACP,KAAK,eAAe,UAAY,WAGtC,KAAW,CAAC,SAAW,KAAK,kBAC1B,KAAK,iBAAiB,UAAU,IAAI,UAAU,oBAAoB,CAEtE,CAEA,kBAAkB,UAAW,CAE3B,MAAM,SADQ,WAAwB,KAAK,YAAY,aAAa,GAC9C,QACtB,GAAI,CAAC,QAAS,OAEd,MAAM,WAAa,GAAG,MAAM,OAAO,IAAI,YAAY,KAAK,YAAY,MAAM,0CAA0C,QAAQ,EAAE,GAE9H,MAAM,UAAU,EACb,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,MAAS,CACd,MAAM,OAAS,IAAI,UAAU,EAAE,gBAAgB,KAAM,WAAW,EAC1D,oBAAsB,OAC1B,OAAO,cAAc,YAAY,mBAAmB,EAAE,SACxD,EACM,aAAe,OAAO,cAC1B,YAAY,YACd,EAAE,UACI,kBAAoB,OAAO,YAAY,EACvC,wBACJ,KAAK,YAAY,SAAS,EAAI,oBAC9B,kBAGI,oBACJ,eAAiB,GAAK,wBAA0B,GAC5C,qBACJ,eAAiB,IAAM,sBAAwB,kBAC3C,OACA,OAEF,KAAK,YAAY,QAAQ,OAC3B,KAAK,YAAY,QAAQ,KAAK,aAC5B,aAAa,oBACb,mBACF,EACA,KAAK,YAAY,QAAQ,KAAK,aAC5B,aAAa,qBACb,oBACF,EAEJ,CAAC,EACA,MAAO,OAAU,QAAQ,IAAI,UAAW,KAAK,CAAC,CACnD,CAEA,mBAAoB,CAClB,GAAI,CAAC,KAAK,eAAgB,OAE1B,IAAI,aAAe,EAEnB,sBAAsB,IAAM,CAC1B,KAAK,oBAAoB,QAAS,MAAS,CACzC,MAAM,UAAY,KAAK,YACnB,UAAY,eACd,aAAe,UAEnB,CAAC,EAED,KAAK,eAAe,QAAS,MAAS,CACpC,KAAK,OAAO,YACV,uBACA,aAAe,IACjB,CACF,CAAC,CACH,CAAC,CACH,CAEA,YAAY,QAAS,CACnB,OAAO,QAAQ,uBAAuB,kBAAoB,EACtD,QAAQ,uBAAuB,eAC/B,QAAQ,uBAAuB,gBAC7B,QAAQ,uBAAuB,cACvC,CAEA,qBAAsB,CACJ,KAAK,UAAU,iBAC7B,YAAY,UACd,EAEQ,QAAS,QAAW,CAC1B,OAAO,iBACL,SACA,SAAU,EAAG,CACX,MAAM,IAAM,EAAE,OAAO,MAAM,SAAS,EAC9B,SAAW,KAAK,UAAU,cAC9B,IAAI,YAAY,SAAS,KAAK,GAAG,IACnC,EACM,OAAS,KAAK,UAAU,iBAC5B,IAAI,YAAY,SAAS,GAC3B,EACA,GAAI,SAAU,CACZ,SAAS,UAAU,OAAO,UAAU,MAAM,EAC1C,MAAM,MAAQ,SAAS,cAAc,uBAAuB,EAC5D,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,CACzC,CACA,OAAO,QAAS,OAAU,CACpB,QAAU,WACZ,MAAM,UAAU,IAAI,UAAU,MAAM,EACtB,MAAM,iBAClB,uBACF,EACM,QAAS,MAAS,CACtB,KAAK,QAAU,GACf,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,CACxC,CAAC,EAEL,CAAC,CACH,EAAE,KAAK,IAAI,CACb,CACF,CAAC,CACH,CAEA,eAAe,UAAW,CACnB,KAAK,eAEN,KAAK,aAAa,SACpB,KAAK,2BAA2B,SAAS,EAChC,KAAK,aAAa,OAC3B,KAAK,uBAAuB,SAAS,EAErC,KAAK,aAAa,UAAU,IAAI,UAAU,MAAM,EAEpD,CAEA,mBAAmB,QAAS,cAAe,CAGzC,MAAM,mBADJ,KAAK,QAAQ,YAAY,aAAa,GAAK,KAAK,WACZ,cACpC,YAAY,iBACd,EACM,eAAiB,kBACnB,kBAAkB,YAClB,KAEJ,GAAI,CAAC,eAAgB,MAAO,GAE5B,MAAM,mBAAqB,KAAK,MAAM,cAAc,EACpD,IAAI,oBAAsB,GAE1B,0BAAmB,QAAS,kBAAqB,CAC3C,OAAO,iBAAiB,UAAU,IAAM,QAAQ,KAClD,oBAAsB,iBAAiB,aAAa,IAAM,OAE9D,CAAC,EAEM,mBACT,CAEA,mBAAmB,QAAS,CAC1B,OAAO,KAAK,mBAAmB,QAAS,YAAY,CACtD,CAEA,kBAAkB,QAAS,CACzB,OAAO,KAAK,mBAAmB,QAAS,UAAU,CACpD,CAEA,uBAAuB,UAAW,CAChC,MAAM,QAAU,UAAU,QACpB,eAAiB,KAAK,cAAc,cACxC,YAAY,cACd,EACM,cAAgB,KAAK,cAAc,cACvC,YAAY,aACd,EACM,aAAe,SAAS,iBACxB,UAAY,SAAS,MAQ3B,GALI,KAAK,eACP,KAAK,aAAa,UAAY,OAAO,MAAM,QAAQ,MAAQ,QAK3D,CAAC,eACD,CAAC,KAAK,gBACN,CAAC,cACD,cAAgB,UAEhB,eAAe,UAAU,IAAI,UAAU,MAAM,MACxC,CAEL,KAAM,CAAE,QAAS,EAAI,cAAc,QACnC,IAAI,aAEA,UAAY,UACd,aAAe,OAAO,MAAM,YAC1B,KAAK,MAAM,aAAe,SAAS,EACnC,MAAM,WACR,GAGE,UAAY,eACd,aAAe,GAAG,KAAK,OAAQ,aAAe,WAAa,aAAgB,GAAG,CAAC,KAG7E,eACF,KAAK,eAAe,UAAY,aAChC,cAAc,UAAU,OAAO,UAAU,MAAM,EAEnD,CAGA,MAAM,YACJ,KAAK,cAAc,aAAa,aAAa,SAAS,GACtD,KAAK,mBAAmB,OAAO,EAC7B,gBACF,eAAe,UAAU,OAAO,UAAU,OAAQ,CAAC,WAAW,EAGhE,KAAK,aAAa,UAAU,OAAO,UAAU,MAAM,CACrD,CAEA,uBAAuB,UAAW,CAC5B,UAAU,MAAQ,KAAK,iBACzB,KAAK,gBAAgB,UAAY,UAAU,KAAK,OAAO,YACvD,KAAK,gBAAgB,UAAU,OAAO,UAAU,MAAM,GAC7C,KAAK,iBACd,KAAK,gBAAgB,UAAU,IAAI,UAAU,MAAM,CAEvD,CAEA,2BAA2B,UAAW,CAKpC,GAJI,KAAK,eACP,KAAK,aAAa,UAChB,OAAO,MAAM,QAAQ,cAAgB,eAErC,KAAK,gBAAkB,KAAK,aAAc,CAC5C,MAAM,WAAa,UAAU,KAAK,OAAO,kBAAkB,CAAC,EACtD,SAAW,WAAW,MACxB,YAAc,WAAW,aAAe,aAC1C,KAAK,eAAe,UAAY,GAAG,QAAQ,IAE3C,KAAK,eAAe,UAAY,OAAO,MAAM,YAC3C,SACA,MAAM,WACR,EAEF,KAAK,aAAa,UAAU,OAAO,UAAU,MAAM,CACrD,CACF,CAEA,oBAAoB,UAAW,CAC7B,MAAM,QAAU,UAAU,QACpB,KAAO,UAAU,KACD,KAAK,UAAU,iBACnC,YAAY,YACd,EAEc,QAASC,OAAS,CAC9B,MAAM,eAAiBA,MAAK,cAAc,YAAY,YAAY,EAC5D,eAAiBA,MAAK,cAAc,YAAY,YAAY,EAC5D,iBAAmBA,MAAK,cAC5B,YAAY,gBACd,EAEA,IAAI,aAAe,GACf,MAAQ,GAER,KAAK,aAAa,YACpB,aAAe,QAAQ,iBACvB,MAAQ,QAAQ,OAGd,KAAK,aAAa,UACpB,MAAQ,KAAK,WAAW,OAGtB,KAAK,aAAa,WACpB,aAAe,KAAK,WAAW,iBAC/B,MAAQ,KAAK,WAAW,OAGtB,iBACE,KAAK,aAAa,QAAU,KAAK,aAAa,UAChD,eAAe,UAAU,OAAO,UAAU,MAAM,EAChD,iBAAiB,UAAU,OAAO,UAAU,MAAM,EAClD,eAAe,UAAU,IAAI,UAAU,gBAAgB,IAEvD,eAAe,UAAU,IAAI,UAAU,MAAM,EAC7C,iBAAiB,UAAU,IAAI,UAAU,MAAM,EAC/C,eAAe,UAAU,OAAO,UAAU,gBAAgB,GAE5D,eAAe,UAAY,OAAO,MAAM,YACtC,aACA,MAAM,WACR,GAGF,eAAe,UACb,QAAU,EACN,OAAO,MAAM,QAAQ,KACrB,OAAO,MAAM,YAAY,MAAO,MAAM,WAAW,CACzD,CAAC,EAEG,KAAK,gBACP,KAAK,mBAAmB,SAAS,CAErC,CAEA,mBAAmB,UAAW,CAC5B,MAAM,QAAU,UAAU,QACpB,KAAO,UAAU,KACvB,IAAI,UAAY,KAShB,GAPI,SAAW,QAAQ,aACrB,UAAY,QAAQ,YAElB,MAAQ,KAAK,YAAc,KAAK,WAAW,aAC7C,UAAY,KAAK,WAAW,YAG1B,UAAW,CACb,MAAM,KAAO,KAAK,YAAY,OAAO,EAC/B,eAAiB,OAAO,MAAM,YAClC,UACA,MAAM,WACR,EACA,KAAK,UAAU,cAAc,YAAY,SAAS,EAAE,UAClD,eACF,KAAK,UAAU,cAAc,YAAY,QAAQ,EAAE,UAAY,KAC/D,KAAK,UACF,cAAc,YAAY,WAAW,EACrC,UAAU,OAAO,UAAU,MAAM,CACtC,MACE,KAAK,UACF,cAAc,YAAY,WAAW,EACrC,UAAU,IAAI,UAAU,MAAM,CAErC,CAEA,UAAU,UAAW,CACd,KAAK,aAEV,KAAK,WAAW,UAAY,GAAG,MAAM,QAAQ,GAAG,KAAK,UAAU,QAAQ,GAAG,GAC5E,CAEA,cAAc,UAAW,CACvB,MAAM,QAAU,UAAU,QAC1B,KAAK,UAAU,cACb,IAAI,YAAY,uBAAwB,CACtC,OAAQ,CACN,OACF,EACA,QAAS,EACX,CAAC,CACH,CACF,CAeA,gBAAgB,QAAS,CACvB,MAAM,QAAU,QAAQ,QAClB,KAAO,QAAQ,KAEf,aAAe,CACnB,UAAW,GACX,QAAS,GACT,OAAQ,GACR,cAAe,GACf,aAAc,GACd,QAAS,GACT,gBAAiB,GACjB,SAAU,EACZ,EAEA,MAAI,CAAC,SAAY,QAAQ,uBAAyB,CAAC,KACjD,aAAa,UAAY,IAEpB,QAAQ,YACX,aAAa,QAAU,IAGrB,QAAQ,iBAAmB,QAAQ,QACrC,aAAa,OAAS,IAGpB,QAAQ,aACV,aAAa,cAAgB,IAG3B,KAAK,SAAW,KAAK,QAAQ,wBAC/B,aAAa,aAAe,IAG1B,MAAQ,KAAK,YACf,aAAa,QAAU,GAErB,KAAK,WAAW,qBAAuB,KAAK,WAAW,QAEvD,aAAa,gBAAkB,IAE7B,QAAQ,MAAQ,KAAK,WAAW,QAClC,aAAa,SAAW,MAIvB,YACT,CAEA,mBAAmB,IAAK,CACtB,MAAM,QAAU,IAAI,SAAS,SAAW,IAAI,QAE5C,GAAI,SAEE,QAAQ,eAAgB,CAC1B,MAAM,cAAgB,KAAK,UAAU,cACnC,IAAI,aAAa,OAAO,KAAK,QAAQ,eAAe,EAAE,IACxD,EAIA,GAAI,cAAe,CACjB,MAAM,gBAAkB,cAAc,aACpC,aAAa,OACf,EACM,cAAgB,CAAC,OAAO,MAAM,SAAS,EACvC,kBACJ,KAAK,eAAe,aAClB,yBACF,IAAM,WAWR,GATA,cAAc,cACZ,IAAI,YAAY,qBAAsB,CACpC,QAAS,GACT,OAAQ,CACN,GAAI,eACN,CACF,CAAC,CACH,EAGE,eACA,CAAC,KAAK,cAAc,aAAa,aAAa,YAAY,GAC1D,CAAC,mBACD,KAAK,mBACL,CACA,MAAM,iBACJ,cAAc,sBAAsB,EAAE,IAGxC,SAAS,cACP,IAAI,YAAY,sBAAuB,CACrC,QAAS,GACT,OAAQ,CACN,eAAgB,EAClB,CACF,CAAC,CACH,EAEA,OAAO,MAAM,SAAS,gBAAgB,CACxC,CAGE,CAAC,eACD,CAAC,KAAK,cAAc,aAAa,aAAa,WAAW,GACzD,CAAC,mBAED,KAAK,iBAAiB,SAAS,CAC7B,KAAM,cAAc,UACtB,CAAC,CAEL,CACF,CAEJ,CAEA,aAAa,UAAW,CACtB,MAAM,QAAU,UAAU,QAC1B,GAAI,QAAS,CACX,MAAM,aAAe,KAAK,UAAU,iBAClC,YAAY,WACd,EACI,aAAa,QACf,aAAa,QAAS,aAAgB,CACpC,MAAM,gBAAkB,YAAY,QAClC,YAAY,cACd,EACA,GAAI,gBAAiB,CACnB,MAAM,eAAiB,gBAAgB,aACrC,aAAa,cACf,EACM,YAAc,SAAS,eAAgB,EAAE,EAAI,EAC7C,oBAAsB,QAAQ,QAAQ,WAAW,EACvD,YAAY,UAAY,mBAC1B,CACF,CAAC,CAEL,CACF,CAQA,uBAAuB,UAAW,CAChC,MAAM,QAAU,UAAU,QAE1B,GACE,CAAC,SACD,CAAC,KAAK,kBACN,CAAC,KAAK,qBAAqB,OAE3B,OAEF,MAAM,UAAY,QAAQ,GAAG,SAAS,EACtC,IAAI,YAAc,GAElB,UAAW,QAAQ,KAAK,qBAEtB,GADsB,KAAK,WAAW,SAAS,IACzB,WAAa,KAAK,gBAAiB,CACvD,YAAc,KAAK,gBACnB,KACF,CAGF,KAAK,iBAAiB,YAAc,YAEhC,YACF,KAAK,iBAAiB,UAAU,OAAO,UAAU,MAAM,EAEvD,KAAK,iBAAiB,UAAU,IAAI,UAAU,MAAM,CAExD,CACF,CACF,EAGF,SAAS,aAAa,OAAQ,CAC5B,MAAM,aAAe,GAAG,OAAO,MAAM,OAAO,IAAI,YAAY,MAAM,MAElE,OAAO,OACJ,MAAM,YAAY,EAClB,KAAM,UACE,SAAS,KAAK,CACtB,EACA,MAAO,GAAM,CACZ,QAAQ,MAAM,CAAC,CACjB,CAAC,CACL,CAEA,MAAM,YAAc,CAClB,mBAAoB,8BACpB,MAAO,sBACP,YAAa,mBACb,YAAa,6BACb,UAAW,oBACX,aAAc,uBACd,aAAc,uBACd,WAAY,qBACZ,WAAY,qBACZ,SAAU,yBACV,gBAAiB,kBACnB,EAEM,UAAY,CAChB,QAAS,aACT,OAAQ,SACR,WAAY,YACZ,OAAQ,QACV,EAEM,aAAe,CACnB,MAAO,oBACP,OAAQ,qBACR,MAAO,oBACP,UAAW,iBACX,YAAa,oBACb,QAAS,sBACT,YAAa,2BACb,aAAc,qBACd,aAAc,qBACd,mBAAoB,2BACtB,EAEA,MAAM,mBAAmB,WAAY,CACnC,aAAc,CACZ,MAAM,EAEN,KAAK,2BAA6B,IAAM,KAAK,kBAAkB,EAC/D,KAAK,sBAAyB,cAC5B,KAAK,iBAAiB,YAAY,EACpC,KAAK,YAAc,IAAM,KAAK,KAAK,CACrC,CAEA,mBAAoB,CAClB,KAAK,OAAS,KAAK,aAAa,aAAa,MAAM,EACnD,KAAK,gBAAkB,KAAK,QAAQ,YAAY,eAAe,EAC/D,KAAK,YAAc,KAAK,QAAQ,YAAY,WAAW,EACvD,KAAK,YAAc,KAAK,QAAQ,YAAY,WAAW,EACvD,KAAK,aAAe,KAAK,YAAY,cACnC,YAAY,YACd,EACA,KAAK,SAAW,SAAS,cAAc,YAAY,QAAQ,EAAE,UAC7D,KAAK,aAAe,KAAK,gBAAgB,EACzC,KAAK,cAAgB,MAAM,SAAS,sBACpC,SAAS,iBAAiB,qBAAsB,KAAK,WAAW,EAEhE,MAAM,MAAQ,KAAK,aAAa,aAAa,KAAK,EAAE,KAAK,EAAE,YAAY,EAEvE,aAAa,KAAK,MAAM,EAAE,KAAM,SAAY,CAC1C,KAAK,QAAU,QACf,KAAK,YAAc,QAAQ,QAAQ,KAAK,SAAU,QAAS,CACzD,OAAO,QAAQ,KAAK,YAAY,IAAM,OAAS,IACjD,CAAC,EAEG,KAAK,aACP,KAAK,KAAK,CAEd,CAAC,CACH,CAEA,MAAO,CACL,KAAK,UAAY,GACjB,KAAK,MAAQ,EACb,KAAK,aAAe,EACpB,KAAK,SAAW,KAAK,YAAY,OACjC,KAAK,cAAgB,EACrB,KAAK,eAAiB,GACtB,MAAM,YAAc,EAwGpB,GArGE,KAAK,aAAa,aAAa,kBAAkB,GAAK,QACtD,OAAO,MAAM,SAAS,IACrB,KAAK,eAAiB,UACrB,KAAK,eAAiB,QACtB,KAAK,eAAiB,aAExB,KAAK,eAAiB,IAGxB,KAAK,SAAS,QAAS,QAAW,CAChC,IAAI,QAAU,KACV,iBAAmB,GACnB,MAAQ,GAEZ,UAAW,kBAAkB,KAAK,QAAQ,SAAU,CAClD,MAAM,iBAAmB,eAAe,QAAQ,SAAS,MAAM,EAO/D,GALI,CAAC,SAAW,mBACd,QAAU,gBAIR,kBAAoB,eAAe,eAAgB,CACrD,MAAQ,eAAe,eAAe,cAAc,IACpD,QAAU,eACV,KACF,CACF,CAEA,UAAW,kBAAkB,KAAK,QAAQ,SAGxC,GAFyB,eAAe,QAAQ,SAAS,MAAM,GAEvC,eAAe,UAAW,CAChD,iBAAmB,GACnB,KACF,CAGF,GAAI,QAAS,CACX,MAAM,eAAiB,SAAS,cAAc,KAAK,EACnD,eAAe,UAAY,KAAK,SAChC,MAAM,aAAe,eAAe,cAClC,YAAY,YACd,EACM,WAAa,eAAe,cAChC,YAAY,UACd,EACM,WAAa,eAAe,cAChC,YAAY,UACd,EACM,aAAe,KAAK,aAAa,MAAM,EACvC,YACJ,MAAM,SAAS,cAAgB,SAC3B,aACA,SAAS,YAAY,IACrB,aAAe,QAAQ,MAAM,WAAW,IAAK,GAAG,EAEtD,aAAa,MAAQ,sBAAuB,IAAM,KAAK,MAAS,IAAI,IACpE,aAAa,UAAU,IAAI,GAAG,UAAU,MAAM,IAAI,YAAY,EAAE,EAChE,aAAa,QAAQ,QAAU,OAC/B,aAAa,QAAQ,cAAgB,QAAQ,GAC7C,aAAa,QAAQ,kBAAoB,aACzC,aAAa,QAAQ,YAAc,MACnC,aAAa,QAAQ,QAAU,QAAQ,GACvC,aAAa,MAAM,YAAY,WAAY,WAAW,EACtD,WAAW,KAAO,kBAAkB,KAAK,QAAQ,IAAK,QAAQ,EAAE,EAChE,WAAW,QAAQ,OAAS,OAC5B,WAAW,SAAW,CAAC,iBACvB,WAAW,UAAY,OAElB,KAAK,eAOC,KAAK,OAAS,aAAe,KAAK,iBAC3C,KAAK,WAAa,eAAe,UACjC,KAAK,gBARD,KAAK,eAAiB,UACxB,KAAK,WAAa,eAAe,UACxB,KAAK,OAAS,IACvB,KAAK,WAAa,eAAe,UACjC,KAAK,gBAMT,KAAK,OACP,CACA,KAAK,gBAED,KAAK,eAAiB,KAAK,SAAS,QACtC,KAAK,iBAAiB,cACpB,IAAI,MAAM,uBAAuB,CACnC,CAEJ,CAAC,EAED,KAAK,YAAc,KAAK,YAAY,cAClC,IAAI,aAAa,WAAW,GAC9B,EACA,KAAK,eAAiB,KAAK,iBAAiB,YAAY,UAAU,EAClE,KAAK,eAAiB,KAAK,YAAY,cACrC,YAAY,kBACd,EACA,KAAK,kBAAoB,EAErB,KAAK,YAAY,aAAa,aAAa,WAAW,EAAG,CAC3D,GACE,KAAK,eAAiB,QACtB,KAAK,eAAiB,cACtB,CAGA,GAFA,KAAK,YAAY,UAAY,GAAG,KAAK,KAAK,IAAI,KAAK,MAAQ,EAAI,MAAM,QAAQ,WAAa,MAAM,QAAQ,QAAQ,GAE5G,KAAK,eAAiB,OAAQ,OAElC,KAAK,YAAY,iBAAiB,aAAc,IAAM,CAChD,KAAK,mBAAmB,aAAa,KAAK,iBAAiB,EAE/D,KAAK,YAAY,UAAU,IAAI,UAAU,UAAU,EACnD,KAAK,eAAe,UAAU,IAAI,UAAU,OAAO,CACrD,CAAC,EAGD,KAAK,YAAY,iBAAiB,aAAc,IAAM,CACpD,KAAK,kBAAoB,WAAW,IAAM,CACxC,KAAK,YAAY,UAAU,OAAO,UAAU,UAAU,EACtD,KAAK,eAAe,UAAU,OAAO,UAAU,OAAO,CACxD,EAAG,GAAG,CACR,CAAC,CACH,CAMA,IAJI,KAAK,eAAiB,UAAY,KAAK,eAAiB,SAC1D,KAAK,eAAe,UAAU,IAAI,UAAU,OAAO,EAInD,KAAK,eAAiB,WACrB,KAAK,OAAS,aAAe,KAAK,eACnC,CACA,MAAM,aAAe,KAAK,MAAQ,KAAK,aAEvC,KAAK,eAAe,UAAU,IAAI,UAAU,OAAO,EAE/C,aAAe,IACjB,KAAK,WAAa,gCAAgC,YAAY,SAElE,CACF,CAEA,KAAK,uBAAuB,CAC9B,CAEA,wBAAyB,CACvB,KAAK,iBAAiB,YAAY,YAAY,GAAG,QAC9C,cAAiB,CAEhB,aAAa,iBACX,aACA,KAAK,qBACP,CACF,CACF,EAEA,KAAK,YAAY,iBACf,aACA,KAAK,0BACP,CACF,CAEA,iBAAiB,MAAO,CAEtB,MAAM,YADe,MAAM,OAExB,aAAa,aAAa,WAAW,GACpC,WAAW,IAAK,GAAG,EACjB,cAAgB,KAAK,aAAa,iBACtC,IAAI,aAAa,YAAY,GAC/B,EACM,qBAAuB,KAAK,aAAa,cAC7C,IAAI,aAAa,YAAY,KAAK,WAAW,IAC/C,EAGA,eAAe,QAAS,OAAU,CAChC,MAAM,UAAU,OAAO,UAAU,OAAO,CAC1C,CAAC,EAGD,sBAAsB,UAAU,IAAI,UAAU,OAAO,CACvD,CAEA,mBAAoB,CAElB,KAAK,aACF,iBAAiB,IAAI,aAAa,YAAY,KAAK,UAAU,OAAO,EAAE,GACrE,QAAS,OAAU,CACnB,MAAM,UAAU,OAAO,UAAU,OAAO,CAC1C,CAAC,CACL,CAEA,iBAAkB,CAChB,GAAI,CAAC,KAAK,aAAa,aAAa,YAAY,EAAG,MAAO,CAAC,EAG3D,MAAM,MAAQ,KAAK,aAAa,aAAa,YAAY,EAAE,MAAM,GAAG,EAG9D,WAAa,CAAC,EAGpB,cAAO,QAAS,MAAS,CACvB,KAAM,CAAC,IAAK,KAAK,EAAI,KAAK,MAAM,GAAG,EACnC,WAAW,IAAI,KAAK,CAAC,EAAI,MAAM,KAAK,CACtC,CAAC,EAEM,UACT,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,qBAAsB,KAAK,WAAW,CACrE,CACF,CAEA,MAAM,YAAc,CAClB,eAAgB,6BAChB,YAAa,sBACb,MAAO,qBACP,WAAY,2BACZ,OAAQ,sBACR,eAAgB,kBAChB,MAAO,QACP,MAAO,sBACP,QAAS,uBACX,EAEA,MAAM,oBAAoB,WAAY,CACpC,aAAc,CACZ,MAAM,EAEN,KAAK,MAAQ,KACb,KAAK,OAAS,KAAK,cAAc,YAAY,MAAM,EACnD,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,EAC/C,KAAK,eAAiB,KAAK,QAAQ,YAAY,cAAc,EAC7D,KAAK,QAAU,GAEf,KAAK,gBAAkB,IAAM,KAAK,kBAAkB,EACpD,KAAK,gBAAkB,IAAM,KAAK,kBAAkB,EAEpD,KAAK,iBAAiB,aAAc,KAAK,eAAe,EACxD,KAAK,iBAAiB,aAAc,KAAK,eAAe,CAC1D,CAEA,mBAAoB,CAClB,KAAK,qBAAqB,EAEtB,KAAK,eACP,KAAK,eAAe,iBAClB,+BACA,IAAM,CACJ,KAAK,kBAAkB,CACzB,CACF,EAEA,KAAK,kBAAkB,CAE3B,CAEA,sBAAuB,CACjB,KAAK,QACP,KAAK,MAAM,QAAQ,SAAW,GAC9B,KAAK,MAAM,QAAQ,EACnB,KAAK,MAAQ,MAGf,KAAK,oBAAoB,aAAc,KAAK,eAAe,EAC3D,KAAK,oBAAoB,aAAc,KAAK,eAAe,CAC7D,CAEA,mBAAoB,CACd,OAAO,MAAM,MACf,KAAK,UAAU,EAEf,KAAK,aAAa,CAEtB,CAEA,sBAAuB,CACrB,MAAM,YAAc,KAAK,QAAQ,YAAY,WAAW,EACpD,aACF,YAAY,iBAAiB,QAAU,GAAM,CACvC,EAAE,OAAO,QAAQ,YAAY,cAAc,GAC7C,EAAE,eAAe,CAErB,CAAC,CAEL,CAEA,WAAY,CACV,KAAK,MAAM,YACT,iBACA,KAAK,iBAAiB,YAAY,UAAU,EAAE,MAChD,EACA,KAAK,OAAO,iBAAiB,SAAU,KAAK,YAAY,CAC1D,CAEA,cAAe,CACb,MAAM,WAAa,KAAK,OAAO,WAAa,KAAK,OAAO,YACxD,KAAK,MAAM,YAAY,iBAAkB,UAAU,CACrD,CAEA,cAAe,CAEX,KAAK,OACL,CAAC,KAAK,QACN,KAAK,OAAO,UAAU,SAAS,kBAAkB,GACjD,KAAK,iBAAiB,YAAY,KAAK,EAAE,OAAS,IAIpD,KAAK,MAAQ,IAAI,OAAO,MAAM,SAAS,KAAK,OAAQ,CAClD,aAAc,YAAY,MAC1B,QAAS,GACT,WAAY,GACZ,SAAU,GACV,SAAU,GACV,UAAW,GACX,SAAU,GACV,gBAAiB,EACnB,CAAC,EAED,KAAK,MAAM,YAAY,EAEvB,KAAK,iBAAiB,aAAc,IAAM,CACxC,KAAK,MAAM,cAAc,CAC3B,CAAC,EAED,KAAK,iBAAiB,aAAc,IAAM,CACxC,KAAK,MAAM,YAAY,CACzB,CAAC,EACH,CAEA,mBAAoB,CAClB,KAAK,QAAU,GAEf,KAAK,aAAa,CACpB,CAEA,mBAAoB,CAClB,KAAK,QAAU,GAEf,KAAK,aAAa,CACpB,CAEA,cAAe,CACb,MAAM,QAAU,KAAK,cAAc,YAAY,OAAO,EAChD,MAAQ,KAAK,cAAc,YAAY,KAAK,EAC5C,cAAgB,SAAW,MAC3B,YAAc,KAAK,cAAc,YAAY,KAAK,EAExD,GAAI,cAAe,CACjB,IAAI,OAAS,KAAK,QAAU,YAAc,aACtC,OAAS,8BAA8B,MAAM,eAE7C,QACF,OAAS,KAAK,QAAU,OAAS,QACjC,OAAS,cAAc,MAAM,MAG/B,cAAc,cAAc,YAAY,OAAQ,GAAG,EAEnD,cAAc,iBAAiB,OAAS,GAAM,CAE5C,KAAK,aAAa,CACpB,CAAC,CACH,MAAW,cACL,KAAK,QACP,YAAY,KAAK,EAEjB,YAAY,MAAM,EAGxB,CACF,CAEA,MAAM,UAAY,CAChB,MAAO,WACP,SAAU,cACV,SAAU,cACV,MAAO,YACP,QAAS,aACT,KAAM,UACN,YAAa,6BACb,QAAS,aACT,mBAAoB,wBACtB,EAEM,YAAc,CAClB,UAAW,mBACX,WAAY,qBACZ,eAAgB,uBAChB,gBAAiB,qBACjB,WAAY,cACZ,SAAU,mBACV,cAAe,oBACf,OAAQ,SACR,UACE,oEACF,aAAc,uBACd,YAAa,gCACb,eAAgB,kCAChB,aAAc,6BACd,WAAY,+BACZ,gBAAiB,iBACjB,yBAA0B,6BAC1B,eAAgB,0BAChB,cAAe,yBACf,sBAAuB,kCACvB,QAAS,gBACX,EAEM,aAAe,CACnB,QAAS,UACT,UAAW,kBACX,YAAa,8BACb,eAAgB,uBAChB,eAAgB,uBAClB,EAEA,MAAM,wBAAwB,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,eAAiB,KAAK,cAAc,YAAY,cAAc,EAE/D,KAAK,iBACP,KAAK,MAAQ,KACb,KAAK,aAAe,KACpB,KAAK,UAAY,KAAK,eAAe,aACnC,aAAa,cACf,EACA,KAAK,YAAc,KAAK,eAAe,cACrC,YAAY,WACd,EACA,KAAK,OAAS,KAAK,aAAa,aAAa,aAAa,WAAW,EACrE,KAAK,eAAiB,KAAK,eAAe,cACxC,YAAY,cACd,EACA,KAAK,UAAY,KAAK,eAAe,cACnC,YAAY,eACd,EACA,KAAK,OAAS,KAAK,aAAe,KAAK,UACvC,KAAK,WAAa,KAAK,WAAW,KAAK,IAAI,EAC3C,KAAK,yBACH,KAAK,yBAAyB,KAAK,IAAI,EACzC,KAAK,KAAO,OAAO,MAAM,KACzB,KAAK,YAAc,GAEnB,KAAK,sBAAwB,KAAK,sBAAsB,KAAK,IAAI,EACjE,KAAK,sBAAwB,KAAK,sBAAsB,KAAK,IAAI,EAErE,CAEA,mBAAoB,CAId,KAAK,aACP,KAAK,YAAY,iBAAiB,QAAS,KAAK,qBAAqB,EAMnE,KAAK,WACP,KAAK,UAAU,iBAAiB,QAAU,GAAM,CAC9C,EAAE,eAAe,EAEjB,OAAO,KAAK,YAAc,KAAK,UAE/B,SAAS,cACP,IAAI,YAAY,iBAAkB,CAChC,OAAQ,CACN,OAAQ,KAAK,SACf,CACF,CAAC,CACH,CACF,CAAC,EAGC,KAAK,iBACP,KAAK,eAAe,iBAClB,eACA,KAAK,qBACP,EACA,KAAK,aAAa,EAEtB,CAEA,sBAAsB,EAAG,CACvB,EAAE,eAAe,EAEjB,MAAM,iBAAmB,KAAK,YAAY,aACxC,aAAa,cACf,EACM,qBAAuB,KAAK,YAAY,UAAU,SACtD,UAAU,kBACZ,EAEI,uBAEJ,KAAK,YAAY,UAAU,IAAI,UAAU,OAAO,EAChD,KAAK,YAAY,SAAW,GAGxB,kBAAoB,CAAC,uBACvB,KAAK,aAAe,EAAE,OAAO,QAAQ,YAAY,aAAa,EAC9D,KAAK,aAAa,UAAU,IAAI,UAAU,OAAO,GAGnD,KAAK,YAAY,EACnB,CAEA,YAAY,SAAU,CACpB,MAAM,YAAc,SAAS,cAC3B,GAAG,YAAY,aAAa,IAAI,aAAa,SAAS,KAAK,KAAK,SAAS,IAC3E,EAEA,GAAI,YACF,KAAK,MAAQ,YACb,KAAK,UAAU,MACV,CACL,MAAM,cAAgB,KAAK,eAAe,cACxC,YAAY,qBACd,EACA,GAAI,CAAC,cAAe,OAEpB,MAAM,WAAa,SAAS,cAAc,KAAK,EAC/C,WAAW,UAAY,cAAc,UAGrC,SAAS,KAAK,YACZ,WAAW,cAAc,YAAY,aAAa,CACpD,EACA,cAAc,OAAO,EAErB,KAAK,MAAQ,SAAS,cACpB,GAAG,YAAY,aAAa,IAAI,aAAa,SAAS,KAAK,KAAK,SAAS,IAC3E,EACA,KAAK,MAAM,cAAc,YAAY,YAAY,EAAE,UACjD,IAAI,UAAU,EACX,gBAAgB,SAAU,WAAW,EACrC,cAAc,YAAY,UAAU,EAAE,UAE3C,KAAK,qBAAqB,CAC5B,CACF,CAEA,WAAY,CACN,KAAK,cACP,KAAK,aAAa,cAChB,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAM,CAAC,CACzD,EAIE,OAAO,KAAK,MAAM,MAAS,YAC7B,KAAK,MAAM,KAAK,EAGlB,KAAK,MAAM,aAAa,OAAQ,EAAI,EACpC,KAAK,MAAM,gBAAgB,OAAO,EAElC,KAAK,eAAe,UAAU,IAAI,UAAU,QAAQ,EAEhD,KAAK,cACP,KAAK,YAAY,UAAU,OAAO,UAAU,OAAO,EACnD,KAAK,YAAY,SAAW,GAC5B,OAAO,KAAK,YAAc,KAAK,aAIjC,sBAAsB,IAAM,CAC1B,KAAK,MAAM,iBAAiB,YAAY,SAAS,EAAE,QAAS,MAAS,CACnE,KAAK,UAAU,IAAI,UAAU,QAAQ,CACvC,CAAC,CACH,CAAC,EAED,SAAS,cACP,IAAI,YAAY,uBAAwB,CAAE,QAAS,EAAK,CAAC,CAC3D,EACA,SAAS,cACP,IAAI,YAAY,oBAAqB,CAAE,QAAS,EAAK,CAAC,CACxD,EACA,SAAS,iBACP,sBACA,KAAK,yBACL,CAAE,KAAM,EAAK,CACf,CACF,CAEA,YAAa,CACX,GAAI,MAAK,YAIT,IAAI,CAAC,KAAK,MAAM,aAAa,aAAa,OAAO,EAAG,CAClD,KAAK,MAAM,aAAa,aAAa,QAAS,EAAE,EAChD,KAAK,YAAc,GACnB,MACF,CAGI,OAAO,KAAK,MAAM,OAAU,WAC9B,KAAK,MAAM,MAAM,EAEjB,KAAK,MAAM,gBAAgB,MAAM,EAGnC,KAAK,MAAM,gBAAgB,aAAa,OAAO,EAC/C,KAAK,MAAM,aAAa,QAAS,EAAE,EACnC,KAAK,MAAM,UAAU,OAAO,UAAU,OAAO,EAEzC,KAAK,cACP,KAAK,YAAY,SAAW,IAI5B,KAAK,gBACL,KAAK,eAAe,UAAU,SAAS,UAAU,QAAQ,GAEzD,KAAK,eAAe,UAAU,OAAO,UAAU,QAAQ,EAGzD,KAAK,mBAAmB,EAGnB,OAAO,MAAM,cAAc,GAC9B,SAAS,cACP,IAAI,YAAY,sBAAuB,CAAE,QAAS,EAAK,CAAC,CAC1D,EAGF,SAAS,oBACP,sBACA,KAAK,wBACP,EAEA,KAAK,KAAK,gBAAgB,EAC1B,KAAK,KAAK,qBAAqB,EACjC,CAEA,aAAc,CAEZ,KAAK,MACF,cAAc,YAAY,UAAU,GACnC,iBAAiB,QAAU,GAAM,CACjC,EAAE,eAAe,EACjB,KAAK,WAAW,CAClB,CAAC,EAGH,KAAK,MAAM,iBAAiB,QAAU,OAAU,CAC1C,MAAM,OAAO,WAAa,UAAY,MAAM,OAAS,SACvD,KAAK,WAAW,CAEpB,CAAC,EAGD,KAAK,MAAM,iBAAiB,UAAY,OAAU,CAC5C,MAAM,MAAQ,WAChB,MAAM,eAAe,EACrB,KAAK,WAAW,EAEpB,CAAC,EAED,KAAK,MAAM,iBAAiB,oBAAqB,IAAM,CACrD,KAAK,WAAW,CAClB,CAAC,EAGD,KAAK,MAAM,iBAAiB,eAAiB,OAAU,CACjD,MAAM,SAAW,KAAK,QAC1B,KAAK,YAAc,GAEf,KAAK,MAAM,aAAa,aAAa,OAAO,EAC9C,KAAK,WAAW,EAEhB,WAAW,IAAM,CACf,KAAK,KAAK,UAAU,KAAK,KAAK,GAE5B,KAAK,MAAM,cAAc,aAAa,GACtC,KAAK,MAAM,cAAc,YAAY,SAAS,IACnC,MAAM,CACrB,EAAG,EAAE,EAET,CAAC,CACH,CAEA,0BAA2B,CACzB,KAAK,qBAAqB,EACtB,KAAK,OAAS,KAAK,MAAM,aAAa,MAAM,GAC9C,KAAK,WAAW,CAEpB,CAEA,sBAAsB,EAAG,CACnB,EAAE,QAAU,KAAK,gBAErB,KAAK,eAAe,UAAU,OAAO,UAAU,QAAQ,CACzD,CAKA,cAAe,CACb,KAAK,eAAe,iBAAiB,mBAAqB,OAAU,CAClE,MAAM,OAAS,MAAM,OAAO,OACtB,cAAgB,OAAO,QAC3B,IAAI,YAAY,eAAe,GACjC,EACA,GAAI,CAAC,cAAe,OAEpB,MAAM,mBAAqB,OAAO,cAChC,YAAY,YACd,EACM,eAAiB,cAAc,UAAU,SAC7C,UAAU,WACZ,EACM,YAAc,cAAc,cAChC,YAAY,wBACd,EACM,OAAS,OAAO,cAAc,YAAY,eAAe,EAE/D,GAAI,OAAQ,CACV,OAAO,UAAU,OAAO,UAAU,MAAO,UAAU,OAAO,EAC1D,OAAO,UAAU,IAAI,UAAU,KAAK,EAEpC,MAAM,iBAAmB,IAAM,CAC7B,KAAK,qBAAqB,EAEtB,gBACF,YAAY,UAAU,OAAO,UAAU,MAAM,EAG/C,OAAO,oBAAoB,eAAgB,gBAAgB,CAC7D,EAEA,OAAO,iBAAiB,eAAgB,gBAAgB,CAC1D,CAEI,qBACF,mBAAmB,UAAY,MAAM,OAAO,aAG1C,gBACF,YAAY,UAAU,IAAI,UAAU,MAAM,CAE9C,CAAC,CACH,CAKA,sBAAuB,CACjB,KAAK,gBACP,KAAK,eAAe,UAAU,OAC5B,UAAU,QACV,UAAU,KACZ,EAGE,KAAK,iBACP,KAAK,eAAe,UAAU,OAAO,UAAU,KAAK,EACpD,KAAK,eAAe,SAAW,GAEnC,CAEA,aAAc,CACR,KAAK,MACP,KAAK,UAAU,EAEf,OACG,MACC,GAAG,OAAO,MAAM,OAAO,IAAI,YAAY,KAAK,MAAM,gCACpD,EACC,KAAK,KAAK,mBAAmB,EAC7B,KAAM,UACE,SAAS,KAAK,CACtB,EACA,KAAM,UAAa,CAClB,KAAK,YAAY,QAAQ,CAC3B,CAAC,CAEP,CAEA,sBAAuB,CACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EAEf,aAAa,KAAK,KAAK,CACzB,CAEA,oBAAoB,SAAU,CAC5B,OAAK,SAAS,GAUP,SATE,SAAS,KAAK,EAAE,KAAK,SAAU,KAAM,CAM1C,MALU,IAAI,WAAW,CACvB,OAAQ,SAAS,WACjB,QAAS,SAAS,QAClB,IACF,CAAC,CAEH,CAAC,CAGL,CAEA,oBAAqB,CACnB,KAAK,OAAO,iBAAiB,YAAY,SAAS,EAAE,QAAS,MAAS,CACpE,KAAK,UAAU,OAAO,UAAU,QAAQ,CAC1C,CAAC,CACH,CACF,CAEK,eAAe,IAAI,mBAAmB,GACzC,eAAe,OAAO,oBAAqB,eAAe,EAGvD,eAAe,IAAI,aAAa,GACnC,eAAe,OAAO,cAAe,UAAU,EAG5C,eAAe,IAAI,cAAc,GACpC,eAAe,OAAO,eAAgB,WAAW,EAGnD,MAAM,YAAc,CAClB,YAAa,sBACb,oBAAqB,+BACrB,eACE,iEACF,aAAc,kBACd,iBAAkB,4BAClB,QAAS,qBACX,EAEM,UAAY,CAChB,OAAQ,iBACR,SAAU,cACV,OAAQ,SACR,UAAW,aACX,YAAa,gBACb,YAAa,gBACb,YAAa,eACf,EAEM,aAAe,CACnB,YAAa,oBACb,WAAY,mBACZ,WAAY,mBACZ,QAAS,gBACT,QAAS,gBACT,KAAM,YACN,aAAc,qBACd,YAAa,oBACb,kBAAmB,yBACrB,EAEK,eAAe,IAAI,gBAAgB,GACtC,eAAe,OACb,iBACA,cAA4B,WAAY,CACtC,aAAc,CACZ,MAAM,EAEN,KAAK,YAAc,GACnB,KAAK,QAAU,GACf,KAAK,OAAS,GACd,KAAK,OAAS,EACd,KAAK,OAAS,EACd,KAAK,WAAa,EAClB,KAAK,mBAAsB,GAAM,KAAK,sBAAsB,CAAC,EAC7D,KAAK,UAAY,KAAK,QAAQ,YAAY,OAAO,EACjD,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,iBAAmB,KAAK,iBAAiB,KAAK,IAAI,EACvD,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,EACjD,KAAK,gBAAkB,KAAK,gBAAgB,KAAK,IAAI,EACrD,KAAK,YAAc,KAAK,YAAY,KAAK,IAAI,EAC7C,KAAK,kBAAoB,KAAK,iBAC5B,YAAY,YACd,EACA,KAAK,iBAAmB,KAAK,cAC3B,YAAY,gBACd,EACA,KAAK,UAAY,KAAK,UAAU,KAAK,IAAI,EACzC,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,EAC/C,KAAK,iBAAoB,GAAM,KAAK,yBAAyB,CAAC,EAC9D,KAAK,kBACH,KAAK,aAAa,aAAa,iBAAiB,GAAK,SACvD,KAAK,uBAAyB,KAAK,UAAU,SAC3C,yCACF,EACA,KAAK,aAAe,KAAK,oBAAoB,EAC7C,KAAK,qBAAuB,KAAK,qBAAqB,KAAK,IAAI,CACjE,CAEA,qBAAsB,CAEpB,MADI,OAAK,oBAAsB,YAC3B,KAAK,wBAA0B,CAAC,OAAO,MAAM,SAAS,EAI5D,CAEA,mBAAoB,CAClB,GAAI,SAAO,KAAK,KAAK,iBAAiB,EAAE,OAAS,GAEjD,IAAI,KAAK,aAAc,CACrB,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,MACF,CAEA,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,UAAU,EACjB,CAEA,sBAAuB,CACrB,KAAK,SAAS,EACd,KAAK,oBAAoB,CAC3B,CAEA,QAAS,CACP,SAAS,iBAAiB,qBAAsB,KAAK,YAAY,EACjE,SAAS,iBAAiB,qBAAsB,KAAK,SAAS,EAC9D,KAAK,iBAAiB,qBAAsB,KAAK,gBAAgB,CACnE,CAEA,UAAW,CACT,SAAS,oBAAoB,qBAAsB,KAAK,YAAY,EACpE,SAAS,oBAAoB,qBAAsB,KAAK,SAAS,EACjE,KAAK,oBAAoB,qBAAsB,KAAK,gBAAgB,CACtE,CAEA,cAAe,CACb,GAAI,KAAK,uBAAwB,CAC/B,MAAM,eAAiB,KAAK,oBAAoB,EAC5C,iBAAmB,KAAK,eACtB,KAAK,cACP,KAAK,oBAAoB,EAE3B,KAAK,qBAAqB,EAC1B,KAAK,aAAe,eAChB,KAAK,aACP,KAAK,iBAAiB,EAEtB,KAAK,qBAAqB,EAE5B,KAAK,UAAU,EAEnB,CAEA,GAAI,KAAK,aAAc,OAEvB,MAAM,aAAe,OAAO,MAAM,SAAS,EAGxC,cAAgB,KAAK,aAAa,aAAa,WAAW,GAC1D,CAAC,cAAgB,KAAK,aAAa,aAAa,YAAY,EAE7D,KAAK,mBAAmB,EAExB,KAAK,qBAAqB,CAE9B,CAEA,kBAAmB,CACjB,GAAI,CAAC,OAAO,MAAM,UAAY,CAAC,KAAK,iBAAkB,OAEtD,KAAK,kBAAkB,QAAS,OAAU,CACxC,MAAM,UAAU,OACd,UAAU,YACV,UAAU,WACZ,CACF,CAAC,EAED,KAAK,iBAAiB,KAAK,EAAE,QAAS,KAAQ,CAC5C,IAAI,aAAa,UAAW,OAAO,EACnC,IAAI,gBAAgB,eAAe,CACrC,CAAC,EAED,MAAM,cAAgB,KAAK,aAAa,aAAa,WAAW,EAC1D,aAAe,CAAC,GAAG,KAAK,iBAAiB,EAAE,UAC9C,OACC,MAAM,aAAa,aAAa,OAAO,IAAM,aACjD,EAEA,KAAK,MAAQ,IAAI,OAAO,MAAM,SAAS,KAAK,iBAAkB,CAC5D,aAAc,YAAY,aAC1B,UAAW,OACX,QAAS,GACT,eAAgB,GAChB,WAAY,GACZ,SAAU,GACV,gBAAiB,GACjB,WAAY,kDACZ,UAAW,GACX,cAAe,GACf,aAAc,cAAgB,EAAI,aAAe,CACnD,CAAC,EAED,KAAK,MAAM,GAAG,SAAU,KAAK,oBAAoB,EACjD,KAAK,qBAAqB,KAAK,MAAM,eAAiB,CAAC,EAEvD,OAAO,sBAAsB,IAAM,CACjC,KAAK,OAAO,OAAO,CACrB,CAAC,EAED,KAAK,iBAAiB,KAAK,EAAE,QAAS,KAAQ,CACxC,IAAI,UACR,IAAI,iBAAiB,OAAQ,IAAM,KAAK,OAAO,OAAO,EAAG,CACvD,KAAM,EACR,CAAC,CACH,CAAC,EAED,KAAK,wBAAwB,CAC/B,CAEA,yBAA0B,CACxB,KAAK,WAAa,EAClB,KAAK,kBAAoB,KACzB,KAAK,cAAgB,GACrB,KAAK,iBAAmB,KAAK,iBAAiB,KAAK,IAAI,EAEvD,KAAK,iBAAiB,iBACpB,QACA,KAAK,iBACL,CAAE,QAAS,EAAM,CACnB,CACF,CAEA,iBAAiB,EAAG,CAClB,GAAI,OAAO,MAAM,SAAS,GAAK,CAAC,KAAK,MAAO,OAE5C,MAAM,MACJ,KAAK,IAAI,EAAE,MAAM,EAAI,KAAK,IAAI,EAAE,MAAM,EAAI,EAAE,OAAS,EAAE,OAKzD,GAJI,QAAU,IAEd,EAAE,eAAe,EAEb,KAAK,eAAe,OAExB,KAAK,YAAc,MAEnB,OAAO,aAAa,KAAK,iBAAiB,EAC1C,KAAK,kBAAoB,OAAO,WAAW,IAAM,CAC/C,KAAK,WAAa,CACpB,EAAG,GAAG,EAGF,KAAK,IAAI,KAAK,UAAU,GADV,KAEZ,KAAK,WAAa,EACpB,KAAK,MAAM,KAAK,EAEhB,KAAK,MAAM,SAAS,EAGtB,KAAK,WAAa,EAClB,KAAK,cAAgB,GACrB,OAAO,WAAW,IAAM,CACtB,KAAK,cAAgB,EACvB,EAAG,GAAG,EAEV,CAEA,qBAAsB,CACf,KAAK,QAEN,KAAK,kBAAoB,KAAK,kBAChC,KAAK,iBAAiB,oBACpB,QACA,KAAK,gBACP,EAEF,OAAO,aAAa,KAAK,iBAAiB,EAE1C,KAAK,MAAM,IAAI,SAAU,KAAK,oBAAoB,EAClD,KAAK,MAAM,QAAQ,EACnB,KAAK,MAAQ,KACf,CAEA,qBAAqB,MAAO,CAC1B,MAAM,cAAgB,KAAK,kBAAkB,KAAK,EAClD,GAAI,CAAC,cAAe,OAEpB,MAAM,gBAAkB,cAAc,aACpC,aAAa,OACf,EACA,KAAK,eAAe,gBAAiB,CAAE,mBAAoB,EAAK,CAAC,CACnE,CAEA,oBAAqB,CACf,KAAK,cAET,KAAK,iBAAiB,iBACpB,YACA,KAAK,eACP,EACA,KAAK,iBAAiB,iBACpB,aACA,KAAK,gBACP,EACA,KAAK,iBAAiB,iBAAiB,UAAW,KAAK,aAAa,EACpE,KAAK,iBAAiB,iBACpB,YACA,KAAK,eACP,EACA,KAAK,iBAAiB,iBACpB,aACA,KAAK,gBACL,CAAE,QAAS,EAAK,CAClB,EACA,KAAK,iBAAiB,iBACpB,WACA,KAAK,cACL,CAAE,QAAS,EAAK,CAClB,EACA,KAAK,iBAAiB,iBACpB,YACA,KAAK,gBACL,CAAE,QAAS,EAAK,CAClB,EACA,KAAK,iBAAiB,iBAAiB,QAAS,KAAK,WAAW,EAChE,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAEzB,KAAK,YAAc,GACrB,CAEA,sBAAuB,CAChB,KAAK,cAEV,KAAK,iBAAiB,oBACpB,YACA,KAAK,eACP,EACA,KAAK,iBAAiB,oBACpB,aACA,KAAK,gBACP,EACA,KAAK,iBAAiB,oBACpB,UACA,KAAK,aACP,EACA,KAAK,iBAAiB,oBACpB,YACA,KAAK,eACP,EACA,KAAK,iBAAiB,oBACpB,aACA,KAAK,eACP,EACA,KAAK,iBAAiB,oBACpB,WACA,KAAK,aACP,EACA,KAAK,iBAAiB,oBACpB,YACA,KAAK,eACP,EACA,KAAK,iBAAiB,oBAAoB,QAAS,KAAK,WAAW,EACnE,KAAK,aAAa,EAElB,KAAK,YAAc,GACrB,CAEA,gBAAgB,EAAG,CACjB,KAAK,OAAS,GACd,KAAK,QACF,EAAE,OAAS,EAAE,eAAe,CAAC,EAAE,SAAW,KAAK,WAClD,KAAK,QACF,EAAE,OAAS,EAAE,eAAe,CAAC,EAAE,SAAW,KAAK,SACpD,CAEA,kBAAmB,CACZ,KAAK,SACV,KAAK,OAAS,GAChB,CAEA,cAAc,EAAG,CACf,MAAM,GAAK,EAAE,OAAS,EAAE,eAAe,CAAC,EAAE,SAAW,KAAK,WACpD,GAAK,EAAE,OAAS,EAAE,eAAe,CAAC,EAAE,SAAW,KAAK,UACpD,UAAY,EAAI,KAAK,OACrB,UAAY,EAAI,KAAK,OACrB,UAAY,UAAY,EAAI,EAAI,GAChC,QACJ,KAAK,gBAAgB,EAAE,aAAa,aAAa,IAAI,GACrD,KAAK,gBAAgB,EAAE,aAAa,aAAa,IAAI,IAAM,QAG3D,KAAK,IAAI,SAAS,EAAI,IACtB,KAAK,IAAI,SAAS,EAAI,KAAK,IAAI,SAAS,GACxC,UAEA,UAAY,EAAI,KAAK,cAAc,EAAI,KAAK,kBAAkB,GAGhE,KAAK,OAAS,GAEd,sBAAsB,IAAM,CAC1B,KAAK,UAAU,OAAO,UAAU,QAAQ,CAC1C,CAAC,CACH,CAEA,iBAAkB,CACX,KAAK,QAEV,KAAK,UAAU,IAAI,UAAU,QAAQ,CACvC,CAEA,YAAY,EAAG,CACT,EAAE,OAAS,aACb,KAAK,kBAAkB,EAGrB,EAAE,OAAS,cACb,KAAK,cAAc,CAEvB,CAEA,wBAAyB,CACvB,KAAK,iBAAiB,YAAY,WAAW,GAAG,QAAS,QAAW,CAClE,OAAO,iBAAiB,QAAU,GAAM,CACtC,EAAE,eAAe,EAEb,EAAE,OAAO,aAAa,aAAa,UAAU,GAC/C,KAAK,kBAAkB,EAGrB,EAAE,OAAO,aAAa,aAAa,UAAU,GAC/C,KAAK,cAAc,CAEvB,CAAC,CACH,CAAC,CACH,CAGA,qBAAsB,CAChB,KAAK,iBAAiB,aAAe,IACvC,KAAK,iBAAiB,WAAa,EAEvC,CAEA,YAAa,CAEX,GAAI,CAAC,KAAK,QAAQ,OAAQ,CACxB,MAAM,YAAc,SAAS,cAAc,KAAK,EAChD,YAAY,UAAU,IAAI,UAAU,MAAM,EAC1C,YAAY,UACV,MAAM,aAAa,KAAO,MAAM,aAAa,KAG/C,KAAK,iBAAiB,OAAO,WAAW,EACxC,KAAK,QAAU,KAAK,iBAAiB,YAAY,WAAW,EAC5D,KAAK,WAAa,KAAK,cACrB,IAAI,aAAa,UAAU,GAC7B,EACA,KAAK,WAAa,KAAK,cACrB,IAAI,aAAa,UAAU,GAC7B,CACF,CAEA,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,CAChC,CAEA,cAAe,CACb,KAAK,cAAc,IAAI,UAAU,MAAM,EAAE,GAAG,OAAO,CACrD,CAEA,0BAA2B,CACzB,KAAK,YAAY,iBAAiB,YAAa,IAAM,CACnD,MAAM,GAAK,KAAK,mBAAmB,EACnC,KAAK,aAAa,EAAE,CACtB,CAAC,EAED,KAAK,YAAY,iBAAiB,YAAa,IAAM,CACnD,MAAM,GAAK,KAAK,eAAe,EAC/B,KAAK,aAAa,EAAE,CACtB,CAAC,CACH,CAEA,aAAa,GAAI,CACf,KAAK,cACH,IAAI,aAAa,OAAO,KAAK,EAAE,QACjC,GAAG,aAAa,UAAW,OAAO,CACpC,CAEA,yBAAyB,EAAG,CAC1B,MAAM,GAAK,EAAE,OAAO,GACpB,KAAK,eAAe,EAAE,CACxB,CAEA,iBAAkB,CAChB,OAAO,KAAK,cACV,GAAG,YAAY,YAAY,IAAI,UAAU,WAAW,EACtD,CACF,CAEA,gBAAiB,CACf,MAAM,aAAe,KAAK,gBAAgB,EAM1C,OALkB,cAAc,mBAAmB,aACjD,aAAa,OACf,EACI,cAAc,mBACd,KAAK,cAAc,YAAY,YAAY,IAC7B,aAAa,aAAa,OAAO,CACrD,CAEA,oBAAqB,CACnB,MAAM,aAAe,KAAK,gBAAgB,EACpC,UAAY,KAAK,kBAAkB,OAAS,EAKlD,OAHE,cAAc,wBACd,KAAK,kBAAkB,SAAS,IAEZ,aAAa,aAAa,OAAO,CACzD,CAEA,eAAgB,CACd,MAAM,GAAK,KAAK,eAAe,EAC/B,KAAK,YAAY,EAAE,CACrB,CAEA,mBAAoB,CAClB,MAAM,GAAK,KAAK,mBAAmB,EACnC,KAAK,YAAY,EAAE,CACrB,CAEA,YAAY,GAAI,CACd,KAAK,cACH,IAAI,YAAY,qBAAsB,CACpC,OAAQ,CACN,EACF,CACF,CAAC,CACH,CACF,CAEA,eAAe,GAAI,QAAU,CAAC,EAAG,CAC/B,GAAI,CAAC,GAAI,OAET,KAAK,aAAa,aAAa,YAAa,EAAE,EAE9C,MAAM,YAAc,KAAK,cACvB,GAAG,YAAY,YAAY,IAAI,UAAU,WAAW,EACtD,EACM,cAAgB,KAAK,cACzB,IAAI,aAAa,OAAO,KAAK,EAAE,IACjC,EACA,GAAI,CAAC,cAAe,OACpB,MAAM,mBAAqB,eAAe,cACxC,YAAY,cACd,EACM,cAAgB,cAAc,cAAc,gBAAgB,EAElE,GAAI,KAAK,aAAc,CAWrB,GAVA,KAAK,kBAAkB,QAAS,OAAU,CACxC,MAAM,WACJ,MAAM,aAAa,aAAa,OAAO,IAAM,GAC/C,MAAM,UAAU,OAAO,UAAU,YAAa,UAAU,EACxD,MAAM,UAAU,OACd,UAAU,YACV,UAAU,WACZ,CACF,CAAC,EAEG,CAAC,QAAQ,oBAAsB,KAAK,MAAO,CAC7C,MAAM,YAAc,CAAC,GAAG,KAAK,iBAAiB,EAAE,UAC7C,OAAU,MAAM,aAAa,aAAa,OAAO,IAAM,EAC1D,EAEE,aAAe,GACf,KAAK,MAAM,gBAAkB,aAE7B,KAAK,MAAM,OAAO,WAAW,CAEjC,CAGE,eACA,cAAc,aAAa,QAAQ,IAAM,IAEzC,cACG,cAAc,YAAY,mBAAmB,GAC5C,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAM,CAAC,CAAC,EAG1D,sBAAsB,IAAM,CACtB,SAAS,KAAK,UAAU,SAAS,UAAU,SAAS,GACtD,oBAAoB,MAAM,CAE9B,CAAC,EAED,MACF,CAEA,aAAa,UAAU,IAAI,UAAU,WAAW,EAChD,aAAa,UAAU,OAAO,UAAU,WAAW,EAEnD,eAAe,UAAU,OACvB,UAAU,YACV,UAAU,WACZ,EACA,eAAe,UAAU,IAAI,UAAU,WAAW,EAG9C,eAAiB,cAAc,aAAa,QAAQ,IAAM,IAC5D,cACG,cAAc,YAAY,mBAAmB,GAC5C,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAM,CAAC,CAAC,EAG1D,sBAAsB,IAAM,CAC1B,KAAK,UAAU,EAGX,SAAS,KAAK,UAAU,SAAS,UAAU,SAAS,GACtD,oBAAoB,MAAM,CAE9B,CAAC,CACH,CAGA,WAAY,CACV,GAAI,KAAK,aAAc,CACrB,KAAK,MAAM,eAAe,UAAU,EACpC,MACF,CAEA,MAAM,YACJ,KAAK,cACH,GAAG,YAAY,YAAY,IAAI,UAAU,WAAW,EACtD,GAAG,cAAgB,KAAK,kBAAkB,CAAC,GAAG,aAChD,KAAK,MAAM,YAAY,WAAY,GAAG,WAAW,IAAI,CACvD,CAEA,sBAAuB,CACjB,KAAK,cAET,KAAK,kBAAkB,QAAS,OAAU,CACxC,MAAM,iBAAiB,gBAAkB,GAAM,CAE3C,EAAE,QAAU,OACZ,MAAM,UAAU,SAAS,UAAU,WAAW,IAE9C,MAAM,UAAU,OAAO,UAAU,WAAW,EAC5C,MAAM,UAAU,IAAI,UAAU,WAAW,EAE7C,CAAC,EACD,MAAM,iBAAiB,mBAAqB,GAAM,CAE9C,EAAE,QAAU,OACZ,MAAM,UAAU,SAAS,UAAU,WAAW,IAE9C,MAAM,UAAU,OAAO,UAAU,WAAW,EAC5C,MAAM,UAAU,IAAI,UAAU,WAAW,EAE7C,CAAC,CACH,CAAC,CACH,CACF,CACF,EAUF,SAAS,iBAAiB,IAAK,KAAM,CACnC,GAAI,OAAS,KACX,OAAO,IAGT,GAAI,OAAS,SACX,OAAO,eAAe,GAAG,EAG3B,MAAM,MAAQ,IAAI,MAChB,sDACF,EAEA,GAAI,MAAO,CACT,MAAM,OAAS,IAAI,MAAM,MAAM,CAAC,CAAC,EAC3B,OAAS,MAAM,CAAC,EAEtB,OAAO,eAAe,GAAG,OAAO,CAAC,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,CACvD,KACE,QAAO,IAEX,CAEA,SAAS,eAAe,KAAM,CAC5B,OAAO,KAAK,QAAQ,YAAa,EAAE,CACrC,CAEA,MAAM,YAAc,CAClB,eAAgB,yBAChB,YAAa,sBACb,gBAAiB,mBACjB,YAAa,6BACb,aAAc,+BACd,oBAAqB,+BACrB,aAAc,uBACd,aAAc,uBACd,gBAAiB,0BACjB,YAAa,qBACf,EAEM,UAAY,CAChB,QAAS,aACT,KAAM,UACN,WAAY,YACZ,OAAQ,WACV,EAEM,aAAe,CACnB,kBAAmB,2BACnB,eAAgB,uBAChB,aAAc,qBACd,YAAa,oBACb,aAAc,qBACd,YAAa,oBACb,mBAAoB,2BACtB,EAEA,MAAM,eAAgB,CACpB,YAAY,SAAU,QAAS,CAC7B,KAAK,SAAW,SAChB,KAAK,QAAU,QACf,KAAK,aAAe,KAAK,QAAQ,iBAC/B,YAAY,WACd,EACA,KAAK,eAAiB,KAAK,QAAQ,cACjC,YAAY,cACd,EACA,KAAK,aAAe,KAAK,QAAQ,cAAc,YAAY,YAAY,EACvE,KAAK,aAAe,KAAK,QAAQ,cAAc,YAAY,YAAY,EACvE,KAAK,oBAAsB,KAAK,QAAQ,cACtC,YAAY,mBACd,EAEA,KAAK,KAAK,CACZ,CAEA,MAAO,CACL,KAAK,mBAAmB,EAExB,KAAK,QAAQ,iBAAiB,aAAc,IAC1C,KAAK,mBAAmB,CAC1B,EAEA,KAAK,SAAS,QAAS,QAAW,CAChC,OAAO,iBAAiB,aAAe,OACrC,KAAK,YAAY,KAAK,CACxB,CACF,CAAC,EAEG,KAAK,aAAa,QACpB,KAAK,SAAS,QAAS,QAAW,CAChC,OAAO,iBAAiB,QAAS,IAAM,CACrC,KAAK,aAAa,CAAC,EAAE,MAAM,CAC7B,CAAC,CACH,CAAC,CAEL,CAEA,oBAAqB,CACnB,KAAK,iBAAmB,KAAK,aAAa,CAAC,EAAE,aAC3C,aAAa,WACf,EACI,KAAK,aAAa,CAAC,EAAE,aAAa,aAAa,WAAW,EAC1D,GACJ,KAAK,kBAAoB,KAAK,aAAa,UAEvC,KAAK,iBACP,KAAK,oBAAsB,KAAK,eAAe,UAEnD,CAEA,oBAAqB,CACnB,KAAK,QAAQ,UAAU,OAAO,UAAU,MAAM,EAE1C,KAAK,kBACP,KAAK,aAAa,QAAS,aAAgB,CACzC,YAAY,KAAO,KAAK,gBAC1B,CAAC,EAGC,KAAK,eACP,KAAK,aAAa,UAAY,KAAK,mBAGjC,KAAK,gBAAkB,KAAK,iBAC9B,KAAK,eAAe,UAAY,KAAK,oBACrC,KAAK,eAAe,MAAQ,KAAK,qBAGnC,KAAK,iBAAiB,CACxB,CAEA,YAAY,MAAO,CACjB,MAAM,OAAS,MAAM,OACf,YAAc,OAAO,aAAa,aAAa,WAAW,EAC5D,OAAO,aAAa,aAAa,WAAW,EAC5C,GACE,aAAe,OAAO,aAAa,aAAa,YAAY,EAC9D,OAAO,aAAa,aAAa,YAAY,EAC7C,GACE,eAAiB,OAAO,aAAa,aAAa,cAAc,EAClE,OAAO,aAAa,aAAa,cAAc,EAC/C,GACE,aAAe,OAAO,aAAa,aAAa,YAAY,EAC9D,OAAO,aAAa,aAAa,YAAY,EAC7C,GAEA,aACF,KAAK,aAAa,QAAS,aAAgB,CACzC,YAAY,KAAO,WACrB,CAAC,EAGC,eACF,KAAK,aAAa,UAAY,uBAAuB,YAAY,WAG/D,KAAK,iBACH,gBACF,KAAK,eAAe,UAAY,eAChC,KAAK,eAAe,MAAQ,iBAE5B,KAAK,eAAe,UAAY,GAChC,KAAK,eAAe,MAAQ,KAI5B,cACF,KAAK,iBAAiB,YAAY,CAEtC,CAEA,iBAAiB,aAAc,CAC7B,GAAI,CAAC,KAAK,oBAAqB,OAG/B,MAAM,MAAQ,OAAO,kBAAoB,EACnC,OAAS,KAAK,aAAa,YAAc,MACzC,aAAe,KAAK,KAAK,OAAS,GAAG,EAAI,IACzC,SAAW,iBAAiB,aAAc,GAAG,YAAY,GAAG,EAC5D,YAAc,KAAK,oBAAoB,cAC3C,SAAS,QAAQ,IACnB,EACM,iBAAmB,IAAM,CAC7B,KAAK,oBAAoB,UAAU,IAAI,UAAU,OAAO,EACxD,KAAK,oBACF,cAAc,SAAS,QAAQ,IAAI,EACnC,UAAU,IAAI,UAAU,IAAI,CACjC,EACM,WAAa,IAAM,CACvB,KAAK,oBAAoB,iBAAiB,KAAK,EAAE,QAAS,OAAU,CAClE,MAAM,UAAU,OAAO,UAAU,IAAI,CACvC,CAAC,EACD,sBAAsB,gBAAgB,CACxC,EAEA,GAAI,YACF,WAAW,MACN,CACL,MAAM,SAAW,SAAS,cAAc,KAAK,EAE7C,SAAS,IAAM,SAEX,KAAK,iBACP,SAAS,IAAM,KAAK,eAAe,WAGrC,SAAS,iBAAiB,OAAQ,IAAM,CACtC,KAAK,oBAAoB,OAAO,QAAQ,EAExC,WAAW,CACb,CAAC,CACH,CACF,CAEA,kBAAmB,CACZ,KAAK,sBAEV,KAAK,oBAAoB,UAAU,OAAO,UAAU,OAAO,EAC3D,KAAK,oBAAoB,iBAAiB,KAAK,EAAE,QAAS,OAAU,CAClE,MAAM,UAAU,OAAO,UAAU,IAAI,CACvC,CAAC,EACH,CACF,CAEA,MAAM,wBAAwB,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,YAAc,IAAM,KAAK,aAAa,CAC7C,CAEA,cAAe,CACT,KAAK,iBAAmB,KAAK,cAE7B,KAAK,eAAiB,QACtB,KAAK,eAAiB,UACtB,KAAK,eAAiB,aAEtB,KAAK,gBAAgB,UAAU,IAAI,UAAU,OAAO,EACpD,KAAK,qBAAqB,EAGhC,CAEA,mBAAoB,CAClB,KAAK,QAAU,KAAK,QAAQ,YAAY,eAAe,EACvD,KAAK,aAAe,KAAK,cAAc,YAAY,YAAY,EAC/D,KAAK,gBAAkB,KAAK,cAAc,YAAY,eAAe,EACrE,KAAK,aAAe,KAAK,iBAAiB,YAAY,WAAW,EACjE,KAAK,YAAc,KAAK,QAAQ,YAAY,WAAW,EACvD,KAAK,YAAc,KAAK,QAAQ,YAAY,IAAI,EAChD,KAAK,kBAAoB,EACzB,KAAK,cAAgB,MAAM,SAAS,sBAEpC,SAAS,iBAAiB,qBAAsB,KAAK,WAAW,EAE5D,KAAK,iBAAmB,KAAK,eAE7B,KAAK,eAAiB,QACtB,KAAK,eAAiB,UACtB,KAAK,eAAiB,aAEtB,KAAK,gBAAgB,UAAU,IAAI,UAAU,OAAO,EACpD,KAAK,qBAAqB,GAGxB,KAAK,eACP,KAAK,aAAa,iBAAiB,aAAc,IAC/C,KAAK,aAAa,CACpB,EAGA,KAAK,YAAY,iBAAiB,aAAc,IAC9C,KAAK,aAAa,CACpB,IAIA,KAAK,aAAa,QACpB,IAAI,gBAAgB,KAAK,aAAc,KAAK,OAAO,CAEvD,CAEA,sBAAuB,CACrB,MAAM,SAAW,OAAO,MAAM,SAAS,EACjC,qBAAuB,KAAK,cAChC,IAAI,aAAa,kBAAkB,GACrC,EACM,iBACJ,sBAAsB,aAAa,aAAa,kBAAkB,IAClE,OAGF,GAAI,CAAC,KAAK,cAAc,QAAW,UAAY,CAAC,iBAC9C,OAIF,GAAI,CAAC,UAAY,KAAK,gBAAkB,UAAW,CAEjD,KAAK,aAAa,QAAS,QAAW,CACpC,OAAO,MAAM,QAAU,EACzB,CAAC,EAED,MAAMC,qBAAsB,KAAK,cAAc,iBAAiB,EAC5DA,sBACFA,qBAAoB,OAAO,EAE7B,MACF,CAEA,MAAM,WAAa,SAAW,EAAI,EAC5B,cAAgB,KAAK,aAAa,OAClC,gBAAkB,KAAK,IAAI,WAAY,aAAa,EACpD,kBAAoB,cAAgB,gBAG1C,KAAK,aAAa,QAAQ,CAAC,OAAQ,QAAU,CAC3C,OAAO,MAAM,QAAU,MAAQ,gBAAkB,GAAK,MACxD,CAAC,EAGD,MAAM,oBAAsB,KAAK,cAAc,iBAAiB,EAChE,GAAI,kBAAoB,EACtB,GAAK,oBAMH,oBAAoB,YAAc,IAAI,iBAAiB,OAN/B,CACxB,MAAM,gBAAkB,SAAS,cAAc,KAAK,EACpD,gBAAgB,UAAY,iBAC5B,gBAAgB,YAAc,IAAI,iBAAiB,GACnD,sBAAsB,YAAY,eAAe,CACnD,MAGS,qBACT,oBAAoB,OAAO,CAE/B,CAEA,cAAe,CACT,KAAK,mBAAmB,aAAa,KAAK,iBAAiB,EAE3D,KAAK,aACP,KAAK,YAAY,UAAU,IAAI,UAAU,UAAU,EAGjD,KAAK,eAAiB,QAE1B,KAAK,gBAAgB,UAAU,IAAI,UAAU,OAAO,CACtD,CAEA,cAAe,CACb,KAAK,kBAAoB,WAAW,IAAM,CACpC,KAAK,aACP,KAAK,YAAY,UAAU,OAAO,UAAU,UAAU,EAGxD,KAAK,gBAAgB,UAAU,OAAO,UAAU,OAAO,CACzD,EAAG,GAAG,CACR,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,qBAAsB,KAAK,WAAW,CACrE,CACF,CAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OAAO,mBAAoB,eAAe,EAa3D,QAAQ,UAAY,UAAY,CAC9B,MAAM,OAAS,CACb,cAAe,EACf,uBAAwB,GACxB,UAAW,2BACX,QAAS,KACT,OAAQ,wBACR,WAAY,IACd,EAEA,IAAI,mBAAqB,CAAC,EACtB,QAAU,KACV,mBAAqB,KAEzB,MAAM,MAAQ,IAAI,KACZ,YAAc,IAAI,KAExB,YAAY,QAAQ,MAAM,QAAQ,EAAI,KAAU,GAD3B,EAC4C,EAEjE,MAAM,OAAS,CACb,cAAe,CACb,QAAS,YAAY,YAAY,EACjC,KAAM,IACN,OAAQ,OAAO,SAAS,SACxB,SAAU,OACV,OAAQ,EACV,EACA,KAAM,0BACN,MAAO,SAAU,eAAgB,CAC/B,MAAM,qBAAuB,mBAC3B,eAAe,KAAK,GAAG,CACzB,EACA,SAAS,OAAS,GAAG,KAAK,IAAI,IAAI,oBAAoB,aAAa,KAAK,cAAc,OAAO,UAAU,KAAK,cAAc,IAAI,YAAY,KAAK,cAAc,MAAM,cAAc,KAAK,cAAc,QAAQ,YAAY,KAAK,cAAc,MAAM,EACnP,EACA,KAAM,UAAY,CAChB,IAAI,eAAiB,CAAC,EAClB,YAAc,KAElB,OACE,SAAS,OAAO,QAAQ,IAAI,IAAM,IAClC,SAAS,OAAO,MAAM,IAAI,EAAE,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,IAEnE,YAAc,SAAS,OACpB,MAAM,IAAI,EACV,KAAM,KAAQ,IAAI,WAAW,KAAK,IAAI,CAAC,EACvC,MAAM,GAAG,EAAE,CAAC,GAGb,cAAgB,OAClB,eAAiB,mBAAmB,WAAW,EAAE,MAAM,GAAG,GAGrD,cACT,EACA,QAAS,UAAY,CAEnB,SAAS,OAAS,GAAG,KAAK,IAAI,kBAA0B,KAAK,cAAc,OAAO,UAAU,KAAK,cAAc,IAAI,YAAY,KAAK,cAAc,MAAM,EAC1J,EACA,OAAQ,SAAU,cAAe,CAC/B,MAAM,eAAiB,KAAK,KAAK,EAC3B,SAAW,eAAe,QAAQ,aAAa,EACjD,WAAa,KACf,eAAe,OAAO,SAAU,CAAC,EACjC,KAAK,MAAM,cAAc,EAE7B,CACF,EAEM,SAAW,CAACC,SAAS,UAAY,CACrCA,SAAQ,UAAU,OAAO,QAAQ,EACjC,MAAM,kBAAoB,OAAO,KAAK,EAAE,OAExC,GACE,QAAQ,gBACR,oBACA,mBACA,kBAAoB,oBACpBA,SAAQ,SAAS,OACjB,CACA,IAAI,cAAgB,CAAC,EACjB,cAAgB,CAAC,EACjB,WAAa,EACjB,UAAW,YAAY,QAAQ,eAAgB,CAC7C,YAAc,EAEd,MAAM,OADY,QAAQ,eAAe,QAAQ,EACxB,MAAM,GAAG,EAC5B,YAAc,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,EACnD,cAAgB,CAAC,GAAG,cAAe,GAAG,MAAM,GAG1C,OAAO,KAAK,EAAE,SAAW,aACxB,aAAe,OAAO,KAAK,QAAQ,cAAc,EAAE,QAClD,CAAC,cAAc,UAEjB,cAAgB,CAAC,GAAG,cAAe,GAAG,MAAM,EAEhD,CAEA,QAAS,EAAI,EAAG,EAAIA,SAAQ,SAAS,OAAQ,IAAK,CAChD,MAAM,QAAUA,SAAQ,SAAS,CAAC,EAC9B,cAAc,QAChB,QAAQ,UAAU,OAAO,GAAG,aAAa,EAGvC,cAAc,QAChB,QAAQ,UAAU,IAAI,GAAG,aAAa,CAE1C,CACF,CAGA,GAAI,OAAO,WACT,GAAI,CACF,OAAO,WAAWA,SAAS,OAAO,CACpC,OAAS,MAAO,CACd,QAAQ,IAAI,KAAK,CACnB,CAEJ,EAEM,UAAY,CAChB,MACAC,oBACAD,SACA,QACA,OACA,gBACG,CACCC,oBAAmB,QAAU,MAAQ,cACvC,MACE,GAAG,OAAO,MAAM,OAAO,IAAI,YAAYA,oBAAmB,CAAC,CAAC,eAAe,MAAM,EACnF,EACG,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,SAAY,CACjB,MAAM,SAAW,MAAQ,IACnB,UAAYD,SAAQ,GAAK,IAAIA,SAAQ,EAAE,GAAK,GAC5C,MAAQ,SAAS,cAAc,KAAK,EAC1C,IAAI,gBAAkB,QACtB,gBAAkB,gBAAgB,SAAS,wBAAwB,EAC/D,gBAAgB,WAAW,yBAA0B,QAAQ,EAC7D,gBACJ,gBAAkB,gBAAgB,SAChC,yBACF,EACI,gBAAgB,WAAW,0BAA2B,SAAS,EAC/D,gBACJ,MAAM,UAAY,gBAElBA,SAAQ,WACN,MAAM,cAAc,oBAAoB,EAAE,UAE5CC,oBAAmB,MAAM,EACzB,QACA,UACE,MACAA,oBACAD,SACA,QACA,OACA,aACF,CACF,CAAC,EACA,MAAM,IAAM,CACX,OAAO,OAAOC,oBAAmB,CAAC,CAAC,EACnCA,oBAAmB,MAAM,EACzB,UACE,MACAA,oBACAD,SACA,QACA,OACA,aACF,CACF,CAAC,EAEH,SAASA,SAAS,OAAO,CAE7B,EAEA,MAAO,CACL,mBAAoB,SAAU,OAAQ,CACpC,GAAI,QAAQ,kBAAmB,OAE/B,MAAM,UAAY,QAAU,CAAC,EACvB,MAAQ,EAGd,OAAO,OAAO,OAAQ,SAAS,EAG/B,mBAAqB,OAAO,KAAK,EAGjC,QAAU,SAAS,cAAc,IAAI,OAAO,SAAS,EAAE,EAGvD,mBAAqB,OAAO,cAC5B,OAAO,cAAgB,KAAK,IAC1B,mBAAmB,OACnB,OAAO,aACT,EAGI,OAAO,eAAiB,SAE1B,UACE,MACA,mBACA,QACA,OAAO,QACP,OAAO,OACP,kBACF,CAEJ,EAEA,UAAW,UAAY,CACrB,OAAO,MACT,EAEA,UAAW,UAAY,CACrB,OAAO,QAAQ,CACjB,EAEA,qBAAsB,SAAU,OAAQ,CAItC,OAAO,OAAO,OAHI,QAAU,CAAC,CAGE,EAG/B,IAAI,eAAiB,OAAO,KAAK,EAGjC,GAAI,OAAO,SAAS,SAAS,QAAQ,YAAY,IAAM,GAAI,CAEzD,IAAI,cAAgB,mBAAmB,OAAO,SAAS,QAAQ,EAC5D,MACC,gQACF,EAAE,CAAC,EACF,MAAM,YAAY,EAAE,CAAC,EAEpB,OAAO,SACT,cAAgB,OAAO,QAIzB,MAAM,SAAW,eAAe,QAAQ,aAAa,EAGjD,WAAa,IAEf,eAAe,QAAQ,aAAa,EAEpC,eAAiB,eAAe,OAC9B,EACA,OAAO,sBACT,IAGA,eAAe,OAAO,SAAU,CAAC,EACjC,eAAe,QAAQ,aAAa,GAItC,OAAO,MAAM,cAAc,CAC7B,CACF,EAEA,YAAa,OAAO,KAAK,EAAE,OAAS,CACtC,CACF,GAAG,EAEH,MAAM,YAAc,CAClB,IAAK,aACL,gBAAiB,0BACjB,YAAa,sBACb,kBAAmB,wBACnB,kBAAmB,4BACnB,KAAM,cACN,iBAAkB,uBAClB,QAAS,sBACT,MAAO,eACP,WAAY,aACZ,YAAa,qBACf,EAEM,aAAe,CACnB,oBAAqB,6BACrB,WAAY,mBACZ,cAAe,eACf,eAAgB,uBAClB,EAEM,UAAY,CAChB,WAAY,cACZ,QAAS,UACT,QAAS,aACT,gBAAiB,mBACjB,uBAAwB,6BACxB,OAAQ,SACR,YAAa,iBACb,UAAW,aACX,WAAY,cACZ,OAAQ,SACR,YAAa,cACf,EAEK,eAAe,IAAI,kBAAkB,GACxC,eAAe,OACb,mBACA,cAA8B,WAAY,CACxC,aAAc,CACZ,MAAM,EAEN,KAAK,MAAQ,KACb,KAAK,OAAS,KAAK,iBAAiB,YAAY,KAAK,EACrD,KAAK,OAAS,KAAK,iBAAiB,YAAY,WAAW,EAC3D,KAAK,QAAU,KAAK,QAAQ,YAAY,OAAO,EAC/C,KAAK,WAAW,CAClB,CAEA,mBAAoB,CAClB,KAAK,WAAW,CAClB,CAEA,YAAa,CACX,GAAI,KAAK,OAAO,QAAU,EAAG,OAEzB,KAAK,aAAa,aAAa,aAAa,IAC9C,KAAK,cAAgB,KAAK,MACxB,mBAAmB,KAAK,aAAa,aAAa,aAAa,CAAC,CAClE,GAGF,KAAK,UAAU,IAAI,UAAU,SAAS,EAEtC,IAAI,cAAgB,YAAY,MAChC,MAAM,cAAgB,CAAC,OAAO,MAAM,SAAS,EACvC,aAAe,GAAG,YAAY,KAAK,SAAS,UAAU,MAAM,IAC5D,YAAc,GAAG,YAAY,KAAK,SAAS,UAAU,OAAO,IAelE,IAbE,KAAK,iBAAiB,YAAY,EAAE,QACpC,KAAK,iBAAiB,WAAW,EAAE,UAG/B,cACF,cAAgB,aAEhB,cAAgB,YAGlB,KAAK,OAAO,QAAQ,GAGlB,KAAK,iBAAiB,aAAa,EAAE,QAAU,EAAG,CACpD,KAAK,UAAU,IAAI,UAAU,WAAW,EACxC,KAAK,UAAU,OAAO,UAAU,SAAS,EACzC,MACF,CAEA,KAAK,cAAgB,CACnB,aAAc,cACd,QAAS,GACT,WAAY,GACZ,eAAgB,GAChB,GAAG,KAAK,cACR,GAAI,CACF,MAAO,IAAM,CACX,sBAAsB,IAAM,CAC1B,KAAK,UAAU,IAAI,UAAU,WAAW,EACxC,KAAK,UAAU,OAAO,UAAU,SAAS,EACzC,KAAK,WAAW,cACd,IAAI,YAAY,sBAAuB,CACrC,QAAS,GACT,OAAQ,CACN,OAAQ,IACV,CACF,CAAC,CACH,CACF,CAAC,EAED,KAAK,aAAa,EAEd,KAAK,cAAc,iBACrB,KAAK,eAAe,CAExB,EACA,OAAS,OAAU,CACjB,MAAM,MAAQ,KAAK,OAAO,KAAK,EAC/B,GAAI,CAAC,OAAS,KAAK,cAAc,WAAY,OAE7C,MAAM,kBAAoB,MAAM,iBAC9B,YAAY,GACd,EACI,kBAAkB,QACpB,kBAAkB,QAAS,IAAO,CAChC,GAAG,UAAU,OAAO,UAAU,UAAU,EACxC,sBAAsB,IAAM,CAE1B,WAAW,IAAM,CACf,GAAG,UAAU,IAAI,UAAU,UAAU,CACvC,EAAG,CAAC,CACN,CAAC,CACH,CAAC,CAEL,EACA,OAAQ,IAAM,CACR,KAAK,cAAc,iBACrB,KAAK,eAAe,CAExB,CACF,CACF,EAEA,KAAK,aAAa,EAElB,KAAK,MAAM,GAAG,SAAU,IAAM,KAAK,aAAa,EAAI,CAAC,EAErD,KAAK,QAAQ,QAAS,OAAU,CAC9B,MAAM,iBAAiB,QAAU,GAAM,CACrC,EAAE,eAAe,EACjB,MAAM,WAAa,CAAC,GAAG,MAAM,cAAc,QAAQ,EAAE,QACnD,KACF,EACA,KAAK,MAAM,OAAO,UAAU,CAC9B,CAAC,CACH,CAAC,GAEG,CAAC,KAAK,OAAS,CAAC,KAAK,MAAM,WAC7B,KAAK,UAAU,OAAO,UAAU,SAAS,CAE7C,CAEA,cAAe,CACT,KAAK,cAAc,KACrB,KAAK,MAAQ,IAAI,OAAO,MAAM,aAC5B,KACA,KAAK,aACP,EAEA,KAAK,MAAQ,IAAI,OAAO,MAAM,SAAS,KAAM,KAAK,aAAa,CAEnE,CAEA,YAAa,CACX,KAAK,iBAAiB,oBAAqB,IAAM,CAC/C,KAAK,WAAW,CAClB,CAAC,EAED,KAAK,iBAAiB,sBAAwB,GAAM,CAClD,KAAK,MAAM,WAAW,EAAE,OAAO,KAAK,EACpC,KAAK,MAAM,WAAW,CACxB,CAAC,EAED,KAAK,iBAAiB,wBAAyB,IAAM,CAEjD,KAAK,OACL,KAAK,cAAc,eAAe,UAAU,GAC5C,KAAK,cAAc,UAEnB,KAAK,MAAM,WAAW,CAE1B,CAAC,EAED,KAAK,iBAAiB,0BAA2B,IAAM,CACrD,KAAK,OAAO,WAAW,CACzB,CAAC,EAED,KAAK,iBAAiB,uBAAwB,IAAM,CAClD,KAAK,OAAO,QAAQ,CACtB,CAAC,EAED,KAAK,iBAAiB,4BAA8B,GAAM,CACnD,EAAE,OAAO,QAEd,KAAK,OAAO,OAAO,EAAE,OAAO,KAAK,EAE7B,KAAK,OAAO,MAAM,SAAW,GAC/B,KAAK,QAAQ,UAAU,IAAI,UAAU,MAAM,EAE/C,CAAC,CACH,CAEA,aAAa,YAAc,GAAO,CAChC,MAAM,aAAe,KAAK,cAAc,IAAI,UAAU,UAAU,EAAE,EAClE,GAAI,CAAC,aAAc,OAEnB,MAAM,sBAAwB,aAAa,aACzC,aAAa,cACf,EACI,aAAa,aAAa,aAAa,cAAc,EACrD,GACE,iBAAmB,aAAa,cAAc,YAAY,IAAI,EAC9D,QAAU,KAAK,iBACnB,GAAG,YAAY,KAAK,OAAO,YAAY,KAAK,SAC9C,EAyBA,GAtBE,SAAS,KAAK,UAAU,SAAS,UAAU,OAAO,GAClD,kBACA,KAAK,cAAc,YACnB,aAEA,iBAAiB,MAAM,EAGrB,QAAQ,QACV,QAAQ,QAAS,QAAW,CAC1B,MAAM,MAAQ,OAAO,QAAQ,YAAY,KAAK,EAC9C,GAAI,MAAO,CACT,MAAM,SAAW,MAAM,UAAU,SAAS,UAAU,UAAU,EAC1D,EACA,GACJ,OAAO,aAAa,WAAY,QAAQ,CAC1C,CACF,CAAC,EAGH,KAAK,MAAM,YAAY,SAAU,qBAAqB,EAGpD,KAAK,OAAO,QACZ,KAAK,OAAO,SAAW,KAAK,OAAO,QACnC,aAAa,aAAa,aAAa,UAAU,EACjD,CACA,MAAM,WAAa,SACjB,aAAa,aAAa,aAAa,UAAU,CACnD,EACM,aAAe,KAAK,cACxB,GAAG,YAAY,WAAW,IAAI,UAAU,UAAU,EACpD,EACI,cACF,aAAa,UAAU,OAAO,UAAU,UAAU,EAEpD,KAAK,OAAO,UAAU,EAAE,UAAU,IAAI,UAAU,UAAU,CAC5D,CACF,CAEA,gBAAiB,CACf,GACE,CAAC,KAAK,aAAa,aAAa,mBAAmB,GACnD,CAAC,KAAK,cAAc,gBAEpB,OAEF,MAAM,UACJ,KAAK,cAAc,YAAY,eAAe,GAC9C,KAAK,cAAc,YAAY,gBAAgB,GAC/C,KAAK,cAAc,YAAY,WAAW,EAGvC,YAEL,KAAK,cAAc,YAAY,iBAAiB,EAAE,MAAM,IACtD,UAAU,aAAe,EAAI,KAC/B,KAAK,cAAc,YAAY,iBAAiB,EAAE,MAAM,IACtD,UAAU,aAAe,EAAI,KACjC,CAEA,sBAAuB,CACjB,KAAK,QACP,KAAK,MAAM,QAAQ,SAAW,GAC9B,KAAK,MAAM,QAAQ,EAEvB,CACF,CACF,EAGF,MAAM,YAAc,CAClB,eAAgB,yBAChB,IAAK,aACL,OAAQ,aACR,QAAS,YACT,cAAe,oBACf,WAAY,cACd,EAEM,UAAY,CAChB,QAAS,UACT,OAAQ,SACR,WAAY,cACZ,gBAAiB,oBACjB,QAAS,YACX,EAEM,aAAe,CACnB,QAAS,WACT,aAAc,gBAChB,EAEK,eAAe,IAAI,gBAAgB,GACtC,eAAe,OACb,iBACA,cAAyB,WAAY,CACnC,aAAc,CACZ,MAAM,EAEN,KAAK,KAAO,OAAO,IACrB,CAEA,mBAAoB,CAClB,MAAM,YAAc,KAAK,iBAAiB,YAAY,MAAM,EAE5D,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,eAAe,CAAC,EACpE,KAAK,iBAAiB,iBAAkB,IAAM,KAAK,eAAe,CAAC,EAEnE,aAAa,QAAS,SAAY,CAChC,MAAM,MAAQ,SAAS,QAAQ,aAAa,aAAa,OAAO,CAAC,EAC3D,IAAM,KAAK,cACf,GAAG,YAAY,UAAU,IAAI,KAAK,EACpC,EAEA,QAAQ,iBAAiB,QAAS,IAAM,CACtC,KAAK,UAAU,QAAS,GAAG,CAC7B,CAAC,EAED,QAAQ,iBAAiB,QAAU,OAAU,EAExC,MAAM,OAAS,SAAW,MAAM,OAAS,UAC1C,SAAS,KAAK,UAAU,SAAS,UAAU,OAAO,GAElD,KAAK,UAAU,QAAS,GAAG,CAE/B,CAAC,CACH,CAAC,CACH,CAEA,UAAU,QAAS,IAAK,CACtB,GAAI,QAAQ,UAAU,SAAS,UAAU,OAAO,EAC9C,OAGF,MAAM,WAAa,KAAK,cACtB,GAAG,YAAY,MAAM,IAAI,UAAU,OAAO,EAC5C,EACM,kBAAoB,KAAK,cAC7B,GAAG,YAAY,UAAU,IAAI,UAAU,OAAO,EAChD,EAEA,YAAY,UAAU,OAAO,UAAU,OAAO,EAC9C,mBAAmB,UAAU,OAAO,UAAU,OAAO,EAErD,QAAQ,UAAU,IAAI,UAAU,OAAO,EACvC,IAAI,UAAU,IAAI,UAAU,OAAO,EAE/B,QAAQ,UAAU,SAAS,UAAU,MAAM,GAC7C,IAAI,UAAU,IAAI,UAAU,MAAM,EAGpC,KAAK,KAAK,KAAK,gBAAgB,EAE/B,KAAK,cACH,IAAI,YAAY,mBAAoB,CAAE,QAAS,EAAK,CAAC,CACvD,EAEA,QAAQ,cACN,IAAI,YAAY,oBAAqB,CACnC,QAAS,GACT,OAAQ,CACN,QAAS,KACX,CACF,CAAC,CACH,EAEA,KAAK,aAAa,GAAG,CACvB,CAEA,aAAa,IAAK,SAAW,GAAM,CACjC,MAAM,cAAgB,IAAI,iBAAiB,YAAY,GAAG,EAEtD,cAAc,QAChB,cAAc,QAAS,cAAiB,CACtC,aAAa,UAAU,OAAO,UAAU,UAAU,EAE9C,WACF,aAAa,UAAU,IAAI,UAAU,eAAe,EAEpD,sBAAsB,IAAM,CAC1B,aAAa,UAAU,OAAO,UAAU,eAAe,EACvD,aAAa,UAAU,IAAI,UAAU,UAAU,CACjD,CAAC,EAEL,CAAC,CAEL,CAEA,gBAAiB,CACf,MAAM,QAAU,KAAK,cAAc,YAAY,aAAa,EAE5D,GAAI,QAAS,CACX,QAAQ,UAAU,OAAO,UAAU,MAAM,EACzC,MAAM,WAAa,SACjB,QAAQ,aAAa,aAAa,OAAO,CAC3C,EACM,WAAa,KAAK,cACtB,GAAG,YAAY,UAAU,IAAI,aAAa,YAAY,KAAK,UAAU,IACvE,EAEI,aACF,WAAW,UAAU,OAAO,UAAU,MAAM,EAE5C,KAAK,aAAa,WAAY,EAAK,EAEvC,CACF,CAEA,gBAAiB,CACf,MAAM,eAAiB,KAAK,cAAc,YAAY,cAAc,EACpE,GAAI,CAAC,eACH,OAGF,MAAM,iBAAmB,eAAe,QACtC,GAAG,YAAY,UAAU,IAAI,UAAU,OAAO,EAChD,EACA,GAAI,CAAC,iBACH,OAEF,MAAM,oBAAsB,SAC1B,iBAAiB,aAAa,aAAa,YAAY,CACzD,EACM,YAAc,KAAK,iBAAiB,YAAY,MAAM,EAE5D,GAAI,YAAY,OAAS,oBAAqB,CAC5C,MAAM,gBACJ,YAAY,mBAAmB,EAAE,YAE/B,kBACF,YAAY,mBAAmB,EAAE,UAAU,IAAI,UAAU,MAAM,EAC/D,gBAAgB,cAAc,IAAI,MAAM,OAAO,CAAC,EAEpD,CACF,CACF,CACF,EAGF,MAAM,YAAc,CAClB,QAAS,iBACT,QAAS,iBACT,QAAS,eACX,EAEM,WAAa,CACjB,OAAQ,aACV,EAEM,UAAY,CAChB,KAAM,UACN,QAAS,YACX,EAEA,MAAM,uBAAuB,WAAY,CACvC,aAAc,CACZ,MAAM,EAEN,KAAK,cAAgB,KAAK,aAAa,WAAW,MAAM,EACxD,KAAK,QAAU,KAAK,cAAc,YAAY,OAAO,EACrD,KAAK,QAAU,KAAK,cAAc,YAAY,OAAO,EACrD,KAAK,QAAU,KAAK,cAAc,YAAY,OAAO,EACrD,KAAK,cAAgB,KAAK,cAAc,KAAK,IAAI,CACnD,CAEA,mBAAoB,CAElB,KAAK,UAAU,KAAK,aAAa,EAEjC,KAAK,QAAQ,iBAAiB,QAAS,IAAM,CAC3C,KAAK,UAAU,KAAK,QAAQ,YAAY,EACxC,KAAK,UAAU,IAAI,UAAU,IAAI,CACnC,CAAC,EAED,KAAK,UAAU,KAAK,aAAa,EACjC,KAAK,cAAc,EAEnB,SAAS,iBAAiB,eAAgB,KAAK,aAAa,EAC5D,SAAS,iBAAiB,2BAA4B,KAAK,aAAa,CAC1E,CAEA,sBAAuB,CACrB,SAAS,oBAAoB,eAAgB,KAAK,aAAa,EAC/D,SAAS,oBACP,2BACA,KAAK,aACP,CACF,CAEA,UAAU,cAAe,CACvB,KAAK,MAAM,YAAY,WAAY,GAAG,aAAa,IAAI,CACzD,CAEA,eAAgB,CACd,KAAK,UAAU,OACb,UAAU,QACV,KAAK,QAAQ,aAAe,KAAK,QAAQ,aACvC,KAAK,aACT,CACF,CACF,CAEK,eAAe,IAAI,iBAAiB,GACvC,eAAe,OAAO,kBAAmB,cAAc,EAGzD,MAAM,UAAY,CAChB,UAAW,oBACX,QAAS,eACT,sBAAuB,8BACzB,EAEM,QAAU,CACd,eAAgB,kBAChB,QAAS,aACT,OAAQ,WACV,EAEK,eAAe,IAAI,mBAAmB,GACzC,eAAe,OACb,oBACA,cAAsB,WAAY,CAChC,aAAc,CACZ,MAAM,EAEN,KAAK,MAAQ,KAAK,aAAa,UAAU,OAAO,EAC5C,KAAK,aAAa,UAAU,OAAO,EACnC,GACJ,KAAK,gBAAkB,IACvB,KAAK,sBAAwB,EAC7B,KAAK,YAAc,IAAM,KAAK,OAAO,EACrC,KAAK,iBAAmB,IAAM,KAAK,OAAO,EAAI,EAC9C,KAAK,eAAkB,OACrB,OAAO,MAAM,SAAS,KAAK,UAAU,KAAK,EAAG,EAAE,EACjD,KAAK,oBAAuB,OAC1B,KAAK,UAAU,MAAO,GAAM,EAAI,CACpC,CAEA,mBAAoB,CAClB,GAAI,CAAC,SAAS,cAAc,IAAI,QAAQ,cAAc,EAAE,EAAG,CACzD,MAAM,gBAAkB,eAAe,QAAQ,cAAc,8BAA8B,QAAQ,cAAc,wBAAwB,QAAQ,cAAc,uBACzJ,eAAiB,SAAS,cAAc,KAAK,EACnD,eAAe,UAAY,QAAQ,eACnC,eAAe,UAAY,gBAC3B,SAAS,KAAK,YAAY,cAAc,CAC1C,CAEA,KAAK,iBAAiB,aAAc,KAAK,gBAAgB,EACzD,KAAK,iBAAiB,aAAc,KAAK,mBAAmB,EAC5D,KAAK,iBAAiB,qBAAsB,KAAK,WAAW,EAC5D,SAAS,iBAAiB,sBAAuB,KAAK,cAAc,CACtE,CAEA,OAAO,eAAiB,GAAO,CAC7B,MAAM,cAAgB,SAAS,cAC7B,IAAI,QAAQ,cAAc,EAC5B,EAEM,QAAU,KAAK,QAAQ,UAAU,SAAS,EAC1C,iBAAmB,MAAM,KAAK,QAAQ,SAAS,EAAE,KAAM,KAC3D,IAAI,WAAW,eAAe,CAChC,EAGA,GAFA,eAAe,UAAU,IAAI,gBAAgB,EAG3C,KAAK,OACL,gBACE,gBACA,CAAC,KAAK,aAAa,UAAU,qBAAqB,GAClD,CAAC,gBACH,CACA,MAAM,mBAAqB,cAAc,cACvC,IAAI,QAAQ,cAAc,SAC5B,EACM,mBAAqB,cAAc,cACvC,IAAI,QAAQ,cAAc,SAC5B,EACM,kBAAoB,cAAc,cACtC,IAAI,QAAQ,cAAc,QAC5B,EACA,kBAAkB,UAAY,KAAK,MAEnC,MAAM,mBAAqB,mBAAmB,YACxC,YAAc,KAAK,sBAAsB,EACzC,WAAa,YAAY,IACzB,aAAe,YAAY,MAC3B,cAAgB,YAAY,OAC5B,yBACJ,WAAa,cAAgB,OAAO,QACtC,IAAI,0BACF,YAAY,KAAO,mBAAqB,EAAI,aAAe,EAI7D,MAAM,8BAFJ,0BAA4B,mBAGL,OAAO,MAAM,eAAe,EAFlC,GAIf,8BAAgC,IAClC,2BAA6B,+BAG3B,0BAA4B,IAC9B,0BAA4B,GAG9B,mBAAmB,MAAM,KAAO,GAAG,YAAY,KAAO,aAAe,CAAC,KACtE,cAAc,MAAM,YAClB,gBACA,GAAG,wBAAwB,IAC7B,EAEA,mBAAmB,MAAM,UAAY,cAAc,yBAAyB,MAC5E,cAAc,UAAU,OAAO,QAAQ,MAAM,EAC7C,cAAc,UAAU,IAAI,QAAQ,OAAO,EAE3C,SAAS,iBAAiB,eAAgB,KAAK,cAAc,CAC/D,CACF,CAEA,UAAU,MAAO,eAAiB,GAAO,eAAiB,GAAO,CAC/D,MAAM,cAAgB,SAAS,cAC7B,IAAI,QAAQ,cAAc,EAC5B,EACM,eAAiB,cAAc,UAAU,SAC7C,QAAQ,OACV,EAGE,gBACE,gBACA,CAAC,KAAK,aAAa,UAAU,qBAAqB,GAClD,CAAC,kBAGD,iBACC,gBAAkB,MAAM,OAAO,kBAEhC,cAAc,UAAU,IAAI,QAAQ,MAAM,EAEtC,KAAK,uBACP,aAAa,KAAK,qBAAqB,EAGzC,KAAK,sBAAwB,WAAW,IAAM,CAC5C,cAAc,UAAU,OAAO,QAAQ,MAAM,CAC/C,EAAG,KAAK,eAAe,GAGzB,cAAc,UAAU,OAAO,QAAQ,OAAO,EAE9C,SAAS,oBAAoB,eAAgB,KAAK,cAAc,EAEpE,CAEA,sBAAuB,CACrB,KAAK,oBAAoB,aAAc,KAAK,gBAAgB,EAC5D,KAAK,oBAAoB,aAAc,KAAK,mBAAmB,EAC/D,KAAK,oBAAoB,qBAAsB,KAAK,WAAW,EAC/D,SAAS,oBACP,sBACA,KAAK,cACP,EACA,SAAS,oBAAoB,eAAgB,KAAK,cAAc,CAClE,CACF,CACF,EAGF,SAAS,UAAU,IAAK,SAAU,cAAe,CAC/C,IAAI,KAAO,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC9C,KAAO,GACP,OAAS,SAAS,cAAc,QAAQ,EAC5C,OAAO,IAAM,IAGb,OAAO,OAAS,OAAO,mBAAqB,UAAY,CAEpD,CAAC,OACA,CAAC,KAAK,YACL,KAAK,YAAc,UACnB,KAAK,YAAc,aAErB,KAAO,GACP,SAAS,GAET,cAAc,CAElB,EAEA,KAAK,YAAY,MAAM,CACzB,CAEA,MAAM,QAAU,CAAC,EAEjB,SAAS,WAAW,QAAU,CAAC,EAAG,CAKhC,GAJK,QAAQ,OACX,QAAQ,KAAO,QAGb,QAAQ,IACV,OAAI,QAAQ,QAAQ,GAAG,EACd,QAAQ,QAAQ,GAAG,EAEnB,qBAAqB,QAAQ,IAAK,QAAQ,IAAI,EAElD,GAAI,QAAQ,KACjB,OAAI,QAAQ,QAAQ,IAAI,EACf,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,CAAC,EAErC,OACJ,MAAM,QAAQ,IAAI,EAClB,KAAM,UACE,SAAS,KAAK,CACtB,EACA,KAAM,WACL,QAAQ,QAAQ,IAAI,EAAI,SACjB,SACR,EAEA,GAAI,QAAQ,KAAM,CACvB,MAAM,IAAM,GAAG,OAAO,QAAQ,KAAM,QAAQ,OAAO,EACnD,OAAI,QAAQ,GAAG,EACN,QAAQ,GAAG,EAEX,uBAAuB,OAAO,CAEzC,KACE,QAAO,QAAQ,OAAO,CAE1B,CAEA,SAAS,qBAAqB,IAAK,KAAM,CACvC,MAAM,OAAS,IAAI,QAAQ,CAAC,QAAS,SAAW,CAC1C,OAAS,OACX,MAAM,GAAG,EACN,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,MAAS,CACd,QAAQ,IAAI,CACd,CAAC,EACA,MAAO,OAAU,CAChB,OAAO,KAAK,CACd,CAAC,EAEH,UACE,IACA,UAAY,CACV,QAAQ,CACV,EACA,UAAY,CACV,OAAO,CACT,CACF,CAEJ,CAAC,EAED,eAAQ,GAAG,EAAI,OACR,MACT,CAEA,SAAS,uBAAuB,QAAS,CACvC,MAAM,IAAM,GAAG,OAAO,QAAQ,KAAM,QAAQ,OAAO,EAC7C,OAAS,IAAI,QAAQ,CAAC,QAAS,SAAW,CAC9C,GAAI,CACF,OAAO,QAAQ,aAAa,CAC1B,CACE,KAAM,QAAQ,KACd,QAAS,QAAQ,QACjB,OAAS,KAAQ,CACf,kBAAkB,QAAS,OAAQ,GAAG,CACxC,CACF,CACF,CAAC,CACH,OAAS,IAAK,CACZ,OAAO,GAAG,CACZ,CACF,CAAC,EACD,eAAQ,GAAG,EAAI,OACR,MACT,CAEA,SAAS,kBAAkB,QAAS,OAAQ,IAAK,CAC/C,OAAI,IACK,OAAO,GAAG,EAEV,QAAQ,CAEnB,CAEA,SAAS,iBAAiB,mBAAoB,UAAY,CAExD,MAAM,gBAAkB,SAAS,cAAc,0BAA0B,EACrE,kBACF,gBAAgB,iBAAiB,QAAS,IAAM,CAC9C,OAAO,SAAS,CACd,IAAK,EACL,KAAM,EACN,SAAU,QACZ,CAAC,CACH,CAAC,EACD,SAAS,iBAAiB,eAAgB,IAAM,CAC9C,gBAAgB,UAAU,OACxB,aACA,OAAO,QAAU,OAAO,WAC1B,CACF,CAAC,GAGC,OAAO,OAAS,OAAO,KACzB,SAAS,cAAc,MAAM,EAAE,UAAU,IAAI,QAAQ,EAKrD,mBAAoB,SAAS,gBAAgB,OAE7C,WAAW,CAAE,IAAK,OAAO,MAAM,OAAO,YAAa,CAAC,CAExD,CAAC,EAGG,OAAO,UAAU,gBACnB,SAAS,gBAAgB,UACvB,SAAS,gBAAgB,UAAU,QACjC,sBACA,kBACF,EAEN,GAAG,YAAY,UAAU",
  "names": ["messages", "prev", "element", "location", "wrap", "limitedCountElement", "wrapper", "productHandleQueue"]
}
