<!doctype html> <html lang="en"> <head > <meta charset="utf-8"/> <meta name="title" content="Shopping Cart"/> <meta name="description" content="This is a demo store for the Hyvä Checkout product"/> <meta name="robots" content="NOINDEX,NOFOLLOW"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Shopping Cart</title> <link rel="stylesheet" type="text/css" media="all" href="https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US/css/styles.css" /> <link rel="icon" type="image/x-icon" href="https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US/Magento_Theme/favicon.ico" /> <link rel="shortcut icon" type="image/x-icon" href="https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US/Magento_Theme/favicon.ico" /> <script> var BASE_URL = 'https://checkout-demo.hyva.io/onestep/'; var THEME_PATH = 'https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US'; var COOKIE_CONFIG = { "expires": null, "path": "\u002F", "domain": ".checkout\u002Ddemo.hyva.io", "secure": false, "lifetime": "3600", "cookie_restriction_enabled": false }; var CURRENT_STORE_CODE = 'onestep'; var CURRENT_WEBSITE_ID = '1'; window.hyva = window.hyva || {} window.cookie_consent_groups = window.cookie_consent_groups || {} window.cookie_consent_groups['necessary'] = true; window.cookie_consent_config = window.cookie_consent_config || {}; window.cookie_consent_config['necessary'] = [].concat( window.cookie_consent_config['necessary'] || [], [ 'user_allowed_save_cookie', 'form_key', 'mage-messages', 'private_content_version', 'mage-cache-sessid', 'last_visited_store', 'section_data_ids' ] ); </script> <script> 'use strict'; (function( hyva, undefined ) { function lifetimeToExpires(options, defaults) { const lifetime = options.lifetime || defaults.lifetime; if (lifetime) { const date = new Date; date.setTime(date.getTime() + lifetime * 1000); return date; } return null; } function generateRandomString() { const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length = 16; let formKey = '', charactersLength = allowedCharacters.length; for (let i = 0; i < length; i++) { formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] } return formKey; } const sessionCookieMarker = {noLifetime: true} const cookieTempStorage = {}; const internalCookie = { get(name) { const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return v ? v[2] : null; }, set(name, value, days, skipSetDomain) { let expires, path, domain, secure, samesite; const defaultCookieConfig = { expires: null, path: '/', domain: null, secure: false, lifetime: null, samesite: 'lax' }; const cookieConfig = window.COOKIE_CONFIG || {}; expires = days && days !== sessionCookieMarker ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; path = cookieConfig.path || defaultCookieConfig.path; domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); secure = cookieConfig.secure || defaultCookieConfig.secure; samesite = cookieConfig.samesite || defaultCookieConfig.samesite; document.cookie = name + "=" + encodeURIComponent(value) + (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + (path ? '; path=' + path : '') + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '') + (samesite ? '; samesite=' + samesite : 'lax'); }, isWebsiteAllowedToSaveCookie() { const allowedCookies = this.get('user_allowed_save_cookie'); if (allowedCookies) { const allowedWebsites = JSON.parse(unescape(allowedCookies)); return allowedWebsites[CURRENT_WEBSITE_ID] === 1; } return false; }, getGroupByCookieName(name) { const cookieConsentConfig = window.cookie_consent_config || {}; let group = null; for (let prop in cookieConsentConfig) { if (!cookieConsentConfig.hasOwnProperty(prop)) continue; if (cookieConsentConfig[prop].includes(name)) { group = prop; break; } } return group; }, isCookieAllowed(name) { const cookieGroup = this.getGroupByCookieName(name); return cookieGroup ? window.cookie_consent_groups[cookieGroup] : this.isWebsiteAllowedToSaveCookie(); }, saveTempStorageCookies() { for (const [name, data] of Object.entries(cookieTempStorage)) { if (this.isCookieAllowed(name)) { this.set(name, data['value'], data['days'], data['skipSetDomain']); delete cookieTempStorage[name]; } } } }; hyva.getCookie = (name) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; } return internalCookie.get(name); } hyva.setCookie = (name, value, days, skipSetDomain) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { cookieTempStorage[name] = {value, days, skipSetDomain}; return; } return internalCookie.set(name, value, days, skipSetDomain); } hyva.setSessionCookie = (name, value, skipSetDomain) => { return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) } hyva.getBrowserStorage = () => { const browserStorage = window.localStorage || window.sessionStorage; if (!browserStorage) { console.warn('Browser Storage is unavailable'); return false; } try { browserStorage.setItem('storage_test', '1'); browserStorage.removeItem('storage_test'); } catch (error) { console.warn('Browser Storage is not accessible', error); return false; } return browserStorage; } hyva.postForm = (postParams) => { const form = document.createElement("form"); let data = postParams.data; if (! postParams.skipUenc && ! data.uenc) { data.uenc = btoa(window.location.href); } form.method = "POST"; form.action = postParams.action; Object.keys(postParams.data).map(key => { const field = document.createElement("input"); field.type = 'hidden' field.value = postParams.data[key]; field.name = key; form.appendChild(field); }); const form_key = document.createElement("input"); form_key.type = 'hidden'; form_key.value = hyva.getFormKey(); form_key.name="form_key"; form.appendChild(form_key); document.body.appendChild(form); form.submit(); } hyva.getFormKey = function () { let formKey = hyva.getCookie('form_key'); if (!formKey) { formKey = generateRandomString(); hyva.setCookie('form_key', formKey); } return formKey; } hyva.formatPrice = (value, showSign, options = {}) => { const groupSeparator = options.groupSeparator; const decimalSeparator = options.decimalSeparator delete options.groupSeparator; delete options.decimalSeparator; const formatter = new Intl.NumberFormat( 'en\u002DUS', Object.assign({ style: 'currency', currency: 'EUR', signDisplay: showSign ? 'always' : 'auto' }, options) ); return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? formatter.formatToParts(value).map(({type, value}) => { switch (type) { case 'currency': return '\u20AC' || value; case 'minusSign': return '- '; case 'plusSign': return '+ '; case 'group': return groupSeparator !== undefined ? groupSeparator : value; case 'decimal': return decimalSeparator !== undefined ? decimalSeparator : value; default : return value; } }).reduce((string, part) => string + part) : formatter.format(value); } const formatStr = function (str, nStart) { const args = Array.from(arguments).slice(2); return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { const idx = parseInt(n) - nStart; if (args[idx] === null || args[idx] === void 0) { return m; } return p.length % 2 ? p.slice(0, -1).replace('%%', '%') + args[idx] : p.replace('%%', '%') + n; }) } hyva.str = function (string) { const args = Array.from(arguments); args.splice(1, 0, 1); return formatStr.apply(undefined, args); } hyva.strf = function () { const args = Array.from(arguments); args.splice(1, 0, 0); return formatStr.apply(undefined, args); } /** * Take a html string as `content` parameter and * extract an element from the DOM to replace in * the current page under the same selector, * defined by `targetSelector` */ hyva.replaceDomElement = (targetSelector, content) => { // Parse the content and extract the DOM node using the `targetSelector` const parser = new DOMParser(); const doc = parser.parseFromString(content, 'text/html'); const contentNode = doc.querySelector(targetSelector); // Bail if content can't be found if (!contentNode) { return; } hyva.activateScripts(contentNode) // Replace the old DOM node with the new content document.querySelector(targetSelector).replaceWith(contentNode); // Reload customerSectionData and display cookie-messages if present window.dispatchEvent(new CustomEvent("reload-customer-section-data")); hyva.initMessages(); } hyva.activateScripts = (contentNode) => { // Extract all the script tags from the content. // Script tags won't execute when inserted into a dom-element directly, // therefore we need to inject them to the head of the document. const tmpScripts = contentNode.getElementsByTagName('script'); if (tmpScripts.length > 0) { // Push all script tags into an array // (to prevent dom manipulation while iterating over dom nodes) const scripts = []; for (let i = 0; i < tmpScripts.length; i++) { scripts.push(tmpScripts[i]); } // Iterate over all script tags and duplicate+inject each into the head for (let i = 0; i < scripts.length; i++) { let script = document.createElement('script'); script.innerHTML = scripts[i].innerHTML; document.head.appendChild(script); // Remove the original (non-executing) node from the content scripts[i].parentNode.removeChild(scripts[i]); } } return contentNode; } const replace = {['+']: '-', ['/']: '_', ['=']: ','}; hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); let currentTrap; const focusableElements = (rootElement) => { const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; return Array.from(rootElement.querySelectorAll(selector)) .filter(el => { return el.style.display !== 'none' && !el.disabled && el.tabIndex !== -1 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) }) } const focusTrap = (e) => { const isTabPressed = e.key === 'Tab' || e.keyCode === 9; if (!isTabPressed) return; const focusable = focusableElements(currentTrap) const firstFocusableElement = focusable[0] const lastFocusableElement = focusable[focusable.length - 1] e.shiftKey ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) }; hyva.releaseFocus = (rootElement) => { if (currentTrap && (!rootElement || rootElement === currentTrap)) { currentTrap.removeEventListener('keydown', focusTrap) currentTrap = null } } hyva.trapFocus = (rootElement) => { if (!rootElement) return; hyva.releaseFocus() currentTrap = rootElement rootElement.addEventListener('keydown', focusTrap) const firstElement = focusableElements(rootElement)[0] firstElement && firstElement.focus() } hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) }( window.hyva = window.hyva || {} )); </script> <script> if (!window.IntersectionObserver) { window.IntersectionObserver = function (callback) { this.observe = el => el && callback(this.takeRecords()); this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; this.disconnect = () => {}; this.unobserve = () => {}; } } </script> </head> <body id="html-body" class="checkout-cart-index page-layout-1column"> <input name="form_key" type="hidden" value="niMfAeAzjpeI3di3" /> <noscript> <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> <div class="container text-center"> <p> <strong>JavaScript seems to be disabled in your browser.</strong> <span> For the best experience on our site, be sure to turn on Javascript in your browser. </span> </p> </div> </section> </noscript> <script> document.body.addEventListener('touchstart', () => {}, {passive: true}) </script> <div class="page-wrapper"><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white contentarea" href="#contentarea"> <span> Skip to Content </span> </a> <script> function initHeader () { return { searchOpen: false, cart: {}, isCartOpen: false, getData(data) { if (data.cart) { this.cart = data.cart } }, isCartEmpty() { return !this.cart.summary_count }, toggleCart(event) { if (event.detail && event.detail.isOpen !== undefined) { this.isCartOpen = event.detail.isOpen if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { this.$refs.cartButton.focus() } } else { this.isCartOpen = true } } } } function initCompareHeader() { return { compareProducts: null, itemCount: 0, receiveCompareData(data) { if (data['compare-products']) { this.compareProducts = data['compare-products']; this.itemCount = this.compareProducts.count; } } } } </script> <div id="header" class="relative z-30 w-full border-b shadow bg-container-lighter border-container-lighter" x-data="initHeader()" @private-content-loaded.window="getData(event.detail.data)" > <div class="container flex flex-wrap lg:flex-nowrap items-center justify-between w-full px-6 py-3 mx-auto mt-0"> <!--Logo--> <div class="order-1 sm:order-2 lg:order-1 w-full pb-2 sm:w-auto sm:pb-0"> <a class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 no-underline hover:no-underline font-title" href="https://checkout-demo.hyva.io/onestep/" aria-label="Go to Home page" > <img src="https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US/images/logo.svg" alt="Store logo" width="189" height="64" loading="eager" /> </a> </div> <!--Main Navigation--> <nav x-data="initMenuMobile_67d7d70ac012c()" @load.window="setActiveMenu($root)" @keydown.window.escape="closeMenu()" class="z-20 order-2 sm:order-1 lg:order-2 navigation lg:hidden w-12 h-12" aria-label="Site navigation" role="navigation" > <!-- mobile --> <button x-ref="mobileMenuTrigger" @click="openMenu()" :class="{'overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}" type="button" aria-label="Open menu" aria-haspopup="menu" :aria-expanded="open" :hidden="open" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-3" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> </svg> </button> <div x-ref="mobileMenuNavLinks" class=" fixed top-0 right-0 w-full h-full p-1 hidden flex-col border-t border-container bg-container-lighter overflow-y-auto overflow-x-hidden " :class="{ 'flex': open, 'hidden': !open }" :aria-hidden="open ? 'false' : 'true'" role="dialog" aria-modal="true" > <ul class="border-t flex flex-col gap-y-1 mt-16" aria-label="Site navigation links" > <li data-child-id="category-node-20-main" class="level-0" > <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container level-0 " href="https://checkout-demo.hyva.io/onestep/women.html" title="Women" > Women </a> <button @click="openSubcategory('category-node-20')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer bg-container-lighter border-container" aria-label="Open Women subcategories" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-20'" > <div class="w-8 h-8 border rounded"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> </svg> </div> </button> </div> <div data-child-id="category-node-20" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 'hidden': mobilePanelActiveId !== 'category-node-20' }" > <ul class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-20', 'translate-x-0' : mobilePanelActiveId === 'category-node-20', }" aria-label="Subcategories" > <li> <button type="button" class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-20-main')" aria-label="Back to main categories" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> </svg> <span class="ml-4"> Women </span> </button> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/women.html" title="Women" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10"> View All </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/women/tops-women.html" title="Tops" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Tops </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/women/bottoms-women.html" title="Bottoms" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Bottoms </span> </a> </li> </ul> <button @click="closeMenu()" class="absolute flex justify-end w-16 self-end mb-1 transition-none" aria-label="Close menu" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </li> <li data-child-id="category-node-11-main" class="level-0" > <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container level-0 " href="https://checkout-demo.hyva.io/onestep/men.html" title="Men" > Men </a> <button @click="openSubcategory('category-node-11')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer bg-container-lighter border-container" aria-label="Open Men subcategories" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-11'" > <div class="w-8 h-8 border rounded"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> </svg> </div> </button> </div> <div data-child-id="category-node-11" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 'hidden': mobilePanelActiveId !== 'category-node-11' }" > <ul class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-11', 'translate-x-0' : mobilePanelActiveId === 'category-node-11', }" aria-label="Subcategories" > <li> <button type="button" class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-11-main')" aria-label="Back to main categories" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> </svg> <span class="ml-4"> Men </span> </button> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/men.html" title="Men" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10"> View All </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/men/tops-men.html" title="Tops" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Tops </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/men/bottoms-men.html" title="Bottoms" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Bottoms </span> </a> </li> </ul> <button @click="closeMenu()" class="absolute flex justify-end w-16 self-end mb-1 transition-none" aria-label="Close menu" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </li> <li data-child-id="category-node-3-main" class="level-0" > <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container level-0 " href="https://checkout-demo.hyva.io/onestep/gear.html" title="Gear" > Gear </a> <button @click="openSubcategory('category-node-3')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer bg-container-lighter border-container" aria-label="Open Gear subcategories" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-3'" > <div class="w-8 h-8 border rounded"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> </svg> </div> </button> </div> <div data-child-id="category-node-3" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 'hidden': mobilePanelActiveId !== 'category-node-3' }" > <ul class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-3', 'translate-x-0' : mobilePanelActiveId === 'category-node-3', }" aria-label="Subcategories" > <li> <button type="button" class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-3-main')" aria-label="Back to main categories" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> </svg> <span class="ml-4"> Gear </span> </button> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear.html" title="Gear" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10"> View All </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear/bags.html" title="Bags" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Bags </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear/fitness-equipment.html" title="Fitness Equipment" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Fitness Equipment </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear/watches.html" title="Watches" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Watches </span> </a> </li> </ul> <button @click="closeMenu()" class="absolute flex justify-end w-16 self-end mb-1 transition-none" aria-label="Close menu" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </li> <li data-child-id="category-node-9-main" class="level-0" > <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : mobilePanelActiveId, 'translate-x-0' : !mobilePanelActiveId }" > <a class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container level-0 " href="https://checkout-demo.hyva.io/onestep/training.html" title="Training" > Training </a> <button @click="openSubcategory('category-node-9')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-8 cursor-pointer bg-container-lighter border-container" aria-label="Open Training subcategories" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-9'" > <div class="w-8 h-8 border rounded"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> </svg> </div> </button> </div> <div data-child-id="category-node-9" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 'hidden': mobilePanelActiveId !== 'category-node-9' }" > <ul class="mt-16 transition-transform duration-200 ease-in-out translate-x-full transform" :class="{ 'translate-x-full' : mobilePanelActiveId !== 'category-node-9', 'translate-x-0' : mobilePanelActiveId === 'category-node-9', }" aria-label="Subcategories" > <li> <button type="button" class="flex items-center px-8 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-9-main')" aria-label="Back to main categories" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> </svg> <span class="ml-4"> Training </span> </button> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/training.html" title="Training" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10"> View All </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/training/training-video.html" title="Video Download" class="flex items-center w-full px-8 py-4 border-b cursor-pointer bg-container-lighter border-container " > <span class="ml-10 text-base text-gray-700"> Video Download </span> </a> </li> </ul> <button @click="closeMenu()" class="absolute flex justify-end w-16 self-end mb-1 transition-none" aria-label="Close menu" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </li> </ul> <button @click="closeMenu()" class="absolute flex justify-end w-16 self-end mb-1" aria-label="Close menu" type="button" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-4" width="64" height="64" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </nav> <script> 'use strict'; const initMenuMobile_67d7d70ac012c = () => { return { mobilePanelActiveId: null, open: false, setActiveMenu(menuNode) { Array.from(menuNode.querySelectorAll('a')).filter(link => { return link.href === window.location.href.split('?')[0]; }).map(item => { item.classList.add('underline'); item.closest('li.level-0') && item.closest('li.level-0').querySelector('a.level-0').classList.add('underline'); }); }, openMenu() { this.open = true this.$nextTick(() => hyva.trapFocus(this.$refs['mobileMenuNavLinks'])); // Prevent from body scrolling while mobile menu opened document.body.style.overflow = 'hidden'; }, closeMenu() { document.body.style.overflow = ''; if (this.open) { this.$nextTick(() => this.$refs['mobileMenuTrigger'].focus() || hyva.releaseFocus()); } this.open = false this.mobilePanelActiveId = null }, openSubcategory(index) { const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') this.mobilePanelActiveId = this.mobilePanelActiveId === index ? 0 : index this.$nextTick(() => hyva.trapFocus(menuNodeRef)) }, backToMainCategories(index) { const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') this.mobilePanelActiveId = 0 this.$nextTick(() => { hyva.trapFocus(this.$refs['mobileMenuNavLinks']) menuNodeRef.querySelector('a').focus() }) } } } </script> <div x-data="initMenuDesktop_67d7d70ac3884()" class="z-20 order-2 sm:order-1 lg:order-2 navigation hidden lg:flex" > <!-- desktop --> <div x-ref="nav-desktop" @load.window="setActiveMenu($root)" class="hidden lg:block lg:px-8"> <nav class="relative" aria-label="Main menu" > <ul class="flex justify-start flex-wrap gap-x-7 py-4"> <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" @mouseenter="hoverPanelActiveId = 'category-node-20'" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0" > <span class="flex items-center text-md"> <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" href="https://checkout-demo.hyva.io/onestep/women.html" title="Women" @focus="hoverPanelActiveId = 0" > Women </a> <button type="button" data-sr-button-id="category-node-20" :aria-expanded="hoverPanelActiveId === 'category-node-20' ? 'true' : 'false'" @click="openMenuOnClick('category-node-20')" class="rounded p-1 text-gray-500" > <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> </svg> <span class="sr-only"> Show submenu for Women category </span> </button> </span> <ul class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-20', 'block' : hoverPanelActiveId === 'category-node-20' }" > <li> <a href="https://checkout-demo.hyva.io/onestep/women/tops-women.html" title="Tops" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D20]').focus())" > <span class="text-base text-gray-700"> Tops </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/women/bottoms-women.html" title="Bottoms" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D20]').focus())" > <span class="text-base text-gray-700"> Bottoms </span> </a> </li> </ul> </li> <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" @mouseenter="hoverPanelActiveId = 'category-node-11'" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0" > <span class="flex items-center text-md"> <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" href="https://checkout-demo.hyva.io/onestep/men.html" title="Men" @focus="hoverPanelActiveId = 0" > Men </a> <button type="button" data-sr-button-id="category-node-11" :aria-expanded="hoverPanelActiveId === 'category-node-11' ? 'true' : 'false'" @click="openMenuOnClick('category-node-11')" class="rounded p-1 text-gray-500" > <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> </svg> <span class="sr-only"> Show submenu for Men category </span> </button> </span> <ul class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-11', 'block' : hoverPanelActiveId === 'category-node-11' }" > <li> <a href="https://checkout-demo.hyva.io/onestep/men/tops-men.html" title="Tops" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D11]').focus())" > <span class="text-base text-gray-700"> Tops </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/men/bottoms-men.html" title="Bottoms" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D11]').focus())" > <span class="text-base text-gray-700"> Bottoms </span> </a> </li> </ul> </li> <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" @mouseenter="hoverPanelActiveId = 'category-node-3'" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0" > <span class="flex items-center text-md"> <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" href="https://checkout-demo.hyva.io/onestep/gear.html" title="Gear" @focus="hoverPanelActiveId = 0" > Gear </a> <button type="button" data-sr-button-id="category-node-3" :aria-expanded="hoverPanelActiveId === 'category-node-3' ? 'true' : 'false'" @click="openMenuOnClick('category-node-3')" class="rounded p-1 text-gray-500" > <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> </svg> <span class="sr-only"> Show submenu for Gear category </span> </button> </span> <ul class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-3', 'block' : hoverPanelActiveId === 'category-node-3' }" > <li> <a href="https://checkout-demo.hyva.io/onestep/gear/bags.html" title="Bags" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" > <span class="text-base text-gray-700"> Bags </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear/fitness-equipment.html" title="Fitness Equipment" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" > <span class="text-base text-gray-700"> Fitness Equipment </span> </a> </li> <li> <a href="https://checkout-demo.hyva.io/onestep/gear/watches.html" title="Watches" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" > <span class="text-base text-gray-700"> Watches </span> </a> </li> </ul> </li> <li class="relative level-0 border-b-2 border-transparent hover:border-primary data-[active]:border-primary" @mouseenter="hoverPanelActiveId = 'category-node-9'" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0" > <span class="flex items-center text-md"> <a class="w-full text-base text-gray-700 level-0 py-2 px-0.5" href="https://checkout-demo.hyva.io/onestep/training.html" title="Training" @focus="hoverPanelActiveId = 0" > Training </a> <button type="button" data-sr-button-id="category-node-9" :aria-expanded="hoverPanelActiveId === 'category-node-9' ? 'true' : 'false'" @click="openMenuOnClick('category-node-9')" class="rounded p-1 text-gray-500" > <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> </svg> <span class="sr-only"> Show submenu for Training category </span> </button> </span> <ul class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" :class="{ 'hidden' : hoverPanelActiveId !== 'category-node-9', 'block' : hoverPanelActiveId === 'category-node-9' }" > <li> <a href="https://checkout-demo.hyva.io/onestep/training/training-video.html" title="Video Download" class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" > <span class="text-base text-gray-700"> Video Download </span> </a> </li> </ul> </li> </ul> </nav> </div> </div> <script> 'use strict'; const initMenuDesktop_67d7d70ac3884 = () => { return { hoverPanelActiveId: null, setActiveMenu(menuNode) { Array.from(menuNode.querySelectorAll('a')).filter(link => { return link.href === window.location.href.split('?')[0]; }).map(item => { item.setAttribute('aria-current', 'page'); item.closest('li.level-0').setAttribute('data-active', 'true'); }); }, openMenuOnClick(menuNode) { if (menuNode === this.hoverPanelActiveId) { this.hoverPanelActiveId = 0; } else { this.hoverPanelActiveId = menuNode } } } } </script> <div class="flex items-center gap-2 md:gap-1 order-3 md:-mr-1"> <!--Compare Icon--> <a id="compare-link" class="relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2 invisible" :class="{ 'invisible': !(itemCount > 0) }" href="https://checkout-demo.hyva.io/onestep/catalog/product_compare/index/" title="Compare Products" x-data="initCompareHeader()" @private-content-loaded.window="receiveCompareData($event.detail.data)" :aria-label="` Compare Products, ${itemCount > 1 ? hyva.str('\u00251\u0020Items', itemCount) : hyva.str('\u00251\u0020Item', itemCount) }`" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/> </svg> <span x-text="itemCount" class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-yellow-500 text-white text-xs font-semibold leading-none text-center uppercase tabular-nums" aria-hidden="true" ></span> </a> <!--Search Icon--> <button id="menu-search-icon" class="rounded p-1 hover:bg-primary/10 outline-offset-2" @click.prevent=" searchOpen = !searchOpen; $dispatch('search-open'); " aria-label="Toggle search form" aria-haspopup="true" :aria-expanded="searchOpen" x-ref="searchButton" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> </svg> </button> <!-- Additional Header Elements --> <!--Customer Icon & Dropdown--> <div class="relative inline-block" x-data="{ open: false }" @keyup.escape="open = false" @click.outside="open = false" > <button type="button" id="customer-menu" class="block rounded p-1 hover:bg-primary/10 outline-offset-2" @click="open = !open" :aria-expanded="open ? 'true' : 'false'" aria-label="My Account" aria-haspopup="true" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/> </svg> </button> <nav class=" absolute right-0 z-20 w-40 py-2 mt-2 -mr-4 px-1 overflow-auto origin-top-right rounded-sm shadow-lg sm:w-48 lg:mt-3 bg-container-lighter " x-cloak x-show="open" aria-labelledby="customer-menu" > <a id="customer.header.sign.in.link" class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" onclick="hyva.setCookie && hyva.setCookie( 'login_redirect', window.location.href, 1 )" href="https://checkout-demo.hyva.io/onestep/customer/account/index/" title="Sign In" > Sign In</a> <a id="customer.header.register.link" class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" href="https://checkout-demo.hyva.io/onestep/customer/account/create/" title="Create an Account" > Create an Account </a> </nav> </div> <!--Cart Icon--> <button id="menu-cart-icon" class="relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2" x-ref="cartButton" :aria-disabled="isCartEmpty()" :aria-label="` Toggle minicart, ${isCartEmpty() ? 'Cart is empty' : cart.summary_count > 1 ? hyva.str('%1 items', cart.summary_count) : hyva.str('%1 item', cart.summary_count) }`" @click.prevent="() => { $dispatch('toggle-cart', { isOpen: true }) }" @toggle-cart.window="toggleCart($event)" :aria-expanded="isCartOpen" aria-haspopup="dialog" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/> </svg> <span x-text="cart.summary_count" x-show="!isCartEmpty()" x-cloak class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-primary text-white text-xs font-semibold leading-none text-center uppercase tabular-nums" aria-hidden="true" ></span> </button> </div> </div> <!--Search--> <div class="absolute z-10 w-full border-t shadow-sm bg-container-lighter border-container-lighter" id="search-content" x-cloak x-show="searchOpen" @click.outside="searchOpen = false" @keydown.escape=" searchOpen = false; $refs.searchButton.focus(); " > <script> 'use strict'; function initMiniSearch() { return { minSearchLength: 3, suggestions: [], suggest() { const search = this.$refs.searchInput; if (search.value.length >= this.minSearchLength) { search.setCustomValidity(''); search.reportValidity(); this.fetchSuggestions(search.value); } else { this.suggestions = []; } }, fetchSuggestions(term) { fetch( window.BASE_URL + 'search/ajax/suggest?' + new URLSearchParams({q: term}), { headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => this.suggestions = result); }, search(term) { const search = this.$refs.searchInput; term = term || search.value; if (term.length < this.minSearchLength) { search.setCustomValidity('Minimum\u0020Search\u0020query\u0020length\u0020is\u00203'); search.reportValidity(); } else { search.setCustomValidity(''); search.value = term; this.$refs.form.submit(); } }, focusElement(element) { if (element && element.nodeName === "DIV") { element.focus(); return true; } else { return false; } } } } </script> <div class="container py-2 mx-auto text-black" x-data="initMiniSearch()"> <form class="form minisearch" id="search_mini_form" x-ref="form" @submit.prevent="search()" action="https://checkout-demo.hyva.io/onestep/catalogsearch/result/" method="get" role="search"> <label class="hidden" for="search" data-role="minisearch-label"> <span>Search</span> </label> <input id="search" x-ref="searchInput" type="search" autocomplete="off" name="q" value="" placeholder="Search entire store here..." maxlength="128" class="w-full p-2 text-lg leading-normal transition appearance-none text-grey-800 focus:outline-none focus:border-transparent lg:text-xl" @search-open.window.debounce.10=" $el.focus() $el.select() " @focus.once="suggest" @input.debounce.300="suggest" @keydown.arrow-down.prevent="focusElement($root.querySelector('[tabindex]'))" /> <template x-if="suggestions.length > 0"> <div class="w-full leading-normal transition appearance-none text-grey-800 flex flex-col mt-1"> <template x-for="suggestion in suggestions"> <div class="flex justify-between p-2 bg-container-lighter even:bg-container mb-1 cursor-pointer border border-container hover:bg-container-darker" tabindex="0" @click="search(suggestion.title)" @keydown.enter="search(suggestion.title)" @keydown.arrow-up.prevent=" focusElement($event.target.previousElementSibling) || $refs.searchInput.focus() " @keydown.arrow-down.prevent="focusElement($event.target.nextElementSibling)" > <span x-text="suggestion.title"></span> <span x-text="suggestion.num_results"></span> </div> </template> </div> </template> <button type="submit" title="Search" class="action search sr-only" aria-label="Search" > Search </button> </form> </div> </div> <!--Cart Drawer--> <script> function initCartDrawer() { return { open: false, isLoading: false, cart: {}, maxItemsToDisplay: 20, itemsCount: 0, getData(data) { if (data.cart) { this.cart = data.cart; this.itemsCount = data.cart.items && data.cart.items.length || 0; this.setCartItems(); } this.isLoading = false; }, cartItems: [], getItemCountTitle() { return hyva.strf('\u00250\u0020of\u0020\u00251\u0020products\u0020in\u0020cart\u0020displayed', this.maxItemsToDisplay, this.itemsCount) }, setCartItems() { this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; if (this.maxItemsToDisplay > 0) { this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); } }, deleteItemFromCart(itemId) { this.isLoading = true; const itemData = this.cart.items.filter((item) => item['item_id'] === itemId); const formKey = hyva.getFormKey(); const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; fetch(postUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key=" + formKey + "&item_id=" + itemId, "method": "POST", "mode": "cors", "credentials": "include" }).then(response => { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { window.dispatchMessages && window.dispatchMessages([{ type: 'warning', text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' }]); this.isLoading = false; } }).then(result => { window.dispatchMessages && window.dispatchMessages([{ type: result.success ? 'success' : 'error', text: result.success ? 'You\u0020removed\u0020the\u0020item.' : result.error_message }], result.success ? 5000 : 0); if (result.success && itemData) { window.dispatchEvent(new CustomEvent('cart-item-removed', { detail: itemData })); } window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }); }, scrollLock(use = true) { document.body.style.overflow = use ? "hidden" : ""; }, toggleCartDrawer(event) { if (event.detail && event.detail.isOpen !== undefined) { if (event.detail.isOpen) { this.openCartDrawer(); } else { this.open = false; this.scrollLock(false); this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent); } } else { this.openCartDrawer() } }, openCartDrawer() { this.open = true; this.scrollLock(true); this.$nextTick(() => { this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent) }) }, closeCartDrawer() { this.$dispatch('toggle-cart', { isOpen: false }) }, getSectionDataExtraActions() { if (!this.cart.extra_actions) { return ''; } const contentNode = document.createElement('div'); contentNode.innerHTML = this.cart.extra_actions; hyva.activateScripts(contentNode); return contentNode.innerHTML; } } } </script> <section x-cloak x-show="cart" id="cart-drawer" x-data="initCartDrawer()" @private-content-loaded.window="getData($event.detail.data)" @toggle-cart.window="toggleCartDrawer($event)" @keydown.escape="closeCartDrawer" > <div role="dialog" aria-labelledby="cart-drawer-title" aria-modal="true" :aria-hidden="!open" class="fixed inset-y-0 right-0 z-30 flex max-w-full"> <div class="backdrop" x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" role="button" @click="closeCartDrawer" aria-label="Close minicart"></div> <div class="relative w-screen max-w-md shadow-2xl" x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" x-ref="cartDialogContent" role="region" :tabindex="open ? 0 : -1" aria-label="My Cart" > <div class="flex flex-col h-full max-h-screen bg-white shadow-xl"> <header class="relative px-4 py-6 sm:px-6"> <p id="cart-drawer-title" class="text-lg font-medium leading-7 text-gray-900"> <strong>My Cart</strong> <span class="items-total text-xs" x-show="maxItemsToDisplay && maxItemsToDisplay < itemsCount" x-text="getItemCountTitle()"> </span> </p> </header> <template x-if="!itemsCount"> <div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container"> Cart is empty </div> </template> <template x-if="itemsCount"> <div class="relative grid gap-6 sm:gap-8 px-1 py-3 sm:px-3 bg-white border-b border-container overflow-y-auto overscroll-y-contain"> <template x-for="item in cartItems"> <div class="flex items-start p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> <template x-if="item.product_has_url && item.is_visible_in_site_visibility"> <a :href="item.product_url" class="w-1/4 !ml-0" :aria-label="hyva.strf('Product\u0020\u0022\u00250\u0022', item.product_name)" > <img :src="item.product_image.src" :width="item.product_image.width" :height="item.product_image.height" loading="lazy" :alt="item.product_name" /> </a> </template> <template x-if="!item.product_has_url || !item.is_visible_in_site_visibility"> <div class="w-1/4 !ml-0"> <img :src="item.product_image.src" :width="item.product_image.width" :height="item.product_image.height" loading="lazy" :alt="item.product_name" /> </div> </template> <div class="w-3/4 space-y-2"> <div> <p class="text-xl"> <span x-html="item.qty"></span> x <span x-html="item.product_name"></span> </p> <p class="text-sm"><span x-html="item.product_sku"></span></p> </div> <template x-for="option in item.options"> <div class="pt-2"> <p class="font-semibold" x-text="option.label + ':'"></p> <p class="text-secondary" x-html="option.value"></p> </div> </template> <p><span x-html="item.product_price"></span></p> <div class="pt-4"> <a :href="item.configure_url" x-show="item.product_type !== 'grouped' && item.is_visible_in_site_visibility" class="inline-flex p-2 mr-2 btn btn-primary" :aria-label="hyva.strf('Edit\u0020product\u0020\u0022\u00250\u0022', item.product_name)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"/> </svg> </a> <button type="button" class="inline-flex p-2 btn btn-primary" @click="deleteItemFromCart(item.item_id)" :aria-label="hyva.strf('Remove\u0020product\u0020\u0022\u00250\u0022\u0020from\u0020cart', item.product_name)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/> </svg> </button> </div> </div> </div> </template> </div> </template> <template x-if="itemsCount"> <div> <div class="relative grid gap-6 sm:gap-8 py-3 px-1 sm:px-3 bg-white"> <div class="w-full p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> <p>Subtotal: <span x-html="cart.subtotal"></span></p> </div> <div class="w-full p-3 space-x-4 transition duration-150 ease-in-out rounded-lg hover:bg-gray-100"> <a @click.prevent.stop="closeCartDrawer; $dispatch('toggle-authentication', {url: 'https://checkout-demo.hyva.io/onestep/checkout/'});" href="https://checkout-demo.hyva.io/onestep/checkout/" class="inline-flex btn btn-primary" > Checkout </a> <span>or</span> <a href="https://checkout-demo.hyva.io/onestep/checkout/cart/" class="underline" > View and Edit Cart </a> </div> <div x-html="getSectionDataExtraActions()"></div> </div> </div> </template> </div> <button type="button" @click="closeCartDrawer" aria-label="Close minicart" class="absolute top-0 right-2 p-4 mt-2 text-gray-300 transition-colors hover:text-black" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> <div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-cloak x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" width="57" height="57" fill="none" stroke="currentColor" stroke-width="2" class="text-primary" role="img"> <style> @keyframes spinner-ball-triangle1 { 0% { transform: translate(0%, 0%); } 33% { transform: translate(38%, -79%); } 66% { transform: translate(77%, 0%); } 100% { transform: translate(0%, 0%); } } @keyframes spinner-ball-triangle2 { 0% { transform: translate(0%, 0%); } 33% { transform: translate(38%, 79%); } 66% { transform: translate(-38%, 79%); } 100% { transform: translate(0%, 0%); } } @keyframes spinner-ball-triangle3 { 0% { transform: translate(0%, 0%); } 33% { transform: translate(-77%, 0%); } 66% { transform: translate(-38%, -79%); } 100% { transform: translate(0%, 0%); } } </style> <circle cx="5" cy="50" r="5" style="animation: spinner-ball-triangle1 2.2s linear infinite"/> <circle cx="27" cy="5" r="5" style="animation: spinner-ball-triangle2 2.2s linear infinite"/> <circle cx="49" cy="50" r="5" style="animation: spinner-ball-triangle3 2.2s linear infinite"/> <title>loader</title></svg> <div class="ml-10 text-primary text-xl"> Loading... </div> </div> </div> </section> <!--Authentication Pop-Up--> <script> function initAuthentication() { return { open: false, forceAuthentication: false, checkoutUrl: 'https://checkout-demo.hyva.io/onestep/checkout/index/', errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages: function setErrorMessages(messages) { this.errorMessages = [messages]; this.displayErrorMessage = this.errorMessages.length; }, submitForm: function () { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#login-form'); if (this.errors === 0) { this.dispatchLoginRequest($form); } }, onPrivateContentLoaded: function (data) { const isLoggedIn = data.customer && data.customer.firstname; if (data.cart && !isLoggedIn) { this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; } }, redirectIfAuthenticated: function (event) { if (event.detail && event.detail.url) { this.checkoutUrl = event.detail.url; } if (!this.forceAuthentication) { window.location.href = this.checkoutUrl; } }, dispatchLoginRequest: function(form) { this.isLoading = true; const username = this.$refs['customer-email'].value; const password = this.$refs['customer-password'].value; const formKey = hyva.getFormKey(); const bodyFields = { 'username': username, 'password': password, 'formKey': formKey }; const fieldName = 'g\u002Drecaptcha\u002Dresponse'; const recaptchaField = fieldName && form[fieldName]; if (recaptchaField) { bodyFields[fieldName] = recaptchaField.value; } fetch('https://checkout-demo.hyva.io/onestep/customer/ajax/login/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify(bodyFields) } ).then(response => { return response.json() } ).then(data=> { this.isLoading = false; if (data.errors) { this.setErrorMessages(data.message); this.errors = 1; this.hasCaptchaToken = 0; } else { window.location.href = this.checkoutUrl; } }); } } } </script> <section id="authentication-popup" x-data="initAuthentication()" @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" @keydown.window.escape="open = false" > <div class="backdrop" aria-hidden="true" x-cloak x-show="open" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" @click="open = false" ></div> <div role="dialog" aria-modal="true" @click.outside="open = false" class="inset-y-0 right-0 z-30 flex max-w-full fixed" x-cloak x-show="open" > <div class="relative w-screen max-w-md pt-16 bg-container-lighter" x-show="open" x-cloak="" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0" x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full" > <div x-show="open" x-cloak="" x-transition:enter="ease-in-out duration-500" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in-out duration-500" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute top-0 right-2 flex p-2 mt-2"> <button type="button" @click="open = false;" aria-label="Close panel" class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>Close panel</title></svg> </button> </div> <template x-if="open"> <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> <div class="mx-4"> <div class="message error mb-0" x-show="errors" x-cloak> <template x-for="(message, index) in errorMessages" :key="index"> <div> <template x-if="message"> <span x-html="message"></span> </template> </div> </template> </div> </div> <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> <strong class="font-medium">Checkout using your account</strong> </p> <form class="form form-login" method="post" @submit.prevent="submitForm();" id="login-form" > <div class="fieldset login"> <div class="field email required"> <label class="label" for="form-login-username" form="login-form" > <span>Email Address</span> </label> <div class="control"> <input name="username" id="form-login-username" x-ref="customer-email" @change="errors = 0" type="email" required autocomplete="off" class="form-input input-text" > </div> </div> <div class="field password required"> <label for="form-login-password" class="label" form="login-form"> <span>Password</span> </label> <div class="control"> <input name="password" id="form-login-password" type="password" class="form-input input-text" required x-ref="customer-password" autocomplete="off" @change="errors = 0" > </div> </div> <input name="context" type="hidden" value="checkout" /> <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" > Sign In </button> <a href="https://checkout-demo.hyva.io/onestep/customer/account/forgotpassword/" > Forgot Your Password? </a> </div> </div> </form> </div> <div class="mx-4"> </div> <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> <strong class="font-medium">Checkout as a new customer</strong> </p> <div class="block-content"> <p class="mb-1"> Creating an account has many benefits: </p> <ul class="list-disc pl-5"> <li> See order and shipping status</li> <li> Track order history</li> <li> Check out faster</li> </ul> <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> <a href="https://checkout-demo.hyva.io/onestep/customer/account/create/" class="inline-flex btn btn-primary"> Create an Account </a> </div> </div> </div> </div> </template> </div> </div> </section> </div> </header><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> <div class="page messages"><script> function initMessages() { "use strict"; return { messages: window.mageMessages || [], isEmpty() { return this.messages.reduce( function (isEmpty, message) { return isEmpty && message === undefined }, true ) }, removeMessage(messageIndex) { this.messages[messageIndex] = undefined; }, addMessages(messages, hideAfter) { messages.map((message) => { this.messages = this.messages.concat(message); if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { hideAfter = window.defaultSuccessMessageTimeout; } if (hideAfter) { this.setHideTimeOut(this.messages.length -1, hideAfter); } }); }, setHideTimeOut(messageIndex, hideAfter) { setTimeout((messageIndex) => { this.removeMessage(messageIndex); }, hideAfter, messageIndex); }, eventListeners: { ['@messages-loaded.window'](event) { this.addMessages(event.detail.messages, event.detail.hideAfter) }, ['@private-content-loaded.window'](event) { const data = event.detail.data; if ( data.messages && data.messages.messages && data.messages.messages.length ) { this.addMessages(data.messages.messages); } }, ['@clear-messages.window']() { this.messages = []; } } } } </script> <section id="messages" x-data="initMessages()" x-bind="eventListeners" aria-live="assertive" role="alert" > <template x-if="!isEmpty()"> <div class="w-full"> <div class="messages container mx-auto py-3"> <template x-for="(message, index) in messages" :key="index"> <div> <template x-if="message"> <div class="message" :class="message.type" :ui-id="'message-' + message.type" > <span x-html="message.text"></span> <button type="button" class="text-gray-600 hover:text-black" aria-label="Close message" @click.prevent="removeMessage(index)" > <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> </svg> </button> </div> </template> </div> </template> </div> </div> </template> </section> </div><div class="container flex flex-col md:flex-row flex-wrap my-6 font-bold lg:mt-8 text-3xl"> <h1 class="text-gray-900 page-title title-font" > <span class="base" data-ui-id="page-title-wrapper" >Shopping Cart</span> </h1> </div> <div class="columns"><div class="column main"> <script> window.checkoutConfig = false; window.customerData = window.checkoutConfig.customerData; window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn; </script> <script> 'use strict'; (function( hyva, undefined ) { let controller = new AbortController(); /** * Takes a form element and submits it through fetch, * then replaces the result into the document without * refreshing the page */ hyva.postCart = (form) => { if (!form.action) { return; } controller.abort(); controller = new AbortController(); const action = form.action; const formData = new FormData(form); if (!formData.uenc) { formData.append('uenc', hyva.getUenc()); } formData.append('form_key', hyva.getFormKey()); window.fetch(action, { method: 'POST', body: formData, signal: controller.signal }).then((result) => { return result.text() }).then((content) => { hyva.replaceDomElement('#maincontent', content) }).catch((error) => { if (error.name !== 'AbortError') { console.error(error); typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "error", text: "Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again." }], 10000 ); } }) } }( window.hyva = window.hyva || {} )); </script> <script> function initCartForm(){ return { cartIsEmpty: !!window.checkoutConfig, checkCartShouldUpdate(data) { const cart = data.cart; if (this.cartIsEmpty !== !!window.checkoutConfig) { this.cartIsEmpty = !!window.checkoutConfig; this.reloadCartContent(); return; } if (cart && cart.items) { if (!window.checkoutConfig) { if (cart.items.length) { this.reloadCartContent(); } return; } if (window.checkoutConfig) { const roundUp = (number) => Math.round(number * 100); const decimalNumbersAreEqual = (number1, number2) => roundUp(number1) === roundUp(number2); if (decimalNumbersAreEqual( cart.items.reduce((totalQty, cartItem) => totalQty + cartItem.qty, 0), window.checkoutConfig.quoteData.items_qty ) && decimalNumbersAreEqual( cart.subtotalAmount, window.checkoutConfig.totalsData.total_segments.find((segment) => segment.code === "subtotal").value ) ) { return; } } } this.reloadCartContent(); }, reloadCartContent() { window.fetch(window.location.href, { method: "GET" }).then((result) => { return result.text() }).then((body) => { hyva.setCookie('mage-cache-sessid', '', -1, true); window.checkoutConfig = null; hyva.replaceDomElement('#maincontent', body) }).catch((error) => { console.error(error); window.location.reload() }) }, onStorageChange(event) { if (event.key === 'private_content_version') { window.dispatchEvent(new CustomEvent("reload-customer-section-data")); } } } } </script> <div x-data="initCartForm()" class="cart-form clearfix" @private-content-loaded.window="checkCartShouldUpdate($event.detail.data)" @storage.window="onStorageChange($event)" > <div class="cart-empty"> <p>You have no items in your shopping cart.</p> <p>Click <a href="https://checkout-demo.hyva.io/onestep/">here</a> to continue shopping. </p> </div> </div> </div></div></main><footer class="page-footer"><div class="footer content"><div class="text-gray-700 body-font bg-container-darker border-t border-container-darker shadow pb-16"> <div class="container py-8 mx-auto"> <div class="flex flex-wrap order-first gap-y-16"> <div class="md:w-1/2 w-full flex flex-wrap pr-4"> <div class="w-full grid grid-cols-1 sm:grid-cols-2 gap-8 xl:col-span-2"> <div> <h2 class="text-md leading-5 font-semibold tracking-wider uppercase"> Company </h2> <ul class="mt-4"> <li> <a href="#" class="text-base leading-6"> About </a> </li> <li class="mt-4"> <a href="https://checkout-demo.hyva.io/onestep/customer/account/" class="text-base leading-6"> My Account </a> </li> <li class="mt-4"> <a href="https://checkout-demo.hyva.io/onestep/sales/guest/form/" class="text-base leading-6"> Orders and Returns </a> </li> <li class="mt-4"> <a href="https://checkout-demo.hyva.io/onestep/search/term/popular/" class="text-base leading-6"> Search Terms </a> </li> <li class="mt-4"> <a href="https://checkout-demo.hyva.io/onestep/contact/" class="text-base leading-6"> Contact </a> </li> </ul> </div> <div> <h2 class="text-md leading-5 font-semibold tracking-wider uppercase"> Legal </h2> <ul class="mt-4"> <li class="mt-4"> <a href="#" class="text-base leading-6"> Privacy </a> </li> <li class="mt-4"> <a href="#" class="text-base leading-6"> Terms and Conditions </a> </li> </ul> </div> </div> </div> <div class="flex flex-wrap gap-8 pr-4 w-full lg:w-1/4 md:w-1/2"> <div x-data="{ open: false }" class="w-full sm:w-1/2 md:w-full" > <div class="title-font font-medium text-gray-900 tracking-widest text-sm mb-3 uppercase"> Select Store </div> <div class="relative inline-block text-left"> <div> <button @click.prevent="open = !open" @click.outside="open = false" @keydown.window.escape="open=false" type="button" class="inline-flex justify-center w-full form-select px-4 py-2 bg-white focus:outline-none" aria-haspopup="true" aria-expanded="true" > OneStep Demo Store <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5 -mr-1 ml-2" width="25" height="25" role="img"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> <title>chevron-down</title></svg> </button> </div> <nav x-cloak="" x-show="open" class="absolute right-0 top-full z-20 w-56 py-2 mt-1 overflow-auto origin-top-left rounded-sm shadow-lg sm:w-48 lg:mt-3 bg-container-lighter"> <div class="my-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <a href="https://checkout-demo.hyva.io/onestep/stores/store/redirect/___store/twostep/___from_store/onestep/uenc/aHR0cHM6Ly9jaGVja291dC1kZW1vLmh5dmEuaW8vdHdvc3RlcC9jaGVja291dC9jYXJ0Lw%2C%2C/" class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" > TwoStep Demo Store </a> </div> </nav> </div> </div> </div> <div class="pr-4 lg:w-1/4 md:w-1/2"> <form class="form subscribe" action="https://checkout-demo.hyva.io/onestep/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm()" id="newsletter-validate-detail" aria-label="Subscribe to Newsletter" > <h2 class="mb-3 text-sm font-medium tracking-widest text-gray-900 uppercase title-font" id="footer-newsletter-heading" > Newsletter </h2> <div class="flex flex-wrap justify-center gap-2 md:justify-start"> <label for="newsletter-subscribe" class="sr-only"> Email Address </label> <input name="email" type="email" required id="newsletter-subscribe" class="form-input inline-flex w-full" placeholder="Enter your email address" aria-describedby="footer-newsletter-heading" > <input name="form_key" type="hidden" value="niMfAeAzjpeI3di3" /> <button class="inline-flex shrink-0 ml-auto xl:mt-0 btn btn-primary"> Subscribe </button> </div> <div> <template x-if="displayErrorMessage"> <p class="flex items-center text-red"> <span class="inline-block w-8 h-8 mr-3"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> <title>exclamation-circle</title></svg> </span> <template x-for="errorMessage in errorMessages"> <span x-html="errorMessage"></span> </template> </p> </template> </div> </form> <div class="w-full"> </div> <script> function initNewsletterForm() { return { errors: 0, hasCaptchaToken: 0, displayErrorMessage: false, errorMessages: [], setErrorMessages(messages) { this.errorMessages = [messages] this.displayErrorMessage = this.errorMessages.length }, submitForm() { // Do not rename $form, the variable is expected to be declared in the recaptcha output const $form = document.querySelector('#newsletter-validate-detail'); if (this.errors === 0) { $form.submit(); } } } } </script> </div> </div> </div> <div class="bg-container border-t border-b border-container"> <div class="container py-6 mx-auto flex items-center sm:flex-row flex-col"> <a href="https://hyva.io" class="flex title-font font-medium items-center md:justify-start justify-center text-gray-900"> <span class="ml-3 text-xl">Hyvä Themes</span> </a> <p> <small class="text-sm text-gray-800 sm:ml-6 sm:mt-0 mt-4"> © 2020 Hyva Themes B.V. — <a href="https://twitter.com/hyva_io" target="_blank" rel="noopener noreferrer" class="text-gray-700 ml-1" aria-label="Hyva twitter profile, opens in new window" >@hyva_io</a> </small> </p> </div> </div> </div> </div><div class="widget block block-static-block"> <div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script> // Check if x-defer is implemented in page to make it future-update proof // This is not bullet proof, but a good indication your theme has been updated to 1.3.7 or newer if (! document.querySelector('[x-defer]') ) { const deferSelectors = { ".product-slider section[x-data]": "intersect", ".product-info [x-data]": "intersect", "#filters-content [x-data]": "intersect", "#review_form": "intersect", "section[x-data^=initRecentlyViewedProductsComponent]": "intersect", "div[x-data^=initBundleOptions]": "intersect", "#product_addtocart_form [x-data]": "intersect", "#notice-cookie-block": "interact" } for (const [selector, deferUntil] of Object.entries(deferSelectors)) { document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); } (function () { "use strict"; const hasAlpine = new Promise(resolve => { window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); }); const hasInteract = new Promise(resolve => { (events => { const onInteract = () => { resolve(); events.forEach(type => window.removeEventListener(type, onInteract)); } events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) })(['touchstart', 'wheel', 'mouseover', 'keydown']) }); const onIntersect = (el) => { return new Promise(resolve => { const observer = new IntersectionObserver(entries => { for (const entry of entries) { if (entry.isIntersecting) { observer.disconnect() resolve(); } } }, {}); observer.observe(el); }); } function runComponent(el) { hasAlpine.then(() => { el.removeAttribute('x-ignore'); queueMicrotask(() => Alpine.initTree(el)); }); } function initDeferredComponents() { document.querySelectorAll('[x-data][x-defer]').forEach(el => { el.setAttribute('x-ignore', ''); const deferUntil = (el.getAttribute('x-defer') || '').trim(); switch (deferUntil) { case 'interact': hasInteract.then(() => runComponent(el)); break; case 'intersect': onIntersect(el).then(() => runComponent(el)) break; case 'idle': window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) break; case 'eager': runComponent(el); break; default: if (deferUntil.startsWith('event:') && deferUntil.length > 6) { window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); } } }); } window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); })() } </script></div></div> <div class="widget block block-static-block"> <div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script> if (HTMLScriptElement.supports && HTMLScriptElement.supports('speculationrules')) { const specScript = document.createElement('script'); specScript.type = 'speculationrules'; specRules = { "prerender": [{ "where": { "and": [ { "href_matches": "/*.html" }, { "not": {"selector_matches": ".do-not-prerender"}} ] }, "eagerness": "moderate" }] }; specScript.textContent = JSON.stringify(specRules); document.body.append(specScript); } </script></div></div> <div class="widget block block-static-block"> <div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script> if (HTMLScriptElement.supports && HTMLScriptElement.supports('speculationrules')) { const specScript = document.createElement('script'); specScript.type = 'speculationrules'; specRules = { "prerender": [{ "where": { "and": [ { "href_matches": "/*.html" }, { "not": {"selector_matches": ".do-not-prerender"}} ] }, "eagerness": "moderate" }] }; specScript.textContent = JSON.stringify(specRules); document.body.append(specScript); } </script></div></div> </footer> <script> (() => { function src_default(Alpine) { Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { let evaluate = evaluateLater(expression); let options = { rootMargin: getRootMargin(modifiers), threshold: getThreshold(modifiers) }; let observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting === (value === "leave")) return; evaluate(); modifiers.includes("once") && observer.disconnect(); }); }, options); observer.observe(el); cleanup(() => { observer.disconnect(); }); })); } function getThreshold(modifiers) { if (modifiers.includes("full")) return 0.99; if (modifiers.includes("half")) return 0.5; if (!modifiers.includes("threshold")) return 0; let threshold = modifiers[modifiers.indexOf("threshold") + 1]; if (threshold === "100") return 1; if (threshold === "0") return 0; return Number(`.${threshold}`); } function getLengthValue(rawValue) { let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); return match ? match[1] + (match[2] || "px") : void 0; } function getRootMargin(modifiers) { const key = "margin"; const fallback = "0px 0px 0px 0px"; const index = modifiers.indexOf(key); if (index === -1) return fallback; let values = []; for (let i = 1; i < 5; i++) { values.push(getLengthValue(modifiers[index + i] || "")); } values = values.filter((v) => v !== void 0); return values.length ? values.join(" ").trim() : fallback; } document.addEventListener("alpine:init", () => { window.Alpine.plugin(src_default); }); })(); </script> <script> for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]":"intersect",".product-info [x-data]":"intersect","#filters-content [x-data]":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]":"intersect","#notice-cookie-block":"idle"})) { document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); } </script> <script> (function () { "use strict"; const hasAlpine = new Promise(resolve => { window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); }); const hasInteract = new Promise(resolve => { (events => { const onInteract = () => { resolve(); events.forEach(type => window.removeEventListener(type, onInteract)); } events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) }); const onIntersect = (el) => { return new Promise(resolve => { const observer = new IntersectionObserver(entries => { for (const entry of entries) { if (entry.isIntersecting) { observer.disconnect() resolve(); } } }, {}); observer.observe(el); }); } function runComponent(el) { hasAlpine.then(() => { el.removeAttribute('x-ignore'); queueMicrotask(() => Alpine.initTree(el)); }); } function initDeferredComponents() { document.querySelectorAll('[x-data][x-defer]').forEach(el => { el.setAttribute('x-ignore', ''); const deferUntil = (el.getAttribute('x-defer') || '').trim(); switch (deferUntil) { case 'interact': hasInteract.then(() => runComponent(el)); break; case 'intersect': onIntersect(el).then(() => runComponent(el)) break; case 'idle': window.requestIdleCallback ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) : setTimeout(() => runComponent(el), 4000); break; case 'eager': runComponent(el); break; default: if (deferUntil.startsWith('event:') && deferUntil.length > 6) { window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); } } }); } window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); })() </script> <script type="module" src="https://checkout-demo.hyva.io/static/version1741272610/frontend/Hyva/Checkout/en_US/Hyva_Theme/js/alpine3.min.js" defer crossorigin ></script> <script> 'use strict'; function dispatchMessages(messages, hideAfter) { const messagesEvent = new CustomEvent("messages-loaded", { detail: { messages: messages, hideAfter: hideAfter } }); window.dispatchEvent(messagesEvent); } if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } (function( hyva, undefined ) { hyva.initFormKey = () => { const inputSelector = 'input[name="form_key"]', formKey = hyva.getFormKey(); Array.from(document.querySelectorAll(inputSelector)).map(function (input) { input.value = formKey }); } hyva.initMessages = () => { try { const messages = hyva.getCookie('mage-messages'); window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; dispatchMessages(window.mageMessages); // empty `mage-messages` cookie const skipSetDomain = true; hyva.setCookie('mage-messages','', -1, skipSetDomain); } catch (error) { console.warn('Error parsing Cookie Messages:', error); } } window.addEventListener('DOMContentLoaded', hyva.initFormKey); hyva.alpineInitialized(hyva.initMessages) }( window.hyva = window.hyva || {} )); </script> <script> 'use strict'; { const private_content_key = 'mage-cache-storage'; const private_content_expire_key = 'mage-cache-timeout'; const private_content_version_key = 'private_content_version'; const section_data_ids_key = 'section_data_ids'; const mage_cache_session_id_key = 'mage-cache-sessid'; const last_visited_store_key = 'last_visited_store'; const ttl = 3600; if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } function loadSectionData () { const browserStorage = hyva.getBrowserStorage(); if (!browserStorage) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Please enable LocalStorage in your browser." }] ); return; } try { let isInvalid = false; if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { isInvalid = true; } hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); if (!hyva.getCookie(mage_cache_session_id_key)) { isInvalid = true; browserStorage.removeItem(private_content_key); const skipSetDomain = true; const days = false; hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) } const cookieVersion = hyva.getCookie(private_content_version_key); const storageVersion = browserStorage.getItem(private_content_version_key); if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { isInvalid = true; } const privateContentExpires = browserStorage.getItem(private_content_expire_key); if (privateContentExpires && new Date(privateContentExpires) < new Date()) { browserStorage.removeItem(private_content_key); } if (isInvalid && cookieVersion) { fetchPrivateContent([]); } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); if ( privateContent && privateContentExpires && privateContent.cart && privateContent.customer ) { dispatchPrivateContent(privateContent); } else { fetchPrivateContent([]); } } else { if (document.getElementById('default-section-data')) { const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); dispatchPrivateContent(privateContent); } else { dispatchPrivateContent({}); } } } catch (error) { console.warn('Error retrieving Private Content:', error); } } hyva.alpineInitialized(loadSectionData) window.addEventListener('reload-customer-section-data', loadSectionData); function dispatchPrivateContent(data) { const privateContentEvent = new CustomEvent("private-content-loaded", { detail: { data: data } }); window.dispatchEvent(privateContentEvent); } function fetchPrivateContent(sections) { fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => response.ok && response.json()) .then( data => { if (data) { try { const browserStorage = hyva.getBrowserStorage(); // merge new data preserving non-invalidated sections const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { delete oldSectionData['checkout-data']; } const newSectionData = Object.assign(oldSectionData, data); dispatchPrivateContent(newSectionData); // don't persist messages, they've been dispatched already if (newSectionData.messages && newSectionData.messages.messages ) { newSectionData.messages.messages = []; } browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); browserStorage.setItem(private_content_expire_key, expiresAt); const newCookieVersion = hyva.getCookie(private_content_version_key); browserStorage.setItem(private_content_version_key, newCookieVersion); // We don't need the section_data_ids in Hyvä, but we store them for compatibility // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout hyva.setCookie( section_data_ids_key, JSON.stringify( Object.keys(data).reduce((sectionDataIds, sectionKey) => { sectionDataIds[sectionKey] = data[sectionKey]['data_id']; return sectionDataIds; }, {}) ), false, true ); } catch (error) { console.warn("Couldn't store privateContent", error); } } } ); } } </script> <script> (() => { document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); })() </script> <script> (events => { const dispatchUserInteractionEvent = () => { events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) window.dispatchEvent(new Event('init-external-scripts')) }; events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) </script> <script> function initConfigurableOptions(productId, optionConfig) { function findPathParam(key) { const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); for (let i = 0; i < pathParts.length; i += 2) { if (pathParts[i] === key && pathParts.length > i) { return pathParts[i + 1]; } } } return { optionConfig, productId, itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), allowedAttributeOptions: [], selectedValues: [], init() { this.findAllowedAttributeOptions(); this.$nextTick(() => { if (typeof this.optionConfig.defaultValues === 'object') { for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { this.changeOption(attributeId, value + ''); } } this.preselectQuerystringItems(); this.preselectLocationHashItems(); }); }, productIndex: 0, productIndexForPrice: 0, optionIsActive(attributeId, optionId) { return !!this.getAllowedAttributeOptions(attributeId).find( option => option.id === optionId ) }, optionIsEnabled(attributeId, optionId) { for (const productId in this.optionConfig.index) { if (this.optionConfig.index[productId][attributeId] === optionId) { return true; } } return false; }, findSimpleIndex() { this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues); }, calculateSimpleIndexForPartialSelection(selectedValues) { if (selectedValues.length === 0) return 0; return this.findProductIdsForPartialSelection(selectedValues)[0]; }, calculateSimpleIndexForFullSelection(selectedValues) { if (! this.isFullSelection(selectedValues)) return false; const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).find(productIndex => { const productCandidateOptions = productIndexes[productIndex]; for (const productOption in productCandidateOptions) { if ( !selectedValues[productOption] || selectedValues[productOption] !== productCandidateOptions[productOption] ) { return false; } } return productIndex; }); }, findAllowedAttributeOptions() { this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); }, calculateAllowedAttributeOptions(selectedValues) { const allAttributes = this.optionConfig.attributes; const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { return a.position - b.position }); const newAllowedAttributeOptions = []; allAttributesSorted.forEach(attribute => { const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { return !!option.products.find(product => { return availableIndexes.includes(product); }) }); }); return newAllowedAttributeOptions; }, calculateAvailableProductIndexes(selectedOptions) { if (Object.keys(selectedOptions).length === 0) { if (Object.values(this.optionConfig.salable || {}).length) { return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) } return Object.keys(this.optionConfig.index); } const selectedIds = Object.keys(selectedOptions); if (Object.values(this.optionConfig.salable || {}).length) { const selectedOptionIndexes = selectedIds.map(attrId => { const optionValue = selectedOptions[attrId]; return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] }) return selectedOptionIndexes.reduce((acc, optionIndexes) => { return acc.filter(index => optionIndexes.includes(index)); }); } else { const productIndexes = this.optionConfig.index; return Object.keys(productIndexes).filter(index => { for (const attrId of selectedIds) { if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false } return true }); } }, findAttributeByOptionId(optionId) { for (const attributeId in this.optionConfig.attributes) { const attributeOptions = this.optionConfig.attributes[attributeId].options || []; if (attributeOptions.find(option => option.id === optionId)) { return attributeId; } } }, getAllowedAttributeOptions(attributeId) { return this.allowedAttributeOptions[attributeId] || [] }, getAllAttributeOptions(attributeId) { return ( this.optionConfig.attributes[attributeId] && this.optionConfig.attributes[attributeId].options ) || [] }, getProductIdsForOption(option) { const attributeId = this.findAttributeByOptionId(option.id); const allOptions = this.optionConfig.attributes[attributeId]; const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); return opt && opt.products ? opt.products : []; }, findProductIdsForPartialSelection(optionSelection) { const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { const newCandidates = this.getProductIdsForOption({id: optionId}); return candidates === null ? newCandidates : candidates.filter(productId => newCandidates.includes(productId)); }, null); return candidateProducts || []; }, findCheapestProductForPartialSelection(optionSelection) { const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); return candidateProducts.reduce((cheapest, simpleIdx) => { // in the first iteration we start with simpleIdx as the currently cheapest product if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount ? simpleIdx : cheapest; }, 0) }, findProductIdToUseForOptionPrice(option) { // try to find a product for a complete selection const attributeId = this.findAttributeByOptionId(option.id); const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); // if there is no complete selection, use the cheapest product for the option return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); }, getAttributeOptionLabel(option) { const optionProduct = this.findProductIdToUseForOptionPrice(option); if ((! optionProduct) || (optionProduct === this.productIndexForPrice)) { return option.label; } const currentPrice = this.getOptionPriceAdjustmentBasePrice(); if (this.optionConfig.optionPrices[optionProduct]) { const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; if (optionPrice !== currentPrice){ return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); } } return option.label; }, getOptionPriceAdjustmentBasePrice() { if (this.optionConfig.optionPrices[this.productIndexForPrice]) { return this.optionConfig.optionPrices[this.productIndexForPrice].finalPrice.amount } return this.optionConfig.prices.finalPrice.amount; // default price if no option selection }, clearOptionIfActive(optionId, value) { if (this.selectedValues[optionId] === value) { this.blurLabel() this.changeOption(optionId, '') } }, removeAttrFromSelection(selectedValues, attributeId) { attributeId = parseInt(attributeId); return selectedValues.reduce((newSelection, val, attr) => { if (attr !== attributeId) { newSelection[attr] = val; } return newSelection; }, []); }, changeOption(attributeId, value) { if (value === '') { this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { this.selectedValues[attributeId] = value; } this.findSimpleIndex(); this.findAllowedAttributeOptions(); this.updatePrices(); this.updateGallery(); const candidates = this.findProductIdsForPartialSelection(this.selectedValues); window.dispatchEvent( new CustomEvent( 'configurable-selection-changed', { detail: { productId: this.productId, optionId: attributeId, value: value, productIndex: this.productIndex, selectedValues: this.selectedValues, candidates: candidates, skuCandidates: Object.values(candidates).map(id => this.optionConfig.sku[id]), } } ) ); }, calculateIsMinimalPrice() { return ! this.isFullSelection(this.selectedValues); }, isFullSelection(selectedValues) { return Object.values(selectedValues).length === Object.keys(this.optionConfig.attributes).length; }, updatePrices() { const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices; window.dispatchEvent( new CustomEvent( "update-prices-" + this.productId, { detail: Object.assign( value, { isMinimalPrice: this.calculateIsMinimalPrice() } ) } ) ); }, updateGallery () { if (this.productIndex) { const images = this.optionConfig.images[this.productIndex]; images && window.dispatchEvent(new CustomEvent( "update-gallery", { detail: this.sortImagesByPosition(images) } )); } else { window.dispatchEvent(new Event("reset-gallery")); } }, sortImagesByPosition(images) { return images.sort((x, y) => { return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) }); }, onGetCartData(data) { }, preselectCartItems(data) { // pre-select options based on cart data for current (quote) itemId const cart = data && data.cart; if (cart && cart.items) { const cartItem = cart.items.find((item) => { return ( item.item_id === this.itemId && item.product_id === this.productId ) }); if (cartItem && cartItem.options && cartItem.options.length) { cartItem.options.map(option => { this.changeOption(option.option_id, option.option_value); }) } } }, preselectQuerystringItems() { // pre-select option like ?size=167 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); }, preselectLocationHashItems() { // pre-select option like #144=167 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); }, preselectItemsBasedOnLocation(getLocationValue) { Object.values(this.optionConfig.attributes).map(attribute => { const v = getLocationValue(attribute); v && this.changeOption(attribute.id, v) }); } } } </script> <script> function initSwatchOptions(swatchConfig) { return { swatchConfig, getAttributeSwatchData(attributeId) { const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); return swatchConfig; }, mapSwatchTypeNumberToTypeCode(typeNumber) { switch ("" + typeNumber) { case "1": return "color" case "2": return "image" case "3": return "empty" case "0": default: return "text" } }, getTypeOfFirstOption(attributeId) { for (const optionId in this.swatchConfig[attributeId]) { const option = this.swatchConfig[attributeId][optionId]; if (typeof option.type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(option.type); } } }, getVisualSwatchType(attributeId, targetOptionId) { // If a type configuration is present for the given option id, use it const config = this.swatchConfig[attributeId]; if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); } // Otherwise - if no config is present for the target option - use the type of the first option // with a type property from the attribute, thus assuming its the same type as the target option. // (This edge case condition can occur on single swatch products if some options are not salable) return this.getTypeOfFirstOption(attributeId); }, getSwatchType(attributeId, optionId) { // Deserialize the attribute details the first time they are used if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); } const type = this.swatchConfig[attributeId] && this.swatchConfig[attributeId].details && this.swatchConfig[attributeId].details.swatch_input_type || "empty"; return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; }, isTextSwatch(attributeId, optionId) { return this.getSwatchType(attributeId, optionId) === 'text'; }, isVisualSwatch(attributeId, optionId) { const type = this.getSwatchType(attributeId, optionId); return ['image', 'color'].includes(type); }, getSwatchBackgroundStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value; } else if (type === "image") { return "background: #ffffff url('" + config.value + "') no-repeat center"; } else { return ''; } }, getSwatchText(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); }, getOptionLabelFromOptionConfig(attributeId, optionId) { // Fallback if no value is present in swatchConfig data // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); return option && option[0] && option[0].label ||''; }, getSwatchConfig(attributeId, optionId) { return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] ? this.swatchConfig[attributeId][optionId] : false; }, activeTooltipItem: false, tooltipPositionElement: false, isTooltipVisible() { return this.activeTooltipItem && this.getSwatchConfig( this.activeTooltipItem.attribute, this.activeTooltipItem.item ); }, isFirstItemCol() { return this.activeTooltipItem.index === 0; }, getTooltipImageStyle(attributeId, optionId) { const config = this.getSwatchConfig(attributeId, optionId); const type = this.getSwatchType(attributeId, optionId); if (type === "color") { return 'background-color:' + config.value + '; width: 110px; height: 90px;'; } else if (type === "image") { return "background: #ffffff url('" + config.thumb + "') center center no-repeat; width: 110px; height: 90px;"; } else { return 'display:none'; } }, getTooltipPosition() { return this.tooltipPositionElement ? `top: ${this.tooltipPositionElement.offsetTop}px;` + `left: ${ this.tooltipPositionElement.offsetLeft - ( this.tooltipPositionElement.closest('.snap') && this.tooltipPositionElement.closest('.snap').scrollLeft || 0 ) }px;` : '' }, getTooltipLabel() { return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label }, focusedLabel: false, focusLabel(optionId) { this.focusedLabel = optionId; }, blurLabel() { this.focusedLabel = false; }, showSwatches: false, initShowSwatchesIntersect() { if ('IntersectionObserver' in window && !window.scrollY) { let io = new IntersectionObserver( entries => { entries.map(entry => { if (entry.isIntersecting) { this.showSwatches = true; io.unobserve(this.$root); } }) } ); io.observe(this.$root); } else { this.showSwatches = true } } } } </script> <div class="z-10 fixed bottom-4 inset-x-4 sm:w-96 max-w-prose mx-auto p-4 rounded shadow-2xl bg-container-lighter lg:absolute lg:bottom-auto lg:right-auto lg:top-[var(--msrp-block-offset)] lg:left-[var(--msrp-inline-offset)] lg:shadow-lg lg:max-w-xs" :style="setPosition()" x-data="initMsrpPopover()" x-cloak x-show="open" x-transition:enter="transition ease-out duration-300 opacity-0 translate-y-full lg:-translate-y-0" x-transition:enter-end="transition ease-out duration-300 opacity-100 translate-y-0" x-transition:leave="transition ease-in duration-150 opacity-0 translate-y-full lg:-translate-y-0" @click.outside="closePopover($event)" @msrp-popover.window="showPopover($event.detail)" @resize.window.debounce="closePopover()" @keydown.window.escape="closePopover()" > <div class="flex justify-between gap-2 mb-2"> <strong id="map-popup-heading-price" class="font-bold" x-text="title"></strong> <button type="button" @click="closePopover()"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> <title>x</title></svg> </button> </div> <template x-if="type !== 'help'"> <div class="mb-4 text-sm"> <dl class="price-box"> <div class="flex gap-2"> <dt class="font-semibold whitespace-nowrap">Price:</dt> <dd x-html="msrpPrice" class="flex flex-col"></dd> </div> <div class="flex gap-2"> <dt class="font-semibold whitespace-nowrap">Actual Price:</dt> <dd x-html="actualPrice" class="flex flex-col"></dd> </div> </dl> </div> </template> <div class="text-sm" x-html="content"></div> <script> function initMsrpPopover() { return { open: false, type: "price", // price or help title: '', content: 'Our price is lower than the manufacturer's "minimum advertised price." As a result, we cannot show you the price in catalog or the product page. <br><br> You have no obligation to purchase the product once you know the price. You can simply remove the item from your cart.', isSaleable: false, actualPrice: null, msrpPrice: null, productId: null, anchor: null, position: ['0', '0'], isInViewport() { const pageWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; const offset = this.anchor.offsetLeft + this.$root.offsetWidth; return pageWidth > offset; }, setPosition() { return { '--msrp-block-offset': this.position[0], '--msrp-inline-offset': this.position[1] } }, calcPosition() { const target = this.anchor; const pageTop = target.getBoundingClientRect().top + window.scrollY; const pageLeft = target.getBoundingClientRect().left + window.scrollX; const positionBlock = `${pageTop + target.clientHeight}px`; const positionInline = this.isInViewport() ? `${pageLeft}px` : `${(pageLeft - (this.$root.offsetWidth - target.offsetWidth))}px`; this.position = [positionBlock, positionInline] }, closePopover(event) { if (event && event.target === this.anchor) return; this.open = false; }, showPopover(event) { const data = event.msrpData; if (!data) return; this.open = true; this.type = data.type; this.productId = data.id; this.isSaleable = data.isSaleable; this.actualPrice = data.realPrice; this.msrpPrice = data.msrpPrice; this.title = this.type === 'help' ? '' : data.productName; this.content = this.type === 'help' ? 'Our price is lower than the manufacturer's "minimum advertised price." As a result, we cannot show you the price in catalog or the product page. <br><br> You have no obligation to purchase the product once you know the price. You can simply remove the item from your cart.' : 'Our price is lower than the manufacturer's "minimum advertised price." As a result, we cannot show you the price in catalog or the product page. <br><br> You have no obligation to purchase the product once you know the price. You can simply remove the item from your cart.'; if (event.target) { this.anchor = event.target; this.$nextTick(() => this.calcPosition()); } } } } </script> </div> <script> 'use strict'; (function () { const modals = []; const excludedFromFocusTrapping = new Set(); function trapFocusInNextModalWithOverlay() { for (let idx = modals.length -1; idx >= 0; idx--) { const nextOnStack = modals[idx]; const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; if (! isOverlayDisabled(nextDialogElement)) { hyva.trapFocus(nextDialogElement); break; } } } function focusables(dialogElement) { const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; return Array.from(dialogElement.querySelectorAll(selector)) .filter(el => !el.hasAttribute('disabled')); } function firstVisible(elements) { const a = Array.from(elements); for (let i = 0; i < a.length; i++) { if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; } return null; } function isInViewport(element) { const rect = element && element.getBoundingClientRect(); return rect && rect.top >= 0 && rect.left >= 0 && rect.right <= window.innerWidth && rect.bottom <= window.innerHeight; } function setFocusAfterTransition(dialogElement, duration) { const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); next: for (let candidate of candidates) { for (let child of nested) { if (child.contains(candidate)) continue next; } setTimeout(() => candidate.focus(), 50); break; } window.setTimeout(() => { const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || focusables(dialogElement)[0] || null; focusElement && isInViewport(focusElement) && focusElement.focus(); }, Math.max(1, duration)); } function determineTrigger($refs, dialog, trigger) { if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { return dialog.target; } if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { return trigger.target; } if (typeof trigger === 'string') { try { return $refs[trigger] || document.querySelector(trigger) } catch (e) {} } if (trigger instanceof Element) { return trigger; } return null; } function isOverlayDisabled(dialog) { return dialog && dialog.hasAttribute('x-no-overlay') } function areRemainingModalsWithoutOverlay(modals) { const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); return overflowDisabled.length === modals.length; } window.hyva.modal = function(options) { const config = Object.assign({ dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', transitionEnterStart: 'opacity-0', transitionEnterEnd: 'opacity-100', transitionLeave: 'transition ease-in duration-300', transitionLeaveStart: 'opacity-100', transitionLeaveEnd: 'opacity-0', }, options); let lastHide = 0; return { opened: {}, show(dialog, trigger) { const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); const name = typeof dialog === 'string' ? dialog : config.dialog; const dialogElement = this.$refs[name]; if (! dialogElement) { return; } const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); dialogElement.scrollTop = 0; if (this.opened[name]) { return; } if (focusTargetAfterHide) { focusTargetAfterHide.setAttribute('aria-expanded', 'true'); } this.opened[name] = true; useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); setFocusAfterTransition(dialogElement, config.duration); const frame = {name, instance: this, focusTarget: focusTargetAfterHide, time: Date.now()}; modals.push(frame); if (useOverlay) { document.body.classList.add('overflow-hidden'); } return new Promise(resolve => frame.resolve = resolve); }, cancel() { this.hide(false); }, ok() { this.hide(true); }, hide(value) { if (Date.now() - lastHide < config.duration) { return; } lastHide = Date.now(); const modal = modals.pop() || {}; const name = modal.name; this.opened[name] = false; hyva.releaseFocus(modal.instance.$refs[modal.name]) trapFocusInNextModalWithOverlay(); const nextFocusAfterHide = modal.focusTarget; nextFocusAfterHide && setTimeout(() => { nextFocusAfterHide.setAttribute('aria-expanded', 'false'); nextFocusAfterHide.focus() }, config.duration); if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { document.body.classList.remove('overflow-hidden'); } modal.resolve(value); }, overlay(dialog) { const name = typeof dialog === 'string' ? dialog : config.dialog; return { ['x-show']() { return this.opened[name] }, ['x-transition:enter']: config.transitionEnter, ['x-transition:enter-start']: config.transitionEnterStart, ['x-transition:enter-end']: config.transitionEnterEnd, ['x-transition:leave']: config.transitionLeave, ['x-transition:leave-start']: config.transitionLeaveStart, ['x-transition:leave-end']: config.transitionLeaveEnd, ['@hyva-modal-show.window'](event) { event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) } }; } }; } window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] window.hyva.modal.pop = function () { if (modals.length > 0) { const modal = modals[modals.length -1]; modal.instance.hide(); } } window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { typeof selectors === 'string' || selectors instanceof String ? excludedFromFocusTrapping.add(selectors) : selectors.map(selector => excludedFromFocusTrapping.add(selector)); } window.hyva.modal.eventListeners = { keydown: event => { if (event.key === 'Escape') { window.hyva.modal.pop(); } }, click: event => { if (modals.length > 0) { const modal = modals[modals.length -1]; const dialog = modal.instance.$refs[modal.name]; if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago ! isOverlayDisabled(dialog) && // if dialog has overlay ! dialog.contains(event.target)) { // if click is outside of dialog modal.instance.hide(); } } } }; document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); document.addEventListener('click', window.hyva.modal.eventListeners.click); })(); </script> <script type="text/json" id="default-section-data"> {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorra"},"AE":{"name":"United Arab Emirates"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua & Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albania","regions":{"512":{"code":"AL-01","name":"Berat"},"513":{"code":"AL-09","name":"Dib\u00ebr"},"514":{"code":"AL-02","name":"Durr\u00ebs"},"515":{"code":"AL-03","name":"Elbasan"},"516":{"code":"AL-04","name":"Fier"},"517":{"code":"AL-05","name":"Gjirokast\u00ebr"},"518":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"519":{"code":"AL-07","name":"Kuk\u00ebs"},"520":{"code":"AL-08","name":"Lezh\u00eb"},"521":{"code":"AL-10","name":"Shkod\u00ebr"},"522":{"code":"AL-11","name":"Tiran\u00eb"},"523":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Armenia"},"AN":{"name":null},"AO":{"name":"Angola"},"AQ":{"name":"Antarctica"},"AR":{"name":"Argentina","regions":{"525":{"code":"AR-B","name":"Buenos Aires"},"526":{"code":"AR-K","name":"Catamarca"},"527":{"code":"AR-H","name":"Chaco"},"528":{"code":"AR-U","name":"Chubut"},"524":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"529":{"code":"AR-X","name":"C\u00f3rdoba"},"530":{"code":"AR-W","name":"Corrientes"},"531":{"code":"AR-E","name":"Entre R\u00edos"},"532":{"code":"AR-P","name":"Formosa"},"533":{"code":"AR-Y","name":"Jujuy"},"534":{"code":"AR-L","name":"La Pampa"},"535":{"code":"AR-F","name":"La Rioja"},"536":{"code":"AR-M","name":"Mendoza"},"537":{"code":"AR-N","name":"Misiones"},"538":{"code":"AR-Q","name":"Neuqu\u00e9n"},"539":{"code":"AR-R","name":"R\u00edo Negro"},"540":{"code":"AR-A","name":"Salta"},"541":{"code":"AR-J","name":"San Juan"},"542":{"code":"AR-D","name":"San Luis"},"543":{"code":"AR-Z","name":"Santa Cruz"},"544":{"code":"AR-S","name":"Santa Fe"},"545":{"code":"AR-G","name":"Santiago del Estero"},"546":{"code":"AR-V","name":"Tierra del Fuego"},"547":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"American Samoa"},"AT":{"name":"Austria","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australia","regions":{"605":{"code":"ACT","name":"Australian Capital Territory"},"606":{"code":"NSW","name":"New South Wales"},"612":{"code":"NT","name":"Northern Territory"},"608":{"code":"QLD","name":"Queensland"},"609":{"code":"SA","name":"South Australia"},"610":{"code":"TAS","name":"Tasmania"},"607":{"code":"VIC","name":"Victoria"},"611":{"code":"WA","name":"Western Australia"}}},"AW":{"name":"Aruba"},"AX":{"name":"\u00c5land Islands"},"AZ":{"name":"Azerbaijan"},"BA":{"name":"Bosnia & Herzegovina"},"BB":{"name":"Barbados"},"BD":{"name":"Bangladesh"},"BE":{"name":"Belgium","regions":{"620":{"code":"VAN","name":"Antwerpen"},"621":{"code":"WBR","name":"Brabant wallon"},"622":{"code":"BRU","name":"Brussels-Capital Region"},"623":{"code":"WHT","name":"Hainaut"},"625":{"code":"WLG","name":"Li\u00e8ge"},"624":{"code":"VLI","name":"Limburg"},"626":{"code":"WLX","name":"Luxembourg"},"627":{"code":"WNA","name":"Namur"},"628":{"code":"VOV","name":"Oost-Vlaanderen"},"629":{"code":"VBR","name":"Vlaams-Brabant"},"630":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgaria","regions":{"640":{"code":"BG-01","name":"Blagoevgrad"},"641":{"code":"BG-02","name":"Burgas"},"647":{"code":"BG-08","name":"Dobrich"},"646":{"code":"BG-07","name":"Gabrovo"},"665":{"code":"BG-26","name":"Haskovo"},"648":{"code":"BG-09","name":"Kardzhali"},"649":{"code":"BG-10","name":"Kyustendil"},"650":{"code":"BG-11","name":"Lovech"},"651":{"code":"BG-12","name":"Montana"},"652":{"code":"BG-13","name":"Pazardzhik"},"653":{"code":"BG-14","name":"Pernik"},"654":{"code":"BG-15","name":"Pleven"},"655":{"code":"BG-16","name":"Plovdiv"},"656":{"code":"BG-17","name":"Razgrad"},"657":{"code":"BG-18","name":"Ruse"},"666":{"code":"BG-27","name":"Shumen"},"658":{"code":"BG-19","name":"Silistra"},"659":{"code":"BG-20","name":"Sliven"},"660":{"code":"BG-21","name":"Smolyan"},"661":{"code":"BG-22","name":"Sofia City"},"662":{"code":"BG-23","name":"Sofia Province"},"663":{"code":"BG-24","name":"Stara Zagora"},"664":{"code":"BG-25","name":"Targovishte"},"642":{"code":"BG-03","name":"Varna"},"643":{"code":"BG-04","name":"Veliko Tarnovo"},"644":{"code":"BG-05","name":"Vidin"},"645":{"code":"BG-06","name":"Vratsa"},"667":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahrain"},"BI":{"name":"Burundi"},"BJ":{"name":"Benin"},"BL":{"name":"St. Barth\u00e9lemy"},"BM":{"name":"Bermuda"},"BN":{"name":"Brunei"},"BO":{"name":"Bolivia","regions":{"632":{"code":"BO-H","name":"Chuquisaca"},"631":{"code":"BO-C","name":"Cochabamba"},"633":{"code":"BO-B","name":"El Beni"},"634":{"code":"BO-L","name":"La Paz"},"635":{"code":"BO-O","name":"Oruro"},"636":{"code":"BO-N","name":"Pando"},"637":{"code":"BO-P","name":"Potos\u00ed"},"638":{"code":"BO-S","name":"Santa Cruz"},"639":{"code":"BO-T","name":"Tarija"}}},"BQ":{"name":"Caribbean Netherlands"},"BR":{"name":"Brazil","regions":{"485":{"code":"AC","name":"Acre"},"486":{"code":"AL","name":"Alagoas"},"487":{"code":"AP","name":"Amap\u00e1"},"488":{"code":"AM","name":"Amazonas"},"489":{"code":"BA","name":"Bahia"},"490":{"code":"CE","name":"Cear\u00e1"},"511":{"code":"DF","name":"Distrito Federal"},"491":{"code":"ES","name":"Esp\u00edrito Santo"},"492":{"code":"GO","name":"Goi\u00e1s"},"493":{"code":"MA","name":"Maranh\u00e3o"},"494":{"code":"MT","name":"Mato Grosso"},"495":{"code":"MS","name":"Mato Grosso do Sul"},"496":{"code":"MG","name":"Minas Gerais"},"497":{"code":"PA","name":"Par\u00e1"},"498":{"code":"PB","name":"Para\u00edba"},"499":{"code":"PR","name":"Paran\u00e1"},"500":{"code":"PE","name":"Pernambuco"},"501":{"code":"PI","name":"Piau\u00ed"},"502":{"code":"RJ","name":"Rio de Janeiro"},"503":{"code":"RN","name":"Rio Grande do Norte"},"504":{"code":"RS","name":"Rio Grande do Sul"},"505":{"code":"RO","name":"Rond\u00f4nia"},"506":{"code":"RR","name":"Roraima"},"507":{"code":"SC","name":"Santa Catarina"},"508":{"code":"SP","name":"S\u00e3o Paulo"},"509":{"code":"SE","name":"Sergipe"},"510":{"code":"TO","name":"Tocantins"}}},"BS":{"name":"Bahamas"},"BT":{"name":"Bhutan"},"BV":{"name":"Bouvet Island"},"BW":{"name":"Botswana"},"BY":{"name":"Belarus","regions":{"613":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"614":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"615":{"code":"BY-HM","name":"Horad Minsk"},"616":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"617":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"618":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"619":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"Cocos (Keeling) Islands"},"CD":{"name":"Congo - Kinshasa"},"CF":{"name":"Central African Republic"},"CG":{"name":"Congo - Brazzaville"},"CH":{"name":"Switzerland","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"Cook Islands"},"CL":{"name":"Chile","regions":{"668":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"669":{"code":"CL-AN","name":"Antofagasta"},"670":{"code":"CL-AP","name":"Arica y Parinacota"},"672":{"code":"CL-AT","name":"Atacama"},"673":{"code":"CL-BI","name":"Biob\u00edo"},"674":{"code":"CL-CO","name":"Coquimbo"},"671":{"code":"CL-AR","name":"La Araucan\u00eda"},"675":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"676":{"code":"CL-LL","name":"Los Lagos"},"677":{"code":"CL-LR","name":"Los R\u00edos"},"678":{"code":"CL-MA","name":"Magallanes"},"679":{"code":"CL-ML","name":"Maule"},"680":{"code":"CL-NB","name":"\u00d1uble"},"681":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"682":{"code":"CL-TA","name":"Tarapac\u00e1"},"683":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroon"},"CN":{"name":"China","regions":{"684":{"code":"CN-AH","name":"Anhui Sheng"},"685":{"code":"CN-BJ","name":"Beijing Shi"},"686":{"code":"CN-CQ","name":"Chongqing Shi"},"687":{"code":"CN-FJ","name":"Fujian Sheng"},"688":{"code":"CN-GS","name":"Gansu Sheng"},"689":{"code":"CN-GD","name":"Guangdong Sheng"},"690":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"691":{"code":"CN-GZ","name":"Guizhou Sheng"},"692":{"code":"CN-HI","name":"Hainan Sheng"},"693":{"code":"CN-HE","name":"Hebei Sheng"},"694":{"code":"CN-HL","name":"Heilongjiang Sheng"},"695":{"code":"CN-HA","name":"Henan Sheng"},"696":{"code":"CN-HK","name":"Hong Kong SAR"},"697":{"code":"CN-HB","name":"Hubei Sheng"},"698":{"code":"CN-HN","name":"Hunan Sheng"},"699":{"code":"CN-JS","name":"Jiangsu Sheng"},"700":{"code":"CN-JX","name":"Jiangxi Sheng"},"701":{"code":"CN-JL","name":"Jilin Sheng"},"702":{"code":"CN-LN","name":"Liaoning Sheng"},"703":{"code":"CN-MO","name":"Macao SAR"},"704":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"705":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"706":{"code":"CN-QH","name":"Qinghai Sheng"},"707":{"code":"CN-SN","name":"Shaanxi Sheng"},"708":{"code":"CN-SD","name":"Shandong Sheng"},"709":{"code":"CN-SH","name":"Shanghai Shi"},"710":{"code":"CN-SX","name":"Shanxi Sheng"},"711":{"code":"CN-SC","name":"Sichuan Sheng"},"712":{"code":"CN-TW","name":"Taiwan Sheng"},"713":{"code":"CN-TJ","name":"Tianjin Shi"},"714":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"715":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"716":{"code":"CN-YN","name":"Yunnan Sheng"},"717":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombia","regions":{"718":{"code":"CO-AMA","name":"Amazonas"},"719":{"code":"CO-ANT","name":"Antioquia"},"720":{"code":"CO-ARA","name":"Arauca"},"721":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"722":{"code":"CO-BOL","name":"Bol\u00edvar"},"723":{"code":"CO-BOY","name":"Boyac\u00e1"},"724":{"code":"CO-CAL","name":"Caldas"},"725":{"code":"CO-CAQ","name":"Caquet\u00e1"},"726":{"code":"CO-CAS","name":"Casanare"},"727":{"code":"CO-CAU","name":"Cauca"},"728":{"code":"CO-CES","name":"Cesar"},"729":{"code":"CO-CHO","name":"Choc\u00f3"},"730":{"code":"CO-COR","name":"C\u00f3rdoba"},"731":{"code":"CO-CUN","name":"Cundinamarca"},"732":{"code":"CO-GUA","name":"Guain\u00eda"},"733":{"code":"CO-GUV","name":"Guaviare"},"734":{"code":"CO-HUL","name":"Huila"},"735":{"code":"CO-LAG","name":"La Guajira"},"736":{"code":"CO-MAG","name":"Magdalena"},"737":{"code":"CO-MET","name":"Meta"},"738":{"code":"CO-NAR","name":"Nari\u00f1o"},"739":{"code":"CO-NSA","name":"Norte de Santander"},"740":{"code":"CO-PUT","name":"Putumayo"},"741":{"code":"CO-QUI","name":"Quind\u00edo"},"742":{"code":"CO-RIS","name":"Risaralda"},"743":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"744":{"code":"CO-SAN","name":"Santander"},"745":{"code":"CO-SUC","name":"Sucre"},"746":{"code":"CO-TOL","name":"Tolima"},"747":{"code":"CO-VAC","name":"Valle del Cauca"},"748":{"code":"CO-VAU","name":"Vaup\u00e9s"},"749":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica"},"CU":{"name":"Cuba"},"CV":{"name":"Cape Verde"},"CW":{"name":"Cura\u00e7ao"},"CX":{"name":"Christmas Island"},"CY":{"name":"Cyprus"},"CZ":{"name":"Czechia"},"DE":{"name":"Germany","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Denmark","regions":{"750":{"code":"DK-84","name":"Hovedstaden"},"751":{"code":"DK-82","name":"Midtjylland"},"752":{"code":"DK-81","name":"Nordjylland"},"753":{"code":"DK-85","name":"Sj\u00e6lland"},"754":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominica"},"DO":{"name":"Dominican Republic"},"DZ":{"name":"Algeria"},"EC":{"name":"Ecuador","regions":{"755":{"code":"EC-A","name":"Azuay"},"756":{"code":"EC-B","name":"Bol\u00edvar"},"757":{"code":"EC-F","name":"Ca\u00f1ar"},"758":{"code":"EC-C","name":"Carchi"},"759":{"code":"EC-H","name":"Chimborazo"},"760":{"code":"EC-X","name":"Cotopaxi"},"761":{"code":"EC-O","name":"El Oro"},"762":{"code":"EC-E","name":"Esmeraldas"},"763":{"code":"EC-W","name":"Gal\u00e1pagos"},"764":{"code":"EC-G","name":"Guayas"},"765":{"code":"EC-I","name":"Imbabura"},"766":{"code":"EC-L","name":"Loja"},"767":{"code":"EC-R","name":"Los R\u00edos"},"768":{"code":"EC-M","name":"Manab\u00ed"},"769":{"code":"EC-S","name":"Morona Santiago"},"770":{"code":"EC-N","name":"Napo"},"771":{"code":"EC-D","name":"Orellana"},"772":{"code":"EC-Y","name":"Pastaza"},"773":{"code":"EC-P","name":"Pichincha"},"774":{"code":"EC-SE","name":"Santa Elena"},"775":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"776":{"code":"EC-U","name":"Sucumb\u00edos"},"777":{"code":"EC-T","name":"Tungurahua"},"778":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"Egypt"},"EH":{"name":"Western Sahara"},"ER":{"name":"Eritrea"},"ES":{"name":"Spain","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"Ethiopia"},"FI":{"name":"Finland","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fiji"},"FK":{"name":"Falkland Islands"},"FM":{"name":"Micronesia"},"FO":{"name":"Faroe Islands"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gabon"},"GB":{"name":"United Kingdom"},"GD":{"name":"Grenada"},"GE":{"name":"Georgia"},"GF":{"name":"French Guiana"},"GG":{"name":"Guernsey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Greenland"},"GM":{"name":"Gambia"},"GN":{"name":"Guinea"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Equatorial Guinea"},"GR":{"name":"Greece","regions":{"792":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"779":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"780":{"code":"GR-I","name":"Attik\u00ed"},"781":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"782":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"783":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"784":{"code":"GR-D","name":"\u00cdpeiros"},"785":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"786":{"code":"GR-M","name":"Kr\u00edti"},"787":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"788":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"789":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"790":{"code":"GR-E","name":"Thessal\u00eda"},"791":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"South Georgia & South Sandwich Islands"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guinea-Bissau"},"GY":{"name":"Guyana","regions":{"793":{"code":"GY-BA","name":"Barima-Waini"},"794":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"795":{"code":"GY-DE","name":"Demerara-Mahaica"},"796":{"code":"GY-EB","name":"East Berbice-Corentyne"},"797":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"798":{"code":"GY-MA","name":"Mahaica-Berbice"},"799":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"800":{"code":"GY-PT","name":"Potaro-Siparuni"},"801":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"802":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"Hong Kong SAR China"},"HM":{"name":"Heard & McDonald Islands"},"HN":{"name":"Honduras"},"HR":{"name":"Croatia","regions":{"554":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"559":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"566":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"568":{"code":"HR-21","name":"Grad Zagreb"},"565":{"code":"HR-18","name":"Istarska \u017eupanija"},"551":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"553":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"549":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"556":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"567":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"561":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"558":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"555":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"562":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"550":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"564":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"552":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"557":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"563":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"560":{"code":"HR-13","name":"Zadarska \u017eupanija"},"548":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HT":{"name":"Haiti"},"HU":{"name":"Hungary"},"ID":{"name":"Indonesia"},"IE":{"name":"Ireland"},"IL":{"name":"Israel"},"IM":{"name":"Isle of Man"},"IN":{"name":"India","regions":{"569":{"code":"AN","name":"Andaman and Nicobar Islands"},"570":{"code":"AP","name":"Andhra Pradesh"},"571":{"code":"AR","name":"Arunachal Pradesh"},"572":{"code":"AS","name":"Assam"},"573":{"code":"BR","name":"Bihar"},"574":{"code":"CH","name":"Chandigarh"},"575":{"code":"CT","name":"Chhattisgarh"},"576":{"code":"DN","name":"Dadra and Nagar Haveli"},"577":{"code":"DD","name":"Daman and Diu"},"578":{"code":"DL","name":"Delhi"},"579":{"code":"GA","name":"Goa"},"580":{"code":"GJ","name":"Gujarat"},"581":{"code":"HR","name":"Haryana"},"582":{"code":"HP","name":"Himachal Pradesh"},"583":{"code":"JK","name":"Jammu and Kashmir"},"584":{"code":"JH","name":"Jharkhand"},"585":{"code":"KA","name":"Karnataka"},"586":{"code":"KL","name":"Kerala"},"587":{"code":"LD","name":"Lakshadweep"},"588":{"code":"MP","name":"Madhya Pradesh"},"589":{"code":"MH","name":"Maharashtra"},"590":{"code":"MN","name":"Manipur"},"591":{"code":"ML","name":"Meghalaya"},"592":{"code":"MZ","name":"Mizoram"},"593":{"code":"NL","name":"Nagaland"},"594":{"code":"OR","name":"Odisha"},"595":{"code":"PY","name":"Puducherry"},"596":{"code":"PB","name":"Punjab"},"597":{"code":"RJ","name":"Rajasthan"},"598":{"code":"SK","name":"Sikkim"},"599":{"code":"TN","name":"Tamil Nadu"},"600":{"code":"TG","name":"Telangana"},"601":{"code":"TR","name":"Tripura"},"602":{"code":"UP","name":"Uttar Pradesh"},"603":{"code":"UT","name":"Uttarakhand"},"604":{"code":"WB","name":"West Bengal"}}},"IO":{"name":"British Indian Ocean Territory"},"IQ":{"name":"Iraq"},"IR":{"name":"Iran"},"IS":{"name":"Iceland","regions":{"809":{"code":"IS-07","name":"Austurland"},"803":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"808":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"807":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"810":{"code":"IS-08","name":"Su\u00f0urland"},"804":{"code":"IS-02","name":"Su\u00f0urnes"},"806":{"code":"IS-04","name":"Vestfir\u00f0ir"},"805":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italy","regions":{"811":{"code":"AG","name":"Agrigento"},"812":{"code":"AL","name":"Alessandria"},"813":{"code":"AN","name":"Ancona"},"814":{"code":"AO","name":"Aosta"},"816":{"code":"AR","name":"Arezzo"},"817":{"code":"AP","name":"Ascoli-Piceno"},"818":{"code":"AT","name":"Asti"},"819":{"code":"AV","name":"Avellino"},"820":{"code":"BA","name":"Bari"},"821":{"code":"BT","name":"Barletta-Andria-Trani"},"822":{"code":"BL","name":"Belluno"},"823":{"code":"BN","name":"Benevento"},"824":{"code":"BG","name":"Bergamo"},"825":{"code":"BI","name":"Biella"},"826":{"code":"BO","name":"Bologna"},"827":{"code":"BZ","name":"Bolzano"},"828":{"code":"BS","name":"Brescia"},"829":{"code":"BR","name":"Brindisi"},"830":{"code":"CA","name":"Cagliari"},"831":{"code":"CL","name":"Caltanissetta"},"832":{"code":"CB","name":"Campobasso"},"833":{"code":"CI","name":"Carbonia Iglesias"},"834":{"code":"CE","name":"Caserta"},"835":{"code":"CT","name":"Catania"},"836":{"code":"CZ","name":"Catanzaro"},"837":{"code":"CH","name":"Chieti"},"838":{"code":"CO","name":"Como"},"839":{"code":"CS","name":"Cosenza"},"840":{"code":"CR","name":"Cremona"},"841":{"code":"KR","name":"Crotone"},"842":{"code":"CN","name":"Cuneo"},"843":{"code":"EN","name":"Enna"},"844":{"code":"FM","name":"Fermo"},"845":{"code":"FE","name":"Ferrara"},"846":{"code":"FI","name":"Firenze"},"847":{"code":"FG","name":"Foggia"},"848":{"code":"FC","name":"Forli-Cesena"},"849":{"code":"FR","name":"Frosinone"},"850":{"code":"GE","name":"Genova"},"851":{"code":"GO","name":"Gorizia"},"852":{"code":"GR","name":"Grosseto"},"853":{"code":"IM","name":"Imperia"},"854":{"code":"IS","name":"Isernia"},"815":{"code":"AQ","name":"L'Aquila"},"855":{"code":"SP","name":"La-Spezia"},"856":{"code":"LT","name":"Latina"},"857":{"code":"LE","name":"Lecce"},"858":{"code":"LC","name":"Lecco"},"859":{"code":"LI","name":"Livorno"},"860":{"code":"LO","name":"Lodi"},"861":{"code":"LU","name":"Lucca"},"862":{"code":"MC","name":"Macerata"},"863":{"code":"MN","name":"Mantova"},"864":{"code":"MS","name":"Massa-Carrara"},"865":{"code":"MT","name":"Matera"},"866":{"code":"VS","name":"Medio Campidano"},"867":{"code":"ME","name":"Messina"},"868":{"code":"MI","name":"Milano"},"869":{"code":"MO","name":"Modena"},"870":{"code":"MB","name":"Monza-Brianza"},"871":{"code":"NA","name":"Napoli"},"872":{"code":"NO","name":"Novara"},"873":{"code":"NU","name":"Nuoro"},"874":{"code":"OG","name":"Ogliastra"},"875":{"code":"OT","name":"Olbia Tempio"},"876":{"code":"OR","name":"Oristano"},"877":{"code":"PD","name":"Padova"},"878":{"code":"PA","name":"Palermo"},"879":{"code":"PR","name":"Parma"},"880":{"code":"PV","name":"Pavia"},"881":{"code":"PG","name":"Perugia"},"882":{"code":"PU","name":"Pesaro-Urbino"},"883":{"code":"PE","name":"Pescara"},"884":{"code":"PC","name":"Piacenza"},"885":{"code":"PI","name":"Pisa"},"886":{"code":"PT","name":"Pistoia"},"887":{"code":"PN","name":"Pordenone"},"888":{"code":"PZ","name":"Potenza"},"889":{"code":"PO","name":"Prato"},"890":{"code":"RG","name":"Ragusa"},"891":{"code":"RA","name":"Ravenna"},"892":{"code":"RC","name":"Reggio-Calabria"},"893":{"code":"RE","name":"Reggio-Emilia"},"894":{"code":"RI","name":"Rieti"},"895":{"code":"RN","name":"Rimini"},"896":{"code":"RM","name":"Roma"},"897":{"code":"RO","name":"Rovigo"},"898":{"code":"SA","name":"Salerno"},"899":{"code":"SS","name":"Sassari"},"900":{"code":"SV","name":"Savona"},"901":{"code":"SI","name":"Siena"},"902":{"code":"SR","name":"Siracusa"},"903":{"code":"SO","name":"Sondrio"},"904":{"code":"TA","name":"Taranto"},"905":{"code":"TE","name":"Teramo"},"906":{"code":"TR","name":"Terni"},"907":{"code":"TO","name":"Torino"},"908":{"code":"TP","name":"Trapani"},"909":{"code":"TN","name":"Trento"},"910":{"code":"TV","name":"Treviso"},"911":{"code":"TS","name":"Trieste"},"912":{"code":"UD","name":"Udine"},"913":{"code":"VA","name":"Varese"},"914":{"code":"VE","name":"Venezia"},"915":{"code":"VB","name":"Verbania"},"916":{"code":"VC","name":"Vercelli"},"917":{"code":"VR","name":"Verona"},"918":{"code":"VV","name":"Vibo-Valentia"},"919":{"code":"VI","name":"Vicenza"},"920":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jamaica"},"JO":{"name":"Jordan"},"JP":{"name":"Japan"},"KE":{"name":"Kenya"},"KG":{"name":"Kyrgyzstan"},"KH":{"name":"Cambodia"},"KI":{"name":"Kiribati"},"KM":{"name":"Comoros"},"KN":{"name":"St. Kitts & Nevis"},"KP":{"name":"North Korea"},"KR":{"name":"South Korea"},"KW":{"name":"Kuwait"},"KY":{"name":"Cayman Islands"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LB":{"name":"Lebanon"},"LC":{"name":"St. Lucia"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lithuania","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Latvia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"},"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"Libya"},"MA":{"name":"Morocco"},"MC":{"name":"Monaco"},"MD":{"name":"Moldova"},"ME":{"name":"Montenegro"},"MF":{"name":"St. Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"Marshall Islands"},"MK":{"name":"Macedonia"},"ML":{"name":"Mali"},"MM":{"name":"Myanmar (Burma)"},"MN":{"name":"Mongolia"},"MO":{"name":"Macau SAR China"},"MP":{"name":"Northern Mariana Islands"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritania"},"MS":{"name":"Montserrat"},"MT":{"name":"Malta"},"MU":{"name":"Mauritius"},"MV":{"name":"Maldives"},"MW":{"name":"Malawi"},"MX":{"name":"Mexico","regions":{"921":{"code":"AGU","name":"Aguascalientes"},"922":{"code":"BCN","name":"Baja California"},"923":{"code":"BCS","name":"Baja California Sur"},"924":{"code":"CAM","name":"Campeche"},"925":{"code":"CHP","name":"Chiapas"},"926":{"code":"CHH","name":"Chihuahua"},"927":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"928":{"code":"COA","name":"Coahuila"},"929":{"code":"COL","name":"Colima"},"930":{"code":"DUR","name":"Durango"},"931":{"code":"MEX","name":"Estado de M\u00e9xico"},"932":{"code":"GUA","name":"Guanajuato"},"933":{"code":"GRO","name":"Guerrero"},"934":{"code":"HID","name":"Hidalgo"},"935":{"code":"JAL","name":"Jalisco"},"936":{"code":"MIC","name":"Michoac\u00e1n"},"937":{"code":"MOR","name":"Morelos"},"938":{"code":"NAY","name":"Nayarit"},"939":{"code":"NLE","name":"Nuevo Le\u00f3n"},"940":{"code":"OAX","name":"Oaxaca"},"941":{"code":"PUE","name":"Puebla"},"942":{"code":"QUE","name":"Quer\u00e9taro"},"943":{"code":"ROO","name":"Quintana Roo"},"944":{"code":"SLP","name":"San Luis Potos\u00ed"},"945":{"code":"SIN","name":"Sinaloa"},"946":{"code":"SON","name":"Sonora"},"947":{"code":"TAB","name":"Tabasco"},"948":{"code":"TAM","name":"Tamaulipas"},"949":{"code":"TLA","name":"Tlaxcala"},"950":{"code":"VER","name":"Veracruz"},"951":{"code":"YUC","name":"Yucat\u00e1n"},"952":{"code":"ZAC","name":"Zacatecas"}}},"MY":{"name":"Malaysia"},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibia"},"NC":{"name":"New Caledonia"},"NE":{"name":"Niger"},"NF":{"name":"Norfolk Island"},"NG":{"name":"Nigeria"},"NI":{"name":"Nicaragua"},"NL":{"name":"Netherlands"},"NO":{"name":"Norway"},"NP":{"name":"Nepal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"New Zealand"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"Peru","regions":{"972":{"code":"PE-AMA","name":"Amazonas"},"973":{"code":"PE-ANC","name":"Ancash"},"974":{"code":"PE-APU","name":"Apur\u00edmac"},"975":{"code":"PE-ARE","name":"Arequipa"},"976":{"code":"PE-AYA","name":"Ayacucho"},"977":{"code":"PE-CAJ","name":"Cajamarca"},"978":{"code":"PE-CUS","name":"Cusco"},"979":{"code":"PE-CAL","name":"El Callao"},"980":{"code":"PE-HUV","name":"Huancavelica"},"981":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"982":{"code":"PE-ICA","name":"Ica"},"983":{"code":"PE-JUN","name":"Jun\u00edn"},"984":{"code":"PE-LAL","name":"La Libertad"},"985":{"code":"PE-LAM","name":"Lambayeque"},"986":{"code":"PE-LIM","name":"Lima"},"987":{"code":"PE-LOR","name":"Loreto"},"988":{"code":"PE-MDD","name":"Madre de Dios"},"989":{"code":"PE-MOQ","name":"Moquegua"},"971":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"990":{"code":"PE-PAS","name":"Pasco"},"991":{"code":"PE-PIU","name":"Piura"},"992":{"code":"PE-PUN","name":"Puno"},"993":{"code":"PE-SAM","name":"San Mart\u00edn"},"994":{"code":"PE-TAC","name":"Tacna"},"995":{"code":"PE-TUM","name":"Tumbes"},"996":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"French Polynesia"},"PG":{"name":"Papua New Guinea"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Poland","regions":{"997":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"998":{"code":"PL-04","name":"kujawsko-pomorskie"},"999":{"code":"PL-06","name":"lubelskie"},"1000":{"code":"PL-08","name":"lubuskie"},"1003":{"code":"PL-14","name":"mazowieckie"},"1002":{"code":"PL-12","name":"ma\u0142opolskie"},"1004":{"code":"PL-16","name":"opolskie"},"1005":{"code":"PL-18","name":"podkarpackie"},"1006":{"code":"PL-20","name":"podlaskie"},"1007":{"code":"PL-22","name":"pomorskie"},"1008":{"code":"PL-24","name":"\u015bl\u0105skie"},"1009":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"1010":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"1011":{"code":"PL-30","name":"wielkopolskie"},"1012":{"code":"PL-32","name":"zachodniopomorskie"},"1001":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"St. Pierre & Miquelon"},"PN":{"name":"Pitcairn Islands"},"PS":{"name":"Palestinian Territories"},"PT":{"name":"Portugal","regions":{"1013":{"code":"PT-01","name":"Aveiro"},"1014":{"code":"PT-02","name":"Beja"},"1015":{"code":"PT-03","name":"Braga"},"1016":{"code":"PT-04","name":"Bragan\u00e7a"},"1017":{"code":"PT-05","name":"Castelo Branco"},"1018":{"code":"PT-06","name":"Coimbra"},"1019":{"code":"PT-07","name":"\u00c9vora"},"1020":{"code":"PT-08","name":"Faro"},"1021":{"code":"PT-09","name":"Guarda"},"1022":{"code":"PT-10","name":"Leiria"},"1023":{"code":"PT-11","name":"Lisboa"},"1024":{"code":"PT-12","name":"Portalegre"},"1025":{"code":"PT-13","name":"Porto"},"1032":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1031":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1026":{"code":"PT-14","name":"Santar\u00e9m"},"1027":{"code":"PT-15","name":"Set\u00fabal"},"1028":{"code":"PT-16","name":"Viana do Castelo"},"1029":{"code":"PT-17","name":"Vila Real"},"1030":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palau"},"PY":{"name":"Paraguay","regions":{"954":{"code":"PY-16","name":"Alto Paraguay"},"955":{"code":"PY-10","name":"Alto Paran\u00e1"},"956":{"code":"PY-13","name":"Amambay"},"953":{"code":"PY-ASU","name":"Asunci\u00f3n"},"957":{"code":"PY-19","name":"Boquer\u00f3n"},"958":{"code":"PY-5","name":"Caaguaz\u00fa"},"959":{"code":"PY-6","name":"Caazap\u00e1"},"960":{"code":"PY-14","name":"Canindey\u00fa"},"961":{"code":"PY-11","name":"Central"},"962":{"code":"PY-1","name":"Concepci\u00f3n"},"963":{"code":"PY-3","name":"Cordillera"},"964":{"code":"PY-4","name":"Guair\u00e1"},"965":{"code":"PY-7","name":"Itap\u00faa"},"966":{"code":"PY-8","name":"Misiones"},"967":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"968":{"code":"PY-9","name":"Paraguar\u00ed"},"969":{"code":"PY-15","name":"Presidente Hayes"},"970":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"R\u00e9union"},"RO":{"name":"Romania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbia"},"RU":{"name":"Russia"},"RW":{"name":"Rwanda"},"SA":{"name":"Saudi Arabia"},"SB":{"name":"Solomon Islands"},"SC":{"name":"Seychelles"},"SD":{"name":"Sudan"},"SE":{"name":"Sweden","regions":{"1043":{"code":"SE-K","name":"Blekinge l\u00e4n"},"1044":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1046":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1045":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1047":{"code":"SE-N","name":"Hallands l\u00e4n"},"1048":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1049":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1050":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1051":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1052":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1062":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1063":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1053":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1055":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1054":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1056":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1057":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1058":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1059":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1060":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1061":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapore"},"SH":{"name":"St. Helena"},"SI":{"name":"Slovenia"},"SJ":{"name":"Svalbard & Jan Mayen"},"SK":{"name":"Slovakia"},"SL":{"name":"Sierra Leone"},"SM":{"name":"San Marino"},"SN":{"name":"Senegal"},"SO":{"name":"Somalia"},"SR":{"name":"Suriname","regions":{"1033":{"code":"SR-BR","name":"Brokopondo"},"1034":{"code":"SR-CM","name":"Commewijne"},"1035":{"code":"SR-CR","name":"Coronie"},"1036":{"code":"SR-MA","name":"Marowijne"},"1037":{"code":"SR-NI","name":"Nickerie"},"1038":{"code":"SR-PR","name":"Para"},"1039":{"code":"SR-PM","name":"Paramaribo"},"1040":{"code":"SR-SA","name":"Saramacca"},"1041":{"code":"SR-SI","name":"Sipaliwini"},"1042":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"S\u00e3o Tom\u00e9 & Pr\u00edncipe"},"SV":{"name":"El Salvador"},"SX":{"name":"Sint Maarten"},"SY":{"name":"Syria"},"SZ":{"name":"Swaziland"},"TC":{"name":"Turks & Caicos Islands"},"TD":{"name":"Chad"},"TF":{"name":"French Southern Territories"},"TG":{"name":"Togo"},"TH":{"name":"Thailand"},"TJ":{"name":"Tajikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor-Leste"},"TM":{"name":"Turkmenistan"},"TN":{"name":"Tunisia"},"TO":{"name":"Tonga"},"TR":{"name":"Turkey"},"TT":{"name":"Trinidad & Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Taiwan, Province of China"},"TZ":{"name":"Tanzania"},"UA":{"name":"Ukraine"},"UG":{"name":"Uganda"},"UM":{"name":"U.S. Outlying Islands"},"US":{"name":"United States","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AE","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AE","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AE","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"},"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"},"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"1064":{"code":"UY-AR","name":"Artigas"},"1065":{"code":"UY-CA","name":"Canelones"},"1066":{"code":"UY-CL","name":"Cerro Largo"},"1067":{"code":"UY-CO","name":"Colonia"},"1068":{"code":"UY-DU","name":"Durazno"},"1069":{"code":"UY-FS","name":"Flores"},"1070":{"code":"UY-FD","name":"Florida"},"1071":{"code":"UY-LA","name":"Lavalleja"},"1072":{"code":"UY-MA","name":"Maldonado"},"1073":{"code":"UY-MO","name":"Montevideo"},"1074":{"code":"UY-PA","name":"Paysandu"},"1075":{"code":"UY-RN","name":"R\u00edo Negro"},"1076":{"code":"UY-RV","name":"Rivera"},"1077":{"code":"UY-RO","name":"Rocha"},"1078":{"code":"UY-SA","name":"Salto"},"1079":{"code":"UY-SJ","name":"San Jos\u00e9"},"1080":{"code":"UY-SO","name":"Soriano"},"1081":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"1082":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Uzbekistan"},"VA":{"name":"Vatican City"},"VC":{"name":"St. Vincent & Grenadines"},"VE":{"name":"Venezuela","regions":{"1085":{"code":"VE-Z","name":"Amazonas"},"1086":{"code":"VE-B","name":"Anzo\u00e1tegui"},"1087":{"code":"VE-C","name":"Apure"},"1088":{"code":"VE-D","name":"Aragua"},"1089":{"code":"VE-E","name":"Barinas"},"1090":{"code":"VE-F","name":"Bol\u00edvar"},"1091":{"code":"VE-G","name":"Carabobo"},"1092":{"code":"VE-H","name":"Cojedes"},"1093":{"code":"VE-Y","name":"Delta Amacuro"},"1083":{"code":"VE-W","name":"Dependencias Federales"},"1084":{"code":"VE-A","name":"Distrito Capital"},"1094":{"code":"VE-I","name":"Falc\u00f3n"},"1095":{"code":"VE-J","name":"Gu\u00e1rico"},"1096":{"code":"VE-K","name":"Lara"},"1097":{"code":"VE-L","name":"M\u00e9rida"},"1098":{"code":"VE-M","name":"Miranda"},"1099":{"code":"VE-N","name":"Monagas"},"1100":{"code":"VE-O","name":"Nueva Esparta"},"1101":{"code":"VE-P","name":"Portuguesa"},"1102":{"code":"VE-R","name":"Sucre"},"1103":{"code":"VE-S","name":"T\u00e1chira"},"1104":{"code":"VE-T","name":"Trujillo"},"1105":{"code":"VE-X","name":"Vargas"},"1106":{"code":"VE-U","name":"Yaracuy"},"1107":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"British Virgin Islands"},"VI":{"name":"U.S. Virgin Islands"},"VN":{"name":"Vietnam"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis & Futuna"},"WS":{"name":"Samoa"},"XK":{"name":"Kosovo"},"YE":{"name":"Yemen"},"YT":{"name":"Mayotte"},"ZA":{"name":"South Africa"},"ZM":{"name":"Zambia"},"ZW":{"name":"Zimbabwe"},"data_id":1742199313},"instant-purchase":[],"loggedAsCustomer":[],"captcha":[],"persistent":[],"review":[],"wishlist":{"items":[]},"hyva_checkout":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script> </div></body> </html>