{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/theme.js?section_id=product-recommendations"],
  "sourcesContent": ["window.theme = window.theme || {};\n\n/* ================ SLATE ================ */\nwindow.theme = window.theme || {};\n\ntheme.Sections = function Sections() {\n  this.constructors = {};\n  this.instances = [];\n\n  document.addEventListener(\n    'shopify:section:load',\n    this._onSectionLoad.bind(this)\n  );\n  document.addEventListener(\n    'shopify:section:unload',\n    this._onSectionUnload.bind(this)\n  );\n  document.addEventListener(\n    'shopify:section:select',\n    this._onSelect.bind(this)\n  );\n  document.addEventListener(\n    'shopify:section:deselect',\n    this._onDeselect.bind(this)\n  );\n  document.addEventListener(\n    'shopify:block:select',\n    this._onBlockSelect.bind(this)\n  );\n  document.addEventListener(\n    'shopify:block:deselect',\n    this._onBlockDeselect.bind(this)\n  );\n};\n\ntheme.Sections.prototype = Object.assign({}, theme.Sections.prototype, {\n  _createInstance: function(container, constructor) {\n    var id = container.getAttribute('data-section-id');\n    var type = container.getAttribute('data-section-type');\n\n    constructor = constructor || this.constructors[type];\n\n    if (typeof constructor === 'undefined') {\n      return;\n    }\n\n    var instance = Object.assign(new constructor(container), {\n      id: id,\n      type: type,\n      container: container\n    });\n\n    this.instances.push(instance);\n  },\n\n  _onSectionLoad: function(evt) {\n    var container = document.querySelector(\n      '[data-section-id=\"' + evt.detail.sectionId + '\"]'\n    );\n\n    if (container) {\n      this._createInstance(container);\n    }\n  },\n\n  _onSectionUnload: function(evt) {\n    this.instances = this.instances.filter(function(instance) {\n      var isEventInstance = instance.id === evt.detail.sectionId;\n\n      if (isEventInstance) {\n        if (typeof instance.onUnload === 'function') {\n          instance.onUnload(evt);\n        }\n      }\n\n      return !isEventInstance;\n    });\n  },\n\n  _onSelect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = this.instances.find(function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (\n      typeof instance !== 'undefined' &&\n      typeof instance.onSelect === 'function'\n    ) {\n      instance.onSelect(evt);\n    }\n  },\n\n  _onDeselect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = this.instances.find(function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (\n      typeof instance !== 'undefined' &&\n      typeof instance.onDeselect === 'function'\n    ) {\n      instance.onDeselect(evt);\n    }\n  },\n\n  _onBlockSelect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = this.instances.find(function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (\n      typeof instance !== 'undefined' &&\n      typeof instance.onBlockSelect === 'function'\n    ) {\n      instance.onBlockSelect(evt);\n    }\n  },\n\n  _onBlockDeselect: function(evt) {\n    // eslint-disable-next-line no-shadow\n    var instance = this.instances.find(function(instance) {\n      return instance.id === evt.detail.sectionId;\n    });\n\n    if (\n      typeof instance !== 'undefined' &&\n      typeof instance.onBlockDeselect === 'function'\n    ) {\n      instance.onBlockDeselect(evt);\n    }\n  },\n\n  register: function(type, constructor) {\n    this.constructors[type] = constructor;\n\n    document.querySelectorAll('[data-section-type=\"' + type + '\"]').forEach(\n      function(container) {\n        this._createInstance(container, constructor);\n      }.bind(this)\n    );\n  }\n});\n\nwindow.slate = window.slate || {};\n\n/**\n * Slate utilities\n * -----------------------------------------------------------------------------\n * A collection of useful utilities to help build your theme\n *\n *\n * @namespace utils\n */\n\nslate.utils = {\n  /**\n   * Get the query params in a Url\n   * Ex\n   * https://mysite.com/search?q=noodles&b\n   * getParameterByName('q') = \"noodles\"\n   * getParameterByName('b') = \"\" (empty value)\n   * getParameterByName('test') = null (absent)\n   */\n  getParameterByName: function(name, url) {\n    if (!url) url = window.location.href;\n    name = name.replace(/[[\\]]/g, '\\\\$&');\n    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n      results = regex.exec(url);\n    if (!results) return null;\n    if (!results[2]) return '';\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n  },\n\n  resizeSelects: function(selects) {\n    selects.forEach(function(select) {\n      var arrowWidth = 55;\n\n      var test = document.createElement('span');\n      test.innerHTML = select.selectedOptions[0].label;\n\n      document.querySelector('.site-footer').appendChild(test);\n\n      var width = test.offsetWidth + arrowWidth;\n      test.remove();\n\n      select.style.width = width + 'px';\n    });\n  },\n\n  keyboardKeys: {\n    TAB: 9,\n    ENTER: 13,\n    ESCAPE: 27,\n    LEFTARROW: 37,\n    RIGHTARROW: 39\n  }\n};\n\nwindow.slate = window.slate || {};\n\n/**\n * iFrames\n * -----------------------------------------------------------------------------\n * Wrap videos in div to force responsive layout.\n *\n * @namespace iframes\n */\n\nslate.rte = {\n  /**\n   * Wrap tables in a container div to make them scrollable when needed\n   *\n   * @param {object} options - Options to be used\n   * @param {NodeList} options.tables - Elements of the table(s) to wrap\n   * @param {string} options.tableWrapperClass - table wrapper class name\n   */\n  wrapTable: function(options) {\n    options.tables.forEach(function(table) {\n      var wrapper = document.createElement('div');\n      wrapper.classList.add(options.tableWrapperClass);\n\n      table.parentNode.insertBefore(wrapper, table);\n      wrapper.appendChild(table);\n    });\n  },\n\n  /**\n   * Wrap iframes in a container div to make them responsive\n   *\n   * @param {object} options - Options to be used\n   * @param {NodeList} options.iframes - Elements of the iframe(s) to wrap\n   * @param {string} options.iframeWrapperClass - class name used on the wrapping div\n   */\n  wrapIframe: function(options) {\n    options.iframes.forEach(function(iframe) {\n      var wrapper = document.createElement('div');\n      wrapper.classList.add(options.iframeWrapperClass);\n\n      iframe.parentNode.insertBefore(wrapper, iframe);\n      wrapper.appendChild(iframe);\n\n      iframe.src = iframe.src;\n    });\n  }\n};\n\nwindow.slate = window.slate || {};\n\n/**\n * A11y Helpers\n * -----------------------------------------------------------------------------\n * A collection of useful functions that help make your theme more accessible\n * to users with visual impairments.\n *\n *\n * @namespace a11y\n */\n\nslate.a11y = {\n  state: {\n    firstFocusable: null,\n    lastFocusable: null\n  },\n  /**\n   * For use when focus shifts to a container rather than a link\n   * eg for In-page links, after scroll, focus shifts to content area so that\n   * next `tab` is where user expects\n   *\n   * @param {HTMLElement} element - The element to be acted upon\n   */\n  pageLinkFocus: function(element) {\n    if (!element) return;\n    var focusClass = 'js-focus-hidden';\n\n    element.setAttribute('tabIndex', '-1');\n    element.focus();\n    element.classList.add(focusClass);\n    element.addEventListener('blur', callback, { once: true });\n\n    function callback() {\n      element.classList.remove(focusClass);\n      element.removeAttribute('tabindex');\n    }\n  },\n\n  /**\n   * Traps the focus in a particular container\n   *\n   * @param {object} options - Options to be used\n   * @param {HTMLElement} options.container - Container to trap focus within\n   * @param {HTMLElement} options.elementToFocus - Element to be focused when focus leaves container\n   */\n  trapFocus: function(options) {\n    var focusableElements = Array.from(\n      options.container.querySelectorAll(\n        'button, [href], input, select, textarea, [tabindex]:not([tabindex^=\"-\"])'\n      )\n    ).filter(function(element) {\n      var width = element.offsetWidth;\n      var height = element.offsetHeight;\n\n      return (\n        width !== 0 &&\n        height !== 0 &&\n        getComputedStyle(element).getPropertyValue('display') !== 'none'\n      );\n    });\n\n    this.state.firstFocusable = focusableElements[0];\n    this.state.lastFocusable = focusableElements[focusableElements.length - 1];\n\n    if (!options.elementToFocus) {\n      options.elementToFocus = options.container;\n    }\n\n    options.container.setAttribute('tabindex', '-1');\n    options.elementToFocus.focus();\n\n    this._setupHandlers();\n\n    document.addEventListener('focusin', this._onFocusInHandler);\n    document.addEventListener('focusout', this._onFocusOutHandler);\n  },\n\n  _setupHandlers: function() {\n    if (!this._onFocusInHandler) {\n      this._onFocusInHandler = this._onFocusIn.bind(this);\n    }\n\n    if (!this._onFocusOutHandler) {\n      this._onFocusOutHandler = this._onFocusIn.bind(this);\n    }\n\n    if (!this._manageFocusHandler) {\n      this._manageFocusHandler = this._manageFocus.bind(this);\n    }\n  },\n\n  _onFocusOut: function() {\n    document.removeEventListener('keydown', this._manageFocusHandler);\n  },\n\n  _onFocusIn: function(evt) {\n    if (\n      evt.target !== this.state.lastFocusable &&\n      evt.target !== this.state.firstFocusable\n    )\n      return;\n\n    document.addEventListener('keydown', this._manageFocusHandler);\n  },\n\n  _manageFocus: function(evt) {\n    if (evt.keyCode !== slate.utils.keyboardKeys.TAB) return;\n\n    /**\n     * On the last focusable element and tab forward,\n     * focus the first element.\n     */\n    if (evt.target === this.state.lastFocusable && !evt.shiftKey) {\n      evt.preventDefault();\n      this.state.firstFocusable.focus();\n    }\n    /**\n     * On the first focusable element and tab backward,\n     * focus the last element.\n     */\n    if (evt.target === this.state.firstFocusable && evt.shiftKey) {\n      evt.preventDefault();\n      this.state.lastFocusable.focus();\n    }\n  },\n\n  /**\n   * Removes the trap of focus in a particular container\n   *\n   * @param {object} options - Options to be used\n   * @param {HTMLElement} options.container - Container to trap focus within\n   */\n  removeTrapFocus: function(options) {\n    if (options.container) {\n      options.container.removeAttribute('tabindex');\n    }\n    document.removeEventListener('focusin', this._onFocusInHandler);\n  },\n\n  /**\n   * Add aria-describedby attribute to external and new window links\n   *\n   * @param {object} options - Options to be used\n   * @param {object} options.messages - Custom messages to be used\n   * @param {HTMLElement} options.links - Specific links to be targeted\n   */\n  accessibleLinks: function(options) {\n    var body = document.querySelector('body');\n\n    var idSelectors = {\n      newWindow: 'a11y-new-window-message',\n      external: 'a11y-external-message',\n      newWindowExternal: 'a11y-new-window-external-message'\n    };\n\n    if (options.links === undefined || !options.links.length) {\n      options.links = document.querySelectorAll(\n        'a[href]:not([aria-describedby])'\n      );\n    }\n\n    function generateHTML(customMessages) {\n      if (typeof customMessages !== 'object') {\n        customMessages = {};\n      }\n\n      var messages = Object.assign(\n        {\n          newWindow: 'Opens in a new window.',\n          external: 'Opens external website.',\n          newWindowExternal: 'Opens external website in a new window.'\n        },\n        customMessages\n      );\n\n      var container = document.createElement('ul');\n      var htmlMessages = '';\n\n      for (var message in messages) {\n        htmlMessages +=\n          '<li id=' + idSelectors[message] + '>' + messages[message] + '</li>';\n      }\n\n      container.setAttribute('hidden', true);\n      container.innerHTML = htmlMessages;\n\n      body.appendChild(container);\n    }\n\n    function _externalSite(link) {\n      var hostname = window.location.hostname;\n\n      return link.hostname !== hostname;\n    }\n\n    options.links.forEach(function(link) {\n      var target = link.getAttribute('target');\n      var rel = link.getAttribute('rel');\n      var isExternal = _externalSite(link);\n      var isTargetBlank = target === '_blank';\n\n      if (isExternal) {\n        link.setAttribute('aria-describedby', idSelectors.external);\n      }\n\n      if (isTargetBlank) {\n        if (!rel || rel.indexOf('noopener') === -1) {\n          var relValue = rel === undefined ? '' : rel + ' ';\n          relValue = relValue + 'noopener';\n          link.setAttribute('rel', relValue);\n        }\n\n        link.setAttribute('aria-describedby', idSelectors.newWindow);\n      }\n\n      if (isExternal && isTargetBlank) {\n        link.setAttribute('aria-describedby', idSelectors.newWindowExternal);\n      }\n    });\n\n    generateHTML(options.messages);\n  }\n};\n\n/**\n * Image Helper Functions\n * -----------------------------------------------------------------------------\n * A collection of functions that help with basic image operations.\n *\n */\n\ntheme.Images = (function() {\n  /**\n   * Preloads an image in memory and uses the browsers cache to store it until needed.\n   *\n   * @param {Array} images - A list of image urls\n   * @param {String} size - A shopify image size attribute\n   */\n\n  function preload(images, size) {\n    if (typeof images === 'string') {\n      images = [images];\n    }\n\n    for (var i = 0; i < images.length; i++) {\n      var image = images[i];\n      this.loadImage(this.getSizedImageUrl(image, size));\n    }\n  }\n\n  /**\n   * Loads and caches an image in the browsers cache.\n   * @param {string} path - An image url\n   */\n  function loadImage(path) {\n    new Image().src = path;\n  }\n\n  /**\n   * Swaps the src of an image for another OR returns the imageURL to the callback function\n   * @param image\n   * @param element\n   * @param callback\n   */\n  function switchImage(image, element, callback) {\n    var size = this.imageSize(element.src);\n    var imageUrl = this.getSizedImageUrl(image.src, size);\n\n    if (callback) {\n      callback(imageUrl, image, element); // eslint-disable-line callback-return\n    } else {\n      element.src = imageUrl;\n    }\n  }\n\n  /**\n   * +++ Useful\n   * Find the Shopify image attribute size\n   *\n   * @param {string} src\n   * @returns {null}\n   */\n  function imageSize(src) {\n    var match = src.match(\n      /.+_((?:pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})[_\\\\.@]/\n    );\n\n    if (match !== null) {\n      if (match[2] !== undefined) {\n        return match[1] + match[2];\n      } else {\n        return match[1];\n      }\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * +++ Useful\n   * Adds a Shopify size attribute to a URL\n   *\n   * @param src\n   * @param size\n   * @returns {*}\n   */\n  function getSizedImageUrl(src, size) {\n    if (size === null) {\n      return src;\n    }\n\n    if (size === 'master') {\n      return this.removeProtocol(src);\n    }\n\n    var match = src.match(\n      /\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i\n    );\n\n    if (match !== null) {\n      var prefix = src.split(match[0]);\n      var suffix = match[0];\n\n      return this.removeProtocol(prefix[0] + '_' + size + suffix);\n    }\n\n    return null;\n  }\n\n  function removeProtocol(path) {\n    return path.replace(/http(s)?:/, '');\n  }\n\n  return {\n    preload: preload,\n    loadImage: loadImage,\n    switchImage: switchImage,\n    imageSize: imageSize,\n    getSizedImageUrl: getSizedImageUrl,\n    removeProtocol: removeProtocol\n  };\n})();\n\n/**\n * Currency Helpers\n * -----------------------------------------------------------------------------\n * A collection of useful functions that help with currency formatting\n *\n * Current contents\n * - formatMoney - Takes an amount in cents and returns it as a formatted dollar value.\n *\n * Alternatives\n * - Accounting.js - http://openexchangerates.github.io/accounting.js/\n *\n */\n\ntheme.Currency = (function() {\n  var moneyFormat = '${{amount}}'; // eslint-disable-line camelcase\n\n  function formatMoney(cents, format) {\n    if (typeof cents === 'string') {\n      cents = cents.replace('.', '');\n    }\n    var value = '';\n    var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n    var formatString = format || moneyFormat;\n\n    function formatWithDelimiters(number, precision, thousands, decimal) {\n      thousands = thousands || ',';\n      decimal = decimal || '.';\n\n      if (isNaN(number) || number === null) {\n        return 0;\n      }\n\n      number = (number / 100.0).toFixed(precision);\n\n      var parts = number.split('.');\n      var dollarsAmount = parts[0].replace(\n        /(\\d)(?=(\\d\\d\\d)+(?!\\d))/g,\n        '$1' + thousands\n      );\n      var centsAmount = parts[1] ? decimal + parts[1] : '';\n\n      return dollarsAmount + centsAmount;\n    }\n\n    switch (formatString.match(placeholderRegex)[1]) {\n      case 'amount':\n        value = formatWithDelimiters(cents, 2);\n        break;\n      case 'amount_no_decimals':\n        value = formatWithDelimiters(cents, 0);\n        break;\n      case 'amount_with_comma_separator':\n        value = formatWithDelimiters(cents, 2, '.', ',');\n        break;\n      case 'amount_no_decimals_with_comma_separator':\n        value = formatWithDelimiters(cents, 0, '.', ',');\n        break;\n      case 'amount_no_decimals_with_space_separator':\n        value = formatWithDelimiters(cents, 0, ' ');\n        break;\n      case 'amount_with_apostrophe_separator':\n        value = formatWithDelimiters(cents, 2, \"'\");\n        break;\n    }\n\n    return formatString.replace(placeholderRegex, value);\n  }\n\n  return {\n    formatMoney: formatMoney\n  };\n})();\n\n/**\n * Variant Selection scripts\n * ------------------------------------------------------------------------------\n *\n * Handles change events from the variant inputs in any `cart/add` forms that may\n * exist.  Also updates the master select and triggers updates when the variants\n * price or image changes.\n *\n * @namespace variants\n */\n\nslate.Variants = (function() {\n  /**\n   * Variant constructor\n   *\n   * @param {object} options - Settings from `product.js`\n   */\n  function Variants(options) {\n    this.container = options.container;\n    this.product = options.product;\n    this.originalSelectorId = options.originalSelectorId;\n    this.enableHistoryState = options.enableHistoryState;\n    this.singleOptions = this.container.querySelectorAll(\n      options.singleOptionSelector\n    );\n    this.currentVariant = this._getVariantFromOptions();\n\n    this.singleOptions.forEach(\n      function(option) {\n        option.addEventListener('change', this._onSelectChange.bind(this));\n      }.bind(this)\n    );\n  }\n\n  Variants.prototype = Object.assign({}, Variants.prototype, {\n    /**\n     * Get the currently selected options from add-to-cart form. Works with all\n     * form input elements.\n     *\n     * @return {array} options - Values of currently selected variants\n     */\n    _getCurrentOptions: function() {\n      var result = [];\n\n      this.singleOptions.forEach(function(option) {\n        var type = option.getAttribute('type');\n        var isRadioOrCheckbox = type === 'radio' || type === 'checkbox';\n\n        if (!isRadioOrCheckbox || option.checked) {\n          result.push({\n            value: option.value,\n            index: option.getAttribute('data-index')\n          });\n        }\n      });\n\n      return result;\n    },\n\n    /**\n     * Find variant based on selected values.\n     *\n     * @param  {array} selectedValues - Values of variant inputs\n     * @return {object || undefined} found - Variant object from product.variants\n     */\n    _getVariantFromOptions: function() {\n      var selectedValues = this._getCurrentOptions();\n      var variants = this.product.variants;\n\n      var found = variants.find(function(variant) {\n        return selectedValues.every(function(values) {\n          return variant[values.index] === values.value;\n        });\n      });\n\n      return found;\n    },\n\n    /**\n     * Event handler for when a variant input changes.\n     */\n    _onSelectChange: function() {\n      var variant = this._getVariantFromOptions();\n\n      this.container.dispatchEvent(\n        new CustomEvent('variantChange', {\n          detail: {\n            variant: variant\n          },\n          bubbles: true,\n          cancelable: true\n        })\n      );\n\n      if (!variant) {\n        return;\n      }\n\n      this._updateMasterSelect(variant);\n      this._updateImages(variant);\n      this._updatePrice(variant);\n      this._updateSKU(variant);\n      this.currentVariant = variant;\n\n      if (this.enableHistoryState) {\n        this._updateHistoryState(variant);\n      }\n    },\n\n    /**\n     * Trigger event when variant image changes\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event}  variantImageChange\n     */\n    _updateImages: function(variant) {\n      var variantImage = variant.featured_image || {};\n      var currentVariantImage = this.currentVariant.featured_image || {};\n\n      if (\n        !variant.featured_image ||\n        variantImage.src === currentVariantImage.src\n      ) {\n        return;\n      }\n\n      this.container.dispatchEvent(\n        new CustomEvent('variantImageChange', {\n          detail: {\n            variant: variant\n          },\n          bubbles: true,\n          cancelable: true\n        })\n      );\n    },\n\n    /**\n     * Trigger event when variant price changes.\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event} variantPriceChange\n     */\n    _updatePrice: function(variant) {\n      if (\n        variant.price === this.currentVariant.price &&\n        variant.compare_at_price === this.currentVariant.compare_at_price &&\n        variant.unit_price === this.currentVariant.unit_price\n      ) {\n        return;\n      }\n\n      this.container.dispatchEvent(\n        new CustomEvent('variantPriceChange', {\n          detail: {\n            variant: variant\n          },\n          bubbles: true,\n          cancelable: true\n        })\n      );\n    },\n\n    /**\n     * Trigger event when variant sku changes.\n     *\n     * @param  {object} variant - Currently selected variant\n     * @return {event} variantSKUChange\n     */\n    _updateSKU: function(variant) {\n      if (variant.sku === this.currentVariant.sku) {\n        return;\n      }\n\n      this.container.dispatchEvent(\n        new CustomEvent('variantSKUChange', {\n          detail: {\n            variant: variant\n          },\n          bubbles: true,\n          cancelable: true\n        })\n      );\n    },\n\n    /**\n     * Update history state for product deeplinking\n     *\n     * @param  {variant} variant - Currently selected variant\n     * @return {k}         [description]\n     */\n    _updateHistoryState: function(variant) {\n      if (!history.replaceState || !variant) {\n        return;\n      }\n\n      var newurl =\n        window.location.protocol +\n        '//' +\n        window.location.host +\n        window.location.pathname +\n        '?variant=' +\n        variant.id;\n      window.history.replaceState({ path: newurl }, '', newurl);\n    },\n\n    /**\n     * Update hidden master select of variant change\n     *\n     * @param  {variant} variant - Currently selected variant\n     */\n    _updateMasterSelect: function(variant) {\n      var masterSelect = this.container.querySelector(this.originalSelectorId);\n\n      if (!masterSelect) return;\n      masterSelect.value = variant.id;\n    }\n  });\n\n  return Variants;\n})();\n\nthis.Shopify = this.Shopify || {};\nthis.Shopify.theme = this.Shopify.theme || {};\nthis.Shopify.theme.PredictiveSearch = (function() {\n  'use strict';\n\n  function validateQuery(query) {\n    var error;\n\n    if (query === null || query === undefined) {\n      error = new TypeError(\"'query' is missing\");\n      error.type = 'argument';\n      throw error;\n    }\n\n    if (typeof query !== 'string') {\n      error = new TypeError(\"'query' is not a string\");\n      error.type = 'argument';\n      throw error;\n    }\n  }\n\n  function GenericError() {\n    var error = Error.call(this);\n\n    error.name = 'Server error';\n    error.message = 'Something went wrong on the server';\n    error.status = 500;\n\n    return error;\n  }\n\n  function NotFoundError(status) {\n    var error = Error.call(this);\n\n    error.name = 'Not found';\n    error.message = 'Not found';\n    error.status = status;\n\n    return error;\n  }\n\n  function ServerError() {\n    var error = Error.call(this);\n\n    error.name = 'Server error';\n    error.message = 'Something went wrong on the server';\n    error.status = 500;\n\n    return error;\n  }\n\n  function ContentTypeError(status) {\n    var error = Error.call(this);\n\n    error.name = 'Content-Type error';\n    error.message = 'Content-Type was not provided or is of wrong type';\n    error.status = status;\n\n    return error;\n  }\n\n  function JsonParseError(status) {\n    var error = Error.call(this);\n\n    error.name = 'JSON parse error';\n    error.message = 'JSON syntax error';\n    error.status = status;\n\n    return error;\n  }\n\n  function ThrottledError(status, name, message, retryAfter) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n    error.retryAfter = retryAfter;\n\n    return error;\n  }\n\n  function InvalidParameterError(status, name, message) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n\n    return error;\n  }\n\n  function ExpectationFailedError(status, name, message) {\n    var error = Error.call(this);\n\n    error.name = name;\n    error.message = message;\n    error.status = status;\n\n    return error;\n  }\n\n  function request(searchUrl, queryParams, query, onSuccess, onError) {\n    var xhr = new XMLHttpRequest();\n    var route = searchUrl + '/suggest.json';\n\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState !== XMLHttpRequest.DONE) {\n        return;\n      }\n\n      var contentType = xhr.getResponseHeader('Content-Type');\n\n      if (xhr.status >= 500) {\n        onError(new ServerError());\n\n        return;\n      }\n\n      if (xhr.status === 404) {\n        onError(new NotFoundError(xhr.status));\n\n        return;\n      }\n\n      if (\n        typeof contentType !== 'string' ||\n        contentType.toLowerCase().match('application/json') === null\n      ) {\n        onError(new ContentTypeError(xhr.status));\n\n        return;\n      }\n\n      if (xhr.status === 417) {\n        try {\n          var invalidParameterJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new InvalidParameterError(\n              xhr.status,\n              invalidParameterJson.message,\n              invalidParameterJson.description\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 422) {\n        try {\n          var expectationFailedJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new ExpectationFailedError(\n              xhr.status,\n              expectationFailedJson.message,\n              expectationFailedJson.description\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 429) {\n        try {\n          var throttledJson = JSON.parse(xhr.responseText);\n\n          onError(\n            new ThrottledError(\n              xhr.status,\n              throttledJson.message,\n              throttledJson.description,\n              xhr.getResponseHeader('Retry-After')\n            )\n          );\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      if (xhr.status === 200) {\n        try {\n          var res = JSON.parse(xhr.responseText);\n          res.query = query;\n          onSuccess(res);\n        } catch (error) {\n          onError(new JsonParseError(xhr.status));\n        }\n\n        return;\n      }\n\n      try {\n        var genericErrorJson = JSON.parse(xhr.responseText);\n        onError(\n          new GenericError(\n            xhr.status,\n            genericErrorJson.message,\n            genericErrorJson.description\n          )\n        );\n      } catch (error) {\n        onError(new JsonParseError(xhr.status));\n      }\n\n      return;\n    };\n\n    xhr.open(\n      'get',\n      route + '?q=' + encodeURIComponent(query) + '&' + queryParams\n    );\n\n    xhr.setRequestHeader('Content-Type', 'application/json');\n\n    xhr.send();\n  }\n\n  function Cache(config) {\n    this._store = {};\n    this._keys = [];\n    if (config && config.bucketSize) {\n      this.bucketSize = config.bucketSize;\n    } else {\n      this.bucketSize = 20;\n    }\n  }\n\n  Cache.prototype.set = function(key, value) {\n    if (this.count() >= this.bucketSize) {\n      var deleteKey = this._keys.splice(0, 1);\n      this.delete(deleteKey);\n    }\n\n    this._keys.push(key);\n    this._store[key] = value;\n\n    return this._store;\n  };\n\n  Cache.prototype.get = function(key) {\n    return this._store[key];\n  };\n\n  Cache.prototype.has = function(key) {\n    return Boolean(this._store[key]);\n  };\n\n  Cache.prototype.count = function() {\n    return Object.keys(this._store).length;\n  };\n\n  Cache.prototype.delete = function(key) {\n    var exists = Boolean(this._store[key]);\n    delete this._store[key];\n    return exists && !this._store[key];\n  };\n\n  function Dispatcher() {\n    this.events = {};\n  }\n\n  Dispatcher.prototype.on = function(eventName, callback) {\n    var event = this.events[eventName];\n    if (!event) {\n      event = new DispatcherEvent(eventName);\n      this.events[eventName] = event;\n    }\n    event.registerCallback(callback);\n  };\n\n  Dispatcher.prototype.off = function(eventName, callback) {\n    var event = this.events[eventName];\n    if (event && event.callbacks.indexOf(callback) > -1) {\n      event.unregisterCallback(callback);\n      if (event.callbacks.length === 0) {\n        delete this.events[eventName];\n      }\n    }\n  };\n\n  Dispatcher.prototype.dispatch = function(eventName, payload) {\n    var event = this.events[eventName];\n    if (event) {\n      event.fire(payload);\n    }\n  };\n\n  function DispatcherEvent(eventName) {\n    this.eventName = eventName;\n    this.callbacks = [];\n  }\n\n  DispatcherEvent.prototype.registerCallback = function(callback) {\n    this.callbacks.push(callback);\n  };\n\n  DispatcherEvent.prototype.unregisterCallback = function(callback) {\n    var index = this.callbacks.indexOf(callback);\n    if (index > -1) {\n      this.callbacks.splice(index, 1);\n    }\n  };\n\n  DispatcherEvent.prototype.fire = function(payload) {\n    var callbacks = this.callbacks.slice(0);\n    callbacks.forEach(function(callback) {\n      callback(payload);\n    });\n  };\n\n  function debounce(func, wait) {\n    var timeout = null;\n    return function() {\n      var context = this;\n      var args = arguments;\n      clearTimeout(timeout);\n      timeout = setTimeout(function() {\n        timeout = null;\n        func.apply(context, args);\n      }, wait || 0);\n    };\n  }\n\n  function objectToQueryParams(obj, parentKey) {\n    var output = '';\n    parentKey = parentKey || null;\n\n    Object.keys(obj).forEach(function(key) {\n      var outputKey = key + '=';\n      if (parentKey) {\n        outputKey = parentKey + '[' + key + ']';\n      }\n\n      switch (trueTypeOf(obj[key])) {\n        case 'object':\n          output += objectToQueryParams(obj[key], parentKey ? outputKey : key);\n          break;\n        case 'array':\n          output += outputKey + '=' + obj[key].join(',') + '&';\n          break;\n        default:\n          if (parentKey) {\n            outputKey += '=';\n          }\n          output += outputKey + encodeURIComponent(obj[key]) + '&';\n          break;\n      }\n    });\n\n    return output;\n  }\n\n  function trueTypeOf(obj) {\n    return Object.prototype.toString\n      .call(obj)\n      .slice(8, -1)\n      .toLowerCase();\n  }\n\n  var DEBOUNCE_RATE = 10;\n  var requestDebounced = debounce(request, DEBOUNCE_RATE);\n\n  function PredictiveSearch(params, searchUrl) {\n    if (!params) {\n      throw new TypeError('No params object was specified');\n    }\n\n    this.searchUrl = searchUrl;\n\n    this._retryAfter = null;\n    this._currentQuery = null;\n\n    this.dispatcher = new Dispatcher();\n    this.cache = new Cache({ bucketSize: 40 });\n\n    this.queryParams = objectToQueryParams(params);\n  }\n\n  PredictiveSearch.TYPES = {\n    PRODUCT: 'product',\n    PAGE: 'page',\n    ARTICLE: 'article'\n  };\n\n  PredictiveSearch.FIELDS = {\n    AUTHOR: 'author',\n    BODY: 'body',\n    PRODUCT_TYPE: 'product_type',\n    TAG: 'tag',\n    TITLE: 'title',\n    VARIANTS_BARCODE: 'variants.barcode',\n    VARIANTS_SKU: 'variants.sku',\n    VARIANTS_TITLE: 'variants.title',\n    VENDOR: 'vendor'\n  };\n\n  PredictiveSearch.UNAVAILABLE_PRODUCTS = {\n    SHOW: 'show',\n    HIDE: 'hide',\n    LAST: 'last'\n  };\n\n  PredictiveSearch.prototype.query = function query(query) {\n    try {\n      validateQuery(query);\n    } catch (error) {\n      this.dispatcher.dispatch('error', error);\n      return;\n    }\n\n    if (query === '') {\n      return this;\n    }\n\n    this._currentQuery = normalizeQuery(query);\n    var cacheResult = this.cache.get(this._currentQuery);\n    if (cacheResult) {\n      this.dispatcher.dispatch('success', cacheResult);\n      return this;\n    }\n\n    requestDebounced(\n      this.searchUrl,\n      this.queryParams,\n      query,\n      function(result) {\n        this.cache.set(normalizeQuery(result.query), result);\n        if (normalizeQuery(result.query) === this._currentQuery) {\n          this._retryAfter = null;\n          this.dispatcher.dispatch('success', result);\n        }\n      }.bind(this),\n      function(error) {\n        if (error.retryAfter) {\n          this._retryAfter = error.retryAfter;\n        }\n        this.dispatcher.dispatch('error', error);\n      }.bind(this)\n    );\n\n    return this;\n  };\n\n  PredictiveSearch.prototype.on = function on(eventName, callback) {\n    this.dispatcher.on(eventName, callback);\n\n    return this;\n  };\n\n  PredictiveSearch.prototype.off = function on(eventName, callback) {\n    this.dispatcher.off(eventName, callback);\n\n    return this;\n  };\n\n  function normalizeQuery(query) {\n    if (typeof query !== 'string') {\n      return null;\n    }\n\n    return query\n      .trim()\n      .replace(' ', '-')\n      .toLowerCase();\n  }\n\n  return PredictiveSearch;\n})();\n\nthis.Shopify = this.Shopify || {};\nthis.Shopify.theme = this.Shopify.theme || {};\nthis.Shopify.theme.PredictiveSearchComponent = (function(PredictiveSearch) {\n  'use strict';\n\n  PredictiveSearch =\n    PredictiveSearch && PredictiveSearch.hasOwnProperty('default')\n      ? PredictiveSearch['default']\n      : PredictiveSearch;\n\n  var DEFAULT_PREDICTIVE_SEARCH_API_CONFIG = {\n    resources: {\n      type: [PredictiveSearch.TYPES.PRODUCT],\n      options: {\n        unavailable_products: PredictiveSearch.UNAVAILABLE_PRODUCTS.LAST,\n        fields: [\n          PredictiveSearch.FIELDS.TITLE,\n          PredictiveSearch.FIELDS.VENDOR,\n          PredictiveSearch.FIELDS.PRODUCT_TYPE,\n          PredictiveSearch.FIELDS.VARIANTS_TITLE\n        ]\n      }\n    }\n  };\n\n  function PredictiveSearchComponent(config) {\n    // validate config\n    if (\n      !config ||\n      !config.selectors ||\n      !config.selectors.input ||\n      !isString(config.selectors.input) ||\n      !config.selectors.result ||\n      !isString(config.selectors.result) ||\n      !config.resultTemplateFct ||\n      !isFunction(config.resultTemplateFct) ||\n      !config.numberOfResultsTemplateFct ||\n      !isFunction(config.numberOfResultsTemplateFct) ||\n      !config.loadingResultsMessageTemplateFct ||\n      !isFunction(config.loadingResultsMessageTemplateFct)\n    ) {\n      var error = new TypeError(\n        'PredictiveSearchComponent config is not valid'\n      );\n      error.type = 'argument';\n      throw error;\n    }\n\n    // Find nodes\n    this.nodes = findNodes(config.selectors);\n\n    // Validate nodes\n    if (!isValidNodes(this.nodes)) {\n      // eslint-disable-next-line no-console\n      console.warn('Could not find valid nodes');\n      return;\n    }\n\n    this.searchUrl = config.searchUrl || '/search';\n\n    // Store the keyword that was used for the search\n    this._searchKeyword = '';\n\n    // Assign result template\n    this.resultTemplateFct = config.resultTemplateFct;\n\n    // Assign number of results template\n    this.numberOfResultsTemplateFct = config.numberOfResultsTemplateFct;\n\n    // Assign loading state template function\n    this.loadingResultsMessageTemplateFct =\n      config.loadingResultsMessageTemplateFct;\n\n    // Assign number of search results\n    this.numberOfResults = config.numberOfResults || 4;\n\n    // Set classes\n    this.classes = {\n      visibleVariant: config.visibleVariant\n        ? config.visibleVariant\n        : 'predictive-search-wrapper--visible',\n      itemSelected: config.itemSelectedClass\n        ? config.itemSelectedClass\n        : 'predictive-search-item--selected',\n      clearButtonVisible: config.clearButtonVisibleClass\n        ? config.clearButtonVisibleClass\n        : 'predictive-search__clear-button--visible'\n    };\n\n    this.selectors = {\n      searchResult: config.searchResult\n        ? config.searchResult\n        : '[data-search-result]'\n    };\n\n    // Assign callbacks\n    this.callbacks = assignCallbacks(config);\n\n    // Add input attributes\n    addInputAttributes(this.nodes.input);\n\n    // Add input event listeners\n    this._addInputEventListeners();\n\n    // Add body listener\n    this._addBodyEventListener();\n\n    // Add accessibility announcer\n    this._addAccessibilityAnnouncer();\n\n    // Display the reset button if the input is not empty\n    this._toggleClearButtonVisibility();\n\n    // Instantiate Predictive Search API\n    this.predictiveSearch = new PredictiveSearch(\n      config.PredictiveSearchAPIConfig\n        ? config.PredictiveSearchAPIConfig\n        : DEFAULT_PREDICTIVE_SEARCH_API_CONFIG,\n      this.searchUrl\n    );\n\n    // Add predictive search success event listener\n    this.predictiveSearch.on(\n      'success',\n      this._handlePredictiveSearchSuccess.bind(this)\n    );\n\n    // Add predictive search error event listener\n    this.predictiveSearch.on(\n      'error',\n      this._handlePredictiveSearchError.bind(this)\n    );\n  }\n\n  /**\n   * Private methods\n   */\n  function findNodes(selectors) {\n    return {\n      input: document.querySelector(selectors.input),\n      reset: document.querySelector(selectors.reset),\n      result: document.querySelector(selectors.result)\n    };\n  }\n\n  function isValidNodes(nodes) {\n    if (\n      !nodes ||\n      !nodes.input ||\n      !nodes.result ||\n      nodes.input.tagName !== 'INPUT'\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n\n  function assignCallbacks(config) {\n    return {\n      onBodyMousedown: config.onBodyMousedown,\n      onBeforeOpen: config.onBeforeOpen,\n      onOpen: config.onOpen,\n      onBeforeClose: config.onBeforeClose,\n      onClose: config.onClose,\n      onInputFocus: config.onInputFocus,\n      onInputKeyup: config.onInputKeyup,\n      onInputBlur: config.onInputBlur,\n      onInputReset: config.onInputReset,\n      onBeforeDestroy: config.onBeforeDestroy,\n      onDestroy: config.onDestroy\n    };\n  }\n\n  function addInputAttributes(input) {\n    input.setAttribute('autocorrect', 'off');\n    input.setAttribute('autocomplete', 'off');\n    input.setAttribute('autocapitalize', 'off');\n    input.setAttribute('spellcheck', 'false');\n  }\n\n  function removeInputAttributes(input) {\n    input.removeAttribute('autocorrect', 'off');\n    input.removeAttribute('autocomplete', 'off');\n    input.removeAttribute('autocapitalize', 'off');\n    input.removeAttribute('spellcheck', 'false');\n  }\n\n  /**\n   * Public variables\n   */\n  PredictiveSearchComponent.prototype.isResultVisible = false;\n  PredictiveSearchComponent.prototype.results = {};\n\n  /**\n   * \"Private\" variables\n   */\n  PredictiveSearchComponent.prototype._latencyTimer = null;\n  PredictiveSearchComponent.prototype._resultNodeClicked = false;\n\n  /**\n   * \"Private\" instance methods\n   */\n  PredictiveSearchComponent.prototype._addInputEventListeners = function() {\n    var input = this.nodes.input;\n    var reset = this.nodes.reset;\n\n    if (!input) {\n      return;\n    }\n\n    this._handleInputFocus = this._handleInputFocus.bind(this);\n    this._handleInputBlur = this._handleInputBlur.bind(this);\n    this._handleInputKeyup = this._handleInputKeyup.bind(this);\n    this._handleInputKeydown = this._handleInputKeydown.bind(this);\n\n    input.addEventListener('focus', this._handleInputFocus);\n    input.addEventListener('blur', this._handleInputBlur);\n    input.addEventListener('keyup', this._handleInputKeyup);\n    input.addEventListener('keydown', this._handleInputKeydown);\n\n    if (reset) {\n      this._handleInputReset = this._handleInputReset.bind(this);\n      reset.addEventListener('click', this._handleInputReset);\n    }\n  };\n\n  PredictiveSearchComponent.prototype._removeInputEventListeners = function() {\n    var input = this.nodes.input;\n\n    input.removeEventListener('focus', this._handleInputFocus);\n    input.removeEventListener('blur', this._handleInputBlur);\n    input.removeEventListener('keyup', this._handleInputKeyup);\n    input.removeEventListener('keydown', this._handleInputKeydown);\n  };\n\n  PredictiveSearchComponent.prototype._addBodyEventListener = function() {\n    this._handleBodyMousedown = this._handleBodyMousedown.bind(this);\n\n    document\n      .querySelector('body')\n      .addEventListener('mousedown', this._handleBodyMousedown);\n  };\n\n  PredictiveSearchComponent.prototype._removeBodyEventListener = function() {\n    document\n      .querySelector('body')\n      .removeEventListener('mousedown', this._handleBodyMousedown);\n  };\n\n  PredictiveSearchComponent.prototype._removeClearButtonEventListener = function() {\n    var reset = this.nodes.reset;\n\n    if (!reset) {\n      return;\n    }\n\n    reset.removeEventListener('click', this._handleInputReset);\n  };\n\n  /**\n   * Event handlers\n   */\n  PredictiveSearchComponent.prototype._handleBodyMousedown = function(evt) {\n    if (this.isResultVisible && this.nodes !== null) {\n      if (\n        evt.target.isEqualNode(this.nodes.input) ||\n        this.nodes.input.contains(evt.target) ||\n        evt.target.isEqualNode(this.nodes.result) ||\n        this.nodes.result.contains(evt.target)\n      ) {\n        this._resultNodeClicked = true;\n      } else {\n        if (isFunction(this.callbacks.onBodyMousedown)) {\n          var returnedValue = this.callbacks.onBodyMousedown(this.nodes);\n          if (isBoolean(returnedValue) && returnedValue) {\n            this.close();\n          }\n        } else {\n          this.close();\n        }\n      }\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handleInputFocus = function(evt) {\n    if (isFunction(this.callbacks.onInputFocus)) {\n      var returnedValue = this.callbacks.onInputFocus(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    if (evt.target.value.length > 0) {\n      this._search();\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._handleInputBlur = function() {\n    // This has to be done async, to wait for the focus to be on the next\n    // element and avoid closing the results.\n    // Example: Going from the input to the reset button.\n    setTimeout(\n      function() {\n        if (isFunction(this.callbacks.onInputBlur)) {\n          var returnedValue = this.callbacks.onInputBlur(this.nodes);\n          if (isBoolean(returnedValue) && !returnedValue) {\n            return false;\n          }\n        }\n\n        if (document.activeElement.isEqualNode(this.nodes.reset)) {\n          return false;\n        }\n\n        if (this._resultNodeClicked) {\n          this._resultNodeClicked = false;\n          return false;\n        }\n\n        this.close();\n      }.bind(this)\n    );\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._addAccessibilityAnnouncer = function() {\n    this._accessibilityAnnouncerDiv = window.document.createElement('div');\n\n    this._accessibilityAnnouncerDiv.setAttribute(\n      'style',\n      'position: absolute !important; overflow: hidden; clip: rect(0 0 0 0); height: 1px; width: 1px; margin: -1px; padding: 0; border: 0;'\n    );\n\n    this._accessibilityAnnouncerDiv.setAttribute('data-search-announcer', '');\n    this._accessibilityAnnouncerDiv.setAttribute('aria-live', 'polite');\n    this._accessibilityAnnouncerDiv.setAttribute('aria-atomic', 'true');\n\n    this.nodes.result.parentElement.appendChild(\n      this._accessibilityAnnouncerDiv\n    );\n  };\n\n  PredictiveSearchComponent.prototype._removeAccessibilityAnnouncer = function() {\n    this.nodes.result.parentElement.removeChild(\n      this._accessibilityAnnouncerDiv\n    );\n  };\n\n  PredictiveSearchComponent.prototype._updateAccessibilityAttributesAfterSelectingElement = function(\n    previousSelectedElement,\n    currentSelectedElement\n  ) {\n    // Update the active descendant on the search input\n    this.nodes.input.setAttribute(\n      'aria-activedescendant',\n      currentSelectedElement.id\n    );\n\n    // Unmark the previousSelected elemented as selected\n    if (previousSelectedElement) {\n      previousSelectedElement.removeAttribute('aria-selected');\n    }\n\n    // Mark the element as selected\n    currentSelectedElement.setAttribute('aria-selected', true);\n  };\n\n  PredictiveSearchComponent.prototype._clearAriaActiveDescendant = function() {\n    this.nodes.input.setAttribute('aria-activedescendant', '');\n  };\n\n  PredictiveSearchComponent.prototype._announceNumberOfResultsFound = function(\n    results\n  ) {\n    var currentAnnouncedMessage = this._accessibilityAnnouncerDiv.innerHTML;\n    var newMessage = this.numberOfResultsTemplateFct(results);\n\n    // If the messages are the same, they won't get announced\n    // add white space so it gets announced\n    if (currentAnnouncedMessage === newMessage) {\n      newMessage = newMessage + '&nbsp;';\n    }\n\n    this._accessibilityAnnouncerDiv.innerHTML = newMessage;\n  };\n\n  PredictiveSearchComponent.prototype._announceLoadingState = function() {\n    this._accessibilityAnnouncerDiv.innerHTML = this.loadingResultsMessageTemplateFct();\n  };\n\n  PredictiveSearchComponent.prototype._handleInputKeyup = function(evt) {\n    var UP_ARROW_KEY_CODE = 38;\n    var DOWN_ARROW_KEY_CODE = 40;\n    var RETURN_KEY_CODE = 13;\n    var ESCAPE_KEY_CODE = 27;\n\n    if (isFunction(this.callbacks.onInputKeyup)) {\n      var returnedValue = this.callbacks.onInputKeyup(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this._toggleClearButtonVisibility();\n\n    if (this.isResultVisible && this.nodes !== null) {\n      if (evt.keyCode === UP_ARROW_KEY_CODE) {\n        this._navigateOption(evt, 'UP');\n        return true;\n      }\n\n      if (evt.keyCode === DOWN_ARROW_KEY_CODE) {\n        this._navigateOption(evt, 'DOWN');\n        return true;\n      }\n\n      if (evt.keyCode === RETURN_KEY_CODE) {\n        this._selectOption();\n        return true;\n      }\n\n      if (evt.keyCode === ESCAPE_KEY_CODE) {\n        this.close();\n      }\n    }\n\n    if (evt.target.value.length <= 0) {\n      this.close();\n      this._setKeyword('');\n    } else if (evt.target.value.length > 0) {\n      this._search();\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._handleInputKeydown = function(evt) {\n    var RETURN_KEY_CODE = 13;\n    var UP_ARROW_KEY_CODE = 38;\n    var DOWN_ARROW_KEY_CODE = 40;\n\n    // Prevent the form default submission if there is a selected option\n    if (evt.keyCode === RETURN_KEY_CODE && this._getSelectedOption() !== null) {\n      evt.preventDefault();\n    }\n\n    // Prevent the cursor from moving in the input when using the up and down arrow keys\n    if (\n      evt.keyCode === UP_ARROW_KEY_CODE ||\n      evt.keyCode === DOWN_ARROW_KEY_CODE\n    ) {\n      evt.preventDefault();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handleInputReset = function(evt) {\n    evt.preventDefault();\n\n    if (isFunction(this.callbacks.onInputReset)) {\n      var returnedValue = this.callbacks.onInputReset(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.input.value = '';\n    this.nodes.input.focus();\n    this._toggleClearButtonVisibility();\n    this.close();\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype._navigateOption = function(\n    evt,\n    direction\n  ) {\n    var currentOption = this._getSelectedOption();\n\n    if (!currentOption) {\n      var firstOption = this.nodes.result.querySelector(\n        this.selectors.searchResult\n      );\n      firstOption.classList.add(this.classes.itemSelected);\n      this._updateAccessibilityAttributesAfterSelectingElement(\n        null,\n        firstOption\n      );\n    } else {\n      if (direction === 'DOWN') {\n        var nextOption = currentOption.nextElementSibling;\n        if (nextOption) {\n          currentOption.classList.remove(this.classes.itemSelected);\n          nextOption.classList.add(this.classes.itemSelected);\n          this._updateAccessibilityAttributesAfterSelectingElement(\n            currentOption,\n            nextOption\n          );\n        }\n      } else {\n        var previousOption = currentOption.previousElementSibling;\n        if (previousOption) {\n          currentOption.classList.remove(this.classes.itemSelected);\n          previousOption.classList.add(this.classes.itemSelected);\n          this._updateAccessibilityAttributesAfterSelectingElement(\n            currentOption,\n            previousOption\n          );\n        }\n      }\n    }\n  };\n\n  PredictiveSearchComponent.prototype._getSelectedOption = function() {\n    return this.nodes.result.querySelector('.' + this.classes.itemSelected);\n  };\n\n  PredictiveSearchComponent.prototype._selectOption = function() {\n    var selectedOption = this._getSelectedOption();\n\n    if (selectedOption) {\n      selectedOption.querySelector('a, button').click();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._search = function() {\n    var newSearchKeyword = this.nodes.input.value;\n\n    if (this._searchKeyword === newSearchKeyword) {\n      return;\n    }\n\n    clearTimeout(this._latencyTimer);\n    this._latencyTimer = setTimeout(\n      function() {\n        this.results.isLoading = true;\n\n        // Annonuce that we're loading the results\n        this._announceLoadingState();\n\n        this.nodes.result.classList.add(this.classes.visibleVariant);\n        // NOTE: We could benifit in using DOMPurify.\n        // https://github.com/cure53/DOMPurify\n        this.nodes.result.innerHTML = this.resultTemplateFct(this.results);\n      }.bind(this),\n      500\n    );\n\n    this.predictiveSearch.query(newSearchKeyword);\n    this._setKeyword(newSearchKeyword);\n  };\n\n  PredictiveSearchComponent.prototype._handlePredictiveSearchSuccess = function(\n    json\n  ) {\n    clearTimeout(this._latencyTimer);\n    this.results = json.resources.results;\n\n    this.results.isLoading = false;\n    this.results.products = this.results.products.slice(\n      0,\n      this.numberOfResults\n    );\n    this.results.canLoadMore =\n      this.numberOfResults <= this.results.products.length;\n    this.results.searchQuery = this.nodes.input.value;\n\n    if (this.results.products.length > 0 || this.results.searchQuery) {\n      this.nodes.result.innerHTML = this.resultTemplateFct(this.results);\n      this._announceNumberOfResultsFound(this.results);\n      this.open();\n    } else {\n      this.nodes.result.innerHTML = '';\n\n      this._closeOnNoResults();\n    }\n  };\n\n  PredictiveSearchComponent.prototype._handlePredictiveSearchError = function() {\n    clearTimeout(this._latencyTimer);\n    this.nodes.result.innerHTML = '';\n\n    this._closeOnNoResults();\n  };\n\n  PredictiveSearchComponent.prototype._closeOnNoResults = function() {\n    if (this.nodes) {\n      this.nodes.result.classList.remove(this.classes.visibleVariant);\n    }\n\n    this.isResultVisible = false;\n  };\n\n  PredictiveSearchComponent.prototype._setKeyword = function(keyword) {\n    this._searchKeyword = keyword;\n  };\n\n  PredictiveSearchComponent.prototype._toggleClearButtonVisibility = function() {\n    if (!this.nodes.reset) {\n      return;\n    }\n\n    if (this.nodes.input.value.length > 0) {\n      this.nodes.reset.classList.add(this.classes.clearButtonVisible);\n    } else {\n      this.nodes.reset.classList.remove(this.classes.clearButtonVisible);\n    }\n  };\n\n  /**\n   * Public methods\n   */\n  PredictiveSearchComponent.prototype.open = function() {\n    if (this.isResultVisible) {\n      return;\n    }\n\n    if (isFunction(this.callbacks.onBeforeOpen)) {\n      var returnedValue = this.callbacks.onBeforeOpen(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.result.classList.add(this.classes.visibleVariant);\n    this.nodes.input.setAttribute('aria-expanded', true);\n    this.isResultVisible = true;\n\n    if (isFunction(this.callbacks.onOpen)) {\n      return this.callbacks.onOpen(this.nodes) || true;\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.close = function() {\n    if (!this.isResultVisible) {\n      return true;\n    }\n\n    if (isFunction(this.callbacks.onBeforeClose)) {\n      var returnedValue = this.callbacks.onBeforeClose(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    if (this.nodes) {\n      this.nodes.result.classList.remove(this.classes.visibleVariant);\n    }\n\n    this.nodes.input.setAttribute('aria-expanded', false);\n    this._clearAriaActiveDescendant();\n    this._setKeyword('');\n\n    if (isFunction(this.callbacks.onClose)) {\n      this.callbacks.onClose(this.nodes);\n    }\n\n    this.isResultVisible = false;\n    this.results = {};\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.destroy = function() {\n    this.close();\n\n    if (isFunction(this.callbacks.onBeforeDestroy)) {\n      var returnedValue = this.callbacks.onBeforeDestroy(this.nodes);\n      if (isBoolean(returnedValue) && !returnedValue) {\n        return false;\n      }\n    }\n\n    this.nodes.result.classList.remove(this.classes.visibleVariant);\n    removeInputAttributes(this.nodes.input);\n    this._removeInputEventListeners();\n    this._removeBodyEventListener();\n    this._removeAccessibilityAnnouncer();\n    this._removeClearButtonEventListener();\n\n    if (isFunction(this.callbacks.onDestroy)) {\n      this.callbacks.onDestroy(this.nodes);\n    }\n\n    return true;\n  };\n\n  PredictiveSearchComponent.prototype.clearAndClose = function() {\n    this.nodes.input.value = '';\n    this.close();\n  };\n\n  /**\n   * Utilities\n   */\n  function getTypeOf(value) {\n    return Object.prototype.toString.call(value);\n  }\n\n  function isString(value) {\n    return getTypeOf(value) === '[object String]';\n  }\n\n  function isBoolean(value) {\n    return getTypeOf(value) === '[object Boolean]';\n  }\n\n  function isFunction(value) {\n    return getTypeOf(value) === '[object Function]';\n  }\n\n  return PredictiveSearchComponent;\n})(Shopify.theme.PredictiveSearch);\n\nwindow.theme = window.theme || {};\n\ntheme.TouchEvents = function TouchEvents(element, options) {\n  this.axis;\n  this.checkEvents = [];\n  this.eventHandlers = {};\n  this.eventModel = {};\n  this.events = [\n    ['touchstart', 'touchmove', 'touchend', 'touchcancel'],\n    ['pointerdown', 'pointermove', 'pointerup', 'pointercancel'],\n    ['mousedown', 'mousemove', 'mouseup']\n  ];\n  this.eventType;\n  this.difference = {};\n  this.direction;\n  this.start = {};\n\n  this.element = element;\n  this.options = Object.assign(\n    {},\n    {\n      dragThreshold: 10,\n      start: function() {}, // eslint-disable-line\n      move: function() {}, // eslint-disable-line\n      end: function() {} // eslint-disable-line\n    },\n    options\n  );\n\n  this.checkEvents = this._getCheckEvents();\n  this.eventModel = this._getEventModel();\n\n  this._setupEventHandlers();\n};\n\ntheme.TouchEvents.prototype = Object.assign({}, theme.TouchEvents.prototype, {\n  destroy: function() {\n    this.element.removeEventListener(\n      'dragstart',\n      this.eventHandlers.preventDefault\n    );\n\n    this.element.removeEventListener(\n      this.events[this.eventModel][0],\n      this.eventHandlers.touchStart\n    );\n\n    if (!this.eventModel) {\n      this.element.removeEventListener(\n        this.events[2][0],\n        this.eventHandlers.touchStart\n      );\n    }\n\n    this.element.removeEventListener('click', this.eventHandlers.preventClick);\n  },\n\n  _setupEventHandlers: function() {\n    this.eventHandlers.preventDefault = this._preventDefault.bind(this);\n    this.eventHandlers.preventClick = this._preventClick.bind(this);\n    this.eventHandlers.touchStart = this._touchStart.bind(this);\n    this.eventHandlers.touchMove = this._touchMove.bind(this);\n    this.eventHandlers.touchEnd = this._touchEnd.bind(this);\n\n    // Prevent element from dragging when using mouse\n    this.element.addEventListener(\n      'dragstart',\n      this.eventHandlers.preventDefault\n    );\n\n    // Bind the touchstart/pointerdown event\n    this.element.addEventListener(\n      this.events[this.eventModel][0],\n      this.eventHandlers.touchStart\n    );\n\n    // Bind mousedown if necessary\n    if (!this.eventModel) {\n      this.element.addEventListener(\n        this.events[2][0],\n        this.eventHandlers.touchStart\n      );\n    }\n\n    // No clicking during touch\n    this.element.addEventListener('click', this.eventHandlers.preventClick);\n  },\n\n  _touchStart: function(event) {\n    this.eventType = this.eventModel;\n\n    if (event.type === 'mousedown' && !this.eventModel) {\n      this.eventType = 2;\n    }\n\n    if (this.checkEvents[this.eventType](event)) return;\n    if (this.eventType) this._preventDefault(event);\n\n    document.addEventListener(\n      this.events[this.eventType][1],\n      this.eventHandlers.touchMove\n    );\n\n    document.addEventListener(\n      this.events[this.eventType][2],\n      this.eventHandlers.touchEnd\n    );\n\n    if (this.eventType < 2) {\n      document.addEventListener(\n        this.events[this.eventType][3],\n        this.eventHandlers.touchEnd\n      );\n    }\n\n    this.start = {\n      xPosition: this.eventType ? event.clientX : event.touches[0].clientX,\n      yPosition: this.eventType ? event.clientY : event.touches[0].clientY,\n      time: new Date().getTime()\n    };\n\n    // Ensure we empty out the this.difference object\n    Object.keys(this.difference).forEach(\n      function(key) {\n        delete this.difference[key];\n      }.bind(this)\n    );\n\n    this.options.start(event);\n  },\n\n  _touchMove: function(event) {\n    this.difference = this._getDifference(event);\n\n    // Prevent document from scrolling during swipe gesture\n    document['on' + this.events[this.eventType][1]] = function(event) {\n      this._preventDefault(event);\n    }.bind(this);\n\n    // Get the direction user is dragging\n    if (!this.axis) {\n      if (this.options.dragThreshold < Math.abs(this.difference.xPosition)) {\n        this.axis = 'xPosition';\n      } else if (\n        this.options.dragThreshold < Math.abs(this.difference.yPosition)\n      ) {\n        this.axis = 'yPosition';\n      } else {\n        this.axis = false;\n      }\n    } else if (this.axis === 'xPosition') {\n      this.direction = this.difference.xPosition < 0 ? 'left' : 'right';\n    } else if (this.axis === 'yPosition') {\n      this.direction = this.difference.yPosition < 0 ? 'up' : 'down';\n    }\n\n    this.options.move(event, this.direction, this.difference);\n  },\n\n  _touchEnd: function(event) {\n    document.removeEventListener(\n      this.events[this.eventType][1],\n      this.eventHandlers.touchMove\n    );\n\n    document.removeEventListener(\n      this.events[this.eventType][2],\n      this.eventHandlers.touchEnd\n    );\n\n    if (this.eventType < 2) {\n      document.removeEventListener(\n        this.events[this.eventType][3],\n        this.eventHandlers.touchEnd\n      );\n    }\n\n    // Re-enable document scrolling\n    document['on' + this.events[this.eventType][1]] = function() {\n      return true;\n    };\n\n    this.options.end(event, this.direction, this.difference);\n    this.axis = false;\n  },\n\n  _getDifference: function(event) {\n    return {\n      xPosition:\n        (this.eventType ? event.clientX : event.touches[0].clientX) -\n        this.start.xPosition,\n      yPosition:\n        (this.eventType ? event.clientY : event.touches[0].clientY) -\n        this.start.yPosition,\n      time: new Date().getTime() - this.start.time\n    };\n  },\n\n  _getCheckEvents: function() {\n    return [\n      // Touch events\n      function(event) {\n        // Skip the event if it's a multi-touch or pinch move\n        return (\n          (event.touches && event.touches.length > 1) ||\n          (event.scale && event.scale !== 1)\n        );\n      },\n      // Pointer events\n      function(event) {\n        // Skip it, if:\n        // 1. The event is not primary (other pointers during multi-touch),\n        // 2. Left mouse button is not pressed,\n        // 3. Event is not a touch event\n        return (\n          !event.isPrimary ||\n          (event.buttons && event.buttons !== 1) ||\n          (event.pointerType !== 'touch' && event.pointerType !== 'pen')\n        );\n      },\n      // Mouse events\n      function(event) {\n        // Skip the event if left mouse button is not pressed\n        return event.buttons && event.buttons !== 1;\n      }\n    ];\n  },\n\n  _getEventModel: function() {\n    return window.navigator.pointerEnabled ? 1 : 0;\n  },\n\n  _preventDefault: function(event) {\n    event.preventDefault ? event.preventDefault() : (event.returnValue = false);\n  },\n\n  _preventClick: function(event) {\n    if (Math.abs(this.difference.xPosition) > this.options.dragThreshold) {\n      this._preventDefault(event);\n    }\n  }\n});\n\n\n/* ================ GLOBAL ================ */\n/*============================================================================\n  Drawer modules\n==============================================================================*/\ntheme.Drawers = (function() {\n  function Drawer(id, position, options) {\n    var DEFAULT_OPEN_CLASS = 'js-drawer-open';\n    var DEFAULT_CLOSE_CLASS = 'js-drawer-close';\n\n    var defaults = {\n      selectors: {\n        openVariant: '.' + DEFAULT_OPEN_CLASS + '-' + position,\n        close: '.' + DEFAULT_CLOSE_CLASS\n      },\n      classes: {\n        open: DEFAULT_OPEN_CLASS,\n        openVariant: DEFAULT_OPEN_CLASS + '-' + position\n      },\n      withPredictiveSearch: false\n    };\n\n    this.nodes = {\n      parents: [document.documentElement, document.body],\n      page: document.getElementById('PageContainer')\n    };\n\n    this.eventHandlers = {};\n\n    this.config = Object.assign({}, defaults, options);\n    this.position = position;\n    this.drawer = document.getElementById(id);\n\n    if (!this.drawer) {\n      return false;\n    }\n\n    this.drawerIsOpen = false;\n    this.init();\n  }\n\n  Drawer.prototype.init = function() {\n    document\n      .querySelector(this.config.selectors.openVariant)\n      .addEventListener('click', this.open.bind(this));\n    this.drawer\n      .querySelector(this.config.selectors.close)\n      .addEventListener('click', this.close.bind(this));\n  };\n\n  Drawer.prototype.open = function(evt) {\n    // Keep track if drawer was opened from a click, or called by another function\n    var externalCall = false;\n\n    // Prevent following href if link is clicked\n    if (evt) {\n      evt.preventDefault();\n    } else {\n      externalCall = true;\n    }\n\n    // Without this, the drawer opens, the click event bubbles up to nodes.page\n    // which closes the drawer.\n    if (evt && evt.stopPropagation) {\n      evt.stopPropagation();\n      // save the source of the click, we'll focus to this on close\n      this.activeSource = evt.currentTarget;\n    }\n\n    if (this.drawerIsOpen && !externalCall) {\n      return this.close();\n    }\n\n    // Add is-transitioning class to moved elements on open so drawer can have\n    // transition for close animation\n    if (!this.config.withPredictiveSearch) {\n      theme.Helpers.prepareTransition(this.drawer);\n    }\n\n    this.nodes.parents.forEach(\n      function(parent) {\n        parent.classList.add(\n          this.config.classes.open,\n          this.config.classes.openVariant\n        );\n      }.bind(this)\n    );\n\n    this.drawerIsOpen = true;\n\n    // Run function when draw opens if set\n    if (\n      this.config.onDrawerOpen &&\n      typeof this.config.onDrawerOpen === 'function'\n    ) {\n      if (!externalCall) {\n        this.config.onDrawerOpen();\n      }\n    }\n\n    if (this.activeSource && this.activeSource.hasAttribute('aria-expanded')) {\n      this.activeSource.setAttribute('aria-expanded', 'true');\n    }\n\n    // Set focus on drawer\n    var trapFocusConfig = {\n      container: this.drawer\n    };\n\n    if (this.config.elementToFocusOnOpen) {\n      trapFocusConfig.elementToFocus = this.config.elementToFocusOnOpen;\n    }\n\n    slate.a11y.trapFocus(trapFocusConfig);\n\n    this.bindEvents();\n\n    return this;\n  };\n\n  Drawer.prototype.close = function() {\n    if (!this.drawerIsOpen) {\n      // don't close a closed drawer\n      return;\n    }\n\n    // deselect any focused form elements\n    document.activeElement.dispatchEvent(\n      new CustomEvent('blur', { bubbles: true, cancelable: true })\n    );\n\n    // Ensure closing transition is applied to moved elements, like the nav\n    if (!this.config.withPredictiveSearch) {\n      theme.Helpers.prepareTransition(this.drawer);\n    }\n\n    this.nodes.parents.forEach(\n      function(parent) {\n        parent.classList.remove(\n          this.config.classes.open,\n          this.config.classes.openVariant\n        );\n      }.bind(this)\n    );\n\n    if (this.activeSource && this.activeSource.hasAttribute('aria-expanded')) {\n      this.activeSource.setAttribute('aria-expanded', 'false');\n    }\n\n    this.drawerIsOpen = false;\n\n    // Remove focus on drawer\n    slate.a11y.removeTrapFocus({\n      container: this.drawer\n    });\n\n    this.unbindEvents();\n\n    // Run function when draw closes if set\n    if (\n      this.config.onDrawerClose &&\n      typeof this.config.onDrawerClose === 'function'\n    ) {\n      this.config.onDrawerClose();\n    }\n  };\n\n  Drawer.prototype.bindEvents = function() {\n    this.eventHandlers.drawerKeyupHandler = function(evt) {\n      // close on 'esc' keypress\n      if (evt.keyCode === 27) {\n        this.close();\n        return false;\n      } else {\n        return true;\n      }\n    }.bind(this);\n\n    this.eventHandlers.drawerTouchmoveHandler = function() {\n      return false;\n    };\n\n    this.eventHandlers.drawerClickHandler = function() {\n      this.close();\n      return false;\n    }.bind(this);\n\n    // Add event listener to document body\n    document.body.addEventListener(\n      'keyup',\n      this.eventHandlers.drawerKeyupHandler\n    );\n\n    // Lock scrolling on mobile\n    this.nodes.page.addEventListener(\n      'touchmove',\n      this.eventHandlers.drawerTouchmoveHandler\n    );\n\n    this.nodes.page.addEventListener(\n      'click',\n      this.eventHandlers.drawerClickHandler\n    );\n  };\n\n  Drawer.prototype.unbindEvents = function() {\n    this.nodes.page.removeEventListener(\n      'touchmove',\n      this.eventHandlers.drawerTouchmoveHandler\n    );\n    this.nodes.page.removeEventListener(\n      'click',\n      this.eventHandlers.drawerClickHandler\n    );\n    document.body.removeEventListener(\n      'keyup',\n      this.eventHandlers.drawerKeyupHandler\n    );\n  };\n\n  return Drawer;\n})();\n\ntheme.Helpers = (function() {\n  var touchDevice = false;\n\n  var classes = {\n    preventScrolling: 'prevent-scrolling'\n  };\n\n  var scrollPosition = window.pageYOffset;\n\n  function setTouch() {\n    touchDevice = true;\n  }\n\n  function isTouch() {\n    return touchDevice;\n  }\n\n  function enableScrollLock() {\n    scrollPosition = window.pageYOffset;\n    document.body.style.top = '-' + scrollPosition + 'px';\n    document.body.classList.add(classes.preventScrolling);\n  }\n\n  function disableScrollLock() {\n    document.body.classList.remove(classes.preventScrolling);\n    document.body.style.removeProperty('top');\n    window.scrollTo(0, scrollPosition);\n  }\n\n  function debounce(func, wait, immediate) {\n    var timeout;\n\n    return function() {\n      var context = this,\n        args = arguments;\n\n      var later = function() {\n        timeout = null;\n        if (!immediate) func.apply(context, args);\n      };\n\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) func.apply(context, args);\n    };\n  }\n\n  function getScript(source, beforeEl) {\n    return new Promise(function(resolve, reject) {\n      var script = document.createElement('script');\n      var prior = beforeEl || document.getElementsByTagName('script')[0];\n\n      script.async = true;\n      script.defer = true;\n\n      // eslint-disable-next-line shopify/prefer-early-return\n      function onloadHander(_, isAbort) {\n        if (\n          isAbort ||\n          !script.readyState ||\n          /loaded|complete/.test(script.readyState)\n        ) {\n          script.onload = null;\n          script.onreadystatechange = null;\n          script = undefined;\n\n          if (isAbort) {\n            reject();\n          } else {\n            resolve();\n          }\n        }\n      }\n\n      script.onload = onloadHander;\n      script.onreadystatechange = onloadHander;\n\n      script.src = source;\n      prior.parentNode.insertBefore(script, prior);\n    });\n  }\n\n  /* Based on the prepareTransition by Jonathan Snook */\n  /* Jonathan Snook - MIT License - https://github.com/snookca/prepareTransition */\n  function prepareTransition(element) {\n    element.addEventListener(\n      'transitionend',\n      function(event) {\n        event.currentTarget.classList.remove('is-transitioning');\n      },\n      { once: true }\n    );\n\n    var properties = [\n      'transition-duration',\n      '-moz-transition-duration',\n      '-webkit-transition-duration',\n      '-o-transition-duration'\n    ];\n\n    var duration = 0;\n\n    properties.forEach(function(property) {\n      var computedValue = getComputedStyle(element)[property];\n\n      if (computedValue) {\n        computedValue.replace(/\\D/g, '');\n        duration || (duration = parseFloat(computedValue));\n      }\n    });\n\n    if (duration !== 0) {\n      element.classList.add('is-transitioning');\n      element.offsetWidth;\n    }\n  }\n\n  /*!\n   * Serialize all form data into a SearchParams string\n   * (c) 2020 Chris Ferdinandi, MIT License, https://gomakethings.com\n   * @param  {Node}   form The form to serialize\n   * @return {String}      The serialized form data\n   */\n  function serialize(form) {\n    var arr = [];\n    Array.prototype.slice.call(form.elements).forEach(function(field) {\n      if (\n        !field.name ||\n        field.disabled ||\n        ['file', 'reset', 'submit', 'button'].indexOf(field.type) > -1\n      )\n        return;\n      if (field.type === 'select-multiple') {\n        Array.prototype.slice.call(field.options).forEach(function(option) {\n          if (!option.selected) return;\n          arr.push(\n            encodeURIComponent(field.name) +\n              '=' +\n              encodeURIComponent(option.value)\n          );\n        });\n        return;\n      }\n      if (['checkbox', 'radio'].indexOf(field.type) > -1 && !field.checked)\n        return;\n      arr.push(\n        encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)\n      );\n    });\n    return arr.join('&');\n  }\n  function cookiesEnabled() {\n    var cookieEnabled = navigator.cookieEnabled;\n\n    if (!cookieEnabled) {\n      document.cookie = 'testcookie';\n      cookieEnabled = document.cookie.indexOf('testcookie') !== -1;\n    }\n\n    return cookieEnabled;\n  }\n\n  function promiseStylesheet(stylesheet) {\n    var stylesheetUrl = stylesheet || theme.stylesheet;\n\n    if (typeof this.stylesheetPromise === 'undefined') {\n      this.stylesheetPromise = new Promise(function(resolve) {\n        var link = document.querySelector('link[href=\"' + stylesheetUrl + '\"]');\n\n        if (link.loaded) resolve();\n\n        link.addEventListener('load', function() {\n          setTimeout(resolve, 0);\n        });\n      });\n    }\n\n    return this.stylesheetPromise;\n  }\n\n  return {\n    setTouch: setTouch,\n    isTouch: isTouch,\n    enableScrollLock: enableScrollLock,\n    disableScrollLock: disableScrollLock,\n    debounce: debounce,\n    getScript: getScript,\n    prepareTransition: prepareTransition,\n    serialize: serialize,\n    cookiesEnabled: cookiesEnabled,\n    promiseStylesheet: promiseStylesheet\n  };\n})();\n\ntheme.LibraryLoader = (function() {\n  var types = {\n    link: 'link',\n    script: 'script'\n  };\n\n  var status = {\n    requested: 'requested',\n    loaded: 'loaded'\n  };\n\n  var cloudCdn = 'https://cdn.shopify.com/shopifycloud/';\n\n  var libraries = {\n    plyrShopifyStyles: {\n      tagId: 'plyr-shopify-styles',\n      src: cloudCdn + 'plyr/v2.0/shopify-plyr.css',\n      type: types.link\n    },\n    modelViewerUiStyles: {\n      tagId: 'shopify-model-viewer-ui-styles',\n      src: cloudCdn + 'model-viewer-ui/assets/v1.0/model-viewer-ui.css',\n      type: types.link\n    }\n  };\n\n  function load(libraryName, callback) {\n    var library = libraries[libraryName];\n\n    if (!library) return;\n    if (library.status === status.requested) return;\n\n    callback = callback || function() {};\n    if (library.status === status.loaded) {\n      callback();\n      return;\n    }\n\n    library.status = status.requested;\n\n    var tag;\n\n    switch (library.type) {\n      case types.script:\n        tag = createScriptTag(library, callback);\n        break;\n      case types.link:\n        tag = createLinkTag(library, callback);\n        break;\n    }\n\n    tag.id = library.tagId;\n    library.element = tag;\n\n    var firstScriptTag = document.getElementsByTagName(library.type)[0];\n    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n  }\n\n  function createScriptTag(library, callback) {\n    var tag = document.createElement('script');\n    tag.src = library.src;\n    tag.addEventListener('load', function() {\n      library.status = status.loaded;\n      callback();\n    });\n    return tag;\n  }\n\n  function createLinkTag(library, callback) {\n    var tag = document.createElement('link');\n    tag.href = library.src;\n    tag.rel = 'stylesheet';\n    tag.type = 'text/css';\n    tag.addEventListener('load', function() {\n      library.status = status.loaded;\n      callback();\n    });\n    return tag;\n  }\n\n  return {\n    load: load\n  };\n})();\n\n\n/* ================ MODULES ================ */\nwindow.theme = window.theme || {};\n\ntheme.Header = (function() {\n  var selectors = {\n    body: 'body',\n    navigation: '#AccessibleNav',\n    siteNavHasDropdown: '[data-has-dropdowns]',\n    siteNavChildLinks: '.site-nav__child-link',\n    siteNavActiveDropdown: '.site-nav--active-dropdown',\n    siteNavHasCenteredDropdown: '.site-nav--has-centered-dropdown',\n    siteNavCenteredDropdown: '.site-nav__dropdown--centered',\n    siteNavLinkMain: '.site-nav__link--main',\n    siteNavChildLink: '.site-nav__link--last',\n    siteNavDropdown: '.site-nav__dropdown',\n    siteHeader: '.site-header'\n  };\n\n  var config = {\n    activeClass: 'site-nav--active-dropdown',\n    childLinkClass: 'site-nav__child-link',\n    rightDropdownClass: 'site-nav__dropdown--right',\n    leftDropdownClass: 'site-nav__dropdown--left'\n  };\n\n  var cache = {};\n\n  function init() {\n    cacheSelectors();\n    styleDropdowns(document.querySelectorAll(selectors.siteNavHasDropdown));\n    positionFullWidthDropdowns();\n\n    cache.parents.forEach(function(element) {\n      element.addEventListener('click', submenuParentClickHandler);\n    });\n\n    // check when we're leaving a dropdown and close the active dropdown\n    cache.siteNavChildLink.forEach(function(element) {\n      element.addEventListener('focusout', submenuFocusoutHandler);\n    });\n\n    cache.topLevel.forEach(function(element) {\n      element.addEventListener('focus', hideDropdown);\n    });\n\n    cache.subMenuLinks.forEach(function(element) {\n      element.addEventListener('click', stopImmediatePropagation);\n    });\n\n    window.addEventListener('resize', resizeHandler);\n  }\n\n  function stopImmediatePropagation(event) {\n    event.stopImmediatePropagation();\n  }\n\n  function cacheSelectors() {\n    var navigation = document.querySelector(selectors.navigation);\n\n    cache = {\n      nav: navigation,\n      topLevel: document.querySelectorAll(selectors.siteNavLinkMain),\n      parents: navigation.querySelectorAll(selectors.siteNavHasDropdown),\n      subMenuLinks: document.querySelectorAll(selectors.siteNavChildLinks),\n      activeDropdown: document.querySelector(selectors.siteNavActiveDropdown),\n      siteHeader: document.querySelector(selectors.siteHeader),\n      siteNavChildLink: document.querySelectorAll(selectors.siteNavChildLink)\n    };\n  }\n\n  function showDropdown(element) {\n    element.classList.add(config.activeClass);\n\n    if (cache.activeDropdown) hideDropdown();\n\n    cache.activeDropdown = element;\n\n    element\n      .querySelector(selectors.siteNavLinkMain)\n      .setAttribute('aria-expanded', 'true');\n\n    setTimeout(function() {\n      window.addEventListener('keyup', keyUpHandler);\n      document.body.addEventListener('click', hideDropdown);\n    }, 250);\n  }\n\n  function hideDropdown() {\n    if (!cache.activeDropdown) return;\n\n    cache.activeDropdown\n      .querySelector(selectors.siteNavLinkMain)\n      .setAttribute('aria-expanded', 'false');\n    cache.activeDropdown.classList.remove(config.activeClass);\n\n    cache.activeDropdown = document.querySelector(\n      selectors.siteNavActiveDropdown\n    );\n\n    window.removeEventListener('keyup', keyUpHandler);\n    document.body.removeEventListener('click', hideDropdown);\n  }\n\n  function styleDropdowns(dropdownListItems) {\n    dropdownListItems.forEach(function(item) {\n      var dropdownLi = item.querySelector(selectors.siteNavDropdown);\n\n      if (!dropdownLi) return;\n\n      if (isRightOfLogo(item)) {\n        dropdownLi.classList.remove(config.leftDropdownClass);\n        dropdownLi.classList.add(config.rightDropdownClass);\n      } else {\n        dropdownLi.classList.remove(config.rightDropdownClass);\n        dropdownLi.classList.add(config.leftDropdownClass);\n      }\n    });\n  }\n\n  function isRightOfLogo(item) {\n    var rect = item.getBoundingClientRect();\n    var win = item.ownerDocument.defaultView;\n    var leftOffset = rect.left + win.pageXOffset;\n\n    var headerWidth = Math.floor(cache.siteHeader.offsetWidth) / 2;\n    return leftOffset > headerWidth;\n  }\n\n  function positionFullWidthDropdowns() {\n    document\n      .querySelectorAll(selectors.siteNavHasCenteredDropdown)\n      .forEach(function(el) {\n        var fullWidthDropdown = el.querySelector(\n          selectors.siteNavCenteredDropdown\n        );\n\n        var fullWidthDropdownOffset = el.offsetTop + 41;\n        fullWidthDropdown.style.top = fullWidthDropdownOffset + 'px';\n      });\n  }\n\n  function keyUpHandler(event) {\n    if (event.keyCode === 27) hideDropdown();\n  }\n\n  function resizeHandler() {\n    adjustStyleAndPosition();\n  }\n\n  function submenuParentClickHandler(event) {\n    var element = event.currentTarget;\n\n    element.classList.contains(config.activeClass)\n      ? hideDropdown()\n      : showDropdown(element);\n  }\n\n  function submenuFocusoutHandler() {\n    setTimeout(function() {\n      if (\n        document.activeElement.classList.contains(config.childLinkClass) ||\n        !cache.activeDropdown\n      ) {\n        return;\n      }\n\n      hideDropdown();\n    });\n  }\n\n  var adjustStyleAndPosition = theme.Helpers.debounce(function() {\n    styleDropdowns(document.querySelectorAll(selectors.siteNavHasDropdown));\n    positionFullWidthDropdowns();\n  }, 50);\n\n  function unload() {\n    cache.topLevel.forEach(function(element) {\n      element.removeEventListener('focus', hideDropdown);\n    });\n\n    cache.subMenuLinks.forEach(function(element) {\n      element.removeEventListener('click', stopImmediatePropagation);\n    });\n\n    cache.parents.forEach(function(element) {\n      element.removeEventListener('click', submenuParentClickHandler);\n    });\n\n    cache.siteNavChildLink.forEach(function(element) {\n      element.removeEventListener('focusout', submenuFocusoutHandler);\n    });\n\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('keyup', keyUpHandler);\n    document.body.removeEventListener('click', hideDropdown);\n  }\n\n  return {\n    init: init,\n    unload: unload\n  };\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.MobileNav = (function() {\n  var classes = {\n    mobileNavOpenIcon: 'mobile-nav--open',\n    mobileNavCloseIcon: 'mobile-nav--close',\n    navLinkWrapper: 'mobile-nav__item',\n    navLink: 'mobile-nav__link',\n    subNavLink: 'mobile-nav__sublist-link',\n    return: 'mobile-nav__return-btn',\n    subNavActive: 'is-active',\n    subNavClosing: 'is-closing',\n    navOpen: 'js-menu--is-open',\n    subNavShowing: 'sub-nav--is-open',\n    thirdNavShowing: 'third-nav--is-open',\n    subNavToggleBtn: 'js-toggle-submenu'\n  };\n\n  var cache = {};\n  var isTransitioning;\n  var activeSubNav;\n  var activeTrigger;\n  var menuLevel = 1;\n  var mediumUpQuery = '(min-width: ' + theme.breakpoints.medium + 'px)';\n  var mql = window.matchMedia(mediumUpQuery);\n\n  function init() {\n    cacheSelectors();\n\n    if (cache.mobileNavToggle) {\n      cache.mobileNavToggle.addEventListener('click', toggleMobileNav);\n    }\n\n    cache.subNavToggleBtns.forEach(function(element) {\n      element.addEventListener('click', toggleSubNav);\n    });\n\n    mql.addListener(initBreakpoints);\n  }\n\n  function initBreakpoints() {\n    if (\n      mql.matches &&\n      cache.mobileNavContainer.classList.contains(classes.navOpen)\n    ) {\n      closeMobileNav();\n    }\n  }\n\n  function toggleMobileNav() {\n    var mobileNavIsOpen = cache.mobileNavToggle.classList.contains(\n      classes.mobileNavCloseIcon\n    );\n\n    if (mobileNavIsOpen) {\n      closeMobileNav();\n    } else {\n      openMobileNav();\n    }\n  }\n\n  function cacheSelectors() {\n    cache = {\n      pageContainer: document.querySelector('#PageContainer'),\n      siteHeader: document.querySelector('.site-header'),\n      mobileNavToggle: document.querySelector('.js-mobile-nav-toggle'),\n      mobileNavContainer: document.querySelector('.mobile-nav-wrapper'),\n      mobileNav: document.querySelector('#MobileNav'),\n      sectionHeader: document.querySelector('#shopify-section-header'),\n      subNavToggleBtns: document.querySelectorAll('.' + classes.subNavToggleBtn)\n    };\n  }\n\n  function openMobileNav() {\n    var translateHeaderHeight = cache.siteHeader.offsetHeight;\n\n    theme.Helpers.prepareTransition(cache.mobileNavContainer);\n    cache.mobileNavContainer.classList.add(classes.navOpen);\n\n    cache.mobileNavContainer.style.transform =\n      'translateY(' + translateHeaderHeight + 'px)';\n\n    cache.pageContainer.style.transform =\n      'translate3d(0, ' + cache.mobileNavContainer.scrollHeight + 'px, 0)';\n\n    slate.a11y.trapFocus({\n      container: cache.sectionHeader,\n      elementToFocus: cache.mobileNavToggle\n    });\n\n    cache.mobileNavToggle.classList.add(classes.mobileNavCloseIcon);\n    cache.mobileNavToggle.classList.remove(classes.mobileNavOpenIcon);\n    cache.mobileNavToggle.setAttribute('aria-expanded', true);\n\n    window.addEventListener('keyup', keyUpHandler);\n  }\n\n  function keyUpHandler(event) {\n    if (event.which === 27) {\n      closeMobileNav();\n    }\n  }\n\n  function closeMobileNav() {\n    theme.Helpers.prepareTransition(cache.mobileNavContainer);\n    cache.mobileNavContainer.classList.remove(classes.navOpen);\n    cache.mobileNavContainer.style.transform = 'translateY(-100%)';\n    cache.pageContainer.setAttribute('style', '');\n\n    slate.a11y.trapFocus({\n      container: document.querySelector('html'),\n      elementToFocus: document.body\n    });\n\n    cache.mobileNavContainer.addEventListener(\n      'transitionend',\n      mobileNavRemoveTrapFocus,\n      { once: true }\n    );\n\n    cache.mobileNavToggle.classList.add(classes.mobileNavOpenIcon);\n    cache.mobileNavToggle.classList.remove(classes.mobileNavCloseIcon);\n    cache.mobileNavToggle.setAttribute('aria-expanded', false);\n    cache.mobileNavToggle.focus();\n\n    window.removeEventListener('keyup', keyUpHandler);\n    window.scrollTo(0, 0);\n  }\n\n  function mobileNavRemoveTrapFocus() {\n    slate.a11y.removeTrapFocus({\n      container: cache.mobileNav\n    });\n  }\n\n  function toggleSubNav(event) {\n    if (isTransitioning) return;\n\n    var toggleBtn = event.currentTarget;\n    var isReturn = toggleBtn.classList.contains(classes.return);\n\n    isTransitioning = true;\n\n    if (isReturn) {\n      var subNavToggleBtn = document.querySelectorAll(\n        '.' + classes.subNavToggleBtn + \"[data-level='\" + (menuLevel - 1) + \"']\"\n      );\n\n      subNavToggleBtn.forEach(function(element) {\n        element.classList.remove(classes.subNavActive);\n      });\n\n      if (activeTrigger) {\n        activeTrigger.classList.remove(classes.subNavActive);\n      }\n    } else {\n      toggleBtn.classList.add(classes.subNavActive);\n    }\n\n    activeTrigger = toggleBtn;\n\n    goToSubnav(toggleBtn.getAttribute('data-target'));\n  }\n\n  function goToSubnav(target) {\n    var targetMenu = target\n      ? document.querySelector(\n          '.mobile-nav__dropdown[data-parent=\"' + target + '\"]'\n        )\n      : cache.mobileNav;\n\n    menuLevel = targetMenu.dataset.level ? Number(targetMenu.dataset.level) : 1;\n\n    if (activeSubNav) {\n      theme.Helpers.prepareTransition(activeSubNav);\n      activeSubNav.classList.add(classes.subNavClosing);\n    }\n\n    activeSubNav = targetMenu;\n\n    var translateMenuHeight = targetMenu.offsetHeight;\n\n    var openNavClass =\n      menuLevel > 2 ? classes.thirdNavShowing : classes.subNavShowing;\n\n    cache.mobileNavContainer.style.height = translateMenuHeight + 'px';\n    cache.mobileNavContainer.classList.remove(classes.thirdNavShowing);\n    cache.mobileNavContainer.classList.add(openNavClass);\n\n    if (!target) {\n      cache.mobileNavContainer.classList.remove(\n        classes.thirdNavShowing,\n        classes.subNavShowing\n      );\n    }\n\n    /* if going back to first subnav, focus is on whole header */\n    var container = menuLevel === 1 ? cache.sectionHeader : targetMenu;\n\n    cache.mobileNavContainer.addEventListener(\n      'transitionend',\n      trapMobileNavFocus,\n      { once: true }\n    );\n\n    function trapMobileNavFocus() {\n      slate.a11y.trapFocus({\n        container: container\n      });\n\n      cache.mobileNavContainer.removeEventListener(\n        'transitionend',\n        trapMobileNavFocus\n      );\n\n      isTransitioning = false;\n    }\n\n    // Match height of subnav\n    cache.pageContainer.style.transform =\n      'translateY(' + translateMenuHeight + 'px)';\n\n    activeSubNav.classList.remove(classes.subNavClosing);\n  }\n\n  function unload() {\n    mql.removeListener(initBreakpoints);\n  }\n\n  return {\n    init: init,\n    unload: unload,\n    closeMobileNav: closeMobileNav\n  };\n})();\n\nwindow.Modals = (function() {\n  function Modal(id, name, options) {\n    var defaults = {\n      close: '.js-modal-close',\n      open: '.js-modal-open-' + name,\n      openClass: 'modal--is-active',\n      closeModalOnClick: false\n    };\n\n    this.modal = document.getElementById(id);\n\n    if (!this.modal) return false;\n\n    this.nodes = {\n      parents: [document.querySelector('html'), document.body]\n    };\n\n    this.config = Object.assign(defaults, options);\n\n    this.modalIsOpen = false;\n\n    this.focusOnOpen = this.config.focusOnOpen\n      ? document.getElementById(this.config.focusOnOpen)\n      : this.modal;\n\n    this.openElement = document.querySelector(this.config.open);\n    this.init();\n  }\n\n  Modal.prototype.init = function() {\n    this.openElement.addEventListener('click', this.open.bind(this));\n\n    this.modal\n      .querySelector(this.config.close)\n      .addEventListener('click', this.closeModal.bind(this));\n  };\n\n  Modal.prototype.open = function(evt) {\n    var self = this;\n    // Keep track if modal was opened from a click, or called by another function\n    var externalCall = false;\n\n    if (this.modalIsOpen) return;\n\n    // Prevent following href if link is clicked\n    if (evt) {\n      evt.preventDefault();\n    } else {\n      externalCall = true;\n    }\n\n    // Without this, the modal opens, the click event bubbles up\n    // which closes the modal.\n    if (evt && evt.stopPropagation) {\n      evt.stopPropagation();\n    }\n\n    if (this.modalIsOpen && !externalCall) {\n      this.closeModal();\n    }\n\n    this.modal.classList.add(this.config.openClass);\n\n    this.nodes.parents.forEach(function(node) {\n      node.classList.add(self.config.openClass);\n    });\n\n    this.modalIsOpen = true;\n\n    slate.a11y.trapFocus({\n      container: this.modal,\n      elementToFocus: this.focusOnOpen\n    });\n\n    this.bindEvents();\n  };\n\n  Modal.prototype.closeModal = function() {\n    if (!this.modalIsOpen) return;\n\n    document.activeElement.blur();\n\n    this.modal.classList.remove(this.config.openClass);\n\n    var self = this;\n\n    this.nodes.parents.forEach(function(node) {\n      node.classList.remove(self.config.openClass);\n    });\n\n    this.modalIsOpen = false;\n\n    slate.a11y.removeTrapFocus({\n      container: this.modal\n    });\n\n    this.openElement.focus();\n\n    this.unbindEvents();\n  };\n\n  Modal.prototype.bindEvents = function() {\n    this.keyupHandler = this.keyupHandler.bind(this);\n    this.clickHandler = this.clickHandler.bind(this);\n    document.body.addEventListener('keyup', this.keyupHandler);\n    document.body.addEventListener('click', this.clickHandler);\n  };\n\n  Modal.prototype.unbindEvents = function() {\n    document.body.removeEventListener('keyup', this.keyupHandler);\n    document.body.removeEventListener('click', this.clickHandler);\n  };\n\n  Modal.prototype.keyupHandler = function(event) {\n    if (event.keyCode === 27) {\n      this.closeModal();\n    }\n  };\n\n  Modal.prototype.clickHandler = function(event) {\n    if (this.config.closeModalOnClick && !this.modal.contains(event.target)) {\n      this.closeModal();\n    }\n  };\n\n  return Modal;\n})();\n\n(function() {\n  var selectors = {\n    backButton: '.return-link'\n  };\n\n  var backButton = document.querySelector(selectors.backButton);\n\n  if (!document.referrer || !backButton || !window.history.length) {\n    return;\n  }\n\n  backButton.addEventListener(\n    'click',\n    function(evt) {\n      evt.preventDefault();\n\n      var referrerDomain = urlDomain(document.referrer);\n      var shopDomain = urlDomain(window.location.href);\n\n      if (shopDomain === referrerDomain) {\n        history.back();\n      }\n\n      return false;\n    },\n    { once: true }\n  );\n\n  function urlDomain(url) {\n    var anchor = document.createElement('a');\n    anchor.ref = url;\n\n    return anchor.hostname;\n  }\n})();\n\ntheme.Slideshow = (function() {\n  var selectors = {\n    button: '[data-slider-button]',\n    indicator: '[data-slider-indicator]',\n    indicators: '[data-slider-indicators]',\n    pause: '[data-slider-pause]',\n    slider: '[data-slider]',\n    sliderItem: '[data-slider-item]',\n    sliderItemLink: '[data-slider-item-link]',\n    sliderTrack: '[data-slider-track]',\n    sliderContainer: '[data-slider-container]'\n  };\n\n  var classes = {\n    isPaused: 'slideshow__pause--is-paused',\n    indicator: 'slider-indicators__item',\n    indicatorActive: 'slick-active',\n    sliderInitialized: 'slick-initialized',\n    slideActive: 'slideshow__slide--active',\n    slideClone: 'slick-cloned'\n  };\n\n  var attributes = {\n    buttonNext: 'data-slider-button-next'\n  };\n\n  function Slideshow(container, options) {\n    this.container = container;\n    this.slider = this.container.querySelector(selectors.slider);\n\n    if (!this.slider) return;\n\n    this.eventHandlers = {};\n    this.lastSlide = 0;\n    this.slideIndex = 0;\n    this.sliderContainer = null;\n    this.slides = [];\n    this.options = Object.assign(\n      {},\n      {\n        autoplay: false,\n        canUseKeyboardArrows: true,\n        canUseTouchEvents: false,\n        slideActiveClass: classes.slideActive,\n        slideInterval: 0,\n        slidesToShow: 0,\n        slidesToScroll: 1,\n        type: 'fade'\n      },\n      options\n    );\n\n    this.sliderContainer = this.slider.querySelector(selectors.sliderContainer);\n    this.adaptHeight =\n      this.sliderContainer.getAttribute('data-adapt-height') === 'true';\n    this.slides = Array.from(\n      this.sliderContainer.querySelectorAll(selectors.sliderItem)\n    );\n    // adding -1 to accomodate Array order\n    this.lastSlide = this.slides.length - 1;\n    this.buttons = this.container.querySelectorAll(selectors.button);\n    this.pause = this.container.querySelector(selectors.pause);\n    this.indicators = this.container.querySelectorAll(selectors.indicators);\n\n    if (this.slides.length <= 1) return;\n\n    this.timeout = 250;\n\n    if (this.options.autoplay) {\n      this.startAutoplay();\n    }\n\n    if (this.adaptHeight) {\n      this.setSlideshowHeight();\n    }\n\n    if (this.options.type === 'slide') {\n      this.isFirstSlide = false;\n      this.isLastSlide = false;\n      this.sliderItemWidthTotal = 0;\n      this.sliderTrack = this.slider.querySelector(selectors.sliderTrack);\n      // added setTimeout due to matchMedia calling too early\n      // which result wrong value when getting dimension from an element\n      this.sliderItemWidthTotal = 0;\n      theme.Helpers.promiseStylesheet().then(\n        function() {\n          this._setupSlideType();\n        }.bind(this)\n      );\n    } else {\n      this.setupSlider(0);\n    }\n\n    this._setupEventHandlers();\n  }\n\n  Slideshow.prototype = Object.assign({}, Slideshow.prototype, {\n    /**\n     * Moves to the previous slide\n     */\n    previousSlide: function() {\n      this._move();\n    },\n\n    /**\n     * Moves to the next slide\n     */\n    nextSlide: function() {\n      this._move('next');\n    },\n\n    /**\n     * Moves to the specified slide\n     * @param {Number} index - The index of the slide to move to\n     */\n    setSlide: function(index) {\n      this._setPosition(Number(index));\n    },\n\n    /**\n     * Starts autoplaying the slider if autoplay is enabled\n     */\n    startAutoplay: function() {\n      this.isAutoPlaying = true;\n\n      window.clearTimeout(this.autoTimeOut);\n\n      this.autoTimeOut = window.setTimeout(\n        function() {\n          var nextSlideIndex = this._getNextSlideIndex('next');\n          this._setPosition(nextSlideIndex);\n        }.bind(this),\n        this.options.slideInterval\n      );\n    },\n\n    /**\n     * Stops autoplaying the slider if autoplay is enabled\n     */\n    stopAutoplay: function() {\n      this.isAutoPlaying = false;\n\n      window.clearTimeout(this.autoTimeOut);\n    },\n\n    /**\n     * Set active states for sliders and indicators\n     * @param {index} integer - Slide index to set up slider from\n     */\n    setupSlider: function(index) {\n      this.slideIndex = index;\n\n      if (this.indicators.length) {\n        this._setActiveIndicator(index);\n      }\n\n      this._setupActiveSlide(index);\n    },\n\n    /**\n     * Removes event listeners, among other things when wanting to destroy the\n     * slider instance. This method needs to be called manually and will most\n     * likely be included in a section's onUnload() method.\n     */\n    destroy: function() {\n      if (this.adaptHeight) {\n        window.removeEventListener('resize', this.eventHandlers.debounceResize);\n      }\n\n      this.container.removeEventListener(\n        'focus',\n        this.eventHandlers.focus,\n        true\n      );\n      this.slider.removeEventListener(\n        'focusin',\n        this.eventHandlers.focusIn,\n        true\n      );\n      this.slider.removeEventListener(\n        'focusout',\n        this.eventHandlers.focusOut,\n        true\n      );\n      this.container.removeEventListener('blur', this.eventHandlers.blur, true);\n\n      if (this.buttons) {\n        this.buttons.forEach(\n          function(button) {\n            button.removeEventListener('click', this.eventHandlers.clickButton);\n          }.bind(this)\n        );\n      }\n\n      this.indicators.forEach(function(indicatorWrapper) {\n        indicatorWrapper.childNodes.forEach(function(indicator) {\n          indicator.firstElementChild.removeEventListener(\n            'click',\n            this.eventHandlers.onClickIndicator\n          );\n\n          indicator.firstElementChild.removeEventListener(\n            'keydown',\n            this.eventHandlers.onKeydownIndicator\n          );\n        }, this);\n      }, this);\n\n      if (this.options.type === 'slide') {\n        window.removeEventListener(\n          'resize',\n          this.eventHandlers.debounceResizeSlideIn\n        );\n\n        if (this.touchEvents && this.options.canUseTouchEvents) {\n          this.touchEvents.destroy();\n          this.touchEvents = null;\n        }\n      }\n    },\n\n    _setupEventHandlers: function() {\n      this.eventHandlers.focus = this._onFocus.bind(this);\n      this.eventHandlers.focusIn = this._onFocusIn.bind(this);\n      this.eventHandlers.focusOut = this._onFocusOut.bind(this);\n      this.eventHandlers.blur = this._onBlur.bind(this);\n      this.eventHandlers.keyUp = this._onKeyUp.bind(this);\n      this.eventHandlers.clickButton = this._onClickButton.bind(this);\n      this.eventHandlers.onClickIndicator = this._onClickIndicator.bind(this);\n      this.eventHandlers.onKeydownIndicator = this._onKeydownIndicator.bind(\n        this\n      );\n      this.eventHandlers.onClickPause = this._onClickPause.bind(this);\n\n      if (this.adaptHeight) {\n        this.eventHandlers.debounceResize = theme.Helpers.debounce(\n          function() {\n            this.setSlideshowHeight();\n          }.bind(this),\n          50\n        );\n\n        window.addEventListener('resize', this.eventHandlers.debounceResize);\n      }\n\n      this.container.addEventListener('focus', this.eventHandlers.focus, true);\n      this.slider.addEventListener('focusin', this.eventHandlers.focusIn, true);\n      this.slider.addEventListener(\n        'focusout',\n        this.eventHandlers.focusOut,\n        true\n      );\n      this.container.addEventListener('blur', this.eventHandlers.blur, true);\n\n      if (this.buttons) {\n        this.buttons.forEach(\n          function(button) {\n            button.addEventListener('click', this.eventHandlers.clickButton);\n          }.bind(this)\n        );\n      }\n\n      if (this.pause) {\n        this.pause.addEventListener('click', this.eventHandlers.onClickPause);\n      }\n\n      this.indicators.forEach(function(indicatorWrapper) {\n        indicatorWrapper.childNodes.forEach(function(indicator) {\n          indicator.firstElementChild.addEventListener(\n            'click',\n            this.eventHandlers.onClickIndicator\n          );\n\n          indicator.firstElementChild.addEventListener(\n            'keydown',\n            this.eventHandlers.onKeydownIndicator\n          );\n        }, this);\n      }, this);\n\n      if (this.options.type === 'slide') {\n        this.eventHandlers.debounceResizeSlideIn = theme.Helpers.debounce(\n          function() {\n            this.sliderItemWidthTotal = 0;\n            this._setupSlideType(true);\n          }.bind(this),\n          50\n        );\n\n        window.addEventListener(\n          'resize',\n          this.eventHandlers.debounceResizeSlideIn\n        );\n\n        if (\n          this.options.canUseTouchEvents &&\n          this.options.slidesToScroll < this.slides.length\n        ) {\n          this._setupTouchEvents();\n        }\n      }\n    },\n\n    _setupTouchEvents: function() {\n      this.touchEvents = new theme.TouchEvents(this.sliderTrack, {\n        start: function() {\n          this._onTouchStart();\n        }.bind(this),\n        move: function(event, direction, difference) {\n          this._onTouchMove(event, direction, difference);\n        }.bind(this),\n        end: function(event, direction, difference) {\n          this._onTouchEnd(event, direction, difference);\n        }.bind(this)\n      });\n    },\n\n    /**\n     * Set slideshop for \"slide-in\" effect\n     * @param {Boolean} onResize if function call came from resize event\n     */\n    _setupSlideType: function(onResize) {\n      this.sliderItemWidth = Math.floor(\n        this.sliderContainer.offsetWidth / this.options.slidesToShow\n      );\n      this.sliderTranslateXMove =\n        this.sliderItemWidth * this.options.slidesToScroll;\n\n      if (!onResize) {\n        this.sliderContainer.classList.add(classes.sliderInitialized);\n      }\n\n      // Loop through all slider items\n      // Set width according to the number of items to show in 1 slide\n      // Set container width to accomodate all items\n      this.slides.forEach(function(sliderItem, index) {\n        var sliderItemLink = sliderItem.querySelector(selectors.sliderItemLink);\n        sliderItem.style.width = this.sliderItemWidth + 'px';\n        sliderItem.setAttribute('aria-hidden', true);\n        sliderItem.setAttribute('tabindex', -1);\n        this.sliderItemWidthTotal =\n          this.sliderItemWidthTotal + sliderItem.offsetWidth;\n\n        if (sliderItemLink) {\n          sliderItemLink.setAttribute('tabindex', -1);\n        }\n\n        if (index < this.options.slidesToShow) {\n          sliderItem.setAttribute('aria-hidden', false);\n          sliderItem.classList.add(this.options.slideActiveClass);\n\n          if (sliderItemLink) {\n            sliderItemLink.setAttribute('tabindex', 0);\n          }\n        }\n      }, this);\n\n      this.sliderTrack.style.width =\n        Math.floor(this.sliderItemWidthTotal) + 'px';\n      this.sliderTrack.style.transform = 'translateX(-0px)';\n\n      // set disabled attribute on Previous button\n      if (this.buttons.length) {\n        this.buttons[0].setAttribute('aria-disabled', true);\n        this.buttons[1].removeAttribute('aria-disabled');\n      }\n\n      if (this.indicators.length) {\n        this._setActiveIndicator(0);\n      }\n    },\n\n    _onTouchStart: function() {\n      this.touchStartPosition = this._getTranslateXPosition();\n    },\n\n    _onTouchMove: function(event, direction, difference) {\n      // Fix touch events cause unexpected behaviour\n      // when the dragging motion goes beyond the theme editor preview.\n      var threshold = 80;\n      if (\n        Shopify.designMode &&\n        (event.clientX <= threshold ||\n          event.clientX >= window.innerWidth - threshold)\n      ) {\n        event.target.dispatchEvent(\n          new MouseEvent('mouseup', {\n            bubbles: true,\n            cancelable: true\n          })\n        );\n        return;\n      }\n\n      if (direction !== 'left' && direction !== 'right') return;\n\n      this.touchMovePosition = this.touchStartPosition + difference.xPosition;\n\n      this.sliderTrack.style.transform =\n        'translateX(' + this.touchMovePosition + 'px';\n    },\n\n    _onTouchEnd: function(event, direction, difference) {\n      var nextTranslateXPosition = 0;\n\n      if (Object.keys(difference).length === 0) return;\n\n      var slideDirection = direction === 'left' ? 'next' : '';\n\n      if (direction === 'left') {\n        if (this._isNextTranslateXLast(this.touchStartPosition)) {\n          nextTranslateXPosition = this.touchStartPosition;\n        } else {\n          nextTranslateXPosition =\n            this.touchStartPosition - this.sliderTranslateXMove;\n        }\n      } else {\n        nextTranslateXPosition =\n          this.touchStartPosition + this.sliderTranslateXMove;\n        if (this._isNextTranslateXFirst(this.touchStartPosition)) {\n          nextTranslateXPosition = 0;\n        }\n      }\n\n      this.slideIndex = this._getNextSlideIndex(slideDirection);\n\n      this.sliderTrack.style.transition = 'transform 500ms ease 0s';\n      this.sliderTrack.style.transform =\n        'translateX(' + nextTranslateXPosition + 'px';\n\n      window.setTimeout(\n        function() {\n          this.sliderTrack.style.transition = '';\n        }.bind(this),\n        500\n      );\n\n      this._verifyFirstLastSlideTranslateX(nextTranslateXPosition);\n\n      this._postTransitionEnd();\n    },\n\n    /**\n     * Events handlers for next and previous button\n     * @param {Object} event event handler\n     */\n    _onClickButton: function(event) {\n      // prevent multiple clicks\n      if (event.detail > 1) return;\n\n      var button = event.currentTarget;\n      var nextButton = button.hasAttribute(attributes.buttonNext);\n\n      if (\n        this.options.type === 'slide' &&\n        button.getAttribute('aria-disabled') === 'true'\n      ) {\n        return;\n      }\n\n      if (this.options.autoplay && this.isAutoPlaying) {\n        this.stopAutoplay();\n      }\n\n      if (nextButton) {\n        this.nextSlide();\n      } else {\n        this.previousSlide();\n      }\n    },\n\n    _onClickIndicator: function(event) {\n      event.preventDefault();\n\n      if (event.target.classList.contains(classes.indicatorActive)) return;\n\n      if (this.options.autoplay && this.isAutoPlaying) {\n        this.stopAutoplay();\n      }\n\n      this.slideIndex = Number(event.target.dataset.slideNumber);\n      this.goToSlideByIndex(this.slideIndex);\n    },\n\n    goToSlideByIndex: function(index) {\n      this._setPosition(index);\n\n      if (this.options.type === 'slide' && this.sliderTrack) {\n        this.sliderTrack.style.transition = 'transform 500ms ease 0s';\n        var newPosition = index * this.slides[0].offsetWidth;\n\n        this.sliderTrack.style.transform = 'translateX(-' + newPosition + 'px)';\n\n        if (this.options.slidesToShow > 1) {\n          this._verifyFirstLastSlideTranslateX(newPosition);\n\n          if (this.buttons.length) {\n            this._disableArrows();\n          }\n\n          this._setupMultipleActiveSlide(\n            index,\n            index + (this.options.slidesToShow - 1)\n          );\n        }\n      }\n    },\n\n    _onKeydownIndicator: function(event) {\n      if (event.keyCode !== slate.utils.keyboardKeys.ENTER) return;\n\n      this._onClickIndicator(event);\n\n      this.slider.focus();\n    },\n\n    _onClickPause: function(event) {\n      if (!event.currentTarget.classList.contains(classes.isPaused)) {\n        event.currentTarget.classList.add(classes.isPaused);\n        this.stopAutoplay();\n      } else {\n        event.currentTarget.classList.remove(classes.isPaused);\n        this.startAutoplay();\n      }\n    },\n\n    _onFocus: function() {\n      this.container.addEventListener('keyup', this.eventHandlers.keyUp);\n    },\n\n    _onFocusIn: function() {\n      if (this.slider.hasAttribute('aria-live')) return;\n\n      if (this.options.autoplay && this.isAutoPlaying) {\n        this.stopAutoplay();\n      }\n\n      this.slider.setAttribute('aria-live', 'polite');\n    },\n\n    _onBlur: function() {\n      this.container.removeEventListener('keyup', this.eventHandlers.keyUp);\n    },\n\n    _onFocusOut: function() {\n      this.slider.removeAttribute('aria-live');\n\n      // Adding a setTimeout because everytime we focus out\n      // It automatically goes to <body>\n      // We want to resume autoplay when focus is outside of the slideshow container\n      setTimeout(\n        function() {\n          if (\n            !document.activeElement.closest(\n              '#' + this.slider.getAttribute('id')\n            )\n          ) {\n            if (\n              this.options.autoplay &&\n              !this.isAutoPlaying &&\n              !this.pause.classList.contains(classes.isPaused)\n            ) {\n              this.startAutoplay();\n            }\n          }\n        }.bind(this),\n        this.timeout\n      );\n    },\n\n    _onKeyUp: function(event) {\n      switch (event.keyCode) {\n        case slate.utils.keyboardKeys.LEFTARROW:\n          if (!this.options.canUseKeyboardArrows) return;\n\n          if (this.options.type === 'slide' && this.isFirstSlide) {\n            return;\n          }\n\n          this.previousSlide();\n\n          break;\n        case slate.utils.keyboardKeys.RIGHTARROW:\n          if (!this.options.canUseKeyboardArrows) return;\n\n          if (this.options.type === 'slide' && this.isLastSlide) {\n            return;\n          }\n\n          this.nextSlide();\n\n          break;\n        case slate.utils.keyboardKeys.ESCAPE:\n          this.slider.blur();\n          break;\n      }\n    },\n\n    _move: function(direction) {\n      if (this.options.type === 'slide') {\n        this.slideIndex = this._getNextSlideIndex(direction);\n        this._moveSlideshow(direction);\n      } else {\n        var nextSlideIndex = this._getNextSlideIndex(direction);\n        this._setPosition(nextSlideIndex);\n      }\n    },\n\n    _moveSlideshow: function(direction) {\n      this.direction = direction;\n      var valueXToMove = 0;\n\n      // Get current position of translateX\n      var currentTranslateXPosition = this._getTranslateXPosition();\n      var currentActiveSlidesIndex = this._getActiveSlidesIndex();\n\n      // In the future, we'll use ES6 deconstructure\n      // Math.min(...currentActiveSlidesIndex);\n      var currentActiveSlidesMinIndex = Math.min.apply(\n        Math,\n        currentActiveSlidesIndex\n      );\n      var currentActiveSlidesMaxIndex = Math.max.apply(\n        Math,\n        currentActiveSlidesIndex\n      );\n\n      // Set the next active state depending on the direction\n      // We bump up the index depending on the \"slidesToShow\" option\n      this.nextMinIndex =\n        direction === 'next'\n          ? currentActiveSlidesMinIndex + this.options.slidesToShow\n          : currentActiveSlidesMinIndex - this.options.slidesToShow;\n      this.nextMaxIndex =\n        direction === 'next'\n          ? currentActiveSlidesMaxIndex + this.options.slidesToShow\n          : currentActiveSlidesMinIndex - 1;\n\n      this.sliderTrack.style.transition = 'transform 500ms ease 0s';\n\n      if (direction === 'next') {\n        valueXToMove = currentTranslateXPosition - this.sliderTranslateXMove;\n        this.sliderTrack.style.transform = 'translateX(' + valueXToMove + 'px)';\n      } else {\n        valueXToMove = currentTranslateXPosition + this.sliderTranslateXMove;\n        this.sliderTrack.style.transform = 'translateX(' + valueXToMove + 'px)';\n      }\n\n      this._verifyFirstLastSlideTranslateX(valueXToMove);\n\n      this._postTransitionEnd();\n\n      this._setupMultipleActiveSlide(this.nextMinIndex, this.nextMaxIndex);\n    },\n\n    _setPosition: function(nextSlideIndex) {\n      this.slideIndex = nextSlideIndex;\n\n      if (this.indicators.length) {\n        this._setActiveIndicator(nextSlideIndex);\n      }\n\n      this._setupActiveSlide(nextSlideIndex);\n\n      if (this.options.autoplay && this.isAutoPlaying) {\n        this.startAutoplay();\n      }\n\n      this.container.dispatchEvent(\n        new CustomEvent('slider_slide_changed', {\n          detail: nextSlideIndex\n        })\n      );\n    },\n\n    _setupActiveSlide: function(index) {\n      this.slides.forEach(function(slide) {\n        slide.setAttribute('aria-hidden', true);\n        slide.classList.remove(this.options.slideActiveClass);\n      }, this);\n\n      this.slides[index].setAttribute('aria-hidden', false);\n      this.slides[index].classList.add(this.options.slideActiveClass);\n    },\n\n    /**\n     * Loops through all slide items\n     * Set the active state depending the direction and slide indexes\n     * Because slide-in effect can have multiple items in 1 slide, we need to target multiple active elements\n     * @param {String} direction \"next\" for next slides or empty string for previous\n     * @param {*} minIndex the current active minimum index\n     * @param {*} maxIndex the current active maximum index\n     */\n    _setupMultipleActiveSlide: function(minIndex, maxIndex) {\n      this.slides.forEach(function(slide) {\n        var sliderIndex = Number(slide.getAttribute('data-slider-slide-index'));\n        var sliderItemLink = slide.querySelector(selectors.sliderItemLink);\n\n        slide.setAttribute('aria-hidden', true);\n        slide.classList.remove(this.options.slideActiveClass);\n        if (sliderItemLink) {\n          sliderItemLink.setAttribute('tabindex', -1);\n        }\n\n        if (sliderIndex >= minIndex && sliderIndex <= maxIndex) {\n          slide.setAttribute('aria-hidden', false);\n          slide.classList.add(this.options.slideActiveClass);\n\n          if (sliderItemLink) {\n            sliderItemLink.setAttribute('tabindex', 0);\n          }\n        }\n      }, this);\n    },\n\n    _setActiveIndicator: function(index) {\n      this.indicators.forEach(function(indicatorWrapper) {\n        var activeIndicator = indicatorWrapper.querySelector(\n          '.' + classes.indicatorActive\n        );\n\n        var nextIndicator = indicatorWrapper.childNodes[index];\n\n        if (activeIndicator) {\n          activeIndicator.setAttribute('aria-selected', false);\n          activeIndicator.classList.remove(classes.indicatorActive);\n          activeIndicator.firstElementChild.removeAttribute('aria-current');\n        }\n\n        nextIndicator.classList.add(classes.indicatorActive);\n        nextIndicator.setAttribute('aria-selected', true);\n        nextIndicator.firstElementChild.setAttribute('aria-current', true);\n      }, this);\n    },\n\n    setSlideshowHeight: function() {\n      var minAspectRatio = this.sliderContainer.getAttribute(\n        'data-min-aspect-ratio'\n      );\n      this.sliderContainer.style.height =\n        document.documentElement.offsetWidth / minAspectRatio + 'px';\n    },\n\n    /**\n     * Increase or decrease index position of the slideshow\n     * Automatically auto-rotate\n     * - Last slide goes to first slide when clicking \"next\"\n     * - First slide goes to last slide when clicking \"previous\"\n     * @param {String} direction \"next\" as a String, other empty string is previous slide\n     */\n    _getNextSlideIndex: function(direction) {\n      var counter = direction === 'next' ? 1 : -1;\n\n      if (direction === 'next') {\n        if (this.slideIndex === this.lastSlide) {\n          return this.options.type === 'slide' ? this.lastSlide : 0;\n        }\n      } else if (!this.slideIndex) {\n        return this.options.type === 'slide' ? 0 : this.lastSlide;\n      }\n\n      return this.slideIndex + counter;\n    },\n\n    /**\n     * In \"slide-in\" type, multiple items are active in 1 slide\n     * This will return an array containing their indexes\n     */\n    _getActiveSlidesIndex: function() {\n      var currentActiveSlides = this.slides.filter(function(sliderItem) {\n        if (sliderItem.classList.contains(this.options.slideActiveClass)) {\n          return sliderItem;\n        }\n      }, this);\n      var currentActiveSlidesIndex = currentActiveSlides.map(function(\n        sliderItem\n      ) {\n        return Number(sliderItem.getAttribute('data-slider-slide-index'));\n      });\n\n      return currentActiveSlidesIndex;\n    },\n\n    /**\n     * This checks the next \"translateX\" value and verifies\n     * If it's at the last slide or beginning of the slide\n     * So we can disable the arrow buttons\n     */\n    _disableArrows: function() {\n      if (this.buttons.length === 0) return;\n\n      var previousButton = this.buttons[0];\n      var nextButton = this.buttons[1];\n\n      // first slide\n      if (this.isFirstSlide) {\n        previousButton.setAttribute('aria-disabled', true);\n      } else {\n        previousButton.removeAttribute('aria-disabled');\n      }\n\n      // last slide\n      if (this.isLastSlide) {\n        nextButton.setAttribute('aria-disabled', true);\n      } else {\n        nextButton.removeAttribute('aria-disabled');\n      }\n    },\n\n    /**\n     * Verify if translateX reaches at first or last slide\n     * @param {Number} translateXValue\n     */\n    _verifyFirstLastSlideTranslateX: function(translateXValue) {\n      // first slide\n      if (this._isNextTranslateXFirst(translateXValue)) {\n        this.isFirstSlide = true;\n      } else {\n        this.isFirstSlide = false;\n      }\n\n      // last slide\n      if (this._isNextTranslateXLast(translateXValue)) {\n        this.isLastSlide = true;\n      } else {\n        this.isLastSlide = false;\n      }\n    },\n\n    _getTranslateXPosition: function() {\n      return Number(this.sliderTrack.style.transform.match(/(-?[0-9]+)/g)[0]);\n    },\n\n    _isNextTranslateXFirst: function(translateXValue) {\n      return translateXValue === 0;\n    },\n\n    _isNextTranslateXLast: function(translateXValue) {\n      // because translateX values are using negative, I'm converting into positive value\n      var translateXValueAbsolute = Math.abs(translateXValue);\n      var nextTranslateXValue =\n        translateXValueAbsolute + this.sliderTranslateXMove;\n\n      return nextTranslateXValue >= this.sliderItemWidthTotal;\n    },\n\n    _postTransitionEnd: function() {\n      if (this.buttons.length) {\n        this._disableArrows();\n      }\n\n      if (this.indicators.length) {\n        this._setActiveIndicator(this.slideIndex);\n      }\n    }\n  });\n\n  return Slideshow;\n})();\n\ntheme.Video = (function() {\n  var autoplayCheckComplete = false;\n  var playOnClickChecked = false;\n  var playOnClick = false;\n  var youtubeLoaded = false;\n  var videos = {};\n  var videoPlayers = [];\n  var videoOptions = {\n    ratio: 16 / 9,\n    scrollAnimationDuration: 400,\n    playerVars: {\n      // eslint-disable-next-line camelcase\n      iv_load_policy: 3,\n      modestbranding: 1,\n      autoplay: 0,\n      controls: 0,\n      wmode: 'opaque',\n      branding: 0,\n      autohide: 0,\n      rel: 0\n    },\n    events: {\n      onReady: onPlayerReady,\n      onStateChange: onPlayerChange\n    }\n  };\n  var classes = {\n    playing: 'video-is-playing',\n    paused: 'video-is-paused',\n    loading: 'video-is-loading',\n    loaded: 'video-is-loaded',\n    backgroundVideoWrapper: 'video-background-wrapper',\n    videoWithImage: 'video--image_with_play',\n    backgroundVideo: 'video--background',\n    userPaused: 'is-paused',\n    supportsAutoplay: 'autoplay',\n    supportsNoAutoplay: 'no-autoplay',\n    wrapperMinHeight: 'video-section-wrapper--min-height'\n  };\n\n  var selectors = {\n    section: '.video-section',\n    videoWrapper: '.video-section-wrapper',\n    playVideoBtn: '.video-control__play',\n    closeVideoBtn: '.video-control__close-wrapper',\n    pauseVideoBtn: '.video__pause',\n    pauseVideoStop: '.video__pause-stop',\n    pauseVideoResume: '.video__pause-resume',\n    fallbackText: '.icon__fallback-text'\n  };\n\n  /**\n   * Public functions\n   */\n  function init(video) {\n    if (!video) return;\n\n    videos[video.id] = {\n      id: video.id,\n      videoId: video.dataset.id,\n      type: video.dataset.type,\n      status:\n        video.dataset.type === 'image_with_play' ? 'closed' : 'background', // closed, open, background\n      video: video,\n      videoWrapper: video.closest(selectors.videoWrapper),\n      section: video.closest(selectors.section),\n      controls: video.dataset.type === 'background' ? 0 : 1\n    };\n\n    if (!youtubeLoaded) {\n      // This code loads the IFrame Player API code asynchronously.\n      var tag = document.createElement('script');\n      tag.src = 'https://www.youtube.com/iframe_api';\n      var firstScriptTag = document.getElementsByTagName('script')[0];\n      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n    }\n\n    playOnClickCheck();\n  }\n\n  function customPlayVideo(playerId) {\n    // Make sure we have carried out the playOnClick check first\n    if (!playOnClickChecked && !playOnClick) {\n      return;\n    }\n\n    if (playerId && typeof videoPlayers[playerId].playVideo === 'function') {\n      privatePlayVideo(playerId);\n    }\n  }\n\n  function pauseVideo(playerId) {\n    if (\n      videoPlayers[playerId] &&\n      typeof videoPlayers[playerId].pauseVideo === 'function'\n    ) {\n      videoPlayers[playerId].pauseVideo();\n    }\n  }\n\n  function loadVideos() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        createPlayer(key);\n      }\n    }\n\n    initEvents();\n    youtubeLoaded = true;\n  }\n\n  function editorLoadVideo(key) {\n    if (!youtubeLoaded) {\n      return;\n    }\n    createPlayer(key);\n\n    initEvents();\n  }\n\n  /**\n   * Private functions\n   */\n\n  function privatePlayVideo(id, clicked) {\n    var videoData = videos[id];\n    var player = videoPlayers[id];\n    var videoWrapper = videoData.videoWrapper;\n\n    if (playOnClick) {\n      // playOnClick means we are probably on mobile (no autoplay).\n      // setAsPlaying will show the iframe, requiring another click\n      // to play the video.\n      setAsPlaying(videoData);\n    } else if (clicked || autoplayCheckComplete) {\n      // Play if autoplay is available or clicked to play\n      videoWrapper.classList.remove(classes.loading);\n      setAsPlaying(videoData);\n      player.playVideo();\n      return;\n    } else {\n      player.playVideo();\n    }\n  }\n\n  function setAutoplaySupport(supported) {\n    var supportClass = supported\n      ? classes.supportsAutoplay\n      : classes.supportsNoAutoplay;\n    document.documentElement.classList.remove(\n      classes.supportsAutoplay,\n      classes.supportsNoAutoplay\n    );\n    document.documentElement.classList.add(supportClass);\n\n    if (!supported) {\n      playOnClick = true;\n    }\n\n    autoplayCheckComplete = true;\n  }\n\n  function playOnClickCheck() {\n    if (playOnClickChecked) {\n      return;\n    }\n\n    if (isMobile()) {\n      playOnClick = true;\n    }\n\n    if (playOnClick) {\n      // No need to also do the autoplay check\n      setAutoplaySupport(false);\n    }\n\n    playOnClickChecked = true;\n  }\n\n  // The API will call this function when each video player is ready\n  function onPlayerReady(evt) {\n    evt.target.setPlaybackQuality('hd1080');\n    var videoData = getVideoOptions(evt);\n    var videoTitle = evt.target.getVideoData().title;\n    playOnClickCheck();\n\n    // Prevent tabbing through YouTube player controls until visible\n    document.getElementById(videoData.id).setAttribute('tabindex', '-1');\n\n    sizeBackgroundVideos();\n    setButtonLabels(videoData.videoWrapper, videoTitle);\n\n    // Customize based on options from the video ID\n    if (videoData.type === 'background') {\n      evt.target.mute();\n      privatePlayVideo(videoData.id);\n    }\n\n    videoData.videoWrapper.classList.add(classes.loaded);\n  }\n\n  function onPlayerChange(evt) {\n    var videoData = getVideoOptions(evt);\n    if (\n      videoData.status === 'background' &&\n      !isMobile() &&\n      !autoplayCheckComplete &&\n      (evt.data === YT.PlayerState.PLAYING ||\n        evt.data === YT.PlayerState.BUFFERING)\n    ) {\n      setAutoplaySupport(true);\n      autoplayCheckComplete = true;\n      videoData.videoWrapper.classList.remove(classes.loading);\n    }\n    switch (evt.data) {\n      case YT.PlayerState.ENDED:\n        setAsFinished(videoData);\n        break;\n      case YT.PlayerState.PAUSED:\n        // Seeking on a YouTube video also fires a PAUSED state change,\n        // checking the state after a delay prevents us pausing the video when\n        // the user is seeking instead of pausing\n        setTimeout(function() {\n          if (evt.target.getPlayerState() === YT.PlayerState.PAUSED) {\n            setAsPaused(videoData);\n          }\n        }, 200);\n        break;\n    }\n  }\n\n  function setAsFinished(videoData) {\n    switch (videoData.type) {\n      case 'background':\n        videoPlayers[videoData.id].seekTo(0);\n        break;\n      case 'image_with_play':\n        closeVideo(videoData.id);\n        toggleExpandVideo(videoData.id, false);\n        break;\n    }\n  }\n\n  function setAsPlaying(videoData) {\n    var videoWrapper = videoData.videoWrapper;\n    var pauseButton = videoWrapper.querySelector(selectors.pauseVideoBtn);\n\n    videoWrapper.classList.remove(classes.loading);\n\n    if (pauseButton.classList.contains(classes.userPaused)) {\n      pauseButton.classList.remove(classes.userPaused);\n    }\n\n    // Do not change element visibility if it is a background video\n    if (videoData.status === 'background') {\n      return;\n    }\n\n    document.getElementById(videoData.id).setAttribute('tabindex', '0');\n\n    if (videoData.type === 'image_with_play') {\n      videoWrapper.classList.remove(classes.paused);\n      videoWrapper.classList.add(classes.playing);\n    }\n\n    // Update focus to the close button so we stay within the video wrapper,\n    // allowing time for the scroll animation\n    setTimeout(function() {\n      videoWrapper.querySelector(selectors.closeVideoBtn).focus();\n    }, videoOptions.scrollAnimationDuration);\n  }\n\n  function setAsPaused(videoData) {\n    var videoWrapper = videoData.videoWrapper;\n\n    // YT's events fire after our click event. This status flag ensures\n    // we don't interact with a closed or background video.\n    if (videoData.type === 'image_with_play') {\n      if (videoData.status === 'closed') {\n        videoWrapper.classList.remove(classes.paused);\n      } else {\n        videoWrapper.classList.add(classes.paused);\n      }\n    }\n\n    videoWrapper.classList.remove(classes.playing);\n  }\n\n  function closeVideo(playerId) {\n    var videoData = videos[playerId];\n    var videoWrapper = videoData.videoWrapper;\n\n    document.getElementById(videoData.id).setAttribute('tabindex', '-1');\n\n    videoData.status = 'closed';\n\n    switch (videoData.type) {\n      case 'image_with_play':\n        videoPlayers[playerId].stopVideo();\n        setAsPaused(videoData); // in case the video is already paused\n        break;\n      case 'background':\n        videoPlayers[playerId].mute();\n        setBackgroundVideo(playerId);\n        break;\n    }\n\n    videoWrapper.classList.remove(classes.paused, classes.playing);\n  }\n\n  function getVideoOptions(evt) {\n    var id = evt.target.getIframe().id;\n    return videos[id];\n  }\n\n  function toggleExpandVideo(playerId, expand) {\n    var video = videos[playerId];\n    var elementTop =\n      video.videoWrapper.getBoundingClientRect().top + window.pageYOffset;\n    var playButton = video.videoWrapper.querySelector(selectors.playVideoBtn);\n    var offset = 0;\n    var newHeight = 0;\n\n    if (isMobile()) {\n      video.videoWrapper.parentElement.classList.toggle('page-width', !expand);\n    }\n\n    if (expand) {\n      if (isMobile()) {\n        newHeight = window.innerWidth / videoOptions.ratio;\n      } else {\n        newHeight = video.videoWrapper.offsetWidth / videoOptions.ratio;\n      }\n      offset = (window.innerHeight - newHeight) / 2;\n\n      video.videoWrapper.style.height =\n        video.videoWrapper.getBoundingClientRect().height + 'px';\n      video.videoWrapper.classList.remove(classes.wrapperMinHeight);\n      video.videoWrapper.style.height = newHeight + 'px';\n\n      // Animate doesn't work in mobile editor, so we don't use it\n      if (!(isMobile() && Shopify.designMode)) {\n        var scrollBehavior = document.documentElement.style.scrollBehavior;\n        document.documentElement.style.scrollBehavior = 'smooth';\n        window.scrollTo({ top: elementTop - offset });\n        document.documentElement.style.scrollBehavior = scrollBehavior;\n      }\n    } else {\n      if (isMobile()) {\n        newHeight = video.videoWrapper.dataset.mobileHeight;\n      } else {\n        newHeight = video.videoWrapper.dataset.desktopHeight;\n      }\n\n      video.videoWrapper.style.height = newHeight + 'px';\n\n      setTimeout(function() {\n        video.videoWrapper.classList.add(classes.wrapperMinHeight);\n      }, 600);\n      // Set focus on play button, but don't scroll page\n      var x = window.scrollX;\n      var y = window.scrollY;\n      playButton.focus();\n      window.scrollTo(x, y);\n    }\n  }\n\n  function togglePause(playerId) {\n    var pauseButton = videos[playerId].videoWrapper.querySelector(\n      selectors.pauseVideoBtn\n    );\n    var paused = pauseButton.classList.contains(classes.userPaused);\n    if (paused) {\n      pauseButton.classList.remove(classes.userPaused);\n      customPlayVideo(playerId);\n    } else {\n      pauseButton.classList.add(classes.userPaused);\n      pauseVideo(playerId);\n    }\n    pauseButton.setAttribute('aria-pressed', !paused);\n  }\n\n  function startVideoOnClick(playerId) {\n    var video = videos[playerId];\n\n    // add loading class to wrapper\n    video.videoWrapper.classList.add(classes.loading);\n\n    // Explicity set the video wrapper height (needed for height transition)\n    video.videoWrapper.style.height = video.videoWrapper.offsetHeight + 'px';\n\n    video.status = 'open';\n\n    switch (video.type) {\n      case 'image_with_play':\n        privatePlayVideo(playerId, true);\n        break;\n      case 'background':\n        unsetBackgroundVideo(playerId, video);\n        videoPlayers[playerId].unMute();\n        privatePlayVideo(playerId, true);\n        break;\n    }\n\n    toggleExpandVideo(playerId, true);\n\n    // esc to close video player\n    document.addEventListener('keydown', handleVideoPlayerKeydown);\n  }\n\n  var handleVideoPlayerKeydown = function(evt) {\n    var playerId = document.activeElement.dataset.controls;\n    if (evt.keyCode !== slate.utils.keyboardKeys.ESCAPE || !playerId) {\n      return;\n    }\n\n    closeVideo(playerId);\n    toggleExpandVideo(playerId, false);\n  };\n\n  function sizeBackgroundVideos() {\n    var backgroundVideos = document.querySelectorAll(\n      '.' + classes.backgroundVideo\n    );\n    backgroundVideos.forEach(function(el) {\n      sizeBackgroundVideo(el);\n    });\n  }\n\n  function sizeBackgroundVideo(videoPlayer) {\n    if (!youtubeLoaded) {\n      return;\n    }\n\n    if (isMobile()) {\n      videoPlayer.style.cssText = null;\n    } else {\n      var videoWrapper = videoPlayer.closest(selectors.videoWrapper);\n      var videoWidth = videoWrapper.clientWidth;\n      var playerWidth = videoPlayer.clientWidth;\n      var desktopHeight = videoWrapper.dataset.desktopHeight;\n\n      // when screen aspect ratio differs from video, video must center and underlay one dimension\n      if (videoWidth / videoOptions.ratio < desktopHeight) {\n        playerWidth = Math.ceil(desktopHeight * videoOptions.ratio); // get new player width\n        var styles =\n          'width: ' +\n          playerWidth +\n          'px; height: ' +\n          desktopHeight +\n          'px; left: ' +\n          (videoWidth - playerWidth) / 2 +\n          'px; top: 0;';\n        videoPlayer.style.cssText = styles;\n      } else {\n        // new video width < window width (gap to right)\n        desktopHeight = Math.ceil(videoWidth / videoOptions.ratio); // get new player height\n        var styles2 =\n          'width: ' +\n          videoWidth +\n          'px; height: ' +\n          desktopHeight +\n          'px; top: ' +\n          (desktopHeight - desktopHeight) / 2 +\n          'px; left: 0;'; // player height is greater, offset top; reset left\n        videoPlayer.style.cssText = styles2;\n      }\n\n      theme.Helpers.prepareTransition(videoPlayer);\n      videoWrapper.classList.add(classes.loaded);\n    }\n  }\n\n  function unsetBackgroundVideo(playerId) {\n    // Switch the background video to a chrome-only player once played\n    var player = document.getElementById(playerId);\n    player.classList.remove(classes.backgroundVideo);\n    player.classList.add(classes.videoWithImage);\n\n    setTimeout(function() {\n      document.getElementById(playerId).style.cssText = null;\n    }, 600);\n\n    videos[playerId].videoWrapper.classList.remove(\n      classes.backgroundVideoWrapper\n    );\n    videos[playerId].videoWrapper.classList.add(classes.playing);\n\n    videos[playerId].status = 'open';\n  }\n\n  function setBackgroundVideo(playerId) {\n    var player = document.getElementById(playerId);\n    player.classList.remove(classes.videoWithImage);\n    player.classList.add(classes.backgroundVideo);\n\n    videos[playerId].videoWrapper.classList.add(classes.backgroundVideoWrapper);\n\n    videos[playerId].status = 'background';\n    sizeBackgroundVideo(player);\n  }\n\n  function isMobile() {\n    return window.innerWidth < theme.breakpoints.medium;\n  }\n\n  var handleWindowResize = theme.Helpers.debounce(function() {\n    if (!youtubeLoaded) return;\n    var key;\n    var fullscreen = window.innerHeight === screen.height;\n    sizeBackgroundVideos();\n\n    if (isMobile()) {\n      for (key in videos) {\n        if (videos.hasOwnProperty(key)) {\n          if (videos[key].videoWrapper.classList.contains(classes.playing)) {\n            if (!fullscreen) {\n              pauseVideo(key);\n              setAsPaused(videos[key]);\n            }\n          }\n          videos[key].videoWrapper.style.height =\n            document.documentElement.clientWidth / videoOptions.ratio + 'px';\n        }\n      }\n      setAutoplaySupport(false);\n    } else {\n      setAutoplaySupport(true);\n      for (key in videos) {\n        var videosWithImage = videos[key].videoWrapper.querySelectorAll(\n          '.' + classes.videoWithImage\n        );\n        if (videosWithImage.length) {\n          continue;\n        }\n        videoPlayers[key].playVideo();\n        setAsPlaying(videos[key]);\n      }\n    }\n  }, 200);\n\n  var handleWindowScroll = theme.Helpers.debounce(function() {\n    if (!youtubeLoaded) return;\n\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var videoWrapper = videos[key].videoWrapper;\n        var condition =\n          videoWrapper.getBoundingClientRect().top +\n            window.pageYOffset +\n            videoWrapper.offsetHeight * 0.75 <\n            window.pageYOffset ||\n          videoWrapper.getBoundingClientRect().top +\n            window.pageYOffset +\n            videoWrapper.offsetHeight * 0.25 >\n            window.pageYOffset + window.innerHeight;\n\n        // Close the video if more than 75% of it is scrolled out of view\n        if (videoWrapper.classList.contains(classes.playing)) {\n          if (!condition) return;\n          closeVideo(key);\n          toggleExpandVideo(key, false);\n        }\n      }\n    }\n  }, 50);\n\n  function initEvents() {\n    var playVideoBtns = document.querySelectorAll(selectors.playVideoBtn);\n    var closeVideoBtns = document.querySelectorAll(selectors.closeVideoBtn);\n    var pauseVideoBtns = document.querySelectorAll(selectors.pauseVideoBtn);\n\n    playVideoBtns.forEach(function(btn) {\n      btn.addEventListener('click', function(evt) {\n        var playerId = evt.currentTarget.dataset.controls;\n        startVideoOnClick(playerId);\n      });\n    });\n\n    closeVideoBtns.forEach(function(btn) {\n      btn.addEventListener('click', function(evt) {\n        var playerId = evt.currentTarget.dataset.controls;\n\n        evt.currentTarget.blur();\n        closeVideo(playerId);\n        toggleExpandVideo(playerId, false);\n      });\n    });\n\n    pauseVideoBtns.forEach(function(btn) {\n      btn.addEventListener('click', function(evt) {\n        var playerId = evt.currentTarget.dataset.controls;\n        togglePause(playerId);\n      });\n    });\n\n    // Listen to resize to keep a background-size:cover-like layout\n    window.addEventListener('resize', handleWindowResize);\n\n    window.addEventListener('scroll', handleWindowScroll);\n  }\n\n  function createPlayer(key) {\n    var args = Object.assign(videoOptions, videos[key]);\n\n    args.playerVars.controls = args.controls;\n    videoPlayers[key] = new YT.Player(key, args);\n  }\n\n  function removeEvents() {\n    document.removeEventListener('keydown', handleVideoPlayerKeydown);\n    window.removeEventListener('resize', handleWindowResize);\n    window.removeEventListener('scroll', handleWindowScroll);\n  }\n\n  function setButtonLabels(videoWrapper, title) {\n    var playButtons = videoWrapper.querySelectorAll(selectors.playVideoBtn);\n    var closeButton = videoWrapper.querySelector(selectors.closeVideoBtn);\n    var pauseButton = videoWrapper.querySelector(selectors.pauseVideoBtn);\n    var closeButtonText = closeButton.querySelector(selectors.fallbackText);\n\n    var pauseButtonStop = pauseButton.querySelector(selectors.pauseVideoStop);\n    var pauseButtonStopText = pauseButtonStop.querySelector(\n      selectors.fallbackText\n    );\n\n    var pauseButtonResume = pauseButton.querySelector(\n      selectors.pauseVideoResume\n    );\n    var pauseButtonResumeText = pauseButtonResume.querySelector(\n      selectors.fallbackText\n    );\n\n    // Insert the video title retrieved from YouTube into the instructional text\n    // for each button\n    playButtons.forEach(function(playButton) {\n      var playButtonText = playButton.querySelector(selectors.fallbackText);\n\n      playButtonText.textContent = playButtonText.textContent.replace(\n        '[video_title]',\n        title\n      );\n    });\n    closeButtonText.textContent = closeButtonText.textContent.replace(\n      '[video_title]',\n      title\n    );\n    pauseButtonStopText.textContent = pauseButtonStopText.textContent.replace(\n      '[video_title]',\n      title\n    );\n    pauseButtonResumeText.textContent = pauseButtonResumeText.textContent.replace(\n      '[video_title]',\n      title\n    );\n  }\n\n  return {\n    init: init,\n    editorLoadVideo: editorLoadVideo,\n    loadVideos: loadVideos,\n    playVideo: customPlayVideo,\n    pauseVideo: pauseVideo,\n    removeEvents: removeEvents\n  };\n})();\n\ntheme.ProductVideo = (function() {\n  var videos = {};\n\n  var hosts = {\n    shopify: 'shopify',\n    external: 'external'\n  };\n\n  var selectors = {\n    productMediaWrapper: '[data-product-single-media-wrapper]'\n  };\n\n  var attributes = {\n    enableVideoLooping: 'enable-video-looping',\n    videoId: 'video-id'\n  };\n\n  function init(videoContainer, sectionId) {\n    if (!videoContainer) {\n      return;\n    }\n\n    var videoElement = videoContainer.querySelector('iframe, video');\n\n    if (!videoElement) {\n      return;\n    }\n\n    var mediaId = videoContainer.getAttribute('data-media-id');\n\n    videos[mediaId] = {\n      mediaId: mediaId,\n      sectionId: sectionId,\n      host: hostFromVideoElement(videoElement),\n      container: videoContainer,\n      element: videoElement,\n      ready: function() {\n        createPlayer(this);\n      }\n    };\n\n    window.Shopify.loadFeatures([\n      {\n        name: 'video-ui',\n        version: '2.0',\n        onLoad: setupVideos\n      }\n    ]);\n    theme.LibraryLoader.load('plyrShopifyStyles');\n  }\n\n  function setupVideos(errors) {\n    if (errors) {\n      fallbackToNativeVideo();\n      return;\n    }\n\n    loadVideos();\n  }\n\n  function createPlayer(video) {\n    if (video.player) {\n      return;\n    }\n\n    var productMediaWrapper = video.container.closest(\n      selectors.productMediaWrapper\n    );\n\n    var enableLooping =\n      productMediaWrapper.getAttribute(\n        'data-' + attributes.enableVideoLooping\n      ) === 'true';\n\n    // eslint-disable-next-line no-undef\n    video.player = new Shopify.Video(video.element, {\n      loop: { active: enableLooping }\n    });\n\n    var pauseVideo = function() {\n      if (!video.player) return;\n      video.player.pause();\n    };\n\n    productMediaWrapper.addEventListener('mediaHidden', pauseVideo);\n    productMediaWrapper.addEventListener('xrLaunch', pauseVideo);\n\n    productMediaWrapper.addEventListener('mediaVisible', function() {\n      if (theme.Helpers.isTouch()) return;\n      if (!video.player) return;\n      video.player.play();\n    });\n  }\n\n  function hostFromVideoElement(video) {\n    if (video.tagName === 'VIDEO') {\n      return hosts.shopify;\n    }\n\n    return hosts.external;\n  }\n\n  function loadVideos() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n        video.ready();\n      }\n    }\n  }\n\n  function fallbackToNativeVideo() {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.nativeVideo) continue;\n\n        if (video.host === hosts.shopify) {\n          video.element.setAttribute('controls', 'controls');\n          video.nativeVideo = true;\n        }\n      }\n    }\n  }\n\n  function removeSectionVideos(sectionId) {\n    for (var key in videos) {\n      if (videos.hasOwnProperty(key)) {\n        var video = videos[key];\n\n        if (video.sectionId === sectionId) {\n          if (video.player) video.player.destroy();\n          delete videos[key];\n        }\n      }\n    }\n  }\n\n  return {\n    init: init,\n    hosts: hosts,\n    loadVideos: loadVideos,\n    removeSectionVideos: removeSectionVideos\n  };\n})();\n\ntheme.ProductModel = (function() {\n  var modelJsonSections = {};\n  var models = {};\n  var xrButtons = {};\n\n  var selectors = {\n    mediaGroup: '[data-product-single-media-group]',\n    xrButton: '[data-shopify-xr]'\n  };\n\n  function init(modelViewerContainers, sectionId) {\n    modelJsonSections[sectionId] = {\n      loaded: false\n    };\n\n    modelViewerContainers.forEach(function(modelViewerContainer, index) {\n      var mediaId = modelViewerContainer.getAttribute('data-media-id');\n      var modelViewerElement = modelViewerContainer.querySelector(\n        'model-viewer'\n      );\n      var modelId = modelViewerElement.getAttribute('data-model-id');\n\n      if (index === 0) {\n        var mediaGroup = modelViewerContainer.closest(selectors.mediaGroup);\n        var xrButton = mediaGroup.querySelector(selectors.xrButton);\n        xrButtons[sectionId] = {\n          element: xrButton,\n          defaultId: modelId\n        };\n      }\n\n      models[mediaId] = {\n        modelId: modelId,\n        sectionId: sectionId,\n        container: modelViewerContainer,\n        element: modelViewerElement\n      };\n    });\n\n    window.Shopify.loadFeatures([\n      {\n        name: 'shopify-xr',\n        version: '1.0',\n        onLoad: setupShopifyXr\n      },\n      {\n        name: 'model-viewer-ui',\n        version: '1.0',\n        onLoad: setupModelViewerUi\n      }\n    ]);\n    theme.LibraryLoader.load('modelViewerUiStyles');\n  }\n\n  function setupShopifyXr(errors) {\n    if (errors) return;\n\n    if (!window.ShopifyXR) {\n      document.addEventListener('shopify_xr_initialized', function() {\n        setupShopifyXr();\n      });\n      return;\n    }\n\n    for (var sectionId in modelJsonSections) {\n      if (modelJsonSections.hasOwnProperty(sectionId)) {\n        var modelSection = modelJsonSections[sectionId];\n\n        if (modelSection.loaded) continue;\n        var modelJson = document.querySelector('#ModelJson-' + sectionId);\n\n        window.ShopifyXR.addModels(JSON.parse(modelJson.innerHTML));\n        modelSection.loaded = true;\n      }\n    }\n    window.ShopifyXR.setupXRElements();\n  }\n\n  function setupModelViewerUi(errors) {\n    if (errors) return;\n\n    for (var key in models) {\n      if (models.hasOwnProperty(key)) {\n        var model = models[key];\n        if (!model.modelViewerUi) {\n          model.modelViewerUi = new Shopify.ModelViewerUI(model.element);\n        }\n        setupModelViewerListeners(model);\n      }\n    }\n  }\n\n  function setupModelViewerListeners(model) {\n    var xrButton = xrButtons[model.sectionId];\n\n    model.container.addEventListener('mediaVisible', function() {\n      xrButton.element.setAttribute('data-shopify-model3d-id', model.modelId);\n      if (theme.Helpers.isTouch()) return;\n      model.modelViewerUi.play();\n    });\n\n    model.container.addEventListener('mediaHidden', function() {\n      xrButton.element.setAttribute(\n        'data-shopify-model3d-id',\n        xrButton.defaultId\n      );\n      model.modelViewerUi.pause();\n    });\n\n    model.container.addEventListener('xrLaunch', function() {\n      model.modelViewerUi.pause();\n    });\n  }\n\n  function removeSectionModels(sectionId) {\n    for (var key in models) {\n      if (models.hasOwnProperty(key)) {\n        var model = models[key];\n        if (model.sectionId === sectionId) {\n          models[key].modelViewerUi.destroy();\n          delete models[key];\n        }\n      }\n    }\n    delete modelJsonSections[sectionId];\n  }\n\n  return {\n    init: init,\n    removeSectionModels: removeSectionModels\n  };\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.FormStatus = (function() {\n  var selectors = {\n    statusMessage: '[data-form-status]'\n  };\n\n  function init() {\n    var statusMessages = document.querySelectorAll(selectors.statusMessage);\n\n    statusMessages.forEach(function(statusMessage) {\n      statusMessage.setAttribute('tabindex', -1);\n      statusMessage.focus();\n\n      statusMessage.addEventListener(\n        'blur',\n        function(evt) {\n          evt.target.removeAttribute('tabindex');\n        },\n        { once: true }\n      );\n    });\n  }\n\n  return {\n    init: init\n  };\n})();\n\ntheme.Hero = (function() {\n  var classes = {\n    indexSectionFlush: 'index-section--flush'\n  };\n\n  var selectors = {\n    heroFixedWidthContent: '.hero-fixed-width__content',\n    heroFixedWidthImage: '.hero-fixed-width__image'\n  };\n\n  function hero(el, sectionId) {\n    var hero = document.querySelector(el);\n    var layout = hero.getAttribute('data-layout');\n    var parentSection = document.querySelector('#shopify-section-' + sectionId);\n    var heroContent = parentSection.querySelector(\n      selectors.heroFixedWidthContent\n    );\n    var heroImage = parentSection.querySelector(selectors.heroFixedWidthImage);\n\n    if (layout !== 'fixed_width') {\n      return;\n    }\n\n    parentSection.classList.remove(classes.indexSectionFlush);\n    heroFixedHeight();\n\n    window.addEventListener('resize', function() {\n      theme.Helpers.debounce(function() {\n        heroFixedHeight();\n      }, 50);\n    });\n\n    function heroFixedHeight() {\n      var contentHeight;\n      var imageHeight;\n\n      if (heroContent) {\n        contentHeight = heroContent.offsetHeight + 50;\n      }\n\n      if (heroImage) {\n        imageHeight = heroImage.offsetHeight;\n      }\n\n      if (contentHeight > imageHeight) {\n        heroImage.style.minHeight = contentHeight + 'px';\n      }\n    }\n  }\n\n  return hero;\n})();\n\n// prettier-ignore\nwindow.theme = window.theme || {};\n\ntheme.SearchResultsTemplate = (function() {\n  function renderResults(products, isLoading, searchQuery) {\n    return [\n      '<div class=\"predictive-search\">',\n      renderHeader(products, isLoading),\n      renderProducts(products, searchQuery),\n      '</div>'\n    ].join('');\n  }\n\n  function renderHeader(products, isLoading) {\n    if (products.length === 0) {\n      return '';\n    }\n\n    return [\n      '<div class=\"predictive-search-title\">',\n      '<h3 id=\"predictive-search\" class=\"predictive-search-title__content\">' +\n        theme.strings.products +\n        '</h3>',\n      '<span class=\"predictive-search-title__loading-spinner\">' +\n        (isLoading\n          ? '<span class= \"icon-predictive-search-spinner\" ></span >'\n          : '') +\n        '</span>',\n      '</div>'\n    ].join('');\n  }\n\n  function loadingState() {\n    return [\n      '<div class=\"predictive-search\">',\n      '<div class=\"predictive-search-loading\">',\n      '<span class=\"visually-hidden\">' + theme.strings.loading + '</span>',\n      '<span class=\"predictive-search-loading__icon\">',\n      '<span class=\"icon-predictive-search-spinner\"></span>',\n      '</span>',\n      '</div>',\n      '</div>'\n    ].join('');\n  }\n\n  function renderViewAll(searchQuery) {\n    return [\n      '<button type=\"submit\" class=\"predictive-search-view-all__button\" tabindex=\"-1\">',\n      theme.strings.searchFor +\n        '<span class=\"predictive-search-view-all__query\"> &ldquo;' +\n        _htmlEscape(searchQuery) +\n        '&rdquo;</span>',\n      '</button>'\n    ].join('');\n  }\n\n  function renderProducts(products, searchQuery) {\n    var resultsCount = products.length;\n\n    return [\n      '<ul id=\"predictive-search-results\" class=\"predictive-search__list\" role=\"listbox\" aria-labelledby=\"predictive-search\">',\n      products\n        .map(function(product, index) {\n          return renderProduct(normalizeProduct(product), index, resultsCount);\n        })\n        .join(''),\n      '<li id=\"search-all\" class=\"predictive-search-view-all\" role=\"option\" data-search-result>' +\n        renderViewAll(searchQuery) +\n        '</li>',\n      '</ul>'\n    ].join('');\n  }\n\n  function renderProduct(product, index, resultsCount) {\n    return [\n      '<li id=\"search-result-' +\n        index +\n        '\" class=\"predictive-search-item\" role=\"option\" data-search-result>',\n      '<a class=\"predictive-search-item__link\" href=\"' +\n        product.url +\n        '\" tabindex=\"-1\">',\n      '<div class=\"predictive-search__column predictive-search__column--image\" data-image-loading-animation>',\n      renderProductImage(product),\n      '</div>',\n      '<div class=\"predictive-search__column predictive-search__column--content ' +\n        (getDetailsCount() ? '' : 'predictive-search__column--center') +\n        '\">',\n      '<span class=\"predictive-search-item__title\">',\n      '<span class=\"predictive-search-item__title-text\">' +\n        product.title +\n        '</span>',\n      '</span>' + (getDetailsCount() ? renderProductDetails(product) : ''),\n      '<span class=\"visually-hidden\">, </span>',\n      '<span class=\"visually-hidden\">' +\n        getNumberOfResultsString(index + 1, resultsCount) +\n        '</span>',\n      '</div>',\n      '</a>',\n      '</li>'\n    ].join('');\n  }\n\n  function renderProductImage(product) {\n    if (product.image === null) {\n      return '';\n    }\n\n    return (\n      '<img class=\"predictive-search-item__image lazyload\" src=\"' +\n      product.image.url +\n      '\" data-src=\"' +\n      product.image.url +\n      '\" data-image alt=\"' +\n      product.image.alt +\n      '\" />'\n    );\n  }\n\n  function renderProductDetails(product) {\n    return [\n      '<dl class=\"predictive-search-item__details price' +\n        (product.isOnSale ? ' price--on-sale' : '') +\n        (!product.available ? ' price--sold-out' : '') +\n        (!product.isPriceVaries && product.isCompareVaries\n          ? ' price--compare-price-hidden'\n          : '') +\n        '\">',\n      '<div class=\"predictive-search-item__detail\">',\n      renderVendor(product),\n      '</div>',\n      '<div class=\"predictive-search-item__detail predictive-search-item__detail--inline\">' +\n        renderProductPrice(product),\n      '</div>',\n      '</dl>'\n    ].join('');\n  }\n  function renderProductPrice(product) {\n    if (!theme.settings.predictiveSearchShowPrice) {\n      return '';\n    }\n\n    var accessibilityAnnounceComma = '<span class=\"visually-hidden\">, </span>';\n\n    var priceMarkup =\n      '<div class=\"price__regular\">' + renderPrice(product) + '</div>';\n\n    var salePriceMarkup =\n      '<div class=\"price__sale\">' + renderSalePrice(product) + '</div>';\n\n    return (\n      accessibilityAnnounceComma +\n      '<div class=\"price__pricing-group\">' +\n      (product.isOnSale ? salePriceMarkup : priceMarkup) +\n      '</div>'\n    );\n  }\n\n  function renderSalePrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.salePrice + '</span>',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price predictive-search-item__price--sale\">' +\n        (product.isPriceVaries\n          ? theme.strings.fromLowestPrice.replace('[price]', product.price)\n          : product.price) +\n        '</span>',\n      '</dd>',\n      '<div class=\"price__compare\">' + renderCompareAtPrice(product) + '</div>'\n    ].join('');\n  }\n\n  function renderCompareAtPrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' +\n        theme.strings.regularPrice +\n        '</span> ',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price predictive-search-item__price--compare\">' +\n        product.compareAtPrice +\n        '</span>',\n      '</dd>'\n    ].join('');\n  }\n\n  function renderPrice(product) {\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.regularPrice + '</span>',\n      '</dt>',\n      '<dd>',\n      '<span class=\"predictive-search-item__price\">' +\n        (product.isPriceVaries\n          ? theme.strings.fromLowestPrice.replace('[price]', product.price)\n          : product.price) +\n        '</span>',\n      '</dd>'\n    ].join('');\n  }\n\n  function renderVendor(product) {\n    if (!theme.settings.predictiveSearchShowVendor || product.vendor === '') {\n      return '';\n    }\n\n    return [\n      '<dt>',\n      '<span class=\"visually-hidden\">' + theme.strings.vendor + '</span>',\n      '</dt>',\n      '<dd class=\"predictive-search-item__vendor\">' + product.vendor + '</dd>'\n    ].join('');\n  }\n\n  function normalizeProduct(product) {\n    var productOrVariant =\n      product.variants.length > 0 ? product.variants[0] : product;\n\n    return {\n      url: productOrVariant.url,\n      image: getProductImage(product),\n      title: product.title,\n      vendor: product.vendor || '',\n      price: theme.Currency.formatMoney(product.price_min, theme.moneyFormat),\n      compareAtPrice: theme.Currency.formatMoney(\n        product.compare_at_price_min,\n        theme.moneyFormat\n      ),\n      available: product.available,\n      isOnSale: isOnSale(product),\n      isPriceVaries: isPriceVaries(product),\n      isCompareVaries: isCompareVaries(product)\n    };\n  }\n\n  function getProductImage(product) {\n    var image;\n    var featuredImage;\n\n    if (product.variants.length > 0 && product.variants[0].image !== null) {\n      featuredImage = product.variants[0].featured_image;\n    } else if (product.image) {\n      featuredImage = product.featured_image;\n    } else {\n      image = null;\n    }\n\n    if (image !== null) {\n      image = {\n        url: theme.Images.getSizedImageUrl(featuredImage.url, '100x'),\n        alt: featuredImage.alt\n      };\n    }\n\n    return image;\n  }\n\n  function isOnSale(product) {\n    return (\n      product.compare_at_price_min !== null &&\n      parseInt(product.compare_at_price_min, 10) >\n        parseInt(product.price_min, 10)\n    );\n  }\n\n  function isPriceVaries(product) {\n    return product.price_max !== product.price_min;\n  }\n\n  function isCompareVaries(product) {\n    return product.compare_at_price_max !== product.compare_at_price_min;\n  }\n\n  // Returns the number of optional product details to be shown,\n  // values of the detailsList need to be boolean.\n  function getDetailsCount() {\n    var detailsList = [\n      theme.settings.predictiveSearchShowPrice,\n      theme.settings.predictiveSearchShowVendor\n    ];\n\n    var detailsCount = detailsList.reduce(function(acc, detail) {\n      return acc + (detail ? 1 : 0);\n    }, 0);\n\n    return detailsCount;\n  }\n\n  function getNumberOfResultsString(resultNumber, resultsCount) {\n    return theme.strings.number_of_results\n      .replace('[result_number]', resultNumber)\n      .replace('[results_count]', resultsCount);\n  }\n\n  function _htmlEscape(input) {\n    return input\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  return function(data) {\n    var products = data.products || [];\n    var isLoading = data.isLoading;\n    var searchQuery = data.searchQuery || '';\n\n    if (isLoading && products.length === 0) {\n      return loadingState();\n    }\n\n    return renderResults(products, isLoading, searchQuery);\n  };\n})();\n\nwindow.theme = window.theme || {};\n\n(function() {\n  // (a11y) This function will be used by the Predictive Search Component\n  // to announce the number of search results\n  function numberOfResultsTemplateFct(data) {\n    if (data.products.length === 1) {\n      return theme.strings.one_result_found;\n    } else {\n      return theme.strings.number_of_results_found.replace(\n        '[results_count]',\n        data.products.length\n      );\n    }\n  }\n\n  // (a11y) This function will be used by the Predictive Search Component\n  // to announce that it's loading results\n  function loadingResultsMessageTemplateFct() {\n    return theme.strings.loading;\n  }\n\n  function isPredictiveSearchSupported() {\n    var shopifyFeatures = JSON.parse(\n      document.getElementById('shopify-features').textContent\n    );\n\n    return shopifyFeatures.predictiveSearch;\n  }\n\n  function isPredictiveSearchEnabled() {\n    return window.theme.settings.predictiveSearchEnabled;\n  }\n\n  function canInitializePredictiveSearch() {\n    return isPredictiveSearchSupported() && isPredictiveSearchEnabled();\n  }\n\n  // listen for search submits and validate query\n  function validateSearchHandler(searchEl, submitEl) {\n    submitEl.addEventListener(\n      'click',\n      validateSearchInput.bind(this, searchEl)\n    );\n  }\n\n  // if there is nothing in the search field, prevent submit\n  function validateSearchInput(searchEl, evt) {\n    var isInputValueEmpty = searchEl.value.trim().length === 0;\n    if (!isInputValueEmpty) {\n      return;\n    }\n\n    if (typeof evt !== 'undefined') {\n      evt.preventDefault();\n    }\n\n    searchEl.focus();\n  }\n\n  window.theme.SearchPage = (function() {\n    var selectors = {\n      searchReset: '[data-search-page-predictive-search-clear]',\n      searchInput: '[data-search-page-predictive-search-input]',\n      searchSubmit: '[data-search-page-predictive-search-submit]',\n      searchResults: '[data-predictive-search-mount=\"default\"]'\n    };\n\n    var componentInstance;\n\n    function init(config) {\n      var searchInput = document.querySelector(selectors.searchInput);\n      var searchSubmit = document.querySelector(selectors.searchSubmit);\n      var searchUrl = searchInput.dataset.baseUrl;\n\n      componentInstance = new window.Shopify.theme.PredictiveSearchComponent({\n        selectors: {\n          input: selectors.searchInput,\n          reset: selectors.searchReset,\n          result: selectors.searchResults\n        },\n        searchUrl: searchUrl,\n        resultTemplateFct: window.theme.SearchResultsTemplate,\n        numberOfResultsTemplateFct: numberOfResultsTemplateFct,\n        loadingResultsMessageTemplateFct: loadingResultsMessageTemplateFct,\n        onOpen: function(nodes) {\n          if (config.isTabletAndUp) {\n            return;\n          }\n\n          var searchInputBoundingRect = searchInput.getBoundingClientRect();\n          var bodyHeight = document.body.offsetHeight;\n          var offset = 50;\n          var resultsMaxHeight =\n            bodyHeight - searchInputBoundingRect.bottom - offset;\n\n          nodes.result.style.maxHeight = resultsMaxHeight + 'px';\n        },\n        onBeforeDestroy: function(nodes) {\n          // If the viewport width changes from mobile to tablet\n          // reset the top position of the results\n          nodes.result.style.maxHeight = '';\n        }\n      });\n\n      validateSearchHandler(searchInput, searchSubmit);\n    }\n\n    function unload() {\n      if (!componentInstance) {\n        return;\n      }\n      componentInstance.destroy();\n      componentInstance = null;\n    }\n\n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n\n  window.theme.SearchHeader = (function() {\n    var selectors = {\n      searchInput: '[data-predictive-search-drawer-input]',\n      searchResults: '[data-predictive-search-mount=\"drawer\"]',\n      searchFormContainer: '[data-search-form-container]',\n      searchSubmit: '[data-search-form-submit]'\n    };\n\n    var componentInstance;\n\n    function init(config) {\n      var searchInput = document.querySelector(selectors.searchInput);\n      var searchSubmit = document.querySelector(selectors.searchSubmit);\n      var searchUrl = searchInput.dataset.baseUrl;\n\n      componentInstance = new window.Shopify.theme.PredictiveSearchComponent({\n        selectors: {\n          input: selectors.searchInput,\n          result: selectors.searchResults\n        },\n        searchUrl: searchUrl,\n        resultTemplateFct: window.theme.SearchResultsTemplate,\n        numberOfResultsTemplateFct: numberOfResultsTemplateFct,\n        numberOfResults: config.numberOfResults,\n        loadingResultsMessageTemplateFct: loadingResultsMessageTemplateFct,\n        onInputBlur: function() {\n          return false;\n        },\n        onOpen: function(nodes) {\n          var searchInputBoundingRect = searchInput.getBoundingClientRect();\n\n          // For tablet screens and up, stop the scroll area from extending past\n          // the bottom of the screen because we're locking the body scroll\n          var maxHeight =\n            window.innerHeight -\n            searchInputBoundingRect.bottom -\n            (config.isTabletAndUp ? 20 : 0);\n\n          nodes.result.style.top = config.isTabletAndUp\n            ? ''\n            : searchInputBoundingRect.bottom + 'px';\n          nodes.result.style.maxHeight = maxHeight + 'px';\n        },\n        onClose: function(nodes) {\n          nodes.result.style.maxHeight = '';\n        },\n        onBeforeDestroy: function(nodes) {\n          // If the viewport width changes from mobile to tablet\n          // reset the top position of the results\n          nodes.result.style.top = '';\n        }\n      });\n\n      validateSearchHandler(searchInput, searchSubmit);\n    }\n\n    function unload() {\n      if (!componentInstance) {\n        return;\n      }\n\n      componentInstance.destroy();\n      componentInstance = null;\n    }\n\n    function clearAndClose() {\n      if (!componentInstance) {\n        return;\n      }\n\n      componentInstance.clearAndClose();\n    }\n\n    return {\n      init: init,\n      unload: unload,\n      clearAndClose: clearAndClose\n    };\n  })();\n\n  window.theme.Search = (function() {\n    var classes = {\n      searchTemplate: 'template-search'\n    };\n    var selectors = {\n      siteHeader: '.site-header'\n    };\n    var mediaQueryList = {\n      mobile: window.matchMedia('(max-width: 749px)'),\n      tabletAndUp: window.matchMedia('(min-width: 750px)')\n    };\n\n    function init() {\n      if (!document.querySelector(selectors.siteHeader)) {\n        return;\n      }\n\n      if (!canInitializePredictiveSearch()) {\n        return;\n      }\n\n      Object.keys(mediaQueryList).forEach(function(device) {\n        mediaQueryList[device].addListener(initSearchAccordingToViewport);\n      });\n\n      initSearchAccordingToViewport();\n    }\n\n    function initSearchAccordingToViewport() {\n      theme.SearchDrawer.close();\n      theme.SearchHeader.unload();\n      theme.SearchPage.unload();\n\n      if (mediaQueryList.mobile.matches) {\n        theme.SearchHeader.init({\n          numberOfResults: 4,\n          isTabletAndUp: false\n        });\n\n        if (isSearchPage()) {\n          theme.SearchPage.init({ isTabletAndUp: false });\n        }\n      } else {\n        // Tablet and up\n        theme.SearchHeader.init({\n          numberOfResults: 4,\n          isTabletAndUp: true\n        });\n\n        if (isSearchPage()) {\n          theme.SearchPage.init({ isTabletAndUp: true });\n        }\n      }\n    }\n\n    function isSearchPage() {\n      return document.body.classList.contains(classes.searchTemplate);\n    }\n\n    function unload() {\n      theme.SearchHeader.unload();\n      theme.SearchPage.unload();\n    }\n\n    return {\n      init: init,\n      unload: unload\n    };\n  })();\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.SearchDrawer = (function() {\n  var selectors = {\n    headerSection: '[data-header-section]',\n    drawer: '[data-predictive-search-drawer]',\n    drawerOpenButton: '[data-predictive-search-open-drawer]',\n    headerSearchInput: '[data-predictive-search-drawer-input]',\n    predictiveSearchWrapper: '[data-predictive-search-mount=\"drawer\"]'\n  };\n\n  var drawerInstance;\n\n  function init() {\n    setAccessibilityProps();\n\n    drawerInstance = new theme.Drawers('SearchDrawer', 'top', {\n      onDrawerOpen: function() {\n        setHeight();\n        theme.MobileNav.closeMobileNav();\n        lockBodyScroll();\n      },\n      onDrawerClose: function() {\n        theme.SearchHeader.clearAndClose();\n        var drawerOpenButton = document.querySelector(\n          selectors.drawerOpenButton\n        );\n\n        if (drawerOpenButton) drawerOpenButton.focus();\n\n        unlockBodyScroll();\n      },\n      withPredictiveSearch: true,\n      elementToFocusOnOpen: document.querySelector(selectors.headerSearchInput)\n    });\n  }\n\n  function setAccessibilityProps() {\n    var drawerOpenButton = document.querySelector(selectors.drawerOpenButton);\n\n    if (drawerOpenButton) {\n      drawerOpenButton.setAttribute('aria-controls', 'SearchDrawer');\n      drawerOpenButton.setAttribute('aria-expanded', 'false');\n      drawerOpenButton.setAttribute('aria-controls', 'dialog');\n    }\n  }\n\n  function setHeight() {\n    var searchDrawer = document.querySelector(selectors.drawer);\n    var headerHeight = document.querySelector(selectors.headerSection)\n      .offsetHeight;\n\n    searchDrawer.style.height = headerHeight + 'px';\n  }\n\n  function close() {\n    drawerInstance.close();\n  }\n\n  function lockBodyScroll() {\n    theme.Helpers.enableScrollLock();\n  }\n\n  function unlockBodyScroll() {\n    theme.Helpers.disableScrollLock();\n  }\n\n  return {\n    init: init,\n    close: close\n  };\n})();\n\ntheme.Disclosure = (function() {\n  var selectors = {\n    disclosureForm: '[data-disclosure-form]',\n    disclosureList: '[data-disclosure-list]',\n    disclosureToggle: '[data-disclosure-toggle]',\n    disclosureInput: '[data-disclosure-input]',\n    disclosureOptions: '[data-disclosure-option]'\n  };\n\n  var classes = {\n    listVisible: 'disclosure-list--visible'\n  };\n\n  function Disclosure(disclosure) {\n    this.container = disclosure;\n    this._cacheSelectors();\n    this._setupListeners();\n  }\n\n  Disclosure.prototype = Object.assign({}, Disclosure.prototype, {\n    _cacheSelectors: function() {\n      this.cache = {\n        disclosureForm: this.container.closest(selectors.disclosureForm),\n        disclosureList: this.container.querySelector(selectors.disclosureList),\n        disclosureToggle: this.container.querySelector(\n          selectors.disclosureToggle\n        ),\n        disclosureInput: this.container.querySelector(\n          selectors.disclosureInput\n        ),\n        disclosureOptions: this.container.querySelectorAll(\n          selectors.disclosureOptions\n        )\n      };\n    },\n\n    _setupListeners: function() {\n      this.eventHandlers = this._setupEventHandlers();\n\n      this.cache.disclosureToggle.addEventListener(\n        'click',\n        this.eventHandlers.toggleList\n      );\n\n      this.cache.disclosureOptions.forEach(function(disclosureOption) {\n        disclosureOption.addEventListener(\n          'click',\n          this.eventHandlers.connectOptions\n        );\n      }, this);\n\n      this.container.addEventListener(\n        'keyup',\n        this.eventHandlers.onDisclosureKeyUp\n      );\n\n      this.cache.disclosureList.addEventListener(\n        'focusout',\n        this.eventHandlers.onDisclosureListFocusOut\n      );\n\n      this.cache.disclosureToggle.addEventListener(\n        'focusout',\n        this.eventHandlers.onDisclosureToggleFocusOut\n      );\n\n      document.body.addEventListener('click', this.eventHandlers.onBodyClick);\n    },\n\n    _setupEventHandlers: function() {\n      return {\n        connectOptions: this._connectOptions.bind(this),\n        toggleList: this._toggleList.bind(this),\n        onBodyClick: this._onBodyClick.bind(this),\n        onDisclosureKeyUp: this._onDisclosureKeyUp.bind(this),\n        onDisclosureListFocusOut: this._onDisclosureListFocusOut.bind(this),\n        onDisclosureToggleFocusOut: this._onDisclosureToggleFocusOut.bind(this)\n      };\n    },\n\n    _connectOptions: function(event) {\n      event.preventDefault();\n\n      this._submitForm(event.currentTarget.dataset.value);\n    },\n\n    _onDisclosureToggleFocusOut: function(event) {\n      var disclosureLostFocus =\n        this.container.contains(event.relatedTarget) === false;\n\n      if (disclosureLostFocus) {\n        this._hideList();\n      }\n    },\n\n    _onDisclosureListFocusOut: function(event) {\n      var childInFocus = event.currentTarget.contains(event.relatedTarget);\n\n      var isVisible = this.cache.disclosureList.classList.contains(\n        classes.listVisible\n      );\n\n      if (isVisible && !childInFocus) {\n        this._hideList();\n      }\n    },\n\n    _onDisclosureKeyUp: function(event) {\n      if (event.which !== slate.utils.keyboardKeys.ESCAPE) return;\n      this._hideList();\n      this.cache.disclosureToggle.focus();\n    },\n\n    _onBodyClick: function(event) {\n      var isOption = this.container.contains(event.target);\n      var isVisible = this.cache.disclosureList.classList.contains(\n        classes.listVisible\n      );\n\n      if (isVisible && !isOption) {\n        this._hideList();\n      }\n    },\n\n    _submitForm: function(value) {\n      this.cache.disclosureInput.value = value;\n      this.cache.disclosureForm.submit();\n    },\n\n    _hideList: function() {\n      this.cache.disclosureList.classList.remove(classes.listVisible);\n      this.cache.disclosureToggle.setAttribute('aria-expanded', false);\n    },\n\n    _toggleList: function() {\n      var ariaExpanded =\n        this.cache.disclosureToggle.getAttribute('aria-expanded') === 'true';\n      this.cache.disclosureList.classList.toggle(classes.listVisible);\n      this.cache.disclosureToggle.setAttribute('aria-expanded', !ariaExpanded);\n    },\n\n    destroy: function() {\n      this.cache.disclosureToggle.removeEventListener(\n        'click',\n        this.eventHandlers.toggleList\n      );\n\n      this.cache.disclosureOptions.forEach(function(disclosureOption) {\n        disclosureOption.removeEventListener(\n          'click',\n          this.eventHandlers.connectOptions\n        );\n      }, this);\n\n      this.container.removeEventListener(\n        'keyup',\n        this.eventHandlers.onDisclosureKeyUp\n      );\n\n      this.cache.disclosureList.removeEventListener(\n        'focusout',\n        this.eventHandlers.onDisclosureListFocusOut\n      );\n\n      this.cache.disclosureToggle.removeEventListener(\n        'focusout',\n        this.eventHandlers.onDisclosureToggleFocusOut\n      );\n\n      document.body.removeEventListener(\n        'click',\n        this.eventHandlers.onBodyClick\n      );\n    }\n  });\n\n  return Disclosure;\n})();\n\ntheme.Zoom = (function() {\n  var selectors = {\n    imageZoom: '[data-image-zoom]'\n  };\n\n  var classes = {\n    zoomImg: 'zoomImg'\n  };\n\n  var attributes = {\n    imageZoomTarget: 'data-image-zoom-target'\n  };\n\n  function Zoom(container) {\n    this.container = container;\n    this.cache = {};\n    this.url = container.dataset.zoom;\n\n    this._cacheSelectors();\n\n    if (!this.cache.sourceImage) return;\n\n    this._duplicateImage();\n  }\n\n  Zoom.prototype = Object.assign({}, Zoom.prototype, {\n    _cacheSelectors: function() {\n      this.cache = {\n        sourceImage: this.container.querySelector(selectors.imageZoom)\n      };\n    },\n\n    _init: function() {\n      var targetWidth = this.cache.targetImage.width;\n      var targetHeight = this.cache.targetImage.height;\n\n      if (this.cache.sourceImage === this.cache.targetImage) {\n        this.sourceWidth = targetWidth;\n        this.sourceHeight = targetHeight;\n      } else {\n        this.sourceWidth = this.cache.sourceImage.width;\n        this.sourceHeight = this.cache.sourceImage.height;\n      }\n\n      this.xRatio =\n        (this.cache.sourceImage.width - targetWidth) / this.sourceWidth;\n      this.yRatio =\n        (this.cache.sourceImage.height - targetHeight) / this.sourceHeight;\n    },\n\n    _start: function(e) {\n      this._init();\n      this._move(e);\n    },\n\n    _stop: function() {\n      this.cache.targetImage.style.opacity = 0;\n    },\n\n    /**\n     * Sets the correct coordinates top and left position in px\n     * It sets a limit within between 0 and the max height of the image\n     * So when the mouse leaves the target image, it could\n     * never go above or beyond the target image zone\n     */\n    _setTopLeftMaxValues: function(top, left) {\n      return {\n        left: Math.max(Math.min(left, this.sourceWidth), 0),\n        top: Math.max(Math.min(top, this.sourceHeight), 0)\n      };\n    },\n\n    _move: function(e) {\n      // get left and top position within the \"source image\" zone\n      var left =\n        e.pageX -\n        (this.cache.sourceImage.getBoundingClientRect().left + window.scrollX);\n      var top =\n        e.pageY -\n        (this.cache.sourceImage.getBoundingClientRect().top + window.scrollY);\n      // make sure the left and top position don't go\n      // above or beyond the target image zone\n      var position = this._setTopLeftMaxValues(top, left);\n\n      top = position.top;\n      left = position.left;\n\n      this.cache.targetImage.style.left = -(left * -this.xRatio) + 'px';\n      this.cache.targetImage.style.top = -(top * -this.yRatio) + 'px';\n      this.cache.targetImage.style.opacity = 1;\n    },\n\n    /**\n     * This loads a high resolution image\n     * via the data attributes url\n     * It adds all necessary CSS styles and adds to the container\n     */\n    _duplicateImage: function() {\n      this._loadImage()\n        .then(\n          function(image) {\n            this.cache.targetImage = image;\n            image.style.width = image.width + 'px';\n            image.style.height = image.height + 'px';\n            image.style.position = 'absolute';\n            image.style.maxWidth = 'none';\n            image.style.maxHeight = 'none';\n            image.style.opacity = 0;\n            image.style.border = 'none';\n            image.style.left = 0;\n            image.style.top = 0;\n\n            this.container.appendChild(image);\n\n            this._init();\n\n            this._start = this._start.bind(this);\n            this._stop = this._stop.bind(this);\n            this._move = this._move.bind(this);\n\n            this.container.addEventListener('mouseenter', this._start);\n            this.container.addEventListener('mouseleave', this._stop);\n            this.container.addEventListener('mousemove', this._move);\n\n            this.container.style.position = 'relative';\n            this.container.style.overflow = 'hidden';\n          }.bind(this)\n        )\n        .catch(function(error) {\n          // eslint-disable-next-line no-console\n          console.warn('Error fetching image', error);\n        });\n    },\n\n    _loadImage: function() {\n      // eslint-disable-next-line\n      return new Promise(function(resolve, reject) {\n          var image = new Image();\n          image.setAttribute('role', 'presentation');\n          image.setAttribute(attributes.imageZoomTarget, true);\n          image.classList.add(classes.zoomImg);\n          image.src = this.url;\n\n          image.addEventListener('load', function() {\n            resolve(image);\n          });\n\n          image.addEventListener('error', function(error) {\n            reject(error);\n          });\n        }.bind(this)\n      );\n    },\n\n    unload: function() {\n      var targetImage = this.container.querySelector(\n        '[' + attributes.imageZoomTarget + ']'\n      );\n      if (targetImage) {\n        targetImage.remove();\n      }\n\n      this.container.removeEventListener('mouseenter', this._start);\n      this.container.removeEventListener('mouseleave', this._stop);\n      this.container.removeEventListener('mousemove', this._move);\n    }\n  });\n\n  return Zoom;\n})();\n\n\n/* ================ TEMPLATES ================ */\n(function() {\n  var filterBys = document.querySelectorAll('[data-blog-tag-filter]');\n\n  if (!filterBys.length) return;\n\n  slate.utils.resizeSelects(filterBys);\n\n  filterBys.forEach(function(filterBy) {\n    filterBy.addEventListener('change', function(evt) {\n      location.href = evt.target.value;\n    });\n  });\n})();\n\nwindow.theme = theme || {};\n\ntheme.customerTemplates = (function() {\n  var selectors = {\n    RecoverHeading: '#RecoverHeading',\n    RecoverEmail: '#RecoverEmail',\n    LoginHeading: '#LoginHeading'\n  };\n\n  function initEventListeners() {\n    this.recoverHeading = document.querySelector(selectors.RecoverHeading);\n    this.recoverEmail = document.querySelector(selectors.RecoverEmail);\n    this.loginHeading = document.querySelector(selectors.LoginHeading);\n    var recoverPassword = document.getElementById('RecoverPassword');\n    var hideRecoverPasswordLink = document.getElementById(\n      'HideRecoverPasswordLink'\n    );\n\n    // Show reset password form\n    if (recoverPassword) {\n      recoverPassword.addEventListener(\n        'click',\n        function(evt) {\n          evt.preventDefault();\n          showRecoverPasswordForm();\n          this.recoverHeading.setAttribute('tabindex', '-1');\n          this.recoverHeading.focus();\n        }.bind(this)\n      );\n    }\n\n    // Hide reset password form\n    if (hideRecoverPasswordLink) {\n      hideRecoverPasswordLink.addEventListener(\n        'click',\n        function(evt) {\n          evt.preventDefault();\n          hideRecoverPasswordForm();\n          this.loginHeading.setAttribute('tabindex', '-1');\n          this.loginHeading.focus();\n        }.bind(this)\n      );\n    }\n\n    if (this.recoverHeading) {\n      this.recoverHeading.addEventListener('blur', function(evt) {\n        evt.target.removeAttribute('tabindex');\n      });\n    }\n\n    if (this.loginHeading) {\n      this.loginHeading.addEventListener('blur', function(evt) {\n        evt.target.removeAttribute('tabindex');\n      });\n    }\n  }\n\n  /**\n   *\n   *  Show/Hide recover password form\n   *\n   */\n\n  function showRecoverPasswordForm() {\n    document.getElementById('RecoverPasswordForm').classList.remove('hide');\n    document.getElementById('CustomerLoginForm').classList.add('hide');\n\n    if (this.recoverEmail.getAttribute('aria-invalid') === 'true') {\n      this.recoverEmail.focus();\n    }\n  }\n\n  function hideRecoverPasswordForm() {\n    document.getElementById('RecoverPasswordForm').classList.add('hide');\n    document.getElementById('CustomerLoginForm').classList.remove('hide');\n  }\n\n  /**\n   *\n   *  Show reset password success message\n   *\n   */\n  function resetPasswordSuccess() {\n    var formState = document.querySelector('.reset-password-success');\n\n    // check if reset password form was successfully submited.\n    if (!formState) {\n      return;\n    }\n\n    // show success message\n    var resetSuccess = document.getElementById('ResetSuccess');\n    resetSuccess.classList.remove('hide');\n    resetSuccess.focus();\n  }\n\n  /**\n   *\n   *  Show/hide customer address forms\n   *\n   */\n  function customerAddressForm() {\n    var newAddressForm = document.getElementById('AddressNewForm');\n    var newAddressFormButton = document.getElementById('AddressNewButton');\n\n    if (!newAddressForm) {\n      return;\n    }\n\n    // Initialize observers on address selectors, defined in shopify_common.js\n    if (Shopify) {\n      // eslint-disable-next-line no-new\n      new Shopify.CountryProvinceSelector(\n        'AddressCountryNew',\n        'AddressProvinceNew',\n        {\n          hideElement: 'AddressProvinceContainerNew'\n        }\n      );\n    }\n\n    // Initialize each edit form's country/province selector\n    document\n      .querySelectorAll('.address-country-option')\n      .forEach(function(option) {\n        var formId = option.dataset.formId;\n        var countrySelector = 'AddressCountry_' + formId;\n        var provinceSelector = 'AddressProvince_' + formId;\n        var containerSelector = 'AddressProvinceContainer_' + formId;\n\n        // eslint-disable-next-line no-new\n        new Shopify.CountryProvinceSelector(countrySelector, provinceSelector, {\n          hideElement: containerSelector\n        });\n      });\n\n    // Toggle new/edit address forms\n    document.querySelectorAll('.address-new-toggle').forEach(function(button) {\n      button.addEventListener('click', function() {\n        var isExpanded =\n          newAddressFormButton.getAttribute('aria-expanded') === 'true';\n\n        newAddressForm.classList.toggle('hide');\n        newAddressFormButton.setAttribute('aria-expanded', !isExpanded);\n        newAddressFormButton.focus();\n      });\n    });\n\n    document.querySelectorAll('.address-edit-toggle').forEach(function(button) {\n      button.addEventListener('click', function(evt) {\n        var formId = evt.target.dataset.formId;\n        var editButton = document.getElementById('EditFormButton_' + formId);\n        var editAddress = document.getElementById('EditAddress_' + formId);\n        var isExpanded = editButton.getAttribute('aria-expanded') === 'true';\n\n        editAddress.classList.toggle('hide');\n        editButton.setAttribute('aria-expanded', !isExpanded);\n        editButton.focus();\n      });\n    });\n\n    document.querySelectorAll('.address-delete').forEach(function(button) {\n      button.addEventListener('click', function(evt) {\n        var target = evt.target.dataset.target;\n        var confirmMessage = evt.target.dataset.confirmMessage;\n\n        // eslint-disable-next-line no-alert\n        if (\n          confirm(\n            confirmMessage || 'Are you sure you wish to delete this address?'\n          )\n        ) {\n          Shopify.postLink(target, {\n            parameters: { _method: 'delete' }\n          });\n        }\n      });\n    });\n  }\n\n  /**\n   *\n   *  Check URL for reset password hash\n   *\n   */\n  function checkUrlHash() {\n    var hash = window.location.hash;\n\n    // Allow deep linking to recover password form\n    if (hash === '#recover') {\n      showRecoverPasswordForm.bind(this)();\n    }\n  }\n\n  return {\n    init: function() {\n      initEventListeners();\n      checkUrlHash();\n      resetPasswordSuccess();\n      customerAddressForm();\n    }\n  };\n})();\n\n\n/*================ SECTIONS ================*/\nwindow.theme = window.theme || {};\n\ntheme.Cart = (function() {\n  var selectors = {\n    cartCount: '[data-cart-count]',\n    cartCountBubble: '[data-cart-count-bubble]',\n    cartDiscount: '[data-cart-discount]',\n    cartDiscountTitle: '[data-cart-discount-title]',\n    cartDiscountAmount: '[data-cart-discount-amount]',\n    cartDiscountWrapper: '[data-cart-discount-wrapper]',\n    cartErrorMessage: '[data-cart-error-message]',\n    cartErrorMessageWrapper: '[data-cart-error-message-wrapper]',\n    cartItem: '[data-cart-item]',\n    cartItemDetails: '[data-cart-item-details]',\n    cartItemDiscount: '[data-cart-item-discount]',\n    cartItemDiscountedPriceGroup: '[data-cart-item-discounted-price-group]',\n    cartItemDiscountTitle: '[data-cart-item-discount-title]',\n    cartItemDiscountAmount: '[data-cart-item-discount-amount]',\n    cartItemDiscountList: '[data-cart-item-discount-list]',\n    cartItemFinalPrice: '[data-cart-item-final-price]',\n    cartItemImage: '[data-cart-item-image]',\n    cartItemLinePrice: '[data-cart-item-line-price]',\n    cartItemOriginalPrice: '[data-cart-item-original-price]',\n    cartItemPrice: '[data-cart-item-price]',\n    cartItemPriceList: '[data-cart-item-price-list]',\n    cartItemProperty: '[data-cart-item-property]',\n    cartItemPropertyName: '[data-cart-item-property-name]',\n    cartItemPropertyValue: '[data-cart-item-property-value]',\n    cartItemRegularPriceGroup: '[data-cart-item-regular-price-group]',\n    cartItemRegularPrice: '[data-cart-item-regular-price]',\n    cartItemTitle: '[data-cart-item-title]',\n    cartItemOption: '[data-cart-item-option]',\n    cartItemSellingPlanName: '[data-cart-item-selling-plan-name]',\n    cartLineItems: '[data-cart-line-items]',\n    cartNote: '[data-cart-notes]',\n    cartQuantityErrorMessage: '[data-cart-quantity-error-message]',\n    cartQuantityErrorMessageWrapper:\n      '[data-cart-quantity-error-message-wrapper]',\n    cartRemove: '[data-cart-remove]',\n    cartStatus: '[data-cart-status]',\n    cartSubtotal: '[data-cart-subtotal]',\n    cartTableCell: '[data-cart-table-cell]',\n    cartWrapper: '[data-cart-wrapper]',\n    emptyPageContent: '[data-empty-page-content]',\n    quantityInput: '[data-quantity-input]',\n    quantityInputMobile: '[data-quantity-input-mobile]',\n    quantityInputDesktop: '[data-quantity-input-desktop]',\n    quantityLabelMobile: '[data-quantity-label-mobile]',\n    quantityLabelDesktop: '[data-quantity-label-desktop]',\n    inputQty: '[data-quantity-input]',\n    thumbnails: '.cart__image',\n    unitPrice: '[data-unit-price]',\n    unitPriceBaseUnit: '[data-unit-price-base-unit]',\n    unitPriceGroup: '[data-unit-price-group]'\n  };\n\n  var classes = {\n    cartNoCookies: 'cart--no-cookies',\n    cartRemovedProduct: 'cart__removed-product',\n    thumbnails: 'cart__image',\n    hide: 'hide',\n    inputError: 'input--error'\n  };\n\n  var attributes = {\n    cartItemIndex: 'data-cart-item-index',\n    cartItemKey: 'data-cart-item-key',\n    cartItemQuantity: 'data-cart-item-quantity',\n    cartItemTitle: 'data-cart-item-title',\n    cartItemUrl: 'data-cart-item-url',\n    quantityItem: 'data-quantity-item'\n  };\n\n  var mediumUpQuery = '(min-width: ' + theme.breakpoints.medium + 'px)';\n\n  function Cart(container) {\n    this.container = container;\n    this.thumbnails = this.container.querySelectorAll(selectors.thumbnails);\n    this.quantityInputs = this.container.querySelectorAll(selectors.inputQty);\n    this.ajaxEnabled =\n      this.container.getAttribute('data-ajax-enabled') === 'true';\n\n    this.cartRoutes = JSON.parse(\n      document.querySelector('[data-cart-routes]').innerHTML\n    );\n\n    this._handleInputQty = theme.Helpers.debounce(\n      this._handleInputQty.bind(this),\n      500\n    );\n    this.setQuantityFormControllers = this.setQuantityFormControllers.bind(\n      this\n    );\n    this._onNoteChange = this._onNoteChange.bind(this);\n    this._onRemoveItem = this._onRemoveItem.bind(this);\n\n    if (!theme.Helpers.cookiesEnabled()) {\n      this.container.classList.add(classes.cartNoCookies);\n    }\n\n    this.thumbnails.forEach(function(element) {\n      element.style.cursor = 'pointer';\n    });\n\n    this.container.addEventListener('click', this._handleThumbnailClick);\n    this.container.addEventListener('change', this._handleInputQty);\n\n    this.mql = window.matchMedia(mediumUpQuery);\n    this.mql.addListener(this.setQuantityFormControllers);\n\n    this.setQuantityFormControllers();\n\n    if (this.ajaxEnabled) {\n      /**\n       * Because the entire cart is recreated when a cart item is updated,\n       * we cannot cache the elements in the cart. Instead, we add the event\n       * listeners on the cart's container to allow us to retain the event\n       * listeners after rebuilding the cart when an item is updated.\n       */\n      this.container.addEventListener('click', this._onRemoveItem);\n      this.container.addEventListener('change', this._onNoteChange);\n\n      this._setupCartTemplates();\n    }\n  }\n\n  Cart.prototype = Object.assign({}, Cart.prototype, {\n    _setupCartTemplates: function() {\n      var cartItem = this.container.querySelector(selectors.cartItem);\n      if (!cartItem) return;\n\n      this.itemTemplate = this.container\n        .querySelector(selectors.cartItem)\n        .cloneNode(true);\n\n      this.itemDiscountTemplate = this.itemTemplate\n        .querySelector(selectors.cartItemDiscount)\n        .cloneNode(true);\n\n      this.cartDiscountTemplate = this.container\n        .querySelector(selectors.cartDiscount)\n        .cloneNode(true);\n\n      this.itemPriceListTemplate = this.itemTemplate\n        .querySelector(selectors.cartItemPriceList)\n        .cloneNode(true);\n\n      this.itemOptionTemplate = this.itemTemplate\n        .querySelector(selectors.cartItemOption)\n        .cloneNode(true);\n\n      this.itemPropertyTemplate = this.itemTemplate\n        .querySelector(selectors.cartItemProperty)\n        .cloneNode(true);\n\n      this.itemSellingPlanNameTemplate = this.itemTemplate\n        .querySelector(selectors.cartItemSellingPlanName)\n        .cloneNode(true);\n    },\n\n    _handleInputQty: function(evt) {\n      if (!evt.target.hasAttribute('data-quantity-input')) return;\n\n      var input = evt.target;\n      var itemElement = input.closest(selectors.cartItem);\n\n      var itemIndex = Number(input.getAttribute('data-quantity-item'));\n\n      var itemQtyInputs = this.container.querySelectorAll(\n        \"[data-quantity-item='\" + itemIndex + \"']\"\n      );\n\n      var value = parseInt(input.value);\n\n      var isValidValue = !(value < 0 || isNaN(value));\n\n      itemQtyInputs.forEach(function(element) {\n        element.value = value;\n      });\n\n      this._hideCartError();\n      this._hideQuantityErrorMessage();\n\n      if (!isValidValue) {\n        this._showQuantityErrorMessages(itemElement);\n        return;\n      }\n\n      if (isValidValue && this.ajaxEnabled) {\n        this._updateItemQuantity(itemIndex, itemElement, itemQtyInputs, value);\n      }\n    },\n\n    _updateItemQuantity: function(\n      itemIndex,\n      itemElement,\n      itemQtyInputs,\n      value\n    ) {\n      var key = itemElement.getAttribute(attributes.cartItemKey);\n      var index = Number(itemElement.getAttribute(attributes.cartItemIndex));\n\n      var request = {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json;'\n        },\n        body: JSON.stringify({\n          line: index,\n          quantity: value\n        })\n      };\n\n      fetch(this.cartRoutes.cartChangeUrl + '.js', request)\n        .then(function(response) {\n          return response.json();\n        })\n        .then(\n          function(state) {\n            this._setCartCountBubble(state.item_count);\n\n            if (!state.item_count) {\n              this._emptyCart();\n              return;\n            }\n\n            // Cache current in-focus element, used later to restore focus\n            var inFocus = document.activeElement;\n\n            this._createCart(state);\n\n            if (!value) {\n              this._showRemoveMessage(itemElement.cloneNode(true));\n              return;\n            }\n\n            var item = this.getItem(key, state);\n\n            this._updateLiveRegion(item);\n\n            // Restore focus to the \"equivalent\" element after the DOM has been updated\n            if (!inFocus) return;\n            var row = inFocus.closest('[' + attributes.cartItemIndex + ']');\n            if (!row) return;\n            var target = this.container.querySelector(\n              '[' +\n                attributes.cartItemIndex +\n                '=\"' +\n                row.getAttribute(attributes.cartItemIndex) +\n                '\"] [data-role=\"' +\n                inFocus.getAttribute('data-role') +\n                '\"]'\n            );\n            if (!target) return;\n            target.focus();\n          }.bind(this)\n        )\n        .catch(\n          function() {\n            this._showCartError(null);\n          }.bind(this)\n        );\n    },\n\n    getItem: function(key, state) {\n      return state.items.find(function(item) {\n        return item.key === key;\n      });\n    },\n\n    _liveRegionText: function(item) {\n      // Dummy content for live region\n      var liveRegionText =\n        theme.strings.update +\n        ': [QuantityLabel]: [Quantity], [Regular] [$$] [DiscountedPrice] [$]. [PriceInformation]';\n\n      // Update Quantity\n      liveRegionText = liveRegionText\n        .replace('[QuantityLabel]', theme.strings.quantity)\n        .replace('[Quantity]', item.quantity);\n\n      // Update pricing information\n      var regularLabel = '';\n      var regularPrice = theme.Currency.formatMoney(\n        item.original_line_price,\n        theme.moneyFormat\n      );\n      var discountLabel = '';\n      var discountPrice = '';\n      var discountInformation = '';\n\n      if (item.original_line_price > item.final_line_price) {\n        regularLabel = theme.strings.regularTotal;\n\n        discountLabel = theme.strings.discountedTotal;\n        discountPrice = theme.Currency.formatMoney(\n          item.final_line_price,\n          theme.moneyFormat\n        );\n\n        discountInformation = theme.strings.priceColumn;\n      }\n\n      liveRegionText = liveRegionText\n        .replace('[Regular]', regularLabel)\n        .replace('[$$]', regularPrice)\n        .replace('[DiscountedPrice]', discountLabel)\n        .replace('[$]', discountPrice)\n        .replace('[PriceInformation]', discountInformation)\n        .trim();\n\n      return liveRegionText;\n    },\n\n    _updateLiveRegion: function(item) {\n      if (!item) return;\n\n      var liveRegion = this.container.querySelector(selectors.cartStatus);\n\n      liveRegion.textContent = this._liveRegionText(item);\n      liveRegion.setAttribute('aria-hidden', false);\n\n      setTimeout(function() {\n        liveRegion.setAttribute('aria-hidden', true);\n      }, 1000);\n    },\n\n    _createCart: function(state) {\n      var cartDiscountList = this._createCartDiscountList(state);\n\n      var cartTable = this.container.querySelector(selectors.cartLineItems);\n      cartTable.innerHTML = '';\n\n      this._createLineItemList(state).forEach(function(lineItem) {\n        cartTable.appendChild(lineItem);\n      });\n\n      this.setQuantityFormControllers();\n\n      this.cartNotes =\n        this.cartNotes || this.container.querySelector(selectors.cartNote);\n\n      if (this.cartNotes) {\n        this.cartNotes.value = state.note;\n      }\n\n      var discountWrapper = this.container.querySelector(\n        selectors.cartDiscountWrapper\n      );\n\n      if (cartDiscountList.length === 0) {\n        discountWrapper.innerHTML = '';\n        discountWrapper.classList.add(classes.hide);\n      } else {\n        discountWrapper.innerHTML = '';\n\n        cartDiscountList.forEach(function(discountItem) {\n          discountWrapper.appendChild(discountItem);\n        });\n\n        discountWrapper.classList.remove(classes.hide);\n      }\n\n      this.container.querySelector(\n        selectors.cartSubtotal\n      ).innerHTML = theme.Currency.formatMoney(\n        state.total_price,\n        theme.moneyFormatWithCurrency\n      );\n    },\n\n    _createCartDiscountList: function(cart) {\n      return cart.cart_level_discount_applications.map(\n        function(discount) {\n          var discountNode = this.cartDiscountTemplate.cloneNode(true);\n\n          discountNode.querySelector(selectors.cartDiscountTitle).textContent =\n            discount.title;\n\n          discountNode.querySelector(\n            selectors.cartDiscountAmount\n          ).innerHTML = theme.Currency.formatMoney(\n            discount.total_allocated_amount,\n            theme.moneyFormat\n          );\n\n          return discountNode;\n        }.bind(this)\n      );\n    },\n\n    _createLineItemList: function(state) {\n      return state.items.map(\n        function(item, index) {\n          var itemNode = this.itemTemplate.cloneNode(true);\n\n          var itemPriceList = this.itemPriceListTemplate.cloneNode(true);\n\n          this._setLineItemAttributes(itemNode, item, index);\n          this._setLineItemImage(itemNode, item.featured_image);\n\n          var cartItemTitle = itemNode.querySelector(selectors.cartItemTitle);\n          cartItemTitle.textContent = item.product_title;\n          cartItemTitle.setAttribute('href', item.url);\n\n          var selling_plan_name = item.selling_plan_allocation\n            ? item.selling_plan_allocation.selling_plan.name\n            : null;\n\n          var productDetailsList = this._createProductDetailsList(\n            item.product_has_only_default_variant,\n            item.options_with_values,\n            item.properties,\n            selling_plan_name\n          );\n\n          this._setProductDetailsList(itemNode, productDetailsList);\n\n          this._setItemRemove(itemNode, item.title);\n\n          itemPriceList.innerHTML = this._createItemPrice(\n            item.original_price,\n            item.final_price\n          ).outerHTML;\n\n          if (item.unit_price_measurement) {\n            itemPriceList.appendChild(\n              this._createUnitPrice(\n                item.unit_price,\n                item.unit_price_measurement\n              )\n            );\n          }\n\n          this._setItemPrice(itemNode, itemPriceList);\n\n          var itemDiscountList = this._createItemDiscountList(item);\n          this._setItemDiscountList(itemNode, itemDiscountList);\n          this._setQuantityInputs(itemNode, item, index);\n\n          var itemLinePrice = this._createItemPrice(\n            item.original_line_price,\n            item.final_line_price\n          );\n\n          this._setItemLinePrice(itemNode, itemLinePrice);\n\n          return itemNode;\n        }.bind(this)\n      );\n    },\n\n    _setLineItemAttributes: function(itemNode, item, index) {\n      itemNode.setAttribute(attributes.cartItemKey, item.key);\n      itemNode.setAttribute(attributes.cartItemUrl, item.url);\n      itemNode.setAttribute(attributes.cartItemTitle, item.title);\n      itemNode.setAttribute(attributes.cartItemIndex, index + 1);\n      itemNode.setAttribute(attributes.cartItemQuantity, item.quantity);\n    },\n\n    _setLineItemImage: function(itemNode, featuredImage) {\n      var image = itemNode.querySelector(selectors.cartItemImage);\n\n      var sizedImageUrl =\n        featuredImage.url !== null\n          ? theme.Images.getSizedImageUrl(featuredImage.url, 'x190')\n          : null;\n\n      if (sizedImageUrl) {\n        image.setAttribute('alt', featuredImage.alt);\n        image.setAttribute('src', sizedImageUrl);\n        image.classList.remove(classes.hide);\n      } else {\n        image.parentNode.removeChild(image);\n      }\n    },\n\n    _setProductDetailsList: function(item, productDetailsList) {\n      var itemDetails = item.querySelector(selectors.cartItemDetails);\n\n      if (productDetailsList.length) {\n        itemDetails.classList.remove(classes.hide);\n        itemDetails.innerHTML = productDetailsList.reduce(function(\n          result,\n          element\n        ) {\n          return result + element.outerHTML;\n        },\n        '');\n\n        return;\n      }\n\n      itemDetails.classList.add(classes.hide);\n      itemDetails.textContent = '';\n    },\n\n    _setItemPrice: function(item, price) {\n      item.querySelector(selectors.cartItemPrice).innerHTML = price.outerHTML;\n    },\n\n    _setItemDiscountList: function(item, discountList) {\n      var itemDiscountList = item.querySelector(selectors.cartItemDiscountList);\n\n      if (discountList.length === 0) {\n        itemDiscountList.innerHTML = '';\n        itemDiscountList.classList.add(classes.hide);\n      } else {\n        itemDiscountList.innerHTML = discountList.reduce(function(\n          result,\n          element\n        ) {\n          return result + element.outerHTML;\n        },\n        '');\n\n        itemDiscountList.classList.remove(classes.hide);\n      }\n    },\n\n    _setItemRemove: function(item, title) {\n      item\n        .querySelector(selectors.cartRemove)\n        .setAttribute(\n          'aria-label',\n          theme.strings.removeLabel.replace('[product]', title)\n        );\n    },\n\n    _setQuantityInputs: function(itemNode, item, index) {\n      var mobileInput = itemNode.querySelector(selectors.quantityInputMobile);\n      var desktopInput = itemNode.querySelector(selectors.quantityInputDesktop);\n\n      mobileInput.setAttribute('id', 'updates_' + item.key);\n      desktopInput.setAttribute('id', 'updates_large_' + item.key);\n\n      [mobileInput, desktopInput].forEach(function(element) {\n        element.setAttribute(attributes.quantityItem, index + 1);\n        element.value = item.quantity;\n      });\n\n      itemNode\n        .querySelector(selectors.quantityLabelMobile)\n        .setAttribute('for', 'updates_' + item.key);\n\n      itemNode\n        .querySelector(selectors.quantityLabelDesktop)\n        .setAttribute('for', 'updates_large_' + item.key);\n    },\n\n    setQuantityFormControllers: function() {\n      var desktopQuantityInputs = document.querySelectorAll(\n        selectors.quantityInputDesktop\n      );\n\n      var mobileQuantityInputs = document.querySelectorAll(\n        selectors.quantityInputMobile\n      );\n\n      if (this.mql.matches) {\n        addNameAttribute(desktopQuantityInputs);\n        removeNameAttribute(mobileQuantityInputs);\n      } else {\n        addNameAttribute(mobileQuantityInputs);\n        removeNameAttribute(desktopQuantityInputs);\n      }\n\n      function addNameAttribute(inputs) {\n        inputs.forEach(function(element) {\n          element.setAttribute('name', 'updates[]');\n        });\n      }\n\n      function removeNameAttribute(inputs) {\n        inputs.forEach(function(element) {\n          element.removeAttribute('name');\n        });\n      }\n    },\n\n    _setItemLinePrice: function(item, price) {\n      item.querySelector(selectors.cartItemLinePrice).innerHTML =\n        price.outerHTML;\n    },\n\n    _createProductDetailsList: function(\n      product_has_only_default_variant,\n      options,\n      properties,\n      selling_plan_name\n    ) {\n      var optionsPropertiesHTML = [];\n\n      if (!product_has_only_default_variant) {\n        optionsPropertiesHTML = optionsPropertiesHTML.concat(\n          this._getOptionList(options)\n        );\n      }\n\n      if (selling_plan_name) {\n        optionsPropertiesHTML = optionsPropertiesHTML.concat(\n          this._getSellingPlanName(selling_plan_name)\n        );\n      }\n\n      if (properties !== null && Object.keys(properties).length !== 0) {\n        optionsPropertiesHTML = optionsPropertiesHTML.concat(\n          this._getPropertyList(properties)\n        );\n      }\n\n      return optionsPropertiesHTML;\n    },\n\n    _getOptionList: function(options) {\n      return options.map(\n        function(option) {\n          var optionElement = this.itemOptionTemplate.cloneNode(true);\n\n          optionElement.textContent = option.name + ': ' + option.value;\n          optionElement.classList.remove(classes.hide);\n\n          return optionElement;\n        }.bind(this)\n      );\n    },\n\n    _getPropertyList: function(properties) {\n      var propertiesArray =\n        properties !== null ? Object.entries(properties) : [];\n\n      var filteredPropertiesArray = propertiesArray.filter(function(property) {\n        // Line item properties prefixed with an underscore are not to be displayed\n        // if the property value has a length of 0 (empty), don't display it\n        if (property[0].charAt(0) === '_' || property[1].length === 0) {\n          return false;\n        } else {\n          return true;\n        }\n      });\n\n      return filteredPropertiesArray.map(\n        function(property) {\n          var propertyElement = this.itemPropertyTemplate.cloneNode(true);\n\n          propertyElement.querySelector(\n            selectors.cartItemPropertyName\n          ).textContent = property[0] + ': ';\n\n          if (property[0].indexOf('/uploads/') === -1) {\n            propertyElement.querySelector(\n              selectors.cartItemPropertyValue\n            ).textContent = property[1];\n          } else {\n            propertyElement.querySelector(\n              selectors.cartItemPropertyValue\n            ).innerHTML =\n              '<a href=\"' +\n              property[1] +\n              '\"> ' +\n              property[1].split('/').pop() +\n              '</a>';\n          }\n\n          propertyElement.classList.remove(classes.hide);\n\n          return propertyElement;\n        }.bind(this)\n      );\n    },\n\n    _getSellingPlanName: function(selling_plan_name) {\n      var sellingPlanNameElement = this.itemSellingPlanNameTemplate.cloneNode(\n        true\n      );\n\n      sellingPlanNameElement.textContent = selling_plan_name;\n      sellingPlanNameElement.classList.remove(classes.hide);\n\n      return sellingPlanNameElement;\n    },\n\n    _createItemPrice: function(original_price, final_price) {\n      var originalPriceHTML = theme.Currency.formatMoney(\n        original_price,\n        theme.moneyFormat\n      );\n\n      var resultHTML;\n\n      if (original_price !== final_price) {\n        resultHTML = this.itemPriceListTemplate\n          .querySelector(selectors.cartItemDiscountedPriceGroup)\n          .cloneNode(true);\n\n        resultHTML.querySelector(\n          selectors.cartItemOriginalPrice\n        ).innerHTML = originalPriceHTML;\n\n        resultHTML.querySelector(\n          selectors.cartItemFinalPrice\n        ).innerHTML = theme.Currency.formatMoney(\n          final_price,\n          theme.moneyFormat\n        );\n      } else {\n        resultHTML = this.itemPriceListTemplate\n          .querySelector(selectors.cartItemRegularPriceGroup)\n          .cloneNode(true);\n\n        resultHTML.querySelector(\n          selectors.cartItemRegularPrice\n        ).innerHTML = originalPriceHTML;\n      }\n\n      resultHTML.classList.remove(classes.hide);\n      return resultHTML;\n    },\n\n    _createUnitPrice: function(unitPrice, unitPriceMeasurement) {\n      var unitPriceGroup = this.itemPriceListTemplate\n        .querySelector(selectors.unitPriceGroup)\n        .cloneNode(true);\n\n      var unitPriceBaseUnit =\n        (unitPriceMeasurement.reference_value !== 1\n          ? unitPriceMeasurement.reference_value\n          : '') + unitPriceMeasurement.reference_unit;\n\n      unitPriceGroup.querySelector(\n        selectors.unitPriceBaseUnit\n      ).textContent = unitPriceBaseUnit;\n\n      unitPriceGroup.querySelector(\n        selectors.unitPrice\n      ).innerHTML = theme.Currency.formatMoney(unitPrice, theme.moneyFormat);\n\n      unitPriceGroup.classList.remove(classes.hide);\n\n      return unitPriceGroup;\n    },\n\n    _createItemDiscountList: function(item) {\n      return item.line_level_discount_allocations.map(\n        function(discount) {\n          var discountNode = this.itemDiscountTemplate.cloneNode(true);\n\n          discountNode.querySelector(\n            selectors.cartItemDiscountTitle\n          ).textContent = discount.discount_application.title;\n\n          discountNode.querySelector(\n            selectors.cartItemDiscountAmount\n          ).innerHTML = theme.Currency.formatMoney(\n            discount.amount,\n            theme.moneyFormat\n          );\n\n          return discountNode;\n        }.bind(this)\n      );\n    },\n\n    _showQuantityErrorMessages: function(itemElement) {\n      itemElement\n        .querySelectorAll(selectors.cartQuantityErrorMessage)\n        .forEach(function(element) {\n          element.textContent = theme.strings.quantityMinimumMessage;\n        });\n\n      itemElement\n        .querySelectorAll(selectors.cartQuantityErrorMessageWrapper)\n        .forEach(function(element) {\n          element.classList.remove(classes.hide);\n        });\n\n      itemElement\n        .querySelectorAll(selectors.inputQty)\n        .forEach(function(element) {\n          element.classList.add(classes.inputError);\n          element.focus();\n        });\n    },\n\n    _hideQuantityErrorMessage: function() {\n      var errorMessages = document.querySelectorAll(\n        selectors.cartQuantityErrorMessageWrapper\n      );\n\n      errorMessages.forEach(function(element) {\n        element.classList.add(classes.hide);\n\n        element.querySelector(selectors.cartQuantityErrorMessage).textContent =\n          '';\n      });\n\n      this.container\n        .querySelectorAll(selectors.inputQty)\n        .forEach(function(element) {\n          element.classList.remove(classes.inputError);\n        });\n    },\n\n    _handleThumbnailClick: function(evt) {\n      if (!evt.target.classList.contains(classes.thumbnails)) return;\n\n      window.location.href = evt.target\n        .closest(selectors.cartItem)\n        .getAttribute('data-cart-item-url');\n    },\n\n    _onNoteChange: function(evt) {\n      if (!evt.target.hasAttribute('data-cart-notes')) return;\n\n      var note = evt.target.value;\n      this._hideCartError();\n      this._hideQuantityErrorMessage();\n\n      var headers = new Headers({ 'Content-Type': 'application/json' });\n\n      var request = {\n        method: 'POST',\n        headers: headers,\n        body: JSON.stringify({ note: note })\n      };\n\n      fetch('/cart/update.js', request).catch(\n        function() {\n          this._showCartError(evt.target);\n        }.bind(this)\n      );\n    },\n\n    _showCartError: function(elementToFocus) {\n      document.querySelector(selectors.cartErrorMessage).textContent =\n        theme.strings.cartError;\n\n      document\n        .querySelector(selectors.cartErrorMessageWrapper)\n        .classList.remove(classes.hide);\n\n      if (!elementToFocus) return;\n      elementToFocus.focus();\n    },\n\n    _hideCartError: function() {\n      document\n        .querySelector(selectors.cartErrorMessageWrapper)\n        .classList.add(classes.hide);\n      document.querySelector(selectors.cartErrorMessage).textContent = '';\n    },\n\n    _onRemoveItem: function(evt) {\n      if (!evt.target.hasAttribute('data-cart-remove')) return;\n\n      evt.preventDefault();\n      var lineItem = evt.target.closest(selectors.cartItem);\n      var index = Number(lineItem.getAttribute(attributes.cartItemIndex));\n\n      this._hideCartError();\n\n      var request = {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json;'\n        },\n        body: JSON.stringify({\n          line: index,\n          quantity: 0\n        })\n      };\n\n      fetch(this.cartRoutes.cartChangeUrl + '.js', request)\n        .then(function(response) {\n          return response.json();\n        })\n        .then(\n          function(state) {\n            if (state.item_count === 0) {\n              this._emptyCart();\n            } else {\n              this._createCart(state);\n              this._showRemoveMessage(lineItem.cloneNode(true));\n            }\n\n            this._setCartCountBubble(state.item_count);\n          }.bind(this)\n        )\n        .catch(\n          function() {\n            this._showCartError(null);\n          }.bind(this)\n        );\n    },\n\n    _showRemoveMessage: function(lineItem) {\n      var index = lineItem.getAttribute('data-cart-item-index');\n      var removeMessage = this._getRemoveMessage(lineItem);\n\n      if (index - 1 === 0) {\n        this.container\n          .querySelector('[data-cart-item-index=\"1\"]')\n          .insertAdjacentHTML('beforebegin', removeMessage.outerHTML);\n      } else {\n        this.container\n          .querySelector(\"[data-cart-item-index='\" + (index - 1) + \"']\")\n          .insertAdjacentHTML('afterend', removeMessage.outerHTML);\n      }\n\n      this.container.querySelector('[data-removed-item-row]').focus();\n    },\n\n    _getRemoveMessage: function(lineItem) {\n      var formattedMessage = this._formatRemoveMessage(lineItem);\n\n      var tableCell = lineItem\n        .querySelector(selectors.cartTableCell)\n        .cloneNode(true);\n\n      tableCell.removeAttribute('class');\n      tableCell.classList.add(classes.cartRemovedProduct);\n      tableCell.setAttribute('colspan', '4');\n      tableCell.innerHTML = formattedMessage;\n\n      lineItem.setAttribute('role', 'alert');\n      lineItem.setAttribute('tabindex', '-1');\n      lineItem.setAttribute('data-removed-item-row', true);\n      lineItem.innerHTML = tableCell.outerHTML;\n\n      return lineItem;\n    },\n\n    _formatRemoveMessage: function(lineItem) {\n      var quantity = lineItem.getAttribute('data-cart-item-quantity');\n      var url = lineItem.getAttribute(attributes.cartItemUrl);\n      var title = lineItem.getAttribute(attributes.cartItemTitle);\n\n      return theme.strings.removedItemMessage\n        .replace('[quantity]', quantity)\n        .replace(\n          '[link]',\n          '<a ' +\n            'href=\"' +\n            url +\n            '\" class=\"text-link text-link--accent\">' +\n            title +\n            '</a>'\n        );\n    },\n\n    _setCartCountBubble: function(quantity) {\n      this.cartCountBubble =\n        this.cartCountBubble ||\n        document.querySelector(selectors.cartCountBubble);\n\n      this.cartCount =\n        this.cartCount || document.querySelector(selectors.cartCount);\n\n      if (quantity > 0) {\n        this.cartCountBubble.classList.remove(classes.hide);\n        this.cartCount.textContent = quantity;\n      } else {\n        this.cartCountBubble.classList.add(classes.hide);\n        this.cartCount.textContent = '';\n      }\n    },\n\n    _emptyCart: function() {\n      this.emptyPageContent =\n        this.emptyPageContent ||\n        this.container.querySelector(selectors.emptyPageContent);\n\n      this.cartWrapper =\n        this.cartWrapper || this.container.querySelector(selectors.cartWrapper);\n\n      this.emptyPageContent.classList.remove(classes.hide);\n      this.cartWrapper.classList.add(classes.hide);\n    }\n  });\n\n  return Cart;\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.Filters = (function() {\n  var settings = {\n    mediaQueryMediumUp: '(min-width: ' + theme.breakpoints.medium + 'px)'\n  };\n\n  var selectors = {\n    filterSelection: '#FilterTags',\n    sortSelection: '#SortBy',\n    selectInput: '[data-select-input]'\n  };\n\n  function Filters(container) {\n    this.filterSelect = container.querySelector(selectors.filterSelection);\n    this.sortSelect = container.querySelector(selectors.sortSelection);\n\n    this.selects = document.querySelectorAll(selectors.selectInput);\n\n    if (this.sortSelect) {\n      this.defaultSort = this._getDefaultSortValue();\n    }\n\n    if (this.selects.length) {\n      this.selects.forEach(function(select) {\n        select.classList.remove('hidden');\n      });\n    }\n\n    this.initBreakpoints = this._initBreakpoints.bind(this);\n\n    this.mql = window.matchMedia(settings.mediaQueryMediumUp);\n    this.mql.addListener(this.initBreakpoints);\n\n    if (this.filterSelect) {\n      this.filterSelect.addEventListener(\n        'change',\n        this._onFilterChange.bind(this)\n      );\n    }\n\n    if (this.sortSelect) {\n      this.sortSelect.addEventListener('change', this._onSortChange.bind(this));\n    }\n\n    theme.Helpers.promiseStylesheet().then(\n      function() {\n        this._initBreakpoints();\n      }.bind(this)\n    );\n    this._initParams();\n  }\n\n  Filters.prototype = Object.assign({}, Filters.prototype, {\n    _initBreakpoints: function() {\n      if (this.mql.matches) {\n        slate.utils.resizeSelects(this.selects);\n      }\n    },\n\n    _initParams: function() {\n      this.queryParams = {};\n      if (location.search.length) {\n        var aKeyValue;\n        var aCouples = location.search.substr(1).split('&');\n        for (var i = 0; i < aCouples.length; i++) {\n          aKeyValue = aCouples[i].split('=');\n          if (aKeyValue.length > 1) {\n            this.queryParams[\n              decodeURIComponent(aKeyValue[0])\n            ] = decodeURIComponent(aKeyValue[1]);\n          }\n        }\n      }\n    },\n\n    _onSortChange: function() {\n      this.queryParams.sort_by = this._getSortValue();\n\n      if (this.queryParams.page) {\n        delete this.queryParams.page;\n      }\n\n      window.location.search = decodeURIComponent(\n        new URLSearchParams(Object.entries(this.queryParams)).toString()\n      );\n    },\n\n    _onFilterChange: function() {\n      document.location.href = this._getFilterValue();\n    },\n\n    _getFilterValue: function() {\n      return this.filterSelect.value;\n    },\n\n    _getSortValue: function() {\n      return this.sortSelect.value || this.defaultSort;\n    },\n\n    _getDefaultSortValue: function() {\n      return this.sortSelect.dataset.defaultSortby;\n    },\n\n    onUnload: function() {\n      if (this.filterSelect) {\n        this.filterSelect.removeEventListener('change', this._onFilterChange);\n      }\n\n      if (this.sortSelect) {\n        this.sortSelect.removeEventListener('change', this._onSortChange);\n      }\n\n      this.mql.removeListener(this.initBreakpoints);\n    }\n  });\n\n  return Filters;\n})();\n\nwindow.theme = window.theme || {};\n\ntheme.HeaderSection = (function() {\n  function Header() {\n    theme.Header.init();\n    theme.MobileNav.init();\n    theme.SearchDrawer.init();\n    theme.Search.init();\n  }\n\n  Header.prototype = Object.assign({}, Header.prototype, {\n    onUnload: function() {\n      theme.Header.unload();\n      theme.Search.unload();\n      theme.MobileNav.unload();\n    }\n  });\n\n  return Header;\n})();\n\ntheme.Maps = (function() {\n  var config = {\n    zoom: 14\n  };\n  var apiStatus = null;\n  var mapsToLoad = [];\n\n  var errors = {\n    addressNoResults: theme.strings.addressNoResults,\n    addressQueryLimit: theme.strings.addressQueryLimit,\n    addressError: theme.strings.addressError,\n    authError: theme.strings.authError\n  };\n\n  var selectors = {\n    section: '[data-section-type=\"map\"]',\n    map: '[data-map]',\n    mapOverlay: '[data-map-overlay]'\n  };\n\n  var classes = {\n    mapError: 'map-section--load-error',\n    errorMsg: 'map-section__error errors text-center'\n  };\n\n  // Global function called by Google on auth errors.\n  // Show an auto error message on all map instances.\n  // eslint-disable-next-line camelcase, no-unused-vars\n  window.gm_authFailure = function() {\n    if (!Shopify.designMode) {\n      return;\n    }\n\n    document.querySelector(selectors.section).classList.add(classes.mapError);\n    document.querySelector(selectors.map).remove();\n    document\n      .querySelector(selectors.mapOverlay)\n      .insertAdjacentHTML(\n        'afterend',\n        '<div class=\"' +\n          classes.errorMsg +\n          '\">' +\n          theme.strings.authError +\n          '</div>'\n      );\n  };\n\n  function Map(container) {\n    this.map = container.querySelector(selectors.map);\n    if (!this.map) return;\n    this.key = this.map.dataset.apiKey;\n\n    if (typeof this.key === 'undefined') {\n      return;\n    }\n\n    if (apiStatus === 'loaded') {\n      this.createMap();\n    } else {\n      mapsToLoad.push(this);\n\n      if (apiStatus !== 'loading') {\n        apiStatus = 'loading';\n        if (typeof window.google === 'undefined') {\n          theme.Helpers.getScript(\n            'https://maps.googleapis.com/maps/api/js?key=' + this.key\n          ).then(function() {\n            apiStatus = 'loaded';\n            initAllMaps();\n          });\n        }\n      }\n    }\n  }\n\n  function initAllMaps() {\n    // API has loaded, load all Map instances in queue\n    mapsToLoad.forEach(function(map) {\n      map.createMap();\n    });\n  }\n\n  function geolocate(map) {\n    return new Promise(function(resolve, reject) {\n      var geocoder = new google.maps.Geocoder();\n      var address = map.dataset.addressSetting;\n\n      geocoder.geocode({ address: address }, function(results, status) {\n        if (status !== google.maps.GeocoderStatus.OK) {\n          reject(status);\n        }\n\n        resolve(results);\n      });\n    });\n  }\n\n  Map.prototype = Object.assign({}, Map.prototype, {\n    createMap: function() {\n      return geolocate(this.map)\n        .then(\n          function(results) {\n            var mapOptions = {\n              zoom: config.zoom,\n              center: results[0].geometry.location,\n              draggable: false,\n              clickableIcons: false,\n              scrollwheel: false,\n              disableDoubleClickZoom: true,\n              disableDefaultUI: true\n            };\n\n            var map = (this.map = new google.maps.Map(this.map, mapOptions));\n            var center = (this.center = map.getCenter());\n\n            //eslint-disable-next-line no-unused-vars\n            var marker = new google.maps.Marker({\n              map: map,\n              position: map.getCenter()\n            });\n\n            google.maps.event.addDomListener(\n              window,\n              'resize',\n              theme.Helpers.debounce(\n                function() {\n                  google.maps.event.trigger(map, 'resize');\n                  map.setCenter(center);\n                  this.map.removeAttribute('style');\n                }.bind(this),\n                250\n              )\n            );\n          }.bind(this)\n        )\n        .catch(\n          function() {\n            var errorMessage;\n\n            switch (status) {\n              case 'ZERO_RESULTS':\n                errorMessage = errors.addressNoResults;\n                break;\n              case 'OVER_QUERY_LIMIT':\n                errorMessage = errors.addressQueryLimit;\n                break;\n              case 'REQUEST_DENIED':\n                errorMessage = errors.authError;\n                break;\n              default:\n                errorMessage = errors.addressError;\n                break;\n            }\n\n            // Show errors only to merchant in the editor.\n            if (Shopify.designMode) {\n              this.map.parentNode.classList.add(classes.mapError);\n              this.map.parentNode.innerHTML =\n                '<div class=\"' +\n                classes.errorMsg +\n                '\">' +\n                errorMessage +\n                '</div>';\n            }\n          }.bind(this)\n        );\n    },\n\n    onUnload: function() {\n      if (this.map) {\n        google.maps.event.clearListeners(this.map, 'resize');\n      }\n    }\n  });\n\n  return Map;\n})();\n\n/* eslint-disable no-new */\ntheme.Product = (function() {\n  function Product(container) {\n    this.container = container;\n    var sectionId = container.getAttribute('data-section-id');\n    this.zoomPictures = [];\n    this.ajaxEnabled = container.getAttribute('data-ajax-enabled') === 'true';\n\n    this.settings = {\n      // Breakpoints from src/stylesheets/global/variables.scss.liquid\n      mediaQueryMediumUp: 'screen and (min-width: 750px)',\n      mediaQuerySmall: 'screen and (max-width: 749px)',\n      bpSmall: false,\n      enableHistoryState:\n        container.getAttribute('data-enable-history-state') === 'true',\n      namespace: '.slideshow-' + sectionId,\n      sectionId: sectionId,\n      sliderActive: false,\n      zoomEnabled: false\n    };\n\n    this.selectors = {\n      addToCart: '[data-add-to-cart]',\n      addToCartText: '[data-add-to-cart-text]',\n      cartCount: '[data-cart-count]',\n      cartCountBubble: '[data-cart-count-bubble]',\n      cartPopup: '[data-cart-popup]',\n      cartPopupCartQuantity: '[data-cart-popup-cart-quantity]',\n      cartPopupClose: '[data-cart-popup-close]',\n      cartPopupDismiss: '[data-cart-popup-dismiss]',\n      cartPopupImage: '[data-cart-popup-image]',\n      cartPopupImageWrapper: '[data-cart-popup-image-wrapper]',\n      cartPopupImagePlaceholder: '[data-image-loading-animation]',\n      cartPopupProductDetails: '[data-cart-popup-product-details]',\n      cartPopupQuantity: '[data-cart-popup-quantity]',\n      cartPopupQuantityLabel: '[data-cart-popup-quantity-label]',\n      cartPopupTitle: '[data-cart-popup-title]',\n      cartPopupWrapper: '[data-cart-popup-wrapper]',\n      loader: '[data-loader]',\n      loaderStatus: '[data-loader-status]',\n      quantity: '[data-quantity-input]',\n      SKU: '.variant-sku',\n      productStatus: '[data-product-status]',\n      originalSelectorId: '#ProductSelect-' + sectionId,\n      productForm: '[data-product-form]',\n      errorMessage: '[data-error-message]',\n      errorMessageWrapper: '[data-error-message-wrapper]',\n      imageZoomWrapper: '[data-image-zoom-wrapper]',\n      productMediaWrapper: '[data-product-single-media-wrapper]',\n      productThumbImages: '.product-single__thumbnail--' + sectionId,\n      productThumbs: '.product-single__thumbnails-' + sectionId,\n      productThumbListItem: '.product-single__thumbnails-item',\n      productThumbsWrapper: '.thumbnails-wrapper',\n      saleLabel: '.product-price__sale-label-' + sectionId,\n      singleOptionSelector: '.single-option-selector-' + sectionId,\n      shopifyPaymentButton: '.shopify-payment-button',\n      productMediaTypeVideo: '[data-product-media-type-video]',\n      productMediaTypeModel: '[data-product-media-type-model]',\n      priceContainer: '[data-price]',\n      regularPrice: '[data-regular-price]',\n      salePrice: '[data-sale-price]',\n      unitPrice: '[data-unit-price]',\n      unitPriceBaseUnit: '[data-unit-price-base-unit]',\n      productPolicies: '[data-product-policies]',\n      storeAvailabilityContainer: '[data-store-availability-container]'\n    };\n\n    this.classes = {\n      cartPopupWrapperHidden: 'cart-popup-wrapper--hidden',\n      hidden: 'hide',\n      visibilityHidden: 'visibility-hidden',\n      inputError: 'input--error',\n      jsZoomEnabled: 'js-zoom-enabled',\n      productOnSale: 'price--on-sale',\n      productUnitAvailable: 'price--unit-available',\n      productUnavailable: 'price--unavailable',\n      productSoldOut: 'price--sold-out',\n      cartImage: 'cart-popup-item__image',\n      productFormErrorMessageWrapperHidden:\n        'product-form__error-message-wrapper--hidden',\n      activeClass: 'active-thumb',\n      variantSoldOut: 'product-form--variant-sold-out'\n    };\n\n    this.eventHandlers = {};\n\n    this.quantityInput = container.querySelector(this.selectors.quantity);\n    this.errorMessageWrapper = container.querySelector(\n      this.selectors.errorMessageWrapper\n    );\n    this.productForm = container.querySelector(this.selectors.productForm);\n    this.addToCart = container.querySelector(this.selectors.addToCart);\n    this.addToCartText = this.addToCart.querySelector(\n      this.selectors.addToCartText\n    );\n    this.shopifyPaymentButton = container.querySelector(\n      this.selectors.shopifyPaymentButton\n    );\n    this.priceContainer = container.querySelector(\n      this.selectors.priceContainer\n    );\n    this.productPolicies = container.querySelector(\n      this.selectors.productPolicies\n    );\n    this.storeAvailabilityContainer = container.querySelector(\n      this.selectors.storeAvailabilityContainer\n    );\n    if (this.storeAvailabilityContainer) {\n      this._initStoreAvailability();\n    }\n\n    this.loader = this.addToCart.querySelector(this.selectors.loader);\n    this.loaderStatus = container.querySelector(this.selectors.loaderStatus);\n\n    this.imageZoomWrapper = container.querySelectorAll(\n      this.selectors.imageZoomWrapper\n    );\n\n    // Stop parsing if we don't have the product json script tag when loading\n    // section in the Theme Editor\n    var productJson = document.getElementById('ProductJson-' + sectionId);\n    if (!productJson || !productJson.innerHTML.length) {\n      return;\n    }\n\n    this.productSingleObject = JSON.parse(productJson.innerHTML);\n\n    // Initial state for global productState object\n    this.productState = {\n      available: true,\n      soldOut: false,\n      onSale: false,\n      showUnitPrice: false\n    };\n\n    this.settings.zoomEnabled =\n      this.imageZoomWrapper.length > 0\n        ? this.imageZoomWrapper[0].classList.contains(\n            this.classes.jsZoomEnabled\n          )\n        : false;\n\n    this.cartRoutes = JSON.parse(\n      document.querySelector('[data-cart-routes]').innerHTML\n    );\n\n    this.initMobileBreakpoint = this._initMobileBreakpoint.bind(this);\n    this.initDesktopBreakpoint = this._initDesktopBreakpoint.bind(this);\n\n    this.mqlSmall = window.matchMedia(this.settings.mediaQuerySmall);\n    this.mqlSmall.addListener(this.initMobileBreakpoint);\n\n    this.mqlMediumUp = window.matchMedia(this.settings.mediaQueryMediumUp);\n    this.mqlMediumUp.addListener(this.initDesktopBreakpoint);\n\n    this.initMobileBreakpoint();\n    this.initDesktopBreakpoint();\n    this._stringOverrides();\n    this._initVariants();\n    this._initMediaSwitch();\n    this._initAddToCart();\n    this._setActiveThumbnail();\n    this._initProductVideo();\n    this._initModelViewerLibraries();\n    this._initShopifyXrLaunch();\n  }\n\n  Product.prototype = Object.assign({}, Product.prototype, {\n    _stringOverrides: function() {\n      theme.productStrings = theme.productStrings || {};\n      theme.strings = Object.assign({}, theme.strings, theme.productStrings);\n    },\n\n    _initStoreAvailability: function() {\n      this.storeAvailability = new theme.StoreAvailability(\n        this.storeAvailabilityContainer\n      );\n\n      var storeAvailabilityModalOpenedCallback = function(event) {\n        if (\n          this.cartPopupWrapper &&\n          !this.cartPopupWrapper.classList.contains(\n            this.classes.cartPopupWrapperHidden\n          )\n        ) {\n          this._hideCartPopup(event);\n        }\n      };\n\n      // hide cart popup modal if the store availability modal is also opened\n      this.storeAvailabilityContainer.addEventListener(\n        'storeAvailabilityModalOpened',\n        storeAvailabilityModalOpenedCallback.bind(this)\n      );\n    },\n\n    _initMobileBreakpoint: function() {\n      if (this.mqlSmall.matches) {\n        // initialize thumbnail slider on mobile if more than four thumbnails\n        if (\n          this.container.querySelectorAll(this.selectors.productThumbImages)\n            .length > 4\n        ) {\n          this._initThumbnailSlider();\n        }\n\n        // destroy image zooming if enabled\n        if (this.settings.zoomEnabled) {\n          this.imageZoomWrapper.forEach(\n            function(element, index) {\n              this._destroyZoom(index);\n            }.bind(this)\n          );\n        }\n\n        this.settings.bpSmall = true;\n      } else {\n        if (this.settings.sliderActive) {\n          this._destroyThumbnailSlider();\n        }\n\n        this.settings.bpSmall = false;\n      }\n    },\n\n    _initDesktopBreakpoint: function() {\n      if (this.mqlMediumUp.matches && this.settings.zoomEnabled) {\n        this.imageZoomWrapper.forEach(\n          function(element, index) {\n            this._enableZoom(element, index);\n          }.bind(this)\n        );\n      }\n    },\n\n    _initVariants: function() {\n      var options = {\n        container: this.container,\n        enableHistoryState:\n          this.container.getAttribute('data-enable-history-state') === 'true',\n        singleOptionSelector: this.selectors.singleOptionSelector,\n        originalSelectorId: this.selectors.originalSelectorId,\n        product: this.productSingleObject\n      };\n\n      this.variants = new slate.Variants(options);\n      if (this.storeAvailability && this.variants.currentVariant.available) {\n        this.storeAvailability.updateContent(this.variants.currentVariant.id);\n      }\n\n      this.eventHandlers.updateAvailability = this._updateAvailability.bind(\n        this\n      );\n      this.eventHandlers.updateMedia = this._updateMedia.bind(this);\n      this.eventHandlers.updatePrice = this._updatePrice.bind(this);\n      this.eventHandlers.updateSKU = this._updateSKU.bind(this);\n\n      this.container.addEventListener(\n        'variantChange',\n        this.eventHandlers.updateAvailability\n      );\n      this.container.addEventListener(\n        'variantImageChange',\n        this.eventHandlers.updateMedia\n      );\n      this.container.addEventListener(\n        'variantPriceChange',\n        this.eventHandlers.updatePrice\n      );\n      this.container.addEventListener(\n        'variantSKUChange',\n        this.eventHandlers.updateSKU\n      );\n    },\n\n    _initMediaSwitch: function() {\n      if (!document.querySelector(this.selectors.productThumbImages)) {\n        return;\n      }\n\n      var self = this;\n\n      var productThumbImages = document.querySelectorAll(\n        this.selectors.productThumbImages\n      );\n\n      this.eventHandlers.handleMediaFocus = this._handleMediaFocus.bind(this);\n\n      productThumbImages.forEach(function(el) {\n        el.addEventListener('click', function(evt) {\n          evt.preventDefault();\n          var mediaId = el.getAttribute('data-thumbnail-id');\n\n          self._switchMedia(mediaId);\n          self._setActiveThumbnail(mediaId);\n        });\n        el.addEventListener('keyup', self.eventHandlers.handleMediaFocus);\n      });\n    },\n\n    _initAddToCart: function() {\n      this.productForm.addEventListener(\n        'submit',\n        function(evt) {\n          if (this.addToCart.getAttribute('aria-disabled') === 'true') {\n            evt.preventDefault();\n            return;\n          }\n\n          if (!this.ajaxEnabled) return;\n\n          evt.preventDefault();\n\n          this.previouslyFocusedElement = document.activeElement;\n\n          var isInvalidQuantity =\n            !!this.quantityInput && this.quantityInput.value <= 0;\n\n          if (isInvalidQuantity) {\n            this._showErrorMessage(theme.strings.quantityMinimumMessage);\n            return;\n          }\n\n          if (!isInvalidQuantity && this.ajaxEnabled) {\n            // disable the addToCart and dynamic checkout button while\n            // request/cart popup is loading and handle loading state\n            this._handleButtonLoadingState(true);\n            this._addItemToCart(this.productForm);\n            return;\n          }\n        }.bind(this)\n      );\n    },\n\n    _initProductVideo: function() {\n      var sectionId = this.settings.sectionId;\n\n      var productMediaTypeVideo = this.container.querySelectorAll(\n        this.selectors.productMediaTypeVideo\n      );\n      productMediaTypeVideo.forEach(function(el) {\n        theme.ProductVideo.init(el, sectionId);\n      });\n    },\n\n    _initModelViewerLibraries: function() {\n      var modelViewerElements = this.container.querySelectorAll(\n        this.selectors.productMediaTypeModel\n      );\n      if (modelViewerElements.length < 1) return;\n      theme.ProductModel.init(modelViewerElements, this.settings.sectionId);\n    },\n\n    _initShopifyXrLaunch: function() {\n      this.eventHandlers.initShopifyXrLaunchHandler = this._initShopifyXrLaunchHandler.bind(\n        this\n      );\n      document.addEventListener(\n        'shopify_xr_launch',\n        this.eventHandlers.initShopifyXrLaunchHandler\n      );\n    },\n\n    _initShopifyXrLaunchHandler: function() {\n      var currentMedia = this.container.querySelector(\n        this.selectors.productMediaWrapper +\n          ':not(.' +\n          self.classes.hidden +\n          ')'\n      );\n      currentMedia.dispatchEvent(\n        new CustomEvent('xrLaunch', {\n          bubbles: true,\n          cancelable: true\n        })\n      );\n    },\n\n    _addItemToCart: function(form) {\n      var self = this;\n\n      fetch(this.cartRoutes.cartAddUrl + '.js', {\n        method: 'POST',\n        credentials: 'same-origin',\n        headers: {\n          'Content-Type': 'application/x-www-form-urlencoded',\n          'X-Requested-With': 'XMLHttpRequest'\n        },\n        body: theme.Helpers.serialize(form)\n      })\n        .then(function(response) {\n          return response.json();\n        })\n        .then(function(json) {\n          if (json.status && json.status !== 200) {\n            var error = new Error(json.description);\n            error.isFromServer = true;\n            throw error;\n          }\n          self._hideErrorMessage();\n          self._setupCartPopup(json);\n        })\n        .catch(function(error) {\n          self.previouslyFocusedElement.focus();\n          self._showErrorMessage(\n            error.isFromServer && error.message.length\n              ? error.message\n              : theme.strings.cartError\n          );\n          self._handleButtonLoadingState(false);\n          // eslint-disable-next-line no-console\n          console.log(error);\n        });\n    },\n\n    _handleButtonLoadingState: function(isLoading) {\n      if (isLoading) {\n        this.addToCart.setAttribute('aria-disabled', true);\n        this.addToCartText.classList.add(this.classes.hidden);\n        this.loader.classList.remove(this.classes.hidden);\n\n        if (this.shopifyPaymentButton) {\n          this.shopifyPaymentButton.setAttribute('disabled', true);\n        }\n\n        this.loaderStatus.setAttribute('aria-hidden', false);\n      } else {\n        this.addToCart.removeAttribute('aria-disabled');\n        this.addToCartText.classList.remove(this.classes.hidden);\n        this.loader.classList.add(this.classes.hidden);\n\n        if (this.shopifyPaymentButton) {\n          this.shopifyPaymentButton.removeAttribute('disabled');\n        }\n\n        this.loaderStatus.setAttribute('aria-hidden', true);\n      }\n    },\n\n    _showErrorMessage: function(errorMessage) {\n      var errorMessageContainer = this.container.querySelector(\n        this.selectors.errorMessage\n      );\n      errorMessageContainer.innerHTML = errorMessage;\n\n      if (this.quantityInput) {\n        this.quantityInput.classList.add(this.classes.inputError);\n      }\n\n      this.errorMessageWrapper.classList.remove(\n        this.classes.productFormErrorMessageWrapperHidden\n      );\n      this.errorMessageWrapper.setAttribute('aria-hidden', true);\n      this.errorMessageWrapper.removeAttribute('aria-hidden');\n    },\n\n    _hideErrorMessage: function() {\n      this.errorMessageWrapper.classList.add(\n        this.classes.productFormErrorMessageWrapperHidden\n      );\n\n      if (this.quantityInput) {\n        this.quantityInput.classList.remove(this.classes.inputError);\n      }\n    },\n\n    _setupCartPopup: function(item) {\n      this.cartPopup =\n        this.cartPopup || document.querySelector(this.selectors.cartPopup);\n      this.cartPopupWrapper =\n        this.cartPopupWrapper ||\n        document.querySelector(this.selectors.cartPopupWrapper);\n      this.cartPopupTitle =\n        this.cartPopupTitle ||\n        document.querySelector(this.selectors.cartPopupTitle);\n      this.cartPopupQuantity =\n        this.cartPopupQuantity ||\n        document.querySelector(this.selectors.cartPopupQuantity);\n      this.cartPopupQuantityLabel =\n        this.cartPopupQuantityLabel ||\n        document.querySelector(this.selectors.cartPopupQuantityLabel);\n      this.cartPopupClose =\n        this.cartPopupClose ||\n        document.querySelector(this.selectors.cartPopupClose);\n      this.cartPopupDismiss =\n        this.cartPopupDismiss ||\n        document.querySelector(this.selectors.cartPopupDismiss);\n      this.cartPopupImagePlaceholder =\n        this.cartPopupImagePlaceholder ||\n        document.querySelector(this.selectors.cartPopupImagePlaceholder);\n\n      this._setupCartPopupEventListeners();\n\n      this._updateCartPopupContent(item);\n    },\n\n    _updateCartPopupContent: function(item) {\n      var self = this;\n\n      var quantity = this.quantityInput ? this.quantityInput.value : 1;\n\n      var selling_plan_name = item.selling_plan_allocation\n        ? item.selling_plan_allocation.selling_plan.name\n        : null;\n\n      this.cartPopupTitle.textContent = item.product_title;\n      this.cartPopupQuantity.textContent = quantity;\n      this.cartPopupQuantityLabel.textContent = theme.strings.quantityLabel.replace(\n        '[count]',\n        quantity\n      );\n\n      this._setCartPopupPlaceholder(item.featured_image.url);\n      this._setCartPopupImage(item.featured_image.url, item.featured_image.alt);\n      this._setCartPopupProductDetails(\n        item.product_has_only_default_variant,\n        item.options_with_values,\n        item.properties,\n        selling_plan_name\n      );\n\n      fetch(this.cartRoutes.cartUrl + '.js', { credentials: 'same-origin' })\n        .then(function(response) {\n          return response.json();\n        })\n        .then(function(cart) {\n          self._setCartQuantity(cart.item_count);\n          self._setCartCountBubble(cart.item_count);\n          self._showCartPopup();\n        })\n        .catch(function(error) {\n          // eslint-disable-next-line no-console\n          console.log(error);\n        });\n    },\n\n    _setupCartPopupEventListeners: function() {\n      this.eventHandlers.cartPopupWrapperKeyupHandler = this._cartPopupWrapperKeyupHandler.bind(\n        this\n      );\n      this.eventHandlers.hideCartPopup = this._hideCartPopup.bind(this);\n      this.eventHandlers.onBodyClick = this._onBodyClick.bind(this);\n\n      this.cartPopupWrapper.addEventListener(\n        'keyup',\n        this.eventHandlers.cartPopupWrapperKeyupHandler\n      );\n      this.cartPopupClose.addEventListener(\n        'click',\n        this.eventHandlers.hideCartPopup\n      );\n      this.cartPopupDismiss.addEventListener(\n        'click',\n        this.eventHandlers.hideCartPopup\n      );\n      document.body.addEventListener('click', this.eventHandlers.onBodyClick);\n    },\n\n    _cartPopupWrapperKeyupHandler: function(event) {\n      if (event.keyCode === slate.utils.keyboardKeys.ESCAPE) {\n        this._hideCartPopup(event);\n      }\n    },\n\n    _setCartPopupPlaceholder: function(imageUrl) {\n      this.cartPopupImageWrapper =\n        this.cartPopupImageWrapper ||\n        document.querySelector(this.selectors.cartPopupImageWrapper);\n\n      if (imageUrl === null) {\n        this.cartPopupImageWrapper.classList.add(this.classes.hidden);\n        return;\n      }\n    },\n\n    _setCartPopupImage: function(imageUrl, imageAlt) {\n      if (imageUrl === null) return;\n\n      this.cartPopupImageWrapper.classList.remove(this.classes.hidden);\n      var sizedImageUrl = theme.Images.getSizedImageUrl(imageUrl, '200x');\n      var image = document.createElement('img');\n      image.src = sizedImageUrl;\n      image.alt = imageAlt;\n      image.classList.add(this.classes.cartImage);\n      image.setAttribute('data-cart-popup-image', '');\n\n      image.onload = function() {\n        this.cartPopupImagePlaceholder.removeAttribute(\n          'data-image-loading-animation'\n        );\n        this.cartPopupImageWrapper.append(image);\n      }.bind(this);\n    },\n\n    _setCartPopupProductDetails: function(\n      product_has_only_default_variant,\n      options,\n      properties,\n      selling_plan_name\n    ) {\n      this.cartPopupProductDetails =\n        this.cartPopupProductDetails ||\n        document.querySelector(this.selectors.cartPopupProductDetails);\n      var variantPropertiesHTML = '';\n\n      if (!product_has_only_default_variant) {\n        variantPropertiesHTML =\n          variantPropertiesHTML + this._getVariantOptionList(options);\n      }\n\n      if (selling_plan_name) {\n        variantPropertiesHTML =\n          variantPropertiesHTML + this._getSellingPlanHTML(selling_plan_name);\n      }\n\n      if (properties !== null && Object.keys(properties).length !== 0) {\n        variantPropertiesHTML =\n          variantPropertiesHTML + this._getPropertyList(properties);\n      }\n\n      if (variantPropertiesHTML.length === 0) {\n        this.cartPopupProductDetails.innerHTML = '';\n        this.cartPopupProductDetails.setAttribute('hidden', '');\n      } else {\n        this.cartPopupProductDetails.innerHTML = variantPropertiesHTML;\n        this.cartPopupProductDetails.removeAttribute('hidden');\n      }\n    },\n\n    _getVariantOptionList: function(variantOptions) {\n      var variantOptionListHTML = '';\n\n      variantOptions.forEach(function(variantOption) {\n        variantOptionListHTML =\n          variantOptionListHTML +\n          '<li class=\"product-details__item product-details__item--variant-option\">' +\n          variantOption.name +\n          ': ' +\n          variantOption.value +\n          '</li>';\n      });\n\n      return variantOptionListHTML;\n    },\n\n    _getPropertyList: function(properties) {\n      var propertyListHTML = '';\n      var propertiesArray = Object.entries(properties);\n\n      propertiesArray.forEach(function(property) {\n        // Line item properties prefixed with an underscore are not to be displayed\n        if (property[0].charAt(0) === '_') return;\n\n        // if the property value has a length of 0 (empty), don't display it\n        if (property[1].length === 0) return;\n\n        propertyListHTML =\n          propertyListHTML +\n          '<li class=\"product-details__item product-details__item--property\">' +\n          '<span class=\"product-details__property-label\">' +\n          property[0] +\n          ': </span>' +\n          property[1];\n        ': ' + '</li>';\n      });\n\n      return propertyListHTML;\n    },\n\n    _getSellingPlanHTML: function(selling_plan_name) {\n      var sellingPlanHTML =\n        '<li class=\"product-details__item product-details__item--property\">' +\n        selling_plan_name +\n        '</li>';\n\n      return sellingPlanHTML;\n    },\n\n    _setCartQuantity: function(quantity) {\n      this.cartPopupCartQuantity =\n        this.cartPopupCartQuantity ||\n        document.querySelector(this.selectors.cartPopupCartQuantity);\n      var ariaLabel;\n\n      if (quantity === 1) {\n        ariaLabel = theme.strings.oneCartCount;\n      } else if (quantity > 1) {\n        ariaLabel = theme.strings.otherCartCount.replace('[count]', quantity);\n      }\n\n      this.cartPopupCartQuantity.textContent = quantity;\n      this.cartPopupCartQuantity.setAttribute('aria-label', ariaLabel);\n    },\n\n    _setCartCountBubble: function(quantity) {\n      this.cartCountBubble =\n        this.cartCountBubble ||\n        document.querySelector(this.selectors.cartCountBubble);\n      this.cartCount =\n        this.cartCount || document.querySelector(this.selectors.cartCount);\n\n      this.cartCountBubble.classList.remove(this.classes.hidden);\n      this.cartCount.textContent = quantity;\n    },\n\n    _showCartPopup: function() {\n      theme.Helpers.prepareTransition(this.cartPopupWrapper);\n\n      this.cartPopupWrapper.classList.remove(\n        this.classes.cartPopupWrapperHidden\n      );\n      this._handleButtonLoadingState(false);\n\n      slate.a11y.trapFocus({\n        container: this.cartPopupWrapper,\n        elementToFocus: this.cartPopup,\n        namespace: 'cartPopupFocus'\n      });\n    },\n\n    _hideCartPopup: function(event) {\n      var setFocus = event.detail === 0 ? true : false;\n      theme.Helpers.prepareTransition(this.cartPopupWrapper);\n      this.cartPopupWrapper.classList.add(this.classes.cartPopupWrapperHidden);\n\n      var cartPopupImage = document.querySelector(\n        this.selectors.cartPopupImage\n      );\n      if (cartPopupImage) {\n        cartPopupImage.remove();\n      }\n      this.cartPopupImagePlaceholder.setAttribute(\n        'data-image-loading-animation',\n        ''\n      );\n\n      slate.a11y.removeTrapFocus({\n        container: this.cartPopupWrapper,\n        namespace: 'cartPopupFocus'\n      });\n\n      if (setFocus) this.previouslyFocusedElement.focus();\n\n      this.cartPopupWrapper.removeEventListener(\n        'keyup',\n        this.eventHandlers.cartPopupWrapperKeyupHandler\n      );\n      this.cartPopupClose.removeEventListener(\n        'click',\n        this.eventHandlers.hideCartPopup\n      );\n      this.cartPopupDismiss.removeEventListener(\n        'click',\n        this.eventHandlers.hideCartPopup\n      );\n      document.body.removeEventListener(\n        'click',\n        this.eventHandlers.onBodyClick\n      );\n    },\n\n    _onBodyClick: function(event) {\n      var target = event.target;\n\n      if (\n        target !== this.cartPopupWrapper &&\n        !target.closest(this.selectors.cartPopup)\n      ) {\n        this._hideCartPopup(event);\n      }\n    },\n\n    _setActiveThumbnail: function(mediaId) {\n      // If there is no element passed, find it by the current product image\n      if (typeof mediaId === 'undefined') {\n        var productMediaWrapper = this.container.querySelector(\n          this.selectors.productMediaWrapper + ':not(.hide)'\n        );\n\n        if (!productMediaWrapper) return;\n        mediaId = productMediaWrapper.getAttribute('data-media-id');\n      }\n\n      var thumbnailWrappers = this.container.querySelectorAll(\n        this.selectors.productThumbListItem + ':not(.slick-cloned)'\n      );\n\n      var activeThumbnail;\n      thumbnailWrappers.forEach(\n        function(el) {\n          var current = el.querySelector(\n            this.selectors.productThumbImages +\n              \"[data-thumbnail-id='\" +\n              mediaId +\n              \"']\"\n          );\n          if (current) {\n            activeThumbnail = current;\n          }\n        }.bind(this)\n      );\n\n      var productThumbImages = document.querySelectorAll(\n        this.selectors.productThumbImages\n      );\n      productThumbImages.forEach(\n        function(el) {\n          el.classList.remove(this.classes.activeClass);\n          el.removeAttribute('aria-current');\n        }.bind(this)\n      );\n\n      if (activeThumbnail) {\n        activeThumbnail.classList.add(this.classes.activeClass);\n        activeThumbnail.setAttribute('aria-current', true);\n        this._adjustThumbnailSlider(activeThumbnail);\n      }\n    },\n\n    _adjustThumbnailSlider: function(activeThumbnail) {\n      var sliderItem = activeThumbnail.closest('[data-slider-item]');\n      if (!sliderItem) return;\n\n      var slideGroupLeaderIndex =\n        Math.floor(\n          Number(sliderItem.getAttribute('data-slider-slide-index')) / 3\n        ) * 3;\n\n      window.setTimeout(\n        function() {\n          if (!this.slideshow) return;\n          this.slideshow.goToSlideByIndex(slideGroupLeaderIndex);\n        }.bind(this),\n        251\n      );\n    },\n\n    _switchMedia: function(mediaId) {\n      var currentMedia = this.container.querySelector(\n        this.selectors.productMediaWrapper +\n          ':not(.' +\n          this.classes.hidden +\n          ')'\n      );\n\n      var newMedia = this.container.querySelector(\n        this.selectors.productMediaWrapper + \"[data-media-id='\" + mediaId + \"']\"\n      );\n\n      var otherMedia = this.container.querySelectorAll(\n        this.selectors.productMediaWrapper +\n          \":not([data-media-id='\" +\n          mediaId +\n          \"'])\"\n      );\n\n      currentMedia.dispatchEvent(\n        new CustomEvent('mediaHidden', {\n          bubbles: true,\n          cancelable: true\n        })\n      );\n      newMedia.classList.remove(this.classes.hidden);\n      newMedia.dispatchEvent(\n        new CustomEvent('mediaVisible', {\n          bubbles: true,\n          cancelable: true\n        })\n      );\n      otherMedia.forEach(\n        function(el) {\n          el.classList.add(this.classes.hidden);\n        }.bind(this)\n      );\n    },\n\n    _handleMediaFocus: function(evt) {\n      if (evt.keyCode !== slate.utils.keyboardKeys.ENTER) return;\n\n      var mediaId = evt.currentTarget.getAttribute('data-thumbnail-id');\n\n      var productMediaWrapper = this.container.querySelector(\n        this.selectors.productMediaWrapper + \"[data-media-id='\" + mediaId + \"']\"\n      );\n      productMediaWrapper.focus();\n    },\n\n    _initThumbnailSlider: function() {\n      setTimeout(\n        function() {\n          this.slideshow = new theme.Slideshow(\n            this.container.querySelector('[data-thumbnail-slider]'),\n            {\n              canUseTouchEvents: true,\n              type: 'slide',\n              slideActiveClass: 'slick-active',\n              slidesToShow: 3,\n              slidesToScroll: 3\n            }\n          );\n\n          this.settings.sliderActive = true;\n        }.bind(this),\n        250\n      );\n    },\n\n    _destroyThumbnailSlider: function() {\n      var sliderButtons = this.container.querySelectorAll(\n        '[data-slider-button]'\n      );\n      var sliderTrack = this.container.querySelector('[data-slider-track]');\n      var sliderItems = sliderTrack.querySelectorAll('[data-slider-item');\n      this.settings.sliderActive = false;\n\n      if (sliderTrack) {\n        sliderTrack.removeAttribute('style');\n        sliderItems.forEach(function(sliderItem) {\n          var sliderItemLink = sliderItem.querySelector(\n            '[data-slider-item-link]'\n          );\n          sliderItem.classList.remove('slick-active');\n          sliderItem.removeAttribute('style');\n          sliderItem.removeAttribute('tabindex');\n          sliderItem.removeAttribute('aria-hidden');\n          sliderItemLink.removeAttribute('tabindex');\n        });\n      }\n\n      sliderButtons.forEach(function(sliderButton) {\n        sliderButton.removeAttribute('aria-disabled');\n      });\n\n      this.slideshow.destroy();\n      this.slideshow = null;\n    },\n\n    _liveRegionText: function(variant) {\n      // Dummy content for live region\n      var liveRegionText =\n        '[Availability] [Regular] [$$] [Sale] [$]. [UnitPrice] [$$$]';\n\n      if (!this.productState.available) {\n        liveRegionText = theme.strings.unavailable;\n        return liveRegionText;\n      }\n\n      // Update availability\n      var availability = this.productState.soldOut\n        ? theme.strings.soldOut + ','\n        : '';\n      liveRegionText = liveRegionText.replace('[Availability]', availability);\n\n      // Update pricing information\n      var regularLabel = '';\n      var regularPrice = theme.Currency.formatMoney(\n        variant.price,\n        theme.moneyFormat\n      );\n      var saleLabel = '';\n      var salePrice = '';\n      var unitLabel = '';\n      var unitPrice = '';\n\n      if (this.productState.onSale) {\n        regularLabel = theme.strings.regularPrice;\n        regularPrice =\n          theme.Currency.formatMoney(\n            variant.compare_at_price,\n            theme.moneyFormat\n          ) + ',';\n        saleLabel = theme.strings.sale;\n        salePrice = theme.Currency.formatMoney(\n          variant.price,\n          theme.moneyFormat\n        );\n      }\n\n      if (this.productState.showUnitPrice) {\n        unitLabel = theme.strings.unitPrice;\n        unitPrice =\n          theme.Currency.formatMoney(variant.unit_price, theme.moneyFormat) +\n          ' ' +\n          theme.strings.unitPriceSeparator +\n          ' ' +\n          this._getBaseUnit(variant);\n      }\n\n      liveRegionText = liveRegionText\n        .replace('[Regular]', regularLabel)\n        .replace('[$$]', regularPrice)\n        .replace('[Sale]', saleLabel)\n        .replace('[$]', salePrice)\n        .replace('[UnitPrice]', unitLabel)\n        .replace('[$$$]', unitPrice)\n        .trim();\n\n      return liveRegionText;\n    },\n\n    _updateLiveRegion: function(evt) {\n      var variant = evt.detail.variant;\n      var liveRegion = this.container.querySelector(\n        this.selectors.productStatus\n      );\n      liveRegion.innerHTML = this._liveRegionText(variant);\n      liveRegion.setAttribute('aria-hidden', false);\n      // hide content from accessibility tree after announcement\n      setTimeout(function() {\n        liveRegion.setAttribute('aria-hidden', true);\n      }, 1000);\n    },\n\n    _enableAddToCart: function(message) {\n      this.addToCart.removeAttribute('aria-disabled');\n      this.addToCart.setAttribute('aria-label', message);\n      this.addToCartText.innerHTML = message;\n      this.productForm.classList.remove(this.classes.variantSoldOut);\n    },\n\n    _disableAddToCart: function(message) {\n      message = message || theme.strings.unavailable;\n      this.addToCart.setAttribute('aria-disabled', true);\n      this.addToCart.setAttribute('aria-label', message);\n      this.addToCartText.innerHTML = message;\n      this.productForm.classList.add(this.classes.variantSoldOut);\n    },\n\n    _updateAddToCart: function() {\n      if (!this.productState.available) {\n        this._disableAddToCart(theme.strings.unavailable);\n        return;\n      }\n      if (this.productState.soldOut) {\n        this._disableAddToCart(theme.strings.soldOut);\n        return;\n      }\n\n      this._enableAddToCart(theme.strings.addToCart);\n    },\n\n    /**\n     * The returned productState object keeps track of a number of properties about the current variant and product\n     * Multiple functions within product.js leverage the productState object to determine how to update the page's UI\n     * @param {object} evt - object returned from variant change event\n     * @return {object} productState - current product variant's state\n     *                  productState.available - true if current product options result in valid variant\n     *                  productState.soldOut - true if variant is sold out\n     *                  productState.onSale - true if variant is on sale\n     *                  productState.showUnitPrice - true if variant has unit price value\n     */\n    _setProductState: function(evt) {\n      var variant = evt.detail.variant;\n\n      if (!variant) {\n        this.productState.available = false;\n        return;\n      }\n\n      this.productState.available = true;\n      this.productState.soldOut = !variant.available;\n      this.productState.onSale = variant.compare_at_price > variant.price;\n      this.productState.showUnitPrice = !!variant.unit_price;\n    },\n\n    _updateAvailability: function(evt) {\n      // remove error message if one is showing\n      this._hideErrorMessage();\n\n      // set product state\n      this._setProductState(evt);\n\n      // update store availabilities info\n      this._updateStoreAvailabilityContent(evt);\n      // update form submit\n      this._updateAddToCart();\n      // update live region\n      this._updateLiveRegion(evt);\n\n      this._updatePriceComponentStyles(evt);\n    },\n\n    _updateStoreAvailabilityContent: function(evt) {\n      if (!this.storeAvailability) {\n        return;\n      }\n\n      if (this.productState.available && !this.productState.soldOut) {\n        this.storeAvailability.updateContent(evt.detail.variant.id);\n      } else {\n        this.storeAvailability.clearContent();\n      }\n    },\n\n    _updateMedia: function(evt) {\n      var variant = evt.detail.variant;\n      var mediaId = variant.featured_media.id;\n      var sectionMediaId = this.settings.sectionId + '-' + mediaId;\n\n      this._switchMedia(sectionMediaId);\n      this._setActiveThumbnail(sectionMediaId);\n    },\n\n    _hidePriceComponent: function() {\n      this.priceContainer.classList.add(this.classes.productUnavailable);\n      this.priceContainer.setAttribute('aria-hidden', true);\n      if (this.productPolicies) {\n        this.productPolicies.classList.add(this.classes.visibilityHidden);\n      }\n    },\n\n    _updatePriceComponentStyles: function(evt) {\n      var variant = evt.detail.variant;\n\n      var unitPriceBaseUnit = this.priceContainer.querySelector(\n        this.selectors.unitPriceBaseUnit\n      );\n\n      if (!this.productState.available) {\n        this._hidePriceComponent();\n        return;\n      }\n\n      if (this.productState.soldOut) {\n        this.priceContainer.classList.add(this.classes.productSoldOut);\n      } else {\n        this.priceContainer.classList.remove(this.classes.productSoldOut);\n      }\n\n      if (this.productState.showUnitPrice) {\n        unitPriceBaseUnit.innerHTML = this._getBaseUnit(variant);\n        this.priceContainer.classList.add(this.classes.productUnitAvailable);\n      } else {\n        this.priceContainer.classList.remove(this.classes.productUnitAvailable);\n      }\n\n      if (this.productState.onSale) {\n        this.priceContainer.classList.add(this.classes.productOnSale);\n      } else {\n        this.priceContainer.classList.remove(this.classes.productOnSale);\n      }\n\n      this.priceContainer.classList.remove(this.classes.productUnavailable);\n      this.priceContainer.removeAttribute('aria-hidden');\n      if (this.productPolicies) {\n        this.productPolicies.classList.remove(this.classes.visibilityHidden);\n      }\n    },\n\n    _updatePrice: function(evt) {\n      var variant = evt.detail.variant;\n\n      var regularPrices = this.priceContainer.querySelectorAll(\n        this.selectors.regularPrice\n      );\n      var salePrice = this.priceContainer.querySelector(\n        this.selectors.salePrice\n      );\n      var unitPrice = this.priceContainer.querySelector(\n        this.selectors.unitPrice\n      );\n\n      var formatRegularPrice = function(regularPriceElement, price) {\n        regularPriceElement.innerHTML = theme.Currency.formatMoney(\n          price,\n          theme.moneyFormat\n        );\n      };\n\n      // On sale\n      if (this.productState.onSale) {\n        regularPrices.forEach(function(regularPrice) {\n          formatRegularPrice(regularPrice, variant.compare_at_price);\n        });\n        salePrice.innerHTML = theme.Currency.formatMoney(\n          variant.price,\n          theme.moneyFormat\n        );\n      } else {\n        // Regular price\n        regularPrices.forEach(function(regularPrice) {\n          formatRegularPrice(regularPrice, variant.price);\n        });\n      }\n\n      // Unit price\n      if (this.productState.showUnitPrice) {\n        unitPrice.innerHTML = theme.Currency.formatMoney(\n          variant.unit_price,\n          theme.moneyFormat\n        );\n      }\n    },\n\n    _getBaseUnit: function(variant) {\n      return variant.unit_price_measurement.reference_value === 1\n        ? variant.unit_price_measurement.reference_unit\n        : variant.unit_price_measurement.reference_value +\n            variant.unit_price_measurement.reference_unit;\n    },\n\n    _updateSKU: function(evt) {\n      var variant = evt.detail.variant;\n\n      // Update the sku\n      var sku = document.querySelector(this.selectors.SKU);\n      if (!sku) return;\n      sku.innerHTML = variant.sku;\n    },\n\n    _enableZoom: function(el, index) {\n      this.zoomPictures[index] = new theme.Zoom(el);\n    },\n\n    _destroyZoom: function(index) {\n      if (this.zoomPictures.length === 0) return;\n      this.zoomPictures[index].unload();\n    },\n\n    onUnload: function() {\n      this.container.removeEventListener(\n        'variantChange',\n        this.eventHandlers.updateAvailability\n      );\n      this.container.removeEventListener(\n        'variantImageChange',\n        this.eventHandlers.updateMedia\n      );\n      this.container.removeEventListener(\n        'variantPriceChange',\n        this.eventHandlers.updatePrice\n      );\n      this.container.removeEventListener(\n        'variantSKUChange',\n        this.eventHandlers.updateSKU\n      );\n      theme.ProductVideo.removeSectionVideos(this.settings.sectionId);\n      theme.ProductModel.removeSectionModels(this.settings.sectionId);\n\n      if (this.mqlSmall) {\n        this.mqlSmall.removeListener(this.initMobileBreakpoint);\n      }\n\n      if (this.mqlMediumUp) {\n        this.mqlMediumUp.removeListener(this.initDesktopBreakpoint);\n      }\n    }\n  });\n\n  return Product;\n})();\n\ntheme.ProductRecommendations = (function() {\n  function ProductRecommendations(container) {\n    var baseUrl = container.dataset.baseUrl;\n    var productId = container.dataset.productId;\n    var recommendationsSectionUrl =\n      baseUrl +\n      '?section_id=product-recommendations&product_id=' +\n      productId +\n      '&limit=4';\n\n    window.performance.mark(\n      'debut:product:fetch_product_recommendations.start'\n    );\n\n    fetch(recommendationsSectionUrl)\n      .then(function(response) {\n        return response.text();\n      })\n      .then(function(productHtml) {\n        if (productHtml.trim() === '') return;\n\n        container.innerHTML = productHtml;\n        container.innerHTML = container.firstElementChild.innerHTML;\n\n        window.performance.mark(\n          'debut:product:fetch_product_recommendations.end'\n        );\n\n        performance.measure(\n          'debut:product:fetch_product_recommendations',\n          'debut:product:fetch_product_recommendations.start',\n          'debut:product:fetch_product_recommendations.end'\n        );\n      });\n  }\n\n  return ProductRecommendations;\n})();\n\ntheme.Quotes = (function() {\n  var config = {\n    mediaQuerySmall: 'screen and (max-width: 749px)',\n    mediaQueryMediumUp: 'screen and (min-width: 750px)',\n    slideCount: 0\n  };\n\n  var defaults = {\n    canUseKeyboardArrows: false,\n    type: 'slide',\n    slidesToShow: 3\n  };\n\n  function Quotes(container) {\n    this.container = container;\n    var sectionId = container.getAttribute('data-section-id');\n    this.slider = document.getElementById('Quotes-' + sectionId);\n\n    this.sliderActive = false;\n\n    this.mobileOptions = Object.assign({}, defaults, {\n      canUseTouchEvents: true,\n      slidesToShow: 1\n    });\n\n    this.desktopOptions = Object.assign({}, defaults, {\n      slidesToShow: Math.min(\n        defaults.slidesToShow,\n        this.slider.getAttribute('data-count')\n      )\n    });\n\n    this.initMobileSlider = this._initMobileSlider.bind(this);\n    this.initDesktopSlider = this._initDesktopSlider.bind(this);\n\n    this.mqlSmall = window.matchMedia(config.mediaQuerySmall);\n    this.mqlSmall.addListener(this.initMobileSlider);\n\n    this.mqlMediumUp = window.matchMedia(config.mediaQueryMediumUp);\n    this.mqlMediumUp.addListener(this.initDesktopSlider);\n\n    this.initMobileSlider();\n    this.initDesktopSlider();\n  }\n\n  Quotes.prototype = Object.assign({}, Quotes.prototype, {\n    onUnload: function() {\n      this.mqlSmall.removeListener(this.initMobileSlider);\n      this.mqlMediumUp.removeListener(this.initDesktopSlider);\n      this.slideshow.destroy();\n    },\n\n    // eslint-disable-next-line no-unused-vars\n    onBlockSelect: function(evt) {\n      var slide = document.querySelector(\n        '.quotes-slide--' + evt.detail.blockId\n      );\n      var slideIndex = Number(slide.getAttribute('data-slider-slide-index'));\n\n      if (this.mqlMediumUp.matches) {\n        slideIndex = Math.max(\n          0,\n          Math.min(slideIndex, this.slideshow.slides.length - 3)\n        );\n      }\n\n      this.slideshow.goToSlideByIndex(slideIndex);\n    },\n\n    _initMobileSlider: function() {\n      if (this.mqlSmall.matches) {\n        this._initSlider(this.mobileOptions);\n      }\n    },\n\n    _initDesktopSlider: function() {\n      if (this.mqlMediumUp.matches) {\n        this._initSlider(this.desktopOptions);\n      }\n    },\n\n    // eslint-disable-next-line no-unused-vars\n    _initSlider: function(args) {\n      if (this.sliderActive) {\n        this.slideshow.destroy();\n        this.sliderActive = false;\n      }\n\n      this.slideshow = new theme.Slideshow(this.container, args);\n      this.sliderActive = true;\n    }\n  });\n\n  return Quotes;\n})();\n\ntheme.SlideshowSection = (function() {\n  var selectors = {\n    sliderMobileContentIndex: '[data-slider-mobile-content-index]'\n  };\n\n  function SlideshowSection(container) {\n    var sectionId = container.dataset.sectionId;\n\n    this.container = container;\n    this.eventHandlers = {};\n    this.slideshowDom = container.querySelector('#Slideshow-' + sectionId);\n    this.sliderMobileContentIndex = container.querySelectorAll(\n      selectors.sliderMobileContentIndex\n    );\n\n    this.slideshow = new theme.Slideshow(container, {\n      autoplay: this.slideshowDom.getAttribute('data-autorotate') === 'true',\n      slideInterval: this.slideshowDom.getAttribute('data-speed')\n    });\n    this._setupEventListeners();\n  }\n\n  return SlideshowSection;\n})();\n\ntheme.SlideshowSection.prototype = Object.assign(\n  {},\n  theme.SlideshowSection.prototype,\n  {\n    _setupEventListeners: function() {\n      this.eventHandlers.onSliderSlideChanged = function(event) {\n        this._onSliderSlideChanged(event.detail);\n      }.bind(this);\n\n      this.container.addEventListener(\n        'slider_slide_changed',\n        this.eventHandlers.onSliderSlideChanged\n      );\n    },\n\n    _onSliderSlideChanged: function(slideIndex) {\n      var activeClass = 'slideshow__text-content--mobile-active';\n\n      this.sliderMobileContentIndex.forEach(function(element) {\n        if (\n          Number(element.getAttribute('data-slider-mobile-content-index')) ===\n          slideIndex\n        ) {\n          element.classList.add(activeClass);\n        } else {\n          element.classList.remove(activeClass);\n        }\n      });\n    },\n\n    onUnload: function() {\n      this.slideshow.destroy();\n    },\n\n    onBlockSelect: function(evt) {\n      if (this.slideshow.adaptHeight) {\n        this.slideshow.setSlideshowHeight();\n      }\n\n      // Get slide's index using theme editor's id\n      var slide = this.container.querySelector(\n        '.slideshow__slide--' + evt.detail.blockId\n      );\n      var slideIndex = slide.getAttribute('data-slider-slide-index');\n\n      // Go to selected slide, pause auto-rotate\n      this.slideshow.setSlide(slideIndex);\n      this.slideshow.stopAutoplay();\n    },\n\n    onBlockDeselect: function() {\n      // Resume auto-rotate\n      this.slideshow.startAutoplay();\n    }\n  }\n);\n\nwindow.theme = window.theme || {};\n\ntheme.StoreAvailability = (function() {\n  var selectors = {\n    storeAvailabilityModalOpen: '[data-store-availability-modal-open]',\n    storeAvailabilityModalProductTitle:\n      '[data-store-availability-modal-product-title]',\n    storeAvailabilityModalVariantTitle:\n      '[data-store-availability-modal-variant-title]'\n  };\n\n  var classes = {\n    hidden: 'hide'\n  };\n\n  function StoreAvailability(container) {\n    this.container = container;\n    this.productTitle = this.container.dataset.productTitle;\n    this.hasOnlyDefaultVariant =\n      this.container.dataset.hasOnlyDefaultVariant === 'true';\n  }\n\n  StoreAvailability.prototype = Object.assign({}, StoreAvailability.prototype, {\n    updateContent: function(variantId) {\n      var variantSectionUrl =\n        this.container.dataset.baseUrl +\n        '/variants/' +\n        variantId +\n        '/?section_id=store-availability';\n      var self = this;\n\n      var storeAvailabilityModalOpen = self.container.querySelector(\n        selectors.storeAvailabilityModalOpen\n      );\n\n      this.container.style.opacity = 0.5;\n      if (storeAvailabilityModalOpen) {\n        storeAvailabilityModalOpen.disabled = true;\n        storeAvailabilityModalOpen.setAttribute('aria-busy', true);\n      }\n\n      fetch(variantSectionUrl)\n        .then(function(response) {\n          return response.text();\n        })\n        .then(function(storeAvailabilityHTML) {\n          if (storeAvailabilityHTML.trim() === '') {\n            return;\n          }\n          self.container.innerHTML = storeAvailabilityHTML;\n          self.container.innerHTML = self.container.firstElementChild.innerHTML;\n          self.container.style.opacity = 1;\n\n          // Need to query this again because we updated the DOM\n          storeAvailabilityModalOpen = self.container.querySelector(\n            selectors.storeAvailabilityModalOpen\n          );\n\n          if (!storeAvailabilityModalOpen) {\n            return;\n          }\n\n          storeAvailabilityModalOpen.addEventListener(\n            'click',\n            self._onClickModalOpen.bind(self)\n          );\n\n          self.modal = self._initModal();\n          self._updateProductTitle();\n          if (self.hasOnlyDefaultVariant) {\n            self._hideVariantTitle();\n          }\n        });\n    },\n\n    clearContent: function() {\n      this.container.innerHTML = '';\n    },\n\n    _onClickModalOpen: function() {\n      this.container.dispatchEvent(\n        new CustomEvent('storeAvailabilityModalOpened', {\n          bubbles: true,\n          cancelable: true\n        })\n      );\n    },\n\n    _initModal: function() {\n      return new window.Modals(\n        'StoreAvailabilityModal',\n        'store-availability-modal',\n        {\n          close: '.js-modal-close-store-availability-modal',\n          closeModalOnClick: true,\n          openClass: 'store-availabilities-modal--active'\n        }\n      );\n    },\n\n    _updateProductTitle: function() {\n      var storeAvailabilityModalProductTitle = this.container.querySelector(\n        selectors.storeAvailabilityModalProductTitle\n      );\n      storeAvailabilityModalProductTitle.textContent = this.productTitle;\n    },\n\n    _hideVariantTitle: function() {\n      var storeAvailabilityModalVariantTitle = this.container.querySelector(\n        selectors.storeAvailabilityModalVariantTitle\n      );\n      storeAvailabilityModalVariantTitle.classList.add(classes.hidden);\n    }\n  });\n\n  return StoreAvailability;\n})();\n\ntheme.VideoSection = (function() {\n  function VideoSection(container) {\n    container.querySelectorAll('.video').forEach(function(el) {\n      theme.Video.init(el);\n      theme.Video.editorLoadVideo(el.id);\n    });\n  }\n\n  return VideoSection;\n})();\n\ntheme.VideoSection.prototype = Object.assign({}, theme.VideoSection.prototype, {\n  onUnload: function() {\n    theme.Video.removeEvents();\n  }\n});\n\ntheme.heros = {};\n\ntheme.HeroSection = (function() {\n  function HeroSection(container) {\n    var sectionId = container.getAttribute('data-section-id');\n    var hero = '#Hero-' + sectionId;\n    theme.heros[hero] = new theme.Hero(hero, sectionId);\n  }\n\n  return HeroSection;\n})();\n\nwindow.theme = window.theme || {};\n\nvar selectors = {\n  disclosureLocale: '[data-disclosure-locale]',\n  disclosureCountry: '[data-disclosure-country]'\n};\n\ntheme.FooterSection = (function() {\n  function Footer(container) {\n    this.container = container;\n    this.cache = {};\n    this.cacheSelectors();\n\n    if (this.cache.localeDisclosure) {\n      this.localeDisclosure = new theme.Disclosure(this.cache.localeDisclosure);\n    }\n\n    if (this.cache.countryDisclosure) {\n      this.countryDisclosure = new theme.Disclosure(\n        this.cache.countryDisclosure\n      );\n    }\n  }\n\n  Footer.prototype = Object.assign({}, Footer.prototype, {\n    cacheSelectors: function() {\n      this.cache = {\n        localeDisclosure: this.container.querySelector(\n          selectors.disclosureLocale\n        ),\n        countryDisclosure: this.container.querySelector(\n          selectors.disclosureCountry\n        )\n      };\n    },\n\n    onUnload: function() {\n      if (this.cache.localeDisclosure) {\n        this.localeDisclosure.destroy();\n      }\n\n      if (this.cache.countryDisclosure) {\n        this.countryDisclosure.destroy();\n      }\n    }\n  });\n\n  return Footer;\n})();\n\n\ndocument.addEventListener('DOMContentLoaded', function() {\n  var sections = new theme.Sections();\n\n  sections.register('cart-template', theme.Cart);\n  sections.register('product', theme.Product);\n  sections.register('collection-template', theme.Filters);\n  sections.register('product-template', theme.Product);\n  sections.register('header-section', theme.HeaderSection);\n  sections.register('map', theme.Maps);\n  sections.register('slideshow-section', theme.SlideshowSection);\n  sections.register('store-availability', theme.StoreAvailability);\n  sections.register('video-section', theme.VideoSection);\n  sections.register('quotes', theme.Quotes);\n  sections.register('hero-section', theme.HeroSection);\n  sections.register('product-recommendations', theme.ProductRecommendations);\n  sections.register('footer-section', theme.FooterSection);\n\n  theme.customerTemplates.init();\n\n  // Theme-specific selectors to make tables scrollable\n  var tableSelectors = '.rte table,' + '.custom__item-inner--html table';\n\n  slate.rte.wrapTable({\n    tables: document.querySelectorAll(tableSelectors),\n    tableWrapperClass: 'scrollable-wrapper'\n  });\n\n  // Theme-specific selectors to make iframes responsive\n  var iframeSelectors =\n    '.rte iframe[src*=\"youtube.com/embed\"],' +\n    '.rte iframe[src*=\"player.vimeo\"],' +\n    '.custom__item-inner--html iframe[src*=\"youtube.com/embed\"],' +\n    '.custom__item-inner--html iframe[src*=\"player.vimeo\"]';\n\n  slate.rte.wrapIframe({\n    iframes: document.querySelectorAll(iframeSelectors),\n    iframeWrapperClass: 'video-wrapper'\n  });\n\n  // Common a11y fixes\n  slate.a11y.pageLinkFocus(\n    document.getElementById(window.location.hash.substr(1))\n  );\n\n  var inPageLink = document.querySelector('.in-page-link');\n  if (inPageLink) {\n    inPageLink.addEventListener('click', function(evt) {\n      slate.a11y.pageLinkFocus(\n        document.getElementById(evt.currentTarget.hash.substr(1))\n      );\n    });\n  }\n\n  document.querySelectorAll('a[href=\"#\"]').forEach(function(anchor) {\n    anchor.addEventListener('click', function(evt) {\n      evt.preventDefault();\n    });\n  });\n\n  slate.a11y.accessibleLinks({\n    messages: {\n      newWindow: theme.strings.newWindow,\n      external: theme.strings.external,\n      newWindowExternal: theme.strings.newWindowExternal\n    },\n    links: document.querySelectorAll(\n      'a[href]:not([aria-describedby]), .product-single__thumbnail'\n    )\n  });\n\n  theme.FormStatus.init();\n\n  var selectors = {\n    image: '[data-image]',\n    lazyloaded: '.lazyloaded'\n  };\n\n  document.addEventListener('lazyloaded', function(evt) {\n    var image = evt.target;\n\n    removeImageLoadingAnimation(image);\n\n    if (document.body.classList.contains('template-index')) {\n      var mainContent = document.getElementById('MainContent');\n\n      if (mainContent && mainContent.children && mainContent.children.length) {\n        var firstSection = document.getElementsByClassName('index-section')[0];\n\n        if (!firstSection.contains(image)) return;\n\n        window.performance.mark('debut:index:first_image_visible');\n      }\n    }\n\n    if (image.hasAttribute('data-bgset')) {\n      var innerImage = image.querySelector(selectors.lazyloaded);\n\n      if (innerImage) {\n        var alt = image.getAttribute('data-alt');\n        var src = innerImage.hasAttribute('data-src')\n          ? innerImage.getAttribute('data-src')\n          : image.getAttribute('data-bg');\n\n        image.setAttribute('alt', alt ? alt : '');\n        image.setAttribute('src', src ? src : '');\n      }\n    }\n\n    if (!image.hasAttribute('data-image')) {\n      return;\n    }\n  });\n\n  // When the theme loads, lazysizes might load images before the \"lazyloaded\"\n  // event listener has been attached. When this happens, the following function\n  // hides the loading placeholders.\n  function onLoadHideLazysizesAnimation() {\n    var alreadyLazyloaded = document.querySelectorAll('.lazyloaded');\n    alreadyLazyloaded.forEach(function(image) {\n      removeImageLoadingAnimation(image);\n    });\n  }\n\n  onLoadHideLazysizesAnimation();\n\n  document.addEventListener(\n    'touchstart',\n    function() {\n      theme.Helpers.setTouch();\n    },\n    { once: true }\n  );\n\n  if (document.fonts) {\n    document.fonts.ready.then(function() {\n      window.performance.mark('debut:fonts_loaded');\n    });\n  }\n});\n\n// Youtube API callback\n// eslint-disable-next-line no-unused-vars\nfunction onYouTubeIframeAPIReady() {\n  theme.Video.loadVideos();\n}\n\nfunction removeImageLoadingAnimation(image) {\n  // Remove loading animation\n  var imageWrapper = image.hasAttribute('data-image-loading-animation')\n    ? image\n    : image.closest('[data-image-loading-animation]');\n\n  if (imageWrapper) {\n    imageWrapper.removeAttribute('data-image-loading-animation');\n  }\n}\n"],
  "mappings": "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",
  "names": ["instance", "status", "selectors", "event", "self", "hero"]
}
