{
  "version": 3,
  "sources": ["/cdn/shop/t/54/assets/theme.js?cdm=213"],
  "sourcesContent": ["/*\r\n@license\r\n  Impulse by Archetype Themes (https://archetypethemes.co)\r\n  Access unminified JS in assets/theme.js\r\n\r\n  Use this event listener to run your own JS outside of this file.\r\n  Documentation - https://archetypethemes.co/blogs/impulse/javascript-events-for-developers\r\n\r\n  document.addEventListener('page:loaded', function() {\r\n    // Page has loaded and theme assets are ready\r\n  });\r\n*/\r\n\r\nwindow.theme = window.theme || {};\r\nwindow.Shopify = window.Shopify || {};\r\n\r\ntheme.config = {\r\n  bpSmall: false,\r\n  hasSessionStorage: true,\r\n  hasLocalStorage: true,\r\n  mediaQuerySmall: 'screen and (max-width: '+ 769 +'px)',\r\n  youTubeReady: false,\r\n  vimeoReady: false,\r\n  vimeoLoading: false,\r\n  isTouch: ('ontouchstart' in window) || window.DocumentTouch && window.document instanceof DocumentTouch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints ? true : false,\r\n  stickyHeader: false,\r\n  rtl: document.documentElement.getAttribute('dir') == 'rtl' ? true : false\r\n};\r\n\r\nif (theme.config.isTouch) {\r\n  document.documentElement.className += ' supports-touch';\r\n}\r\n\r\nconst CDM_DEBUG = false;\r\nif (CDM_DEBUG) console.log('...');\r\n\r\nif (console && console.log) {\r\n  console.log('Impulse theme ('+theme.settings.themeVersion+') by ARCH\u039ETYPE | Learn more at https://archetypethemes.co');\r\n}\r\n\r\ntheme.recentlyViewed = {\r\n  recent: {}, // will store handle+url of recent products\r\n  productInfo: {} // will store product data to reduce API calls\r\n};\r\n\r\n(function(){\r\n  'use strict';\r\n\r\n  theme.delegate = {\r\n    on: function(event, callback, options){\r\n      if( !this.namespaces ) // save the namespaces on the DOM element itself\r\n        this.namespaces = {};\r\n  \r\n      this.namespaces[event] = callback;\r\n      options = options || false;\r\n  \r\n      this.addEventListener(event.split('.')[0], callback, options);\r\n      return this;\r\n    },\r\n    off: function(event) {\r\n      if (!this.namespaces) { return }\r\n      this.removeEventListener(event.split('.')[0], this.namespaces[event]);\r\n      delete this.namespaces[event];\r\n      return this;\r\n    }\r\n  };\r\n  \r\n  // Extend the DOM with these above custom methods\r\n  window.on = Element.prototype.on = theme.delegate.on;\r\n  window.off = Element.prototype.off = theme.delegate.off;\r\n  \r\n  theme.utils = {\r\n    defaultTo: function(value, defaultValue) {\r\n      return (value == null || value !== value) ? defaultValue : value\r\n    },\r\n  \r\n    wrap: function(el, wrapper) {\r\n      el.parentNode.insertBefore(wrapper, el);\r\n      wrapper.appendChild(el);\r\n    },\r\n  \r\n    debounce: function(wait, callback, immediate) {\r\n      var timeout;\r\n      return function() {\r\n        var context = this, args = arguments;\r\n        var later = function() {\r\n          timeout = null;\r\n          if (!immediate) callback.apply(context, args);\r\n        };\r\n        var callNow = immediate && !timeout;\r\n        clearTimeout(timeout);\r\n        timeout = setTimeout(later, wait);\r\n        if (callNow) callback.apply(context, args);\r\n      }\r\n    },\r\n  \r\n    throttle: function(limit, callback) {\r\n      var waiting = false;\r\n      return function () {\r\n        if (!waiting) {\r\n          callback.apply(this, arguments);\r\n          waiting = true;\r\n          setTimeout(function () {\r\n            waiting = false;\r\n          }, limit);\r\n        }\r\n      }\r\n    },\r\n  \r\n    prepareTransition: function(el, callback) {\r\n      el.addEventListener('transitionend', removeClass);\r\n  \r\n      function removeClass(evt) {\r\n        el.classList.remove('is-transitioning');\r\n        el.removeEventListener('transitionend', removeClass);\r\n      }\r\n  \r\n      el.classList.add('is-transitioning');\r\n      el.offsetWidth; // check offsetWidth to force the style rendering\r\n  \r\n      if (typeof callback === 'function') {\r\n        callback();\r\n      }\r\n    },\r\n  \r\n    // _.compact from lodash\r\n    // Creates an array with all falsey values removed. The values `false`, `null`,\r\n    // `0`, `\"\"`, `undefined`, and `NaN` are falsey.\r\n    // _.compact([0, 1, false, 2, '', 3]);\r\n    // => [1, 2, 3]\r\n    compact: function(array) {\r\n      var index = -1,\r\n          length = array == null ? 0 : array.length,\r\n          resIndex = 0,\r\n          result = [];\r\n  \r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result[resIndex++] = value;\r\n        }\r\n      }\r\n      return result;\r\n    },\r\n  \r\n    serialize: function(form) {\r\n      var arr = [];\r\n      Array.prototype.slice.call(form.elements).forEach(function(field) {\r\n        if (\r\n          !field.name ||\r\n          field.disabled ||\r\n          ['file', 'reset', 'submit', 'button'].indexOf(field.type) > -1\r\n        )\r\n          return;\r\n        if (field.type === 'select-multiple') {\r\n          Array.prototype.slice.call(field.options).forEach(function(option) {\r\n            if (!option.selected) return;\r\n            arr.push(\r\n              encodeURIComponent(field.name) +\r\n                '=' +\r\n                encodeURIComponent(option.value)\r\n            );\r\n          });\r\n          return;\r\n        }\r\n        if (['checkbox', 'radio'].indexOf(field.type) > -1 && !field.checked)\r\n          return;\r\n        arr.push(\r\n          encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)\r\n        );\r\n      });\r\n      return arr.join('&');\r\n    }\r\n  };\r\n  \r\n  theme.a11y = {\r\n    trapFocus: function(options) {\r\n      var eventsName = {\r\n        focusin: options.namespace ? 'focusin.' + options.namespace : 'focusin',\r\n        focusout: options.namespace\r\n          ? 'focusout.' + options.namespace\r\n          : 'focusout',\r\n        keydown: options.namespace\r\n          ? 'keydown.' + options.namespace\r\n          : 'keydown.handleFocus'\r\n      };\r\n  \r\n      // Get every possible visible focusable element\r\n      var focusableEls = options.container.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])');\r\n      var elArray = [].slice.call(focusableEls);\r\n      var focusableElements = elArray.filter(el => el.offsetParent !== null);\r\n  \r\n      var firstFocusable = focusableElements[0];\r\n      var lastFocusable = focusableElements[focusableElements.length - 1];\r\n  \r\n      if (!options.elementToFocus) {\r\n        options.elementToFocus = options.container;\r\n      }\r\n  \r\n      options.container.setAttribute('tabindex', '-1');\r\n      options.elementToFocus.focus();\r\n  \r\n      document.documentElement.off('focusin');\r\n      document.documentElement.on(eventsName.focusout, function() {\r\n        document.documentElement.off(eventsName.keydown);\r\n      });\r\n  \r\n      document.documentElement.on(eventsName.focusin, function(evt) {\r\n        if (evt.target !== options.container && evt.target !== lastFocusable && evt.target !== firstFocusable) return;\r\n  \r\n        document.documentElement.on(eventsName.keydown, function(evt) {\r\n          _manageFocus(evt);\r\n        });\r\n      });\r\n  \r\n      function _manageFocus(evt) {\r\n        if (evt.keyCode !== 9) return;\r\n        /**\r\n         * On the first focusable element and tab backward,\r\n         * focus the last element\r\n         */\r\n        if (evt.target === lastFocusable && !evt.shiftKey) {\r\n          evt.preventDefault();\r\n          firstFocusable.focus();\r\n        }\r\n      }\r\n    },\r\n    removeTrapFocus: function(options) {\r\n      var eventName = options.namespace\r\n        ? 'focusin.' + options.namespace\r\n        : 'focusin';\r\n  \r\n      if (options.container) {\r\n        options.container.removeAttribute('tabindex');\r\n      }\r\n  \r\n      document.documentElement.off(eventName);\r\n    },\r\n  \r\n    lockMobileScrolling: function(namespace, element) {\r\n      var el = element ? element : document.documentElement;\r\n      document.documentElement.classList.add('lock-scroll');\r\n      el.on('touchmove' + namespace, function() {\r\n        return true;\r\n      });\r\n    },\r\n  \r\n    unlockMobileScrolling: function(namespace, element) {\r\n      document.documentElement.classList.remove('lock-scroll');\r\n      var el = element ? element : document.documentElement;\r\n      el.off('touchmove' + namespace);\r\n    }\r\n  };\r\n  \r\n  // Add class when tab key starts being used to show outlines\r\n  document.documentElement.on('keyup.tab', function(evt) {\r\n    if (evt.keyCode === 9) {\r\n      document.documentElement.classList.add('tab-outline');\r\n      document.documentElement.off('keyup.tab');\r\n    }\r\n  });\r\n  \r\n  const trapFocusHandlers = {};\r\n  \r\n  /**\r\n   * Currency Helpers\r\n   * -----------------------------------------------------------------------------\r\n   * A collection of useful functions that help with currency formatting\r\n   *\r\n   * Current contents\r\n   * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\r\n   *   - When theme.settings.superScriptPrice is enabled, format cents in <sup> tag\r\n   * - getBaseUnit - Splits unit price apart to get value + unit\r\n   *\r\n   */\r\n  \r\n  theme.Currency = (function() {\r\n    var moneyFormat = '${{amount}}';\r\n    var superScript = theme && theme.settings && theme.settings.superScriptPrice;\r\n  \r\n    function formatMoney(cents, format) {\r\n      if (!format) {\r\n        format = theme.settings.moneyFormat;\r\n      }\r\n  \r\n      if (typeof cents === 'string') {\r\n        cents = cents.replace('.', '');\r\n      }\r\n      var value = '';\r\n      var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\r\n      var formatString = (format || moneyFormat);\r\n  \r\n      function formatWithDelimiters(number, precision, thousands, decimal) {\r\n        precision = theme.utils.defaultTo(precision, 2);\r\n        thousands = theme.utils.defaultTo(thousands, ',');\r\n        decimal = theme.utils.defaultTo(decimal, '.');\r\n  \r\n        if (isNaN(number) || number == null) {\r\n          return 0;\r\n        }\r\n  \r\n        number = (number / 100.0).toFixed(precision);\r\n  \r\n        var parts = number.split('.');\r\n        var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\r\n        var centsAmount = parts[1] ? (decimal + parts[1]) : '';\r\n  \r\n        return dollarsAmount + centsAmount;\r\n      }\r\n  \r\n      switch (formatString.match(placeholderRegex)[1]) {\r\n        case 'amount':\r\n          value = formatWithDelimiters(cents, 2);\r\n  \r\n          if (superScript && value && value.includes('.')) {\r\n            value = value.replace('.', '<sup>') + '</sup>';\r\n          }\r\n  \r\n          break;\r\n        case 'amount_no_decimals':\r\n          value = formatWithDelimiters(cents, 0);\r\n          break;\r\n        case 'amount_with_comma_separator':\r\n          value = formatWithDelimiters(cents, 2, '.', ',');\r\n  \r\n          if (superScript && value && value.includes(',')) {\r\n            value = value.replace(',', '<sup>') + '</sup>';\r\n          }\r\n  \r\n          break;\r\n        case 'amount_no_decimals_with_comma_separator':\r\n          value = formatWithDelimiters(cents, 0, '.', ',');\r\n          break;\r\n        case 'amount_no_decimals_with_space_separator':\r\n          value = formatWithDelimiters(cents, 0, ' ');\r\n          break;\r\n      }\r\n  \r\n      return formatString.replace(placeholderRegex, value);\r\n    }\r\n  \r\n    function getBaseUnit(variant) {\r\n      if (!variant) {\r\n        return;\r\n      }\r\n  \r\n      if (!variant.unit_price_measurement || !variant.unit_price_measurement.reference_value) {\r\n        return;\r\n      }\r\n  \r\n      return variant.unit_price_measurement.reference_value === 1\r\n        ? variant.unit_price_measurement.reference_unit\r\n        : variant.unit_price_measurement.reference_value +\r\n            variant.unit_price_measurement.reference_unit;\r\n    }\r\n  \r\n    return {\r\n      formatMoney: formatMoney,\r\n      getBaseUnit: getBaseUnit\r\n    }\r\n  })();\r\n  \r\n  theme.Images = (function() {\r\n  \r\n    /**\r\n     * Find the Shopify image attribute size\r\n     */\r\n    function imageSize(src) {\r\n      if (!src) {\r\n        return '620x'; // default based on theme\r\n      }\r\n  \r\n      var match = src.match(/.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\.@]/);\r\n  \r\n      if (match !== null) {\r\n        return match[1];\r\n      } else {\r\n        return null;\r\n      }\r\n    }\r\n  \r\n    /**\r\n     * Adds a Shopify size attribute to a URL\r\n     */\r\n    function getSizedImageUrl(src, size) {\r\n      if (!src) {\r\n        return src;\r\n      }\r\n  \r\n      if (size == null) {\r\n        return src;\r\n      }\r\n  \r\n      if (size === 'master') {\r\n        return this.removeProtocol(src);\r\n      }\r\n  \r\n      var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i);\r\n  \r\n      if (match != null) {\r\n        var prefix = src.split(match[0]);\r\n        var suffix = match[0];\r\n  \r\n        return this.removeProtocol(prefix[0] + '_' + size + suffix);\r\n      }\r\n  \r\n      return null;\r\n    }\r\n  \r\n    function removeProtocol(path) {\r\n      return path.replace(/http(s)?:/, '');\r\n    }\r\n  \r\n    function buildImagePath(string, widths) {\r\n  \r\n      if (string == null) return [];\r\n  \r\n      if (widths) {\r\n        const imageUrls = [];\r\n  \r\n        widths.forEach(width => {\r\n          let url = `${string}?width=${width}`;\r\n          if (width === widths[widths.length - 1]) {\r\n            url += ` ${width}w`\r\n          } else {\r\n            url += ` ${width}w,`\r\n          }\r\n          imageUrls.push(url);\r\n        })\r\n        return imageUrls;\r\n      } else {\r\n        return [string];\r\n      }\r\n    }\r\n  \r\n    return {\r\n      imageSize: imageSize,\r\n      getSizedImageUrl: getSizedImageUrl,\r\n      removeProtocol: removeProtocol,\r\n      buildImagePath: buildImagePath\r\n    };\r\n  })();\r\n  \r\n  // Init section function when it's visible, then disable observer\r\n  theme.initWhenVisible = function (options) {\r\n    var threshold = options.threshold ? options.threshold : 0\r\n  \r\n    var observer = new IntersectionObserver((entries, observer) => {\r\n      entries.forEach(entry => {\r\n        if (entry.isIntersecting) {\r\n          if (typeof options.callback === 'function') {\r\n            options.callback()\r\n            observer.unobserve(entry.target)\r\n          }\r\n        }\r\n      })\r\n    }, { rootMargin: '0px 0px ' + threshold + 'px 0px' })\r\n  \r\n    observer.observe(options.element)\r\n  }\r\n  \r\n  theme.LibraryLoader = (function() {\r\n    var types = {\r\n      link: 'link',\r\n      script: 'script'\r\n    };\r\n  \r\n    var status = {\r\n      requested: 'requested',\r\n      loaded: 'loaded'\r\n    };\r\n  \r\n    var cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\r\n  \r\n    var libraries = {\r\n      youtubeSdk: {\r\n        tagId: 'youtube-sdk',\r\n        src: 'https://www.youtube.com/iframe_api',\r\n        type: types.script\r\n      },\r\n      vimeo: {\r\n        tagId: 'vimeo-api',\r\n        src: 'https://player.vimeo.com/api/player.js',\r\n        type: types.script\r\n      },\r\n      shopifyXr: {\r\n        tagId: 'shopify-model-viewer-xr',\r\n        src: cloudCdn + 'shopify-xr-js/assets/v1.0/shopify-xr.en.js',\r\n        type: types.script\r\n      },\r\n      modelViewerUi: {\r\n        tagId: 'shopify-model-viewer-ui',\r\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.en.js',\r\n        type: types.script\r\n      },\r\n      modelViewerUiStyles: {\r\n        tagId: 'shopify-model-viewer-ui-styles',\r\n        src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.css',\r\n        type: types.link\r\n      }\r\n    };\r\n  \r\n    function load(libraryName, callback) {\r\n      var library = libraries[libraryName];\r\n  \r\n      if (!library) return;\r\n      if (library.status === status.requested) return;\r\n  \r\n      callback = callback || function() {};\r\n      if (library.status === status.loaded) {\r\n        callback();\r\n        return;\r\n      }\r\n  \r\n      library.status = status.requested;\r\n  \r\n      var tag;\r\n  \r\n      switch (library.type) {\r\n        case types.script:\r\n          tag = createScriptTag(library, callback);\r\n          break;\r\n        case types.link:\r\n          tag = createLinkTag(library, callback);\r\n          break;\r\n      }\r\n  \r\n      tag.id = library.tagId;\r\n      library.element = tag;\r\n  \r\n      var firstScriptTag = document.getElementsByTagName(library.type)[0];\r\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n    }\r\n  \r\n    function createScriptTag(library, callback) {\r\n      var tag = document.createElement('script');\r\n      tag.src = library.src;\r\n      tag.addEventListener('load', function() {\r\n        library.status = status.loaded;\r\n        callback();\r\n      });\r\n      return tag;\r\n    }\r\n  \r\n    function createLinkTag(library, callback) {\r\n      var tag = document.createElement('link');\r\n      tag.href = library.src;\r\n      tag.rel = 'stylesheet';\r\n      tag.type = 'text/css';\r\n      tag.addEventListener('load', function() {\r\n        library.status = status.loaded;\r\n        callback();\r\n      });\r\n      return tag;\r\n    }\r\n  \r\n    return {\r\n      load: load\r\n    };\r\n  })();\r\n  \r\n  theme.rteInit = function() {\r\n    // Wrap tables so they become scrollable on small screens\r\n    document.querySelectorAll('.rte table').forEach(table => {\r\n      var wrapWith = document.createElement('div');\r\n      wrapWith.classList.add('table-wrapper');\r\n      theme.utils.wrap(table, wrapWith);\r\n    });\r\n  \r\n    // Wrap video iframe embeds so they are responsive\r\n    document.querySelectorAll('.rte iframe[src*=\"youtube.com/embed\"]').forEach(iframe => {\r\n      wrapVideo(iframe);\r\n    });\r\n    document.querySelectorAll('.rte iframe[src*=\"player.vimeo\"]').forEach(iframe => {\r\n      wrapVideo(iframe);\r\n    });\r\n  \r\n    function wrapVideo(iframe) {\r\n      // Reset the src attribute on each iframe after page load\r\n      // for Chrome's \"incorrect iFrame content on 'back'\" bug.\r\n      // https://code.google.com/p/chromium/issues/detail?id=395791\r\n      iframe.src = iframe.src;\r\n      var wrapWith = document.createElement('div');\r\n      wrapWith.classList.add('video-wrapper');\r\n      theme.utils.wrap(iframe, wrapWith);\r\n    }\r\n  \r\n    // Remove CSS that adds animated underline under image links\r\n    document.querySelectorAll('.rte a img').forEach(img => {\r\n      img.parentNode.classList.add('rte__image');\r\n    });\r\n  }\r\n  \r\n  theme.Sections = function Sections() {\r\n    this.constructors = {};\r\n    this.instances = [];\r\n  \r\n    document.addEventListener('shopify:section:load', this._onSectionLoad.bind(this));\r\n    document.addEventListener('shopify:section:unload', this._onSectionUnload.bind(this));\r\n    document.addEventListener('shopify:section:select', this._onSelect.bind(this));\r\n    document.addEventListener('shopify:section:deselect', this._onDeselect.bind(this));\r\n    document.addEventListener('shopify:block:select', this._onBlockSelect.bind(this));\r\n    document.addEventListener('shopify:block:deselect', this._onBlockDeselect.bind(this));\r\n  };\r\n  \r\n  theme.Sections.prototype = Object.assign({}, theme.Sections.prototype, {\r\n    _createInstance: function(container, constructor, scope) {\r\n      var id = container.getAttribute('data-section-id');\r\n      var type = container.getAttribute('data-section-type');\r\n  \r\n      constructor = constructor || this.constructors[type];\r\n  \r\n      if (typeof constructor === 'undefined') {\r\n        return;\r\n      }\r\n  \r\n      // If custom scope passed, check to see if instance\r\n      // is already initialized so we don't double up\r\n      if (scope) {\r\n        var instanceExists = this._findInstance(id);\r\n        if (instanceExists) {\r\n          this._removeInstance(id);\r\n        }\r\n      }\r\n  \r\n      // If a section fails to init, handle the error without letting all subsequest section registers to fail\r\n      try {\r\n        var instance = Object.assign(new constructor(container), {\r\n          id: id,\r\n          type: type,\r\n          container: container\r\n        });\r\n        this.instances.push(instance);\r\n      } catch (e) {\r\n        console.error(e);\r\n      }\r\n    },\r\n  \r\n    _findInstance: function(id) {\r\n      for (var i = 0; i < this.instances.length; i++) {\r\n        if (this.instances[i].id === id) {\r\n          return this.instances[i];\r\n        }\r\n      }\r\n    },\r\n  \r\n    _removeInstance: function(id) {\r\n      var i = this.instances.length;\r\n      var instance;\r\n  \r\n      while(i--) {\r\n        if (this.instances[i].id === id) {\r\n          instance = this.instances[i];\r\n          this.instances.splice(i, 1);\r\n          break;\r\n        }\r\n      }\r\n  \r\n      return instance;\r\n    },\r\n  \r\n    _onSectionLoad: function(evt, subSection, subSectionId) {\r\n      if (window.AOS) { AOS.refreshHard() }\r\n      if (theme && theme.initGlobals) {\r\n        theme.initGlobals();\r\n      }\r\n  \r\n      var container = subSection ? subSection : evt.target;\r\n      var section = subSection ? subSection : evt.target.querySelector('[data-section-id]');\r\n  \r\n      if (!section) {\r\n        return;\r\n      }\r\n  \r\n      this._createInstance(section);\r\n  \r\n      var instance = subSection ? subSectionId : this._findInstance(evt.detail.sectionId);\r\n  \r\n      // Check if we have subsections to load\r\n      var haveSubSections = container.querySelectorAll('[data-subsection]');\r\n      if (haveSubSections.length) {\r\n        this.loadSubSections(container);\r\n      }\r\n  \r\n      // Run JS only in case of the section being selected in the editor\r\n      // before merchant clicks \"Add\"\r\n      if (instance && typeof instance.onLoad === 'function') {\r\n        instance.onLoad(evt);\r\n      }\r\n  \r\n      // Force editor to trigger scroll event when loading a section\r\n      setTimeout(function() {\r\n        window.dispatchEvent(new Event('scroll'));\r\n      }, 200);\r\n    },\r\n  \r\n    _onSectionUnload: function(evt) {\r\n      this.instances = this.instances.filter(function(instance) {\r\n        var isEventInstance = instance.id === evt.detail.sectionId;\r\n  \r\n        if (isEventInstance) {\r\n          if (typeof instance.onUnload === 'function') {\r\n            instance.onUnload(evt);\r\n          }\r\n        }\r\n  \r\n        return !isEventInstance;\r\n      });\r\n    },\r\n  \r\n    loadSubSections: function(scope) {\r\n      if (!scope) {\r\n        return;\r\n      }\r\n  \r\n      var sections = scope.querySelectorAll('[data-section-id]');\r\n  \r\n      sections.forEach(el => {\r\n        this._onSectionLoad(null, el, el.dataset.sectionId);\r\n      });\r\n    },\r\n  \r\n    _onSelect: function(evt) {\r\n      var instance = this._findInstance(evt.detail.sectionId);\r\n  \r\n      if (\r\n        typeof instance !== 'undefined' &&\r\n        typeof instance.onSelect === 'function'\r\n      ) {\r\n        instance.onSelect(evt);\r\n      }\r\n    },\r\n  \r\n    _onDeselect: function(evt) {\r\n      var instance = this._findInstance(evt.detail.sectionId);\r\n  \r\n      if (\r\n        typeof instance !== 'undefined' &&\r\n        typeof instance.onDeselect === 'function'\r\n      ) {\r\n        instance.onDeselect(evt);\r\n      }\r\n    },\r\n  \r\n    _onBlockSelect: function(evt) {\r\n      var instance = this._findInstance(evt.detail.sectionId);\r\n  \r\n      if (\r\n        typeof instance !== 'undefined' &&\r\n        typeof instance.onBlockSelect === 'function'\r\n      ) {\r\n        instance.onBlockSelect(evt);\r\n      }\r\n    },\r\n  \r\n    _onBlockDeselect: function(evt) {\r\n      var instance = this._findInstance(evt.detail.sectionId);\r\n  \r\n      if (\r\n        typeof instance !== 'undefined' &&\r\n        typeof instance.onBlockDeselect === 'function'\r\n      ) {\r\n        instance.onBlockDeselect(evt);\r\n      }\r\n    },\r\n  \r\n    register: function(type, constructor, scope) {\r\n      this.constructors[type] = constructor;\r\n  \r\n      var sections = document.querySelectorAll('[data-section-type=\"' + type + '\"]');\r\n  \r\n      if (scope) {\r\n        sections = scope.querySelectorAll('[data-section-type=\"' + type + '\"]');\r\n      }\r\n  \r\n      sections.forEach(\r\n        function(container) {\r\n          this._createInstance(container, constructor, scope);\r\n        }.bind(this)\r\n      );\r\n    },\r\n  \r\n    reinit: function(section) {\r\n      for (var i = 0; i < this.instances.length; i++) {\r\n        var instance = this.instances[i];\r\n        if (instance['type'] === section) {\r\n          if (typeof instance.forceReload === 'function') {\r\n            instance.forceReload();\r\n          }\r\n        }\r\n      }\r\n    }\r\n  });\r\n  \r\n  /*\r\n    Options:\r\n      container\r\n      enableHistoryState - enable when on single product page to update URL\r\n      singleOptionSelector - selector for individual variant option (e.g. 'Blue' or 'Small')\r\n      originalSelectorId - selector for base variant selector (visually hidden)\r\n      variants - JSON parsed object of product variant info\r\n   */\r\n  theme.Variants = (function() {\r\n  \r\n    function Variants(options) {\r\n      this.container = options.container;\r\n      this.variants = options.variants;\r\n      this.singleOptionSelector = options.singleOptionSelector;\r\n      this.originalSelectorId = options.originalSelectorId;\r\n      this.enableHistoryState = options.enableHistoryState;\r\n      this.dynamicVariantsEnabled = options.dynamicVariantsEnabled;\r\n      this.currentlySelectedValues = this._getCurrentOptions();\r\n      this.currentVariant = this._getVariantFromOptions();\r\n  \r\n      this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\r\n        el.addEventListener('change', this._onSelectChange.bind(this));\r\n      });\r\n    }\r\n  \r\n    Variants.prototype = Object.assign({}, Variants.prototype, {\r\n  \r\n      _getCurrentOptions: function() {\r\n        var result = [];\r\n  \r\n        this.container.querySelectorAll(this.singleOptionSelector).forEach(el => {\r\n          var type = el.getAttribute('type');\r\n  \r\n          if (type === 'radio' || type === 'checkbox') {\r\n            if (el.checked) {\r\n              result.push({\r\n                value: el.value,\r\n                index: el.dataset.index\r\n              });\r\n            }\r\n          } else {\r\n            result.push({\r\n              value: el.value,\r\n              index: el.dataset.index\r\n            });\r\n          }\r\n        });\r\n  \r\n        // remove any unchecked input values if using radio buttons or checkboxes\r\n        result = theme.utils.compact(result);\r\n  \r\n        return result;\r\n      },\r\n  \r\n      // Pull the number out of the option index name, e.g. 'option1' -> 1\r\n      _numberFromOptionKey: function(key) {\r\n        return parseInt(key.substr(-1));\r\n      },\r\n  \r\n      // Options should be ordered from highest to lowest priority. Make sure that priority\r\n      // is represented using weighted values when finding best match\r\n      _getWeightedOptionMatchCount: function(variant) {\r\n        return this._getCurrentOptions().reduce((count, {value, index}) => {\r\n          const optionIndex = this._numberFromOptionKey(index);\r\n          const weightedCount = 4 - optionIndex; // The lower the index, the better the match we have\r\n          return variant[index] === value ? count + weightedCount : count;\r\n        },0)\r\n      },\r\n  \r\n      _getFullMatch(needsToBeAvailable) {\r\n        const currentlySelectedOptions = this._getCurrentOptions();\r\n        const variants = this.variants;\r\n  \r\n        return variants.find(variant => {\r\n          const isMatch = currentlySelectedOptions.every(({value, index}) => {\r\n            return variant[index] === value;\r\n          });\r\n  \r\n          if (needsToBeAvailable) {\r\n            return isMatch && variant.available;\r\n          } else {\r\n            return isMatch;\r\n          }\r\n        });\r\n      },\r\n  \r\n      // Find a variant that is available and best matches last selected option\r\n      _getClosestAvailableMatch: function(lastSelectedOption) {\r\n        if (!lastSelectedOption) return null;\r\n  \r\n        const currentlySelectedOptions = this._getCurrentOptions();\r\n        const variants = this.variants;\r\n  \r\n        const potentialAvailableMatches = lastSelectedOption && variants.filter(variant => {\r\n          return currentlySelectedOptions\r\n            .filter(\r\n              // Only match based selected options that are equal and preceeding the last selected option\r\n              ({value, index}) => this._numberFromOptionKey(index) <= this._numberFromOptionKey(lastSelectedOption.index)\r\n            ).every(({value, index}) => {\r\n              // Variant needs to have options that match the current and preceeding selection options\r\n              return variant[index] === value;\r\n            }) && variant.available\r\n        });\r\n  \r\n        return potentialAvailableMatches.reduce((bestMatch, variant) => {\r\n          // If this is the first potential match we've found, store it as the best match\r\n          if (bestMatch === null) return variant;\r\n  \r\n          // If this is not the first potential match, compare the number of options our current best match has in common\r\n          // compared to the next contender.\r\n          const bestMatchCount = this._getWeightedOptionMatchCount(bestMatch, lastSelectedOption);\r\n          const newCount = this._getWeightedOptionMatchCount(variant, lastSelectedOption);\r\n  \r\n          return newCount > bestMatchCount ? variant : bestMatch;\r\n        }, null);\r\n      },\r\n  \r\n      _getVariantFromOptions: function(lastSelectedOption) {\r\n        const availableFullMatch = this._getFullMatch(true);\r\n        const closestAvailableMatch = this._getClosestAvailableMatch(lastSelectedOption);\r\n        const fullMatch = this._getFullMatch(false);\r\n  \r\n        if (this.dynamicVariantsEnabled) {\r\n          // Add some additional smarts to variant matching if Dynamic Variants are enabled\r\n          return availableFullMatch || closestAvailableMatch || fullMatch || null;\r\n        } else {\r\n          // Only return a full match or null (variant doesn't exist) if Dynamic Variants are disabled\r\n          return fullMatch || null;\r\n        }\r\n  \r\n      },\r\n  \r\n      _updateInputState: function (variant, el) {\r\n        return (input) => {\r\n          if (variant === null) return;\r\n  \r\n          const index = input.dataset.index;\r\n          const value = input.value;\r\n          const type = input.getAttribute('type');\r\n  \r\n          if (type === 'radio' || type === 'checkbox') {\r\n            input.checked = variant[index] === value\r\n            if (input.checked) {\r\n              input.dispatchEvent(new Event('updateSwatch'));\r\n            }\r\n          } else {\r\n            input.value = variant[index];\r\n          }\r\n        }\r\n      },\r\n  \r\n      _onSelectChange: function({srcElement}) {\r\n        const optionSelectElements = this.container.querySelectorAll(this.singleOptionSelector);\r\n  \r\n        // Get the best variant based on the current selection + last selected element\r\n        const variant = this._getVariantFromOptions({\r\n          index: srcElement.dataset.index,\r\n          value: srcElement.value\r\n        });\r\n  \r\n        // Update DOM option input states based on the variant that was found\r\n        optionSelectElements.forEach(this._updateInputState(variant, srcElement))\r\n  \r\n        // Make sure our currently selected values are up to date after updating state of DOM\r\n        const currentlySelectedValues = this.currentlySelectedValues = this._getCurrentOptions();\r\n  \r\n        const detail = {\r\n          variant,\r\n          currentlySelectedValues,\r\n          value: srcElement.value,\r\n          index: srcElement.parentElement.dataset.index\r\n        }\r\n  \r\n        this.container.dispatchEvent(new CustomEvent('variantChange', {detail}));\r\n        document.dispatchEvent(new CustomEvent('variant:change', {detail}));\r\n  \r\n        if (!variant) {\r\n          return;\r\n        }\r\n  \r\n        this._updateMasterSelect(variant);\r\n        this._updateImages(variant);\r\n        this._updatePrice(variant);\r\n        this._updateUnitPrice(variant);\r\n        this._updateSKU(variant);\r\n        this.currentVariant = variant;\r\n  \r\n        if (this.enableHistoryState) {\r\n          this._updateHistoryState(variant);\r\n        }\r\n      },\r\n  \r\n      _updateImages: function(variant) {\r\n        if (!variant.featured_image) {\r\n          return;\r\n        }\r\n  \r\n        this.container.dispatchEvent(new CustomEvent('variantImageChange', {\r\n          detail: {\r\n            variant: variant\r\n          }\r\n        }));\r\n      },\r\n  \r\n      _updatePrice: function(variant) {\r\n        if (this.currentVariant && variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price) {\r\n          return;\r\n        }\r\n  \r\n        this.container.dispatchEvent(new CustomEvent('variantPriceChange', {\r\n          detail: {\r\n            variant: variant\r\n          }\r\n        }));\r\n      },\r\n  \r\n      _updateUnitPrice: function(variant) {\r\n        if (this.currentVariant && variant.unit_price === this.currentVariant.unit_price) {\r\n          return;\r\n        }\r\n  \r\n        this.container.dispatchEvent(new CustomEvent('variantUnitPriceChange', {\r\n          detail: {\r\n            variant: variant\r\n          }\r\n        }));\r\n      },\r\n  \r\n      _updateSKU: function(variant) {\r\n        if (this.currentVariant && variant.sku === this.currentVariant.sku) {\r\n          return;\r\n        }\r\n  \r\n        this.container.dispatchEvent(new CustomEvent('variantSKUChange', {\r\n          detail: {\r\n            variant: variant\r\n          }\r\n        }));\r\n      },\r\n  \r\n      _updateHistoryState: function(variant) {\r\n        if (!history.replaceState || !variant) {\r\n          return;\r\n        }\r\n  \r\n        var newurl = window.location.protocol + '//' + window.location.host + window.location.pathname + '?variant=' + variant.id;\r\n        window.history.replaceState({path: newurl}, '', newurl);\r\n      },\r\n  \r\n      _updateMasterSelect: function(variant) {\r\n        let masterSelect = this.container.querySelector(this.originalSelectorId);\r\n        if (!masterSelect) return;\r\n  \r\n        masterSelect.value = variant.id;\r\n        // Force a change event so Shop Pay installments works after a variant is changed\r\n        masterSelect.dispatchEvent(new Event('change', { bubbles: true }));\r\n      }\r\n    });\r\n  \r\n    return Variants;\r\n  })();\r\n  \r\n  window.vimeoApiReady = function () {\r\n    theme.config.vimeoLoading = true\r\n  \r\n    // Because there's no way to check for the Vimeo API being loaded\r\n    // asynchronously, we use this terrible timeout to wait for it being ready\r\n    checkIfVimeoIsReady()\r\n      .then(function () {\r\n        theme.config.vimeoReady = true\r\n        theme.config.vimeoLoading = false\r\n        document.dispatchEvent(new CustomEvent('vimeoReady'))\r\n      })\r\n  }\r\n  \r\n  function checkIfVimeoIsReady () {\r\n    let wait\r\n    let timeout\r\n  \r\n    return new Promise((resolve, reject) => {\r\n      wait = setInterval(function () {\r\n        if (!Vimeo) {\r\n          return\r\n        }\r\n  \r\n        clearInterval(wait)\r\n        clearTimeout(timeout)\r\n        resolve()\r\n      }, 500)\r\n  \r\n      timeout = setTimeout(function () {\r\n        clearInterval(wait)\r\n        reject()\r\n      }, 4000) // subjective. test up to 8 times over 4 seconds\r\n    })\r\n  }\r\n  \r\n  theme.VimeoPlayer = (function () {\r\n    const classes = {\r\n      loading: 'loading',\r\n      loaded: 'loaded',\r\n      interactable: 'video-interactable'\r\n    }\r\n  \r\n    const defaults = {\r\n      byline: false,\r\n      loop: true,\r\n      muted: true,\r\n      playsinline: true,\r\n      portrait: false,\r\n      title: false\r\n    }\r\n  \r\n    function VimeoPlayer (divId, videoId, options) {\r\n      this.divId = divId\r\n      this.el = document.getElementById(divId)\r\n      this.videoId = videoId\r\n      this.iframe = null\r\n      this.options = options\r\n  \r\n      if (this.options && this.options.videoParent) {\r\n        this.parent = this.el.closest(this.options.videoParent)\r\n      }\r\n  \r\n      this.setAsLoading()\r\n  \r\n      if (theme.config.vimeoReady) {\r\n        this.init()\r\n      } else {\r\n        theme.LibraryLoader.load('vimeo', window.vimeoApiReady)\r\n        document.addEventListener('vimeoReady', this.init.bind(this))\r\n      }\r\n    }\r\n  \r\n    VimeoPlayer.prototype = Object.assign({}, VimeoPlayer.prototype, {\r\n      init: function () {\r\n        const args = defaults\r\n        args.id = this.videoId\r\n  \r\n        this.videoPlayer = new Vimeo.Player(this.el, args)\r\n  \r\n        this.videoPlayer.ready().then(this.playerReady.bind(this))\r\n      },\r\n  \r\n      playerReady: function () {\r\n        this.iframe = this.el.querySelector('iframe')\r\n        this.iframe.setAttribute('tabindex', '-1')\r\n  \r\n        if (this.options.loop === 'false') {\r\n          this.videoPlayer.setLoop(false)\r\n        }\r\n  \r\n        // When sound is enabled in section settings,\r\n        // for some mobile browsers Vimeo video playback\r\n        // will stop immediately after starting and\r\n        // will require users to tap the play button once more\r\n        if (this.options.style === 'sound') {\r\n          this.videoPlayer.setVolume(1)\r\n        } else {\r\n          this.videoPlayer.setVolume(0)\r\n        }\r\n  \r\n        this.setAsLoaded()\r\n  \r\n        // pause when out of view\r\n        const observer = new IntersectionObserver((entries, observer) => {\r\n          entries.forEach(entry => {\r\n            if (entry.isIntersecting) {\r\n              this.play()\r\n            } else {\r\n              this.pause()\r\n            }\r\n          })\r\n        }, { rootMargin: '0px 0px 50px 0px' })\r\n  \r\n        observer.observe(this.iframe)\r\n      },\r\n  \r\n      setAsLoading: function () {\r\n        if (!this.parent) return\r\n        this.parent.classList.add(classes.loading)\r\n      },\r\n  \r\n      setAsLoaded: function () {\r\n        if (!this.parent) return\r\n        this.parent.classList.remove(classes.loading)\r\n        this.parent.classList.add(classes.loaded)\r\n        this.parent.classList.add(classes.interactable) // Once video is loaded, we should be able to interact with it\r\n        if (Shopify && Shopify.designMode) {\r\n          if (window.AOS) {AOS.refreshHard()}\r\n        }\r\n      },\r\n  \r\n      enableInteraction: function () {\r\n        if (!this.parent) return\r\n        this.parent.classList.add(classes.interactable)\r\n      },\r\n  \r\n      play: function () {\r\n        if (this.videoPlayer && typeof this.videoPlayer.play === 'function') {\r\n          this.videoPlayer.play()\r\n        }\r\n      },\r\n  \r\n      pause: function () {\r\n        if (this.videoPlayer && typeof this.videoPlayer.pause === 'function') {\r\n          this.videoPlayer.pause()\r\n        }\r\n      },\r\n  \r\n      destroy: function () {\r\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\r\n          this.videoPlayer.destroy()\r\n        }\r\n      }\r\n    })\r\n  \r\n    return VimeoPlayer\r\n  })()\r\n  \r\n  window.onYouTubeIframeAPIReady = function() {\r\n    theme.config.youTubeReady = true;\r\n    document.dispatchEvent(new CustomEvent('youTubeReady'));\r\n  }\r\n  \r\n  /*============================================================================\r\n    YouTube SDK method\r\n    Parameters:\r\n      - player div id (required)\r\n      - arguments\r\n        - videoId (required)\r\n        - videoParent (selector, optional for section loading state)\r\n        - events (object, optional)\r\n  ==============================================================================*/\r\n  theme.YouTube = (function() {\r\n    var classes = {\r\n      loading: 'loading',\r\n      loaded: 'loaded',\r\n      interactable: 'video-interactable'\r\n    }\r\n  \r\n    var defaults = {\r\n      width: 1280,\r\n      height: 720,\r\n      playerVars: {\r\n        autohide: 0,\r\n        autoplay: 1,\r\n        cc_load_policy: 0,\r\n        controls: 0,\r\n        fs: 0,\r\n        iv_load_policy: 3,\r\n        modestbranding: 1,\r\n        playsinline: 1,\r\n        rel: 0\r\n      }\r\n    };\r\n  \r\n    function YouTube(divId, options) {\r\n      this.divId = divId;\r\n      this.iframe = null;\r\n  \r\n      this.attemptedToPlay = false;\r\n  \r\n      // API callback events\r\n      defaults.events = {\r\n        onReady: this.onVideoPlayerReady.bind(this),\r\n        onStateChange: this.onVideoStateChange.bind(this)\r\n      };\r\n  \r\n      this.options = Object.assign({}, defaults, options);\r\n  \r\n      if (this.options) {\r\n        if (this.options.videoParent) {\r\n          this.parent = document.getElementById(this.divId).closest(this.options.videoParent);\r\n        }\r\n  \r\n        // Most YT videos will autoplay. If in product media,\r\n        // will handle in theme.Product instead\r\n        if (!this.options.autoplay) {\r\n          this.options.playerVars.autoplay = this.options.autoplay;\r\n        }\r\n  \r\n        if (this.options.style === 'sound') {\r\n          this.options.playerVars.controls = 1;\r\n          this.options.playerVars.autoplay = 0;\r\n        }\r\n  \r\n      }\r\n  \r\n      this.setAsLoading();\r\n  \r\n      if (theme.config.youTubeReady) {\r\n        this.init();\r\n      } else {\r\n        theme.LibraryLoader.load('youtubeSdk');\r\n        document.addEventListener('youTubeReady', this.init.bind(this));\r\n      }\r\n    }\r\n  \r\n    YouTube.prototype = Object.assign({}, YouTube.prototype, {\r\n      init: function() {\r\n        this.videoPlayer = new YT.Player(this.divId, this.options);\r\n      },\r\n  \r\n      onVideoPlayerReady: function(evt) {\r\n        this.iframe = document.getElementById(this.divId); // iframe once YT loads\r\n        this.iframe.setAttribute('tabindex', '-1');\r\n  \r\n        if (this.options.style !== 'sound') {\r\n          evt.target.mute();\r\n        }\r\n  \r\n        // pause when out of view\r\n        var observer = new IntersectionObserver((entries, observer) => {\r\n          entries.forEach(entry => {\r\n            if (entry.isIntersecting) {\r\n              this.play();\r\n            } else {\r\n              this.pause();\r\n            }\r\n          });\r\n        }, {rootMargin: '0px 0px 50px 0px'});\r\n  \r\n        observer.observe(this.iframe);\r\n      },\r\n  \r\n      onVideoStateChange: function(evt) {\r\n        switch (evt.data) {\r\n          case -1: // unstarted\r\n            // Handle low power state on iOS by checking if\r\n            // video is reset to unplayed after attempting to buffer\r\n            if (this.attemptedToPlay) {\r\n              this.setAsLoaded();\r\n              this.enableInteraction();\r\n            }\r\n            break;\r\n          case 0: // ended, loop it\r\n            this.play(evt);\r\n            break;\r\n          case 1: // playing\r\n            this.setAsLoaded();\r\n            break;\r\n          case 3: // buffering\r\n            this.attemptedToPlay = true;\r\n            break;\r\n        }\r\n      },\r\n  \r\n      setAsLoading: function() {\r\n        if (!this.parent) return;\r\n        this.parent.classList.add(classes.loading);\r\n      },\r\n  \r\n      setAsLoaded: function() {\r\n        if (!this.parent) return;\r\n        this.parent.classList.remove(classes.loading);\r\n        this.parent.classList.add(classes.loaded);\r\n        if (Shopify && Shopify.designMode) {\r\n          if (window.AOS) {AOS.refreshHard()}\r\n        }\r\n      },\r\n  \r\n      enableInteraction: function() {\r\n        if (!this.parent) return;\r\n        this.parent.classList.add(classes.interactable);\r\n      },\r\n  \r\n      play: function() {\r\n        if (this.videoPlayer && typeof this.videoPlayer.playVideo === 'function') {\r\n          this.videoPlayer.playVideo();\r\n        }\r\n      },\r\n  \r\n      pause: function() {\r\n        if (this.videoPlayer && typeof this.videoPlayer.pauseVideo === 'function') {\r\n          this.videoPlayer.pauseVideo();\r\n        }\r\n      },\r\n  \r\n      destroy: function() {\r\n        if (this.videoPlayer && typeof this.videoPlayer.destroy === 'function') {\r\n          this.videoPlayer.destroy();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return YouTube;\r\n  })();\r\n  \r\n  // Prevent vertical scroll while using flickity sliders\r\n  (function() {\r\n    var e = !1;\r\n    var t;\r\n  \r\n    document.body.addEventListener('touchstart', function(i) {\r\n      if (!i.target.closest('.flickity-slider')) {\r\n        return e = !1;\r\n        void 0;\r\n      }\r\n      e = !0;\r\n      t = {\r\n        x: i.touches[0].pageX,\r\n        y: i.touches[0].pageY\r\n      }\r\n    })\r\n  \r\n    document.body.addEventListener('touchmove', function(i) {\r\n      if (e && i.cancelable) {\r\n        var n = {\r\n          x: i.touches[0].pageX - t.x,\r\n          y: i.touches[0].pageY - t.y\r\n        };\r\n        Math.abs(n.x) > Flickity.defaults.dragThreshold && i.preventDefault()\r\n      }\r\n    }, { passive: !1 })\r\n  })();\r\n  \r\n\r\n  /**\r\n   * Ajax Renderer\r\n   * -----------------------------------------------------------------------------\r\n   * Render sections without reloading the page.\r\n   * @param {Object[]} sections - The section to update on render.\r\n   * @param {string} sections[].sectionId - The ID of the section from Shopify.\r\n   * @param {string} sections[].nodeId - The ID of the DOM node to replace.\r\n   * @param {Function} sections[].onReplace (optional) - The custom render function.\r\n   * @param {boolean} debug - Output logs to console for debugging.\r\n   *\r\n   */\r\n  \r\n  theme.AjaxRenderer = (function () {\r\n    function AjaxRenderer({ sections, onReplace, debug } = {}) {\r\n      this.sections = sections || [];\r\n      this.cachedSections = [];\r\n      this.onReplace = onReplace;\r\n      this.debug = Boolean(debug);\r\n    }\r\n  \r\n    AjaxRenderer.prototype = Object.assign({}, AjaxRenderer.prototype, {\r\n      renderPage: function (basePath, newParams, updateURLHash = true) {\r\n        const currentParams = new URLSearchParams(window.location.search);\r\n        const updatedParams = this.getUpdatedParams(currentParams, newParams)\r\n  \r\n        const sectionRenders = this.sections.map(section => {\r\n  \r\n          const url = `${basePath}?section_id=${section.sectionId}&${updatedParams.toString()}`;\r\n          const cachedSectionUrl = cachedSection => cachedSection.url === url;\r\n  \r\n          return this.cachedSections.some(cachedSectionUrl)\r\n            ? this.renderSectionFromCache(cachedSectionUrl, section)\r\n            : this.renderSectionFromFetch(url, section);\r\n        });\r\n  \r\n        if (updateURLHash) this.updateURLHash(updatedParams);\r\n  \r\n        return Promise.all(sectionRenders);\r\n      },\r\n  \r\n      renderSectionFromCache: function (url, section) {\r\n        const cachedSection = this.cachedSections.find(url);\r\n  \r\n        this.log(`[AjaxRenderer] rendering from cache: url=${cachedSection.url}`);\r\n        this.renderSection(cachedSection.html, section);\r\n        return Promise.resolve(section);\r\n      },\r\n  \r\n      renderSectionFromFetch: function (url, section) {\r\n        this.log(`[AjaxRenderer] redering from fetch: url=${url}`);\r\n  \r\n        return new Promise((resolve, reject) => {\r\n          fetch(url)\r\n            .then(response => response.text())\r\n            .then(responseText => {\r\n              const html = responseText;\r\n              this.cachedSections = [...this.cachedSections, { html, url }];\r\n              this.renderSection(html, section);\r\n              resolve(section);\r\n            })\r\n            .catch(err => reject(err));\r\n        });\r\n      },\r\n  \r\n      renderSection: function (html, section) {\r\n        this.log(\r\n          `[AjaxRenderer] rendering section: section=${JSON.stringify(section)}`,\r\n        );\r\n  \r\n        const newDom = new DOMParser().parseFromString(html, 'text/html');\r\n        if (this.onReplace) {\r\n          this.onReplace(newDom, section);\r\n        } else {\r\n          if (typeof section.nodeId === 'string') {\r\n            var newContentEl = newDom.getElementById(section.nodeId);\r\n            if (!newContentEl) {\r\n              return;\r\n            }\r\n  \r\n            document.getElementById(section.nodeId).innerHTML =\r\n              newContentEl.innerHTML;\r\n          } else {\r\n            section.nodeId.forEach(id => {\r\n              document.getElementById(id).innerHTML =\r\n                newDom.getElementById(id).innerHTML;\r\n            });\r\n          }\r\n        }\r\n  \r\n        return section;\r\n      },\r\n  \r\n      getUpdatedParams: function (currentParams, newParams) {\r\n        const clone = new URLSearchParams(currentParams);\r\n        const preservedParams = ['sort_by', 'q', 'options[prefix]', 'type'];\r\n  \r\n        // Find what params need to be removed\r\n        // delete happens first as we cannot specify keys based off of values\r\n        for (const [key, value] of clone.entries()) {\r\n          if (!newParams.getAll(key).includes(value) && !preservedParams.includes(key)) {\r\n            clone.delete(key);\r\n          };\r\n        }\r\n  \r\n        // Find what params need to be added\r\n        for (const [key, value] of newParams.entries()) {\r\n          if (!clone.getAll(key).includes(value) && value !== '') {\r\n            clone.append(key, value);\r\n          }\r\n        }\r\n  \r\n        return clone;\r\n      },\r\n  \r\n      updateURLHash: function (searchParams) {\r\n        history.pushState(\r\n          {},\r\n          '',\r\n          `${window.location.pathname}${\r\n            searchParams && '?'.concat(searchParams)\r\n          }`,\r\n        );\r\n      },\r\n  \r\n      log: function (...args) {\r\n        if (this.debug) {\r\n          console.log(...args);\r\n        }\r\n      },\r\n    });\r\n  \r\n    return AjaxRenderer;\r\n  })();\r\n  \r\n  if (window.Shopify && window.Shopify.theme && navigator && navigator.sendBeacon && window.Shopify.designMode) {\r\n    navigator.sendBeacon('https://api.archetypethemes.co/api/beacon', new URLSearchParams({\r\n      shop: window.Shopify.shop,\r\n      themeName: window.theme && window.theme.settings && `${window.theme.settings.themeName} v${window.theme.settings.themeVersion}`,\r\n      role: window.Shopify.theme.role,\r\n      route: window.location.pathname,\r\n      themeId: window.Shopify.theme.id,\r\n      themeStoreId: window.Shopify.theme.theme_store_id || 0,\r\n      isThemeEditor: !!window.Shopify.designMode\r\n    }))\r\n  }\r\n  theme.cart = {\r\n    getCart: function() {\r\n      var url = ''.concat(theme.routes.cart, '?t=').concat(Date.now());\r\n      return fetch(url, {\r\n        credentials: 'same-origin',\r\n        method: 'GET'\r\n      }).then(response => response.json());\r\n    },\r\n  \r\n    getCartProductMarkup: function() {\r\n      var url = ''.concat(theme.routes.cartPage, '?t=').concat(Date.now());\r\n  \r\n      url = url.indexOf('?') === -1 ? (url + '?view=ajax') : (url + '&view=ajax');\r\n  \r\n      return fetch(url, {\r\n        credentials: 'same-origin',\r\n        method: 'GET'\r\n      })\r\n      .then(response => response.text())\r\n      .catch(e => console.error(e));\r\n    },\r\n  \r\n    changeItem: function(key, qty) {\r\n  \r\n      return this._updateCart({\r\n        url: ''.concat(theme.routes.cartChange, '?t=').concat(Date.now()),\r\n        data: JSON.stringify({\r\n          id: key,\r\n          quantity: qty\r\n        })\r\n      })\r\n    },\r\n  \r\n    _updateCart: function(params) {\r\n      return fetch(params.url, {\r\n        method: 'POST',\r\n        body: params.data,\r\n        credentials: 'same-origin',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          'X-Requested-With': 'XMLHttpRequest',\r\n          'Accept': 'application/json'\r\n        }\r\n      })\r\n      .then(response => { return response.text() })\r\n      .then(cart => { return cart; });\r\n    },\r\n  \r\n    updateAttribute: function(key, value) {\r\n      return this._updateCart({\r\n        url: '/cart/update.js',\r\n        data: JSON.stringify({\r\n          attributes: {\r\n            [key]: theme.cart.attributeToString(value)\r\n          }\r\n        })\r\n      });\r\n    },\r\n  \r\n    updateNote: function(note) {\r\n      return this._updateCart({\r\n        url: '/cart/update.js',\r\n        data: JSON.stringify({\r\n          note: theme.cart.attributeToString(note)\r\n        })\r\n      });\r\n    },\r\n  \r\n    attributeToString: function(attribute) {\r\n      if ((typeof attribute) !== 'string') {\r\n        attribute += '';\r\n        if (attribute === 'undefined') {\r\n          attribute = '';\r\n        }\r\n      }\r\n      return attribute.trim();\r\n    }\r\n  }\r\n  \r\n  /*============================================================================\r\n    CartForm\r\n    - Prevent checkout when terms checkbox exists\r\n    - Listen to quantity changes, rebuild cart (both widget and page)\r\n  ==============================================================================*/\r\n  theme.CartForm = (function() {\r\n    var selectors = {\r\n      products: '[data-products]',\r\n      qtySelector: '.js-qty__wrapper',\r\n      discounts: '[data-discounts]',\r\n      savings: '[data-savings]',\r\n      subTotal: '[data-subtotal]',\r\n  \r\n      cartBubble: '.cart-link__bubble',\r\n      cartNote: '[name=\"note\"]',\r\n      termsCheckbox: '.cart__terms-checkbox',\r\n      checkoutBtn: '.cart__checkout'\r\n    };\r\n  \r\n    var classes = {\r\n      btnLoading: 'btn--loading'\r\n    };\r\n  \r\n    var config = {\r\n      requiresTerms: false\r\n    };\r\n  \r\n    function CartForm(form) {\r\n      if (!form) {\r\n        return;\r\n      }\r\n  \r\n      this.form = form;\r\n      this.wrapper = form.parentNode;\r\n      this.location = form.dataset.location;\r\n      this.namespace = '.cart-' + this.location;\r\n      this.products = form.querySelector(selectors.products)\r\n      this.submitBtn = form.querySelector(selectors.checkoutBtn);\r\n  \r\n      this.discounts = form.querySelector(selectors.discounts);\r\n      this.savings = form.querySelector(selectors.savings);\r\n      this.subtotal = form.querySelector(selectors.subTotal);\r\n      this.termsCheckbox = form.querySelector(selectors.termsCheckbox);\r\n      this.noteInput = form.querySelector(selectors.cartNote);\r\n  \r\n      this.cartItemsUpdated = false;\r\n  \r\n      if (this.termsCheckbox) {\r\n        config.requiresTerms = true;\r\n      }\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    CartForm.prototype = Object.assign({}, CartForm.prototype, {\r\n      init: function() {\r\n        this.initQtySelectors();\r\n  \r\n        document.addEventListener('cart:quantity' + this.namespace, this.quantityChanged.bind(this));\r\n  \r\n        this.form.on('submit' + this.namespace, this.onSubmit.bind(this));\r\n  \r\n        if (this.noteInput) {\r\n          this.noteInput.addEventListener('change', function() {\r\n            var newNote = this.value;\r\n            theme.cart.updateNote(newNote);\r\n          });\r\n        }\r\n  \r\n        // Dev-friendly way to build the cart\r\n        document.addEventListener('cart:build', function() {\r\n          this.buildCart();\r\n        }.bind(this));\r\n      },\r\n  \r\n      reInit: function() {\r\n        this.initQtySelectors();\r\n      },\r\n  \r\n      onSubmit: function(evt) {\r\n        this.submitBtn.classList.add(classes.btnLoading);\r\n  \r\n        /*\r\n          Checks for drawer or cart open class on body element\r\n          and then stops the form from being submitted. We are also\r\n          checking against a custom property, this.cartItemsUpdated = false.\r\n  \r\n          Error is handled in the quantityChanged method\r\n  \r\n          For Expanse/Fetch/Gem quick add, if an error is present it is alerted\r\n          through the add to cart fetch request in quick-add.js.\r\n  \r\n          Custom property this.cartItemsUpdated = false is reset in cart-drawer.js for\r\n          Expanse/Fetch/Gem when using quick add\r\n        */\r\n  \r\n        if (document.documentElement.classList.contains('js-drawer-open') && this.cartItemsUpdated ||\r\n          document.documentElement.classList.contains('cart-open') && this.cartItemsUpdated) {\r\n          this.submitBtn.classList.remove(classes.btnLoading);\r\n          evt.preventDefault();\r\n          return false;\r\n        }\r\n  \r\n        if (config.requiresTerms) {\r\n          if (this.termsCheckbox.checked) {\r\n            // continue to checkout\r\n          } else {\r\n            alert(theme.strings.cartTermsConfirmation);\r\n            this.submitBtn.classList.remove(classes.btnLoading)\r\n            evt.preventDefault();\r\n            return false;\r\n          }\r\n        }\r\n      },\r\n  \r\n      /*============================================================================\r\n        Query cart page to get markup\r\n      ==============================================================================*/\r\n      _parseProductHTML: function(text) {\r\n        const html = document.createElement('div');\r\n        html.innerHTML = text;\r\n  \r\n        return {\r\n          items: html.querySelector('.cart__items'),\r\n          discounts: html.querySelector('.cart__discounts')\r\n        }\r\n      },\r\n  \r\n      buildCart: function() {\r\n        theme.cart.getCartProductMarkup().then(this.cartMarkup.bind(this));\r\n      },\r\n  \r\n      cartMarkup: function(text) {\r\n        var markup = this._parseProductHTML(text);\r\n        var items = markup.items;\r\n        var count = parseInt(items.dataset.count);\r\n        var subtotal = items.dataset.cartSubtotal;\r\n        var savings = items.dataset.cartSavings;\r\n  \r\n        this.updateCartDiscounts(markup.discounts);\r\n        this.updateSavings(savings);\r\n  \r\n        if (count > 0) {\r\n          this.wrapper.classList.remove('is-empty');\r\n        } else {\r\n          this.wrapper.classList.add('is-empty');\r\n        }\r\n  \r\n        this.updateCount(count);\r\n  \r\n        // Append item markup\r\n        this.products.innerHTML = '';\r\n        this.products.append(items);\r\n  \r\n        // Update subtotal\r\n        this.subtotal.innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\r\n  \r\n        this.reInit();\r\n  \r\n        if (window.AOS) { AOS.refreshHard() }\r\n  \r\n        if (Shopify && Shopify.StorefrontExpressButtons) {\r\n          Shopify.StorefrontExpressButtons.initialize();\r\n        }\r\n      },\r\n  \r\n      updateCartDiscounts: function(markup) {\r\n        if (!this.discounts) {\r\n          return;\r\n        }\r\n        this.discounts.innerHTML = '';\r\n        this.discounts.append(markup);\r\n      },\r\n  \r\n      /*============================================================================\r\n        Quantity handling\r\n      ==============================================================================*/\r\n      initQtySelectors: function() {\r\n        this.form.querySelectorAll(selectors.qtySelector).forEach(el => {\r\n          var selector = new theme.QtySelector(el, {\r\n            namespace: this.namespace,\r\n            isCart: true\r\n          });\r\n        });\r\n      },\r\n  \r\n      quantityChanged: function(evt) {\r\n        var key = evt.detail[0];\r\n        var qty = evt.detail[1];\r\n        var el = evt.detail[2];\r\n  \r\n        if (!key || !qty) {\r\n          return;\r\n        }\r\n  \r\n        // Disable qty selector so multiple clicks can't happen while loading\r\n        if (el) {\r\n          el.classList.add('is-loading');\r\n        }\r\n  \r\n        theme.cart.changeItem(key, qty)\r\n          .then(function(cart) {\r\n  \r\n            const parsedCart = JSON.parse(cart);\r\n  \r\n            if (parsedCart.status === 422) {\r\n              alert(parsedCart.message);\r\n            } else {\r\n              const updatedItem = parsedCart.items.find(item => item.key === key);\r\n  \r\n              // Update cartItemsUpdated property on object so we can reference later\r\n              if (updatedItem && (evt.type === 'cart:quantity.cart-cart-drawer' || evt.type === 'cart:quantity.cart-header')) {\r\n                this.cartItemsUpdated = true;\r\n              }\r\n  \r\n              if ((updatedItem && evt.type === 'cart:quantity.cart-cart-drawer') || (updatedItem && evt.type === 'cart:quantity.cart-header')) {\r\n                if (updatedItem.quantity !== qty) {\r\n                }\r\n                // Reset property on object so that checkout button will work as usual\r\n                this.cartItemsUpdated = false;\r\n              }\r\n  \r\n              if (parsedCart.item_count > 0) {\r\n                this.wrapper.classList.remove('is-empty');\r\n              } else {\r\n                this.wrapper.classList.add('is-empty');\r\n              }\r\n            }\r\n  \r\n            this.buildCart();\r\n  \r\n            document.dispatchEvent(new CustomEvent('cart:updated', {\r\n              detail: {\r\n                cart: parsedCart\r\n              }\r\n            }));\r\n          }.bind(this))\r\n          .catch(function(XMLHttpRequest){});\r\n      },\r\n  \r\n      /*============================================================================\r\n        Update elements of the cart\r\n      ==============================================================================*/\r\n      updateSubtotal: function(subtotal) {\r\n        this.form.querySelector(selectors.subTotal).innerHTML = theme.Currency.formatMoney(subtotal, theme.settings.moneyFormat);\r\n      },\r\n  \r\n      updateSavings: function(savings) {\r\n        if (!this.savings) {\r\n          return;\r\n        }\r\n  \r\n        if (savings > 0) {\r\n          var amount = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\r\n          this.savings.classList.remove('hide');\r\n          this.savings.innerHTML = theme.strings.cartSavings.replace('[savings]', amount);\r\n        } else {\r\n          this.savings.classList.add('hide');\r\n        }\r\n      },\r\n  \r\n      updateCount: function(count) {\r\n        var countEls = document.querySelectorAll('.cart-link__bubble-num');\r\n  \r\n        if (countEls.length) {\r\n          countEls.forEach(el => {\r\n            el.innerText = count;\r\n          });\r\n        }\r\n  \r\n        // show/hide bubble(s)\r\n        var bubbles = document.querySelectorAll(selectors.cartBubble);\r\n        if (bubbles.length) {\r\n          if (count > 0) {\r\n            bubbles.forEach(b => {\r\n              b.classList.add('cart-link__bubble--visible');\r\n            });\r\n          } else {\r\n            bubbles.forEach(b => {\r\n              b.classList.remove('cart-link__bubble--visible');\r\n            });\r\n          }\r\n        }\r\n      }\r\n    });\r\n  \r\n    return CartForm;\r\n  })();\r\n  \r\n  // Either collapsible containers all acting individually,\r\n  // or tabs that can only have one open at a time\r\n  theme.collapsibles = (function() {\r\n    var selectors = {\r\n      trigger: '.collapsible-trigger',\r\n      module: '.collapsible-content',\r\n      moduleInner: '.collapsible-content__inner',\r\n      tabs: '.collapsible-trigger--tab'\r\n    };\r\n  \r\n    var classes = {\r\n      hide: 'hide',\r\n      open: 'is-open',\r\n      autoHeight: 'collapsible--auto-height',\r\n      tabs: 'collapsible-trigger--tab'\r\n    };\r\n  \r\n    var namespace = '.collapsible';\r\n  \r\n    var isTransitioning = false;\r\n  \r\n    function init(scope) {\r\n      var el = scope ? scope : document;\r\n      el.querySelectorAll(selectors.trigger).forEach(trigger => {\r\n        var state = trigger.classList.contains(classes.open);\r\n        trigger.setAttribute('aria-expanded', state);\r\n  \r\n        trigger.off('click' + namespace);\r\n        trigger.on('click' + namespace, toggle);\r\n      });\r\n    }\r\n  \r\n    function toggle(evt) {\r\n      if (isTransitioning) {\r\n        return;\r\n      }\r\n  \r\n      isTransitioning = true;\r\n  \r\n      var el = evt.currentTarget;\r\n      var isOpen = el.classList.contains(classes.open);\r\n      var isTab = el.classList.contains(classes.tabs);\r\n      var moduleId = el.getAttribute('aria-controls');\r\n      var container = document.getElementById(moduleId);\r\n  \r\n      if (!moduleId) {\r\n        moduleId = el.dataset.controls;\r\n      }\r\n  \r\n      // No ID, bail\r\n      if (!moduleId) {\r\n        return;\r\n      }\r\n  \r\n      // If container=null, there isn't a matching ID.\r\n      // Check if data-id is set instead. Could be multiple.\r\n      // Select based on being in the same parent div.\r\n      if (!container) {\r\n        var multipleMatches = document.querySelectorAll('[data-id=\"' + moduleId + '\"]');\r\n        if (multipleMatches.length > 0) {\r\n          container = el.parentNode.querySelector('[data-id=\"' + moduleId + '\"]');\r\n        }\r\n      }\r\n  \r\n      if (!container) {\r\n        isTransitioning = false;\r\n        return;\r\n      }\r\n  \r\n      var height = container.querySelector(selectors.moduleInner).offsetHeight;\r\n      var isAutoHeight = container.classList.contains(classes.autoHeight);\r\n      var parentCollapsibleEl = container.parentNode.closest(selectors.module);\r\n      var childHeight = height;\r\n  \r\n      if (isTab) {\r\n        if(isOpen) {\r\n          isTransitioning = false;\r\n          return;\r\n        }\r\n  \r\n        var newModule;\r\n        document.querySelectorAll(selectors.tabs + '[data-id=\"'+ el.dataset.id +'\"]').forEach(el => {\r\n          el.classList.remove(classes.open);\r\n          newModule = document.querySelector('#' + el.getAttribute('aria-controls'));\r\n          setTransitionHeight(newModule, 0, true);\r\n        });\r\n      }\r\n  \r\n      // If isAutoHeight, set the height to 0 just after setting the actual height\r\n      // so the closing animation works nicely\r\n      if (isOpen && isAutoHeight) {\r\n        setTimeout(function() {\r\n          height = 0;\r\n          setTransitionHeight(container, height, isOpen, isAutoHeight);\r\n        }, 0);\r\n      }\r\n  \r\n      if (isOpen && !isAutoHeight) {\r\n        height = 0;\r\n      }\r\n  \r\n      el.setAttribute('aria-expanded', !isOpen);\r\n      if (isOpen) {\r\n        el.classList.remove(classes.open);\r\n      } else {\r\n        el.classList.add(classes.open);\r\n      }\r\n  \r\n      setTransitionHeight(container, height, isOpen, isAutoHeight);\r\n  \r\n      // If we are in a nested collapsible element like the mobile nav,\r\n      // also set the parent element's height\r\n      if (parentCollapsibleEl) {\r\n        var parentHeight = parentCollapsibleEl.style.height;\r\n  \r\n        if (isOpen && parentHeight === 'auto') {\r\n          childHeight = 0; // Set childHeight to 0 if parent is initially opened\r\n        }\r\n  \r\n        var totalHeight = isOpen\r\n                        ? parentCollapsibleEl.offsetHeight - childHeight\r\n                        : height + parentCollapsibleEl.offsetHeight;\r\n  \r\n        setTransitionHeight(parentCollapsibleEl, totalHeight, false, false);\r\n      }\r\n    }\r\n  \r\n    function setTransitionHeight(container, height, isOpen, isAutoHeight) {\r\n      container.classList.remove(classes.hide);\r\n      theme.utils.prepareTransition(container, function() {\r\n  \r\n        container.style.height = height+'px';\r\n        if (isOpen) {\r\n          container.classList.remove(classes.open);\r\n        } else {\r\n          container.classList.add(classes.open);\r\n        }\r\n      });\r\n  \r\n      if (!isOpen && isAutoHeight) {\r\n        var o = container;\r\n        window.setTimeout(function() {\r\n          o.css('height','auto');\r\n          isTransitioning = false;\r\n        }, 500);\r\n      } else {\r\n        isTransitioning = false;\r\n      }\r\n    }\r\n  \r\n    return {\r\n      init: init\r\n    };\r\n  })();\r\n  \r\n  // Shopify-built select-like popovers for currency and language selection\r\n  theme.Disclosure = (function() {\r\n    var selectors = {\r\n      disclosureForm: '[data-disclosure-form]',\r\n      disclosureList: '[data-disclosure-list]',\r\n      disclosureToggle: '[data-disclosure-toggle]',\r\n      disclosureInput: '[data-disclosure-input]',\r\n      disclosureOptions: '[data-disclosure-option]'\r\n    };\r\n  \r\n    var classes = {\r\n      listVisible: 'disclosure-list--visible'\r\n    };\r\n  \r\n    function Disclosure(disclosure) {\r\n      this.container = disclosure;\r\n      this._cacheSelectors();\r\n      this._setupListeners();\r\n    }\r\n  \r\n    Disclosure.prototype = Object.assign({}, Disclosure.prototype, {\r\n      _cacheSelectors: function() {\r\n        this.cache = {\r\n          disclosureForm: this.container.closest(selectors.disclosureForm),\r\n          disclosureList: this.container.querySelector(selectors.disclosureList),\r\n          disclosureToggle: this.container.querySelector(\r\n            selectors.disclosureToggle\r\n          ),\r\n          disclosureInput: this.container.querySelector(\r\n            selectors.disclosureInput\r\n          ),\r\n          disclosureOptions: this.container.querySelectorAll(\r\n            selectors.disclosureOptions\r\n          )\r\n        };\r\n      },\r\n  \r\n      _setupListeners: function() {\r\n        this.eventHandlers = this._setupEventHandlers();\r\n  \r\n        this.cache.disclosureToggle.addEventListener(\r\n          'click',\r\n          this.eventHandlers.toggleList\r\n        );\r\n  \r\n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\r\n          disclosureOption.addEventListener(\r\n            'click',\r\n            this.eventHandlers.connectOptions\r\n          );\r\n        }, this);\r\n  \r\n        this.container.addEventListener(\r\n          'keyup',\r\n          this.eventHandlers.onDisclosureKeyUp\r\n        );\r\n  \r\n        this.cache.disclosureList.addEventListener(\r\n          'focusout',\r\n          this.eventHandlers.onDisclosureListFocusOut\r\n        );\r\n  \r\n        this.cache.disclosureToggle.addEventListener(\r\n          'focusout',\r\n          this.eventHandlers.onDisclosureToggleFocusOut\r\n        );\r\n  \r\n        document.body.addEventListener('click', this.eventHandlers.onBodyClick);\r\n      },\r\n  \r\n      _setupEventHandlers: function() {\r\n        return {\r\n          connectOptions: this._connectOptions.bind(this),\r\n          toggleList: this._toggleList.bind(this),\r\n          onBodyClick: this._onBodyClick.bind(this),\r\n          onDisclosureKeyUp: this._onDisclosureKeyUp.bind(this),\r\n          onDisclosureListFocusOut: this._onDisclosureListFocusOut.bind(this),\r\n          onDisclosureToggleFocusOut: this._onDisclosureToggleFocusOut.bind(this)\r\n        };\r\n      },\r\n  \r\n      _connectOptions: function(event) {\r\n        event.preventDefault();\r\n  \r\n        this._submitForm(event.currentTarget.dataset.value);\r\n      },\r\n  \r\n      _onDisclosureToggleFocusOut: function(event) {\r\n        var disclosureLostFocus =\r\n          this.container.contains(event.relatedTarget) === false;\r\n  \r\n        if (disclosureLostFocus) {\r\n          this._hideList();\r\n        }\r\n      },\r\n  \r\n      _onDisclosureListFocusOut: function(event) {\r\n        var childInFocus = event.currentTarget.contains(event.relatedTarget);\r\n  \r\n        var isVisible = this.cache.disclosureList.classList.contains(\r\n          classes.listVisible\r\n        );\r\n  \r\n        if (isVisible && !childInFocus) {\r\n          this._hideList();\r\n        }\r\n      },\r\n  \r\n      _onDisclosureKeyUp: function(event) {\r\n        if (event.which !== 27) return;\r\n        this._hideList();\r\n        this.cache.disclosureToggle.focus();\r\n      },\r\n  \r\n      _onBodyClick: function(event) {\r\n        var isOption = this.container.contains(event.target);\r\n        var isVisible = this.cache.disclosureList.classList.contains(\r\n          classes.listVisible\r\n        );\r\n  \r\n        if (isVisible && !isOption) {\r\n          this._hideList();\r\n        }\r\n      },\r\n  \r\n      _submitForm: function(value) {\r\n        this.cache.disclosureInput.value = value;\r\n        this.cache.disclosureForm.submit();\r\n      },\r\n  \r\n      _hideList: function() {\r\n        this.cache.disclosureList.classList.remove(classes.listVisible);\r\n        this.cache.disclosureToggle.setAttribute('aria-expanded', false);\r\n      },\r\n  \r\n      _toggleList: function() {\r\n        var ariaExpanded =\r\n          this.cache.disclosureToggle.getAttribute('aria-expanded') === 'true';\r\n        this.cache.disclosureList.classList.toggle(classes.listVisible);\r\n        this.cache.disclosureToggle.setAttribute('aria-expanded', !ariaExpanded);\r\n      },\r\n  \r\n      destroy: function() {\r\n        this.cache.disclosureToggle.removeEventListener(\r\n          'click',\r\n          this.eventHandlers.toggleList\r\n        );\r\n  \r\n        this.cache.disclosureOptions.forEach(function(disclosureOption) {\r\n          disclosureOption.removeEventListener(\r\n            'click',\r\n            this.eventHandlers.connectOptions\r\n          );\r\n        }, this);\r\n  \r\n        this.container.removeEventListener(\r\n          'keyup',\r\n          this.eventHandlers.onDisclosureKeyUp\r\n        );\r\n  \r\n        this.cache.disclosureList.removeEventListener(\r\n          'focusout',\r\n          this.eventHandlers.onDisclosureListFocusOut\r\n        );\r\n  \r\n        this.cache.disclosureToggle.removeEventListener(\r\n          'focusout',\r\n          this.eventHandlers.onDisclosureToggleFocusOut\r\n        );\r\n  \r\n        document.body.removeEventListener(\r\n          'click',\r\n          this.eventHandlers.onBodyClick\r\n        );\r\n      }\r\n    });\r\n  \r\n    return Disclosure;\r\n  })();\r\n  \r\n  theme.Drawers = (function() {\r\n    function Drawers(id, name) {\r\n      this.config = {\r\n        id: id,\r\n        close: '.js-drawer-close',\r\n        open: '.js-drawer-open-' + name,\r\n        openClass: 'js-drawer-open',\r\n        closingClass: 'js-drawer-closing',\r\n        activeDrawer: 'drawer--is-open',\r\n        namespace: '.drawer-' + name\r\n      };\r\n  \r\n      this.nodes = {\r\n        page: document.querySelector('#MainContent')\r\n      };\r\n  \r\n      this.drawer = document.querySelector('#' + id);\r\n      this.isOpen = false;\r\n  \r\n      if (!this.drawer) {\r\n        return;\r\n      }\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    Drawers.prototype = Object.assign({}, Drawers.prototype, {\r\n      init: function() {\r\n        // Setup open button(s)\r\n        document.querySelectorAll(this.config.open).forEach(openBtn => {\r\n          openBtn.setAttribute('aria-expanded', 'false');\r\n          openBtn.addEventListener('click', this.open.bind(this));\r\n        });\r\n  \r\n        this.drawer.querySelector(this.config.close).addEventListener('click', this.close.bind(this));\r\n  \r\n        // Close modal if a drawer is opened\r\n        document.addEventListener('modalOpen', function() {\r\n          this.close();\r\n        }.bind(this));\r\n      },\r\n  \r\n      open: function(evt, returnFocusEl) {\r\n        if (evt) {\r\n          evt.preventDefault();\r\n        }\r\n  \r\n        if (this.isOpen) {\r\n          return;\r\n        }\r\n  \r\n        // Without this the drawer opens, the click event bubbles up to $nodes.page which closes the drawer.\r\n        if (evt && evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n          // save the source of the click, we'll focus to this on close\r\n          evt.currentTarget.setAttribute('aria-expanded', 'true');\r\n          this.activeSource = evt.currentTarget;\r\n        } else if (returnFocusEl) {\r\n          returnFocusEl.setAttribute('aria-expanded', 'true');\r\n          this.activeSource = returnFocusEl;\r\n        }\r\n  \r\n        theme.utils.prepareTransition(this.drawer, function() {\r\n          this.drawer.classList.add(this.config.activeDrawer);\r\n        }.bind(this));\r\n  \r\n        document.documentElement.classList.add(this.config.openClass);\r\n        this.isOpen = true;\r\n  \r\n        theme.a11y.trapFocus({\r\n          container: this.drawer,\r\n          namespace: 'drawer_focus'\r\n        });\r\n  \r\n        document.dispatchEvent(new CustomEvent('drawerOpen'));\r\n        document.dispatchEvent(new CustomEvent('drawerOpen.' + this.config.id));\r\n  \r\n        this.bindEvents();\r\n      },\r\n  \r\n      close: function(evt) {\r\n        if (!this.isOpen) {\r\n          return;\r\n        }\r\n  \r\n        // Do not close if click event came from inside drawer\r\n        if (evt) {\r\n          if (evt.target.closest('.js-drawer-close')) {\r\n            // Do not close if using the drawer close button\r\n          } else if (evt.target.closest('.drawer')) {\r\n            return;\r\n          }\r\n        }\r\n  \r\n        // deselect any focused form elements\r\n        document.activeElement.blur();\r\n  \r\n        theme.utils.prepareTransition(this.drawer, function() {\r\n          this.drawer.classList.remove(this.config.activeDrawer);\r\n        }.bind(this));\r\n  \r\n        document.documentElement.classList.remove(this.config.openClass);\r\n        document.documentElement.classList.add(this.config.closingClass);\r\n  \r\n        window.setTimeout(function() {\r\n          document.documentElement.classList.remove(this.config.closingClass);\r\n          if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\r\n            this.activeSource.setAttribute('aria-expanded', 'false');\r\n            this.activeSource.focus();\r\n          }\r\n        }.bind(this), 500);\r\n  \r\n        this.isOpen = false;\r\n  \r\n        theme.a11y.removeTrapFocus({\r\n          container: this.drawer,\r\n          namespace: 'drawer_focus'\r\n        });\r\n  \r\n        this.unbindEvents();\r\n      },\r\n  \r\n      bindEvents: function() {\r\n        // Clicking out of drawer closes it\r\n        window.on('click' + this.config.namespace, function(evt) {\r\n          this.close(evt)\r\n          return;\r\n        }.bind(this));\r\n  \r\n        // Pressing escape closes drawer\r\n        window.on('keyup' + this.config.namespace, function(evt) {\r\n          if (evt.keyCode === 27) {\r\n            this.close();\r\n          }\r\n        }.bind(this));\r\n  \r\n        theme.a11y.lockMobileScrolling(this.config.namespace, this.nodes.page);\r\n      },\r\n  \r\n      unbindEvents: function() {\r\n        window.off('click' + this.config.namespace);\r\n        window.off('keyup' + this.config.namespace);\r\n  \r\n        theme.a11y.unlockMobileScrolling(this.config.namespace, this.nodes.page);\r\n      }\r\n    });\r\n  \r\n    return Drawers;\r\n  })();\r\n  \r\n  theme.Modals = (function() {\r\n    function Modal(id, name, options) {\r\n      var defaults = {\r\n        close: '.js-modal-close',\r\n        open: '.js-modal-open-' + name,\r\n        openClass: 'modal--is-active',\r\n        closingClass: 'modal--is-closing',\r\n        bodyOpenClass: ['modal-open'],\r\n        bodyOpenSolidClass: 'modal-open--solid',\r\n        bodyClosingClass: 'modal-closing',\r\n        closeOffContentClick: true\r\n      };\r\n  \r\n      this.id = id;\r\n      this.modal = document.getElementById(id);\r\n  \r\n      if (!this.modal) {\r\n        return false;\r\n      }\r\n  \r\n      this.modalContent = this.modal.querySelector('.modal__inner');\r\n  \r\n      this.config = Object.assign(defaults, options);\r\n      this.modalIsOpen = false;\r\n      this.focusOnOpen = this.config.focusIdOnOpen ? document.getElementById(this.config.focusIdOnOpen) : this.modal;\r\n      this.isSolid = this.config.solid;\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    Modal.prototype.init = function() {\r\n      document.querySelectorAll(this.config.open).forEach(btn => {\r\n        btn.setAttribute('aria-expanded', 'false');\r\n        btn.addEventListener('click', this.open.bind(this));\r\n  \r\n        btn.classList.remove('btn--not-ready')\r\n      });\r\n  \r\n      this.modal.querySelectorAll(this.config.close).forEach(btn => {\r\n        btn.addEventListener('click', this.close.bind(this));\r\n      });\r\n  \r\n      // Close modal if a drawer is opened\r\n      document.addEventListener('drawerOpen', function() {\r\n        this.close();\r\n      }.bind(this));\r\n    };\r\n  \r\n    Modal.prototype.open = function(evt) {\r\n      // Keep track if modal was opened from a click, or called by another function\r\n      var externalCall = false;\r\n  \r\n      // don't open an opened modal\r\n      if (this.modalIsOpen) {\r\n        return;\r\n      }\r\n  \r\n      // Prevent following href if link is clicked\r\n      if (evt) {\r\n        evt.preventDefault();\r\n      } else {\r\n        externalCall = true;\r\n      }\r\n  \r\n      // Without this, the modal opens, the click event bubbles up to $nodes.page\r\n      // which closes the modal.\r\n      if (evt && evt.stopPropagation) {\r\n        evt.stopPropagation();\r\n        // save the source of the click, we'll focus to this on close\r\n        this.activeSource = evt.currentTarget.setAttribute('aria-expanded', 'true');\r\n      }\r\n  \r\n      if (this.modalIsOpen && !externalCall) {\r\n        this.close();\r\n      }\r\n  \r\n      this.modal.classList.add(this.config.openClass);\r\n  \r\n      document.documentElement.classList.add(...this.config.bodyOpenClass);\r\n  \r\n      if (this.isSolid) {\r\n        document.documentElement.classList.add(this.config.bodyOpenSolidClass);\r\n      }\r\n  \r\n      this.modalIsOpen = true;\r\n  \r\n      // Delay trap focus to ensure elements are seen by screen readers\r\n      setTimeout(() => {\r\n        theme.a11y.trapFocus({\r\n          container: this.modal,\r\n          elementToFocus: this.focusOnOpen,\r\n          namespace: 'modal_focus'\r\n        });\r\n      }, 100);\r\n  \r\n  \r\n      document.dispatchEvent(new CustomEvent('modalOpen'));\r\n      document.dispatchEvent(new CustomEvent('modalOpen.' + this.id));\r\n  \r\n      this.bindEvents();\r\n    };\r\n  \r\n    Modal.prototype.close = function(evt) {\r\n      // don't close a closed modal\r\n      if (!this.modalIsOpen) {\r\n        return;\r\n      }\r\n  \r\n      // Do not close modal if click happens inside modal content\r\n      if (evt) {\r\n        if (evt.target.closest('.js-modal-close')) {\r\n          // Do not close if using the modal close button\r\n        } else if (evt.target.closest('.modal__inner')) {\r\n          return;\r\n        }\r\n      }\r\n  \r\n      // deselect any focused form elements\r\n      document.activeElement.blur();\r\n  \r\n      this.modal.classList.remove(this.config.openClass);\r\n      this.modal.classList.add(this.config.closingClass);\r\n  \r\n      document.documentElement.classList.remove(...this.config.bodyOpenClass);\r\n      document.documentElement.classList.add(this.config.bodyClosingClass);\r\n  \r\n      window.setTimeout(function() {\r\n        document.documentElement.classList.remove(this.config.bodyClosingClass);\r\n        this.modal.classList.remove(this.config.closingClass);\r\n        if (this.activeSource && this.activeSource.getAttribute('aria-expanded')) {\r\n          this.activeSource.setAttribute('aria-expanded', 'false').focus();\r\n        }\r\n      }.bind(this), 500); // modal close css transition\r\n  \r\n      if (this.isSolid) {\r\n        document.documentElement.classList.remove(this.config.bodyOpenSolidClass);\r\n      }\r\n  \r\n      this.modalIsOpen = false;\r\n  \r\n      theme.a11y.removeTrapFocus({\r\n        container: this.modal,\r\n        namespace: 'modal_focus'\r\n      });\r\n  \r\n      document.dispatchEvent(new CustomEvent('modalClose.' + this.id));\r\n  \r\n      this.unbindEvents();\r\n    };\r\n  \r\n    Modal.prototype.bindEvents = function() {\r\n      window.on('keyup.modal', function(evt) {\r\n        if (evt.keyCode === 27) {\r\n          this.close();\r\n        }\r\n      }.bind(this));\r\n  \r\n      if (this.config.closeOffContentClick) {\r\n        // Clicking outside of the modal content also closes it\r\n        this.modal.on('click.modal', this.close.bind(this));\r\n      }\r\n    };\r\n  \r\n    Modal.prototype.unbindEvents = function() {\r\n      document.documentElement.off('.modal');\r\n  \r\n      if (this.config.closeOffContentClick) {\r\n        this.modal.off('.modal');\r\n      }\r\n    };\r\n  \r\n    return Modal;\r\n  })();\r\n  \r\n  /*============================================================================\r\n    ParallaxImage\r\n  ==============================================================================*/\r\n  \r\n  class ParallaxImage extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.parallaxImage = this.querySelector('[data-parallax-image]');\r\n      this.windowInnerHeight = window.innerHeight;\r\n      this.isActive = false;\r\n      this.timeout = null;\r\n      this.directionMap = {\r\n        right: 0,\r\n        top: 90,\r\n        left: 180,\r\n        bottom: 270\r\n      }\r\n      this.directionMultipliers = {\r\n        0: [  1,  0 ],\r\n        90: [  0, -1 ],\r\n        180: [ -1,  0 ],\r\n        270: [  0,  1 ]\r\n      }\r\n  \r\n      this.init();\r\n      window.addEventListener('scroll', () => this.scrollHandler());\r\n    }\r\n  \r\n    getParallaxInfo() {\r\n      const { width, height, top } = this.parallaxImage.getBoundingClientRect();\r\n      let element = this.parallaxImage;\r\n      let multipliers;\r\n      let { angle, movement } = element.dataset;\r\n  \r\n      let movementPixels = angle === 'top' ? Math.ceil(height * (parseFloat(movement) / 100)) : Math.ceil(width * (parseFloat(movement) / 100));\r\n  \r\n      // angle has shorthands \"top\", \"left\", \"bottom\" and \"right\"\r\n      // nullish coalescing. using `||` here would fail for `0`\r\n      angle = this.directionMap[angle] ?? parseFloat(angle);\r\n  \r\n      // fallback if undefined\r\n      // NaN is the only value that doesn't equal itself\r\n      if (angle !== angle) angle = 270; // move to bottom (default parallax effect)\r\n      if (movementPixels !== movementPixels) movementPixels = 100; // 100px\r\n  \r\n      // check if angle is located in top half and/or left half\r\n      angle %= 360;\r\n      if (angle < 0) angle += 360\r\n  \r\n      const toLeft = angle > 90 && angle < 270;\r\n      const toTop  = angle < 180;\r\n  \r\n      element.style[toLeft ? 'left' : 'right'] = 0;\r\n      element.style[toTop  ? 'top' : 'bottom'] = 0;\r\n  \r\n      // if it's not a perfectly horizontal or vertical movement, get cos and sin\r\n      if (angle % 90) {\r\n        const radians = angle * Math.PI / 180\r\n        multipliers = [ Math.cos(radians), Math.sin(radians) * -1 ] // only sin has to be inverted\r\n      } else {\r\n        multipliers = this.directionMultipliers[angle];\r\n      }\r\n  \r\n      // increase width and height according to movement and multipliers\r\n      if (multipliers[0]) element.style.width  = `calc(100% + ${movementPixels * Math.abs(multipliers[0])}px)`;\r\n      if (multipliers[1]) element.style.height = `calc(100% + ${movementPixels * Math.abs(multipliers[1])}px)`;\r\n  \r\n      return {\r\n        element,\r\n        movementPixels,\r\n        multipliers,\r\n        top,\r\n        height\r\n      }\r\n    }\r\n  \r\n    init() {\r\n      const { element, movementPixels, multipliers, top, height } = this.getParallaxInfo();;\r\n  \r\n      const scrolledInContainer = this.windowInnerHeight - top;\r\n      const scrollArea = this.windowInnerHeight + height;\r\n      const progress = scrolledInContainer / scrollArea;\r\n  \r\n      if (progress > -0.1 && progress < 1.1) {\r\n        const position = Math.min(Math.max(progress, 0), 1) * movementPixels;\r\n        element.style.transform = `translate3d(${position * multipliers[0]}px, ${position * multipliers[1]}px, 0)`;\r\n      }\r\n  \r\n      if (this.isActive) requestAnimationFrame(this.init.bind(this));\r\n    }\r\n  \r\n    scrollHandler() {\r\n      if (this.isActive) {\r\n        clearTimeout(this.timeout);\r\n      } else {\r\n        this.isActive = true;\r\n        requestAnimationFrame(this.init.bind(this));\r\n      }\r\n  \r\n      this.timeout = setTimeout(() => this.isActive = false, 20);\r\n    }\r\n  }\r\n  \r\n  customElements.define('parallax-image', ParallaxImage);\r\n  \r\n  if (typeof window.noUiSlider === 'undefined') {\r\n    throw new Error('theme.PriceRange is missing vendor noUiSlider: // =require vendor/nouislider.js');\r\n  }\r\n  \r\n  theme.PriceRange = (function () {\r\n    var defaultStep = 10;\r\n    var selectors = {\r\n      priceRange: '.price-range',\r\n      priceRangeSlider: '.price-range__slider',\r\n      priceRangeInputMin: '.price-range__input-min',\r\n      priceRangeInputMax: '.price-range__input-max',\r\n      priceRangeDisplayMin: '.price-range__display-min',\r\n      priceRangeDisplayMax: '.price-range__display-max',\r\n    };\r\n  \r\n    function PriceRange(container, {onChange, onUpdate, ...sliderOptions} = {}) {\r\n      this.container = container;\r\n      this.onChange = onChange;\r\n      this.onUpdate = onUpdate;\r\n      this.sliderOptions = sliderOptions || {};\r\n  \r\n      return this.init();\r\n    }\r\n  \r\n    PriceRange.prototype = Object.assign({}, PriceRange.prototype, {\r\n      init: function () {\r\n        if (!this.container.classList.contains('price-range')) {\r\n          throw new Error('You must instantiate PriceRange with a valid container')\r\n        }\r\n  \r\n        this.formEl = this.container.closest('form');\r\n        this.sliderEl = this.container.querySelector(selectors.priceRangeSlider);\r\n        this.inputMinEl = this.container.querySelector(selectors.priceRangeInputMin);\r\n        this.inputMaxEl = this.container.querySelector(selectors.priceRangeInputMax);\r\n        this.displayMinEl = this.container.querySelector(selectors.priceRangeDisplayMin);\r\n        this.displayMaxEl = this.container.querySelector(selectors.priceRangeDisplayMax);\r\n  \r\n        this.minRange = parseFloat(this.container.dataset.min) || 0;\r\n        this.minValue = parseFloat(this.container.dataset.minValue) || 0;\r\n        this.maxRange = parseFloat(this.container.dataset.max) || 100;\r\n        this.maxValue = parseFloat(this.container.dataset.maxValue) || this.maxRange;\r\n  \r\n        return this.createPriceRange();\r\n      },\r\n  \r\n      createPriceRange: function () {\r\n        if (this.sliderEl && this.sliderEl.noUiSlider && typeof this.sliderEl.noUiSlider.destroy === 'function') {\r\n          this.sliderEl.noUiSlider.destroy();\r\n        }\r\n  \r\n        var slider = noUiSlider.create(this.sliderEl, {\r\n          connect: true,\r\n          step: defaultStep,\r\n          ...this.sliderOptions,\r\n          // Do not allow overriding these options\r\n          start: [this.minValue, this.maxValue],\r\n          range: {\r\n            min: this.minRange,\r\n            max: this.maxRange,\r\n          },\r\n        });\r\n  \r\n        slider.on('update', values => {\r\n          this.displayMinEl.innerHTML = theme.Currency.formatMoney(\r\n            values[0],\r\n            theme.settings.moneyFormat,\r\n          );\r\n          this.displayMaxEl.innerHTML = theme.Currency.formatMoney(\r\n            values[1],\r\n            theme.settings.moneyFormat,\r\n          );\r\n  \r\n          if (this.onUpdate) {\r\n            this.onUpdate(values);\r\n          }\r\n        });\r\n  \r\n        slider.on('change', values => {\r\n          this.inputMinEl.value = values[0];\r\n          this.inputMaxEl.value = values[1];\r\n  \r\n          if (this.onChange) {\r\n            const formData = new FormData(this.formEl);\r\n            this.onChange(formData);\r\n          }\r\n        });\r\n  \r\n        return slider;\r\n      },\r\n    });\r\n  \r\n    return PriceRange;\r\n  })();\r\n  \r\n  theme.AjaxProduct = (function() {\r\n    var status = {\r\n      loading: false\r\n    };\r\n  \r\n    function ProductForm(form, submit, args) {\r\n      this.form = form;\r\n      this.args = args;\r\n  \r\n      var submitSelector = submit ? submit : '.add-to-cart';\r\n  \r\n      if (this.form) {\r\n        this.addToCart = form.querySelector(submitSelector);\r\n        this.form.addEventListener('submit', this.addItemFromForm.bind(this));\r\n      }\r\n    };\r\n  \r\n    ProductForm.prototype = Object.assign({}, ProductForm.prototype, {\r\n      addItemFromForm: function(evt, callback){\r\n        evt.preventDefault();\r\n  \r\n        if (status.loading) {\r\n          return;\r\n        }\r\n  \r\n        // Loading indicator on add to cart button\r\n        this.addToCart.classList.add('btn--loading');\r\n  \r\n        status.loading = true;\r\n  \r\n        var data = new FormData(this.form);\r\n  \r\n        fetch(theme.routes.cartAdd, {\r\n          method: 'POST',\r\n          body: data,\r\n          headers: {\r\n            'X-Requested-With': 'XMLHttpRequest'\r\n          }\r\n        })\r\n        .then(response => response.json())\r\n        .then(function(data) {\r\n          if (data.status === 422) {\r\n            this.error(data);\r\n            document.dispatchEvent(new CustomEvent('ajaxProduct:added'));\r\n          } else {\r\n            var product = data;\r\n            this.success(product);\r\n          }\r\n  \r\n          status.loading = false;\r\n          this.addToCart.classList.remove('btn--loading');\r\n  \r\n          // Reload page if adding product from a section on the cart page\r\n          if (document.body.classList.contains('template-cart')) {\r\n            window.scrollTo(0, 0);\r\n            location.reload();\r\n          }\r\n        }.bind(this));\r\n      },\r\n  \r\n      success: function(product) {\n        var errors = this.form.querySelector('.errors');\n        if (errors) {\n          errors.remove();\n        }\n  \n        if (window.CDMTracking) {\n          window.CDMTracking.addToCart({\n            source: 'ajax_product',\n            item: product\n          });\n        }\n\n        if (theme.settings.cartType === 'page') {\n          window.location = theme.routes.cartPage;\n        }\n  \r\n        this.form.dispatchEvent(new CustomEvent('ajaxProduct:added', {\r\n          detail: {\r\n            product: product,\r\n            addToCartBtn: this.addToCart\r\n          },\r\n          bubbles: true\r\n        }));\r\n  \r\n        if (this.args && this.args.scopedEventId) {\r\n          document.dispatchEvent(new CustomEvent('ajaxProduct:added:' + this.args.scopedEventId, {\r\n            detail: {\r\n              product: product,\r\n              addToCartBtn: this.addToCart\r\n            }\r\n          }));\r\n        }\r\n      },\r\n  \r\n      error: function(error) {\r\n        if (!error.description) {\r\n          console.warn(error);\r\n          return;\r\n        }\r\n  \r\n        var errors = this.form.querySelector('.errors');\r\n        if (errors) {\r\n          errors.remove();\r\n        }\r\n  \r\n        var errorDiv = document.createElement('div');\r\n        errorDiv.classList.add('errors', 'text-center');\r\n  \r\n        if (typeof error.description === 'object') {\r\n          errorDiv.textContent = error.message;\r\n        } else {\r\n          errorDiv.textContent = error.description;\r\n        }\r\n  \r\n        this.form.append(errorDiv);\r\n  \r\n        this.form.dispatchEvent(new CustomEvent('ajaxProduct:error', {\r\n          detail: {\r\n            errorMessage: error.description\r\n          },\r\n          bubbles: true\r\n        }));\r\n  \r\n        if (this.args && this.args.scopedEventId) {\r\n          document.dispatchEvent(new CustomEvent('ajaxProduct:error:' + this.args.scopedEventId, {\r\n            detail: {\r\n              errorMessage: error.description\r\n            }\r\n          }));\r\n        }\r\n      }\r\n    });\r\n  \r\n    return ProductForm;\r\n  })();\r\n  \r\n  theme.ProductMedia = (function() {\r\n    var modelJsonSections = {};\r\n    var models = {};\r\n    var xrButtons = {};\r\n  \r\n    var selectors = {\r\n      mediaGroup: '[data-product-single-media-group]',\r\n      xrButton: '[data-shopify-xr]'\r\n    };\r\n  \r\n    function init(modelViewerContainers, sectionId) {\r\n      modelJsonSections[sectionId] = {\r\n        loaded: false\r\n      };\r\n  \r\n      modelViewerContainers.forEach(function(container, index) {\r\n        var mediaId = container.dataset.mediaId;\r\n        var modelViewerElement = container.querySelector('model-viewer');\r\n        var modelId = modelViewerElement.dataset.modelId;\r\n  \r\n        if (index === 0) {\r\n          var mediaGroup = container.closest(selectors.mediaGroup);\r\n          var xrButton = mediaGroup.querySelector(selectors.xrButton);\r\n          xrButtons[sectionId] = {\r\n            element: xrButton,\r\n            defaultId: modelId\r\n          };\r\n        }\r\n  \r\n        models[mediaId] = {\r\n          modelId: modelId,\r\n          sectionId: sectionId,\r\n          container: container,\r\n          element: modelViewerElement\r\n        };\r\n  \r\n      });\r\n  \r\n      window.Shopify.loadFeatures([\r\n        {\r\n          name: 'shopify-xr',\r\n          version: '1.0',\r\n          onLoad: setupShopifyXr\r\n        },\r\n        {\r\n          name: 'model-viewer-ui',\r\n          version: '1.0',\r\n          onLoad: setupModelViewerUi\r\n        }\r\n      ]);\r\n  \r\n      theme.LibraryLoader.load('modelViewerUiStyles');\r\n    }\r\n  \r\n    function setupShopifyXr(errors) {\r\n      if (errors) return;\r\n  \r\n      if (!window.ShopifyXR) {\r\n        document.addEventListener('shopify_xr_initialized', function() {\r\n          setupShopifyXr();\r\n        });\r\n        return;\r\n      }\r\n  \r\n      for (var sectionId in modelJsonSections) {\r\n        if (modelJsonSections.hasOwnProperty(sectionId)) {\r\n          var modelSection = modelJsonSections[sectionId];\r\n  \r\n          if (modelSection.loaded) continue;\r\n  \r\n          var modelJson = document.querySelector('#ModelJson-' + sectionId);\r\n  \r\n          window.ShopifyXR.addModels(JSON.parse(modelJson.innerHTML));\r\n          modelSection.loaded = true;\r\n        }\r\n      }\r\n      window.ShopifyXR.setupXRElements();\r\n    }\r\n  \r\n    function setupModelViewerUi(errors) {\r\n      if (errors) return;\r\n  \r\n      for (var key in models) {\r\n        if (models.hasOwnProperty(key)) {\r\n          var model = models[key];\r\n          if (!model.modelViewerUi && Shopify) {\r\n            model.modelViewerUi = new Shopify.ModelViewerUI(model.element);\r\n          }\r\n          setupModelViewerListeners(model);\r\n        }\r\n      }\r\n    }\r\n  \r\n    function setupModelViewerListeners(model) {\r\n      var xrButton = xrButtons[model.sectionId];\r\n  \r\n      model.container.addEventListener('mediaVisible', function() {\r\n        xrButton.element.setAttribute('data-shopify-model3d-id', model.modelId);\r\n        if (theme.config.isTouch) return;\r\n        model.modelViewerUi.play();\r\n      });\r\n  \r\n      model.container.addEventListener('mediaHidden', function() {\r\n        xrButton.element.setAttribute('data-shopify-model3d-id', xrButton.defaultId);\r\n        model.modelViewerUi.pause();\r\n      });\r\n  \r\n      model.container.addEventListener('xrLaunch', function() {\r\n        model.modelViewerUi.pause();\r\n      });\r\n    }\r\n  \r\n    function removeSectionModels(sectionId) {\r\n      for (var key in models) {\r\n        if (models.hasOwnProperty(key)) {\r\n          var model = models[key];\r\n          if (model.sectionId === sectionId) {\r\n            delete models[key];\r\n          }\r\n        }\r\n      }\r\n      delete modelJsonSections[sectionId];\r\n    }\r\n  \r\n    return {\r\n      init: init,\r\n      removeSectionModels: removeSectionModels\r\n    };\r\n  })();\r\n  \r\n  theme.QtySelector = (function() {\r\n    var selectors = {\r\n      input: '.js-qty__num',\r\n      plus: '.js-qty__adjust--plus',\r\n      minus: '.js-qty__adjust--minus'\r\n    };\r\n  \r\n    function QtySelector(el, options) {\r\n      this.wrapper = el;\r\n      this.plus = el.querySelector(selectors.plus);\r\n      this.minus = el.querySelector(selectors.minus);\r\n      this.input = el.querySelector(selectors.input);\r\n      this.minValue = this.input.getAttribute('min') || 1;\r\n  \r\n      var defaults = {\r\n        namespace: null,\r\n        isCart: false,\r\n        key: this.input.dataset.id\r\n      };\r\n  \r\n      this.options = Object.assign({}, defaults, options);\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    QtySelector.prototype = Object.assign({}, QtySelector.prototype, {\r\n      init: function() {\r\n        this.plus.addEventListener('click', function() {\r\n          var qty = this._getQty();\r\n          this._change(qty + 1);\r\n        }.bind(this));\r\n  \r\n        this.minus.addEventListener('click', function() {\r\n          var qty = this._getQty();\r\n          this._change(qty - 1);\r\n        }.bind(this));\r\n  \r\n        this.input.addEventListener('change', function(evt) {\r\n          this._change(this._getQty());\r\n        }.bind(this));\r\n      },\r\n  \r\n      _getQty: function() {\r\n        var qty = this.input.value;\r\n        if((parseFloat(qty) == parseInt(qty)) && !isNaN(qty)) {\r\n          // We have a valid number!\r\n        } else {\r\n          // Not a number. Default to 1.\r\n          qty = 1;\r\n        }\r\n        return parseInt(qty);\r\n      },\r\n  \r\n      _change: function(qty) {\r\n        if (qty <= this.minValue) {\r\n          qty = this.minValue;\r\n        }\r\n  \r\n        this.input.value = qty;\r\n  \r\n        if (this.options.isCart) {\r\n          document.dispatchEvent(new CustomEvent('cart:quantity' + this.options.namespace, {\r\n              detail: [this.options.key, qty, this.wrapper]\r\n          }));\r\n        }\r\n      }\r\n    });\r\n  \r\n    return QtySelector;\r\n  })();\r\n  \r\n  theme.initQuickShop = function() {\r\n    var ids = [];\r\n    var products = document.querySelectorAll('.grid-product');\r\n  \r\n    if (!products.length || !theme.settings.quickView) {\r\n      return;\r\n    }\r\n  \r\n    products.forEach(product => {\r\n      product.addEventListener('mouseover', productMouseover);\r\n      product.addEventListener('focusin', productMouseover);\r\n    });\r\n  \r\n    function productMouseover(evt) {\r\n      var el = evt.currentTarget;\r\n      // No quick view on mobile breakpoint\r\n      if (!theme.config.bpSmall) {\r\n        el.removeEventListener('mouseover', productMouseover);\r\n        el.removeEventListener('focusin', productMouseover);\r\n        if (!el || !el.dataset.productId) {\r\n          // Onboarding product, no real data\r\n          return;\r\n        }\r\n        var productId = el.dataset.productId;\r\n        var handle = el.dataset.productHandle;\r\n        var btn = el.querySelector('.quick-product__btn');\r\n        theme.preloadProductModal(handle, productId, btn);\r\n      }\r\n    }\r\n  };\r\n  \r\n  theme.preloadProductModal = function(handle, productId, btn) {\r\n    var holder = document.getElementById('QuickShopHolder-' + handle);\r\n    var url = theme.routes.home + '/products/' + handle + '?view=modal';\r\n  \r\n    // remove double `/` in case shop might have /en or language in URL\r\n    url = url.replace('//', '/');\r\n  \r\n    fetch(url)\r\n    .then(response => response.text())\r\n    .then(text => {\r\n      const html = document.createElement('div');\r\n      html.innerHTML = text;\r\n      const div = html.querySelector('.product-section[data-product-handle=\"'+handle+'\"]');\r\n  \r\n      if (!holder) {\r\n        return;\r\n      }\r\n  \r\n      holder.innerHTML = '';\r\n      holder.append(div);\r\n  \r\n      // Setup quick view modal\r\n      var modalId = 'QuickShopModal-' + productId;\r\n      var name = 'quick-modal-' + productId;\r\n      new theme.Modals(modalId, name);\r\n  \r\n      // Register product template inside quick view\r\n      theme.sections.register('product', theme.Product, holder);\r\n  \r\n      // Register collapsible elements\r\n      theme.collapsibles.init();\r\n  \r\n      // Register potential video modal links (when video has sound)\r\n      theme.videoModal();\r\n    });\r\n  }\r\n  \r\n  // theme.Slideshow handles all flickity based sliders\r\n  // Child navigation is only setup to work on product images\r\n  theme.Slideshow = (function() {\r\n    var classes = {\r\n      animateOut: 'animate-out',\r\n      isPaused: 'is-paused',\r\n      isActive: 'is-active'\r\n    };\r\n  \r\n    var selectors = {\r\n      allSlides: '.slideshow__slide',\r\n      currentSlide: '.is-selected',\r\n      wrapper: '.slideshow-wrapper',\r\n      pauseButton: '.slideshow__pause'\r\n    };\r\n  \r\n    var productSelectors = {\r\n      thumb: '.product__thumb-item:not(.hide)',\r\n      links: '.product__thumb-item:not(.hide) a',\r\n      arrow: '.product__thumb-arrow'\r\n    };\r\n  \r\n    var defaults = {\r\n      adaptiveHeight: false,\r\n      autoPlay: false,\r\n      avoidReflow: false, // custom by Archetype\r\n      childNav: null, // element. Custom by Archetype instead of asNavFor\r\n      childNavScroller: null, // element\r\n      childVertical: false,\r\n      dragThreshold: 7,\r\n      fade: false,\r\n      friction: 0.8,\r\n      initialIndex: 0,\r\n      pageDots: false,\r\n      pauseAutoPlayOnHover: false,\r\n      prevNextButtons: false,\r\n      rightToLeft: theme.config.rtl,\r\n      selectedAttraction: 0.14,\r\n      setGallerySize: true,\r\n      wrapAround: true\r\n    };\r\n  \r\n    function slideshow(el, args) {\r\n      this.el = el;\r\n      this.args = Object.assign({}, defaults, args);\r\n  \r\n      // Setup listeners as part of arguments\r\n      this.args.on = {\r\n        ready: this.init.bind(this),\r\n        change: this.slideChange.bind(this),\r\n        settle: this.afterChange.bind(this)\r\n      };\r\n  \r\n      if (this.args.childNav) {\r\n        this.childNavEls = this.args.childNav.querySelectorAll(productSelectors.thumb);\r\n        this.childNavLinks = this.args.childNav.querySelectorAll(productSelectors.links);\r\n        this.arrows = this.args.childNav.querySelectorAll(productSelectors.arrow);\r\n        if (this.childNavLinks.length) {\r\n          this.initChildNav();\r\n        }\r\n      }\r\n  \r\n      if (this.args.avoidReflow) {\r\n        avoidReflow(el);\r\n      }\r\n  \r\n      this.slideshow = new Flickity(el, this.args);\r\n  \r\n      // Prevent dragging on the product slider from triggering a zoom on product images\r\n      if (el.dataset.zoom && el.dataset.zoom === 'true') {\r\n        this.slideshow.on('dragStart', () => {\r\n          this.slideshow.slider.style.pointerEvents = 'none';\r\n  \r\n          // With fade enabled, we also need to adjust the pointerEvents on the selected slide\r\n          if (this.slideshow.options.fade) {\r\n            this.slideshow.slider.querySelector('.is-selected').style.pointerEvents = 'none';\r\n          }\r\n        });\r\n        this.slideshow.on('dragEnd', () => {\r\n          this.slideshow.slider.style.pointerEvents = 'auto';\r\n  \r\n          // With fade enabled, we also need to adjust the pointerEvents on the selected slide\r\n          if (this.slideshow.options.fade) {\r\n            this.slideshow.slider.querySelector('.is-selected').style.pointerEvents = 'auto';\r\n          }\r\n        });\r\n      }\r\n  \r\n      if (this.args.autoPlay) {\r\n        var wrapper = el.closest(selectors.wrapper);\r\n        this.pauseBtn = wrapper.querySelector(selectors.pauseButton);\r\n        if (this.pauseBtn) {\r\n          this.pauseBtn.addEventListener('click', this._togglePause.bind(this));\r\n        }\r\n      }\r\n  \r\n      // Reset dimensions on resize\r\n      window.on('resize', theme.utils.debounce(300, function() {\r\n        this.resize();\r\n      }.bind(this)));\r\n  \r\n      // Set flickity-viewport height to first element to\r\n      // avoid awkward page reflows while initializing.\r\n      // Must be added in a `style` tag because element does not exist yet.\r\n      // Slideshow element must have an ID\r\n      function avoidReflow(el) {\r\n        if (!el.id) return;\r\n        var firstChild = el.firstChild;\r\n        while(firstChild != null && firstChild.nodeType == 3){ // skip TextNodes\r\n          firstChild = firstChild.nextSibling;\r\n        }\r\n        var style = document.createElement('style');\r\n        style.innerHTML = `#${el.id} .flickity-viewport{height:${firstChild.offsetHeight}px}`;\r\n        document.head.appendChild(style);\r\n      }\r\n    }\r\n  \r\n    slideshow.prototype = Object.assign({}, slideshow.prototype, {\r\n      init: function(el) {\r\n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\r\n  \r\n        // Optional onInit callback\r\n        if (this.args.callbacks && this.args.callbacks.onInit) {\r\n          if (typeof this.args.callbacks.onInit === 'function') {\r\n            this.args.callbacks.onInit(this.currentSlide);\r\n          }\r\n        }\r\n  \r\n        if (window.AOS) { AOS.refresh() }\r\n      },\r\n  \r\n      slideChange: function(index) {\r\n        // Outgoing fade styles\r\n        if (this.args.fade && this.currentSlide) {\r\n          this.currentSlide.classList.add(classes.animateOut);\r\n          this.currentSlide.addEventListener('transitionend', function() {\r\n            this.currentSlide.classList.remove(classes.animateOut);\r\n          }.bind(this));\r\n        }\r\n  \r\n        // Match index with child nav\r\n        if (this.args.childNav) {\r\n          this.childNavGoTo(index);\r\n        }\r\n  \r\n        // Optional onChange callback\r\n        if (this.args.callbacks && this.args.callbacks.onChange) {\r\n          if (typeof this.args.callbacks.onChange === 'function') {\r\n            this.args.callbacks.onChange(index);\r\n          }\r\n        }\r\n  \r\n        // Show/hide arrows depending on selected index\r\n        if (this.arrows && this.arrows.length) {\r\n          this.arrows[0].classList.toggle('hide', index === 0);\r\n          this.arrows[1].classList.toggle('hide', index === (this.childNavLinks.length - 1));\r\n        }\r\n      },\r\n      afterChange: function(index) {\r\n        // Remove all fade animation classes after slide is done\r\n        if (this.args.fade) {\r\n          this.el.querySelectorAll(selectors.allSlides).forEach(slide => {\r\n            slide.classList.remove(classes.animateOut);\r\n          });\r\n        }\r\n  \r\n        this.currentSlide = this.el.querySelector(selectors.currentSlide);\r\n  \r\n        // Match index with child nav (in case slider height changed first)\r\n        if (this.args.childNav) {\r\n          this.childNavGoTo(this.slideshow.selectedIndex);\r\n        }\r\n      },\r\n      destroy: function() {\r\n        if (this.args.childNav && this.childNavLinks.length) {\r\n          this.childNavLinks.forEach(a => {\r\n            a.classList.remove(classes.isActive);\r\n          });\r\n        }\r\n  \r\n        this.slideshow.destroy();\r\n      },\r\n      reposition: function() {\r\n        this.slideshow.reposition();\r\n      },\r\n      _togglePause: function() {\r\n        if (this.pauseBtn.classList.contains(classes.isPaused)) {\r\n          this.pauseBtn.classList.remove(classes.isPaused);\r\n          this.slideshow.playPlayer();\r\n        } else {\r\n          this.pauseBtn.classList.add(classes.isPaused);\r\n          this.slideshow.pausePlayer();\r\n        }\r\n      },\r\n      resize: function() {\r\n        this.slideshow.resize();\r\n      },\r\n      play: function() {\r\n        this.slideshow.playPlayer();\r\n      },\r\n      pause: function() {\r\n        this.slideshow.pausePlayer();\r\n      },\r\n      goToSlide: function(i) {\r\n        this.slideshow.select(i);\r\n      },\r\n      setDraggable: function(enable) {\r\n        this.slideshow.options.draggable = enable;\r\n        this.slideshow.updateDraggable();\r\n      },\r\n  \r\n      initChildNav: function() {\r\n        this.childNavLinks[this.args.initialIndex].classList.add('is-active');\r\n  \r\n        // Setup events\r\n        this.childNavLinks.forEach((link, i) => {\r\n          // update data-index because image-set feature may be enabled\r\n          link.setAttribute('data-index', i);\r\n  \r\n          link.addEventListener('click', function(evt) {\r\n            evt.preventDefault();\r\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\r\n          }.bind(this));\r\n          link.addEventListener('focus', function(evt) {\r\n            this.goToSlide(this.getChildIndex(evt.currentTarget))\r\n          }.bind(this));\r\n          link.addEventListener('keydown', function(evt) {\r\n            if (evt.keyCode === 13) {\r\n              this.goToSlide(this.getChildIndex(evt.currentTarget))\r\n            }\r\n          }.bind(this));\r\n        });\r\n  \r\n        // Setup optional arrows\r\n        if (this.arrows.length) {\r\n          this.arrows.forEach(arrow => {\r\n            arrow.addEventListener('click', this.arrowClick.bind(this));\r\n          });;\r\n        }\r\n      },\r\n  \r\n      getChildIndex: function(target) {\r\n        return parseInt(target.dataset.index);\r\n      },\r\n  \r\n      childNavGoTo: function(index) {\r\n        this.childNavLinks.forEach(a => {\r\n          a.blur();\r\n          a.classList.remove(classes.isActive);\r\n        });\r\n  \r\n        var el = this.childNavLinks[index];\r\n        el.classList.add(classes.isActive);\r\n  \r\n        if (!this.args.childNavScroller) {\r\n          return;\r\n        }\r\n  \r\n        if (this.args.childVertical) {\r\n          var elTop = el.offsetTop;\r\n          this.args.childNavScroller.scrollTop = elTop - 100;\r\n        } else {\r\n          var elLeft = el.offsetLeft;\r\n          this.args.childNavScroller.scrollLeft = elLeft - 100;\r\n        }\r\n      },\r\n  \r\n      arrowClick: function(evt) {\r\n        if (evt.currentTarget.classList.contains('product__thumb-arrow--prev')) {\r\n          this.slideshow.previous();\r\n        } else {\r\n          this.slideshow.next();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return slideshow;\r\n  })();\r\n  \r\n  /*============================================================================\r\n    VariantAvailability\r\n    - Cross out sold out or unavailable variants\r\n    - To disable, use the Variant Picker Block setting\r\n    - Required markup:\r\n      - class=variant-input-wrap to wrap select or button group\r\n      - class=variant-input to wrap button/label\r\n  ==============================================================================*/\r\n  \r\n  theme.VariantAvailability = (function() {\r\n    var classes = {\r\n      disabled: 'disabled'\r\n    };\r\n  \r\n    function availability(args) {\r\n      this.type = args.type;\r\n      this.variantsObject = args.variantsObject;\r\n      this.currentVariantObject = args.currentVariantObject;\r\n      this.container = args.container;\r\n      this.namespace = args.namespace;\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    availability.prototype = Object.assign({}, availability.prototype, {\r\n      init: function() {\r\n        this.container.on('variantChange' + this.namespace, this.setAvailability.bind(this));\r\n  \r\n        // Set default state based on current selected variant\r\n        this.setInitialAvailability();\r\n      },\r\n  \r\n      // Create a list of all options. If any variant exists and is in stock with that option, it's considered available\r\n      createAvailableOptionsTree(variants, currentlySelectedValues) {\r\n        // Reduce variant array into option availability tree\r\n        return variants.reduce((options, variant) => {\r\n  \r\n          // Check each option group (e.g. option1, option2, option3) of the variant\r\n          Object.keys(options).forEach(index => {\r\n  \r\n            if (variant[index] === null) return;\r\n  \r\n            let entry = options[index].find(option => option.value === variant[index]);\r\n  \r\n            if (typeof entry === 'undefined') {\r\n              // If option has yet to be added to the options tree, add it\r\n              entry = {value: variant[index], soldOut: true}\r\n              options[index].push(entry);\r\n            }\r\n  \r\n            const currentOption1 = currentlySelectedValues.find(({value, index}) => index === 'option1')\r\n            const currentOption2 = currentlySelectedValues.find(({value, index}) => index === 'option2')\r\n  \r\n            switch (index) {\r\n              case 'option1':\r\n                // Option1 inputs should always remain enabled based on all available variants\r\n                entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\r\n                break;\r\n              case 'option2':\r\n                // Option2 inputs should remain enabled based on available variants that match first option group\r\n                if (currentOption1 && variant['option1'] === currentOption1.value) {\r\n                  entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\r\n                }\r\n              case 'option3':\r\n                // Option 3 inputs should remain enabled based on available variants that match first and second option group\r\n                if (\r\n                  currentOption1 && variant['option1'] === currentOption1.value\r\n                  && currentOption2 && variant['option2'] === currentOption2.value\r\n                ) {\r\n                  entry.soldOut = entry.soldOut && variant.available ? false : entry.soldOut;\r\n                }\r\n            }\r\n          })\r\n  \r\n          return options;\r\n        }, { option1: [], option2: [], option3: []})\r\n      },\r\n  \r\n      setInitialAvailability: function() {\r\n        this.container.querySelectorAll('.variant-input-wrap').forEach(group => {\r\n          this.disableVariantGroup(group);\r\n        });\r\n  \r\n        const currentlySelectedValues = this.currentVariantObject.options.map((value,index) => {return {value, index: `option${index+1}`}})\r\n        const initialOptions = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, this.currentVariantObject);\r\n  \r\n        for (var [option, values] of Object.entries(initialOptions)) {\r\n          this.manageOptionState(option, values);\r\n        }\r\n      },\r\n  \r\n      setAvailability: function(evt) {\r\n  \r\n        const {value: lastSelectedValue, index: lastSelectedIndex, currentlySelectedValues, variant} = evt.detail;\r\n  \r\n        // Object to hold all options by value.\r\n        // This will be what sets a button/dropdown as\r\n        // sold out or unavailable (not a combo set as purchasable)\r\n        const valuesToManage = this.createAvailableOptionsTree(this.variantsObject, currentlySelectedValues, variant, lastSelectedIndex, lastSelectedValue)\r\n  \r\n        // Loop through all option levels and send each\r\n        // value w/ args to function that determines to show/hide/enable/disable\r\n        for (var [option, values] of Object.entries(valuesToManage)) {\r\n          this.manageOptionState(option, values, lastSelectedValue);\r\n        }\r\n      },\r\n  \r\n      manageOptionState: function(option, values) {\r\n        var group = this.container.querySelector('.variant-input-wrap[data-index=\"'+ option +'\"]');\r\n  \r\n        // Loop through each option value\r\n        values.forEach(obj => {\r\n          this.enableVariantOption(group, obj);\r\n        });\r\n      },\r\n  \r\n      enableVariantOption: function(group, obj) {\r\n        // Selecting by value so escape it\r\n        var value = obj.value.replace(/([ #;&,.+*~\\':\"!^$[\\]()=>|\\/@])/g,'\\\\$1');\r\n  \r\n        if (this.type === 'dropdown') {\r\n          if (obj.soldOut) {\r\n            group.querySelector('option[value=\"'+ value +'\"]').disabled = true;\r\n          } else {\r\n            group.querySelector('option[value=\"'+ value +'\"]').disabled = false;\r\n          }\r\n        } else {\r\n          var buttonGroup = group.querySelector('.variant-input[data-value=\"'+ value +'\"]');\r\n          var input = buttonGroup.querySelector('input');\r\n          var label = buttonGroup.querySelector('label');\r\n  \r\n          // Variant exists - enable & show variant\r\n          input.classList.remove(classes.disabled);\r\n          label.classList.remove(classes.disabled);\r\n  \r\n          // Variant sold out - cross out option (remains selectable)\r\n          if (obj.soldOut) {\r\n            input.classList.add(classes.disabled);\r\n            label.classList.add(classes.disabled);\r\n          }\r\n        }\r\n      },\r\n  \r\n      disableVariantGroup: function(group) {\r\n        if (this.type === 'dropdown') {\r\n          group.querySelectorAll('option').forEach(option => {\r\n            option.disabled = true;\r\n          });\r\n        } else {\r\n          group.querySelectorAll('input').forEach(input => {\r\n            input.classList.add(classes.disabled);\r\n          });\r\n          group.querySelectorAll('label').forEach(label => {\r\n            label.classList.add(classes.disabled);\r\n          });\r\n        }\r\n      }\r\n  \r\n    });\r\n  \r\n    return availability;\r\n  })();\r\n  \r\n  // Video modal will auto-initialize for any anchor link that points to YouTube\r\n  // MP4 videos must manually be enabled with:\r\n  //   - .product-video-trigger--mp4 (trigger button)\r\n  //   - .product-video-mp4-sound video player element (cloned into modal)\r\n  //     - see media.liquid for example of this\r\n  theme.videoModal = function() {\r\n    var youtubePlayer;\r\n    var vimeoPlayer;\r\n  \r\n    var videoHolderId = 'VideoHolder';\r\n    var selectors = {\r\n      youtube: 'a[href*=\"youtube.com/watch\"], a[href*=\"youtu.be/\"]',\r\n      vimeo: 'a[href*=\"player.vimeo.com/player/\"], a[href*=\"vimeo.com/\"]',\r\n      mp4Trigger: '.product-video-trigger--mp4',\r\n      mp4Player: '.product-video-mp4-sound'\r\n    };\r\n  \r\n    var youtubeTriggers = document.querySelectorAll(selectors.youtube);\r\n    var vimeoTriggers = document.querySelectorAll(selectors.vimeo);\r\n    var mp4Triggers = document.querySelectorAll(selectors.mp4Trigger);\r\n  \r\n    if (!youtubeTriggers.length && !vimeoTriggers.length && !mp4Triggers.length) {\r\n      return;\r\n    }\r\n  \r\n    var videoHolderDiv = document.getElementById(videoHolderId);\r\n  \r\n    if (youtubeTriggers.length) {\r\n      theme.LibraryLoader.load('youtubeSdk');\r\n    }\r\n  \r\n    if (vimeoTriggers.length) {\r\n      theme.LibraryLoader.load('vimeo', window.vimeoApiReady);\r\n    }\r\n  \r\n    var modal = new theme.Modals('VideoModal', 'video-modal', {\r\n      closeOffContentClick: true,\r\n      bodyOpenClass: ['modal-open', 'video-modal-open'],\r\n      solid: true\r\n    });\r\n  \r\n    youtubeTriggers.forEach(btn => {\r\n      btn.addEventListener('click', triggerYouTubeModal);\r\n    });\r\n  \r\n    vimeoTriggers.forEach(btn => {\r\n      btn.addEventListener('click', triggerVimeoModal);\r\n    });\r\n  \r\n    mp4Triggers.forEach(btn => {\r\n      btn.addEventListener('click', triggerMp4Modal);\r\n    });\r\n  \r\n    document.addEventListener('modalClose.VideoModal', closeVideoModal);\r\n  \r\n    function triggerYouTubeModal(evt) {\r\n      // If not already loaded, treat as normal link\r\n      if (!theme.config.youTubeReady) {\r\n        return;\r\n      }\r\n  \r\n      evt.preventDefault();\r\n      emptyVideoHolder();\r\n  \r\n      modal.open(evt);\r\n  \r\n      var videoId = getYoutubeVideoId(evt.currentTarget.getAttribute('href'));\r\n      youtubePlayer = new theme.YouTube(\r\n        videoHolderId,\r\n        {\r\n          videoId: videoId,\r\n          style: 'sound',\r\n          events: {\r\n            onReady: onYoutubeReady\r\n          }\r\n        }\r\n      );\r\n    }\r\n  \r\n    function triggerVimeoModal(evt) {\r\n      // If not already loaded, treat as normal link\r\n      if (!theme.config.vimeoReady) {\r\n        return;\r\n      }\r\n  \r\n      evt.preventDefault();\r\n      emptyVideoHolder();\r\n  \r\n      modal.open(evt);\r\n  \r\n      var videoId = evt.currentTarget.dataset.videoId;\r\n      var videoLoop = evt.currentTarget.dataset.videoLoop;\r\n      vimeoPlayer = new theme.VimeoPlayer(\r\n        videoHolderId,\r\n        videoId,\r\n        {\r\n          style: 'sound',\r\n          loop: videoLoop,\r\n        }\r\n      );\r\n    }\r\n  \r\n    function triggerMp4Modal(evt) {\r\n      emptyVideoHolder();\r\n  \r\n      var el = evt.currentTarget;\r\n      var player = el.parentNode.querySelector(selectors.mp4Player);\r\n  \r\n      // Clone video element and place it in the modal\r\n      var playerClone = player.cloneNode(true);\r\n      playerClone.classList.remove('hide');\r\n  \r\n      videoHolderDiv.append(playerClone);\r\n      modal.open(evt);\r\n  \r\n      // Play new video element\r\n      videoHolderDiv.querySelector('video').play();\r\n    }\r\n  \r\n    function onYoutubeReady(evt) {\r\n      evt.target.unMute();\r\n      evt.target.playVideo();\r\n    }\r\n  \r\n    function getYoutubeVideoId(url) {\r\n      var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\r\n      var match = url.match(regExp);\r\n      return (match&&match[7].length==11)? match[7] : false;\r\n    }\r\n  \r\n    function emptyVideoHolder() {\r\n      videoHolderDiv.innerHTML = '';\r\n    }\r\n  \r\n    function closeVideoModal() {\r\n      if (youtubePlayer && typeof youtubePlayer.destroy === 'function') {\r\n        youtubePlayer.destroy();\r\n      } else if (vimeoPlayer && typeof vimeoPlayer.destroy === 'function') {\r\n        vimeoPlayer.destroy();\r\n      } else {\r\n        emptyVideoHolder();\r\n      }\r\n    }\r\n  };\r\n  \r\n  \r\n  /*============================================================================\r\n    ToolTip\r\n  ==============================================================================*/\r\n  \r\n  class ToolTip extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.inner = this.querySelector('[data-tool-tip-inner]');\r\n      this.closeButton = this.querySelector('[data-tool-tip-close]');\r\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\r\n      this.toolTipTitle = this.querySelector('[data-tool-tip-title]');\r\n  \r\n      this.triggers = document.querySelectorAll('[data-tool-tip-trigger]');\r\n  \r\n      document.addEventListener('tooltip:open', e => {\r\n        this._open(e.detail.context, e.detail.content);\r\n      });\r\n    }\r\n  \r\n    _open(context, insertedHtml) {\r\n      this.toolTipContent.innerHTML = insertedHtml;\r\n  \r\n      // Ensure we set a title for product availability\r\n      if (context != 'store-availability') {\r\n        this.toolTipTitle.remove();\r\n      }\r\n  \r\n      this._lockScrolling();\r\n  \r\n      if (this.closeButton) {\r\n        this.closeButton.on('click' + '.tooltip-close', () => {\r\n          this._close();\r\n        });\r\n      }\r\n  \r\n      document.documentElement.on('click' + '.tooltip-outerclick', event => {\r\n        if (this.el.dataset.toolTipOpen === 'true' && !this.inner.contains(event.target)) this._close();\r\n      });\r\n  \r\n      document.documentElement.on('keydown' + '.tooltip-esc', event => {\r\n        if (event.code === 'Escape') this._close();\r\n      });\r\n  \r\n      this.el.dataset.toolTipOpen = true;\r\n      this.el.dataset.toolTip = context;\r\n    }\r\n  \r\n    _close() {\r\n      this.toolTipContent.innerHTML = '';\r\n      this.el.dataset.toolTipOpen = 'false';\r\n      this.el.dataset.toolTip = '';\r\n  \r\n      this._unlockScrolling();\r\n  \r\n      this.closeButton.off('click' + '.tooltip-close');\r\n      document.documentElement.off('click' + '.tooltip-outerclick');\r\n      document.documentElement.off('keydown' + '.tooltip-esc');\r\n    }\r\n  \r\n    _lockScrolling() {\r\n      theme.a11y.trapFocus({\r\n        container: this.el,\r\n        namespace: 'tooltip_focus'\r\n      });\r\n  \r\n      theme.a11y.lockMobileScrolling();\r\n      document.documentElement.classList.add('modal-open');\r\n    }\r\n  \r\n    _unlockScrolling() {\r\n      theme.a11y.removeTrapFocus({\r\n        container: this.el,\r\n        namespace: 'tooltip_focus'\r\n      });\r\n  \r\n      theme.a11y.unlockMobileScrolling();\r\n      document.documentElement.classList.remove('modal-open');\r\n    }\r\n  }\r\n  \r\n  customElements.define('tool-tip', ToolTip);\r\n  \r\n  /*============================================================================\r\n    ToolTipTrigger\r\n  ==============================================================================*/\r\n  \r\n  class ToolTipTrigger extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.toolTipContent = this.querySelector('[data-tool-tip-content]');\r\n      this.init();\r\n    }\r\n  \r\n    init() {\r\n      const toolTipOpen = new CustomEvent('tooltip:open', {\r\n        detail: {\r\n          context: this.dataset.toolTip,\r\n          content: this.toolTipContent.innerHTML\r\n        },\r\n        bubbles: true\r\n      });\r\n  \r\n      this.el.addEventListener('click', e => {\r\n        e.stopPropagation();\r\n        this.dispatchEvent(toolTipOpen);\r\n      });\r\n    }\r\n  }\r\n  \r\n  customElements.define('tool-tip-trigger', ToolTipTrigger);\r\n  \r\n  /*============================================================================\r\n    NewsletterReminder\r\n  ==============================================================================*/\r\n  \r\n  class NewsletterReminder extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.closeBtn = this.querySelector('[data-close-button]');\r\n      this.popupTrigger = this.querySelector('[data-message]');\r\n  \r\n      this.id = this.dataset.sectionId;\r\n      this.newsletterId = `NewsletterPopup-${ this.id }`;\r\n      this.cookie = Cookies.get(`newsletter-${this.id}`);\r\n      this.cookieName = `newsletter-${this.id}`;\r\n      this.secondsBeforeShow = this.dataset.delaySeconds;\r\n      this.expiry = parseInt(this.dataset.delayDays);\r\n      this.modal = new theme.Modals(`NewsletterPopup-${this.newsletterId}`, 'newsletter-popup-modal');\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    init() {\r\n      document.addEventListener('shopify:block:select', (evt) => {\r\n        if (evt.detail.sectionId === this.id) {\r\n          this.show(0, true)\r\n        }\r\n      });\r\n  \r\n      document.addEventListener('shopify:block:deselect', (evt) => {\r\n        if (evt.detail.sectionId === this.id) {\r\n          this.hide();\r\n        }\r\n      });\r\n  \r\n      document.addEventListener(`modalOpen.${this.newsletterId}`, () => this.hide());\r\n      document.addEventListener(`modalClose.${this.newsletterId}`, () => this.show());\r\n      document.addEventListener(`newsletter:openReminder`, () => this.show(0));\r\n  \r\n      this.closeBtn.addEventListener('click', () => {\r\n        this.hide();\r\n        Cookies.set(this.cookieName, 'opened', { path: '/', expires: this.expiry });\r\n      });\r\n  \r\n      this.popupTrigger.addEventListener('click', () => {\r\n        const reminderOpen = new CustomEvent('reminder:openNewsletter', { bubbles: true });\r\n        this.dispatchEvent(reminderOpen);\r\n  \r\n        this.hide();\r\n      });\r\n    }\r\n  \r\n    show(time = this.secondsBeforeShow, forceOpen = false) {\r\n      const reminderAppeared = (sessionStorage.getItem('reminderAppeared') === 'true');\r\n  \r\n      if (!reminderAppeared) {\r\n        setTimeout(() => {\r\n          this.dataset.enabled = 'true';\r\n          sessionStorage.setItem('reminderAppeared', true);\r\n        }, time * 1000);\r\n      }\r\n    }\r\n  \r\n    hide() {\r\n      this.dataset.enabled = 'false';\r\n    }\r\n  }\r\n  \r\n  customElements.define('newsletter-reminder', NewsletterReminder);\r\n  \r\n  /*============================================================================\r\n    ImageElement\r\n  ==============================================================================*/\r\n  \r\n  class ImageElement extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    init() {\r\n  \r\n      const handleIntersection = (entries, observer) => {\r\n        if (!entries[0].isIntersecting) return;\r\n  \r\n        this.removeAnimations();\r\n  \r\n        observer.unobserve(this);\r\n      }\r\n  \r\n      // Set an IntersectionObserver to check if the image is nearly in the viewport\r\n      new IntersectionObserver(handleIntersection.bind(this), {rootMargin: '0px 0px 400px 0px'}).observe(this);\r\n    }\r\n  \r\n    removeAnimations() {\r\n      // Find the closest image-wrap and remove the animation (fix for streamline image-wrap shimmer)\r\n      const imageWrap = this.closest('.image-wrap');\r\n      const skrimWrap = this.closest('.skrim__link');\r\n  \r\n      if (imageWrap) {\r\n        imageWrap.classList.add('loaded');\r\n      }\r\n  \r\n      if (skrimWrap) {\r\n        skrimWrap.classList.add('loaded');\r\n      }\r\n    }\r\n  }\r\n  \r\n  customElements.define('image-element', ImageElement);\r\n  \r\n  /*============================================================================\r\n    PredictiveSearch\r\n  ==============================================================================*/\r\n  \r\n  class PredictiveSearch extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.enabled = this.getAttribute('data-enabled');\r\n      this.context = this.getAttribute('data-context');\r\n      this.input = this.querySelector('input[type=\"search\"]');\r\n      this.predictiveSearchResults = this.querySelector('#predictive-search');\r\n      this.closeBtn = this.querySelector('.btn--close-search');\r\n      this.screen = this.querySelector('[data-screen]');\r\n      this.SearchModal = this.closest('#SearchModal') || null;\r\n  \r\n      // Open events\r\n      document.addEventListener('predictive-search:open', e => {\r\n        if (e.detail.context !== this.context) return;\r\n        this.classList.add('is-active');\r\n  \r\n        // Wait for opening events to finish then apply focus\r\n        setTimeout(() => { this.input.focus(); }, 100);\r\n  \r\n        document.body.classList.add('predictive-overflow-hidden');\r\n      });\r\n  \r\n      // listen for class change of 'modal--is-active on this.SearchModal\r\n      if (this.SearchModal) {\r\n        const observer = new MutationObserver((mutations) => {\r\n          mutations.forEach((mutation) => {\r\n            if (mutation.attributeName === 'class') {\r\n              const modalClass = mutation.target.className;\r\n              if (modalClass.indexOf('modal--is-active') > -1) {\r\n                setTimeout(() => { this.input.focus(); }, 100);\r\n              }\r\n            }\r\n          });\r\n        });\r\n  \r\n        observer.observe(this.SearchModal, {\r\n          attributes: true\r\n        });\r\n      }\r\n  \r\n      if (this.enabled === 'false') return;\r\n  \r\n      // On typing\r\n      this.input.addEventListener('keydown', () => { this.classList.add('is-active'); });\r\n  \r\n      this.input.addEventListener('input', this.debounce((event) => {\r\n        this.onChange(event);\r\n      }, 300).bind(this));\r\n  \r\n      // Close events\r\n      document.addEventListener('predictive-search:close', () => { this.close(); });\r\n      document.addEventListener('keydown', (event) => { if (event.keyCode === 27) this.close(); });\r\n      this.closeBtn.addEventListener('click', e => { e.preventDefault(); this.close(); });\r\n      this.screen.addEventListener('click', () => { this.close(); });\r\n    }\r\n  \r\n    onChange() {\r\n      const searchTerm = this.input.value.trim();\r\n  \r\n      if (!searchTerm.length) return;\r\n  \r\n      this.getSearchResults(searchTerm);\r\n    }\r\n  \r\n    getSearchResults(searchTerm) {\r\n      const searchObj = {\r\n        'q': searchTerm,\r\n        'resources[limit]': 3,\r\n        'resources[limit_scope]': 'each'\r\n      };\r\n  \r\n      const params = this.paramUrl(searchObj);\r\n  \r\n      fetch(`${theme.routes.predictiveSearch}?${params}&section_id=search-results`)\r\n        .then((response) => {\r\n          if (!response.ok) {\r\n            const error = new Error(response.status);\r\n            this.close();\r\n            throw error;\r\n          }\r\n  \r\n          return response.text();\r\n        })\r\n        .then((text) => {\r\n          const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-search-results').innerHTML;\r\n          this.predictiveSearchResults.innerHTML = resultsMarkup;\r\n          this.open();\r\n  \r\n          AOS.refreshHard();\r\n        })\r\n        .catch((error) => {\r\n          this.close();\r\n          throw error;\r\n        });\r\n    }\r\n  \r\n    open() {\r\n      this.predictiveSearchResults.style.display = 'block';\r\n    }\r\n  \r\n    close() {\r\n      this.predictiveSearchResults.style.display = 'none';\r\n      this.predictiveSearchResults.innerHTML = '';\r\n      this.classList.remove('is-active');\r\n      document.body.classList.remove('predictive-overflow-hidden');\r\n  \r\n      document.dispatchEvent(new CustomEvent('predictive-search:close-all'));\r\n    }\r\n  \r\n    debounce(fn, wait) {\r\n      let t;\r\n      return (...args) => {\r\n        clearTimeout(t);\r\n        t = setTimeout(() => fn.apply(this, args), wait);\r\n      };\r\n    }\r\n  \r\n    paramUrl(obj) {\r\n      return Object.keys(obj).map(function(key) {\r\n        return key + '=' + encodeURIComponent(obj[key]);\r\n      }).join('&')\r\n    }\r\n  }\r\n  \r\n  customElements.define('predictive-search', PredictiveSearch);\r\n  \r\n  class RecipientForm extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.checkboxInput = this.querySelector(`#Recipient-Checkbox-${ this.dataset.sectionId }`);\r\n      this.emailInput = this.querySelector(`#Recipient-email-${ this.dataset.sectionId }`);\r\n      this.nameInput = this.querySelector(`#Recipient-name-${ this.dataset.sectionId }`);\r\n      this.messageInput = this.querySelector(`#Recipient-message-${ this.dataset.sectionId }`);\r\n      this.dateInput = this.querySelector(`#Recipient-send-on-${ this.dataset.sectionId }`);\r\n      this.addEventListener('change', () => this.onChange());\r\n      this.recipientFields = this.querySelector('.recipient-fields');\r\n  \r\n      this.checkboxInput.addEventListener('change', () => {\r\n        this.recipientFields.style.display = this.checkboxInput.checked ? 'block' : 'none';\r\n      });\r\n    }\r\n  \r\n    connectedCallback() {\r\n      document.addEventListener('ajaxProduct:error', (event) => {\r\n        const productVariantID = event.target.querySelector('[name=\"id\"]').value;\r\n        if (productVariantID === this.dataset.productVariantId) {\r\n          this.displayErrorMessage(event.detail.errorMessage);\r\n        }\r\n      });\r\n  \r\n      document.addEventListener('ajaxProduct:added', (event) => {\r\n        const productVariantID = event.target.querySelector('[name=\"id\"]').value;\r\n        if (productVariantID === this.dataset.productVariantId) {\r\n          this.clearInputFields();\r\n          this.clearErrorMessage();\r\n        }\r\n      });\r\n    }\r\n  \r\n    onChange() {\r\n      if (!this.checkboxInput.checked) {\r\n        this.clearInputFields();\r\n        this.clearErrorMessage();\r\n      }\r\n    }\r\n  \r\n    clearInputFields() {\r\n      this.querySelectorAll('.field__input').forEach(el => el.value = '');\r\n    }\r\n  \r\n    displayErrorMessage(body) {\r\n      this.clearErrorMessage();\r\n      if (body) {\r\n        return Object.entries(body).forEach(([key, value]) => {\r\n          const inputElement = this[`${key}Input`];\r\n          if (!inputElement) return;\r\n  \r\n          inputElement.setAttribute('aria-invalid', true);\r\n          inputElement.classList.add('field__input--error');\r\n        });\r\n      }\r\n    }\r\n  \r\n    clearErrorMessage() {\r\n      this.querySelectorAll('.field__input').forEach(inputElement => {\r\n        inputElement.setAttribute('aria-invalid', false);\r\n        inputElement.removeAttribute('aria-describedby');\r\n        inputElement.classList.remove('field__input--error');\r\n      });\r\n    }\r\n  };\r\n  \r\n  customElements.define('recipient-form', RecipientForm);\r\n  \r\n\r\n  theme.announcementBar = (function() {\r\n    var args = {\r\n      autoPlay: 5000,\r\n      avoidReflow: true,\r\n      cellAlign: theme.config.rtl ? 'right' : 'left'\r\n    };\r\n    var bar;\r\n    var flickity;\r\n  \r\n    function init() {\r\n      bar = document.getElementById('AnnouncementSlider');\r\n      if (!bar) {\r\n        return;\r\n      }\r\n  \r\n      unload();\r\n  \r\n      if (bar.dataset.blockCount === 1) {\r\n        return;\r\n      }\r\n  \r\n      if (theme.config.bpSmall || bar.dataset.compact === 'true') {\r\n        initSlider();\r\n      }\r\n  \r\n      document.addEventListener('matchSmall', function() {\r\n        unload();\r\n        initSlider();\r\n      });\r\n  \r\n      document.addEventListener('unmatchSmall', function() {\r\n        unload();\r\n        if (bar.dataset.compact === 'true') {\r\n          initSlider();\r\n        }\r\n      });\r\n    }\r\n  \r\n    function initSlider() {\r\n      flickity = new theme.Slideshow(bar, args);\r\n    }\r\n  \r\n    // Go to slide if selected in the editor\r\n    function onBlockSelect(id) {\r\n      var slide = bar.querySelector('#AnnouncementSlide-' + id);\r\n      var index = parseInt(slide.dataset.index);\r\n  \r\n      if (flickity && typeof flickity.pause === 'function') {\r\n        flickity.goToSlide(index);\r\n        flickity.pause();\r\n      }\r\n    }\r\n  \r\n    function onBlockDeselect() {\r\n      if (flickity && typeof flickity.play === 'function') {\r\n        flickity.play();\r\n      }\r\n    }\r\n  \r\n    function unload() {\r\n      if (flickity && typeof flickity.destroy === 'function') {\r\n        flickity.destroy();\r\n      }\r\n    }\r\n  \r\n    return {\r\n      init: init,\r\n      onBlockSelect: onBlockSelect,\r\n      onBlockDeselect: onBlockDeselect,\r\n      unload: unload\r\n    };\r\n  })();\r\n  \r\n  theme.customerTemplates = function() {\r\n    checkUrlHash();\r\n    initEventListeners();\r\n    resetPasswordSuccess();\r\n    customerAddressForm();\r\n  \r\n    function checkUrlHash() {\r\n      var hash = window.location.hash;\r\n  \r\n      // Allow deep linking to recover password form\r\n      if (hash === '#recover') {\r\n        toggleRecoverPasswordForm();\r\n      }\r\n    }\r\n  \r\n    function toggleRecoverPasswordForm() {\r\n      var passwordForm = document.getElementById('RecoverPasswordForm').classList.toggle('hide');\r\n      var loginForm = document.getElementById('CustomerLoginForm').classList.toggle('hide');\r\n    }\r\n  \r\n    function initEventListeners() {\r\n      // Show reset password form\r\n      var recoverForm = document.getElementById('RecoverPassword');\r\n      if (recoverForm) {\r\n        recoverForm.addEventListener('click', function(evt) {\r\n          evt.preventDefault();\r\n          toggleRecoverPasswordForm();\r\n        });\r\n      }\r\n  \r\n      // Hide reset password form\r\n      var hideRecoverPassword = document.getElementById('HideRecoverPasswordLink');\r\n      if (hideRecoverPassword) {\r\n        hideRecoverPassword.addEventListener('click', function(evt) {\r\n          evt.preventDefault();\r\n          toggleRecoverPasswordForm();\r\n        });\r\n      }\r\n    }\r\n  \r\n    function resetPasswordSuccess() {\r\n      var formState = document.querySelector('.reset-password-success');\r\n  \r\n      // check if reset password form was successfully submitted\r\n      if (!formState) {\r\n        return;\r\n      }\r\n  \r\n      // show success message\r\n      document.getElementById('ResetSuccess').classList.remove('hide');\r\n    }\r\n  \r\n    function customerAddressForm() {\r\n      var newAddressForm = document.getElementById('AddressNewForm');\r\n      var addressForms = document.querySelectorAll('.js-address-form');\r\n  \r\n      if (!newAddressForm || !addressForms.length) {\r\n        return;\r\n      }\r\n  \r\n      // Country/province selector can take a short time to load\r\n      setTimeout(function() {\r\n        document.querySelectorAll('.js-address-country').forEach(el => {\r\n          var countryId = el.dataset.countryId;\r\n          var provinceId = el.dataset.provinceId;\r\n          var provinceContainerId = el.dataset.provinceContainerId;\r\n  \r\n          new Shopify.CountryProvinceSelector(\r\n            countryId,\r\n            provinceId,\r\n            {\r\n              hideElement: provinceContainerId\r\n            }\r\n          );\r\n        });\r\n      }, 1000);\r\n  \r\n      // Toggle new/edit address forms\r\n      document.querySelectorAll('.address-new-toggle').forEach(el => {\r\n        el.addEventListener('click', function() {\r\n          newAddressForm.classList.toggle('hide');\r\n        });\r\n      });\r\n  \r\n      document.querySelectorAll('.address-edit-toggle').forEach(el => {\r\n        el.addEventListener('click', function(evt) {\r\n          var formId = evt.currentTarget.dataset.formId;\r\n          document.getElementById('EditAddress_' + formId).classList.toggle('hide');\r\n        });\r\n      });\r\n  \r\n      document.querySelectorAll('.address-delete').forEach(el => {\r\n        el.addEventListener('click', function(evt) {\r\n          var formId = evt.currentTarget.dataset.formId;\r\n          var confirmMessage = evt.currentTarget.dataset.confirmMessage;\r\n  \r\n          if (confirm(confirmMessage || 'Are you sure you wish to delete this address?')) {\r\n            if (Shopify) {\r\n              Shopify.postLink('/account/addresses/' + formId, {parameters: {_method: 'delete'}});\r\n            }\r\n          }\r\n        })\r\n      });\r\n    }\r\n  };\r\n  \r\n  theme.CartDrawer = (function() {\r\n    var selectors = {\r\n      drawer: '#CartDrawer',\r\n      form: '#CartDrawerForm'\r\n    };\r\n  \r\n    function CartDrawer() {\r\n      this.form = document.querySelector(selectors.form);\r\n      this.drawer = new theme.Drawers('CartDrawer', 'cart');\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    CartDrawer.prototype = Object.assign({}, CartDrawer.prototype, {\r\n      init: function() {\r\n        this.cartForm = new theme.CartForm(this.form);\r\n        this.cartForm.buildCart();\r\n  \r\n        document.addEventListener('ajaxProduct:added', function(evt) {\r\n          this.cartForm.buildCart();\r\n          this.open();\r\n        }.bind(this));\r\n  \r\n        // Dev-friendly way to open cart\r\n        document.addEventListener('cart:open', this.open.bind(this));\r\n        document.addEventListener('cart:close', this.close.bind(this));\r\n      },\r\n  \r\n      open: function() {\r\n        this.drawer.open();\r\n  \r\n        theme.a11y.trapFocus({\r\n          container: this.form,\r\n          elementToFocus: this.form,\r\n          namespace: 'cartdrawer_focus'\r\n        });\r\n      },\r\n  \r\n      close: function() {\r\n        this.drawer.close();\r\n  \r\n        theme.a11y.removeTrapFocus({\r\n          container: this.form,\r\n          namespace: 'cartdrawer_focus'\r\n        });\r\n      }\r\n    });\r\n  \r\n    return CartDrawer;\r\n  })();\r\n  \r\n  theme.headerNav = (function() {\r\n    var selectors = {\r\n      wrapper: '#HeaderWrapper',\r\n      siteHeader: '#SiteHeader',\r\n      searchBtn: '.js-search-header',\r\n      closeSearch: '#SearchClose',\r\n      searchContainer: '.site-header__search-container',\r\n      logo: '#LogoContainer img',\r\n      megamenu: '.megamenu',\r\n      navItems: '.site-nav__item',\r\n      navLinks: '.site-nav__link',\r\n      navLinksWithDropdown: '.site-nav__link--has-dropdown',\r\n      navDropdownLinks: '.site-nav__dropdown-link--second-level',\r\n      navDetails: '.site-nav__details',\r\n    };\r\n  \r\n    var classes = {\r\n      hasDropdownClass: 'site-nav--has-dropdown',\r\n      hasSubDropdownClass: 'site-nav__deep-dropdown-trigger',\r\n      dropdownActive: 'is-focused'\r\n    };\r\n  \r\n    var config = {\r\n      namespace: '.siteNav',\r\n      wrapperOverlayed: false,\r\n      overlayedClass: 'is-light',\r\n      overlayEnabledClass: 'header-wrapper--sticky',\r\n      stickyEnabled: false,\r\n      stickyActive: false,\r\n      stickyClass: 'site-header--stuck',\r\n      stickyHeaderWrapper: 'StickyHeaderWrap',\r\n      openTransitionClass: 'site-header--opening',\r\n      lastScroll: 0\r\n    };\r\n  \r\n    // Elements used in resize functions, defined in init\r\n    var wrapper;\r\n    var siteHeader;\r\n  \r\n    function init() {\r\n      wrapper = document.querySelector(selectors.wrapper);\r\n      siteHeader = document.querySelector(selectors.siteHeader);\r\n  \r\n      config.stickyEnabled = (siteHeader.dataset.sticky === 'true');\r\n      if (config.stickyEnabled) {\r\n        config.wrapperOverlayed = wrapper.classList.contains(config.overlayedClass);\r\n        stickyHeaderCheck();\r\n      }\r\n  \r\n      theme.settings.overlayHeader = (siteHeader.dataset.overlay === 'true');\r\n      // Disable overlay header if on collection template with no collection image\r\n      if (theme.settings.overlayHeader && Shopify && Shopify.designMode) {\r\n        if (document.body.classList.contains('template-collection') && !document.querySelector('.collection-hero')) {\r\n          this.disableOverlayHeader();\r\n        }\r\n      }\r\n  \r\n      menuDetailsHandler();\r\n      searchDrawer();\r\n    }\r\n  \r\n    function menuDetailsHandler() {\r\n      const navDetails = document.querySelectorAll(selectors.navDetails);\r\n  \r\n      navDetails.forEach((navDetail) => {\r\n        const summary = navDetail.querySelector('summary');\r\n  \r\n        // if the navDetail is open, then close it when the user clicks outside of it\r\n        document.addEventListener('click', (evt) => {\r\n          if (navDetail.hasAttribute('open') && !navDetail.contains(evt.target)) {\r\n            navDetail.removeAttribute('open');\r\n            summary.setAttribute('aria-expanded', 'false');\r\n          } else {\r\n            if (navDetail.hasAttribute('open')) {\r\n              summary.setAttribute('aria-expanded', 'false');\r\n            } else {\r\n              summary.setAttribute('aria-expanded', 'true');\r\n            }\r\n          }\r\n        });\r\n      });\r\n    }\r\n  \r\n    // If the header setting to overlay the menu on the collection image\r\n    // is enabled but the collection setting is disabled, we need to undo\r\n    // the init of the sticky nav\r\n    function disableOverlayHeader() {\r\n      wrapper.classList.remove(config.overlayEnabledClass, config.overlayedClass);\r\n      config.wrapperOverlayed = false;\r\n      theme.settings.overlayHeader = false;\r\n    }\r\n  \r\n    function stickyHeaderCheck() {\r\n      // Disable sticky header if any mega menu is taller than window\r\n      theme.config.stickyHeader = doesMegaMenuFit();\r\n  \r\n      if (theme.config.stickyHeader) {\r\n        config.forceStopSticky = false;\r\n        stickyHeader();\r\n      } else {\r\n        config.forceStopSticky = true;\r\n      }\r\n    }\r\n  \r\n    function doesMegaMenuFit() {\r\n      var largestMegaNav = 0;\r\n      siteHeader.querySelectorAll(selectors.megamenu).forEach(nav => {\r\n        var h = nav.offsetHeight;\r\n        if (h > largestMegaNav) {\r\n          largestMegaNav = h;\r\n        }\r\n      });\r\n  \r\n      // 120 ~ space of visible header when megamenu open\r\n      if (window.innerHeight < (largestMegaNav + 120)) {\r\n        return false;\r\n      }\r\n  \r\n      return true;\r\n    }\r\n  \r\n    function stickyHeader() {\r\n      config.lastScroll = 0;\r\n  \r\n      var wrapWith = document.createElement('div');\r\n      wrapWith.id = config.stickyHeaderWrapper;\r\n      theme.utils.wrap(siteHeader, wrapWith);\r\n  \r\n      stickyHeaderInitialPosition(siteHeader);\r\n      stickyHeaderHeight();\r\n  \r\n      window.on('resize' + config.namespace, theme.utils.debounce(50, stickyHeaderHeight));\r\n      window.on('scroll' + config.namespace, theme.utils.throttle(20, stickyHeaderScroll));\r\n  \r\n      // This gets messed up in the editor, so here's a fix\r\n      if (Shopify && Shopify.designMode) {\r\n        setTimeout(function() {\r\n          stickyHeaderHeight();\r\n        }, 250);\r\n      }\r\n    }\r\n  \r\n    function stickyHeaderInitialPosition(header) {\r\n      const headerParent = header.closest('.shopify-section-group-header-group');\r\n      const parentNextSibling = headerParent.nextElementSibling;\r\n  \r\n      // if parentNextSibling has same class as headerParent, then header is above announcement bar\r\n      if (parentNextSibling && parentNextSibling.classList.contains('shopify-section-group-header-group')) {\r\n        // get height of announcement bar and set header wrapper top to that value\r\n        const nextSiblingHeight = parentNextSibling.offsetHeight;\r\n        document.querySelector(selectors.wrapper).style.top = nextSiblingHeight + 'px';\r\n      }\r\n    }\r\n  \r\n    function stickyHeaderHeight() {\r\n      if (!config.stickyEnabled) {\r\n        return;\r\n      }\r\n  \r\n      var h = siteHeader.offsetHeight;\r\n  \r\n      // If sticky header is 'active' i.e. we have scrolled a bit down the page\r\n      // the site header has 20px less padding when sticky\r\n      // and this is not factored into the height calculation\r\n      // The 20px is what causes the header to overlap the announcement bar\r\n      // This only applies when the height is being calculated on larger screen sizes\r\n      if (siteHeader.classList.contains('site-header--stuck') && !theme.config.bpSmall) {\r\n        let siteHeaderPadding = parseFloat(window.getComputedStyle(siteHeader, null).getPropertyValue('padding-top'));\r\n        h += siteHeaderPadding * 2;\r\n      }\r\n  \r\n      var stickyHeader = document.querySelector('#' + config.stickyHeaderWrapper);\r\n      stickyHeader.style.height = h + 'px';\r\n    }\r\n  \r\n    function stickyHeaderScroll() {\r\n      if (!config.stickyEnabled) {\r\n        return;\r\n      }\r\n  \r\n      if (config.forceStopSticky) {\r\n        return;\r\n      }\r\n  \r\n      requestAnimationFrame(scrollHandler);\r\n  \r\n      config.lastScroll = window.scrollY;\r\n    }\r\n  \r\n    function scrollHandler() {\r\n      if (window.scrollY > 250) {\r\n        if (config.stickyActive) {\r\n          return;\r\n        }\r\n  \r\n        config.stickyActive = true;\r\n  \r\n        siteHeader.classList.add(config.stickyClass);\r\n        if (config.wrapperOverlayed) {\r\n          wrapper.classList.remove(config.overlayedClass);\r\n        }\r\n  \r\n        // Add open transition class after element is set to fixed\r\n        // so CSS animation is applied correctly\r\n        setTimeout(function() {\r\n          siteHeader.classList.add(config.openTransitionClass);\r\n        }, 100);\r\n      } else {\r\n        if (!config.stickyActive) {\r\n          return;\r\n        }\r\n  \r\n        config.stickyActive = false;\r\n  \r\n        siteHeader.classList.remove(config.openTransitionClass);\r\n        siteHeader.classList.remove(config.stickyClass);\r\n        if (config.wrapperOverlayed) {\r\n          wrapper.classList.add(config.overlayedClass);\r\n        }\r\n      }\r\n    }\r\n  \r\n    function searchDrawer() {\r\n      document.querySelectorAll(selectors.searchBtn).forEach(btn => {\r\n        btn.addEventListener('click', function(evt) {\r\n          evt.preventDefault();\r\n          evt.stopPropagation();\r\n          document.dispatchEvent(new CustomEvent('predictive-search:open', {\r\n            detail: {\r\n              context: 'header'\r\n            },\r\n            bubbles: true\r\n          }));\r\n  \r\n          // add is-active class to .site-header__search-container\r\n          document.querySelector(selectors.searchContainer).classList.add('is-active');\r\n        });\r\n      });\r\n  \r\n      document.addEventListener('predictive-search:close-all', function() {\r\n        closeSearchDrawer();\r\n      });\r\n    }\r\n  \r\n    function closeSearchDrawer(evt) {\r\n      // Do not close if click event came from inside drawer\r\n      if (evt) {\r\n        // evt.path is non-standard, so have fallback\r\n        var path = evt.path || (evt.composedPath && evt.composedPath());\r\n        for (var i = 0; i < path.length; i++) {\r\n          if (path[i].classList) {\r\n            if (path[i].classList.contains('site-header__search-btn')) {\r\n              break;\r\n            }\r\n  \r\n            if (path[i].classList.contains('site-header__search-container')) {\r\n              return;\r\n            }\r\n          }\r\n        }\r\n      }\r\n  \r\n     \r\n      // deselect any focused form elements\r\n      document.activeElement.blur();\r\n  \r\n      document.documentElement.classList.add('js-drawer-closing');\r\n      document.documentElement.classList.remove('js-drawer-open', 'js-drawer-open--search');\r\n  \r\n      window.setTimeout(function() {\r\n        document.documentElement.classList.remove('js-drawer-closing');\r\n      }.bind(this), 500);\r\n  \r\n      var container = document.querySelector(selectors.searchContainer);\r\n      theme.utils.prepareTransition(container, function() {\r\n        container.classList.remove('is-active');\r\n      }.bind(this));\r\n    }\r\n  \r\n    return {\r\n      init: init,\r\n      disableOverlayHeader: disableOverlayHeader\r\n    };\r\n  })();\r\n  \r\n  window.onpageshow = function(evt) {\r\n    // Removes unload class when returning to page via history\r\n    if (evt.persisted) {\r\n      document.body.classList.remove('unloading');\r\n      document.querySelectorAll('.cart__checkout').forEach(el => {\r\n        el.classList.remove('btn--loading');\r\n      });\r\n    }\r\n  };\r\n  \r\n  theme.buildProductGridItem = function(items, gridWidth, rowOf, imageSizes) {\r\n    var output = '';\r\n  \r\n    items.forEach(product => {\r\n      var image = theme.buildProductImage(product, imageSizes);\r\n  \r\n      let priceMarkup = '';\r\n      let vendorMarkup = '';\r\n  \r\n      if (theme.settings.predictiveSearchPrice) priceMarkup = `<div class=\"grid-product__price\">${theme.strings.productFrom}${theme.Currency.formatMoney(product.price_min, theme.moneyFormat)}</div>`;\r\n      if (theme.settings.predictiveSearchVendor) vendorMarkup = `<div class=\"grid-product__vendor\">${product.vendor}</div>`;\r\n  \r\n      var markup = `\r\n        <div class=\"grid__item grid-product ${gridWidth} aos-animate\" data-aos=\"row-of-${rowOf}\">\r\n          <div class=\"grid-product__content\">\r\n            <a href=\"${product.url}\" class=\"grid-product__link\">\r\n              <div class=\"grid-product__image-mask\">\r\n                ${image}\r\n              </div>\r\n              <div class=\"grid-product__meta\">\r\n                <div class=\"grid-product__title\">${product.title}</div>\r\n                ${priceMarkup}\r\n                ${vendorMarkup}\r\n              </div>\r\n            </a>\r\n          </div>\r\n        </div>\r\n      `;\r\n  \r\n      output += markup;\r\n    });\r\n  \r\n    return output;\r\n  }\r\n  \r\n  theme.buildProductImage = function(product, imageSizes) {\r\n    var size = theme.settings.productImageSize;\r\n    var output = '';\r\n  \r\n    if (size === 'natural') {\r\n      const template = document.getElementById(\"naturalImageMarkup\");\r\n      const clonedMarkup = template.content.cloneNode(true);\r\n      const imageEl = clonedMarkup.querySelector('img');\r\n      const imageWrapperEl = clonedMarkup.querySelector('.image-wrap');\r\n  \r\n      imageWrapperEl.style.paddingBottom = `${product.image_aspect_ratio}%`;\r\n  \r\n      addImageProperties(imageEl, imageSizes);\r\n  \r\n      const imageDiv = document.createElement('div');\r\n      imageDiv.appendChild(clonedMarkup);\r\n  \r\n      output = imageDiv.innerHTML;\r\n    } else {\r\n      const template = document.getElementById(\"fixedRatioImageMarkup\");\r\n      const clonedMarkup = template.content.cloneNode(true);\r\n      const imageEl = clonedMarkup.querySelector('img');\r\n      const imageWrapperEl = clonedMarkup.querySelector('.grid__image-ratio');\r\n  \r\n      imageWrapperEl.classList.add(`grid__image-ratio--${size}`);\r\n  \r\n      if (!theme.settings.productImageCover) {\r\n        imageEl.classList.add('grid__image-contain');\r\n      }\r\n  \r\n      addImageProperties(imageEl, imageSizes);\r\n  \r\n      const imageDiv = document.createElement('div');\r\n      imageDiv.appendChild(clonedMarkup);\r\n  \r\n      output = imageDiv.innerHTML;\r\n    }\r\n  \r\n    function addImageProperties(imageEl, imageSizes) {\r\n      imageEl.src = product.image_responsive_url;\r\n      imageEl.srcset = product.image_responsive_urls.toString();\r\n      imageEl.alt = product.title;\r\n      imageEl.sizes = imageSizes;\r\n    }\r\n  \r\n    return output;\r\n  }\r\n  \r\n\r\n  /*============================================================================\r\n    Age Verification Popup\r\n  ==============================================================================*/\r\n  \r\n  class AgeVerificationPopup extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n  \r\n      this.cookieName = this.id;\r\n      this.cookie = Cookies.get(this.cookieName);\r\n  \r\n      this.classes = {\r\n        activeContent: 'age-verification-popup__content--active',\r\n        inactiveContent: 'age-verification-popup__content--inactive',\r\n        inactiveDeclineContent: 'age-verification-popup__decline-content--inactive',\r\n        activeDeclineContent: 'age-verification-popup__decline-content--active',\r\n      }\r\n  \r\n      this.declineButton = this.querySelector('[data-age-verification-popup-decline-button]');\r\n      this.declineContent = this.querySelector('[data-age-verification-popup-decline-content]');\r\n      this.content = this.querySelector('[data-age-verification-popup-content]');\r\n      this.returnButton = this.querySelector('[data-age-verification-popup-return-button]');\r\n      this.exitButton = this.querySelector('[data-age-verification-popup-exit-button]');\r\n      this.backgroundImage = this.querySelector('[data-background-image]');\r\n      this.mobileBackgroundImage = this.querySelector('[data-mobile-background-image]');\r\n  \r\n      if (Shopify.designMode) {\r\n        document.addEventListener('shopify:section:select', (event) => {\r\n          if (event.detail.sectionId === this.dataset.sectionId) {\r\n            this.init();\r\n          }\r\n        })\r\n  \r\n        document.addEventListener('shopify:section:load', (event) => {\r\n          if (event.detail.sectionId === this.dataset.sectionId) {\r\n            this.init();\r\n  \r\n            // If 'Test mode' is enabled, remove the cookie we've set\r\n            if (this.dataset.testMode === 'true' && this.cookie) {\r\n              Cookies.remove(this.cookieName);\r\n            }\r\n  \r\n            // Check session storage if user was editing on the second view\r\n            const secondViewVisited = sessionStorage.getItem(this.id);\r\n  \r\n            if (!secondViewVisited) return;\r\n  \r\n            this.showDeclineContent();\r\n          }\r\n        })\r\n  \r\n        document.addEventListener('shopify:section:unload', (event) => {\r\n          if (event.detail.sectionId === this.dataset.sectionId) {\r\n            this.modal.close();\r\n          }\r\n        })\r\n      }\r\n  \r\n      // Age verification popup will only be hidden if test mode is disabled AND\r\n      // either a cookie exists OR visibility is toggled in the editor\r\n      if ((this.cookie) && this.dataset.testMode === 'false') return;\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    init() {\r\n      this.modal = new theme.Modals(this.id, 'age-verification-popup-modal', {\r\n        closeOffContentClick: false\r\n      });\r\n  \r\n      if (this.backgroundImage) {\r\n        this.backgroundImage.style.display = 'block';\r\n      }\r\n  \r\n      if (theme.config.bpSmall && this.mobileBackgroundImage) {\r\n        this.mobileBackgroundImage.style.display = 'block';\r\n      }\r\n  \r\n      this.modal.open();\r\n  \r\n      theme.a11y.lockMobileScrolling(`#${this.id}`, document.querySelector('#MainContent'));\r\n  \r\n      if (this.declineButton) {\r\n        this.declineButton.addEventListener('click', (e) => {\r\n          e.preventDefault();\r\n          this.showDeclineContent();\r\n  \r\n          // If in editor, save to session storage to indicate that user has moved on to the second view\r\n          // Allows view to persist while making changes in the editor\r\n          if (Shopify.designMode) {\r\n            sessionStorage.setItem(this.id, 'second-view');\r\n          }\r\n        });\r\n      }\r\n  \r\n      if (this.returnButton) {\r\n        this.returnButton.addEventListener('click', (e) => {\r\n          e.preventDefault();\r\n          this.hideDeclineContent();\r\n  \r\n          // Remove data from session storage so second view doesn't persist\r\n          const secondViewVisited = sessionStorage.getItem(this.id);\r\n  \r\n          if (Shopify.designMode && secondViewVisited) {\r\n            sessionStorage.removeItem(this.id);\r\n          }\r\n        })\r\n      }\r\n  \r\n      if (this.exitButton) {\r\n        this.exitButton.addEventListener('click', (e) => {\r\n          e.preventDefault();\r\n  \r\n          // We don't want to set a cookie if in test mode\r\n          if (this.dataset.testMode === 'false') {\r\n            Cookies.set(this.cookieName, 'entered', { expires: 30, sameSite: 'none', secure: true });\r\n          }\r\n  \r\n          if (this.backgroundImage) {\r\n            this.backgroundImage.style.display = 'none';\r\n          }\r\n  \r\n          if (theme.config.bpSmall && this.mobileBackgroundImage) {\r\n            this.mobileBackgroundImage.style.display = 'none';\r\n          }\r\n  \r\n          this.modal.close();\r\n  \r\n          theme.a11y.unlockMobileScrolling(`#${this.id}`, document.querySelector('#MainContent'));\r\n        })\r\n      }\r\n    }\r\n  \r\n    showDeclineContent() {\r\n      this.declineContent.classList.remove(this.classes.inactiveDeclineContent);\r\n      this.declineContent.classList.add(this.classes.activeDeclineContent);\r\n  \r\n      this.content.classList.add(this.classes.inactiveContent);\r\n      this.content.classList.remove(this.classes.activeContent);\r\n    }\r\n  \r\n    hideDeclineContent() {\r\n      this.declineContent.classList.add(this.classes.inactiveDeclineContent);\r\n      this.declineContent.classList.remove(this.classes.activeDeclineContent);\r\n  \r\n      this.content.classList.remove(this.classes.inactiveContent);\r\n      this.content.classList.add(this.classes.activeContent);\r\n    }\r\n  }\r\n  \r\n  customElements.define('age-verification-popup', AgeVerificationPopup);\r\n  \r\n  \r\n  \r\n  theme.Maps = (function() {\r\n    var config = {\r\n      zoom: 14\r\n    };\r\n    var apiStatus = null;\r\n    var mapsToLoad = [];\r\n  \r\n    var errors = {};\r\n  \r\n    var selectors = {\r\n      section: '[data-section-type=\"map\"]',\r\n      map: '[data-map]',\r\n      mapOverlay: '.map-section__overlay'\r\n    };\r\n  \r\n    // Global function called by Google on auth errors.\r\n    // Show an auto error message on all map instances.\r\n    window.gm_authFailure = function() {\r\n      if (!Shopify.designMode) {\r\n        return;\r\n      }\r\n  \r\n      document.querySelectorAll(selectors.section).forEach(section => {\r\n        section.classList.add('map-section--load-error');\r\n      });\r\n  \r\n      document.querySelectorAll(selectors.map).forEach(map => {\r\n        map.parentNode.removeChild(map);\r\n      });\r\n  \r\n      window.mapError(theme.strings.authError);\r\n    };\r\n  \r\n    window.mapError = function(error) {\r\n      var message = document.createElement('div');\r\n      message.classList.add('map-section__error', 'errors', 'text-center');\r\n      message.innerHTML = error;\r\n      document.querySelectorAll(selectors.mapOverlay).forEach(overlay => {\r\n        overlay.parentNode.prepend(message);\r\n      });\r\n      document.querySelectorAll('.map-section__link').forEach(link => {\r\n        link.classList.add('hide');\r\n      });\r\n    };\r\n  \r\n    function Map(container) {\r\n      this.container = container;\r\n      this.sectionId = this.container.getAttribute('data-section-id');\r\n      this.namespace = '.map-' + this.sectionId;\r\n      this.map = container.querySelector(selectors.map);\r\n      this.key = this.map.dataset.apiKey;\r\n  \r\n      errors = {\r\n        addressNoResults: theme.strings.addressNoResults,\r\n        addressQueryLimit: theme.strings.addressQueryLimit,\r\n        addressError: theme.strings.addressError,\r\n        authError: theme.strings.authError\r\n      };\r\n  \r\n      if (!this.key) {\r\n        return;\r\n      }\r\n  \r\n      theme.initWhenVisible({\r\n        element: this.container,\r\n        callback: this.prepMapApi.bind(this),\r\n        threshold: 20\r\n      });\r\n    }\r\n  \r\n    // API has loaded, load all Map instances in queue\r\n    function initAllMaps() {\r\n      mapsToLoad.forEach(instance => {\r\n        instance.createMap();\r\n      });\r\n    }\r\n  \r\n    function geolocate(map) {\r\n      var geocoder = new google.maps.Geocoder();\r\n  \r\n      if (!map) {\r\n        return;\r\n      }\r\n  \r\n      var address = map.dataset.addressSetting;\r\n  \r\n      var deferred = new Promise((resolve, reject) => {\r\n        geocoder.geocode({ address: address }, function(results, status) {\r\n          if (status !== google.maps.GeocoderStatus.OK) {\r\n            reject(status);\r\n          }\r\n          resolve(results);\r\n        });\r\n      });\r\n  \r\n      return deferred;\r\n    }\r\n  \r\n    Map.prototype = Object.assign({}, Map.prototype, {\r\n      prepMapApi: function() {\r\n        if (apiStatus === 'loaded') {\r\n          this.createMap();\r\n        } else {\r\n          mapsToLoad.push(this);\r\n  \r\n          if (apiStatus !== 'loading') {\r\n            apiStatus = 'loading';\r\n            if (typeof window.google === 'undefined' || typeof window.google.maps === 'undefined' ) {\r\n  \r\n              var script = document.createElement('script');\r\n              script.onload = function () {\r\n                apiStatus = 'loaded';\r\n                initAllMaps();\r\n              };\r\n              script.src = 'https://maps.googleapis.com/maps/api/js?key=' + this.key;\r\n              document.head.appendChild(script);\r\n            }\r\n          }\r\n        }\r\n      },\r\n  \r\n      createMap: function() {\r\n        var mapDiv = this.map;\r\n  \r\n        return geolocate(mapDiv)\r\n          .then(\r\n            function(results) {\r\n              var mapOptions = {\r\n                zoom: config.zoom,\r\n                backgroundColor: 'none',\r\n                center: results[0].geometry.location,\r\n                draggable: false,\r\n                clickableIcons: false,\r\n                scrollwheel: false,\r\n                disableDoubleClickZoom: true,\r\n                disableDefaultUI: true\r\n              };\r\n  \r\n              var map = (this.map = new google.maps.Map(mapDiv, mapOptions));\r\n              var center = (this.center = map.getCenter());\r\n  \r\n              var marker = new google.maps.Marker({\r\n                map: map,\r\n                position: map.getCenter()\r\n              });\r\n  \r\n              google.maps.event.addDomListener(\r\n                window,\r\n                'resize',\r\n                theme.utils.debounce(250, function() {\r\n                  google.maps.event.trigger(map, 'resize');\r\n                  map.setCenter(center);\r\n                  mapDiv.removeAttribute('style');\r\n                })\r\n              );\r\n  \r\n              if (Shopify.designMode) {\r\n                if (window.AOS) { AOS.refreshHard() }\r\n              }\r\n            }.bind(this)\r\n          )\r\n          .catch(function(status) {\r\n            var errorMessage;\r\n  \r\n            switch (status) {\r\n              case 'ZERO_RESULTS':\r\n                errorMessage = errors.addressNoResults;\r\n                break;\r\n              case 'OVER_QUERY_LIMIT':\r\n                errorMessage = errors.addressQueryLimit;\r\n                break;\r\n              case 'REQUEST_DENIED':\r\n                errorMessage = errors.authError;\r\n                break;\r\n              default:\r\n                errorMessage = errors.addressError;\r\n                break;\r\n            }\r\n  \r\n            // Show errors only to merchant in the editor.\r\n            if (Shopify.designMode) {\r\n              window.mapError(errorMessage);\r\n            }\r\n          });\r\n      },\r\n  \r\n      onUnload: function() {\r\n        if (this.map.length === 0) {\r\n          return;\r\n        }\r\n        // Causes a harmless JS error when a section without an active map is reloaded\r\n        if (google && google.maps && google.maps.event) {\r\n          google.maps.event.clearListeners(this.map, 'resize');\r\n        }\r\n      }\r\n    });\r\n  \r\n    return Map;\r\n  })();\r\n  \r\n  theme.NewsletterPopup = (function () {\r\n    function NewsletterPopup(container) {\r\n      this.container = container;\r\n      var sectionId = this.container.getAttribute('data-section-id');\r\n  \r\n      this.cookieName = 'newsletter-' + sectionId;\r\n      this.cookie = Cookies.get(this.cookieName);\r\n  \r\n      if (!container) {\r\n        return;\r\n      }\r\n  \r\n      // Prevent popup on Shopify robot challenge page\r\n      if (window.location.pathname === '/challenge') {\r\n        return;\r\n      }\r\n  \r\n      // Prevent popup on password page\r\n      if (window.location.pathname === '/password') {\r\n        return;\r\n      }\r\n  \r\n      this.data = {\r\n        secondsBeforeShow: container.dataset.delaySeconds,\r\n        daysBeforeReappear: container.dataset.delayDays,\r\n        hasReminder: container.dataset.hasReminder,\r\n        testMode: container.dataset.testMode\r\n      };\r\n  \r\n      this.modal = new theme.Modals('NewsletterPopup-' + sectionId, 'newsletter-popup-modal');\r\n  \r\n      // Set cookie if optional button is clicked\r\n      var btn = container.querySelector('.popup-cta a');\r\n      if (btn) {\r\n        btn.addEventListener('click', function () {\r\n          this.closePopup(true);\r\n        }.bind(this));\r\n      }\r\n  \r\n      // Open modal if errors or success message exist\r\n      if (container.querySelector('.errors') || container.querySelector('.note--success')) {\r\n        this.modal.open();\r\n      }\r\n  \r\n      // Set cookie as opened if success message\r\n      if (container.querySelector('.note--success')) {\r\n        this.closePopup(true);\r\n        return;\r\n      }\r\n  \r\n      document.addEventListener('modalClose.' + container.id, this.closePopup.bind(this));\r\n  \r\n      if (!this.cookie) {\r\n        this.initPopupDelay();\r\n      }\r\n  \r\n      // Open modal if triggered by newsletter reminder\r\n      document.addEventListener('reminder:openNewsletter', () => {\r\n        this.modal.open();\r\n      });\r\n    }\r\n  \r\n    NewsletterPopup.prototype = Object.assign({}, NewsletterPopup.prototype, {\r\n      initPopupDelay: function () {\r\n        if (this.data.testMode === 'true') {\r\n          return;\r\n        }\r\n        setTimeout(function () {\r\n          const newsletterAppeared = (sessionStorage.getItem('newsletterAppeared') === 'true');\r\n          if (newsletterAppeared) {\r\n            const openReminder = new CustomEvent('newsletter:openReminder', { bubbles: true });\r\n            this.container.dispatchEvent(openReminder);\r\n          } else {\r\n            this.modal.open();\r\n            sessionStorage.setItem('newsletterAppeared', true);\r\n          }\r\n  \r\n        }.bind(this), this.data.secondsBeforeShow * 1000);\r\n      },\r\n  \r\n      closePopup: function (success) {\r\n        // Remove a cookie in case it was set in test mode\r\n        if (this.data.testMode === 'true') {\r\n          Cookies.remove(this.cookieName, { path: '/' });\r\n          return;\r\n        }\r\n  \r\n        var expiry = success ? 200 : this.data.daysBeforeReappear;\r\n        var hasReminder = (this.data.hasReminder === 'true');\r\n        var reminderAppeared = (sessionStorage.getItem('reminderAppeared') === 'true');\r\n  \r\n        if (hasReminder && reminderAppeared) {\r\n          Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\r\n        } else if(!hasReminder) {\r\n          Cookies.set(this.cookieName, 'opened', { path: '/', expires: expiry });\r\n        }\r\n      },\r\n  \r\n      onLoad: function () {\r\n        this.modal.open();\r\n      },\r\n  \r\n      onSelect: function () {\r\n        this.modal.open();\r\n      },\r\n  \r\n      onDeselect: function () {\r\n        this.modal.close();\r\n      },\r\n  \r\n      onBlockSelect: function () {\r\n        this.modal.close();\r\n      },\r\n  \r\n      onBlockDeselect: function () {\r\n        this.modal.open();\r\n      },\r\n  \r\n      onUnload: function() {\r\n        this.modal.close();\r\n      }\r\n    });\r\n  \r\n    return NewsletterPopup;\r\n  })();\r\n  \r\n  theme.PasswordHeader = (function() {\r\n    function PasswordHeader() {\r\n      this.init();\r\n    }\r\n  \r\n    PasswordHeader.prototype = Object.assign({}, PasswordHeader.prototype, {\r\n      init: function() {\r\n        if (!document.querySelector('#LoginModal')) {\r\n          return;\r\n        }\r\n  \r\n        var passwordModal = new theme.Modals('LoginModal', 'login-modal', {\r\n          focusIdOnOpen: 'password',\r\n          solid: true\r\n        });\r\n  \r\n        // Open modal if errors exist\r\n        if (document.querySelectorAll('.errors').length) {\r\n          passwordModal.open();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return PasswordHeader;\r\n  })();\r\n  \r\n  theme.Photoswipe = (function() {\r\n    var selectors = {\r\n      trigger: '.js-photoswipe__zoom',\r\n      images: '.photoswipe__image',\r\n      slideshowTrack: '.flickity-viewport ',\r\n      activeImage: '.is-selected'\r\n    };\r\n  \r\n    function Photoswipe(container, sectionId) {\r\n      this.container = container;\r\n      this.sectionId = sectionId;\r\n      this.namespace = '.photoswipe-' + this.sectionId;\r\n      this.gallery;\r\n      this.images;\r\n      this.items;\r\n      this.inSlideshow = false;\r\n  \r\n      if (!container || container.dataset.zoom === 'false') {\r\n        return;\r\n      }\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    Photoswipe.prototype = Object.assign({}, Photoswipe.prototype, {\r\n      init: function() {\r\n        this.container.querySelectorAll(selectors.trigger).forEach(trigger => {\r\n          trigger.on('click' + this.namespace, this.triggerClick.bind(this));\r\n        });\r\n      },\r\n  \r\n      triggerClick: function(evt) {\r\n        // Streamline changes between a slideshow and\r\n        // stacked images, so recheck if we are still\r\n        // working with a slideshow when initializing zoom\r\n        if (this.container.dataset && this.container.dataset.hasSlideshow === 'true') {\r\n          this.inSlideshow = true;\r\n        } else {\r\n          this.inSlideshow = false;\r\n        }\r\n  \r\n        this.items = this.getImageData();\r\n  \r\n        var image = this.inSlideshow ? this.container.querySelector(selectors.activeImage) : evt.currentTarget;\r\n  \r\n        var index = this.inSlideshow ? this.getChildIndex(image) : image.dataset.index;\r\n  \r\n        this.initGallery(this.items, index);\r\n      },\r\n  \r\n      // Because of image set feature, need to get index based on location in parent\r\n      getChildIndex: function(el) {\r\n        var i = 0;\r\n        while( (el = el.previousSibling) != null ) {\r\n          i++;\r\n        }\r\n  \r\n        // 1-based index required\r\n        return i + 1;\r\n      },\r\n  \r\n      getImageData: function() {\r\n        this.images = this.inSlideshow\r\n                        ? this.container.querySelectorAll(selectors.slideshowTrack + selectors.images)\r\n                        : this.container.querySelectorAll(selectors.images);\r\n  \r\n        var items = [];\r\n        var options = {};\r\n  \r\n        this.images.forEach(el => {\r\n          var item = {\r\n            msrc: el.currentSrc || el.src,\r\n            src: el.getAttribute('data-photoswipe-src'),\r\n            w: el.getAttribute('data-photoswipe-width'),\r\n            h: el.getAttribute('data-photoswipe-height'),\r\n            el: el,\r\n            initialZoomLevel: 0.5\r\n          }\r\n  \r\n          items.push(item);\r\n        });\r\n  \r\n        return items;\r\n      },\r\n  \r\n      initGallery: function(items, index) {\r\n        var pswpElement = document.querySelectorAll('.pswp')[0];\r\n  \r\n        var options = {\r\n          allowPanToNext: false,\r\n          captionEl: false,\r\n          closeOnScroll: false,\r\n          counterEl: false,\r\n          history: false,\r\n          index: index - 1,\r\n          pinchToClose: false,\r\n          preloaderEl: false,\r\n          scaleMode: 'zoom',\r\n          shareEl: false,\r\n          tapToToggleControls: false,\r\n          getThumbBoundsFn: function(index) {\r\n            var pageYScroll = window.pageYOffset || document.documentElement.scrollTop;\r\n            var thumbnail = items[index].el;\r\n            var rect = thumbnail.getBoundingClientRect();\r\n            return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};\r\n          }\r\n        }\r\n  \r\n        this.gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);\r\n        this.gallery.listen('afterChange', this.afterChange.bind(this));\r\n        this.gallery.init();\r\n  \r\n        this.preventiOS15Scrolling();\r\n      },\r\n  \r\n      afterChange: function() {\r\n        var index = this.gallery.getCurrentIndex();\r\n        this.container.dispatchEvent(new CustomEvent('photoswipe:afterChange', {\r\n          detail: {\r\n            index: index\r\n          }\r\n        }));\r\n      },\r\n  \r\n      syncHeight: function() {\r\n        document.documentElement.style.setProperty(\r\n          \"--window-inner-height\", \r\n          `${window.innerHeight}px`\r\n        );\r\n      },\r\n  \r\n      // Fix poached from https://gist.github.com/dimsemenov/0b8c255c0d87f2989e8ab876073534ea\r\n      preventiOS15Scrolling: function() {\r\n        let initialScrollPos;\r\n  \r\n        if (!/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) return; \r\n        \r\n        this.syncHeight();\r\n              \r\n        // Store scroll position to restore it later\r\n        initialScrollPos = window.scrollY;\r\n        \r\n        // Add class to root element when PhotoSwipe opens\r\n        document.documentElement.classList.add('pswp-open-in-ios');\r\n  \r\n        window.addEventListener('resize', this.syncHeight);\r\n      \r\n        this.gallery.listen('destroy', () => {\r\n          document.documentElement.classList.remove('pswp-open-in-ios');\r\n          window.scrollTo(0, initialScrollPos);\r\n        });\r\n      }\r\n    });\r\n  \r\n    return Photoswipe;\r\n  })();\r\n  \r\n  \r\n  /*============================================================================\r\n    ProductRecommendations\r\n  ==============================================================================*/\r\n  \r\n  class ProductRecommendations extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.url = this.dataset.url;\r\n      this.intent = this.dataset.intent;\r\n      this.placeholder = this.querySelector('.product-recommendations-placeholder');\r\n      this.productResults =  this.querySelector('.grid-product');\r\n      this.sectionId = this.dataset.sectionId;\r\n      this.blockId = this.dataset.blockId;\r\n  \r\n      document.addEventListener('recommendations:loaded', (e) => {\r\n        this.colorImages = this.el.querySelectorAll('.grid-product__color-image');\r\n        if (this.colorImages.length) {\r\n          this.swatches = this.el.querySelectorAll('.color-swatch--with-image');\r\n          this.colorSwatchHovering();\r\n        }\r\n      });\r\n    }\r\n  \r\n    connectedCallback() {\r\n      fetch(this.url)\r\n        .then(response => response.text())\r\n        .then(text => {\r\n  \r\n        const html = document.createElement('div');\r\n        html.innerHTML = text;\r\n        const recommendations = html.querySelector('.product-recommendations');\r\n  \r\n        if (!recommendations) {\r\n          this.el.classList.add('hide');\r\n          if (AOS) { AOS.refreshHard() }\r\n          return;\r\n        }\r\n  \r\n        this.placeholder.innerHTML = '';\r\n        this.placeholder.innerHTML = recommendations.innerHTML;\r\n  \r\n        theme.reinitProductGridItem(this.el);\r\n  \r\n        this.slideshow = this.querySelector('[data-slideshow]');\r\n  \r\n        if (this.slideshow) {\r\n          this.setupSlider();\r\n        }\r\n  \r\n        document.dispatchEvent(new CustomEvent('recommendations:loaded', {\r\n          detail: {\r\n            section: this.el,\r\n            intent: this.intent\r\n          }\r\n        }));\r\n  \r\n        })\r\n        .catch(e => {\r\n          console.error(e);\r\n        });\r\n    }\r\n  \r\n    setupSlider() {\r\n      const controlType = this.slideshow.dataset.controls;\r\n      const perSlide = parseFloat(this.slideshow.dataset.perSlide);\r\n      const count = parseFloat(this.slideshow.dataset.count);\r\n  \r\n      let prevNextButtons = false;\r\n      let pageDots = true;\r\n  \r\n      if (controlType === 'arrows') {\r\n        pageDots = false;\r\n        prevNextButtons = true;\r\n      }\r\n  \r\n      if (perSlide < count) {\r\n        this.flickity = new theme.Slideshow(this.slideshow, {\r\n          prevNextButtons,\r\n          pageDots,\r\n          adaptiveHeight: true,\r\n          wrapAround: false,\r\n        });\r\n      }\r\n    }\r\n  \r\n    colorSwatchHovering() {\r\n      this.swatches.forEach(swatch => {\r\n        swatch.addEventListener('mouseenter', function() {\r\n          this.setActiveColorImage(swatch);\r\n        }.bind(this));\r\n  \r\n        swatch.addEventListener('touchstart', function(evt) {\r\n          evt.preventDefault();\r\n          this.setActiveColorImage(swatch);\r\n        }.bind(this), {passive: true});\r\n  \r\n        swatch.addEventListener('mouseleave', function() {\r\n          this.removeActiveColorImage(swatch);\r\n        }.bind(this));\r\n      });\r\n    }\r\n  \r\n    setActiveColorImage(swatch) {\r\n      const id = swatch.dataset.variantId;\r\n      const image = swatch.dataset.variantImage;\r\n  \r\n      // Unset all active swatch images\r\n      this.colorImages.forEach(el => {\r\n        el.classList.remove('is-active');\r\n      });\r\n  \r\n      // Unset all active swatches\r\n      this.swatches.forEach(el => {\r\n        el.classList.remove('is-active');\r\n      });\r\n  \r\n      // Set active image and swatch\r\n      const imageEl = this.el.querySelector(`.grid-product__color-image--${id}`);\r\n  \r\n      imageEl.style.backgroundImage = 'url(' + image + ')';\r\n      imageEl.classList.add('is-active');\r\n      swatch.classList.add('is-active');\r\n  \r\n      // Update product grid item href with variant URL\r\n      const variantUrl = swatch.dataset.url;\r\n      const gridItem = swatch.closest('.grid-item__link');\r\n      gridItem.setAttribute('href', variantUrl);\r\n    }\r\n  \r\n    removeActiveColorImage(swatch) {\r\n      const id = swatch.dataset.variantId;\r\n      this.el.querySelector(`.grid-product__color-image--${id}`).classList.remove('is-active');\r\n    }\r\n  }\r\n  \r\n  customElements.define('product-recommendations', ProductRecommendations);\r\n  \r\n  theme.SlideshowSection = (function() {\r\n  \r\n    var selectors = {\r\n      parallaxContainer: '.parallax-container'\r\n    };\r\n  \r\n    function SlideshowSection(container) {\r\n      this.container = container;\r\n      var sectionId = container.getAttribute('data-section-id');\r\n      this.slideshow = container.querySelector('#Slideshow-' + sectionId);\r\n      this.namespace = '.' + sectionId;\r\n  \r\n      this.initialIndex = 0;\r\n  \r\n      if (!this.slideshow) { return }\r\n  \r\n      // Get shopify-created div that section markup lives in,\r\n      // then get index of it inside its parent\r\n      var sectionEl = container.parentElement;\r\n      var sectionIndex = [].indexOf.call(sectionEl.parentElement.children, sectionEl);\r\n  \r\n      if (sectionIndex === 0) {\r\n        this.init();\r\n      } else {\r\n        theme.initWhenVisible({\r\n          element: this.container,\r\n          callback: this.init.bind(this)\r\n        });\r\n      }\r\n  \r\n    }\r\n  \r\n    SlideshowSection.prototype = Object.assign({}, SlideshowSection.prototype, {\r\n      init: function() {\r\n        var slides = this.slideshow.querySelectorAll('.slideshow__slide');\r\n  \r\n        this.slideshow.classList.remove('loading', 'loading--delayed');\r\n        this.slideshow.classList.add('loaded');\r\n  \r\n        if (slides.length > 1) {\r\n          var sliderArgs = {\r\n            prevNextButtons: this.slideshow.hasAttribute('data-arrows'),\r\n            pageDots: this.slideshow.hasAttribute('data-dots'),\r\n            fade: true,\r\n            setGallerySize: false,\r\n            initialIndex: this.initialIndex,\r\n            autoPlay: this.slideshow.dataset.autoplay === 'true'\r\n              ? parseInt(this.slideshow.dataset.speed)\r\n              : false\r\n          };\r\n  \r\n          this.flickity = new theme.Slideshow(this.slideshow, sliderArgs);\r\n        } else {\r\n          // Add loaded class to first slide\r\n          slides[0].classList.add('is-selected');\r\n        }\r\n      },\r\n  \r\n      forceReload: function() {\r\n        this.onUnload();\r\n        this.init();\r\n      },\r\n  \r\n      onUnload: function() {\r\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\r\n          this.flickity.destroy();\r\n        }\r\n      },\r\n  \r\n      onDeselect: function() {\r\n        if (this.flickity && typeof this.flickity.play === 'function') {\r\n          this.flickity.play();\r\n        }\r\n      },\r\n  \r\n      onBlockSelect: function(evt) {\r\n        var slide = this.slideshow.querySelector('.slideshow__slide--' + evt.detail.blockId)\r\n        var index = parseInt(slide.dataset.index);\r\n  \r\n        if (this.flickity && typeof this.flickity.pause === 'function') {\r\n          this.flickity.goToSlide(index);\r\n          this.flickity.pause();\r\n        } else {\r\n          // If section reloads, slideshow might not have been setup yet, wait a second and try again\r\n          this.initialIndex = index;\r\n          setTimeout(function() {\r\n            if (this.flickity && typeof this.flickity.pause === 'function') {\r\n              this.flickity.pause();\r\n            }\r\n          }.bind(this), 1000);\r\n        }\r\n      },\r\n  \r\n      onBlockDeselect: function() {\r\n        if (this.flickity && typeof this.flickity.play === 'function') {\r\n          if (this.flickity.args.autoPlay) {\r\n            this.flickity.play();\r\n          }\r\n        }\r\n      }\r\n    });\r\n  \r\n    return SlideshowSection;\r\n  })();\r\n  \r\n  theme.StoreAvailability = (function() {\r\n    var selectors = {\r\n      drawerOpenBtn: '.js-drawer-open-availability',\r\n      modalOpenBtn: '.js-modal-open-availability',\r\n      productTitle: '[data-availability-product-title]'\r\n    };\r\n  \r\n    function StoreAvailability(container) {\r\n      this.container = container;\r\n      this.baseUrl = container.dataset.baseUrl;\r\n      this.productTitle = container.dataset.productName;\r\n    }\r\n  \r\n    StoreAvailability.prototype = Object.assign({}, StoreAvailability.prototype, {\r\n      updateContent: function(variantId) {\r\n        var variantSectionUrl =\r\n          this.baseUrl +\r\n          '/variants/' +\r\n          variantId +\r\n          '/?section_id=store-availability';\r\n  \r\n        var self = this;\r\n  \r\n        fetch(variantSectionUrl)\r\n          .then(function(response) {\r\n            return response.text();\r\n          })\r\n          .then(function(html) {\r\n            if (html.trim() === '') {\r\n              this.container.innerHTML = '';\r\n              return;\r\n            }\r\n  \r\n            self.container.innerHTML = html;\r\n            self.container.innerHTML = self.container.firstElementChild.innerHTML;\r\n  \r\n            // Setup drawer if have open button\r\n            if (self.container.querySelector(selectors.drawerOpenBtn)) {\r\n              self.drawer = new theme.Drawers('StoreAvailabilityDrawer', 'availability');\r\n            }\r\n  \r\n            // Setup modal if have open button\r\n            if (self.container.querySelector(selectors.modalOpenBtn)) {\r\n              self.modal = new theme.Modals('StoreAvailabilityModal', 'availability');\r\n            }\r\n  \r\n            var title = self.container.querySelector(selectors.productTitle);\r\n            if (title) {\r\n              title.textContent = self.productTitle;\r\n            }\r\n          });\r\n      }\r\n    });\r\n  \r\n    return StoreAvailability;\r\n  })();\r\n  \r\n  theme.VideoSection = (function() {\r\n    var selectors = {\r\n      videoParent: '.video-parent-section'\r\n    };\r\n  \r\n    function videoSection(container) {\r\n      this.container = container;\r\n      this.sectionId = container.getAttribute('data-section-id');\r\n      this.namespace = '.video-' + this.sectionId;\r\n      this.videoObject;\r\n  \r\n      theme.initWhenVisible({\r\n        element: this.container,\r\n        callback: this.init.bind(this),\r\n        threshold: 500\r\n      });\r\n    }\r\n  \r\n    videoSection.prototype = Object.assign({}, videoSection.prototype, {\r\n      init: function() {\r\n        var dataDiv = this.container.querySelector('.video-div');\r\n        if (!dataDiv) {\r\n          return;\r\n        }\r\n        var type = dataDiv.dataset.type;\r\n  \r\n        switch(type) {\r\n          case 'youtube':\r\n            var videoId = dataDiv.dataset.videoId;\r\n            this.initYoutubeVideo(videoId);\r\n            break;\r\n          case 'vimeo':\r\n            var videoId = dataDiv.dataset.videoId;\r\n            this.initVimeoVideo(videoId);\r\n            break;\r\n          case 'mp4':\r\n            this.initMp4Video();\r\n            break;\r\n        }\r\n      },\r\n  \r\n      initYoutubeVideo: function(videoId) {\r\n        this.videoObject = new theme.YouTube(\r\n          'YouTubeVideo-' + this.sectionId,\r\n          {\r\n            videoId: videoId,\r\n            videoParent: selectors.videoParent\r\n          }\r\n        );\r\n      },\r\n  \r\n      initVimeoVideo: function(videoId) {\r\n        this.videoObject = new theme.VimeoPlayer(\r\n          'Vimeo-' + this.sectionId,\r\n          videoId,\r\n          {\r\n            videoParent: selectors.videoParent\r\n          }\r\n        );\r\n      },\r\n  \r\n      initMp4Video: function() {\r\n        var mp4Video = 'Mp4Video-' + this.sectionId;\r\n        var mp4Div = document.getElementById(mp4Video);\r\n        var parent = mp4Div.closest(selectors.videoParent);\r\n  \r\n        if (mp4Div) {\r\n          parent.classList.add('loaded');\r\n  \r\n          var playPromise = document.querySelector('#' + mp4Video).play();\r\n  \r\n          // Edge does not return a promise (video still plays)\r\n          if (playPromise !== undefined) {\r\n            playPromise.then(function() {\r\n                // playback normal\r\n              }).catch(function() {\r\n                mp4Div.setAttribute('controls', '');\r\n                parent.classList.add('video-interactable');\r\n              });\r\n          }\r\n        }\r\n      },\r\n  \r\n      onUnload: function(evt) {\r\n        var sectionId = evt.target.id.replace('shopify-section-', '');\r\n        if (this.videoObject && typeof this.videoObject.destroy === 'function') {\r\n          this.videoObject.destroy();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return videoSection;\r\n  })();\r\n  \r\n  /*============================================================================\r\n    CountdownTimer\r\n  ==============================================================================*/\r\n  \r\n  class CountdownTimer extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.display = this.querySelector('[data-time-display]');\r\n      this.block = this.closest('.countdown__block--timer');\r\n      this.year = this.el.dataset.year;\r\n      this.month = this.el.dataset.month;\r\n      this.day = this.el.dataset.day;\r\n      this.hour = this.el.dataset.hour;\r\n      this.minute = this.el.dataset.minute;\r\n      this.daysPlaceholder = this.querySelector('[date-days-placeholder]');\r\n      this.hoursPlaceholder = this.querySelector('[date-hours-placeholder]');\r\n      this.minutesPlaceholder = this.querySelector('[date-minutes-placeholder]');\r\n      this.secondsPlaceholder = this.querySelector('[date-seconds-placeholder]');\r\n      this.messagePlaceholder = this.querySelector('[data-message-placeholder]');\r\n      this.hideTimerOnComplete = this.el.dataset.hideTimer;\r\n      this.completeMessage = this.el.dataset.completeMessage;\r\n  \r\n      this.timerComplete = false;\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    init() {\r\n      setInterval(() => {\r\n        if (!this.timerComplete) {\r\n          this._calculate();\r\n        }\r\n      }, 1000);\r\n  \r\n    }\r\n  \r\n    _calculate() {\r\n      // Find time difference and convert to integer\r\n      const timeDifference = +new Date(`${this.month}/${this.day}/${this.year} ${this.hour}:${this.minute}:00`).getTime() - +new Date().getTime();\r\n      // If time difference is greater than 0, calculate remaining time\r\n      if (timeDifference > 0) {\r\n        const intervals = {\r\n          days: Math.floor(timeDifference / (1000 * 60 * 60 * 24)),\r\n          hours: Math.floor((timeDifference / (1000 * 60 * 60)) % 24),\r\n          minutes: Math.floor((timeDifference / 1000 / 60) % 60),\r\n          seconds: Math.floor((timeDifference / 1000) % 60),\r\n        };\r\n  \r\n        this.daysPlaceholder.innerHTML = intervals.days;\r\n        this.hoursPlaceholder.innerHTML = intervals.hours;\r\n        this.minutesPlaceholder.innerHTML = intervals.minutes;\r\n        this.secondsPlaceholder.innerHTML = intervals.seconds;\r\n  \r\n        setTimeout(() => {\r\n          this.display.classList.add('countdown__display--loaded');\r\n        }, 1);\r\n      } else {\r\n        if (this.completeMessage && this.messagePlaceholder) {\r\n          this.messagePlaceholder.classList.add('countdown__timer-message--visible');\r\n        }\r\n  \r\n        if (this.hideTimerOnComplete === 'true') {\r\n          this.display.classList.remove('countdown__display--visible');\r\n          this.display.classList.add('countdown__display--hidden');\r\n        }\r\n  \r\n        if (!this.completeMessage && this.hideTimerOnComplete === 'true') {\r\n          this.block.classList.add('countdown__block--hidden');\r\n        }\r\n  \r\n        this.timerComplete = true;\r\n      }\r\n    }\r\n  }\r\n  \r\n  customElements.define('countdown-timer', CountdownTimer);\r\n  \r\n  /*============================================================================\r\n    HotSpots\r\n  ==============================================================================*/\r\n  \r\n  class HotSpots extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.buttons = this.querySelectorAll('[data-button]');\r\n      this.hotspotBlocks = this.querySelectorAll('[data-hotspot-block]');\r\n      this.blockContainer = this.querySelector('[data-block-container]');\r\n      this.colorImages = this.querySelectorAll('.grid-product__color-image');\r\n      this.colorSwatches = this.querySelectorAll('.color-swatch--with-image');\r\n  \r\n      this._bindEvents();\r\n      this._setupQuickShop();\r\n  \r\n      if (this.colorImages.length) {\r\n        this._colorSwatchHovering();\r\n      }\r\n    }\r\n  \r\n    _colorSwatchHovering() {\r\n      this.colorSwatches.forEach(swatch => {\r\n        swatch.addEventListener('mouseenter', function() {\r\n          this._setActiveColorImage(swatch);\r\n        }.bind(this));\r\n  \r\n        swatch.addEventListener('touchstart', function(evt) {\r\n          evt.preventDefault();\r\n          this._setActiveColorImage(swatch);\r\n        }.bind(this), {passive: true});\r\n  \r\n        swatch.addEventListener('mouseleave', function() {\r\n          this._removeActiveColorImage(swatch);\r\n        }.bind(this));\r\n      });\r\n    }\r\n  \r\n    _setActiveColorImage(swatch) {\r\n      var id = swatch.dataset.variantId;\r\n      var image = swatch.dataset.variantImage;\r\n  \r\n      // Unset all active swatch images\r\n      this.colorImages.forEach(el => {\r\n        el.classList.remove('is-active');\r\n      });\r\n  \r\n      // Unset all active swatches\r\n      this.colorSwatches.forEach(el => {\r\n        el.classList.remove('is-active');\r\n      });\r\n  \r\n      // Set active image and swatch\r\n      var imageEl = this.el.querySelector('.grid-product__color-image--' + id);\r\n      imageEl.style.backgroundImage = 'url(' + image + ')';\r\n      imageEl.classList.add('is-active');\r\n      swatch.classList.add('is-active');\r\n  \r\n      // Update product grid item href with variant URL\r\n      var variantUrl = swatch.dataset.url;\r\n      var gridItem = swatch.closest('.grid-item__link');\r\n  \r\n      if (gridItem) gridItem.setAttribute('href', variantUrl);\r\n    }\r\n  \r\n    _removeActiveColorImage(swatch) {\r\n      const id = swatch.dataset.variantId;\r\n      this.querySelector(`.grid-product__color-image--${id}`).classList.remove('is-active');\r\n    }\r\n  \r\n    /* Setup event listeners */\r\n    _bindEvents() {\r\n      this.buttons.forEach(button => {\r\n        const id = button.dataset.button;\r\n  \r\n        button.on('click', e => {\r\n          e.preventDefault();\r\n          e.stopPropagation();\r\n          this._showContent(id);\r\n        });\r\n      });\r\n  \r\n      // Display active hotspot block on theme editor select\r\n      document.addEventListener('shopify:block:select', (e) => {\r\n        const blockId = e.detail.blockId;\r\n        this._showContent(`${blockId}`);\r\n      });\r\n    }\r\n  \r\n    /* Toggle sidebar content */\r\n    _showContent(id) {\r\n      // Hide all hotspotBlock\r\n      // Show the hotspotBlock with the id\r\n      this.hotspotBlocks.forEach((block) => {\r\n        if (block.dataset.hotspotBlock === id) {\r\n          block.classList.add('is-active');\r\n        } else {\r\n          block.classList.remove('is-active');\r\n        }\r\n      });\r\n    }\r\n  \r\n    _setupQuickShop() {\r\n      if (this.querySelectorAll('[data-block-type=\"product\"]').length > 0) {\r\n        // Ensure we are utilizing the right version of QuickShop based off of theme\r\n        if (typeof theme.QuickShop === 'function') {\r\n          new theme.QuickShop(this.blockContainer);\r\n        } else if (typeof theme.initQuickShop === 'function') {\r\n          theme.initQuickShop();\r\n        }\r\n  \r\n        if (typeof theme.QuickAdd === 'function') {\r\n          new theme.QuickAdd(this.blockContainer);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  customElements.define('hot-spots', HotSpots);\r\n  \r\n  /*============================================================================\r\n    ImageCompare\r\n  ==============================================================================*/\r\n  \r\n  class ImageCompare extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.el = this;\r\n      this.sectionId = this.dataset.sectionId;\r\n      this.button = this.querySelector('[data-button]');\r\n      this.draggableContainer = this.querySelector('[data-draggable]');\r\n      this.primaryImage = this.querySelector('[data-primary-image]');\r\n      this.secondaryImage = this.querySelector('[data-secondary-image]');\r\n  \r\n      this.calculateSizes();\r\n  \r\n      this.active = false;\r\n      this.currentX = 0;\r\n      this.initialX = 0;\r\n      this.xOffset = 0;\r\n  \r\n      this.buttonOffset = this.button.offsetWidth / 2;\r\n  \r\n      this.el.addEventListener(\"touchstart\", this.dragStart, false);\r\n      this.el.addEventListener(\"touchend\", this.dragEnd, false);\r\n      this.el.addEventListener(\"touchmove\", this.drag, false);\r\n  \r\n      this.el.addEventListener(\"mousedown\", this.dragStart, false);\r\n      this.el.addEventListener(\"mouseup\", this.dragEnd, false);\r\n      this.el.addEventListener(\"mousemove\", this.drag, false);\r\n  \r\n      window.on('resize', theme.utils.debounce(250, () => { this.calculateSizes(true)}));\r\n  \r\n      document.addEventListener('shopify:section:load', event => {\r\n        if (event.detail.sectionId === this.sectionId && this.primaryImage !== null) {\r\n          this.calculateSizes();\r\n        }\r\n      });\r\n    }\r\n  \r\n    calculateSizes(hasResized = false) {\r\n      this.active = false;\r\n      this.currentX = 0;\r\n      this.initialX = 0;\r\n      this.xOffset = 0;\r\n  \r\n      this.buttonOffset = this.button.offsetWidth / 2;\r\n  \r\n      this.elWidth = this.el.offsetWidth;\r\n  \r\n      this.button.style.transform = `translate(-${this.buttonOffset}px, -50%)`;\r\n  \r\n      if (this.primaryImage) {\r\n        this.primaryImage.style.width = `${this.elWidth}px`;\r\n      }\r\n  \r\n      if (hasResized) this.draggableContainer.style.width = `${this.elWidth/2}px`;\r\n    }\r\n  \r\n    dragStart(e) {\r\n      if (e.type === \"touchstart\") {\r\n        this.initialX = e.touches[0].clientX - this.xOffset;\r\n      } else {\r\n        this.initialX = e.clientX - this.xOffset;\r\n      }\r\n  \r\n      if (e.target === this.button) {\r\n        this.active = true;\r\n      }\r\n    }\r\n  \r\n    dragEnd(e) {\r\n      this.initialX = this.currentX;\r\n  \r\n      this.active = false;\r\n    }\r\n  \r\n    drag(e) {\r\n      if (this.active) {\r\n  \r\n        e.preventDefault();\r\n  \r\n        if (e.type === \"touchmove\") {\r\n          this.currentX = e.touches[0].clientX - this.initialX;\r\n        } else {\r\n          this.currentX = e.clientX - this.initialX;\r\n        }\r\n  \r\n        this.xOffset = this.currentX;\r\n        this.setTranslate(this.currentX, this.button);\r\n      }\r\n    }\r\n  \r\n    setTranslate(xPos, el) {\r\n      let newXpos = xPos - this.buttonOffset;\r\n      let newVal = (this.elWidth/2) + xPos;\r\n  \r\n      const boundaryPadding = 50;\r\n      const XposMin = (this.elWidth/2 + this.buttonOffset) * -1;\r\n      const XposMax = this.elWidth/2 - this.buttonOffset;\r\n  \r\n      // Set boundaries for dragging\r\n      if (newXpos < (XposMin + boundaryPadding)) {\r\n        newXpos = XposMin + boundaryPadding;\r\n        newVal = boundaryPadding\r\n      } else if (newXpos > (XposMax - boundaryPadding)) {\r\n        newXpos = XposMax - boundaryPadding;\r\n        newVal = this.elWidth - boundaryPadding;\r\n      }\r\n  \r\n      el.style.transform = `translate(${newXpos}px, -50%)`;\r\n      this.draggableContainer.style.width = `${newVal}px`;\r\n    }\r\n  }\r\n  \r\n  customElements.define('image-compare', ImageCompare);\r\n  \r\n\r\n\r\n  theme.Blog = (function() {\r\n\r\n  \r\n\r\n    function Blog(container) {\r\n\r\n      this.tagFilters();\r\n\r\n    }\r\n\r\n  \r\n\r\n    Blog.prototype = Object.assign({}, Blog.prototype, {\r\n\r\n      tagFilters: function() {\r\n\r\n        var filterBy = document.getElementById('BlogTagFilter');\r\n\r\n  \r\n\r\n        if (!filterBy) {\r\n\r\n          return;\r\n\r\n        }\r\n\r\n  \r\n\r\n        filterBy.addEventListener('change', function() {\r\n\r\n          location.href = filterBy.value;\r\n\r\n        });\r\n\r\n      }\r\n\r\n    });\r\n\r\n  \r\n\r\n    return Blog;\r\n\r\n  })();\r\n\r\n  \r\n  theme.CollectionHeader = (function() {\r\n    var hasLoadedBefore = false;\r\n  \r\n    function CollectionHeader(container) {\r\n      this.namespace = '.collection-header';\r\n  \r\n      var heroImageContainer = container.querySelector('.collection-hero');\r\n      if (heroImageContainer) {\r\n        if (hasLoadedBefore) {\r\n          this.checkIfNeedReload();\r\n        }\r\n        heroImageContainer.classList.remove('loading', 'loading--delayed');\r\n        heroImageContainer.classList.add('loaded');\r\n      } else if (theme.settings.overlayHeader) {\r\n        theme.headerNav.disableOverlayHeader();\r\n      }\r\n  \r\n      hasLoadedBefore = true;\r\n    }\r\n  \r\n    CollectionHeader.prototype = Object.assign({}, CollectionHeader.prototype, {\r\n      // A liquid variable in the header needs a full page refresh\r\n      // if the collection header hero image setting is enabled\r\n      // and the header is set to sticky. Only necessary in the editor.\r\n      checkIfNeedReload: function() {\r\n        if (!Shopify.designMode) {\r\n          return;\r\n        }\r\n  \r\n        if (theme.settings.overlayHeader) {\r\n          var header = document.querySelector('.header-wrapper');\r\n          if (!header.classList.contains('header-wrapper--overlay')) {\r\n            location.reload();\r\n          }\r\n        }\r\n      }\r\n    });\r\n  \r\n    return CollectionHeader;\r\n  })();\r\n  \r\n  theme.CollectionSidebar = (function() {\r\n    var drawerStyle = false;\r\n    var selectors = {\r\n      sidebar: '#CollectionSidebar',\r\n    };\r\n  \r\n    function CollectionSidebar(container) {\r\n      this.container = container.querySelector(selectors.sidebar);\r\n    }\r\n  \r\n    CollectionSidebar.prototype = Object.assign({}, CollectionSidebar.prototype, {\r\n      init: function() {\r\n        // Do not load when no sidebar exists\r\n        if(!this.container) {\r\n          return;\r\n        }\r\n  \r\n        this.onUnload();\r\n  \r\n        drawerStyle = this.container.dataset.style === 'drawer';\r\n        theme.FilterDrawer = new theme.Drawers('FilterDrawer', 'collection-filters', true);\r\n      },\r\n  \r\n      forceReload: function() {\r\n        this.init();\r\n      },\r\n  \r\n      onSelect: function() {\r\n        if (theme.FilterDrawer) {\r\n          if (!drawerStyle) {\r\n            theme.FilterDrawer.close();\r\n            return;\r\n          }\r\n  \r\n          if (drawerStyle || theme.config.bpSmall) {\r\n            theme.FilterDrawer.open();\r\n          }\r\n        }\r\n      },\r\n  \r\n      onDeselect: function() {\r\n        if (theme.FilterDrawer) {\r\n          theme.FilterDrawer.close();\r\n        }\r\n      },\r\n  \r\n      onUnload: function() {\r\n        if (theme.FilterDrawer) {\r\n          theme.FilterDrawer.close();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return CollectionSidebar;\r\n  })();\r\n  \r\n  theme.Collection = (function() {\r\n    var isAnimating = false;\r\n  \r\n    var selectors = {\r\n      sortSelect: '#SortBy',\r\n  \r\n      colorSwatchImage: '.grid-product__color-image',\r\n      colorSwatch: '.color-swatch--with-image',\r\n  \r\n      collectionGrid: '.collection-grid__wrapper',\r\n      trigger: '.collapsible-trigger',\r\n      sidebar: '#CollectionSidebar',\r\n      filterSidebar: '.collapsible-content--sidebar',\r\n      activeTagList: '.tag-list--active-tags',\r\n      tags: '.tag-list input',\r\n      activeTags: '.tag-list a',\r\n      tagsForm: '.filter-form',\r\n      filters: '.collection-filter',\r\n      priceRange: '.price-range',\r\n    };\r\n  \r\n    var classes = {\r\n      activeTag: 'tag--active',\r\n      removeTagParent: 'tag--remove',\r\n      filterSidebar: 'collapsible-content--sidebar',\r\n      isOpen: 'is-open',\r\n    };\r\n  \r\n    function Collection(container) {\r\n      this.container = container;\r\n      this.sectionId = container.getAttribute('data-section-id');\r\n      this.namespace = '.collection-' + this.sectionId;\r\n      this.sidebar = new theme.CollectionSidebar(container);\r\n      this.context = container.getAttribute('data-context');\r\n      this.ajaxRenderer = new theme.AjaxRenderer({\r\n        sections: [\r\n          {\r\n            sectionId: this.sectionId,\r\n            nodeId: 'CollectionAjaxContent',\r\n          },\r\n        ],\r\n        onReplace: this.onReplaceAjaxContent.bind(this),\r\n      });\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    Collection.prototype = Object.assign({}, Collection.prototype, {\r\n      init: function() {\r\n  \r\n        /* Prevent extra JS from running for featured collection on a collection template */\r\n        if (this.context && this.context === 'featured-collection') {\r\n          this.colorSwatchHovering();\r\n        } else {\r\n          this.initSort();\r\n          this.colorSwatchHovering();\r\n          this.initFilters();\r\n          this.initPriceRange();\r\n          this.sidebar.init();\r\n        }\r\n      },\r\n  \r\n      initSort: function() {\r\n        this.sortSelect = document.querySelector(selectors.sortSelect);\r\n  \r\n        if (this.sortSelect) {\r\n          this.defaultSort = this.getDefaultSortValue();\r\n          this.sortSelect.on('change' + this.namespace, this.onSortChange.bind(this));\r\n        }\r\n      },\r\n  \r\n      getSortValue: function() {\r\n        return this.sortSelect.value || this.defaultSort;\r\n      },\r\n  \r\n      getDefaultSortValue: function() {\r\n        return this.sortSelect.getAttribute('data-default-sortby');\r\n      },\r\n  \r\n      onSortChange: function() {\r\n        this.queryParams = new URLSearchParams(window.location.search);\r\n  \r\n        this.queryParams.set('sort_by', this.getSortValue());\r\n        this.queryParams.delete('page'); // Delete if it exists\r\n  \r\n        window.location.search = this.queryParams.toString();\r\n      },\r\n  \r\n      colorSwatchHovering: function() {\r\n        var colorImages = this.container.querySelectorAll(selectors.colorSwatchImage);\r\n        if (!colorImages.length) {\r\n          return;\r\n        }\r\n  \r\n        this.container.querySelectorAll(selectors.colorSwatch).forEach(swatch => {\r\n          swatch.addEventListener('mouseenter', () => {\r\n            var id = swatch.dataset.variantId;\r\n            var image = swatch.dataset.variantImage;\r\n            var el = this.container.querySelector('.grid-product__color-image--' + id);\r\n            el.style.backgroundImage = 'url(' + image + ')';\r\n            el.classList.add('is-active');\r\n          });\r\n          swatch.addEventListener('mouseleave', () => {\r\n            var id = swatch.dataset.variantId;\r\n            this.container.querySelector('.grid-product__color-image--' + id).classList.remove('is-active');\r\n          });\r\n        });\r\n      },\r\n  \r\n      /*====================\r\n        Collection filters\r\n      ====================*/\r\n      initFilters: function() {\r\n        var tags = document.querySelectorAll(selectors.tags);\r\n  \r\n        if (!tags.length) {\r\n          return;\r\n        }\r\n  \r\n        this.bindBackButton();\r\n  \r\n        // Set mobile top value for filters if sticky header enabled\r\n        if (theme.config.stickyHeader) {\r\n          this.setFilterStickyPosition();\r\n  \r\n          window.on('resize', theme.utils.debounce(500, this.setFilterStickyPosition));\r\n        }\r\n  \r\n        document.querySelectorAll(selectors.activeTags).forEach(tag => {\r\n          tag.addEventListener('click', this.tagClick.bind(this));\r\n        });\r\n  \r\n        document.querySelectorAll(selectors.tagsForm).forEach(form => {\r\n          form.addEventListener('input', this.onFormSubmit.bind(this));\r\n        });\r\n      },\r\n  \r\n      initPriceRange: function() {\r\n        const priceRangeEls = document.querySelectorAll(selectors.priceRange);\r\n        priceRangeEls.forEach((el) => new theme.PriceRange(el, {\r\n          // onChange passes in formData\r\n          onChange: this.renderFromFormData.bind(this),\r\n        }));\r\n      },\r\n  \r\n      tagClick: function(evt) {\r\n        var el = evt.currentTarget;\r\n  \r\n        if (theme.FilterDrawer) {\r\n          theme.FilterDrawer.close();\r\n        }\r\n  \r\n        // Do not ajax-load collection links\r\n        if (el.classList.contains('no-ajax')) {\r\n          return;\r\n        }\r\n  \r\n        evt.preventDefault();\r\n  \r\n        if (isAnimating) {\r\n          return;\r\n        }\r\n  \r\n        isAnimating = true;\r\n  \r\n        const parent = el.parentNode;\r\n        const newUrl = new URL(el.href);\r\n  \r\n        this.renderActiveTag(parent, el);\r\n        this.updateScroll(true);\r\n        this.startLoading();\r\n        this.renderCollectionPage(newUrl.searchParams);\r\n      },\r\n  \r\n      onFormSubmit: function(evt) {\r\n        var el = evt.target;\r\n  \r\n        if (theme.FilterDrawer) {\r\n          theme.FilterDrawer.close();\r\n        }\r\n  \r\n        // Do not ajax-load collection links\r\n        if (el.classList.contains('no-ajax')) {\r\n          return;\r\n        }\r\n  \r\n        evt.preventDefault();\r\n        if (isAnimating) {\r\n          return;\r\n        }\r\n  \r\n        isAnimating = true;\r\n  \r\n        const parent = el.closest('li');\r\n        const formEl = el.closest('form');\r\n        const formData = new FormData(formEl);\r\n  \r\n        this.renderActiveTag(parent, el);\r\n        this.updateScroll(true);\r\n        this.startLoading();\r\n        this.renderFromFormData(formData);\r\n      },\r\n  \r\n      fetchOpenCollasibleFilters: function() {\r\n        return Array.from(\r\n          document.querySelectorAll(\r\n            `${selectors.sidebar} ${selectors.trigger}.${classes.isOpen}`,\r\n          ),\r\n        ).map(trigger => trigger.dataset.collapsibleId);\r\n      },\r\n  \r\n      renderActiveTag: function(parent, el) {\r\n        const textEl = parent.querySelector('.tag__text');\r\n  \r\n        if (parent.classList.contains(classes.activeTag)) {\r\n          parent.classList.remove(classes.activeTag);\r\n        } else {\r\n          parent.classList.add(classes.activeTag);\r\n  \r\n          // If adding a tag, show new tag right away.\r\n          // Otherwise, remove it before ajax finishes\r\n          if (el.closest('li').classList.contains(classes.removeTagParent)) {\r\n            parent.remove();\r\n          } else {\r\n            // Append new tag in both drawer and sidebar\r\n            document.querySelectorAll(selectors.activeTagList).forEach(list => {\r\n              const newTag = document.createElement('li');\r\n              const newTagLink = document.createElement('a');\r\n              newTag.classList.add('tag', 'tag--remove');\r\n              newTagLink.classList.add('btn', 'btn--small');\r\n              newTagLink.innerText = textEl.innerText;\r\n              newTag.appendChild(newTagLink);\r\n  \r\n              list.appendChild(newTag);\r\n            });\r\n          }\r\n        }\r\n      },\r\n  \r\n      renderFromFormData: function(formData) {\r\n        const searchParams = new URLSearchParams(formData);\r\n        this.renderCollectionPage(searchParams);\r\n      },\r\n  \r\n      onReplaceAjaxContent: function(newDom, section) {\r\n        const openCollapsibleIds = this.fetchOpenCollasibleFilters();\r\n  \r\n        openCollapsibleIds.forEach(selector => {\r\n          newDom\r\n            .querySelectorAll(`[data-collapsible-id=${selector}]`)\r\n            .forEach(this.openCollapsible);\r\n        });\r\n  \r\n        var newContentEl = newDom.getElementById(section.nodeId);\r\n        if (!newContentEl) {\r\n          return;\r\n        }\r\n  \r\n        document.getElementById(section.nodeId).innerHTML = newContentEl.innerHTML;\r\n      },\r\n  \r\n      openCollapsible: function(el) {\r\n        if (el.classList.contains(classes.filterSidebar)) {\r\n          el.style.height = 'auto';\r\n        }\r\n  \r\n        el.classList.add(classes.isOpen);\r\n      },\r\n  \r\n      renderCollectionPage: function(searchParams, updateURLHash = true) {\r\n        this.ajaxRenderer\r\n          .renderPage(window.location.pathname, searchParams, updateURLHash)\r\n          .then(() => {\r\n            theme.sections.reinit('collection-grid');\r\n            this.updateScroll(false);\r\n            this.initPriceRange();\r\n            theme.reinitProductGridItem();\r\n  \r\n            document.dispatchEvent(new CustomEvent('collection:reloaded'));\r\n  \r\n            isAnimating = false;\r\n          });\r\n      },\r\n  \r\n      bindBackButton: function() {\r\n        // Ajax page on back button\r\n        window.off('popstate' + this.namespace);\r\n        window.on('popstate' + this.namespace, function(state) {\r\n          if (state) {\r\n            const newUrl = new URL(window.location.href);\r\n            this.renderCollectionPage(newUrl.searchParams, false);\r\n          }\r\n        }.bind(this));\r\n      },\r\n  \r\n      updateScroll: function(animate) {\r\n        var scrollToElement = document.querySelector('[data-scroll-to]');\r\n        var scrollTo = scrollToElement && scrollToElement.offsetTop;\r\n  \r\n        if (!theme.config.bpSmall) {\r\n          scrollTo -= 15;\r\n        }\r\n  \r\n        if (theme.config.stickyHeader) {\r\n          var headerHeight = document.querySelector('.site-header').offsetHeight;\r\n          scrollTo = scrollTo - headerHeight;\r\n        }\r\n  \r\n        if (animate) {\r\n          window.scrollTo({top: scrollTo, behavior: 'smooth'});\r\n        } else {\r\n          window.scrollTo({top: scrollTo});\r\n        }\r\n      },\r\n  \r\n      setFilterStickyPosition: function() {\r\n        var headerHeight = document.querySelector('.site-header').offsetHeight;\r\n        document.querySelector(selectors.filters).style.top = headerHeight + 10 + 'px';\r\n  \r\n        // Also update top position of sticky sidebar\r\n        var stickySidebar = document.querySelector('.grid__item--sidebar');\r\n        if (stickySidebar) {\r\n          stickySidebar.style.top = headerHeight + 10 + 'px';\r\n        }\r\n      },\r\n  \r\n      forceReload: function() {\r\n        this.init();\r\n      },\r\n  \r\n      startLoading: function() {\r\n        document.querySelector(selectors.collectionGrid).classList.add('unload');\r\n      },\r\n    });\r\n  \r\n    return Collection;\r\n  })();\r\n  \r\n  theme.FooterSection = (function() {\r\n    var selectors = {\r\n      locale: '[data-disclosure-locale]',\r\n      currency: '[data-disclosure-currency]'\r\n    };\r\n  \r\n    function FooterSection(container) {\r\n      this.container = container;\r\n      this.localeDisclosure = null;\r\n      this.currencyDisclosure = null;\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    FooterSection.prototype = Object.assign({}, FooterSection.prototype, {\r\n      init: function() {\r\n        var localeEl = this.container.querySelector(selectors.locale);\r\n        var currencyEl = this.container.querySelector(selectors.currency);\r\n  \r\n        if (localeEl) {\r\n          this.localeDisclosure = new theme.Disclosure(localeEl);\r\n        }\r\n  \r\n        if (currencyEl) {\r\n          this.currencyDisclosure = new theme.Disclosure(currencyEl);\r\n        }\r\n  \r\n        // Change email icon to submit text\r\n        var newsletterInput = document.querySelector('.footer__newsletter-input');\r\n        if (newsletterInput) {\r\n          newsletterInput.addEventListener('keyup', function() {\r\n            newsletterInput.classList.add('footer__newsletter-input--active');\r\n          });\r\n        }\r\n  \r\n        // Re-hook up collapsible box triggers\r\n        theme.collapsibles.init(this.container);\r\n      },\r\n  \r\n      onUnload: function() {\r\n        if (this.localeDisclosure) {\r\n          this.localeDisclosure.destroy();\r\n        }\r\n  \r\n        if (this.currencyDisclosure) {\r\n          this.currencyDisclosure.destroy();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return FooterSection;\r\n  })();\r\n  \r\n  theme.HeaderSection = (function() {\r\n  \r\n    var selectors = {\r\n      locale: '[data-disclosure-locale]',\r\n      currency: '[data-disclosure-currency]'\r\n    };\r\n  \r\n    function HeaderSection(container) {\r\n      this.container = container;\r\n      this.sectionId = this.container.getAttribute('data-section-id');\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    HeaderSection.prototype = Object.assign({}, HeaderSection.prototype, {\r\n      init: function() {\r\n        // Reload any slideshow if header is reloaded to make sure\r\n        // sticky header works as expected\r\n        // (can be anywhere in sections.instance array)\r\n        if (Shopify && Shopify.designMode) {\r\n          theme.sections.reinit('slideshow-section');\r\n  \r\n          // Set a timer to resize the header in case the logo changes size\r\n          setTimeout(function() {\r\n            window.dispatchEvent(new Event('resize'));\r\n          }, 500);\r\n        }\r\n  \r\n        this.initDrawers();\r\n        this.initDisclosures();\r\n        theme.headerNav.init();\r\n        theme.announcementBar.init();\r\n        this.hoverMenu();\r\n      },\r\n  \r\n      hoverMenu: function() {\r\n        const detailsEl = document.querySelectorAll('[data-section-type=\"header\"] details[data-hover=\"true\"]');\r\n  \r\n        detailsEl.forEach((detail) => {\r\n          const summary = detail.querySelector('summary');\r\n          const summaryLink = summary.dataset.link;\r\n  \r\n          summary.addEventListener('click', e => {\r\n            e.preventDefault();\r\n            window.location.href = summaryLink;\r\n          });\r\n  \r\n          // if detail has :focus-within\r\n          detail.addEventListener('focusin', () => {\r\n            if (!detail.hasAttribute('open')) {\r\n  \r\n              // close all other details\r\n              detailsEl.forEach((detail) => {\r\n                detail.removeAttribute('open');\r\n                detail.setAttribute('aria-expanded', 'false');\r\n              });\r\n  \r\n              detail.setAttribute('open', '');\r\n              detail.setAttribute('aria-expanded', 'true');\r\n            }\r\n          });\r\n  \r\n          detail.addEventListener('focusout', () => {\r\n            if (detail.hasAttribute('open') && !detail.matches(':focus-within')) {\r\n              detail.removeAttribute('open');\r\n              detail.setAttribute('aria-expanded', 'false');\r\n            }\r\n          });\r\n  \r\n          detail.addEventListener('mouseover', () => {\r\n            if (!detail.hasAttribute('open')) {\r\n              detail.setAttribute('open', '');\r\n              detail.setAttribute('aria-expanded', 'true');\r\n            }\r\n          });\r\n  \r\n          detail.addEventListener('mouseleave', () => {\r\n            if (detail.hasAttribute('open')) {\r\n              detail.removeAttribute('open');\r\n              detail.setAttribute('aria-expanded', 'false');\r\n            }\r\n          });\r\n        });\r\n      },\r\n  \r\n      initDisclosures: function() {\r\n        var localeEl = this.container.querySelector(selectors.locale);\r\n        var currencyEl = this.container.querySelector(selectors.currency);\r\n  \r\n        if (localeEl) {\r\n          this.localeDisclosure = new theme.Disclosure(localeEl);\r\n        }\r\n  \r\n        if (currencyEl) {\r\n          this.currencyDisclosure = new theme.Disclosure(currencyEl);\r\n        }\r\n      },\r\n  \r\n      initDrawers: function() {\r\n        theme.NavDrawer = new theme.Drawers('NavDrawer', 'nav');\r\n        if (theme.settings.cartType === 'drawer') {\r\n          if (!document.body.classList.contains('template-cart')) {\r\n            new theme.CartDrawer();\r\n          }\r\n        }\r\n  \r\n        theme.collapsibles.init(document.getElementById('NavDrawer'));\r\n      },\r\n  \r\n      onUnload: function() {\r\n        theme.NavDrawer.close();\r\n        theme.announcementBar.unload();\r\n  \r\n        if (this.localeDisclosure) {\r\n          this.localeDisclosure.destroy();\r\n        }\r\n  \r\n        if (this.currencyDisclosure) {\r\n          this.currencyDisclosure.destroy();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return HeaderSection;\r\n  })();\r\n  \r\n  theme.Product = (function() {\r\n    var videoObjects = {};\r\n  \r\n    var classes = {\r\n      onSale: 'on-sale',\r\n      disabled: 'disabled',\r\n      isModal: 'is-modal',\r\n      loading: 'loading',\r\n      loaded: 'loaded',\r\n      hidden: 'hide',\r\n      interactable: 'video-interactable',\r\n      visuallyHide: 'visually-invisible',\r\n      lowInventory: 'inventory--low',\r\n    };\r\n  \r\n    var selectors = {\r\n      productVideo: '.product__video',\r\n      videoParent: '.product__video-wrapper',\r\n      slide: '.product-main-slide',\r\n      currentSlide: '.is-selected',\r\n      startingSlide: '.starting-slide',\r\n      variantType: '.variant-wrapper',\r\n      blocks: '[data-product-blocks]',\r\n      blocksHolder: '[data-blocks-holder]',\r\n      dynamicVariantsEnabled: '[data-dynamic-variants-enabled]',\r\n    };\r\n  \r\n    function Product(container) {\r\n      this.container = container;\r\n      var sectionId = this.sectionId = container.getAttribute('data-section-id');\r\n      var productId = this.productId = container.getAttribute('data-product-id');\r\n  \r\n      this.inModal = (container.dataset.modal === 'true');\r\n      this.modal;\r\n  \r\n      this.settings = {\r\n        enableHistoryState: container.dataset.history || false,\r\n        namespace: '.product-' + sectionId,\r\n        inventory: false,\r\n        inventoryThreshold: 10,\r\n        modalInit: false,\r\n        hasImages: true,\r\n        imageSetName: null,\r\n        imageSetIndex: null,\r\n        currentImageSet: null,\r\n        imageSize: '620x',\r\n        currentSlideIndex: 0,\r\n        videoLooping: container.dataset.videoLooping\r\n      };\r\n  \r\n      // Overwrite some settings when loaded in modal\r\n      if (this.inModal) {\r\n        this.settings.enableHistoryState = false;\r\n        this.settings.namespace = '.product-' + sectionId + '-modal';\r\n        this.modal = document.getElementById('QuickShopModal-' + productId);\r\n      }\r\n  \r\n      this.selectors = {\r\n        variantsJson: '[data-variant-json]',\r\n        currentVariantJson: '[data-current-variant-json]',\r\n        form: '.product-single__form',\r\n  \r\n        media: '[data-product-media-type-model]',\r\n        closeMedia: '.product-single__close-media',\r\n        photoThumbs: '[data-product-thumb]',\r\n        thumbSlider: '[data-product-thumbs]',\r\n        thumbScroller: '.product__thumbs--scroller',\r\n        mainSlider: '[data-product-photos]',\r\n        imageContainer: '[data-product-images]',\r\n        productImageMain: '[data-product-image-main]',\r\n  \r\n        priceWrapper: '[data-product-price-wrap]',\r\n        price: '[data-product-price]',\r\n        comparePrice: '[data-compare-price]',\r\n        savePrice: '[data-save-price]',\r\n        priceA11y: '[data-a11y-price]',\r\n        comparePriceA11y: '[data-compare-price-a11y]',\r\n        unitWrapper: '[data-unit-price-wrapper]',\r\n        unitPrice: '[data-unit-price]',\r\n        unitPriceBaseUnit: '[data-unit-base]',\r\n        sku: '[data-sku]',\r\n        inventory: '[data-product-inventory]',\r\n        incomingInventory: '[data-incoming-inventory]',\r\n        colorLabel: '[data-variant-color-label]',\r\n  \r\n        addToCart: '[data-add-to-cart]',\r\n        addToCartText: '[data-add-to-cart-text]',\r\n  \r\n        originalSelectorId: '[data-product-select]',\r\n        singleOptionSelector: '[data-variant-input]',\r\n        variantColorSwatch: '.variant__input--color-swatch',\r\n        dynamicVariantsEnabled: '[data-dynamic-variants-enabled]',\r\n  \r\n        availabilityContainer: '[data-store-availability-holder]'\r\n      };\r\n  \r\n      this.cacheElements();\r\n  \r\n      this.firstProductImage = this.cache.mainSlider.querySelector('img');\r\n  \r\n      if (!this.firstProductImage) {\r\n        this.settings.hasImages = false;\r\n      }\r\n  \r\n      var dataSetEl = this.cache.mainSlider.querySelector('[data-set-name]');\r\n      if (dataSetEl) {\r\n        this.settings.imageSetName = dataSetEl.dataset.setName;\r\n      }\r\n  \r\n      this.init();\r\n    }\r\n  \r\n    Product.prototype = Object.assign({}, Product.prototype, {\r\n      init: function() {\r\n        if (this.inModal) {\r\n          this.container.classList.add(classes.isModal);\r\n          document.addEventListener('modalOpen.QuickShopModal-' + this.productId, this.openModalProduct.bind(this));\r\n          document.addEventListener('modalClose.QuickShopModal-' + this.productId, this.closeModalProduct.bind(this));\r\n        }\r\n  \r\n        if (!this.inModal) {\r\n          this.formSetup();\r\n          this.productSetup();\r\n          this.videoSetup();\r\n          this.initProductSlider();\r\n          this.customMediaListners();\r\n          this.addIdToRecentlyViewed();\r\n        }\r\n      },\r\n  \r\n      cacheElements: function() {\r\n        this.cache = {\r\n          form: this.container.querySelector(this.selectors.form),\r\n          mainSlider: this.container.querySelector(this.selectors.mainSlider),\r\n          thumbSlider: this.container.querySelector(this.selectors.thumbSlider),\r\n          thumbScroller: this.container.querySelector(this.selectors.thumbScroller),\r\n          productImageMain: this.container.querySelector(this.selectors.productImageMain),\r\n  \r\n          // Price-related\r\n          priceWrapper: this.container.querySelector(this.selectors.priceWrapper),\r\n          comparePriceA11y: this.container.querySelector(this.selectors.comparePriceA11y),\r\n          comparePrice: this.container.querySelector(this.selectors.comparePrice),\r\n          price: this.container.querySelector(this.selectors.price),\r\n          savePrice: this.container.querySelector(this.selectors.savePrice),\r\n          priceA11y: this.container.querySelector(this.selectors.priceA11y)\r\n        };\r\n      },\r\n  \r\n      formSetup: function() {\r\n        this.initQtySelector();\r\n        this.initAjaxProductForm();\r\n        this.availabilitySetup();\r\n        this.initVariants();\r\n  \r\n        // We know the current variant now so setup image sets\r\n        if (this.settings.imageSetName) {\r\n          this.updateImageSet();\r\n        }\r\n      },\r\n  \r\n      availabilitySetup: function() {\r\n        var container = this.container.querySelector(this.selectors.availabilityContainer);\r\n        if (container) {\r\n          this.storeAvailability = new theme.StoreAvailability(container);\r\n        }\r\n      },\r\n  \r\n      productSetup: function() {\r\n        this.setImageSizes();\r\n        this.initImageZoom();\r\n        this.initModelViewerLibraries();\r\n        this.initShopifyXrLaunch();\r\n      },\r\n  \r\n      setImageSizes: function() {\r\n        if (!this.settings.hasImages) {\r\n          return;\r\n        }\r\n  \r\n        // Get srcset image src, works on most modern browsers\r\n        // otherwise defaults to settings.imageSize\r\n        var currentImage = this.firstProductImage.currentSrc;\r\n  \r\n        if (currentImage) {\r\n          this.settings.imageSize = theme.Images.imageSize(currentImage);\r\n        }\r\n      },\r\n  \r\n      addIdToRecentlyViewed: function() {\r\n        var handle = this.container.getAttribute('data-product-handle');\r\n        var url = this.container.getAttribute('data-product-url');\r\n        var aspectRatio = this.container.getAttribute('data-aspect-ratio');\r\n        var featuredImage = this.container.getAttribute('data-img-url');\r\n  \r\n        // Remove current product if already in set of recent\r\n        if (theme.recentlyViewed.recent.hasOwnProperty(handle)) {\r\n          delete theme.recentlyViewed.recent[handle];\r\n        }\r\n  \r\n        // Add it back to the end\r\n        theme.recentlyViewed.recent[handle] = {\r\n          url: url,\r\n          aspectRatio: aspectRatio,\r\n          featuredImage: featuredImage\r\n        };\r\n  \r\n        if (theme.config.hasLocalStorage) {\r\n          window.localStorage.setItem('theme-recent', JSON.stringify(theme.recentlyViewed.recent));\r\n        }\r\n      },\r\n  \r\n      initVariants: function() {\r\n        var variantJson = this.container.querySelector(this.selectors.variantsJson);\r\n  \r\n        if (!variantJson) {\r\n          return;\r\n        }\r\n  \r\n        this.variantsObject = JSON.parse(variantJson.innerHTML);\r\n        var dynamicVariantsEnabled = !!this.container.querySelector(selectors.dynamicVariantsEnabled)\r\n  \r\n        var options = {\r\n          container: this.container,\r\n          enableHistoryState: this.settings.enableHistoryState,\r\n          singleOptionSelector: this.selectors.singleOptionSelector,\r\n          originalSelectorId: this.selectors.originalSelectorId,\r\n          variants: this.variantsObject,\r\n          dynamicVariantsEnabled\r\n        };\r\n  \r\n        var swatches = this.container.querySelectorAll(this.selectors.variantColorSwatch);\r\n        if (swatches.length) {\r\n          swatches.forEach(swatch => {\r\n            swatch.addEventListener('updateSwatch', function(evt) {\r\n              var color = swatch.dataset.colorName;\r\n              var index = swatch.dataset.colorIndex;\r\n              this.updateColorName(color, index);\r\n            }.bind(this))\r\n          });\r\n        }\r\n  \r\n        this.variants = new theme.Variants(options);\r\n  \r\n        // Product availability on page load\r\n        if (this.storeAvailability) {\r\n          var variant_id = this.variants.currentVariant ? this.variants.currentVariant.id : this.variants.variants[0].id;\r\n  \r\n          this.storeAvailability.updateContent(variant_id);\r\n          this.container.on('variantChange' + this.settings.namespace, this.updateAvailability.bind(this));\r\n        }\r\n  \r\n        this.container.on('variantChange' + this.settings.namespace, this.updateCartButton.bind(this));\r\n        this.container.on('variantImageChange' + this.settings.namespace, this.updateVariantImage.bind(this));\r\n        this.container.on('variantPriceChange' + this.settings.namespace, this.updatePrice.bind(this));\r\n        this.container.on('variantUnitPriceChange' + this.settings.namespace, this.updateUnitPrice.bind(this));\r\n  \r\n        if (this.container.querySelector(this.selectors.sku)) {\r\n          this.container.on('variantSKUChange' + this.settings.namespace, this.updateSku.bind(this));\r\n        }\r\n  \r\n        var inventoryEl = this.container.querySelector(this.selectors.inventory);\r\n        if (inventoryEl) {\r\n          this.settings.inventory = true;\r\n          this.settings.inventoryThreshold = inventoryEl.dataset.threshold;\r\n  \r\n          // Update inventory on page load\r\n          this.updateInventory({ detail: { variant: this.variants.currentVariant } });\r\n  \r\n          this.container.on('variantChange' + this.settings.namespace, this.updateInventory.bind(this));\r\n        }\r\n  \r\n        // Update individual variant availability on each selection\r\n        if (dynamicVariantsEnabled) {\r\n          var currentVariantJson = this.container.querySelector(this.selectors.currentVariantJson);\r\n  \r\n          if (currentVariantJson) {\r\n            var variantType = this.container.querySelector(selectors.variantType);\r\n  \r\n            if (variantType) {\r\n              new theme.VariantAvailability({\r\n                container: this.container,\r\n                namespace: this.settings.namespace,\r\n                type: variantType.dataset.type,\r\n                variantsObject: this.variantsObject,\r\n                currentVariantObject: JSON.parse(currentVariantJson.innerHTML)\r\n              });\r\n            }\r\n          }\r\n        }\r\n  \r\n        // image set names variant change listeners\r\n        if (this.settings.imageSetName) {\r\n          var variantWrapper = this.container.querySelector('.variant-input-wrap[data-handle=\"'+this.settings.imageSetName+'\"]');\r\n          if (variantWrapper) {\r\n            this.settings.imageSetIndex = variantWrapper.dataset.index;\r\n            this.container.on('variantChange' + this.settings.namespace, this.updateImageSet.bind(this))\r\n          } else {\r\n            this.settings.imageSetName = null;\r\n          }\r\n        }\r\n      },\r\n  \r\n      initQtySelector: function() {\r\n        this.container.querySelectorAll('.js-qty__wrapper').forEach(el => {\r\n          new theme.QtySelector(el, {\r\n            namespace: '.product'\r\n          });\r\n        });\r\n      },\r\n  \r\n      initAjaxProductForm: function() {\r\n        new theme.AjaxProduct(this.cache.form);\r\n      },\r\n  \r\n      /*============================================================================\r\n        Variant change methods\r\n      ==============================================================================*/\r\n      updateColorName: function(color, index) {\r\n        // Updates on radio button change, not variant.js\r\n        this.container.querySelector(this.selectors.colorLabel + `[data-index=\"${index}\"`).textContent = color;\r\n      },\r\n  \r\n      updateCartButton: function(evt) {\r\n        var variant = evt.detail.variant;\r\n        var cartBtn = this.container.querySelector(this.selectors.addToCart);\r\n        var cartBtnText = this.container.querySelector(this.selectors.addToCartText);\r\n  \r\n        if (!cartBtn) return;\r\n  \r\n        if (variant) {\r\n          if (variant.available) {\r\n            // Available, enable the submit button and change text\r\n            cartBtn.classList.remove(classes.disabled);\r\n            cartBtn.disabled = false;\r\n            var defaultText = cartBtnText.dataset.defaultText;\r\n            cartBtnText.textContent = defaultText;\r\n          } else {\r\n            // Sold out, disable the submit button and change text\r\n            cartBtn.classList.add(classes.disabled);\r\n            cartBtn.disabled = true;\r\n            cartBtnText.textContent = theme.strings.soldOut;\r\n          }\r\n        } else {\r\n          // The variant doesn't exist, disable submit button\r\n          cartBtn.classList.add(classes.disabled);\r\n          cartBtn.disabled = true;\r\n          cartBtnText.textContent = theme.strings.unavailable;\r\n        }\r\n      },\r\n  \r\n      updatePrice: function(evt) {\r\n        var variant = evt.detail.variant;\r\n  \r\n        if (variant) {\r\n          // Regular price\r\n          this.cache.price.innerHTML = theme.Currency.formatMoney(variant.price, theme.settings.moneyFormat);\r\n  \r\n          // Sale price, if necessary\r\n          if (variant.compare_at_price > variant.price) {\r\n            this.cache.comparePrice.innerHTML = theme.Currency.formatMoney(variant.compare_at_price, theme.settings.moneyFormat);\r\n            this.cache.priceWrapper.classList.remove(classes.hidden);\r\n            this.cache.price.classList.add(classes.onSale);\r\n            this.cache.comparePriceA11y.setAttribute('aria-hidden', 'false');\r\n            this.cache.priceA11y.setAttribute('aria-hidden', 'false');\r\n  \r\n            var savings = variant.compare_at_price - variant.price;\r\n  \r\n            if (theme.settings.saveType == 'percent') {\r\n              savings = Math.round(((savings) * 100) / variant.compare_at_price) + '%';\r\n            } else {\r\n              savings = theme.Currency.formatMoney(savings, theme.settings.moneyFormat);\r\n            }\r\n  \r\n            this.cache.savePrice.classList.remove(classes.hidden);\r\n            this.cache.savePrice.innerHTML = theme.strings.savePrice.replace('[saved_amount]', savings);\r\n          } else {\r\n            if (this.cache.priceWrapper) {\r\n              this.cache.priceWrapper.classList.add(classes.hidden);\r\n            }\r\n            this.cache.savePrice.classList.add(classes.hidden);\r\n            this.cache.price.classList.remove(classes.onSale);\r\n            if (this.cache.comparePriceA11y) {\r\n              this.cache.comparePriceA11y.setAttribute('aria-hidden', 'true');\r\n            }\r\n            this.cache.priceA11y.setAttribute('aria-hidden', 'true');\r\n          }\r\n        }\r\n      },\r\n  \r\n      updateUnitPrice: function(evt) {\r\n        var variant = evt.detail.variant;\r\n  \r\n        if (variant && variant.unit_price) {\r\n          this.container.querySelector(this.selectors.unitPrice).innerHTML = theme.Currency.formatMoney(variant.unit_price, theme.settings.moneyFormat);\r\n          this.container.querySelector(this.selectors.unitPriceBaseUnit).innerHTML = theme.Currency.getBaseUnit(variant);\r\n          this.container.querySelector(this.selectors.unitWrapper).classList.remove(classes.hidden);\r\n        } else {\r\n          this.container.querySelector(this.selectors.unitWrapper).classList.add(classes.hidden);\r\n        }\r\n      },\r\n  \r\n      imageSetArguments: function(variant) {\r\n        var variant = variant ? variant : (this.variants ? this.variants.currentVariant : null);\r\n        if (!variant) return;\r\n  \r\n        var setValue = this.settings.currentImageSet = this.getImageSetName(variant[this.settings.imageSetIndex]);\r\n        var set = this.settings.imageSetName + '_' + setValue;\r\n  \r\n        // Always start on index 0\r\n        this.settings.currentSlideIndex = 0;\r\n  \r\n        // Return object that adds cellSelector to mainSliderArgs\r\n        return {\r\n          cellSelector: '[data-group=\"'+set+'\"]',\r\n          imageSet: set,\r\n          initialIndex: this.settings.currentSlideIndex\r\n        }\r\n      },\r\n  \r\n      updateImageSet: function(evt) {\r\n        // If called directly, use current variant\r\n        var variant = evt ? evt.detail.variant : (this.variants ? this.variants.currentVariant : null);\r\n        if (!variant) {\r\n          return;\r\n        }\r\n  \r\n        var setValue = this.getImageSetName(variant[this.settings.imageSetIndex]);\r\n  \r\n        // Already on the current image group\r\n        if (this.settings.currentImageSet === setValue) {\r\n          return;\r\n        }\r\n  \r\n        this.initProductSlider(variant);\r\n      },\r\n  \r\n      // Show/hide thumbnails based on current image set\r\n      updateImageSetThumbs: function(set) {\r\n        this.cache.thumbSlider.querySelectorAll('.product__thumb-item').forEach(thumb => {\r\n          thumb.classList.toggle(classes.hidden, thumb.dataset.group !== set);\r\n        });\r\n      },\r\n  \r\n      getImageSetName: function(string) {\r\n        return string.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/-$/, '').replace(/^-/, '');\r\n      },\r\n  \r\n      updateSku: function(evt) {\r\n        var variant = evt.detail.variant;\r\n        var newSku = '';\r\n  \r\n        if (variant) {\r\n          if (variant.sku) {\r\n            newSku = variant.sku;\r\n          }\r\n  \r\n          this.container.querySelector(this.selectors.sku).textContent = newSku;\r\n        }\r\n      },\r\n  \r\n      updateInventory: function(evt) {\r\n        var variant = evt.detail.variant;\r\n  \r\n        // Override to display in stock message for sold out variants with policy set to continue\r\n        // Must be set to true in order to display in stock message for sold out variants\r\n        const inStockForOOSAndContinueSelling = false;\r\n  \r\n        if (!variant) {\r\n          // Variant is unavailable\r\n          // So we want to hide both the inventory quantity + incoming transfer notice\r\n          this.toggleInventoryQuantity('hidden', false);\r\n          this.toggleIncomingInventory(false);\r\n          return;\r\n        }\r\n  \r\n        // Inventory management is nil\r\n        // So we want to hide the low inventory message but show an In stock status\r\n        // And hide the incoming transfer notice\r\n        if (!variant.inventory_management) {\r\n          this.toggleInventoryQuantity('visible', false);\r\n          this.toggleIncomingInventory(false);\r\n          return;\r\n        }\r\n  \r\n        if (variant.inventory_management === 'shopify' && window.inventories && window.inventories[this.productId]) {\r\n          const variantInventoryObject = window.inventories[this.productId][variant.id];\r\n  \r\n          const { quantity, policy, incoming, next_incoming_date } = variantInventoryObject || {};\r\n  \r\n          this.toggleInventoryQuantity(undefined, quantity);\r\n  \r\n          if (inStockForOOSAndContinueSelling) {\r\n            if (quantity <= 0 && policy === 'continue') {\r\n              this.toggleInventoryQuantity('visible', false);\r\n              this.toggleIncomingInventory(false);\r\n              return;\r\n            }\r\n          }\r\n  \r\n          if ((incoming && !variant.available) || (quantity <= 0 && policy === 'continue')) {\r\n            this.toggleIncomingInventory(true, next_incoming_date, policy);\r\n          } else {\r\n            this.toggleIncomingInventory(false);\r\n          }\r\n        }\r\n      },\r\n  \r\n      updateAvailability: function(evt) {\r\n        var variant = evt.detail.variant;\r\n        if (!variant) {\r\n          return;\r\n        }\r\n  \r\n        this.storeAvailability.updateContent(variant.id);\r\n      },\r\n  \r\n      toggleInventoryQuantity: function(state = undefined, quantity) {\r\n        const productInventoryEl = this.container.querySelector(this.selectors.inventory);\r\n        const inventorySalesPoint = productInventoryEl.closest('.sales-point');\r\n  \r\n        if (state && state === 'hidden') {\r\n          // variant is unavailable\r\n          // hide and return\r\n          if (inventorySalesPoint) {\r\n            inventorySalesPoint.classList.add(classes.hidden);\r\n          }\r\n  \r\n          return;\r\n        }\r\n  \r\n        let showLowInventoryMessage = false;\r\n  \r\n        // Check if we should show low inventory message\r\n        if (parseInt(quantity) <= parseInt(this.settings.inventoryThreshold) && parseInt(quantity) > 0) {\r\n          showLowInventoryMessage = true;\r\n        }\r\n  \r\n        if (parseInt(quantity) > 0 || (state && state === 'visible')) {\r\n          if (showLowInventoryMessage) {\r\n            productInventoryEl.parentNode.classList.add(classes.lowInventory);\r\n            if (quantity > 1) {\r\n              productInventoryEl.textContent = theme.strings.otherStockLabel.replace('[count]', quantity);\r\n            } else {\r\n              productInventoryEl.textContent = theme.strings.oneStockLabel.replace('[count]', quantity);\r\n            }\r\n          } else {\r\n            productInventoryEl.parentNode.classList.remove(classes.lowInventory);\r\n            productInventoryEl.textContent = theme.strings.inStockLabel;\r\n          }\r\n  \r\n          if (inventorySalesPoint) {\r\n            inventorySalesPoint.classList.remove(classes.hidden);\r\n          }\r\n  \r\n        } else {\r\n          if (inventorySalesPoint) {\r\n            inventorySalesPoint.classList.add(classes.hidden);\r\n          }\r\n        }\r\n      },\r\n  \r\n      toggleIncomingInventory: function(showIncomingInventory, incomingInventoryDate, policy) {\r\n  \r\n        const incomingInventoryEl = this.container.querySelector(this.selectors.incomingInventory);\r\n        const incomingInventoryIcon = incomingInventoryEl.querySelector('.icon-and-text');\r\n  \r\n        if (!incomingInventoryEl) return;\r\n  \r\n        const incomingInventoryBlockEnabled = incomingInventoryEl.dataset.enabled === 'true';\r\n        const textEl = incomingInventoryEl.querySelector('.js-incoming-text');\r\n  \r\n        // If incoming inventory block is disabled, hide it\r\n        if (!incomingInventoryBlockEnabled) {\r\n          incomingInventoryEl.classList.add(classes.hidden);\r\n          return;\r\n        }\r\n  \r\n        if (showIncomingInventory) {\r\n          if (incomingInventoryDate) {\r\n            textEl.textContent = theme.strings.willBeInStockAfter.replace('[date]', incomingInventoryDate);\r\n            incomingInventoryEl.classList.remove(classes.hidden);\r\n          } else {\r\n            textEl.textContent = theme.strings.waitingForStock;\r\n            incomingInventoryEl.classList.remove(classes.hidden);\r\n          }\r\n  \r\n          // When OOS and incoming inventory and continue selling disabled, update icon to low inventory\r\n          if (incomingInventoryIcon) {\r\n            if (policy !== 'continue') {\r\n              incomingInventoryIcon.classList.add(classes.lowInventory);\r\n            } else {\r\n              incomingInventoryIcon.classList.remove(classes.lowInventory);\r\n            }\r\n          }\r\n  \r\n        } else {\r\n          incomingInventoryEl.classList.add(classes.hidden);\r\n        }\r\n      },\r\n  \r\n      /*============================================================================\r\n        Product videos\r\n      ==============================================================================*/\r\n      videoSetup: function() {\r\n        var productVideos = this.cache.mainSlider.querySelectorAll(selectors.productVideo);\r\n  \r\n        if (!productVideos.length) {\r\n          return false;\r\n        }\r\n  \r\n        productVideos.forEach(vid => {\r\n          var type = vid.dataset.videoType;\r\n          if (type === 'youtube') {\r\n            this.initYoutubeVideo(vid);\r\n          } else if (type === 'vimeo') {\r\n            this.initVimeoVideo(vid);\r\n          } else if (type === 'mp4') {\r\n            this.initMp4Video(vid);\r\n          }\r\n        });\r\n      },\r\n  \r\n      initYoutubeVideo: function(div) {\r\n        videoObjects[div.id] = new theme.YouTube(\r\n          div.id,\r\n          {\r\n            videoId: div.dataset.videoId,\r\n            videoParent: selectors.videoParent,\r\n            autoplay: false, // will handle this in callback\r\n            style: div.dataset.videoStyle,\r\n            loop: div.dataset.videoLoop,\r\n            events: {\r\n              onReady: this.youtubePlayerReady.bind(this),\r\n              onStateChange: this.youtubePlayerStateChange.bind(this)\r\n            }\r\n          }\r\n        );\r\n      },\r\n  \r\n      initVimeoVideo: function(div) {\r\n        videoObjects[div.id] = new theme.VimeoPlayer(\r\n          div.id,\r\n          div.dataset.videoId,\r\n          {\r\n            videoParent: selectors.videoParent,\r\n            autoplay: false,\r\n            style: div.dataset.videoStyle,\r\n            loop: div.dataset.videoLoop,\r\n          }\r\n        )\r\n      },\r\n  \r\n      // Comes from YouTube SDK\r\n      // Get iframe ID with evt.target.getIframe().id\r\n      // Then access product video players with videoObjects[id]\r\n      youtubePlayerReady: function(evt) {\r\n        var iframeId = evt.target.getIframe().id;\r\n  \r\n        if (!videoObjects[iframeId]) {\r\n          // No youtube player data\r\n          return;\r\n        }\r\n  \r\n        var obj = videoObjects[iframeId];\r\n        var player = obj.videoPlayer;\r\n  \r\n        if (obj.options.style !== 'sound') {\r\n          player.mute();\r\n        }\r\n  \r\n        obj.parent.classList.remove('loading');\r\n        obj.parent.classList.add('loaded');\r\n        obj.parent.classList.add('video-interactable'); // Previously, video was only interactable after slide change\r\n  \r\n        // If we have an element, it is in the visible/first slide,\r\n        // and is muted, play it\r\n        if (this._isFirstSlide(iframeId) && obj.options.style !== 'sound') {\r\n          player.playVideo();\r\n        }\r\n      },\r\n  \r\n      _isFirstSlide: function(id) {\r\n        return this.cache.mainSlider.querySelector(selectors.startingSlide + ' ' + '#' + id);\r\n      },\r\n  \r\n      youtubePlayerStateChange: function(evt) {\r\n        var iframeId = evt.target.getIframe().id;\r\n        var obj = videoObjects[iframeId];\r\n  \r\n        switch (evt.data) {\r\n          case -1: // unstarted\r\n            // Handle low power state on iOS by checking if\r\n            // video is reset to unplayed after attempting to buffer\r\n            if (obj.attemptedToPlay) {\r\n              obj.parent.classList.add('video-interactable');\r\n            }\r\n            break;\r\n          case 0: // ended\r\n            if (obj && obj.options.loop === 'true') {\r\n              obj.videoPlayer.playVideo();\r\n            }\r\n            break;\r\n          case 3: // buffering\r\n            obj.attemptedToPlay = true;\r\n            break;\r\n        }\r\n      },\r\n  \r\n      initMp4Video: function(div) {\r\n        videoObjects[div.id] = {\r\n          id: div.id,\r\n          type: 'mp4'\r\n        };\r\n  \r\n        if (this._isFirstSlide(div.id)) {\r\n          this.playMp4Video(div.id);\r\n        }\r\n      },\r\n  \r\n      stopVideos: function() {\r\n        for (var [id, vid] of Object.entries(videoObjects)) {\r\n          if (vid.videoPlayer) {\r\n            if (typeof vid.videoPlayer.stopVideo === 'function') {\r\n              vid.videoPlayer.stopVideo(); // YouTube player\r\n            }\r\n          } else if (vid.type === 'mp4') {\r\n            this.stopMp4Video(vid.id); // MP4 player\r\n          }\r\n        }\r\n      },\r\n  \r\n      _getVideoType: function(video) {\r\n        return video.getAttribute('data-video-type');\r\n      },\r\n  \r\n      _getVideoDivId: function(video) {\r\n        return video.id;\r\n      },\r\n  \r\n      playMp4Video: function(id) {\r\n        var player = this.container.querySelector('#' + id);\r\n        var playPromise = player.play();\r\n  \r\n        if (playPromise !== undefined) {\r\n          playPromise.then(function() {\r\n            // Playing as expected\r\n          })\r\n          .catch(function(error) {\r\n            // Likely low power mode on iOS, show controls\r\n            player.setAttribute('controls', '');\r\n            player.closest(selectors.videoParent).setAttribute('data-video-style', 'unmuted');\r\n          });\r\n        }\r\n      },\r\n  \r\n      stopMp4Video: function(id) {\r\n        var player = this.container.querySelector('#' + id);\r\n        if (player && typeof player.pause === 'function') {\r\n          player.pause();\r\n        }\r\n      },\r\n  \r\n      /*============================================================================\r\n        Product images\r\n      ==============================================================================*/\r\n      initImageZoom: function() {\r\n        var container = this.container.querySelector(this.selectors.imageContainer);\r\n        if (!container) {\r\n          return;\r\n        }\r\n        var imageZoom = new theme.Photoswipe(container, this.sectionId);\r\n        container.addEventListener('photoswipe:afterChange', function(evt) {\r\n          if (this.flickity) {\r\n            this.flickity.goToSlide(evt.detail.index);\r\n          }\r\n        }.bind(this));\r\n      },\r\n  \r\n      getThumbIndex: function(target) {\r\n        return target.dataset.index;\r\n      },\r\n  \r\n      updateVariantImage: function(evt) {\r\n        var variant = evt.detail.variant;\r\n        var sizedImgUrl = theme.Images.getSizedImageUrl(variant.featured_media.preview_image.src, this.settings.imageSize);\r\n  \r\n        var newImage = this.container.querySelector('.product__thumb[data-id=\"' + variant.featured_media.id + '\"]');\r\n        var imageIndex = this.getThumbIndex(newImage);\r\n  \r\n        // If there is no index, slider is not initalized\r\n        if (typeof imageIndex === 'undefined') {\r\n          return;\r\n        }\r\n  \r\n        // Go to that variant image's slide\r\n        if (this.flickity) {\r\n          this.flickity.goToSlide(imageIndex);\r\n        }\r\n      },\r\n  \r\n      initProductSlider: function(variant) {\r\n        // Stop if only a single image, but add active class to first slide\r\n        if (this.cache.mainSlider.querySelectorAll(selectors.slide).length <= 1) {\r\n          var slide = this.cache.mainSlider.querySelector(selectors.slide);\r\n          if (slide) {\r\n            slide.classList.add('is-selected');\r\n          }\r\n          return;\r\n        }\r\n  \r\n        // Destroy slider in preparation of new initialization\r\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\r\n          this.flickity.destroy();\r\n        }\r\n  \r\n        // If variant argument exists, slideshow is reinitializing because of the\r\n        // image set feature enabled and switching to a new group.\r\n        // currentSlideIndex\r\n        if (!variant) {\r\n          var activeSlide = this.cache.mainSlider.querySelector(selectors.startingSlide);\r\n          this.settings.currentSlideIndex = this._slideIndex(activeSlide);\r\n        }\r\n  \r\n        var mainSliderArgs = {\r\n          dragThreshold: 25,\r\n          adaptiveHeight: true,\r\n          avoidReflow: true,\r\n          initialIndex: this.settings.currentSlideIndex,\r\n          childNav: this.cache.thumbSlider,\r\n          childNavScroller: this.cache.thumbScroller,\r\n          childVertical: this.cache.thumbSlider.dataset.position === 'beside',\r\n          pageDots: true, // mobile only with CSS\r\n          wrapAround: true,\r\n          callbacks: {\r\n            onInit: this.onSliderInit.bind(this),\r\n            onChange: this.onSlideChange.bind(this)\r\n          }\r\n        };\r\n  \r\n        // Override default settings if image set feature enabled\r\n        if (this.settings.imageSetName) {\r\n          var imageSetArgs = this.imageSetArguments(variant);\r\n          mainSliderArgs = Object.assign({}, mainSliderArgs, imageSetArgs);\r\n          this.updateImageSetThumbs(mainSliderArgs.imageSet);\r\n        }\r\n  \r\n        this.flickity = new theme.Slideshow(this.cache.mainSlider, mainSliderArgs);\r\n      },\r\n  \r\n      onSliderInit: function(slide) {\r\n        // If slider is initialized with image set feature active,\r\n        // initialize any videos/media when they are first slide\r\n        if (this.settings.imageSetName) {\r\n          this.prepMediaOnSlide(slide);\r\n        }\r\n      },\r\n  \r\n      onSlideChange: function(index) {\r\n        if (!this.flickity) return;\r\n  \r\n        var prevSlide = this.cache.mainSlider.querySelector('.product-main-slide[data-index=\"'+this.settings.currentSlideIndex+'\"]');\r\n  \r\n        // If imageSetName exists, use a more specific selector\r\n        var nextSlide = this.settings.imageSetName ?\r\n                        this.cache.mainSlider.querySelectorAll('.flickity-slider .product-main-slide')[index] :\r\n                        this.cache.mainSlider.querySelector('.product-main-slide[data-index=\"'+index+'\"]');\r\n  \r\n        prevSlide.setAttribute('tabindex', '-1');\r\n        nextSlide.setAttribute('tabindex', 0);\r\n  \r\n        // Pause any existing slide video/media\r\n        this.stopMediaOnSlide(prevSlide);\r\n  \r\n        // Prep next slide video/media\r\n        this.prepMediaOnSlide(nextSlide);\r\n  \r\n        // Update current slider index\r\n        this.settings.currentSlideIndex = index;\r\n      },\r\n  \r\n      stopMediaOnSlide(slide) {\r\n        // Stop existing video\r\n        var video = slide.querySelector(selectors.productVideo);\r\n        if (video) {\r\n          var videoType = this._getVideoType(video);\r\n          var videoId = this._getVideoDivId(video);\r\n          if (videoType === 'youtube') {\r\n            if (videoObjects[videoId].videoPlayer) {\r\n              videoObjects[videoId].videoPlayer.stopVideo();\r\n              return;\r\n            }\r\n          } else if (videoType === 'mp4') {\r\n            this.stopMp4Video(videoId);\r\n            return;\r\n          }\r\n        }\r\n  \r\n        // Stop existing media\r\n        var currentMedia = slide.querySelector(this.selectors.media);\r\n        if (currentMedia) {\r\n          currentMedia.dispatchEvent(\r\n            new CustomEvent('mediaHidden', {\r\n              bubbles: true,\r\n              cancelable: true\r\n            })\r\n          );\r\n        }\r\n      },\r\n  \r\n      prepMediaOnSlide(slide) {\r\n        var video = slide.querySelector(selectors.productVideo);\r\n        if (video) {\r\n          this.flickity.reposition();\r\n          var videoType = this._getVideoType(video);\r\n          var videoId = this._getVideoDivId(video);\r\n          if (videoType === 'youtube') {\r\n            if (videoObjects[videoId].videoPlayer && videoObjects[videoId].options.style !== 'sound') {\r\n              videoObjects[videoId].videoPlayer.playVideo();\r\n              return;\r\n            }\r\n          } else if (videoType === 'mp4') {\r\n            this.playMp4Video(videoId);\r\n          }\r\n        }\r\n  \r\n        var nextMedia = slide.querySelector(this.selectors.media);\r\n        if (nextMedia) {\r\n          nextMedia.dispatchEvent(\r\n            new CustomEvent('mediaVisible', {\r\n              bubbles: true,\r\n              cancelable: true\r\n            })\r\n          );\r\n          slide.querySelector('.shopify-model-viewer-ui__button').setAttribute('tabindex', 0);\r\n          slide.querySelector('.product-single__close-media').setAttribute('tabindex', 0);\r\n        }\r\n      },\r\n  \r\n      _slideIndex: function(el) {\r\n        return el.getAttribute('data-index');\r\n      },\r\n  \r\n      /*============================================================================\r\n        Products when in quick view modal\r\n      ==============================================================================*/\r\n      openModalProduct: function() {\r\n        var initialized = false;\r\n  \r\n        if (!this.settings.modalInit) {\r\n          this.blocksHolder = this.container.querySelector(selectors.blocksHolder);\r\n          var url = this.blocksHolder.dataset.url;\r\n  \r\n          fetch(url).then(function(response) {\r\n            return response.text();\r\n          }).then(function(html) {\r\n            var parser = new DOMParser();\r\n            var doc = parser.parseFromString(html, 'text/html');\r\n            var blocks = doc.querySelector(selectors.blocks);\r\n  \r\n            // Because the same product could be opened in quick view\r\n            // on the page we load the form elements from, we need to\r\n            // update any `id`, `for`, and `form` attributes\r\n            blocks.querySelectorAll('[id]').forEach(el => {\r\n              // Update input `id`\r\n              var val = el.getAttribute('id');\r\n              el.setAttribute('id', val + '-modal');\r\n  \r\n              // Update related label if it exists\r\n              var label = blocks.querySelector(`[for=\"${val}\"]`);\r\n              if (label) {\r\n                label.setAttribute('for', val + '-modal');\r\n              }\r\n  \r\n              // Update any collapsible elements\r\n              var collapsibleTrigger = blocks.querySelector(`[aria-controls=\"${val}\"]`);\r\n              if (collapsibleTrigger) {\r\n                collapsibleTrigger.setAttribute('aria-controls', val + '-modal');\r\n              }\r\n            });\r\n  \r\n            // Update any elements with `form` attribute.\r\n            // Form element already has `-modal` appended\r\n            var form = blocks.querySelector(this.selectors.form);\r\n            if (form) {\r\n              var formId = form.getAttribute('id');\r\n              blocks.querySelectorAll('[form]').forEach(el => {\r\n                el.setAttribute('form', formId);\r\n              });\r\n            }\r\n  \r\n            this.blocksHolder.innerHTML = '';\r\n            this.blocksHolder.append(blocks);\r\n            this.blocksHolder.classList.add('product-form-holder--loaded');\r\n  \r\n            this.cacheElements();\r\n  \r\n            this.formSetup();\r\n            this.updateModalProductInventory();\r\n  \r\n            if (Shopify && Shopify.PaymentButton) {\r\n              Shopify.PaymentButton.init();\r\n            }\r\n  \r\n            // Re-hook up collapsible box triggers\r\n            theme.collapsibles.init(this.container);\r\n  \r\n            document.dispatchEvent(new CustomEvent('quickview:loaded', {\r\n              detail: {\r\n                productId: this.productId\r\n              }\r\n            }));\r\n          }.bind(this));\r\n  \r\n          this.productSetup();\r\n          this.videoSetup();\r\n  \r\n          // Enable product slider in quick view\r\n          // 1. with image sets enabled, make sure we have this.variants before initializing\r\n          // 2. initialize normally, form data not required\r\n          if (this.settings.imageSetName) {\r\n            if (this.variants) {\r\n              this.initProductSlider();\r\n            } else {\r\n              document.addEventListener('quickview:loaded', function(evt) {\r\n                if (evt.detail.productId === this.productId) {\r\n                  this.initProductSlider();\r\n                }\r\n              }.bind(this));\r\n            }\r\n          } else {\r\n            this.initProductSlider();\r\n          }\r\n          this.customMediaListners();\r\n          this.addIdToRecentlyViewed();\r\n          this.settings.modalInit = true;\r\n        } else {\r\n          initialized = true;\r\n        }\r\n  \r\n        AOS.refreshHard();\r\n  \r\n        document.dispatchEvent(new CustomEvent('quickview:open', {\r\n          detail: {\r\n            initialized: initialized,\r\n            productId: this.productId\r\n          }\r\n        }));\r\n      },\r\n  \r\n      // Recommended products load via JS and don't add variant inventory to the\r\n      // global variable that we later check. This function scrapes a data div\r\n      // to get that info and manually add the values.\r\n      updateModalProductInventory: function() {\r\n        window.inventories = window.inventories || {};\r\n        this.container.querySelectorAll('.js-product-inventory-data').forEach(el => {\r\n          var productId = el.dataset.productId;\r\n          window.inventories[productId] = {};\r\n  \r\n          el.querySelectorAll('.js-variant-inventory-data').forEach(el => {\r\n            window.inventories[productId][el.dataset.id] = {\r\n              'quantity': el.dataset.quantity,\r\n              'policy': el.dataset.policy,\r\n              'incoming': el.dataset.incoming,\r\n              'next_incoming_date': el.dataset.date\r\n            }\r\n          });\r\n        });\r\n      },\r\n  \r\n      closeModalProduct: function() {\r\n        this.stopVideos();\r\n      },\r\n  \r\n      /*============================================================================\r\n        Product media (3D)\r\n      ==============================================================================*/\r\n      initModelViewerLibraries: function() {\r\n        var modelViewerElements = this.container.querySelectorAll(this.selectors.media);\r\n        if (modelViewerElements.length < 1) return;\r\n  \r\n        theme.ProductMedia.init(modelViewerElements, this.sectionId);\r\n      },\r\n  \r\n      initShopifyXrLaunch: function() {\r\n        document.addEventListener(\r\n          'shopify_xr_launch',\r\n          function() {\r\n            var currentMedia = this.container.querySelector(\r\n              this.selectors.productMediaWrapper +\r\n                ':not(.' +\r\n                self.classes.hidden +\r\n                ')'\r\n            );\r\n            currentMedia.dispatchEvent(\r\n              new CustomEvent('xrLaunch', {\r\n                bubbles: true,\r\n                cancelable: true\r\n              })\r\n            );\r\n          }.bind(this)\r\n        );\r\n      },\r\n  \r\n      customMediaListners: function() {\r\n        document.querySelectorAll(this.selectors.closeMedia).forEach(el => {\r\n          el.addEventListener('click', function() {\r\n            var slide = this.cache.mainSlider.querySelector(selectors.currentSlide);\r\n            var media = slide.querySelector(this.selectors.media);\r\n            if (media) {\r\n              media.dispatchEvent(\r\n                new CustomEvent('mediaHidden', {\r\n                  bubbles: true,\r\n                  cancelable: true\r\n                })\r\n              );\r\n            }\r\n          }.bind(this))\r\n        });\r\n  \r\n        var modelViewers = this.container.querySelectorAll('model-viewer');\r\n        if (modelViewers.length) {\r\n          modelViewers.forEach(el => {\r\n            el.addEventListener('shopify_model_viewer_ui_toggle_play', function(evt) {\r\n              this.mediaLoaded(evt);\r\n            }.bind(this));\r\n  \r\n            el.addEventListener('shopify_model_viewer_ui_toggle_pause', function(evt) {\r\n              this.mediaUnloaded(evt);\r\n            }.bind(this));\r\n          });\r\n        }\r\n      },\r\n  \r\n      mediaLoaded: function(evt) {\r\n        this.container.querySelectorAll(this.selectors.closeMedia).forEach(el => {\r\n          el.classList.remove(classes.hidden);\r\n        });\r\n  \r\n        if (this.flickity) {\r\n          this.flickity.setDraggable(false);\r\n        }\r\n      },\r\n  \r\n      mediaUnloaded: function(evt) {\r\n        this.container.querySelectorAll(this.selectors.closeMedia).forEach(el => {\r\n          el.classList.add(classes.hidden);\r\n        });\r\n  \r\n        if (this.flickity) {\r\n          this.flickity.setDraggable(true);\r\n        }\r\n      },\r\n  \r\n      onUnload: function() {\r\n        theme.ProductMedia.removeSectionModels(this.sectionId);\r\n  \r\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\r\n          this.flickity.destroy();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return Product;\r\n  })();\r\n  \r\n  theme.RecentlyViewed = (function() {\r\n    var init = false;\r\n  \r\n    function RecentlyViewed(container) {\r\n      if (!container) {\r\n        return;\r\n      }\r\n  \r\n      this.container = container;\r\n      this.sectionId = this.container.getAttribute('data-section-id');\r\n      this.namespace = '.recently-viewed' + this.sectionId;\r\n      this.gridItemWidth = this.container.getAttribute('data-grid-item-class');\r\n      this.rowOf = this.container.getAttribute('data-row-of');\r\n      this.imageSizes = this.container.getAttribute('data-image-sizes');\r\n  \r\n      theme.initWhenVisible({\r\n        element: this.container,\r\n        callback: this.init.bind(this),\r\n        threshold: 600\r\n      });\r\n    };\r\n  \r\n    RecentlyViewed.prototype = Object.assign({}, RecentlyViewed.prototype, {\r\n      init: function() {\r\n        if (init) {\r\n          return;\r\n        }\r\n  \r\n        init = true;\r\n  \r\n        if (Object.keys(theme.recentlyViewed.recent).length === 0 && theme.recentlyViewed.recent.constructor === Object) {\r\n          // No previous history on page load, so bail\r\n          this.container.classList.add('hide');\r\n          return;\r\n        }\r\n  \r\n        this.outputContainer = document.getElementById('RecentlyViewed-' + this.sectionId);\r\n        this.handle = this.container.getAttribute('data-product-handle');\r\n  \r\n        // Request new product info via JS API\r\n        var promises = [];\r\n        Object.keys(theme.recentlyViewed.recent).forEach(function (handle) {\r\n          if (handle !== 'undefined') {\r\n            promises.push(this.getProductInfo(handle));\r\n          }\r\n        }.bind(this));\r\n  \r\n        Promise.all(promises).then(function(result) {\r\n          this.setupOutput(result);\r\n          this.captureProductDetails(result);\r\n        }.bind(this));\r\n      },\r\n  \r\n      getProductInfo: function(handle) {\r\n        return new Promise(function(resolve, reject) {\r\n          if (theme.recentlyViewed.productInfo.hasOwnProperty(handle)) {\r\n            resolve(theme.recentlyViewed.productInfo[handle]);\r\n          } else {\r\n            fetch('/products/'+ handle +'.js').then(function(response) {\r\n              return response.text();\r\n            }).then(function(product) {\r\n              resolve(product);\r\n            });\r\n          }\r\n        });\r\n      },\r\n  \r\n      setupOutput: function(products) {\r\n        var allProducts = [];\r\n        var data = {};\r\n        var limit = this.container.getAttribute('data-recent-count');\r\n  \r\n        var i = 0;\r\n  \r\n        Object.keys(products).forEach(function (key) {\r\n          if (!products[key]) {\r\n            return;\r\n          }\r\n          var product = JSON.parse(products[key]);\r\n  \r\n          // Ignore current product\r\n          if (product.handle === this.handle) {\r\n            return;\r\n          }\r\n  \r\n          // Ignore undefined key\r\n          if (typeof product.handle == 'undefined') {\r\n            return;\r\n          }\r\n  \r\n          i++;\r\n  \r\n          // New or formatted properties\r\n          const widths = [180, 360, 540, 720, 900];\r\n          product.url = theme.recentlyViewed.recent[product.handle] ? theme.recentlyViewed.recent[product.handle].url : product.url;\r\n          product.image_responsive_url = theme.Images.buildImagePath(product.featured_image),\r\n          product.image_responsive_urls = theme.Images.buildImagePath(product.featured_image, widths),\r\n          product.image_aspect_ratio = theme.recentlyViewed.recent[product.handle].aspectRatio;\r\n  \r\n          // Unit pricing checks first variant\r\n          var firstVariant = product.variants[0];\r\n          if (firstVariant && firstVariant.unit_price) {\r\n            var baseUnit = '';\r\n  \r\n            if (firstVariant.unit_price_measurement) {\r\n              if (firstVariant.unit_price_measurement.reference_value != 1) {\r\n                baseUnit += firstVariant.unit_price_measurement.reference_value + ' ';\r\n              }\r\n              baseUnit += firstVariant.unit_price_measurement.reference_unit;\r\n            }\r\n  \r\n            product.unit_price = theme.Currency.formatMoney(firstVariant.unit_price);\r\n            if (baseUnit != '') {\r\n              product.unit_price += '/' + baseUnit;\r\n            }\r\n          }\r\n  \r\n          allProducts.unshift(product);\r\n        }.bind(this));\r\n  \r\n        if (allProducts.length === 0) {\r\n          this.container.classList.add('hide');\r\n          return;\r\n        }\r\n  \r\n        var productMarkup = theme.buildProductGridItem(allProducts.slice(0, limit), this.gridItemWidth, this.rowOf, this.imageSizes);\r\n  \r\n        this.outputContainer.innerHTML = productMarkup;\r\n  \r\n        if (AOS) {\r\n          AOS.refreshHard();\r\n        }\r\n      },\r\n  \r\n      captureProductDetails: function(products) {\r\n        for (var i = 0; i < products.length; i++) {\r\n          var product = products[i];\r\n          theme.recentlyViewed.productInfo[product.handle] = product;\r\n        }\r\n  \r\n        // Add data to session storage to reduce API requests later\r\n        if (theme.config.hasSessionStorage) {\r\n          sessionStorage.setItem('recent-products', JSON.stringify(theme.recentlyViewed.productInfo));\r\n        }\r\n      },\r\n  \r\n      onUnload: function() {\r\n        init = false;\r\n      }\r\n    });\r\n  \r\n    return RecentlyViewed;\r\n  })();\r\n  \r\n  theme.Testimonials = (function() {\r\n    var defaults = {\r\n      adaptiveHeight: true,\r\n      avoidReflow: true,\r\n      pageDots: true,\r\n      prevNextButtons: false\r\n    };\r\n  \r\n    function Testimonials(container) {\r\n      this.container = container;\r\n      this.timeout;\r\n      var sectionId = container.getAttribute('data-section-id');\r\n      this.slideshow = container.querySelector('#Testimonials-' + sectionId);\r\n      this.namespace = '.testimonial-' + sectionId;\r\n  \r\n      if (!this.slideshow) { return }\r\n  \r\n      theme.initWhenVisible({\r\n        element: this.container,\r\n        callback: this.init.bind(this),\r\n        threshold: 600\r\n      });\r\n    }\r\n  \r\n    Testimonials.prototype = Object.assign({}, Testimonials.prototype, {\r\n      init: function() {\r\n        // Do not wrap when only a few blocks\r\n        if (this.slideshow.dataset.count <= 3) {\r\n          defaults.wrapAround = false;\r\n        }\r\n  \r\n        this.flickity = new theme.Slideshow(this.slideshow, defaults);\r\n  \r\n        // Autoscroll to next slide on load to indicate more blocks\r\n        if (this.slideshow.dataset.count > 2) {\r\n          this.timeout = setTimeout(function() {\r\n            this.flickity.goToSlide(1);\r\n          }.bind(this), 1000);\r\n        }\r\n      },\r\n  \r\n      onUnload: function() {\r\n        if (this.flickity && typeof this.flickity.destroy === 'function') {\r\n          this.flickity.destroy();\r\n        }\r\n      },\r\n  \r\n      onDeselect: function() {\r\n        if (this.flickity && typeof this.flickity.play === 'function') {\r\n          this.flickity.play();\r\n        }\r\n      },\r\n  \r\n      onBlockSelect: function(evt) {\r\n        var slide = this.slideshow.querySelector('.testimonials-slide--' + evt.detail.blockId)\r\n        var index = parseInt(slide.dataset.index);\r\n  \r\n        clearTimeout(this.timeout);\r\n  \r\n        if (this.flickity && typeof this.flickity.pause === 'function') {\r\n          this.flickity.goToSlide(index);\r\n          this.flickity.pause();\r\n        }\r\n      },\r\n  \r\n      onBlockDeselect: function() {\r\n        if (this.flickity && typeof this.flickity.play === 'function') {\r\n          this.flickity.play();\r\n        }\r\n      }\r\n    });\r\n  \r\n    return Testimonials;\r\n  })();\r\n  \r\n\r\n  theme.isStorageSupported = function(type) {\r\n    // Return false if we are in an iframe without access to sessionStorage\r\n    if (window.self !== window.top) {\r\n      return false;\r\n    }\r\n\r\n    var testKey = 'test';\r\n    var storage;\r\n    if (type === 'session') {\r\n      storage = window.sessionStorage;\r\n    }\r\n    if (type === 'local') {\r\n      storage = window.localStorage;\r\n    }\r\n\r\n    try {\r\n      storage.setItem(testKey, '1');\r\n      storage.removeItem(testKey);\r\n      return true;\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  theme.reinitProductGridItem = function(scope) {\r\n    if (AOS) {AOS.refreshHard()}\r\n\r\n    if (!document.documentElement.classList.contains('modal-open')) {\r\n      theme.initQuickShop();\r\n    }\r\n\r\n    // Re-hook up collapsible box triggers\r\n    theme.collapsibles.init();\r\n  };\r\n\r\n  /*============================================================================\r\n    Things that don't require DOM to be ready\r\n  ==============================================================================*/\r\n  theme.config.hasSessionStorage = theme.isStorageSupported('session');\r\n  theme.config.hasLocalStorage = theme.isStorageSupported('local');\r\n  AOS.init({\r\n    easing: 'ease-out-quad',\r\n    once: true,\r\n    offset: 60,\r\n    disableMutationObserver: true\r\n  });\r\n\r\n  if (theme.config.hasLocalStorage) {\r\n    theme.recentlyViewed.localStorage = window.localStorage.getItem('theme-recent');\r\n\r\n    if (theme.recentlyViewed.localStorage) {\r\n      theme.recentlyViewed.recent = JSON.parse(theme.recentlyViewed.localStorage);\r\n    }\r\n  }\r\n\r\n  theme.recentlyViewed.productInfo = theme.config.hasSessionStorage && sessionStorage['recent-products'] ? JSON.parse(sessionStorage['recent-products']) : {};\r\n\r\n  // Trigger events when going between breakpoints\r\n  theme.config.bpSmall = matchMedia(theme.config.mediaQuerySmall).matches;\r\n  matchMedia(theme.config.mediaQuerySmall).addListener(function(mql) {\r\n    if (mql.matches) {\r\n      theme.config.bpSmall = true;\r\n      document.dispatchEvent(new CustomEvent('matchSmall'));\r\n    }\r\n    else {\r\n      theme.config.bpSmall = false;\r\n      document.dispatchEvent(new CustomEvent('unmatchSmall'));\r\n    }\r\n  });\r\n\r\n  /*============================================================================\r\n    Things that require DOM to be ready\r\n  ==============================================================================*/\r\n  function DOMready(callback) {\r\n    if (document.readyState != 'loading') callback();\r\n    else document.addEventListener('DOMContentLoaded', callback);\r\n  }\r\n\r\n  // Load generic JS. Also reinitializes when sections are\r\n  // added, edited, or removed in Shopify's editor\r\n  theme.initGlobals = function() {\r\n    theme.collapsibles.init();\r\n    theme.videoModal();\r\n  }\r\n\r\n  DOMready(function(){\r\n    theme.sections = new theme.Sections();\r\n\r\n    theme.sections.register('slideshow-section', theme.SlideshowSection);\r\n    theme.sections.register('header', theme.HeaderSection);\r\n    theme.sections.register('product', theme.Product);\r\n    theme.sections.register('blog', theme.Blog);\r\n    theme.sections.register('password-header', theme.PasswordHeader);\r\n    theme.sections.register('photoswipe', theme.Photoswipe);\r\n    theme.sections.register('background-image', theme.BackgroundImage);\r\n    theme.sections.register('testimonials', theme.Testimonials);\r\n    theme.sections.register('video-section', theme.VideoSection);\r\n    theme.sections.register('map', theme.Maps);\r\n    theme.sections.register('footer-section', theme.FooterSection);\r\n    theme.sections.register('store-availability', theme.StoreAvailability);\r\n    theme.sections.register('recently-viewed', theme.RecentlyViewed);\r\n    theme.sections.register('newsletter-popup', theme.NewsletterPopup);\r\n    theme.sections.register('collection-header', theme.CollectionHeader);\r\n    theme.sections.register('collection-grid', theme.Collection);\r\n\r\n    theme.initGlobals();\r\n    theme.initQuickShop();\r\n    theme.rteInit();\r\n\r\n    if (document.body.classList.contains('template-cart')) {\r\n      var cartPageForm = document.getElementById('CartPageForm');\r\n      if (cartPageForm) {\r\n        new theme.CartForm(cartPageForm);\r\n      }\r\n    }\r\n\r\n    if (theme.settings.isCustomerTemplate) {\r\n      theme.customerTemplates();\r\n    }\r\n\r\n    document.dispatchEvent(new CustomEvent('page:loaded'));\r\n  });\r\n\r\n// Toggle pesquisa inline\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  const searchToggle = document.querySelector('.js-search-toggle');\r\n  const searchForm = document.querySelector('.inline-search-form');\r\n  \r\n  if (searchToggle && searchForm) {\r\n    searchToggle.addEventListener('click', function(e) {\r\n      e.preventDefault();\r\n      searchForm.style.display = searchForm.style.display === 'none' ? 'block' : 'none';\r\n      if (searchForm.style.display === 'block') {\r\n        searchForm.querySelector('.inline-search-input').focus();\r\n      }\r\n    });\r\n  }\r\n});\r\n\r\n// === CDM: Tracking centralizado para eventos de ecommerce ===\n(function (window) {\n  if (window.CDMTracking && window.CDMTracking.version === '2.1.4') return;\n\n  const DEDUPE_TTL = 1500;\n  const ADD_TO_CART_DEDUPE_TTL = 2000;\n  const ADD_TO_CART_INTERACTION_TTL = 30000;\n  const recentEvents = new Map();\n  const addToCartInteraction = {\n    id: 0,\n    at: 0,\n    consumed: true\n  };\n\n  function getCurrency(payload) {\n    return payload.currency || (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'BRL';\n  }\n\n  function moneyFromCents(value) {\n    if (value == null || value === '') return undefined;\n    const numberValue = Number(value);\n    if (Number.isNaN(numberValue)) return undefined;\n    return numberValue / 100;\n  }\n\n  function normalizePriceValue(value) {\n    if (value == null || value === '') return undefined;\n    const numberValue = Number(value);\n    if (Number.isNaN(numberValue)) return undefined;\n    return numberValue > 999 ? numberValue / 100 : numberValue;\n  }\n\n  function normalizeItem(item, fallbackQuantity) {\n    if (!item) return null;\n\n    const itemId = item.item_id || item.variant_id || item.variantId || item.id;\n    const itemName = item.item_name || item.product_title || item.productTitle || item.title;\n    const quantity = Number(item.quantity || fallbackQuantity || 1);\n    const price = item.price != null ? normalizePriceValue(item.price) : moneyFromCents(item.final_price);\n\n    const normalized = {\n      item_id: itemId ? String(itemId) : undefined,\n      item_name: itemName,\n      quantity: Number.isNaN(quantity) || quantity < 1 ? 1 : quantity\n    };\n\n    if (price != null) normalized.price = price;\n    if (item.item_sku || item.sku) normalized.item_sku = item.item_sku || item.sku;\n    if (item.variant_title && item.variant_title !== 'Default Title') normalized.item_variant = item.variant_title;\n    if (item.product_id) normalized.product_id = String(item.product_id);\n\n    Object.keys(normalized).forEach(function(key) {\n      if (normalized[key] == null || normalized[key] === '') delete normalized[key];\n    });\n\n    return normalized;\n  }\n\n  function normalizePayload(payload) {\n    const normalized = Object.assign({}, payload || {});\n    normalized.currency = getCurrency(normalized);\n\n    if (normalized.value != null) {\n      normalized.value = moneyFromCents(normalized.value);\n    }\n\n    if (!Array.isArray(normalized.items) && normalized.item && Array.isArray(normalized.item.items)) {\n      normalized.items = normalized.item.items.map(function(item) {\n        return normalizeItem(item, item.quantity || normalized.quantity);\n      }).filter(Boolean);\n    } else if (!Array.isArray(normalized.items) && normalized.item) {\n      const item = normalizeItem(normalized.item, normalized.quantity);\n      if (item) normalized.items = [item];\n    } else if (Array.isArray(normalized.items)) {\n      normalized.items = normalized.items.map(function(item) {\n        return normalizeItem(item, item.quantity || normalized.quantity);\n      }).filter(Boolean);\n    }\n\n    if (normalized.items && normalized.items[0]) {\n      const firstItem = normalized.items[0];\n      if (!normalized.item_id) normalized.item_id = firstItem.item_id;\n      if (!normalized.item_name) normalized.item_name = firstItem.item_name;\n      if (!normalized.price && firstItem.price != null) normalized.price = firstItem.price;\n      if (!normalized.quantity) normalized.quantity = firstItem.quantity;\n      if (!normalized.item_sku) normalized.item_sku = firstItem.item_sku;\n      if (!normalized.product_id) normalized.product_id = firstItem.product_id;\n    }\n\n    delete normalized.item;\n    return normalized;\n  }\n\n  function calculateItemsValue(items, fallbackPrice, fallbackQuantity) {\n    if (Array.isArray(items) && items.length) {\n      const total = items.reduce(function(sum, item) {\n        const price = Number(item && item.price);\n        const quantity = Number((item && item.quantity) || 1);\n\n        if (Number.isNaN(price)) return sum;\n        return sum + (price * (Number.isNaN(quantity) || quantity < 1 ? 1 : quantity));\n      }, 0);\n\n      if (total > 0) return Number(total.toFixed(2));\n    }\n\n    const price = Number(fallbackPrice);\n    const quantity = Number(fallbackQuantity || 1);\n\n    if (Number.isNaN(price)) return undefined;\n    return Number((price * (Number.isNaN(quantity) || quantity < 1 ? 1 : quantity)).toFixed(2));\n  }\n\n  function prepareAddToCartPayload(payload) {\n    const prepared = Object.assign({}, payload);\n    const value = calculateItemsValue(prepared.items, prepared.price, prepared.quantity);\n\n    prepared.currency = 'BRL';\n    if (value != null) prepared.value = value;\n    prepared.ecommerce = {\n      currency: prepared.currency,\n      value: prepared.value,\n      items: prepared.items\n    };\n\n    return prepared;\n  }\n\n  function getDedupeKey(eventName, payload, options) {\n    if (payload.event_id) return payload.event_id;\n    if (payload.eventKey) return payload.eventKey;\n\n    const itemKey = payload.items && payload.items.length\n      ? payload.items.map(function(item) {\n          return [item.item_id, item.quantity].join(':');\n        }).join('|')\n      : [payload.item_id, payload.quantity].join(':');\n\n    if (eventName === 'add_to_cart') {\n      return [eventName, itemKey, options && options.interactionId].join('|');\n    }\n\n    return [eventName, payload.source || 'theme', itemKey, window.location.pathname].join('|');\n  }\n\n  function getAddToCartDedupeKey(payload) {\n    const items = Array.isArray(payload.items) ? payload.items : [];\n    const itemKey = items.length\n      ? items.map(function(item) {\n          return [\n            item.item_id || item.product_id || '',\n            item.product_id || '',\n            item.quantity || 1,\n            item.price || ''\n          ].join(':');\n        }).join('|')\n      : [\n          payload.item_id || payload.product_id || '',\n          payload.product_id || '',\n          payload.quantity || 1,\n          payload.price || ''\n        ].join(':');\n\n    return ['add_to_cart', itemKey, payload.value || ''].join('|');\n  }\n\n  function getDedupeTtl(eventName) {\n    return eventName === 'add_to_cart' ? ADD_TO_CART_DEDUPE_TTL : DEDUPE_TTL;\n  }\n\n  function markAddToCartInteraction(event) {\n    const target = event && event.target;\n    if (!target || !target.closest) return;\n\n    const trigger = target.closest([\n      'form[action=\"/cart/add\"]',\n      'form[action$=\"/cart/add\"]',\n      'form[action*=\"/cart/add\"]',\n      '[data-add-to-cart]',\n      '[data-add-to-cart-btn]',\n      'button[name=\"add\"]',\n      'input[name=\"add\"]',\n      '.add-to-cart',\n      '.cdm-product-button',\n      '.product-button-premium-v3',\n      '#addToCartButtonML',\n      '#buyNowButtonML',\n      '[onclick*=\"addToCart\"]',\n      '[onclick*=\"buyNow\"]'\n    ].join(', '));\n\n    if (trigger) {\n      addToCartInteraction.id += 1;\n      addToCartInteraction.at = Date.now();\n      addToCartInteraction.consumed = false;\n    }\n  }\n\n  function getActiveAddToCartInteractionId() {\n    if (addToCartInteraction.consumed) return null;\n    if (Date.now() - addToCartInteraction.at > ADD_TO_CART_INTERACTION_TTL) return null;\n    return addToCartInteraction.id;\n  }\n\n  function consumeAddToCartInteraction() {\n    addToCartInteraction.consumed = true;\n  }\n\n  function getCartJsonUrl() {\n    if (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) {\n      return window.Shopify.routes.root + 'cart.js';\n    }\n\n    return '/cart.js';\n  }\n\n  function hasCartAddAction(form) {\n    const action = form && form.getAttribute && form.getAttribute('action');\n    return !!action && action.indexOf('/cart/add') !== -1;\n  }\n\n  function hasVariantInput(form) {\n    return !!(form && form.querySelector && form.querySelector('[name=\"id\"]'));\n  }\n\n  function getRequestUrl(input) {\n    if (typeof input === 'string') return input;\n    if (input && input.url) return input.url;\n    return '';\n  }\n\n  function getRequestMethod(input, init) {\n    return String((init && init.method) || (input && input.method) || 'GET').toUpperCase();\n  }\n\n  function isCartAddRequest(input, init) {\n    const url = getRequestUrl(input);\n    const method = getRequestMethod(input, init);\n\n    if (method !== 'POST' || !url) return false;\n\n    try {\n      const parsedUrl = new URL(url, window.location.origin);\n      return parsedUrl.pathname.indexOf('/cart/add.js') !== -1;\n    } catch (e) {\n      return url.indexOf('/cart/add.js') !== -1;\n    }\n  }\n\n  function installCartAddFetchTracking() {\n    if (!window.fetch || window.fetch.__cdmCartAddTracking) return;\n\n    const nativeFetch = window.fetch.bind(window);\n\n    window.fetch = function(input, init) {\n      const shouldTrackCartAdd = isCartAddRequest(input, init);\n\n      return nativeFetch(input, init).then(function(response) {\n        if (shouldTrackCartAdd && response && response.ok) {\n          response.clone().json().then(function(data) {\n            push('add_to_cart', {\n              source: 'cart_add_fetch_success',\n              item: data\n            });\n          }).catch(function() {});\n        }\n\n        return response;\n      });\n    };\n\n    window.fetch.__cdmCartAddTracking = true;\n  }\n\n  function installCartAddXhrTracking() {\n    if (!window.XMLHttpRequest || window.XMLHttpRequest.__cdmCartAddTracking) return;\n\n    const nativeOpen = window.XMLHttpRequest.prototype.open;\n    const nativeSend = window.XMLHttpRequest.prototype.send;\n\n    window.XMLHttpRequest.prototype.open = function(method, url) {\n      this.__cdmRequestMethod = String(method || 'GET').toUpperCase();\n      this.__cdmRequestUrl = url || '';\n      return nativeOpen.apply(this, arguments);\n    };\n\n    window.XMLHttpRequest.prototype.send = function() {\n      if (this.__cdmRequestMethod === 'POST' && String(this.__cdmRequestUrl).indexOf('/cart/add.js') !== -1) {\n        this.addEventListener('load', function() {\n          if (this.status >= 200 && this.status < 300) {\n            let data = null;\n\n            try {\n              data = JSON.parse(this.responseText);\n            } catch (e) {}\n\n            push('add_to_cart', {\n              source: 'cart_add_xhr_success',\n              item: data\n            });\n          }\n        });\n      }\n\n      return nativeSend.apply(this, arguments);\n    };\n\n    window.XMLHttpRequest.__cdmCartAddTracking = true;\n  }\n\n  function formDataQuantity(form) {\n    const formData = new FormData(form);\n    const quantity = parseInt(formData.get('quantity'), 10);\n\n    return Number.isNaN(quantity) || quantity < 1 ? 1 : quantity;\n  }\n\n  function trackCartAddFormSubmit(event) {\n    const form = event && event.target;\n    if (!form || !form.matches || !hasCartAddAction(form) || !hasVariantInput(form)) return;\n\n    const formData = new FormData(form);\n    const variantId = String(formData.get('id') || '');\n    const quantity = formDataQuantity(form);\n\n    if (!variantId) return;\n\n    window.setTimeout(function() {\n      fetch(getCartJsonUrl(), {\n        headers: {\n          'Accept': 'application/json'\n        },\n        credentials: 'same-origin'\n      })\n      .then(function(response) {\n        if (!response.ok) return null;\n        return response.json();\n      })\n      .then(function(cart) {\n        if (!cart || !Array.isArray(cart.items)) return;\n\n        const item = cart.items.find(function(cartItem) {\n          return String(cartItem.variant_id || cartItem.id) === variantId;\n        });\n\n        if (!item) return;\n\n        push('add_to_cart', {\n          source: 'cart_add_form_submit',\n          item: item,\n          quantity: quantity\n        });\n      })\n      .catch(function() {});\n    }, 1200);\n  }\n\n  document.addEventListener('click', markAddToCartInteraction, true);\n  document.addEventListener('submit', markAddToCartInteraction, true);\n  document.addEventListener('submit', trackCartAddFormSubmit, true);\n\n  function push(eventName, payload) {\n    if (!eventName) return false;\n\n    const eventPayload = eventName === 'add_to_cart'\n      ? prepareAddToCartPayload(normalizePayload(payload))\n      : normalizePayload(payload);\n    const interactionId = eventName === 'add_to_cart' ? getActiveAddToCartInteractionId() : null;\n\n    const dedupeKey = eventName === 'add_to_cart'\n      ? getAddToCartDedupeKey(eventPayload)\n      : getDedupeKey(eventName, eventPayload, { interactionId: interactionId });\n    const now = Date.now();\n    const lastPush = recentEvents.get(dedupeKey);\n\n    if (lastPush && now - lastPush < getDedupeTtl(eventName)) {\n      if (window.CDMTrackingDebug) {\n        console.info('[CDMTracking] add_to_cart duplicado bloqueado', dedupeKey, eventPayload);\n      }\n      return false;\n    }\n\n    recentEvents.set(dedupeKey, now);\n    if (eventName === 'add_to_cart') {\n      consumeAddToCartInteraction();\n    }\n\n    window.dataLayer = window.dataLayer || [];\n\n    if (eventName === 'add_to_cart') {\n      window.dataLayer.push({ ecommerce: null });\n      window.dataLayer.push(Object.assign({ event: eventName }, eventPayload));\n      return true;\n    }\n\n    window.dataLayer.push(Object.assign({ event: eventName }, eventPayload));\n    return true;\n  }\n\n  window.CDMTracking = {\n    version: '2.1.4',\n    push: push,\n    pushAddToCart: function(payload) {\n      return push('add_to_cart', payload);\n    },\n    addToCart: function(payload) {\n      return push('add_to_cart', payload);\n    },\n    beginCheckout: function(payload) {\n      return push('begin_checkout', payload);\n    }\n  };\n\n  installCartAddFetchTracking();\n  installCartAddXhrTracking();\n  document.addEventListener('DOMContentLoaded', installCartAddFetchTracking);\n  document.addEventListener('DOMContentLoaded', installCartAddXhrTracking);\n  document.addEventListener('page:loaded', installCartAddFetchTracking);\n  document.addEventListener('page:loaded', installCartAddXhrTracking);\n  [500, 1500, 3000, 6000].forEach(function(delay) {\n    window.setTimeout(installCartAddFetchTracking, delay);\n    window.setTimeout(installCartAddXhrTracking, delay);\n  });\n})(window);\n\n// === CDM: Fallback de Add to Cart (para grid/cole\u00E7\u00F5es) ===\n// Resolve casos em que algum JS do tema/app cancela o submit e o bot\u00E3o \"Comprar\" n\u00E3o faz nada.\r\n(function () {\n  function hasCartAddAction(form) {\n    const action = form && form.getAttribute && form.getAttribute('action');\n    return !!action && action.indexOf('/cart/add') !== -1;\n  }\n\n  function hasVariantInput(form) {\n    return !!(form && form.querySelector && form.querySelector('[name=\"id\"]'));\n  }\n\n  function isNativeHandledForm(form) {\n    return form.matches([\n      'form.product-single__form',\n      'form.shopify-product-form',\n      'form.product-form-v3',\n      '[data-course-buy-now-form]'\n    ].join(', '));\n  }\n\n  function hasCdmFormContext(form) {\n    return form.matches('form.cdm-product-form, form.cdm-grid-atc') ||\n      !!form.closest('.cdm-products-grid, .grid-product, .product-card, .product-item, [data-product-form]');\n  }\n\n  function isCdmAddForm(form) {\n    return !!(\n      form &&\n      form.matches &&\n      hasCartAddAction(form) &&\n      hasVariantInput(form) &&\n      hasCdmFormContext(form) &&\n      !isNativeHandledForm(form)\n    );\n  }\n\n  function getCartAddUrl() {\n    if (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) {\n      return window.Shopify.routes.root + 'cart/add.js';\n    }\n\n    return '/cart/add.js';\n  }\n\n  function getFriendlyErrorMessage(result) {\n    const fallbackMessage = 'Nao foi possivel adicionar este produto ao carrinho. Verifique a disponibilidade e tente novamente.';\n    const data = result && result.data;\n\n    if (!data) return fallbackMessage;\n    if (data.description) return data.description;\n    if (data.message) return data.message;\n    if (data.status) return fallbackMessage + ' Codigo: ' + data.status + '.';\n\n    return fallbackMessage;\n  }\n\n  function restoreButton(btn, originalHTML) {\n    if (!btn) return;\n    btn.disabled = false;\n    btn.classList.remove('btn--loading', 'button-loading', 'cdm-btn-loading');\n    if (originalHTML != null) {\n      btn.innerHTML = originalHTML;\n    }\n  }\n\r\n  async function addToCart(form) {\r\n    const formData = new FormData(form);\r\n\r\n    // Garantia: se n\u00E3o tiver ID, aborta\r\n    if (!formData.get('id')) return { ok: false, reason: 'missing_variant_id' };\r\n\r\n    const res = await fetch(getCartAddUrl(), {\n      method: 'POST',\r\n      headers: { 'Accept': 'application/json' },\r\n      body: formData\r\n    });\r\n\r\n    const data = await res.json().catch(function () {\n      return null;\n    });\n\n    if (!res.ok) return { ok: false, reason: 'request_failed', data: data };\n    return { ok: true, data: data };\n  }\n\n  function formDataQuantity(form) {\n    const formData = new FormData(form);\n    const quantity = parseInt(formData.get('quantity'), 10);\n    return Number.isNaN(quantity) || quantity < 1 ? 1 : quantity;\n  }\n\r\n  // Captura submit ANTES de outros scripts (fase capture)\r\n  document.addEventListener('submit', async function (e) {\r\n    const form = e.target;\r\n    if (!isCdmAddForm(form)) return;\r\n\r\n    // Evita double-submit\r\n    if (form.dataset.cdmSubmitting === '1') {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n      return;\r\n    }\r\n\r\n    e.preventDefault();\r\n    e.stopImmediatePropagation();\r\n\r\n    form.dataset.cdmSubmitting = '1';\r\n\r\n    // UI b\u00E1sica\r\n    const btn = form.querySelector('[data-add-to-cart-btn], [data-add-to-cart], button[type=\"submit\"], input[type=\"submit\"]');\n    const originalHTML = btn ? btn.innerHTML : null;\n    if (btn) {\r\n      btn.disabled = true;\r\n      btn.innerHTML = 'Adicionando...';\n    }\r\n\r\n    try {\r\n      const result = await addToCart(form);\n\n      if (result.ok) {\n        if (window.CDMTracking) {\n          window.CDMTracking.addToCart({\n            source: 'cdm_grid_fallback',\n            item: result.data,\n            quantity: formDataQuantity(form)\n          });\n        }\n\n        const eventDetail = { product: result.data, addToCartBtn: btn };\n        form.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n          detail: eventDetail,\n          bubbles: true\n        }));\n        document.dispatchEvent(new CustomEvent('ajaxProduct:added', {\n          detail: eventDetail\n        }));\n\n        if (window.theme && theme.settings && theme.settings.cartType === 'page') {\n          window.location.href = (theme.routes && theme.routes.cartPage) || '/cart';\n          return;\n        }\n\n        form.dataset.cdmSubmitting = '0';\n        restoreButton(btn, originalHTML);\n        return;\n      }\n\r\n      // Mantem o cliente na pagina e evita a tela /cart/add 422.\n      form.dataset.cdmSubmitting = '0';\n      restoreButton(btn, originalHTML);\n      alert(getFriendlyErrorMessage(result));\n    } catch (err) {\r\n      form.dataset.cdmSubmitting = '0';\r\n      restoreButton(btn, originalHTML);\n      // Erro de rede ou resposta inesperada: restaura o botao e mostra erro amigavel.\n      alert(getFriendlyErrorMessage({ data: err }));\n    }\r\n  }, true);\r\n})();\r\n\r\n\r\n})();\r\n"],
  "mappings": "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",
  "names": ["evt", "observer", "el", "data", "index", "stickyHeader", "imageSizes", "Map", "self", "detail", "window", "price", "quantity"]
}
