{"version":3,"file":"site-integrations.js","names":["matomoNumber","matomoNumber","matomoItems","advertisingConsentGranted","MAX_RUNTIME_ATTEMPTS","GOOGLE_CLICK_PARAMETERS","ATTRIBUTION_PARAMETER_NAMES","safely","args","callback","installAttributionNavigation","observed","current","value","name","character","decorate","target","differentGoogleClick","candidate","parameter","preserveGetFormParameters","submitted","form","submitter","controlClick","destination","action","parameters","navigation","hidden","eventName","anchor","event","decorated","input","actionOwner","actionValue","method","sameOriginRuntimeUrl","url","installEarlyProviderQueues","measurementId","config","earlyGtag","blocked","item","matomoVisitorId","matomoUserId","consent","granted","releaseProviderScripts","loader","initializeProviderBridge","runtimeRequested","runtimeAttempts","releaseRequested","delayTimer","intentEvents","removeIntentListeners","releaseOnIntent","loadRuntime","source","script","retryUrl","scheduleRuntimeRetry","delay","releaseWhenIdle","afterLoad","configured","observedComponents","visibleComponents","visibilityTimers","observedBannerSlides","visibleBannerSlides","bannerVisibilityTimers","observedFeatureViews","visibleFeatureViews","featureVisibilityTimers","featureViewEvents","track","window","details","integer","parsed","fallback","identifier","normalized","pathFor","link","document","productDetails","product","element","id","componentDetails","component","productIds","recommendationDetails","checkoutCard","actionable","sidebarCard","card","placement","recommendationAction","trackRecommendationInteraction","recommendation","elementPosition","selector","bannerDetails","slider","slide","observeComponent","componentObserver","entries","entry","bannerObserver","featureViewObserver","observeBannerSlide","observeFeatureView","scan","scope","root","setSize","bannerSlide","bannerControl","navigationContainer","area","sourceContext","mediaPosition","media","match","detail","initializeVisibilityTracking","pendingRoots","pendingScan","flush","roots","records","record","node","scheduleVisibilityTracking","start","STORAGE_KEY","MAX_ATTEMPTS","MAX_AGE_MS","createTrackingTransport","active","flushScheduled","configuration","options","readQueue","cutoff","writeQueue","queue","remove","eventId","enqueue","payload","scheduleFlush","attempts","body","beacon","transmit","response","useBeacon","preferredId","entity","createPaymentFunnelTracker","storageKey","seen","uuid","saved","definitions","events","tracked","definition","commerce","items","type","key","quantity","MAX_EVENTS","FLUSH_DELAY_MS","createRecommendationBatcher","queues","send","deliver","urgent","productId","batchId","contextToken","flushAll","BROWSER_ROUTES","STORY_EVENT_ACTIONS","numberValue","number","ecommerceItems","matomoPrimaryActionTracked","resetMatomoPrimaryActionTracked","addMatomoEcommerceItems","trackMatomoCart","total","trackMatomoPageView","configure","trackDefaultMatomoPageView","matomoStoryEventName","parts","markMatomoPrimaryActionTracked","initializeSiteIntegrations","serverTracking","configuredCurrency","trackingCurrency","pageViewId","createUuid","listContextByElement","listImpressionsByRoot","activeListImpressions","random","canonicalEventId","safeSearchTerm","term","captureServerEvent","trackingTransport","observeListImpressions","products","listRoot","listKey","category","lists","list","ids","index","parent","resetListImpressions","productElement","context","BEGIN_CHECKOUT_STORAGE_KEY","CHECKOUT_STEP_STORAGE_PREFIX","CHECKOUT_STEPS","CHECKOUT_TRACKING_PLATFORMS","checkoutContext","checkoutSignature","a","b","trackCheckoutOnce","signature","normalizeCheckoutItems","setCheckoutContext","normalizedItems","clearCheckoutStepStorage","step","platform","prepareCheckoutContext","previousSignature","trackCheckoutPlatformOnce","error","trackCheckoutStep","canonicalId","preferredEventId","optionLabel","option","normalizedOptionKey","optionKey","storageValue","googleItems","googleParameters","facebookParameters","normalizeStoryEventDetails","restoredCurrency","route","label","listId","listName","position","matomoAction","matomoEvent","eventNameValue","eventValue","matomoPageView","totalQuantity","searchTerm","query","parsedResultCount","resultCount","accumulator","currentValue","contactType","trackingEventId","addressType","shippingTier","shippingMethodCode","paymentType","paymentMethodCode","cart_total","skipMatomo","onlyMatomo","storeId","purchaseEventId","order","googleTransactionId","orderCurrency","purchaseCurrency","paymentContext","field","gaItems","gaGrossItemValue","sum","gaTargetItemValue","discountFactor","originalPrice","purchaseValue","googlePurchaseAlreadyQueued","googlePurchase","implementation","trackingFlashEventIds","queuedCalls","queuedCall"],"sources":["../../template/components/common/storefront-tracking/runtime/tracking/provider-bridge.js","../../template/components/common/storefront-tracking/runtime/tracking/behavior.js","../../template/components/common/storefront-tracking/runtime/tracking/transport.js","../../template/components/common/storefront-tracking/runtime/tracking/payment-funnel.js","../../template/components/common/storefront-tracking/runtime/tracking/recommendation-batch.js","../../template/components/common/storefront-tracking/runtime/tracking/events.js","../../template/components/common/storefront-tracking/runtime/tracking/ecommerce.js","../../template/components/common/storefront-tracking/runtime/tracking/matomo.js","../../template/components/common/storefront-tracking/runtime/site-integrations.js"],"sourcesContent":["import { advertisingConsentGranted } from './consent.js';\n\nconst MAX_RUNTIME_ATTEMPTS = 3;\nconst GOOGLE_CLICK_PARAMETERS = ['gclid', 'dclid', 'gbraid', 'wbraid'];\nconst ATTRIBUTION_PARAMETER_NAMES = [\n    'gclid',\n    'dclid',\n    'gclsrc',\n    'gbraid',\n    'wbraid',\n    'gad',\n    'gad_source',\n    'gad_campaignid',\n    'msclkid',\n    'fbclid',\n    'fb_action_ids',\n    'fb_action_types',\n    'fb_source',\n    'fb_aggregation_id',\n    '_gl',\n    '_ga',\n    'srsltid',\n    'utm_source',\n    'utm_medium',\n    'utm_campaign',\n    'utm_id',\n    'utm_content',\n    'utm_term',\n    'utm_source_platform',\n    'utm_creative_format',\n    'utm_marketing_tactic',\n];\n\nexport function safely(callback, ...args) {\n    try {\n        if (typeof callback === 'function') return callback(...args);\n    } catch {\n        /* Analytics is always subordinate to the storefront. */\n    }\n    return false;\n}\n\nfunction installAttributionNavigation() {\n    if (window.shopAttributionUrl) return;\n    const observed = new Map();\n    try {\n        const current = new URL(window.location.href);\n        ATTRIBUTION_PARAMETER_NAMES.forEach(function (name) {\n            const value = current.searchParams.get(name);\n            if (\n                value &&\n                value.length <= 2048 &&\n                !Array.from(value).some(\n                    (character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127,\n                )\n            )\n                observed.set(name, value);\n        });\n    } catch {\n        /* Optional tracking cannot interrupt the shop. */\n    }\n\n    const decorate = function (value) {\n        if (!value || observed.size === 0) return value;\n        try {\n            const target = new URL(String(value), window.location.href);\n            if (\n                target.origin !== window.location.origin ||\n                !['http:', 'https:'].includes(target.protocol) ||\n                target.username ||\n                target.password\n            )\n                return value;\n            const differentGoogleClick = GOOGLE_CLICK_PARAMETERS.some(\n                (name) =>\n                    target.searchParams.has(name) &&\n                    target.searchParams.get(name) !== observed.get(name),\n            );\n            observed.forEach(function (parameter, name) {\n                if (target.searchParams.has(name)) return;\n                if (differentGoogleClick && GOOGLE_CLICK_PARAMETERS.includes(name)) return;\n                const candidate = new URL(target.href);\n                candidate.searchParams.append(name, parameter);\n                if (candidate.href.length <= 4096) target.searchParams.append(name, parameter);\n            });\n            return target.href;\n        } catch {\n            return value;\n        }\n    };\n    window.shopAttributionUrl = decorate;\n\n    const preserveGetFormParameters = function (form, action, submitter) {\n        try {\n            const submitted = new URLSearchParams();\n            new FormData(form).forEach(function (value, name) {\n                submitted.append(name, typeof value === 'string' ? value : value.name);\n            });\n            if (submitter?.name) submitted.append(submitter.name, submitter.value);\n            const controlClick = GOOGLE_CLICK_PARAMETERS.some((name) => submitted.has(name));\n            const destination = new URL(action.href);\n            // Native GET submission replaces the action query with successful\n            // form controls. Explicit controls win over action and observed IDs.\n            destination.search = submitted.toString();\n            ATTRIBUTION_PARAMETER_NAMES.forEach(function (name) {\n                if (submitted.has(name) || (controlClick && GOOGLE_CLICK_PARAMETERS.includes(name)))\n                    return;\n                const value = action.searchParams.get(name);\n                if (value) destination.searchParams.append(name, value);\n            });\n            const parameters = new URL(decorate(destination.href)).searchParams;\n            const navigation = new URL(action.href);\n            navigation.search = submitted.toString();\n            ATTRIBUTION_PARAMETER_NAMES.forEach(function (name) {\n                if (submitted.has(name)) return;\n                const value = parameters.get(name);\n                if (!value || value.length > 2048) return;\n                // eslint-disable-next-line no-control-regex -- Intentionally reject ASCII control characters in navigation parameters.\n                if (/[\\x00-\\x1F\\x7F]/.test(value)) return;\n                const candidate = new URL(navigation.href);\n                candidate.searchParams.append(name, value);\n                if (candidate.href.length > 4096) return;\n                const hidden = document.createElement('input');\n                hidden.type = 'hidden';\n                hidden.name = name;\n                hidden.value = value;\n                hidden.setAttribute('data-shop-attribution', '1');\n                form.appendChild(hidden);\n                navigation.searchParams.append(name, value);\n            });\n        } catch {\n            /* Optional tracking cannot interrupt the shop. */\n        }\n    };\n\n    // Event delegation adds no page-load DOM scan. Decoration happens only when\n    // a visitor actually navigates, including links inserted later by AJAX.\n    ['click', 'auxclick', 'contextmenu'].forEach(function (eventName) {\n        document.addEventListener(\n            eventName,\n            function (event) {\n                try {\n                    const anchor = event.target?.closest?.('a[href]');\n                    if (!anchor || anchor.hasAttribute('download')) return;\n                    const decorated = decorate(anchor.href);\n                    if (decorated && decorated !== anchor.href) anchor.href = decorated;\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n            },\n            true,\n        );\n    });\n    document.addEventListener(\n        'submit',\n        function (event) {\n            try {\n                const form = event.target;\n                if (!form || !form.action) return;\n                // Re-evaluate each attempt: validation/AJAX may change the\n                // destination or submitter after an earlier prevented submit.\n                form.querySelectorAll('input[data-shop-attribution=\"1\"]').forEach((input) =>\n                    input.remove(),\n                );\n                const submitter = event.submitter;\n                const actionOwner = submitter?.hasAttribute('formaction') ? submitter : form;\n                const actionValue = actionOwner === form ? form.action : submitter.formAction;\n                const action = new URL(actionValue, window.location.href);\n                if (\n                    action.origin !== window.location.origin ||\n                    !['http:', 'https:'].includes(action.protocol) ||\n                    action.username ||\n                    action.password\n                )\n                    return;\n                const method = String(\n                    submitter?.hasAttribute('formmethod')\n                        ? submitter.formMethod\n                        : form.method || 'get',\n                ).toLowerCase();\n                if (method === 'get') {\n                    preserveGetFormParameters(form, action, submitter);\n                    return;\n                }\n                if (method !== 'post') return;\n                const decorated = decorate(action.href);\n                if (decorated && decorated !== action.href) {\n                    if (actionOwner === form) form.action = decorated;\n                    else submitter.formAction = decorated;\n                }\n            } catch {\n                /* Optional tracking cannot interrupt the shop. */\n            }\n        },\n        true,\n    );\n}\n\nfunction sameOriginRuntimeUrl(value) {\n    try {\n        if (typeof value !== 'string' || !value) return null;\n        const url = new URL(value, window.location.origin);\n        return url.origin === window.location.origin &&\n            /^https?:$/.test(url.protocol) &&\n            !url.username &&\n            !url.password\n            ? url.href\n            : null;\n    } catch {\n        return null;\n    }\n}\n\nfunction installEarlyProviderQueues(config) {\n    window.dataLayer = window.dataLayer || [];\n    window._paq = window._paq || [];\n    window.uetq = window.uetq || [];\n    window.__shopMetaQueue = Array.isArray(window.__shopMetaQueue) ? window.__shopMetaQueue : [];\n\n    const measurementId = /^G-[A-Z0-9]+$/i.test(config.ga4MeasurementId || '')\n        ? config.ga4MeasurementId\n        : null;\n    if (!window.gtag || !window.gtag.__shopProviderBridge) {\n        const earlyGtag = function () {\n            if (arguments[0] === 'event') {\n                const parameters = { ...(arguments[2] || {}) };\n                if (!parameters.send_to && measurementId) parameters.send_to = measurementId;\n                arguments[2] = parameters;\n                if (arguments[1] === 'purchase') {\n                    window.dataLayer.push({\n                        transaction_id: parameters.transaction_id,\n                        value: parameters.value,\n                        currency: parameters.currency,\n                    });\n                }\n            }\n            window.dataLayer.push(arguments);\n        };\n        earlyGtag.__shopProviderBridge = true;\n        window.gtag = earlyGtag;\n    }\n    if (config.enabled && measurementId && !window.__shopGoogleBlocklistConfigured) {\n        const blocked = window.dataLayer.reduce(function (value, item) {\n            return Array.isArray(item && item['gtm.blocklist']) ? item['gtm.blocklist'] : value;\n        }, []);\n        window.dataLayer.push({ 'gtm.blocklist': [...new Set([...blocked, 'gaawe'])] });\n        window.__shopGoogleBlocklistConfigured = true;\n    }\n\n    if (config.enabled && config.matomoSiteId && !window.__shopMatomoQueueConfigured) {\n        window._paq.push(['disableCookies']);\n        const matomoVisitorId = config.serverTracking?.matomoVisitorId;\n        const matomoUserId = config.serverTracking?.matomoUserId;\n        if (/^[a-f0-9]{16}$/i.test(matomoVisitorId || '')) {\n            window._paq.push(['setVisitorId', matomoVisitorId.toLowerCase()]);\n        }\n        if (typeof matomoUserId === 'string' && matomoUserId !== '') {\n            window._paq.push(['setUserId', matomoUserId]);\n        }\n        window._paq.push(['enableLinkTracking']);\n        window._paq.push(['setTrackerUrl', config.matomoEndpointUrl]);\n        window._paq.push(['setSiteId', String(config.matomoSiteId)]);\n        window.__shopMatomoQueueConfigured = true;\n    }\n    if (!window.__shopMicrosoftConsentInitialized) {\n        const consent = window.analyticsConsentState || config.initialConsent || {};\n        window.uetq.push('consent', 'default', {\n            ad_storage: consent.ad_storage === 'granted' ? 'granted' : 'denied',\n        });\n        window.__shopMicrosoftConsentInitialized = true;\n    }\n    if (typeof window.mtag !== 'function') {\n        window.mtag = function () {\n            if (arguments[0] === 'event' && !advertisingConsentGranted()) return false;\n            window.uetq.push.apply(window.uetq, arguments);\n            return true;\n        };\n    }\n    if (typeof window.fbqWrapper !== 'function') {\n        window.fbqWrapper = function () {\n            if (!advertisingConsentGranted()) {\n                window.__shopMetaQueue.length = 0;\n                return false;\n            }\n            if (arguments.length) window.__shopMetaQueue.push(arguments);\n            if (typeof window.fbq === 'function') {\n                while (window.__shopMetaQueue.length)\n                    window.fbq.apply(window, window.__shopMetaQueue.shift());\n            }\n            return true;\n        };\n    }\n\n    // Consent controls can run before the deferred provider runtime. These\n    // bridges apply revocation immediately; the runtime reads the latest state\n    // and replaces them with the full provider implementations when released.\n    window.applyAdvertisingConsent =\n        window.applyAdvertisingConsent ||\n        function (consent) {\n            const granted = Boolean(\n                consent && consent.ad_storage === 'granted' && consent.ad_user_data === 'granted',\n            );\n            if (!granted) {\n                window.__shopMetaQueue.length = 0;\n                window.uetq.length = 0;\n            }\n            window.uetq.push('consent', 'update', { ad_storage: granted ? 'granted' : 'denied' });\n        };\n    window.applyAnalyticsUserData = window.applyAnalyticsUserData || function () {};\n    window.applyClarityConsent = window.applyClarityConsent || function () {};\n    window.applyOpenPanelConsent = window.applyOpenPanelConsent || function () {};\n}\n\nfunction releaseProviderScripts() {\n    ['loadOpenPanelTracking', 'loadMatomoTracking', 'loadGoogleTagManager'].forEach(\n        function (loader) {\n            safely(window[loader]);\n        },\n    );\n}\n\nexport function initializeProviderBridge(config) {\n    installAttributionNavigation();\n    installEarlyProviderQueues(config);\n    if (!config.enabled) return;\n\n    let runtimeRequested = false;\n    let runtimeAttempts = 0;\n    let releaseRequested = false;\n    let delayTimer = null;\n    const intentEvents = ['click', 'touchend', 'keydown', 'scroll'];\n\n    function removeIntentListeners() {\n        intentEvents.forEach(function (eventName) {\n            try {\n                window.removeEventListener(eventName, releaseOnIntent, true);\n            } catch {\n                /* Optional tracking cannot interrupt the shop. */\n            }\n        });\n    }\n\n    function loadRuntime() {\n        releaseRequested = true;\n        if (window.trackingProviderRuntimeReady) {\n            releaseProviderScripts();\n            return;\n        }\n        if (runtimeRequested || runtimeAttempts >= MAX_RUNTIME_ATTEMPTS) return;\n        const source = sameOriginRuntimeUrl(config.providerRuntimeUrl);\n        if (!source) return;\n        runtimeRequested = true;\n        runtimeAttempts++;\n        try {\n            const script = document.createElement('script');\n            if (config.providerRuntimeIsModule === true) script.type = 'module';\n            script.async = true;\n            script.fetchPriority = 'low';\n            // Browsers cache failed module requests by URL. Retry only failed module\n            // loads under a fresh URL while retaining the immutable URL on success.\n            if (config.providerRuntimeIsModule === true && runtimeAttempts > 1) {\n                const retryUrl = new URL(source);\n                retryUrl.searchParams.set('__shop_provider_retry', String(runtimeAttempts));\n                script.src = retryUrl.href;\n            } else {\n                script.src = source;\n            }\n            script.onload = function () {\n                if (window.trackingProviderRuntimeReady) {\n                    if (releaseRequested) releaseProviderScripts();\n                    return;\n                }\n                runtimeRequested = false;\n                scheduleRuntimeRetry();\n            };\n            script.onerror = function () {\n                runtimeRequested = false;\n                scheduleRuntimeRetry();\n            };\n            document.head.appendChild(script);\n        } catch {\n            runtimeRequested = false;\n        }\n    }\n\n    function scheduleRuntimeRetry() {\n        if (!releaseRequested || runtimeAttempts >= MAX_RUNTIME_ATTEMPTS) return;\n        const delay = Math.min(3000, 500 * Math.pow(2, runtimeAttempts - 1));\n        try {\n            window.setTimeout(releaseWhenIdle, delay);\n        } catch {\n            /* Optional tracking cannot interrupt the shop. */\n        }\n    }\n\n    function releaseWhenIdle() {\n        try {\n            if (typeof window.requestIdleCallback === 'function') {\n                window.requestIdleCallback(loadRuntime, { timeout: 2000 });\n            } else {\n                window.setTimeout(loadRuntime, 0);\n            }\n        } catch {\n            loadRuntime();\n        }\n    }\n\n    function releaseOnIntent(event) {\n        if (event && event.isTrusted === false) return;\n        removeIntentListeners();\n        if (delayTimer !== null) {\n            try {\n                window.clearTimeout(delayTimer);\n            } catch {\n                /* Optional tracking cannot interrupt the shop. */\n            }\n        }\n        // Return from the input handler before fetching/parsing optional code.\n        try {\n            window.setTimeout(releaseWhenIdle, 0);\n        } catch {\n            releaseWhenIdle();\n        }\n    }\n\n    intentEvents.forEach(function (eventName) {\n        try {\n            window.addEventListener(eventName, releaseOnIntent, { capture: true, passive: true });\n        } catch {\n            /* Optional tracking cannot interrupt the shop. */\n        }\n    });\n\n    function afterLoad() {\n        if (config.providerAutoLoad === false) return;\n        const configured = Number(config.providerLoadDelayMs);\n        const delay = Number.isFinite(configured) ? Math.max(0, Math.min(15000, configured)) : 5000;\n        try {\n            delayTimer = window.setTimeout(releaseWhenIdle, delay);\n        } catch {\n            releaseWhenIdle();\n        }\n    }\n\n    if (!config.deferProviderScripts) {\n        removeIntentListeners();\n        loadRuntime();\n        return;\n    }\n    try {\n        if (config.providerAutoLoad !== false) {\n            if (document.readyState === 'complete') afterLoad();\n            else window.addEventListener('load', afterLoad, { once: true });\n        }\n    } catch {\n        afterLoad();\n    }\n}\n","(function (window, document) {\n    'use strict';\n\n    const observedComponents = new WeakSet();\n    const visibleComponents = new WeakSet();\n    const visibilityTimers = new WeakMap();\n    const observedBannerSlides = new WeakSet();\n    const visibleBannerSlides = new WeakSet();\n    const bannerVisibilityTimers = new WeakMap();\n    const observedFeatureViews = new WeakSet();\n    const visibleFeatureViews = new WeakSet();\n    const featureVisibilityTimers = new WeakMap();\n    const featureViewEvents = new Set(['product_reviews_viewed']);\n\n    function track(eventName, details) {\n        try {\n            if (window.analytics && typeof window.analytics.trackInteraction === 'function') {\n                return window.analytics.trackInteraction(eventName, details || {});\n            }\n        } catch {\n            // Storefront behavior is always authoritative; analytics fails open.\n        }\n        return false;\n    }\n\n    function integer(value, fallback) {\n        const parsed = parseInt(value, 10);\n        return Number.isFinite(parsed) ? parsed : fallback || 0;\n    }\n\n    function identifier(value, fallback) {\n        const normalized = `${value || ''}`.trim().slice(0, 120);\n        return /^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,119}$/.test(normalized)\n            ? normalized\n            : fallback || 'unknown';\n    }\n\n    function pathFor(link) {\n        try {\n            return new URL(link.href, document.baseURI).pathname.slice(0, 120) || '/';\n        } catch {\n            return '';\n        }\n    }\n\n    function productDetails(element) {\n        const product = element && element.closest ? element.closest('[data-product-id]') : null;\n        const id = integer(product && product.getAttribute('data-product-id'), 0);\n        return id > 0 ? { product_ids: [id], target_type: 'product', target_id: `${id}` } : {};\n    }\n\n    function componentDetails(component) {\n        if (!component) return {};\n        const productIds = new Set(\n            Array.from(component.querySelectorAll('[data-product-id]'))\n                .map((element) => element.getAttribute('data-product-id'))\n                .filter(Boolean),\n        );\n        return {\n            component_type: identifier(\n                component.dataset.analyticsComponentType || component.dataset.analyticsComponent,\n                'module',\n            ),\n            component_id: identifier(component.dataset.analyticsComponentId, 'unknown'),\n            position: integer(component.dataset.analyticsPosition, 0),\n            item_count: productIds.size,\n        };\n    }\n\n    function recommendationDetails(actionable) {\n        const checkoutCard = actionable.closest(\n            '.z-checkout-recommendation, .checkout__recommendation',\n        );\n        const sidebarCard = actionable.closest(\n            '.cart-add__recommendations [data-recommendation-batch-id]',\n        );\n        const card = checkoutCard || sidebarCard;\n        const placement =\n            checkoutCard ||\n            actionable.matches(\n                '[data-checkout-recommendation-more], .checkout__recommendations__more',\n            )\n                ? 'checkout'\n                : sidebarCard\n                  ? 'cart_add'\n                  : '';\n        if (!placement) return null;\n\n        return Object.assign(\n            {\n                placement: placement,\n                source_context:\n                    placement === 'checkout'\n                        ? 'checkout_recommendation'\n                        : 'cart_add_recommendation',\n                component_type: 'product_recommendation',\n                component_id: 'recommendation.' + placement,\n                position: integer(\n                    card && card.getAttribute('data-recommendation-display-position'),\n                    0,\n                ),\n                candidate_rank: integer(\n                    card && card.getAttribute('data-recommendation-candidate-rank'),\n                    0,\n                ),\n                is_exploration:\n                    (card && card.getAttribute('data-recommendation-is-exploration')) === '1',\n                recommendation_batch_id: identifier(\n                    card &&\n                        (card.getAttribute('data-batch-id') ||\n                            card.getAttribute('data-recommendation-batch-id')),\n                    '',\n                ),\n                recommendation_source: identifier(\n                    card && card.getAttribute('data-recommendation-source'),\n                    '',\n                ),\n            },\n            productDetails(card),\n        );\n    }\n\n    function recommendationAction(actionable) {\n        if (\n            actionable.matches(\n                '[data-checkout-recommendation-more], .checkout__recommendations__more',\n            )\n        )\n            return 'reveal_more';\n        if (\n            actionable.matches(\n                '[data-checkout-recommendation-image], .checkout__recommendation__image',\n            )\n        )\n            return 'preview_image';\n        if (\n            actionable.matches(\n                '.z-checkout-recommendation__info-icon, .checkout__recommendation__info-icon',\n            )\n        )\n            return 'view_shipping_info';\n        if (\n            actionable.matches(\n                '[data-checkout-recommendation-add], .checkout__recommendation__add, .cart-add',\n            )\n        )\n            return 'add_to_cart';\n        if (actionable.matches('.splide__arrow, .splide__pagination__page')) return 'browse_images';\n        if (actionable.matches('a[href]')) return 'select_product';\n        return 'activate';\n    }\n\n    function trackRecommendationInteraction(event) {\n        try {\n            const actionable =\n                event.target && event.target.closest\n                    ? event.target.closest('a, button, [role=\"button\"], input[type=\"submit\"]')\n                    : null;\n            if (!actionable) return;\n            const recommendation = recommendationDetails(actionable);\n            if (!recommendation) return;\n            track(\n                'recommendation_interaction',\n                Object.assign(\n                    {\n                        action: recommendationAction(actionable),\n                        item_count: actionable.matches(\n                            '[data-checkout-recommendation-more], .checkout__recommendations__more',\n                        )\n                            ? document.querySelectorAll(\n                                  '#checkout-recommendations .z-checkout-recommendation--additional[hidden], #checkout-recommendations .checkout__recommendation--additional[hidden]',\n                              ).length\n                            : undefined,\n                        target_path: actionable.matches('a[href]') ? pathFor(actionable) : '',\n                    },\n                    recommendation,\n                ),\n            );\n        } catch {\n            // Capturing recommendation intent must never alter the customer action.\n        }\n    }\n\n    function elementPosition(element, selector) {\n        if (!element || !element.parentElement) return 0;\n        return (\n            Array.from(element.parentElement.children)\n                .filter(function (candidate) {\n                    return !selector || candidate.matches(selector);\n                })\n                .indexOf(element) + 1\n        );\n    }\n\n    function bannerDetails(slide) {\n        const slider =\n            slide && slide.closest\n                ? slide.closest('.banner-slider, .slideshow-slider, .carousel-slider')\n                : null;\n        const component =\n            slider && slider.closest ? slider.closest('[data-analytics-component]') : null;\n        return Object.assign(\n            {\n                feature: 'storefront_banner',\n                source_context: 'storefront_banner',\n                source_id: identifier(slider && slider.id, 'banner'),\n                media_position: elementPosition(\n                    slide,\n                    '.splide__slide:not(.is-clone):not(.splide__slide--clone)',\n                ),\n                media_type:\n                    slide && slide.hasAttribute('data-splide-html-video') ? 'video' : 'image',\n            },\n            componentDetails(component),\n        );\n    }\n\n    function observeComponent(component) {\n        if (!component || observedComponents.has(component)) return;\n        // Migrated Zirbelino pages own their module impressions. Keep this\n        // observer for the legacy theme and candidate pages using legacy markup.\n        if (document.body && document.body.classList.contains('zirbelino-page--migrated')) return;\n        observedComponents.add(component);\n        if (!('IntersectionObserver' in window)) return;\n        componentObserver.observe(component);\n    }\n\n    const componentObserver =\n        'IntersectionObserver' in window\n            ? new IntersectionObserver(\n                  function (entries) {\n                      entries.forEach(function (entry) {\n                          const component = entry.target;\n                          if (entry.isIntersecting && entry.intersectionRatio >= 0.25) {\n                              if (\n                                  visibilityTimers.has(component) ||\n                                  visibleComponents.has(component)\n                              )\n                                  return;\n                              visibilityTimers.set(\n                                  component,\n                                  window.setTimeout(function () {\n                                      visibilityTimers.delete(component);\n                                      if (visibleComponents.has(component)) return;\n                                      visibleComponents.add(component);\n                                      componentObserver.unobserve(component);\n                                      track(\n                                          'feature_impression',\n                                          Object.assign(\n                                              {\n                                                  source_context: 'storefront_module',\n                                                  action: 'view',\n                                              },\n                                              componentDetails(component),\n                                          ),\n                                      );\n                                  }, 500),\n                              );\n                          } else if (visibilityTimers.has(component)) {\n                              window.clearTimeout(visibilityTimers.get(component));\n                              visibilityTimers.delete(component);\n                          }\n                      });\n                  },\n                  { threshold: [0.25] },\n              )\n            : null;\n\n    const bannerObserver =\n        'IntersectionObserver' in window\n            ? new IntersectionObserver(\n                  function (entries) {\n                      entries.forEach(function (entry) {\n                          const slide = entry.target;\n                          if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {\n                              if (\n                                  bannerVisibilityTimers.has(slide) ||\n                                  visibleBannerSlides.has(slide)\n                              )\n                                  return;\n                              bannerVisibilityTimers.set(\n                                  slide,\n                                  window.setTimeout(function () {\n                                      bannerVisibilityTimers.delete(slide);\n                                      if (visibleBannerSlides.has(slide)) return;\n                                      visibleBannerSlides.add(slide);\n                                      bannerObserver.unobserve(slide);\n                                      track(\n                                          'banner_impression',\n                                          Object.assign({ action: 'view' }, bannerDetails(slide)),\n                                      );\n                                  }, 500),\n                              );\n                          } else if (bannerVisibilityTimers.has(slide)) {\n                              window.clearTimeout(bannerVisibilityTimers.get(slide));\n                              bannerVisibilityTimers.delete(slide);\n                          }\n                      });\n                  },\n                  { threshold: [0.5] },\n              )\n            : null;\n\n    const featureViewObserver =\n        'IntersectionObserver' in window\n            ? new IntersectionObserver(\n                  function (entries) {\n                      entries.forEach(function (entry) {\n                          const element = entry.target;\n                          if (entry.isIntersecting && entry.intersectionRatio >= 0.25) {\n                              if (\n                                  featureVisibilityTimers.has(element) ||\n                                  visibleFeatureViews.has(element)\n                              )\n                                  return;\n                              featureVisibilityTimers.set(\n                                  element,\n                                  window.setTimeout(function () {\n                                      featureVisibilityTimers.delete(element);\n                                      if (visibleFeatureViews.has(element)) return;\n                                      visibleFeatureViews.add(element);\n                                      featureViewObserver.unobserve(element);\n                                      const eventName = identifier(element.dataset.analyticsView);\n                                      if (!featureViewEvents.has(eventName)) return;\n                                      track(\n                                          eventName,\n                                          Object.assign(\n                                              {\n                                                  action: 'view',\n                                                  source_context: identifier(\n                                                      element.dataset.analyticsSource,\n                                                      'product_detail',\n                                                  ),\n                                              },\n                                              productDetails(element),\n                                          ),\n                                      );\n                                  }, 500),\n                              );\n                          } else if (featureVisibilityTimers.has(element)) {\n                              window.clearTimeout(featureVisibilityTimers.get(element));\n                              featureVisibilityTimers.delete(element);\n                          }\n                      });\n                  },\n                  { threshold: [0.25] },\n              )\n            : null;\n\n    function observeBannerSlide(slide) {\n        if (\n            !slide ||\n            observedBannerSlides.has(slide) ||\n            slide.matches('.is-clone, .splide__slide--clone') ||\n            slide.closest('.banner-slider--thumb')\n        )\n            return;\n        observedBannerSlides.add(slide);\n        if (bannerObserver) bannerObserver.observe(slide);\n    }\n\n    function observeFeatureView(element) {\n        if (!element || observedFeatureViews.has(element)) return;\n        observedFeatureViews.add(element);\n        if (featureViewObserver) featureViewObserver.observe(element);\n    }\n\n    function scan(root) {\n        try {\n            const scope = root && root.querySelectorAll ? root : document;\n            if (root && root.matches && root.matches('[data-analytics-component]'))\n                observeComponent(root);\n            scope.querySelectorAll('[data-analytics-component]').forEach(observeComponent);\n            if (root && root.matches && root.matches('[data-analytics-view]'))\n                observeFeatureView(root);\n            scope.querySelectorAll('[data-analytics-view]').forEach(observeFeatureView);\n            if (\n                root &&\n                root.matches &&\n                root.matches(\n                    '.banner-slider .splide__slide, .slideshow-slider .splide__slide, .carousel-slider .splide__slide',\n                )\n            )\n                observeBannerSlide(root);\n            scope\n                .querySelectorAll(\n                    '.banner-slider:not(.banner-slider--thumb) .splide__slide, .slideshow-slider .splide__slide, .carousel-slider .splide__slide',\n                )\n                .forEach(observeBannerSlide);\n        } catch {\n            // Optional behavioral analytics must not affect rendering.\n        }\n    }\n\n    document.addEventListener(\n        'click',\n        function (event) {\n            try {\n                const target = event.target && event.target.closest ? event.target : null;\n                if (!target) return;\n\n                const setSize = target.closest('.set-sizes .set-size');\n                if (setSize) {\n                    track(\n                        'product_set_size_selected',\n                        Object.assign(\n                            {\n                                action: 'select',\n                                source_context: 'product_detail',\n                                quantity: integer(setSize.dataset.quantity, 0),\n                                position: elementPosition(\n                                    setSize.closest('.splide__slide'),\n                                    '.splide__slide:not(.is-clone):not(.splide__slide--clone)',\n                                ),\n                            },\n                            productDetails(setSize),\n                        ),\n                    );\n                }\n\n                if (\n                    target.closest(\n                        '.close_menu, [data-mobile-menu-close], #megamenu-overlay .flyout-sidebar__close, #megamenu-overlay [data-dismiss=\"flyout-sidebar\"]',\n                    )\n                ) {\n                    track('navigation_click', {\n                        navigation_area: 'mega_menu',\n                        action: 'close_menu',\n                        source_context: 'mobile_navigation',\n                    });\n                }\n\n                const actionable = target.closest(\n                    'a, button, [role=\"button\"], input[type=\"submit\"]',\n                );\n                if (!actionable) return;\n\n                const bannerSlide = actionable.closest(\n                    '.banner-slider .splide__slide, .slideshow-slider .splide__slide, .carousel-slider .splide__slide',\n                );\n                if (bannerSlide) {\n                    track(\n                        'banner_interaction',\n                        Object.assign(\n                            {\n                                action: actionable.matches('a[href]') ? 'select' : 'control',\n                                target_path: actionable.matches('a[href]')\n                                    ? pathFor(actionable)\n                                    : '',\n                            },\n                            bannerDetails(bannerSlide),\n                        ),\n                    );\n                } else {\n                    const bannerControl = actionable.closest(\n                        '.banner-slider, .slideshow-slider, .carousel-slider',\n                    );\n                    if (\n                        bannerControl &&\n                        actionable.matches('.splide__arrow, .splide__pagination__page')\n                    ) {\n                        const component = bannerControl.closest('[data-analytics-component]');\n                        track(\n                            'banner_interaction',\n                            Object.assign(\n                                {\n                                    feature: 'storefront_banner',\n                                    source_context: 'storefront_banner',\n                                    source_id: identifier(bannerControl.id, 'banner'),\n                                    action: actionable.matches('.splide__arrow--prev')\n                                        ? 'previous'\n                                        : actionable.matches('.splide__arrow--next')\n                                          ? 'next'\n                                          : 'select_page',\n                                },\n                                componentDetails(component),\n                            ),\n                        );\n                    }\n                }\n\n                const component = actionable.closest('[data-analytics-component]');\n                if (\n                    component &&\n                    !actionable.matches('.cart-add, .cart-buy, [onclick*=\"wishlist.add\"]')\n                ) {\n                    const product = productDetails(actionable);\n                    track(\n                        'feature_interaction',\n                        Object.assign(\n                            {\n                                source_context: 'storefront_module',\n                                action: product.target_id ? 'select_product' : 'activate',\n                                target_path: actionable.matches('a[href]')\n                                    ? pathFor(actionable)\n                                    : '',\n                            },\n                            componentDetails(component),\n                            product,\n                        ),\n                    );\n                }\n\n                const link = actionable.closest('a[href]');\n                const navigationContainer = actionable.closest(\n                    'header, footer, .mobile_sub_menu, .appointment-link, .known-from, .megamenu, #megamenu-overlay',\n                );\n                if (link && navigationContainer && !link.closest('#autocomplete')) {\n                    let area = 'navigation';\n                    if (link.closest('.header__mobile_menu')) area = 'mobile_navigation';\n                    else if (link.closest('.header__sub-menu')) area = 'header_sub_menu';\n                    else if (link.closest('.megamenu, #megamenu-overlay')) area = 'mega_menu';\n                    else if (navigationContainer.matches('header')) area = 'header';\n                    else if (navigationContainer.matches('footer')) area = 'footer';\n                    else if (navigationContainer.matches('.appointment-link')) area = 'appointment';\n                    else if (navigationContainer.matches('.known-from')) area = 'press_reference';\n                    else if (navigationContainer.matches('.mobile_sub_menu'))\n                        area = 'mobile_shortcuts';\n                    track('navigation_click', {\n                        navigation_area: area,\n                        action: link.matches('[data-target=\"#megamenu-overlay\"], #menu-bar-sm')\n                            ? 'open_menu'\n                            : 'select',\n                        target_path: pathFor(link),\n                        is_external: link.origin !== window.location.origin,\n                        position:\n                            Array.prototype.indexOf.call(\n                                link.parentElement ? link.parentElement.children : [],\n                                link,\n                            ) + 1,\n                    });\n                }\n                if (\n                    !link &&\n                    actionable.matches('.megamenu a, #megamenu-overlay a, .header__sub-menu a')\n                ) {\n                    track('navigation_click', {\n                        navigation_area: actionable.closest('.header__sub-menu')\n                            ? 'header_sub_menu'\n                            : 'mega_menu',\n                        action: 'expand_submenu',\n                        source_context:\n                            window.innerWidth <= 980 ? 'mobile_navigation' : 'desktop_navigation',\n                    });\n                }\n\n                if (actionable.matches('.cart-add, .cart-buy')) {\n                    let sourceContext = 'product_list';\n                    if (actionable.closest('[data-recommendation-batch-id], .products_related'))\n                        sourceContext = 'recommendation';\n                    else if (\n                        actionable.closest('#product-product') &&\n                        !actionable.closest('.product-list')\n                    )\n                        sourceContext = 'product_detail';\n                    const component = actionable.closest('[data-analytics-component]');\n                    track(\n                        'product_purchase_action',\n                        Object.assign(\n                            {\n                                action: actionable.matches('.cart-buy') ? 'buy_now' : 'add_to_cart',\n                                source_context: sourceContext,\n                            },\n                            componentDetails(component),\n                            productDetails(actionable),\n                        ),\n                    );\n                }\n\n                if (actionable.matches('#video-thumbnail-slider .splide__slide')) {\n                    track(\n                        'product_video_opened',\n                        Object.assign(\n                            {\n                                action: 'open',\n                                source_context: 'product_detail',\n                                media_type: identifier(actionable.dataset.mimeType, 'video'),\n                                media_position: integer(actionable.dataset.index, 0) + 1,\n                            },\n                            productDetails(actionable),\n                        ),\n                    );\n                }\n\n                if (actionable.matches('[data-product-download], .aplayer--downloads a[href]')) {\n                    track(\n                        'product_download_clicked',\n                        Object.assign(\n                            {\n                                action: 'download',\n                                source_context: 'product_detail',\n                                media_type: identifier(actionable.dataset.downloadType, 'download'),\n                                media_position: integer(actionable.dataset.downloadPosition, 0),\n                            },\n                            productDetails(actionable),\n                        ),\n                    );\n                }\n\n                if (actionable.matches('.products_related__block__link')) {\n                    track(\n                        'product_related_selected',\n                        Object.assign(\n                            {\n                                action: 'select',\n                                source_context: 'pdp_also_bought',\n                                position: elementPosition(\n                                    actionable.closest('.splide__slide'),\n                                    '.splide__slide:not(.is-clone):not(.splide__slide--clone)',\n                                ),\n                            },\n                            productDetails(actionable),\n                        ),\n                    );\n                }\n\n                if (actionable.matches('.product-show-price-history')) {\n                    track('product_price_history_opened', productDetails(actionable));\n                } else if (actionable.matches('#product-designer-button')) {\n                    track(\n                        'product_designer_opened',\n                        Object.assign(\n                            { source_context: 'product_detail' },\n                            productDetails(actionable),\n                        ),\n                    );\n                } else if (actionable.matches('.product-notify-trigger')) {\n                    track(\n                        'stock_notification_opened',\n                        Object.assign(\n                            { source_context: 'product_detail' },\n                            productDetails(actionable),\n                        ),\n                    );\n                } else if (\n                    actionable.matches(\n                        '[data-target=\"#product-review-overlay\"], .product-list__stars.rating--with-popup, .rating.rating--with-popup',\n                    )\n                ) {\n                    track('product_review_opened', productDetails(actionable));\n                } else if (actionable.closest('#product-slider-wrapper')) {\n                    const slide = actionable.closest('.splide__slide');\n                    const mediaPosition = slide\n                        ? Array.prototype.indexOf.call(slide.parentElement.children, slide) + 1\n                        : 0;\n                    track(\n                        'product_media_viewed',\n                        Object.assign(\n                            {\n                                interaction_type: actionable.matches('.splide__arrow--prev')\n                                    ? 'previous'\n                                    : actionable.matches('.splide__arrow--next')\n                                      ? 'next'\n                                      : 'open_or_select',\n                                media_position: mediaPosition,\n                            },\n                            productDetails(actionable),\n                        ),\n                    );\n                } else if (\n                    actionable.matches('.product-switch-grid-view, .product-switch-list-view')\n                ) {\n                    track('catalog_view_changed', {\n                        view_mode: actionable.matches('.product-switch-grid-view')\n                            ? 'grid'\n                            : 'list',\n                    });\n                } else if (\n                    actionable.matches(\n                        '.tf-filter-trigger-secondary, #button-filter, .tf_search_item',\n                    )\n                ) {\n                    track('catalog_filter_changed', {\n                        action: actionable.matches('#button-filter')\n                            ? 'apply'\n                            : actionable.matches('.tf_search_item')\n                              ? 'quick_filter'\n                              : 'open',\n                        filter_count: document.querySelectorAll(\n                            'input[name^=\"filter\"]:checked, .tf-filter input:checked',\n                        ).length,\n                    });\n                } else if (actionable.matches('.load-more-button')) {\n                    track('feature_interaction', {\n                        feature: 'catalog_pagination',\n                        action: 'load_more',\n                        source_context: 'product_list',\n                    });\n                } else if (\n                    actionable.matches(\n                        '.age_verification__button--above, .product-list__age-verification__button--above, .category-list__age-verification__button--above',\n                    )\n                ) {\n                    track(\n                        'feature_interaction',\n                        Object.assign(\n                            { feature: 'age_verification', action: 'accepted' },\n                            productDetails(actionable),\n                        ),\n                    );\n                } else if (\n                    actionable.matches(\n                        '.age_verification__button--below, .product-list__age-verification__button--below, .category-list__age-verification__button--below',\n                    )\n                ) {\n                    track(\n                        'feature_interaction',\n                        Object.assign(\n                            { feature: 'age_verification', action: 'rejected' },\n                            productDetails(actionable),\n                        ),\n                    );\n                }\n            } catch {\n                // Never interrupt the click or its default navigation.\n            }\n        },\n        true,\n    );\n\n    document.addEventListener('click', trackRecommendationInteraction, true);\n\n    document.addEventListener(\n        'play',\n        function (event) {\n            try {\n                const media = event.target;\n                if (\n                    !media ||\n                    !media.matches ||\n                    !media.matches('#aplayer audio, #product-product .aplayer audio')\n                )\n                    return;\n                track(\n                    'product_audio_started',\n                    Object.assign(\n                        {\n                            action: 'play',\n                            source_context: 'product_detail',\n                            media_type: 'audio',\n                        },\n                        productDetails(media),\n                    ),\n                );\n            } catch {\n                // Media playback is authoritative; analytics is optional.\n            }\n        },\n        true,\n    );\n\n    document.addEventListener(\n        'play',\n        function (event) {\n            try {\n                const media = event.target;\n                if (\n                    !media ||\n                    !media.matches ||\n                    !media.matches('#product-product video, video[data-product-video]')\n                )\n                    return;\n                track(\n                    'product_video_started',\n                    Object.assign(\n                        {\n                            action: 'play',\n                            source_context: 'product_detail',\n                            media_type: 'video',\n                            media_position: integer(media.dataset.videoPosition, 0),\n                        },\n                        productDetails(media),\n                    ),\n                );\n            } catch {\n                // Video playback is authoritative; analytics is optional.\n            }\n        },\n        true,\n    );\n\n    document.addEventListener(\n        'ended',\n        function (event) {\n            try {\n                const media = event.target;\n                if (!media || !media.matches) return;\n                if (media.matches('#aplayer audio, #product-product .aplayer audio')) {\n                    track(\n                        'product_audio_completed',\n                        Object.assign(\n                            {\n                                action: 'complete',\n                                source_context: 'product_detail',\n                                media_type: 'audio',\n                            },\n                            productDetails(media),\n                        ),\n                    );\n                } else if (media.matches('#product-product video, video[data-product-video]')) {\n                    track(\n                        'product_video_completed',\n                        Object.assign(\n                            {\n                                action: 'complete',\n                                source_context: 'product_detail',\n                                media_type: 'video',\n                                media_position: integer(media.dataset.videoPosition, 0),\n                            },\n                            productDetails(media),\n                        ),\n                    );\n                }\n            } catch {\n                // Media completion must not affect the player.\n            }\n        },\n        true,\n    );\n\n    document.addEventListener(\n        'change',\n        function (event) {\n            try {\n                const input = event.target;\n                if (!input || !input.matches) return;\n                if (input.matches('#input-sort')) {\n                    const value = `${input.value || ''}`;\n                    const parsed = new URL(value, document.baseURI).searchParams;\n                    track('catalog_sort_changed', {\n                        sort_order: identifier(\n                            [parsed.get('sort'), parsed.get('order')].filter(Boolean).join(':'),\n                            'selected',\n                        ),\n                    });\n                } else if (input.matches('#input-limit')) {\n                    track('catalog_filter_changed', {\n                        filter_name: 'page_limit',\n                        page_size: integer(input.value, 0),\n                    });\n                } else if (\n                    input.closest('#product') &&\n                    /^option\\[\\d+\\]/.test(input.name || '') &&\n                    input.type !== 'text' &&\n                    input.type !== 'file'\n                ) {\n                    const match = `${input.name}`.match(/\\d+/);\n                    track(\n                        'product_option_selected',\n                        Object.assign(\n                            {\n                                option_id: match ? match[0] : 'unknown',\n                                option_type: identifier(\n                                    input.type || input.tagName.toLowerCase(),\n                                    'unknown',\n                                ),\n                            },\n                            productDetails(input),\n                        ),\n                    );\n                } else if (\n                    input.matches(\n                        '.quantity-wrapper:not(.quantity-wrapper--cart) input, .quantity-selector input',\n                    )\n                ) {\n                    track(\n                        'product_quantity_changed',\n                        Object.assign({ quantity: integer(input.value, 0) }, productDetails(input)),\n                    );\n                } else if (\n                    input.matches('input[name^=\"filter\"], .tf-filter input, .tf-filter select')\n                ) {\n                    track('catalog_filter_changed', {\n                        action: 'change',\n                        filter_name: identifier(input.name, 'catalog_filter'),\n                        filter_count: document.querySelectorAll(\n                            'input[name^=\"filter\"]:checked, .tf-filter input:checked',\n                        ).length,\n                    });\n                }\n            } catch {\n                // Never interrupt form state changes.\n            }\n        },\n        true,\n    );\n\n    document.addEventListener('shop:search-analytics', function (event) {\n        try {\n            const detail = event.detail && typeof event.detail === 'object' ? event.detail : {};\n            track(\n                identifier(detail.event_name),\n                Object.assign(\n                    {\n                        source_context: 'autocomplete',\n                        search_provider: 'algolia',\n                        is_autocomplete: true,\n                    },\n                    detail.properties && typeof detail.properties === 'object'\n                        ? detail.properties\n                        : {},\n                ),\n            );\n        } catch {\n            // Search remains fully functional if the analytics bridge fails.\n        }\n    });\n\n    function initializeVisibilityTracking() {\n        try {\n            if ('MutationObserver' in window) {\n                const pendingRoots = new Set();\n                let pendingScan = false;\n                const flush = function () {\n                    pendingScan = false;\n                    const roots = Array.from(pendingRoots);\n                    pendingRoots.clear();\n                    roots.forEach(scan);\n                };\n                new MutationObserver(function (records) {\n                    records.forEach(function (record) {\n                        record.addedNodes.forEach(function (node) {\n                            if (node.nodeType === 1) pendingRoots.add(node);\n                        });\n                    });\n                    if (!pendingRoots.size || pendingScan) return;\n                    pendingScan = true;\n                    if (typeof window.requestIdleCallback === 'function') {\n                        window.requestIdleCallback(flush, { timeout: 1000 });\n                    } else {\n                        window.setTimeout(flush, 0);\n                    }\n                }).observe(document.documentElement, { childList: true, subtree: true });\n            }\n            scan(document);\n        } catch {\n            // Visibility analytics is optional and must not affect rendering.\n        }\n    }\n\n    function scheduleVisibilityTracking() {\n        const start = function () {\n            try {\n                if (typeof window.requestIdleCallback === 'function') {\n                    window.requestIdleCallback(initializeVisibilityTracking, { timeout: 2000 });\n                } else {\n                    window.setTimeout(initializeVisibilityTracking, 0);\n                }\n            } catch {\n                initializeVisibilityTracking();\n            }\n        };\n        const configured = Number(window.siteIntegrationsConfig?.visibilityTrackingDelayMs);\n        const delay = Number.isFinite(configured) ? Math.max(0, Math.min(15000, configured)) : 3000;\n        try {\n            window.setTimeout(start, delay);\n        } catch {\n            start();\n        }\n    }\n\n    try {\n        if (document.readyState === 'complete') scheduleVisibilityTracking();\n        else window.addEventListener('load', scheduleVisibilityTracking, { once: true });\n    } catch {\n        scheduleVisibilityTracking();\n    }\n})(window, document);\n","const STORAGE_KEY = 'shop.analytics.outbox.v1';\nconst MAX_EVENTS = 40;\nconst MAX_ATTEMPTS = 3;\nconst MAX_AGE_MS = 15 * 60 * 1000;\n\n/**\n * Best-effort first-party event transport.\n *\n * Calls never wait for delivery. Failed fetches are retried from a bounded,\n * tab-scoped queue with the original canonical ID, so the server can dedupe.\n */\nexport function createTrackingTransport(window, options) {\n    const active = new Set();\n    let flushScheduled = false;\n\n    function configuration() {\n        try {\n            const value =\n                typeof options.configuration === 'function'\n                    ? options.configuration()\n                    : options.configuration;\n            return value && value.endpoint && value.token ? value : null;\n        } catch {\n            return null;\n        }\n    }\n\n    function readQueue() {\n        try {\n            const parsed = JSON.parse(window.sessionStorage.getItem(STORAGE_KEY) || '[]');\n            if (!Array.isArray(parsed)) return [];\n            const cutoff = Date.now() - MAX_AGE_MS;\n            return parsed\n                .filter(function (entry) {\n                    return (\n                        entry &&\n                        typeof entry === 'object' &&\n                        entry.queuedAt >= cutoff &&\n                        entry.attempts >= 0 &&\n                        entry.attempts < MAX_ATTEMPTS &&\n                        entry.payload &&\n                        typeof entry.payload.event_id === 'string'\n                    );\n                })\n                .slice(-MAX_EVENTS);\n        } catch {\n            return [];\n        }\n    }\n\n    function writeQueue(queue) {\n        try {\n            if (queue.length) {\n                window.sessionStorage.setItem(\n                    STORAGE_KEY,\n                    JSON.stringify(queue.slice(-MAX_EVENTS)),\n                );\n            } else {\n                window.sessionStorage.removeItem(STORAGE_KEY);\n            }\n        } catch {\n            // Storage limits/privacy modes must never escape into shop behavior.\n        }\n    }\n\n    function remove(eventId) {\n        writeQueue(\n            readQueue().filter(function (entry) {\n                return entry.payload.event_id !== eventId;\n            }),\n        );\n    }\n\n    function enqueue(payload, attempts = 0) {\n        try {\n            const queue = readQueue().filter(function (entry) {\n                return entry.payload.event_id !== payload.event_id;\n            });\n            queue.push({ payload: payload, attempts: attempts, queuedAt: Date.now() });\n            writeQueue(queue);\n            scheduleFlush(Math.min(5000, 750 * Math.pow(2, attempts)));\n        } catch {\n            // Collection remains optional.\n        }\n    }\n\n    function body(payload, config) {\n        return JSON.stringify(Object.assign({ token: config.token }, payload));\n    }\n\n    function beacon(payload, config) {\n        try {\n            return (\n                typeof window.navigator.sendBeacon === 'function' &&\n                window.navigator.sendBeacon(\n                    config.endpoint,\n                    new Blob([body(payload, config)], { type: 'application/json' }),\n                ) === true\n            );\n        } catch {\n            return false;\n        }\n    }\n\n    function transmit(payload, attempts = 0) {\n        const config = configuration();\n        if (!config || active.has(payload.event_id)) return false;\n        active.add(payload.event_id);\n        try {\n            if (typeof window.fetch !== 'function') {\n                active.delete(payload.event_id);\n                if (!beacon(payload, config)) enqueue(payload, attempts);\n                return true;\n            }\n            Promise.resolve(\n                window.fetch(config.endpoint, {\n                    method: 'POST',\n                    headers: { 'Content-Type': 'application/json' },\n                    body: body(payload, config),\n                    credentials: 'same-origin',\n                    keepalive: true,\n                }),\n            )\n                .then(function (response) {\n                    // Drain the small acknowledgement body so keepalive fetches release\n                    // their stream/connection. Delivery is still acknowledged from headers;\n                    // a body-read failure must not retry an already accepted event.\n                    try {\n                        if (response && typeof response.arrayBuffer === 'function') {\n                            Promise.resolve(response.arrayBuffer()).catch(function () {});\n                        }\n                    } catch {\n                        /* Optional response cleanup never affects collection. */\n                    }\n                    active.delete(payload.event_id);\n                    if (response && response.ok) {\n                        remove(payload.event_id);\n                        return;\n                    }\n                    // Validation/authentication errors are permanent for this payload.\n                    if (response && response.status >= 400 && response.status < 500) {\n                        remove(payload.event_id);\n                        return;\n                    }\n                    enqueue(payload, attempts);\n                })\n                .catch(function () {\n                    active.delete(payload.event_id);\n                    enqueue(payload, attempts);\n                });\n            return true;\n        } catch {\n            active.delete(payload.event_id);\n            if (!beacon(payload, config)) enqueue(payload, attempts);\n            return false;\n        }\n    }\n\n    function flush(useBeacon = false) {\n        const config = configuration();\n        if (!config) return;\n        const queue = readQueue();\n        if (!queue.length) return;\n        writeQueue([]);\n        queue.forEach(function (entry) {\n            const attempts = entry.attempts + 1;\n            if (useBeacon && beacon(entry.payload, config)) return;\n            if (attempts < MAX_ATTEMPTS) transmit(entry.payload, attempts);\n        });\n    }\n\n    function scheduleFlush(delay = 0) {\n        if (flushScheduled) return;\n        flushScheduled = true;\n        try {\n            window.setTimeout(function () {\n                flushScheduled = false;\n                flush();\n            }, delay);\n        } catch {\n            flushScheduled = false;\n        }\n    }\n\n    try {\n        window.addEventListener('online', function () {\n            scheduleFlush();\n        });\n        window.addEventListener('pagehide', function () {\n            flush(true);\n        });\n    } catch {\n        // Lifecycle hooks are an optimization, never a storefront dependency.\n    }\n    scheduleFlush();\n\n    return {\n        capture: function (eventName, entity, preferredId) {\n            try {\n                const eventId = options.eventId(preferredId);\n                const payload = {\n                    event_id: eventId,\n                    event_name: `${eventName}`,\n                    page_view_id:\n                        typeof options.pageViewId === 'function'\n                            ? options.pageViewId()\n                            : options.pageViewId,\n                    entity: entity && typeof entity === 'object' ? entity : {},\n                };\n                transmit(payload);\n                return eventId;\n            } catch {\n                // Even malformed host configuration cannot escape into an interaction.\n                return null;\n            }\n        },\n        flush: flush,\n    };\n}\n","// Express does not visit the regular checkout. These milestones carry the\n// server's validated quote and canonical IDs, never the page's unrelated cart.\nexport function createPaymentFunnelTracker(window) {\n    const storageKey = 'analytics.paymentFunnel.events';\n    const seen = new Set();\n    const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n    try {\n        const saved = JSON.parse(window.sessionStorage.getItem(storageKey) || '[]');\n        if (Array.isArray(saved))\n            saved\n                .slice(-100)\n                .filter((id) => uuid.test(id))\n                .forEach((id) => seen.add(id));\n    } catch {\n        /* Optional tracking cannot interrupt the shop. */\n    }\n    const definitions = {\n        begin_checkout: ['Express started', 'InitiateCheckout', 'track'],\n        add_payment_info: ['Payment details submitted', 'AddPaymentInfo', 'track'],\n        checkout_submit: ['Order submitted', 'CheckoutSubmit', 'trackCustom'],\n    };\n    const safely = (callback) => {\n        try {\n            callback();\n        } catch {\n            /* Optional tracking cannot interrupt the shop. */\n        }\n    };\n\n    return function trackPaymentFunnel(events) {\n        if (!Array.isArray(events)) return false;\n        let tracked = false;\n        events.slice(0, 3).forEach((event) => {\n            const definition = definitions[event?.event_name];\n            const id = String(event?.event_id || '').toLowerCase();\n            const commerce = event?.ecommerce;\n            if (\n                !definition ||\n                !uuid.test(id) ||\n                seen.has(id) ||\n                !commerce ||\n                commerce.currency !== 'EUR' ||\n                !Number.isFinite(Number(commerce.value)) ||\n                Number(commerce.value) < 0 ||\n                !['stripe', 'paypal'].includes(commerce.payment_provider) ||\n                !['product_express', 'checkout_express'].includes(commerce.source_context)\n            )\n                return;\n\n            const items = (Array.isArray(commerce.items) ? commerce.items : []).filter(\n                (item) =>\n                    Number.isInteger(Number(item.product_id)) &&\n                    Number(item.product_id) > 0 &&\n                    Number.isInteger(Number(item.quantity)) &&\n                    Number(item.quantity) > 0 &&\n                    Number.isFinite(Number(item.price)) &&\n                    Number(item.price) >= 0,\n            );\n            const type = /^[a-z][a-z0-9_]{0,63}$/.test(commerce.payment_type || '')\n                ? commerce.payment_type\n                : commerce.payment_provider;\n            // Mark the milestone before sending: reloads and later consent changes\n            // must not replay a previously denied event with new consent.\n            seen.add(id);\n            if (seen.size > 100) seen.delete(seen.values().next().value);\n            safely(() => window.sessionStorage.setItem(storageKey, JSON.stringify([...seen])));\n            if (\n                event.consent &&\n                ['analytics_storage', 'ad_storage', 'ad_user_data', 'ad_personalization'].some(\n                    (key) =>\n                        (event.consent[key] === 'granted') !==\n                        (window.analyticsConsentState?.[key] === 'granted'),\n                )\n            )\n                return;\n            tracked = true;\n            const parameters = {\n                currency: 'EUR',\n                value: Number(commerce.value),\n                payment_provider: commerce.payment_provider,\n                payment_type: type,\n                source_context: commerce.source_context,\n                checkout_type: 'express',\n            };\n            safely(() =>\n                window.gtag?.('event', event.event_name, {\n                    ...parameters,\n                    items: items.map((item) => ({\n                        item_id: String(item.product_id),\n                        item_name: String(item.name || ''),\n                        price: Number(item.price),\n                        quantity: Number(item.quantity),\n                        currency: 'EUR',\n                    })),\n                }),\n            );\n            safely(() =>\n                window._paq?.push([\n                    'trackEvent',\n                    'Checkout',\n                    definition[0],\n                    'express:' + commerce.source_context + ':' + type,\n                    parameters.value,\n                ]),\n            );\n            safely(() =>\n                window.mtag?.('event', event.event_name, {\n                    ...parameters,\n                    event_id: id,\n                    ecomm_pagetype: 'cart',\n                    ecomm_totalvalue: parameters.value,\n                    revenue_value: parameters.value,\n                    ecomm_prodid: items.map((item) => String(item.product_id)),\n                    items: items.map((item) => ({\n                        id: String(item.product_id),\n                        name: String(item.name || ''),\n                        price: Number(item.price),\n                        quantity: Number(item.quantity),\n                    })),\n                }),\n            );\n            safely(() =>\n                window.fbqWrapper?.(\n                    definition[2],\n                    definition[1],\n                    {\n                        ...parameters,\n                        content_type: 'product',\n                        content_ids: items.map((item) => String(item.product_id)),\n                        contents: items.map((item) => ({\n                            id: String(item.product_id),\n                            quantity: Number(item.quantity),\n                        })),\n                        num_items: items.reduce(\n                            (quantity, item) => quantity + Number(item.quantity),\n                            0,\n                        ),\n                    },\n                    { eventID: id },\n                ),\n            );\n            // The server already persisted this canonical event and created its\n            // deliveries (including OpenPanel). Do not re-collect browser prices.\n        });\n        return tracked;\n    };\n}\n","const MAX_EVENTS = 20;\nconst FLUSH_DELAY_MS = 120;\n\n/** Batch viewport impressions without delaying clicks or navigation. */\nexport function createRecommendationBatcher(window) {\n    const queues = new Map();\n\n    function send(url, events, urgent) {\n        const deliver = function () {\n            try {\n                const config = window.siteIntegrationsConfig;\n                if (\n                    config?.serverTracking?.recommendationEnabled === false ||\n                    (config?.privateInitialization &&\n                        config.serverTracking?.recommendationEnabled !== true)\n                )\n                    return;\n                const body = new URLSearchParams({ events: JSON.stringify(events) });\n                if (typeof window.navigator.sendBeacon === 'function') {\n                    try {\n                        if (window.navigator.sendBeacon(url, body)) return;\n                    } catch {\n                        // A Beacon exception must still allow the asynchronous fallback.\n                    }\n                }\n                if (typeof window.fetch === 'function') {\n                    void window\n                        .fetch(url, {\n                            method: 'POST',\n                            credentials: 'same-origin',\n                            headers: {\n                                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',\n                            },\n                            body,\n                            priority: 'low',\n                            // Normal batches can fall back without the shared Beacon/keepalive\n                            // payload quota. Navigation sends keep their existing keepalive.\n                            keepalive: urgent,\n                        })\n                        .catch(function () {});\n                }\n            } catch {\n                // Recommendation measurement must never interfere with shopping.\n            }\n        };\n        // Beacon bypasses private initialization's fetch gate. Preserve its session\n        // ordering, including when the handshake fails open or runs after bfcache.\n        if (window.shopInitialization) {\n            void Promise.resolve(window.shopInitialization).then(deliver, deliver);\n        } else {\n            deliver();\n        }\n    }\n\n    function flush(url, urgent = false) {\n        const queue = queues.get(url);\n        if (!queue) return;\n        queues.delete(url);\n        if (queue.timer !== null) window.clearTimeout(queue.timer);\n        const events = Array.from(queue.events.values());\n        if (events.length) send(url, events, urgent);\n    }\n\n    function track(url, input, urgent = false) {\n        const productId = Number(input?.product_id);\n        const event = input?.event;\n        const batchId = String(input?.batch_id || '');\n        const contextToken = String(input?.context_token || '');\n        if (\n            !url ||\n            !Number.isSafeInteger(productId) ||\n            productId <= 0 ||\n            !['impression', 'click'].includes(event) ||\n            !batchId ||\n            !contextToken\n        )\n            return false;\n\n        let queue = queues.get(url);\n        if (!queue) {\n            queue = { events: new Map(), timer: null };\n            queues.set(url, queue);\n        }\n        queue.events.set(`${event}:${batchId}:${productId}`, {\n            event,\n            product_id: productId,\n            batch_id: batchId,\n            context_token: contextToken,\n        });\n        if (urgent || event === 'click' || queue.events.size >= MAX_EVENTS) {\n            flush(url, urgent);\n        } else if (queue.timer === null) {\n            queue.timer = window.setTimeout(function () {\n                flush(url);\n            }, FLUSH_DELAY_MS);\n        }\n        return true;\n    }\n\n    function flushAll() {\n        Array.from(queues.keys()).forEach(function (url) {\n            flush(url, true);\n        });\n    }\n\n    window.addEventListener('pagehide', flushAll);\n    window.document.addEventListener('visibilitychange', function () {\n        if (window.document.visibilityState === 'hidden') flushAll();\n    });\n\n    return { track, flush };\n}\n","/** Provider-facing names for the subset of rich events with useful equivalents. */\nexport const BROWSER_ROUTES = Object.freeze({\n    navigation_click: ['Navigation', 'Click'],\n    feature_interaction: ['Feature', 'Interaction'],\n    banner_interaction: ['Banner', 'Interaction'],\n    catalog_filter_changed: ['Catalog', 'Filter changed'],\n    catalog_sort_changed: ['Catalog', 'Sort changed'],\n    catalog_view_changed: ['Catalog', 'View changed'],\n    product_media_viewed: ['Product', 'Media viewed'],\n    product_option_selected: ['Product', 'Option selected'],\n    product_quantity_changed: ['Product', 'Quantity changed'],\n    product_review_opened: ['Product', 'Reviews opened'],\n    product_price_history_opened: ['Product', 'Price history opened'],\n    product_designer_opened: ['Product designer', 'Opened'],\n    product_designer_completed: ['Product designer', 'Completed'],\n    product_designer_cleared: ['Product designer', 'Cleared'],\n    product_purchase_action: ['Product', 'Purchase action'],\n    product_audio_started: ['Product media', 'Audio started'],\n    product_audio_completed: ['Product media', 'Audio completed'],\n    product_download_clicked: ['Product media', 'Download'],\n    product_video_opened: ['Product media', 'Video opened'],\n    product_video_started: ['Product media', 'Video started'],\n    product_video_completed: ['Product media', 'Video completed'],\n    product_reviews_viewed: ['Product', 'Reviews viewed'],\n    product_related_selected: ['Product', 'Related selected'],\n    product_set_size_selected: ['Product', 'Set size selected'],\n    stock_notification_opened: ['Stock notification', 'Opened'],\n    parcel_tracking_attempt: ['Service', 'Parcel tracking attempt'],\n    parcel_tracking_result: ['Service', 'Parcel tracking result'],\n    delivery_availability_checked: ['Service', 'Delivery availability checked'],\n});\n\nexport const STORY_EVENT_ACTIONS = Object.freeze({\n    story_tray_impression: 'Tray impression',\n    story_open: 'Open',\n    story_view: 'View',\n    story_complete: 'Complete',\n    story_close: 'Close',\n    story_error: 'Error',\n    story_control: 'Control',\n});\n","export function numberValue(value, fallback = 0) {\n    const number = Number(value);\n    return Number.isFinite(number) ? number : fallback;\n}\nexport function ecommerceItems(items) {\n    return Array.isArray(items)\n        ? items.filter(function (item) {\n              return (\n                  item && item.id !== null && typeof item.id !== 'undefined' && `${item.id}` !== ''\n              );\n          })\n        : [];\n}\n","import { numberValue as matomoNumber, ecommerceItems as matomoItems } from './ecommerce.js';\n\nexport let matomoPrimaryActionTracked = false;\n\nexport function resetMatomoPrimaryActionTracked() {\n    matomoPrimaryActionTracked = false;\n}\n\nexport function addMatomoEcommerceItems(items) {\n    window._paq.push(['clearEcommerceCart']);\n    matomoItems(items).forEach(function (item) {\n        window._paq.push([\n            'addEcommerceItem',\n            `${item.id}`,\n            `${item.name || ''}`,\n            item.category || false,\n            matomoNumber(item.price),\n            Math.max(1, parseInt(item.quantity, 10) || 1),\n        ]);\n    });\n}\n\nexport function trackMatomoCart(total, items) {\n    if (typeof window._paq === 'undefined') return;\n    addMatomoEcommerceItems(items);\n    window._paq.push(['trackEcommerceCartUpdate', matomoNumber(total)]);\n}\n\nexport function trackMatomoPageView(configure) {\n    if (typeof window._paq === 'undefined' || matomoPrimaryActionTracked) return;\n    if (typeof configure === 'function') configure();\n    window._paq.push(['trackPageView']);\n    matomoPrimaryActionTracked = true;\n}\n\nexport function trackDefaultMatomoPageView() {\n    trackMatomoPageView();\n}\n\nexport function matomoStoryEventName(details) {\n    const parts = [];\n    if (details.story_id) parts.push(`Story ${details.story_id}`);\n    if (details.story_position) parts.push(`Position ${details.story_position}`);\n    if (details.story_type) parts.push(details.story_type);\n    if (details.navigation_method) parts.push(details.navigation_method);\n    if (details.close_method) parts.push(details.close_method);\n    if (details.error_stage) parts.push(details.error_stage);\n    return parts.join(' | ').slice(0, 255);\n}\n\nexport function markMatomoPrimaryActionTracked() {\n    matomoPrimaryActionTracked = true;\n}\n","/**\n * Cacheable commerce-event coordinator. Provider code is released outside the rendering path.\n * Dynamic values and early consent defaults are supplied by analytics.twig.\n */\nimport {\n    initializeProviderBridge,\n    safely as safelyCallProvider,\n} from './tracking/provider-bridge.js';\nimport './tracking/behavior.js';\nimport { createTrackingTransport } from './tracking/transport.js';\nimport { createPaymentFunnelTracker } from './tracking/payment-funnel.js';\nimport { createRecommendationBatcher } from './tracking/recommendation-batch.js';\nimport { BROWSER_ROUTES, STORY_EVENT_ACTIONS } from './tracking/events.js';\nimport {\n    numberValue as matomoNumber,\n    ecommerceItems as matomoItems,\n} from './tracking/ecommerce.js';\nimport {\n    addMatomoEcommerceItems,\n    trackMatomoCart,\n    trackMatomoPageView,\n    trackDefaultMatomoPageView,\n    resetMatomoPrimaryActionTracked,\n    matomoStoryEventName,\n    matomoPrimaryActionTracked,\n    markMatomoPrimaryActionTracked,\n} from './tracking/matomo.js';\n\nwindow.shopRecommendationTracker = createRecommendationBatcher(window);\n\nfunction initializeSiteIntegrations() {\n    if (window.siteIntegrationsStarted) return;\n    window.siteIntegrationsStarted = true;\n    const integrationConfig = window.siteIntegrationsConfig || {};\n    initializeProviderBridge(integrationConfig);\n\n    (function (window) {\n        const config = window.siteIntegrationsConfig || {};\n        let serverTracking = config.serverTracking || null;\n        const configuredCurrency =\n            serverTracking && typeof serverTracking.currency === 'string'\n                ? serverTracking.currency.toUpperCase()\n                : '';\n        let trackingCurrency = /^[A-Z]{3}$/.test(configuredCurrency) ? configuredCurrency : 'EUR';\n        let pageViewId = createUuid();\n        const listContextByElement = new WeakMap();\n        let listImpressionsByRoot = new WeakMap();\n        const activeListImpressions = new Set();\n\n        function createUuid() {\n            if (window.crypto && typeof window.crypto.randomUUID === 'function') {\n                return window.crypto.randomUUID();\n            }\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (character) {\n                const random = (Math.random() * 16) | 0;\n                return (character === 'x' ? random : (random & 0x3) | 0x8).toString(16);\n            });\n        }\n\n        function canonicalEventId(preferredId = null) {\n            return preferredId &&\n                /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n                    `${preferredId}`,\n                )\n                ? `${preferredId}`.toLowerCase()\n                : createUuid();\n        }\n\n        function safeSearchTerm(value) {\n            const term = `${value || ''}`.trim().slice(0, 255);\n            if (\n                /[^\\s@]+@[^\\s@]+\\.[^\\s@]+/.test(term) ||\n                /(?:https?:\\/\\/|www\\.)/i.test(term) ||\n                /(?:\\+?\\d[\\d\\s().-]{6,}\\d)/.test(term) ||\n                Array.from(term).some(\n                    (character) =>\n                        character.charCodeAt(0) < 32 ||\n                        character.charCodeAt(0) === 127 ||\n                        '<>'.includes(character),\n                )\n            ) {\n                return '[redacted]';\n            }\n            return term;\n        }\n\n        function captureServerEvent(eventName, entity = {}, preferredId = null) {\n            try {\n                return trackingTransport.capture(eventName, entity, preferredId);\n            } catch {\n                // Collection is deliberately fail-open.\n            }\n            return canonicalEventId(preferredId);\n        }\n\n        const trackingTransport = createTrackingTransport(window, {\n            configuration: function () {\n                return serverTracking;\n            },\n            eventId: canonicalEventId,\n            pageViewId: function () {\n                return pageViewId;\n            },\n        });\n\n        function observeListImpressions(category, products, root = document) {\n            if (!('IntersectionObserver' in window) || !Array.isArray(products)) {\n                return;\n            }\n            const listRoot = root && typeof root.querySelectorAll === 'function' ? root : document;\n            const listKey = JSON.stringify([\n                `${category.id}`,\n                category.source_context || 'product_list',\n                category.component_id || '',\n            ]);\n            let lists = listImpressionsByRoot.get(listRoot);\n            if (!lists) {\n                lists = new Map();\n                listImpressionsByRoot.set(listRoot, lists);\n            }\n            let list = lists.get(listKey);\n            if (!list) {\n                list = {\n                    category: category,\n                    products: new Map(),\n                    positions: new Map(),\n                    pending: new Set(),\n                    seen: new Set(),\n                    observed: new WeakSet(),\n                    timer: null,\n                    observer: null,\n                };\n                const flush = function () {\n                    list.timer = null;\n                    const ids = Array.from(list.pending).slice(0, 50);\n                    ids.forEach(function (id) {\n                        list.pending.delete(id);\n                    });\n                    if (ids.length) {\n                        captureServerEvent('view_item_list', {\n                            list_id: `${list.category.id}`,\n                            list_name: `${list.category.name || ''}`,\n                            product_ids: ids.map(function (id) {\n                                return parseInt(id, 10);\n                            }),\n                            source_context: list.category.source_context || 'product_list',\n                            component_type: list.category.component_type || undefined,\n                            component_id: list.category.component_id || undefined,\n                        });\n                        if (typeof window.gtag === 'function') {\n                            window.gtag('event', 'view_item_list', {\n                                item_list_id: `${list.category.id}`,\n                                item_list_name: `${list.category.name || ''}`,\n                                items: ids.map(function (id) {\n                                    const product = list.products.get(id) || {};\n                                    return {\n                                        currency: trackingCurrency,\n                                        item_id: id,\n                                        item_name: `${product.name || ''}`,\n                                        item_category: product.category || undefined,\n                                        item_brand: product.brand || undefined,\n                                        item_variant: product.variant || product.model || undefined,\n                                        price:\n                                            product.price == null\n                                                ? undefined\n                                                : matomoNumber(product.price),\n                                    };\n                                }),\n                            });\n                        }\n                    }\n                    if (list.pending.size) list.timer = window.setTimeout(flush, 100);\n                };\n                list.observer = new IntersectionObserver(\n                    function (entries) {\n                        entries.forEach(function (entry) {\n                            if (!entry.isIntersecting) return;\n                            const id = entry.target.getAttribute('data-product-id');\n                            if (id && list.products.has(id) && !list.seen.has(id)) {\n                                list.seen.add(id);\n                                list.pending.add(id);\n                            }\n                            list.observer.unobserve(entry.target);\n                        });\n                        if (list.pending.size && list.timer === null)\n                            list.timer = window.setTimeout(flush, 100);\n                    },\n                    { threshold: 0.25 },\n                );\n                lists.set(listKey, list);\n                activeListImpressions.add(list);\n            }\n            list.category = category;\n            products.forEach(function (product, index) {\n                const id = `${product.id}`;\n                list.products.set(id, product);\n                if (!list.positions.has(id)) list.positions.set(id, index + 1);\n            });\n            listRoot.querySelectorAll('[data-product-id]').forEach(function (element) {\n                const productId = element.getAttribute('data-product-id');\n                if (!list.products.has(productId)) return;\n                // Product-card controls also carry this ID. They are not separate\n                // impressions and can enter the viewport later than their card.\n                let parent = element.parentElement;\n                while (parent && listRoot.contains(parent)) {\n                    if (parent.getAttribute('data-product-id') === productId) return;\n                    parent = parent.parentElement;\n                }\n                listContextByElement.set(element, {\n                    category: category,\n                    product: list.products.get(productId),\n                    position: list.positions.get(productId),\n                });\n                if (list.seen.has(productId) || list.observed.has(element)) return;\n                list.observed.add(element);\n                list.observer.observe(element);\n            });\n        }\n\n        function resetListImpressions() {\n            activeListImpressions.forEach(function (list) {\n                list.observer.disconnect();\n                if (list.timer !== null) window.clearTimeout(list.timer);\n            });\n            activeListImpressions.clear();\n            listImpressionsByRoot = new WeakMap();\n        }\n\n        document.addEventListener(\n            'click',\n            function (event) {\n                if (document.body && document.body.classList.contains('zirbelino-page--migrated'))\n                    return;\n                const link =\n                    event.target && event.target.closest ? event.target.closest('a[href]') : null;\n                const productElement =\n                    link && link.closest ? link.closest('[data-product-id]') : null;\n                const context = productElement ? listContextByElement.get(productElement) : null;\n                if (\n                    context &&\n                    window.analytics &&\n                    typeof window.analytics.selectItem === 'function'\n                ) {\n                    try {\n                        window.analytics.selectItem(\n                            context.product,\n                            context.category,\n                            context.position,\n                        );\n                    } catch {\n                        // Product navigation remains authoritative when analytics fails.\n                    }\n                }\n            },\n            true,\n        );\n\n        const BEGIN_CHECKOUT_STORAGE_KEY = 'analytics.begin_checkout';\n        const CHECKOUT_STEP_STORAGE_PREFIX = 'analytics.checkout_step.';\n        const CHECKOUT_STEPS = [\n            'contact',\n            'billing',\n            'shipping_address',\n            'shipping',\n            'payment',\n            'submit',\n        ];\n        const CHECKOUT_TRACKING_PLATFORMS = ['matomo', 'google', 'microsoft', 'facebook'];\n        let checkoutContext = null;\n\n        function checkoutSignature(total, items) {\n            return JSON.stringify({\n                total: matomoNumber(total),\n                items: matomoItems(items)\n                    .map(function (item) {\n                        return [\n                            `${item.id}`,\n                            `${item.name || ''}`,\n                            matomoNumber(item.price),\n                            Math.max(1, parseInt(item.quantity, 10) || 1),\n                        ];\n                    })\n                    .sort(function (a, b) {\n                        return JSON.stringify(a).localeCompare(JSON.stringify(b));\n                    }),\n            });\n        }\n\n        function trackCheckoutOnce(total, items) {\n            try {\n                const signature = checkoutSignature(total, items);\n                if (window.sessionStorage.getItem(BEGIN_CHECKOUT_STORAGE_KEY) === signature) {\n                    return false;\n                }\n                window.sessionStorage.setItem(BEGIN_CHECKOUT_STORAGE_KEY, signature);\n            } catch {\n                // Tracking must still work when storage is disabled.\n            }\n            return true;\n        }\n\n        function normalizeCheckoutItems(items) {\n            return Array.isArray(items)\n                ? items.map(function (item) {\n                      return {\n                          id: item.id ?? item.item_id,\n                          name: item.name ?? item.item_name,\n                          category: item.category ?? item.item_category,\n                          brand: item.brand ?? item.item_brand,\n                          variant: item.variant ?? item.item_variant ?? item.model,\n                          price: item.price,\n                          quantity: item.quantity,\n                      };\n                  })\n                : [];\n        }\n\n        function setCheckoutContext(total, items) {\n            const normalizedItems = normalizeCheckoutItems(items);\n            checkoutContext = {\n                total: matomoNumber(total),\n                items: normalizedItems,\n                signature: checkoutSignature(total, normalizedItems),\n            };\n        }\n\n        function clearCheckoutStepStorage() {\n            try {\n                CHECKOUT_STEPS.forEach(function (step) {\n                    window.sessionStorage.removeItem(CHECKOUT_STEP_STORAGE_PREFIX + step);\n                    CHECKOUT_TRACKING_PLATFORMS.forEach(function (platform) {\n                        window.sessionStorage.removeItem(\n                            `${CHECKOUT_STEP_STORAGE_PREFIX}${step}.${platform}`,\n                        );\n                    });\n                });\n            } catch {\n                // Ignore unavailable storage.\n            }\n        }\n\n        function prepareCheckoutContext(total, items) {\n            try {\n                const signature = checkoutSignature(total, items);\n                const previousSignature = window.sessionStorage.getItem(BEGIN_CHECKOUT_STORAGE_KEY);\n                if (previousSignature !== null && previousSignature !== signature) {\n                    clearCheckoutStepStorage();\n                }\n            } catch {\n                // Tracking must still work when storage is disabled.\n            }\n            setCheckoutContext(total, items);\n        }\n\n        function trackCheckoutPlatformOnce(step, platform, value, callback) {\n            const key = `${CHECKOUT_STEP_STORAGE_PREFIX}${step}.${platform}`;\n            try {\n                if (window.sessionStorage.getItem(key) === value) {\n                    return false;\n                }\n            } catch {\n                // Tracking must still work when storage is disabled.\n            }\n\n            try {\n                if (callback() === false) {\n                    return false;\n                }\n            } catch (error) {\n                if (window.console && typeof window.console.warn === 'function') {\n                    window.console.warn('Checkout analytics platform failed:', platform, error);\n                }\n                return false;\n            }\n\n            try {\n                window.sessionStorage.setItem(key, value);\n            } catch {\n                // Tracking must still work when storage is disabled.\n            }\n            return true;\n        }\n\n        function trackCheckoutStep(step, option = '', optionKey = '', preferredEventId = null) {\n            if (!checkoutContext) {\n                return false;\n            }\n\n            const definitions = {\n                contact: {\n                    event: 'add_contact_info',\n                    matomoAction: 'Contact completed',\n                    metaEvent: 'ContactInfoCompleted',\n                },\n                billing: {\n                    event: 'add_billing_info',\n                    matomoAction: 'Billing address completed',\n                    metaEvent: 'BillingInfoCompleted',\n                },\n                shipping_address: {\n                    event: 'add_shipping_address',\n                    matomoAction: 'Shipping address completed',\n                    metaEvent: 'ShippingAddressCompleted',\n                },\n                shipping: {\n                    event: 'add_shipping_info',\n                    matomoAction: 'Shipping method selected',\n                    metaEvent: 'AddShippingInfo',\n                    optionParameter: 'shipping_tier',\n                },\n                payment: {\n                    event: 'add_payment_info',\n                    matomoAction: 'Payment method selected',\n                    metaEvent: 'AddPaymentInfo',\n                    metaStandard: true,\n                    optionParameter: 'payment_type',\n                },\n                submit: {\n                    event: 'checkout_submit',\n                    matomoAction: 'Order submitted',\n                    metaEvent: 'CheckoutSubmit',\n                },\n            };\n            const definition = definitions[step];\n            if (!definition) {\n                return false;\n            }\n\n            const items = matomoItems(checkoutContext.items);\n            const total = matomoNumber(checkoutContext.total);\n            const canonicalId = captureServerEvent(\n                definition.event,\n                {\n                    checkout_type: 'standard',\n                    product_ids: items.map(function (item) {\n                        return parseInt(item.id, 10);\n                    }),\n                },\n                preferredEventId,\n            );\n            const optionLabel = option ? `${option}`.slice(0, 120) : '';\n            const normalizedOptionKey = optionKey ? `${optionKey}`.slice(0, 120) : optionLabel;\n            const storageValue = definition.optionParameter\n                ? `option:${normalizedOptionKey}|cart:${checkoutContext.signature}`\n                : '1';\n            const googleItems = items.map(function (item) {\n                return {\n                    currency: trackingCurrency,\n                    item_id: `${item.id}`,\n                    item_name: `${item.name || ''}`,\n                    item_category: item.category || undefined,\n                    item_brand: item.brand || undefined,\n                    item_variant: item.variant || item.model || undefined,\n                    price: matomoNumber(item.price),\n                    quantity: Math.max(1, parseInt(item.quantity, 10) || 1),\n                };\n            });\n\n            let tracked = false;\n            if (typeof window._paq !== 'undefined') {\n                tracked =\n                    trackCheckoutPlatformOnce(step, 'matomo', storageValue, function () {\n                        window._paq.push([\n                            'trackEvent',\n                            'Checkout',\n                            definition.matomoAction,\n                            optionLabel ? 'standard:' + optionLabel : 'standard',\n                            total,\n                        ]);\n                    }) || tracked;\n            }\n\n            if (typeof window.gtag === 'function') {\n                const googleParameters = {\n                    checkout_type: 'standard',\n                    currency: trackingCurrency,\n                    value: total,\n                    items: googleItems,\n                };\n                if (\n                    step === 'payment' &&\n                    ['stripe_advanced', 'paypal_advanced'].includes(normalizedOptionKey)\n                ) {\n                    googleParameters.payment_provider =\n                        normalizedOptionKey === 'paypal_advanced' ? 'paypal' : 'stripe';\n                    googleParameters.source_context = 'checkout';\n                }\n                if (optionLabel) {\n                    googleParameters[definition.optionParameter || 'checkout_option'] = optionLabel;\n                }\n                tracked =\n                    trackCheckoutPlatformOnce(step, 'google', storageValue, function () {\n                        window.gtag('event', definition.event, googleParameters);\n                    }) || tracked;\n            }\n\n            if (typeof window.mtag === 'function') {\n                tracked =\n                    trackCheckoutPlatformOnce(step, 'microsoft', storageValue, function () {\n                        return window.mtag('event', definition.event, {\n                            checkout_type: 'standard',\n                            event_category: 'Checkout',\n                            event_label: optionLabel,\n                            ecomm_pagetype: 'cart',\n                            ecomm_totalvalue: total,\n                            revenue_value: total,\n                            currency: trackingCurrency,\n                            ecomm_prodid: items.map(function (item) {\n                                return `${item.id}`;\n                            }),\n                            items: items.map(function (item) {\n                                return {\n                                    id: `${item.id}`,\n                                    name: `${item.name || ''}`,\n                                    price: matomoNumber(item.price),\n                                    quantity: Math.max(1, parseInt(item.quantity, 10) || 1),\n                                };\n                            }),\n                        });\n                    }) || tracked;\n            }\n\n            const facebookParameters = {\n                checkout_type: 'standard',\n                currency: trackingCurrency,\n                value: total,\n                content_type: 'product',\n                content_ids: items.map(function (item) {\n                    return `${item.id}`;\n                }),\n                contents: items.map(function (item) {\n                    return {\n                        id: `${item.id}`,\n                        quantity: Math.max(1, parseInt(item.quantity, 10) || 1),\n                    };\n                }),\n                num_items: items.reduce(function (quantity, item) {\n                    return quantity + Math.max(1, parseInt(item.quantity, 10) || 1);\n                }, 0),\n            };\n            if (optionLabel) {\n                facebookParameters.checkout_option = optionLabel;\n            }\n            if (typeof window.fbqWrapper === 'function') {\n                tracked =\n                    trackCheckoutPlatformOnce(step, 'facebook', storageValue, function () {\n                        return window.fbqWrapper(\n                            definition.metaStandard ? 'track' : 'trackCustom',\n                            definition.metaEvent,\n                            facebookParameters,\n                            { eventID: canonicalId },\n                        );\n                    }) || tracked;\n            }\n\n            return tracked;\n        }\n\n        function normalizeStoryEventDetails(details) {\n            const source = details && typeof details === 'object' ? details : {};\n            const normalized = {};\n            const stringParameters = [\n                'story_id',\n                'story_type',\n                'navigation_method',\n                'close_method',\n                'error_stage',\n                'control',\n                'action',\n            ];\n            const numberParameters = [\n                'story_position',\n                'story_count',\n                'last_story_position',\n                'stories_viewed',\n                'watch_time_ms',\n            ];\n\n            stringParameters.forEach(function (parameter) {\n                if (source[parameter] !== null && typeof source[parameter] !== 'undefined') {\n                    normalized[parameter] = `${source[parameter]}`.slice(0, 80);\n                }\n            });\n            numberParameters.forEach(function (parameter) {\n                const value = Number(source[parameter]);\n                if (Number.isFinite(value)) {\n                    normalized[parameter] = Math.max(0, Math.round(value));\n                }\n            });\n            return normalized;\n        }\n\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', trackDefaultMatomoPageView);\n        } else {\n            window.setTimeout(trackDefaultMatomoPageView, 0);\n        }\n\n        window.addEventListener('shop:restored', function () {\n            resetListImpressions();\n            serverTracking = config.serverTracking || null;\n            const restoredCurrency =\n                typeof serverTracking?.currency === 'string'\n                    ? serverTracking.currency.toUpperCase()\n                    : '';\n            trackingCurrency = /^[A-Z]{3}$/.test(restoredCurrency) ? restoredCurrency : 'EUR';\n            pageViewId = createUuid();\n            resetMatomoPrimaryActionTracked();\n            // Product/category tracking can attach its ecommerce context first.\n            window.setTimeout(trackDefaultMatomoPageView, 0);\n            // The provider runtime may still be deferred; the early gtag bridge\n            // queues this view without loading any new script on restoration.\n            if (config.enabled && /^G-[A-Z0-9]+$/i.test(config.ga4MeasurementId || '')) {\n                window.gtag('event', 'page_view', {\n                    page_location: window.location.href,\n                    page_title: document.title,\n                });\n            }\n        });\n\n        window.analytics = {\n            trackPaymentFunnel: createPaymentFunnelTracker(window),\n            trackPaymentConnection: function (details) {\n                // Fall back to normal error reporting until the signed collector is ready.\n                if (!serverTracking?.endpoint || !serverTracking?.token) return false;\n                return captureServerEvent('payment_connection_failed', details);\n            },\n            trackDiagnostic: function (eventName, details = {}) {\n                try {\n                    return captureServerEvent(\n                        `${eventName}`,\n                        details && typeof details === 'object' ? details : {},\n                    );\n                } catch {\n                    return false;\n                }\n            },\n            trackInteraction: function (eventName, details = {}) {\n                const parameters =\n                    details && typeof details === 'object' ? Object.assign({}, details) : {};\n                if (Object.prototype.hasOwnProperty.call(parameters, 'search_term')) {\n                    parameters.search_term = safeSearchTerm(parameters.search_term);\n                }\n                const canonicalId = captureServerEvent(`${eventName}`, parameters);\n                const route = BROWSER_ROUTES[eventName];\n                if (!route) {\n                    return canonicalId;\n                }\n                try {\n                    if (typeof window.gtag === 'function') {\n                        window.gtag('event', eventName, parameters);\n                    }\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n                try {\n                    if (typeof window._paq !== 'undefined') {\n                        const label =\n                            parameters.component_id ||\n                            parameters.source_id ||\n                            parameters.result ||\n                            '';\n                        window._paq.push([\n                            'trackEvent',\n                            route[0],\n                            route[1],\n                            `${label}`.slice(0, 120),\n                        ]);\n                    }\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n                return canonicalId;\n            },\n            selectItem: function (product, category = {}, position = 0) {\n                if (!product || !product.id) return false;\n                const listId = `${category.id || ''}`;\n                const listName = `${category.name || ''}`;\n                let canonicalId = false;\n                try {\n                    canonicalId = captureServerEvent('select_item', {\n                        product_ids: [parseInt(product.id, 10)],\n                        list_id: listId,\n                        list_name: listName,\n                        position: Math.max(0, parseInt(position, 10) || 0),\n                        source_context: category.source_context || 'product_list',\n                        component_type: category.component_type || undefined,\n                        component_id: category.component_id || undefined,\n                    });\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n                try {\n                    if (typeof window.gtag === 'function') {\n                        window.gtag('event', 'select_item', {\n                            item_list_id: listId,\n                            item_list_name: listName,\n                            items: [\n                                {\n                                    currency: trackingCurrency,\n                                    item_id: `${product.id}`,\n                                    item_name: `${product.name || ''}`,\n                                    item_category: product.category || undefined,\n                                    item_brand: product.brand || undefined,\n                                    item_variant: product.variant || product.model || undefined,\n                                    price: matomoNumber(product.price),\n                                    index: Math.max(0, (parseInt(position, 10) || 1) - 1),\n                                },\n                            ],\n                        });\n                    }\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n                try {\n                    if (typeof window._paq !== 'undefined') {\n                        window._paq.push([\n                            'trackEvent',\n                            'Product list',\n                            'Select item',\n                            listName || listId,\n                            position,\n                        ]);\n                    }\n                } catch {\n                    /* Optional tracking cannot interrupt the shop. */\n                }\n                return canonicalId;\n            },\n            trackStory: function (eventName, details = {}) {\n                const matomoAction = STORY_EVENT_ACTIONS[eventName];\n                if (!matomoAction) {\n                    return false;\n                }\n\n                const parameters = normalizeStoryEventDetails(details);\n                let tracked = captureServerEvent(eventName, parameters) || false;\n                if (typeof window._paq !== 'undefined')\n                    safelyCallProvider(function () {\n                        const matomoEvent = ['trackEvent', 'Instagram Stories', matomoAction];\n                        const eventNameValue = matomoStoryEventName(parameters);\n                        const eventValue = parameters.watch_time_ms\n                            ? Math.round(parameters.watch_time_ms / 1000)\n                            : null;\n                        if (eventNameValue || eventValue !== null) {\n                            matomoEvent.push(eventNameValue);\n                        }\n                        if (eventValue !== null) {\n                            matomoEvent.push(eventValue);\n                        }\n                        window._paq.push(matomoEvent);\n                        tracked = true;\n                    });\n\n                if (typeof window.gtag === 'function')\n                    safelyCallProvider(function () {\n                        window.gtag('event', eventName, parameters);\n                        tracked = true;\n                    });\n                return tracked;\n            },\n            /**\n             * @param {object} product\n             * @param {number|string} product.id\n             * @param {string} product.name\n             * @param {number|float|string} product.price\n             */\n            viewProduct: function (product) {\n                const canonicalId = captureServerEvent(\n                    'view_item',\n                    {\n                        product_ids: [parseInt(product.id, 10)],\n                    },\n                    config.trackingEventId,\n                );\n                // Matomo\n                trackMatomoPageView(function () {\n                    window._paq.push([\n                        'setEcommerceView',\n                        `${product.id}`, // (Required) productSKU\n                        `${product.name}`, // (Optional) productName\n                        product.category || false, // (Optional) categoryName\n                        matomoNumber(product.price), // (Optional) price\n                    ]);\n                });\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'view_item', {\n                        currency: trackingCurrency,\n                        value: parseFloat(product.price),\n                        items: [\n                            {\n                                currency: trackingCurrency,\n                                item_id: `${product.id}`,\n                                item_name: `${product.name}`,\n                                item_category: product.category || undefined,\n                                item_brand: product.brand || undefined,\n                                item_variant: product.variant || product.model || undefined,\n                                price: parseFloat(product.price),\n                            },\n                        ],\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', '', {\n                        event_id: canonicalId,\n                        ecomm_prodid: [`${product.id}`],\n                        ecomm_pagetype: 'product',\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'ViewContent',\n                    {\n                        content_name: `${product.name}`,\n                        currency: trackingCurrency,\n                        value: parseFloat(product.price),\n                        content_type: 'product',\n                        content_ids: [`${product.id}`],\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * @param {object} category\n             * @param {number|string} category.id\n             * @param {string} category.name\n             * @param {object[]} products\n             * @param {number|string} products.id\n             * @param {string} products.name\n             * @param {number|float|string} products.price\n             */\n            viewCategory: function (category, products, matomoPageView = false, root = document) {\n                const listRoot =\n                    root && typeof root.querySelectorAll === 'function' ? root : document;\n                const component =\n                    listRoot.closest && listRoot.closest('[data-analytics-component]');\n                if (component) {\n                    category = Object.assign({}, category, {\n                        id: component.dataset.analyticsComponentId || category.id,\n                        source_context: 'storefront_module',\n                        component_type:\n                            component.dataset.analyticsComponentType ||\n                            component.dataset.analyticsComponent ||\n                            'module',\n                        component_id: component.dataset.analyticsComponentId || `${category.id}`,\n                    });\n                }\n                // Matomo\n                if (matomoPageView) {\n                    trackMatomoPageView(function () {\n                        window._paq.push([\n                            'setEcommerceView',\n                            false, // Product SKU is not applicable for a category view.\n                            false, // Product name is not applicable for a category view.\n                            `${category.name}`, // (Optional) Product category, or array of up to 5 categories\n                        ]);\n                    });\n                }\n\n                if (!products || products.length === 0) {\n                    return;\n                }\n                observeListImpressions(category, products, listRoot);\n\n                // Microsoft\n                if (matomoPageView && typeof window.mtag === 'function') {\n                    window.mtag('event', '', {\n                        ecomm_category: `${category.id}`,\n                        ecomm_prodid: products.map(function (product) {\n                            return `${product.id}`;\n                        }),\n                        ecomm_pagetype: 'category',\n                    });\n                }\n                // Server-side list impressions are emitted only after viewport entry.\n            },\n            /**\n             * @param {number|float|string} total\n             * @param {object[]} items\n             * @param {number|string} items.id\n             * @param {string} items.name\n             * @param {number|float|string} items.price\n             * @param {number|string} items.quantity\n             */\n            viewCart: function (total, items) {\n                const canonicalId = captureServerEvent(\n                    'view_cart',\n                    {\n                        product_ids: items.map(function (item) {\n                            return parseInt(item.id, 10);\n                        }),\n                    },\n                    config.trackingEventId,\n                );\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    trackMatomoCart(total, items);\n                    window._paq.push([\n                        'trackEvent',\n                        'View', // (Required) Event Category\n                        'Cart', // (Required) Event Action\n                        '', // (Optional) Event Name\n                        matomoNumber(total), // (Optional) Event Value\n                    ]);\n                }\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'view_cart', {\n                        currency: trackingCurrency,\n                        value: parseFloat(total),\n                        items: items.map(function (item) {\n                            return {\n                                currency: trackingCurrency,\n                                item_id: `${item.id}`,\n                                item_name: `${item.name}`,\n                                item_category: item.category || undefined,\n                                item_brand: item.brand || undefined,\n                                item_variant: item.variant || item.model || undefined,\n                                price: parseFloat(item.price),\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', '', {\n                        event_id: canonicalId,\n                        ecomm_pagetype: 'cart',\n                        currency: trackingCurrency,\n                        ecomm_totalvalue: parseFloat(total),\n                        revenue_value: parseFloat(total),\n                        ecomm_prodid: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        items: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                name: `${item.name}`,\n                                price: parseFloat(item.price),\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'ViewContent',\n                    {\n                        content_name: 'Cart',\n                        content_type: 'product',\n                        currency: trackingCurrency,\n                        value: parseFloat(total),\n                        content_ids: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        contents: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                        num_items: items.reduce(function (totalQuantity, item) {\n                            return totalQuantity + parseInt(item.quantity);\n                        }, 0),\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * @param {string} query\n             * @param {number|string} resultCount\n             */\n            viewSearch: function (query, resultCount) {\n                const searchTerm = safeSearchTerm(query);\n                const parsedResultCount = Math.max(0, parseInt(resultCount, 10) || 0);\n                const canonicalId = captureServerEvent(\n                    'search',\n                    {\n                        search_term: searchTerm,\n                        result_count: parsedResultCount,\n                        search_provider: 'algolia',\n                    },\n                    config.trackingEventId,\n                );\n                // Matomo\n                if (typeof window._paq !== 'undefined' && !matomoPrimaryActionTracked) {\n                    window._paq.push(['trackSiteSearch', searchTerm, false, parsedResultCount]);\n                    markMatomoPrimaryActionTracked();\n                }\n                // Google search tracking is handled by GA4 Enhanced Measurement as\n                // view_search_results. Sending a second custom event would duplicate it.\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', '', {\n                        event_id: canonicalId,\n                        ecomm_query: searchTerm,\n                        ecomm_pagetype: 'searchresults',\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'Search',\n                    {\n                        search_string: searchTerm,\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * @param {number|float|string} total\n             * @param {object[]} items\n             * @param {number|string} items.id\n             * @param {string} items.name\n             * @param {number|float|string} items.price\n             * @param {number|string} items.quantity\n             */\n            viewCheckout: function (total, items) {\n                prepareCheckoutContext(total, items);\n                if (!trackCheckoutOnce(total, items)) {\n                    return;\n                }\n                const canonicalId = captureServerEvent(\n                    'begin_checkout',\n                    {\n                        checkout_type: 'standard',\n                        product_ids: items.map(function (item) {\n                            return parseInt(item.id, 10);\n                        }),\n                    },\n                    config.trackingEventId,\n                );\n\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    trackMatomoCart(total, items);\n                    window._paq.push([\n                        'trackEvent',\n                        'View', // (Required) Event Category\n                        'Checkout', // (Required) Event Action\n                        'standard', // (Optional) Event Name\n                        matomoNumber(total), // (Optional) Event Value\n                    ]);\n                }\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'begin_checkout', {\n                        checkout_type: 'standard',\n                        currency: trackingCurrency,\n                        value: parseFloat(total),\n                        items: items.map(function (item) {\n                            return {\n                                currency: trackingCurrency,\n                                item_id: `${item.id}`,\n                                item_name: `${item.name}`,\n                                item_category: item.category || undefined,\n                                item_brand: item.brand || undefined,\n                                item_variant: item.variant || item.model || undefined,\n                                price: parseFloat(item.price),\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'begin_checkout', {\n                        checkout_type: 'standard',\n                        event_id: canonicalId,\n                        ecomm_pagetype: 'cart',\n                        currency: trackingCurrency,\n                        ecomm_totalvalue: parseFloat(total),\n                        revenue_value: parseFloat(total),\n                        ecomm_prodid: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        items: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                name: `${item.name}`,\n                                price: parseFloat(item.price),\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'InitiateCheckout',\n                    {\n                        checkout_type: 'standard',\n                        currency: trackingCurrency,\n                        value: parseFloat(total),\n                        content_ids: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        contents: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                        num_items: items.reduce(\n                            (accumulator, currentValue) =>\n                                accumulator + parseInt(currentValue.quantity),\n                            0,\n                        ),\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * Refresh the cart data used by subsequent checkout-step events.\n             * @param {number|float|string} total\n             * @param {object[]} items\n             */\n            updateCheckout: function (total, items) {\n                setCheckoutContext(total, items);\n            },\n            checkoutContactInfo: function (contactType, optionKey = '', trackingEventId = null) {\n                return trackCheckoutStep('contact', contactType, optionKey, trackingEventId);\n            },\n            checkoutBillingInfo: function (addressType, optionKey = '', trackingEventId = null) {\n                return trackCheckoutStep('billing', addressType, optionKey, trackingEventId);\n            },\n            checkoutShippingAddress: function (\n                addressType,\n                optionKey = '',\n                trackingEventId = null,\n            ) {\n                return trackCheckoutStep(\n                    'shipping_address',\n                    addressType,\n                    optionKey,\n                    trackingEventId,\n                );\n            },\n            checkoutShippingInfo: function (\n                shippingTier,\n                shippingMethodCode,\n                trackingEventId = null,\n            ) {\n                return trackCheckoutStep(\n                    'shipping',\n                    shippingTier,\n                    shippingMethodCode,\n                    trackingEventId,\n                );\n            },\n            checkoutPaymentInfo: function (paymentType, paymentMethodCode, trackingEventId = null) {\n                return trackCheckoutStep(\n                    'payment',\n                    paymentType,\n                    paymentMethodCode,\n                    trackingEventId,\n                );\n            },\n            checkoutSubmit: function (_option = '', _optionKey = '', trackingEventId = null) {\n                return trackCheckoutStep('submit', '', '', trackingEventId);\n            },\n            cartClear: function () {\n                clearCheckoutStepStorage();\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    window._paq.push(['clearEcommerceCart']);\n                    window._paq.push(['trackEcommerceCartUpdate', 0]);\n                }\n            },\n            /**\n             * Replace Matomo's in-memory cart with the complete server-side cart.\n             * @param {number|float|string} cart_total\n             * @param {object[]} items\n             */\n            cartSync: function (cart_total, items) {\n                trackMatomoCart(cart_total, items);\n            },\n            /**\n             * @param {number|float|string} cart_total\n             * @param {object} product\n             * @param {number|string} product.id\n             * @param {string} product.name\n             * @param {number|float|string} product.price\n             * @param {number|string} product.quantity\n             * @param {boolean} [onlyMatomo]\n             * @param {boolean} [skipMatomo]\n             * @param {string|null} [trackingEventId]\n             */\n            cartAdd: function (\n                cart_total,\n                product,\n                onlyMatomo = false,\n                skipMatomo = false,\n                trackingEventId = null,\n            ) {\n                // Matomo\n                if (!skipMatomo && typeof window._paq !== 'undefined') {\n                    window._paq.push([\n                        'addEcommerceItem',\n                        `${product.id}`, // (Required) productSKU\n                        `${product.name}`, // (Optional) productName\n                        product.category || false, // (Optional) productCategory\n                        parseFloat(product.price), // (Recommended) price\n                        parseInt(product.quantity), // (Optional, defaults to 1) quantity\n                    ]);\n                    window._paq.push(['trackEcommerceCartUpdate', parseFloat(cart_total)]);\n                }\n                if (onlyMatomo) {\n                    return;\n                }\n                const canonicalId = captureServerEvent(\n                    'add_to_cart',\n                    {\n                        product_ids: [parseInt(product.id, 10)],\n                        action: 'add_to_cart_success',\n                        source_context: product.source_context || 'unknown',\n                        component_type: product.component_type || undefined,\n                        component_id: product.component_id || undefined,\n                    },\n                    trackingEventId,\n                );\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'add_to_cart', {\n                        currency: trackingCurrency,\n                        value: parseFloat(product.price) * parseInt(product.quantity),\n                        items: [\n                            {\n                                currency: trackingCurrency,\n                                item_id: `${product.id}`,\n                                item_name: `${product.name}`,\n                                item_category: product.category || undefined,\n                                item_brand: product.brand || undefined,\n                                item_variant: product.variant || product.model || undefined,\n                                price: parseFloat(product.price),\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'add_to_cart', {\n                        event_id: canonicalId,\n                        ecomm_prodid: [`${product.id}`],\n                        ecomm_pagetype: 'product',\n                        ecomm_totalvalue: parseFloat(product.price) * parseInt(product.quantity),\n                        revenue_value: parseFloat(product.price) * parseInt(product.quantity),\n                        currency: trackingCurrency,\n                        items: [\n                            {\n                                id: `${product.id}`,\n                                price: parseFloat(product.price),\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'AddToCart',\n                    {\n                        currency: trackingCurrency,\n                        content_type: 'product',\n                        content_ids: [`${product.id}`],\n                        value: parseFloat(product.price) * parseInt(product.quantity),\n                        contents: [\n                            {\n                                id: `${product.id}`,\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * @param {number|float|string} cart_total\n             * @param {object} product\n             * @param {number|string} product.id\n             * @param {string} product.name\n             * @param {number|float|string} product.price\n             * @param {number|string} product.quantity\n             * @param {boolean} [skipMatomo]\n             */\n            cartRemove: function (cart_total, product, skipMatomo = false, trackingEventId = null) {\n                const canonicalId = captureServerEvent(\n                    'remove_from_cart',\n                    {\n                        product_ids: [parseInt(product.id, 10)],\n                    },\n                    trackingEventId,\n                );\n                // Matomo\n                if (!skipMatomo && typeof window._paq !== 'undefined') {\n                    window._paq.push([\n                        'removeEcommerceItem',\n                        `${product.id}`, // (Required) productSKU\n                    ]);\n                    window._paq.push(['trackEcommerceCartUpdate', parseFloat(cart_total)]);\n                }\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'remove_from_cart', {\n                        currency: trackingCurrency,\n                        value: parseFloat(product.price) * parseInt(product.quantity),\n                        items: [\n                            {\n                                currency: trackingCurrency,\n                                item_id: `${product.id}`,\n                                item_name: `${product.name}`,\n                                item_category: product.category || undefined,\n                                item_brand: product.brand || undefined,\n                                item_variant: product.variant || product.model || undefined,\n                                price: parseFloat(product.price),\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'remove_from_cart', {\n                        event_id: canonicalId,\n                        ecomm_prodid: [`${product.id}`],\n                        ecomm_pagetype: 'product',\n                        ecomm_totalvalue: parseFloat(product.price) * parseInt(product.quantity),\n                        revenue_value: parseFloat(product.price) * parseInt(product.quantity),\n                        currency: trackingCurrency,\n                        items: [\n                            {\n                                id: `${product.id}`,\n                                price: parseFloat(product.price),\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    });\n                }\n                // Meta does not define a standard RemoveFromCart event. Use a custom\n                // event with the same canonical ID as the server-side event.\n                window.fbqWrapper(\n                    'trackCustom',\n                    'RemoveFromCart',\n                    {\n                        currency: trackingCurrency,\n                        content_type: 'product',\n                        content_ids: [`${product.id}`],\n                        value: parseFloat(product.price) * parseInt(product.quantity),\n                        contents: [\n                            {\n                                id: `${product.id}`,\n                                quantity: parseInt(product.quantity),\n                            },\n                        ],\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            wishlistAdd: function (product, trackingEventId = null) {\n                const canonicalId = captureServerEvent(\n                    'add_to_wishlist',\n                    {\n                        product_ids: [parseInt(product.id, 10)],\n                    },\n                    trackingEventId,\n                );\n                const value = parseFloat(product.price);\n                if (typeof window._paq !== 'undefined') {\n                    window._paq.push([\n                        'trackEvent',\n                        'Wishlist',\n                        'Add',\n                        `${product.name || ''}`,\n                        matomoNumber(value),\n                    ]);\n                }\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'add_to_wishlist', {\n                        currency: trackingCurrency,\n                        value: value,\n                        items: [\n                            {\n                                currency: trackingCurrency,\n                                item_id: `${product.id}`,\n                                item_name: `${product.name || ''}`,\n                                item_brand: product.brand || undefined,\n                                item_variant: product.variant || product.model || undefined,\n                                price: value,\n                                quantity: 1,\n                            },\n                        ],\n                    });\n                }\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'add_to_wishlist', {\n                        event_id: canonicalId,\n                        ecomm_prodid: [`${product.id}`],\n                        ecomm_pagetype: 'product',\n                        ecomm_totalvalue: value,\n                        revenue_value: value,\n                        currency: trackingCurrency,\n                    });\n                }\n                window.fbqWrapper(\n                    'track',\n                    'AddToWishlist',\n                    {\n                        currency: trackingCurrency,\n                        content_type: 'product',\n                        content_ids: [`${product.id}`],\n                        content_name: `${product.name || ''}`,\n                        value: value,\n                    },\n                    { eventID: canonicalId },\n                );\n            },\n            /**\n             * @param {object} order\n             * @param {number|string} order.id\n             * @param {number|float|string} order.total\n             * @param {number|float|string} order.sub_total\n             * @param {number|float|string} order.tax\n             * @param {number|float|string} order.shipping\n             * @param {object[]} items\n             * @param {number|string} items.id\n             * @param {string} items.name\n             * @param {number|float|string} items.price\n             * @param {number|string} items.quantity\n             */\n            purchase: function (order, items) {\n                const storeId = serverTracking ? parseInt(serverTracking.storeId || 0, 10) : 0;\n                const purchaseEventId = `purchase:${storeId}:${order.id}`;\n                const googleTransactionId = `${storeId}-${order.id}`;\n                const orderCurrency =\n                    typeof order.currency === 'string' ? order.currency.toUpperCase() : '';\n                const purchaseCurrency = /^[A-Z]{3}$/.test(orderCurrency)\n                    ? orderCurrency\n                    : trackingCurrency;\n                const paymentContext = {\n                    checkout_type: order.checkout_type === 'express' ? 'express' : 'standard',\n                };\n                ['payment_provider', 'payment_type', 'source_context'].forEach(function (field) {\n                    if (/^[a-z][a-z0-9_]{0,63}$/.test(order[field] || ''))\n                        paymentContext[field] = order[field];\n                });\n                try {\n                    window.sessionStorage.removeItem(BEGIN_CHECKOUT_STORAGE_KEY);\n                } catch {\n                    // Ignore unavailable storage.\n                }\n                clearCheckoutStepStorage();\n\n                const gaItems = items.map(function (item) {\n                    return {\n                        currency: purchaseCurrency,\n                        item_id: `${item.id}`,\n                        item_name: `${item.name}`,\n                        item_category: item.category || undefined,\n                        item_brand: item.brand || undefined,\n                        item_variant: item.variant || item.model || undefined,\n                        price: parseFloat(item.price),\n                        quantity: parseInt(item.quantity),\n                    };\n                });\n                const gaGrossItemValue = gaItems.reduce(function (sum, item) {\n                    return sum + (Number(item.price) || 0) * (Number(item.quantity) || 1);\n                }, 0);\n                const gaTargetItemValue = Math.max(\n                    0,\n                    parseFloat(order.item_value ?? order.sub_total) || 0,\n                );\n                if (gaGrossItemValue > 0 && gaTargetItemValue < gaGrossItemValue) {\n                    const discountFactor = gaTargetItemValue / gaGrossItemValue;\n                    gaItems.forEach(function (item) {\n                        const originalPrice = Number(item.price) || 0;\n                        item.price = Math.round(originalPrice * discountFactor * 1000000) / 1000000;\n                        item.discount =\n                            Math.round((originalPrice - item.price) * 1000000) / 1000000;\n                    });\n                }\n                const purchaseValue = Math.max(0, parseFloat(order.total) || 0);\n\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    addMatomoEcommerceItems(items);\n                    window._paq.push([\n                        'trackEcommerceOrder',\n                        googleTransactionId, // (Required) orderId; shared with server delivery for deduplication.\n                        parseFloat(order.total), // (Required) grandTotal (revenue)\n                        parseFloat(order.sub_total), // (Optional) subTotal\n                        parseFloat(order.tax), // (optional) tax\n                        parseFloat(order.shipping), // (optional) shipping\n                        false, // (optional) discount\n                    ]);\n                }\n                // Google\n                const googlePurchaseAlreadyQueued = Boolean(\n                    window.__shopGooglePurchasesQueued &&\n                    window.__shopGooglePurchasesQueued[googleTransactionId],\n                );\n                if (typeof window.gtag === 'function' && !googlePurchaseAlreadyQueued) {\n                    window.__shopGooglePurchasesQueued = window.__shopGooglePurchasesQueued || {};\n                    window.__shopGooglePurchasesQueued[googleTransactionId] = true;\n                    const googlePurchase = {\n                        ...paymentContext,\n                        transaction_id: googleTransactionId,\n                        currency: purchaseCurrency,\n                        // All purchase/conversion providers use the complete amount charged.\n                        value: purchaseValue,\n                        tax: parseFloat(order.tax),\n                        shipping: parseFloat(order.shipping),\n                        items: gaItems,\n                    };\n                    if (serverTracking && serverTracking.ga4ServerEnabled === true) {\n                        // The durable server delivery owns GA4 purchases. GTM still needs\n                        // the purchase event and top-level values for its Google Ads tag;\n                        // its GA4 Event tags are blocked by the analytics bootstrap.\n                        window.dataLayer.push({\n                            event: 'purchase',\n                            ...googlePurchase,\n                            ecommerce: googlePurchase,\n                        });\n                    } else {\n                        window.gtag('event', 'purchase', googlePurchase);\n                    }\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'purchase', {\n                        ...paymentContext,\n                        event_id: purchaseEventId,\n                        transaction_id: googleTransactionId,\n                        ecomm_pagetype: 'purchase',\n                        ecomm_totalvalue: parseFloat(order.total),\n                        revenue_value: parseFloat(order.total),\n                        currency: purchaseCurrency,\n                        ecomm_prodid: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        items: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                name: `${item.name}`,\n                                price: parseFloat(item.price),\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    });\n                }\n                // Facebook\n                window.fbqWrapper(\n                    'track',\n                    'Purchase',\n                    {\n                        ...paymentContext,\n                        currency: purchaseCurrency,\n                        content_type: 'product',\n                        value: parseFloat(order.total),\n                        content_ids: items.map(function (item) {\n                            return `${item.id}`;\n                        }),\n                        contents: items.map(function (item) {\n                            return {\n                                id: `${item.id}`,\n                                quantity: parseInt(item.quantity),\n                            };\n                        }),\n                    },\n                    { eventID: purchaseEventId },\n                );\n            },\n            login: function (trackingEventId = null) {\n                const canonicalId = captureServerEvent('login', {}, trackingEventId);\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    window._paq.push([\n                        'trackEvent',\n                        'Account', // (Required) Event Category\n                        'Login', // (Required) Event Action\n                    ]);\n                }\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'login', {\n                        method: 'Form',\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'Login', {\n                        event_id: canonicalId,\n                        event_category: 'Account',\n                    });\n                }\n                // Meta custom event; the same ID is sent through CAPI for deduplication.\n                window.fbqWrapper('trackCustom', 'Login', {}, { eventID: canonicalId });\n            },\n            register: function (trackingEventId = null) {\n                const canonicalId = captureServerEvent('sign_up', {}, trackingEventId);\n                // Matomo\n                if (typeof window._paq !== 'undefined') {\n                    window._paq.push([\n                        'trackEvent',\n                        'Account', // (Required) Event Category\n                        'Register', // (Required) Event Action\n                    ]);\n                }\n                // Google\n                if (typeof window.gtag === 'function') {\n                    window.gtag('event', 'sign_up', {\n                        method: 'Form',\n                    });\n                }\n                // Microsoft\n                if (typeof window.mtag === 'function') {\n                    window.mtag('event', 'Register', {\n                        event_id: canonicalId,\n                        event_category: 'Account',\n                    });\n                }\n                // Facebook\n                window.fbqWrapper('track', 'CompleteRegistration', {}, { eventID: canonicalId });\n            },\n        };\n        Object.keys(window.analytics).forEach(function (method) {\n            const implementation = window.analytics[method];\n            if (typeof implementation !== 'function') return;\n            window.analytics[method] = function () {\n                try {\n                    return implementation.apply(window.analytics, arguments);\n                } catch (error) {\n                    if (window.console && typeof window.console.warn === 'function') {\n                        window.console.warn('Shop analytics failed open:', method, error);\n                    }\n                    return false;\n                }\n            };\n        });\n        const trackingFlashEventIds = config.trackingFlashEventIds || {};\n        if (trackingFlashEventIds.login) {\n            window.analytics.login(trackingFlashEventIds.login);\n        }\n        if (trackingFlashEventIds.sign_up) {\n            window.analytics.register(trackingFlashEventIds.sign_up);\n        }\n        const queuedCalls = Array.isArray(window.siteIntegrationsQueue)\n            ? window.siteIntegrationsQueue.splice(0)\n            : [];\n        window.siteIntegrationsReady = true;\n        queuedCalls.forEach(function (queuedCall) {\n            // A consent change during private initialization must not retrospectively\n            // deliver calls that occurred under an earlier choice.\n            if (\n                config.privateInitialization &&\n                queuedCall &&\n                queuedCall.length > 2 &&\n                queuedCall[2] !==\n                    (document.cookie.match(/(?:^|;\\s*)cc_cookie_new=([^;]*)/)?.[1] || '')\n            )\n                return;\n            const method = queuedCall && queuedCall[0];\n            const args = queuedCall && Array.isArray(queuedCall[1]) ? queuedCall[1] : [];\n            if (!method || !window.analytics || typeof window.analytics[method] !== 'function') {\n                return;\n            }\n            try {\n                window.analytics[method].apply(window.analytics, args);\n            } catch (error) {\n                if (window.console && typeof window.console.warn === 'function') {\n                    window.console.warn('Queued shop tracking call failed:', method, error);\n                }\n            }\n        });\n    })(window);\n}\nif (window.shopInitialization) {\n    window.shopInitialization.then(initializeSiteIntegrations).catch(initializeSiteIntegrations);\n} else {\n    initializeSiteIntegrations();\n}\n"],"mappings":"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"}