{
  "version": 3,
  "sources": ["/cdn/shop/t/99/assets/search-cover.js?finder=2"],
  "sourcesContent": ["document.addEventListener(\"DOMContentLoaded\", () => {\r\n    const categorySelect = document.getElementById(\"category-select\");\r\n    const yearSelect = document.getElementById(\"year-select\");\r\n    const makeSelect = document.getElementById(\"make-select\");\r\n    const modelSelect = document.getElementById(\"model-select\");\r\n    const cabSelect = document.getElementById(\"cab-select\");\r\n    const bedSelect = document.getElementById(\"bed-select\");\r\n    const cabSelectGroup = document.getElementById(\"cab-select-group\");\r\n    const bedSelectGroup = document.getElementById(\"bed-select-group\");\r\n    const boatFeaturesSelect = document.getElementById(\"boat-features-select\");\r\n    const boatFeaturesSelectGroup = document.getElementById(\"boat-features-select-group\");\r\n\r\n    // --- Eliteshield enhancements: engine element + flags + status ---\r\n    const engine = document.getElementById(\"smart-search-engine\");\r\n    // Idempotency guard: this file is included both globally (layout/theme.liquid) and by the\r\n    // section, so it can execute twice on a page. Initialize the engine only once.\r\n    if (engine && engine.dataset.essInitialized === \"true\") return;\r\n    if (engine) engine.dataset.essInitialized = \"true\";\r\n    const statusEl = engine ? engine.parentElement.querySelector(\".ess-status\") : null;\r\n    const OPTS = {\r\n        mode: engine?.dataset.mode || \"all\",\r\n        submitMode: engine?.dataset.submitMode || \"auto\",\r\n        typeahead: engine?.dataset.typeahead === \"true\",\r\n        remember: engine?.dataset.remember === \"true\",\r\n        analytics: engine?.dataset.analytics === \"true\",\r\n        analyticsEvent: engine?.dataset.analyticsEvent || \"cover_search\",\r\n        idlePrefetch: engine?.dataset.idlePrefetch === \"true\",\r\n        recentMax: Math.max(1, Math.min(8, parseInt(engine?.dataset.recentMax, 10) || 8)),\r\n        recentLabel: engine?.dataset.recentLabel || \"Search again:\",\r\n    };\r\n    const isTouch = window.matchMedia && window.matchMedia(\"(pointer: coarse)\").matches;\r\n\r\n    const setStatus = (msg, isError = false) => {\r\n        if (!statusEl) return;\r\n        statusEl.textContent = msg || \"\";\r\n        statusEl.classList.toggle(\"is-error\", !!isError);\r\n        // errors must interrupt politely-queued speech, so bump the live region to assertive (WCAG 4.1.3)\r\n        statusEl.setAttribute(\"aria-live\", isError ? \"assertive\" : \"polite\");\r\n    };\r\n    const setStatusWithLinks = (parts, isError = false) => {\r\n        if (!statusEl) return;\r\n        statusEl.textContent = \"\";\r\n        parts.forEach((part) => {\r\n            if (typeof part === \"string\") { statusEl.appendChild(document.createTextNode(part)); return; }\r\n            if (!part.href) { statusEl.appendChild(document.createTextNode(part.text)); return; }\r\n            const link = document.createElement(\"a\");\r\n            link.className = \"not-found-link\";\r\n            link.href = part.href;\r\n            link.textContent = part.text;\r\n            link.style.color = \"inherit\";\r\n            link.style.textDecoration = \"underline\";\r\n            statusEl.appendChild(link);\r\n        });\r\n        statusEl.classList.toggle(\"is-error\", !!isError);\r\n        statusEl.setAttribute(\"aria-live\", isError ? \"assertive\" : \"polite\");\r\n    };\r\n    const setBusy = (busy) => { if (engine) engine.setAttribute(\"aria-busy\", busy ? \"true\" : \"false\"); };\r\n    const focusNext = (el) => { if (el && !isTouch && !el.disabled) { try { el.focus(); } catch (e) {} } };\r\n\r\n    const searchBtn = engine ? engine.querySelector(\".ess-search-btn\") : null;\r\n    const requiredReady = () => {\r\n        if (!yearSelect?.value || !makeSelect?.value || !modelSelect?.value) return false;\r\n        if (isTruckCovers() && (!cabSelect?.value || !bedSelect?.value)) return false;\r\n        if (isBoatCovers() && boatFeaturesSelectGroup && boatFeaturesSelectGroup.style.display !== \"none\" && !boatFeaturesSelect?.value) return false;\r\n        return true;\r\n    };\r\n    const updateButtonState = () => { if (searchBtn) searchBtn.disabled = !requiredReady(); };\r\n    if (searchBtn) searchBtn.addEventListener(\"click\", () => { if (requiredReady()) handleSearch(); });\r\n\r\n    /** Internal value for \"All Options\" \u2014 not used in the collection URL (same as make-model/year only) */\r\n    const BOAT_ALL_OPTIONS_VALUE = \"__boat_all_options__\";\r\n\r\n    let csvData = [];\r\n    let isLoading = false;\r\n    let isSearching = false;\r\n    const csvCache = new Map();\r\n    const MAX_CACHE_SIZE = 10;\r\n\r\n    const auxType = () => {\r\n        const opt = categorySelect?.options?.[categorySelect.selectedIndex];\r\n        const explicit = opt?.dataset?.aux;\r\n        if (explicit) return explicit;\r\n        const v = categorySelect?.value;\r\n        if (v === \"truck-covers\") return \"truck\";\r\n        if (v === \"boat-covers\") return \"boat\";\r\n        return \"\";\r\n    };\r\n    const isTruckCovers = () => auxType() === \"truck\";\r\n    const isBoatCovers = () => auxType() === \"boat\";\r\n\r\n    const isBoatFeaturesGroupVisible = () => {\r\n        if (!boatFeaturesSelectGroup) return false;\r\n        return boatFeaturesSelectGroup.style.display !== \"none\";\r\n    };\r\n\r\n    // Show/hide boat feature select (Boat Covers only)\r\n    const toggleBoatFeaturesSelect = () => {\r\n        const show = isBoatCovers();\r\n        if (boatFeaturesSelectGroup) {\r\n            boatFeaturesSelectGroup.style.display = show ? \"\" : \"none\";\r\n        }\r\n        if (!show && boatFeaturesSelect) {\r\n            boatFeaturesSelect.disabled = true;\r\n            boatFeaturesSelect.innerHTML = '<option value=\"\">SELECT FEATURES</option>';\r\n        }\r\n    };\r\n\r\n    // Show/hide cab and bed selects based on category\r\n    const toggleTruckSelects = () => {\r\n        const show = isTruckCovers();\r\n        if (cabSelectGroup) cabSelectGroup.style.display = show ? \"\" : \"none\";\r\n        if (bedSelectGroup) bedSelectGroup.style.display = show ? \"\" : \"none\";\r\n        \r\n        if (!show) {\r\n            // Reset and disable when hiding\r\n            if (cabSelect) {\r\n                cabSelect.disabled = true;\r\n                populateSelect(cabSelect, [], \"SELECT CAB\");\r\n            }\r\n            if (bedSelect) {\r\n                bedSelect.disabled = true;\r\n                populateSelect(bedSelect, [], \"SELECT BED\");\r\n            }\r\n        }\r\n    };\r\n\r\n    const cacheCsvData = (key, data) => {\r\n        if (!key || !Array.isArray(data)) return;\r\n        if (csvCache.size >= MAX_CACHE_SIZE) {\r\n            const oldestKey = csvCache.keys().next().value;\r\n            csvCache.delete(oldestKey);\r\n        }\r\n        csvCache.set(key, data);\r\n    };\r\n\r\n    const getCachedCsvData = (key) => {\r\n        if (!key) return undefined;\r\n        return csvCache.get(key);\r\n    };\r\n\r\n    // Improved CSV parser that handles quoted fields and commas\r\n    const parseCSV = (csvText) => {\r\n        try {\r\n            const lines = csvText.split(\"\\n\").filter(line => line.trim());\r\n            if (lines.length === 0) {\r\n                throw new Error(\"CSV file is empty\");\r\n            }\r\n\r\n            // Parse header row\r\n            const headers = parseCSVLine(lines[0]);\r\n            if (headers.length === 0) {\r\n                throw new Error(\"CSV header is empty\");\r\n            }\r\n\r\n            const upper = headers.map(h => h.trim().toUpperCase());\r\n            [\"YEAR\", \"MAKE\", \"MODEL\"].forEach(col => {\r\n                if (!upper.includes(col)) console.warn(`CSV is missing expected column: ${col}`);\r\n            });\r\n\r\n            const data = [];\r\n            \r\n            // Parse data rows\r\n            for (let i = 1; i < lines.length; i++) {\r\n                if (!lines[i].trim()) continue;\r\n                \r\n                try {\r\n                    const values = parseCSVLine(lines[i]);\r\n                    if (values.length !== headers.length) {\r\n                        console.warn(`Row ${i + 1} has ${values.length} columns, expected ${headers.length}. Skipping.`);\r\n                        continue;\r\n                    }\r\n                    \r\n                    const row = {};\r\n                    headers.forEach((header, index) => {\r\n                        row[header.trim()] = (values[index] ? values[index].trim() : \"\");\r\n                    });\r\n                    data.push(row);\r\n                } catch (error) {\r\n                    console.warn(`Error parsing row ${i + 1}:`, error);\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            if (data.length === 0) {\r\n                throw new Error(\"No valid data rows found in CSV\");\r\n            }\r\n\r\n            return data;\r\n        } catch (error) {\r\n            console.error(\"CSV parsing error:\", error);\r\n            throw error;\r\n        }\r\n    };\r\n\r\n    // Helper function to parse a CSV line, handling quoted fields\r\n    const parseCSVLine = (line) => {\r\n        const values = [];\r\n        let current = \"\";\r\n        let inQuotes = false;\r\n        \r\n        for (let i = 0; i < line.length; i++) {\r\n            const char = line[i];\r\n            const nextChar = line[i + 1];\r\n            \r\n            if (char === '\"') {\r\n                if (inQuotes && nextChar === '\"') {\r\n                    // Escaped quote\r\n                    current += '\"';\r\n                    i++; // Skip next quote\r\n                } else {\r\n                    // Toggle quote state\r\n                    inQuotes = !inQuotes;\r\n                }\r\n            } else if (char === ',' && !inQuotes) {\r\n                // End of field\r\n                values.push(current);\r\n                current = \"\";\r\n            } else {\r\n                current += char;\r\n            }\r\n        }\r\n        \r\n        // Add last field\r\n        values.push(current);\r\n        return values;\r\n    };\r\n\r\n    // Function to populate a select element with error handling\r\n    const populateSelect = (selectElement, options, placeholder) => {\r\n        if (!selectElement) {\r\n            console.warn(\"Select element not found\");\r\n            return;\r\n        }\r\n\r\n        try {\r\n            selectElement.innerHTML = `<option value=\"\">${placeholder}</option>`;\r\n            \r\n            if (!Array.isArray(options)) {\r\n                console.warn(\"Options is not an array\");\r\n                return;\r\n            }\r\n\r\n            options.forEach(option => {\r\n                if (option) {\r\n                    const opt = document.createElement(\"option\");\r\n                    opt.value = option;\r\n                    opt.textContent = option;\r\n                    selectElement.appendChild(opt);\r\n                }\r\n            });\r\n\r\n            selectElement.disabled = options.length === 0;\r\n        } catch (error) {\r\n            console.error(\"Error populating select:\", error);\r\n        }\r\n    };\r\n\r\n    /**\r\n     * Normalize a value for matching (used when comparing CSV values to URL values)\r\n     * - lowercase\r\n     * - spaces, dots, slashes \u2192 hyphens\r\n     * - trim whitespace\r\n     */\r\n    const normalizeValue = (value) => {\r\n        if (!value) return \"\";\r\n        return value\r\n            .toString()\r\n            .trim()\r\n            .toLowerCase()\r\n            .replace(/[\\s.\\/]/g, \"-\")\r\n            .replace(/-+/g, \"-\")\r\n            .replace(/^-+|-+$/g, \"\");\r\n    };\r\n\r\n    /**\r\n     * Normalize a value for Shopify collection handles (Liquid handleize\u2013style):\r\n     * - lowercase, strip accents\r\n     * - spaces, dots, slashes, underscores \u2192 hyphens\r\n     * - only a-z, 0-9, and hyphens in the result (drops *, /, quotes, etc.)\r\n     * - repeated hyphens collapsed, trimmed\r\n     *\r\n     * \"+\" is the exception and depends on mode, because this store's collection\r\n     * handles were generated by four different eras of tooling:\r\n     * - live:   dropped after a letter or digit when a space or the end follows,\r\n     *           otherwise \"-plus-\" (this is the long-standing rule)\r\n     * - hyphen: always \"-plus-\"            e.g. 3.0+ PRFRMNC -> 3-0-plus-prfrmnc\r\n     * - glued:  \"-plus\" before a letter or digit  e.g. PRFRM+150HP -> prfrm-plus150hp\r\n     * - dash:   \"-\"                        e.g. PRFRM+150HP -> prfrm-150hp\r\n     *\r\n     * buildHandleCandidates() returns the deduped handles in that order, live first,\r\n     * and the search navigates to the first destination that actually has products.\r\n     * A value without \"+\" yields exactly one candidate, so ordinary searches are\r\n     * unchanged and make a single request.\r\n     */\r\n    const normalizeForShopifyMode = (value, mode) => {\r\n        if (!value) return \"\";\r\n\r\n        let normalized = value.toString().trim().toLowerCase();\r\n        normalized = normalized.replace(/[\u00F8\u00E6\u0153\u0142\u0111\u00F0\u00DF\u00FE]/g, (c) => ({ \"\u00F8\": \"o\", \"\u00E6\": \"ae\", \"\u0153\": \"oe\", \"\u0142\": \"l\", \"\u0111\": \"d\", \"\u00F0\": \"d\", \"\u00DF\": \"ss\", \"\u00FE\": \"th\" }[c]));\r\n\r\n        if (typeof normalized.normalize === \"function\") {\r\n            normalized = normalized\r\n                .normalize(\"NFD\")\r\n                .replace(/[\\u0300-\\u036f]/g, \"\");\r\n        }\r\n\r\n        if (mode === \"shopify\") {\r\n            return normalized.replace(/[\"'\\/]/g, \"\").replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\");\r\n        }\r\n        if (mode === \"glued\") {\r\n            normalized = normalized.replace(/\\+(?=[a-z0-9])/g, \"-plus\");\r\n        } else if (mode === \"dash\") {\r\n            normalized = normalized.replace(/\\+/g, \"-\");\r\n        } else if (mode !== \"hyphen\") {\r\n            normalized = normalized.replace(/([a-z0-9])\\+(?=\\s|$)/g, \"$1\");\r\n        }\r\n        normalized = normalized.replace(/\\+/g, \"-plus-\");\r\n\r\n        normalized = normalized.replace(/[\\s._\\/]/g, \"-\");\r\n        normalized = normalized.replace(/[^a-z0-9-]/g, \"\");\r\n        normalized = normalized.replace(/-+/g, \"-\");\r\n        normalized = normalized.replace(/^-+|-+$/g, \"\");\r\n\r\n        return normalized;\r\n    };\r\n\r\n    const buildHandleCandidates = (parts) => {\r\n        const clean = parts.filter((p) => p !== null && p !== undefined && String(p).length > 0);\r\n        const out = [];\r\n        [\"live\", \"hyphen\", \"glued\", \"dash\", \"shopify\"].forEach((mode) => {\r\n            const segments = clean.map((p) => normalizeForShopifyMode(p, mode));\r\n            if (segments.some((s) => !s)) return;\r\n            const handle = segments.join(\"-\");\r\n            if (handle && out.indexOf(handle) === -1) out.push(handle);\r\n        });\r\n        return out;\r\n    };\r\n\r\n    const normalizeForShopify = (value) => normalizeForShopifyMode(value, \"live\");\r\n\r\n    /**\r\n     * Find matching option value in select element\r\n     * Used to match URL values to CSV options\r\n     */\r\n    const findOptionValue = (selectElement, tagValue) => {\r\n        if (!selectElement || !tagValue) {\r\n            return \"\";\r\n        }\r\n\r\n        // Decode the tag value\r\n        const decoded = decodeURIComponent(tagValue);\r\n\r\n        // For years, do exact match (no normalization)\r\n        const isYearSelect = selectElement.id === \"year-select\";\r\n\r\n        if (isYearSelect) {\r\n            // For years, do exact string match (trimmed)\r\n            const trimmedDecoded = decoded.trim();\r\n\r\n            for (const option of selectElement.options) {\r\n                if (option.value && option.value.trim() === trimmedDecoded) {\r\n                    return option.value;\r\n                }\r\n            }\r\n        } else {\r\n            // For make/model, use normalization\r\n            const normalizedTag = normalizeValue(\r\n                decoded.replace(/-/g, \" \").replace(/\\s+/g, \"-\")\r\n            );\r\n            for (const option of selectElement.options) {\r\n                if (option.value) {\r\n                    const normalizedOption = normalizeValue(option.value);\r\n                    if (normalizedOption === normalizedTag) {\r\n                        return option.value;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return \"\";\r\n    };\r\n\r\n    /**\r\n     * Update makes dropdown based on selected year\r\n     */\r\n    const updateMakes = (year) => {\r\n        if (!csvData || csvData.length === 0) return;\r\n        const makes = [\r\n            ...new Set(\r\n                csvData\r\n                    .filter((row) => {\r\n                        const rowYear = row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\";\r\n                        return normalizeValue(rowYear) === normalizeValue(year);\r\n                    })\r\n                    .map((row) => row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\")\r\n            ),\r\n        ]\r\n            .filter(Boolean)\r\n            .sort((a, b) => a.localeCompare(b));\r\n        populateSelect(makeSelect, makes, \"SELECT MAKE\");\r\n    };\r\n\r\n    /**\r\n     * Update models dropdown based on selected year and make\r\n     */\r\n    const updateModels = (year, make) => {\r\n        if (!csvData || csvData.length === 0) return;\r\n        const models = [\r\n            ...new Set(\r\n                csvData\r\n                    .filter((row) => {\r\n                        const rowYear = row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\";\r\n                        const rowMake = row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\";\r\n                        return normalizeValue(rowYear) === normalizeValue(year) &&\r\n                               normalizeValue(rowMake) === normalizeValue(make);\r\n                    })\r\n                    .map((row) => row.MODEL ? row.MODEL.replace(\"MODEL_\", \"\") : \"\")\r\n            ),\r\n        ]\r\n            .filter(Boolean)\r\n            .sort((a, b) => a.localeCompare(b));\r\n        populateSelect(modelSelect, models, \"SELECT MODEL\");\r\n    };\r\n\r\n    /**\r\n     * Update cabs dropdown based on selected year, make, and model (for trucks only)\r\n     */\r\n    const updateCabs = (year, make, model) => {\r\n        if (!csvData || csvData.length === 0 || !isTruckCovers()) return;\r\n        if (!cabSelect) return;\r\n        \r\n        const cabs = [\r\n            ...new Set(\r\n                csvData\r\n                    .filter((row) => {\r\n                        const rowYear = row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\";\r\n                        const rowMake = row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\";\r\n                        const rowModel = row.MODEL ? row.MODEL.replace(\"MODEL_\", \"\") : \"\";\r\n                        return normalizeValue(rowYear) === normalizeValue(year) &&\r\n                               normalizeValue(rowMake) === normalizeValue(make) &&\r\n                               normalizeValue(rowModel) === normalizeValue(model);\r\n                    })\r\n                    .map((row) => row.CAB ? row.CAB.replace(\"CAB_\", \"\") : \"\")\r\n            ),\r\n        ]\r\n            .filter(Boolean)\r\n            .sort((a, b) => a.localeCompare(b));\r\n        populateSelect(cabSelect, cabs, \"SELECT CAB\");\r\n    };\r\n\r\n    /**\r\n     * Update beds dropdown based on selected year, make, model, and cab (for trucks only)\r\n     */\r\n    const updateBeds = (year, make, model, cab) => {\r\n        if (!csvData || csvData.length === 0 || !isTruckCovers()) return;\r\n        if (!bedSelect) return;\r\n        \r\n        const beds = [\r\n            ...new Set(\r\n                csvData\r\n                    .filter((row) => {\r\n                        const rowYear = row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\";\r\n                        const rowMake = row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\";\r\n                        const rowModel = row.MODEL ? row.MODEL.replace(\"MODEL_\", \"\") : \"\";\r\n                        const rowCab = row.CAB ? row.CAB.replace(\"CAB_\", \"\") : \"\";\r\n                        return normalizeValue(rowYear) === normalizeValue(year) &&\r\n                               normalizeValue(rowMake) === normalizeValue(make) &&\r\n                               normalizeValue(rowModel) === normalizeValue(model) &&\r\n                               normalizeValue(rowCab) === normalizeValue(cab);\r\n                    })\r\n                    .map((row) => row.BED ? row.BED.replace(\"BED_\", \"\") : \"\")\r\n            ),\r\n        ]\r\n            .filter(Boolean)\r\n            .sort((a, b) => a.localeCompare(b));\r\n        populateSelect(bedSelect, beds, \"SELECT BED\");\r\n    };\r\n\r\n    const getBoatFeatureFromRow = (row) => {\r\n        if (!row || typeof row !== \"object\") return \"\";\r\n        const key = Object.keys(row).find((k) => {\r\n            const n = k.trim().toUpperCase();\r\n            return (\r\n                n === \"FEATURES\" ||\r\n                n === \"FEATURE\" ||\r\n                n === \"BOAT_FEATURES\" ||\r\n                n === \"BOAT_FEATURE\"\r\n            );\r\n        });\r\n        if (!key) return \"\";\r\n        let v = String(row[key]).trim();\r\n        if (!v) return \"\";\r\n        v = v.replace(/^FEATURES_/i, \"\").replace(/^FEATURE_/i, \"\");\r\n        return v;\r\n    };\r\n\r\n    /**\r\n     * Populate boat features from CSV for Y/M/M. If no feature variants exist, redirect without feature segment.\r\n     */\r\n    const updateBoatFeatures = (year, make, model) => {\r\n        if (!isBoatCovers() || !boatFeaturesSelect || !csvData.length) return;\r\n\r\n        const rows = csvData.filter((row) => {\r\n            const rowYear = row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\";\r\n            const rowMake = row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\";\r\n            const rowModel = row.MODEL ? row.MODEL.replace(\"MODEL_\", \"\") : \"\";\r\n            return (\r\n                normalizeValue(rowYear) === normalizeValue(year) &&\r\n                normalizeValue(rowMake) === normalizeValue(make) &&\r\n                normalizeValue(rowModel) === normalizeValue(model)\r\n            );\r\n        });\r\n\r\n        const raw = rows.map(getBoatFeatureFromRow).filter(Boolean);\r\n        const unique = [...new Set(raw)].sort((a, b) => a.localeCompare(b));\r\n\r\n        if (unique.length === 0) {\r\n            if (boatFeaturesSelectGroup) boatFeaturesSelectGroup.style.display = \"none\";\r\n            boatFeaturesSelect.disabled = true;\r\n            boatFeaturesSelect.innerHTML = '<option value=\"\">SELECT FEATURES</option>';\r\n            handleSearch();\r\n            return;\r\n        }\r\n\r\n        if (boatFeaturesSelectGroup) boatFeaturesSelectGroup.style.display = \"\";\r\n        boatFeaturesSelect.innerHTML = \"\";\r\n        const ph = document.createElement(\"option\");\r\n        ph.value = \"\";\r\n        ph.textContent = \"SELECT FEATURES\";\r\n        ph.disabled = true;\r\n        ph.selected = true;\r\n        boatFeaturesSelect.appendChild(ph);\r\n\r\n        const allOpt = document.createElement(\"option\");\r\n        allOpt.value = BOAT_ALL_OPTIONS_VALUE;\r\n        allOpt.textContent = \"All Options\";\r\n        boatFeaturesSelect.appendChild(allOpt);\r\n\r\n        unique.forEach((f) => {\r\n            const opt = document.createElement(\"option\");\r\n            opt.value = f;\r\n            opt.textContent = f;\r\n            boatFeaturesSelect.appendChild(opt);\r\n        });\r\n\r\n        boatFeaturesSelect.disabled = false;\r\n    };\r\n\r\n    // Function to handle search submission with new URL format\r\n    const handleSearch = async () => {\r\n        const selectedYear = yearSelect?.value;\r\n        const selectedMake = makeSelect?.value;\r\n        const selectedModel = modelSelect?.value;\r\n        const selectedCab = isTruckCovers() ? (cabSelect ? cabSelect.value : \"\") : \"\";\r\n        const selectedBed = isTruckCovers() ? (bedSelect ? bedSelect.value : \"\") : \"\";\r\n\r\n        // Validate required selections (Year, Make, Model)\r\n        if (!selectedYear || !selectedMake || !selectedModel) {\r\n            console.warn(\"Year, Make, and Model must be selected before searching\");\r\n            return;\r\n        }\r\n\r\n        // For truck-covers, require cab and bed\r\n        if (isTruckCovers() && (!selectedCab || !selectedBed)) {\r\n            console.warn(\"Cab and Bed must be selected for truck covers\");\r\n            return;\r\n        }\r\n\r\n        // Boat: when feature UI is shown, pick a CSV feature or \"All Options\" (placeholder alone is invalid)\r\n        if (isBoatCovers() && isBoatFeaturesGroupVisible()) {\r\n            const bf = boatFeaturesSelect?.value ?? \"\";\r\n            if (bf === \"\") {\r\n                console.warn(\"Select a boat feature or All Options\");\r\n                return;\r\n            }\r\n        }\r\n\r\n        try {\r\n            const handleParts = [selectedMake, selectedModel];\r\n\r\n            if (isBoatCovers()) {\r\n                const bf = boatFeaturesSelect?.value ?? \"\";\r\n                if (bf && bf !== BOAT_ALL_OPTIONS_VALUE) {\r\n                    if (!normalizeForShopify(bf)) {\r\n                        console.warn(\"Boat feature normalized to an empty handle segment\");\r\n                        setStatus(\"Could not build a valid search URL for this selection. Please try another option.\", true);\r\n                        return;\r\n                    }\r\n                    handleParts.push(bf);\r\n                }\r\n            }\r\n\r\n            if (isTruckCovers() && selectedCab && selectedBed) {\r\n                if (!normalizeForShopify(selectedCab) || !normalizeForShopify(selectedBed)) {\r\n                    console.warn(\"Cab or bed normalized to an empty handle segment\");\r\n                    setStatus(\"Could not build a valid search URL for this selection. Please try another option.\", true);\r\n                    return;\r\n                }\r\n                handleParts.push(selectedCab, selectedBed);\r\n            }\r\n\r\n            const handleCandidates = buildHandleCandidates(handleParts);\r\n\r\n            if (!handleCandidates.length) {\r\n                console.warn(\"Search could not build a valid collection handle from the selection\");\r\n                setStatus(\"Could not build a valid search URL for this selection. Please try another option.\", true);\r\n                return;\r\n            }\r\n\r\n            const urlForHandle = (h) => `/collections/${h}/${selectedYear}`;\r\n            let url = urlForHandle(handleCandidates[0]);\r\n            const vlabel = `${selectedYear} ${selectedMake} ${selectedModel}`.replace(/\\s+/g, \" \").trim();\r\n\r\n            // Block a second concurrent search (double analytics / racing navigation) while the HEAD check is in flight.\r\n            if (isSearching) return;\r\n            isSearching = true;\r\n\r\n            if (OPTS.analytics) {\r\n                const payload = { event: OPTS.analyticsEvent, category: categorySelect?.value || \"\", year: selectedYear, make: selectedMake, model: selectedModel };\r\n                if (selectedCab) payload.cab = selectedCab;\r\n                if (selectedBed) payload.bed = selectedBed;\r\n                const bf = boatFeaturesSelect?.value; if (bf && bf !== BOAT_ALL_OPTIONS_VALUE) payload.feature = bf;\r\n                // Fire both transports: GTM listens for the dataLayer event; GA4-via-gtag uses gtag(). gtag.js ignores\r\n                // plain {event} objects in dataLayer, so standard single-tool setups do not double-count.\r\n                try { (window.dataLayer = window.dataLayer || []).push(payload); } catch (e) {}\r\n                try { if (typeof window.gtag === \"function\") window.gtag(\"event\", OPTS.analyticsEvent, payload); } catch (e) {}\r\n            }\r\n\r\n            let ok = true;\r\n            try {\r\n                for (let i = 0; i < handleCandidates.length; i++) {\r\n                    const candidateUrl = urlForHandle(handleCandidates[i]);\r\n                    const ctrl = new AbortController();\r\n                    const t = setTimeout(() => ctrl.abort(), 3500);\r\n                    const resp = await fetch(candidateUrl, { signal: ctrl.signal });\r\n                    clearTimeout(t);\r\n                    let candidateOk = true;\r\n                    if (resp.status === 404) {\r\n                        candidateOk = false;\r\n                    } else if (resp.ok) {\r\n                        const doc = new DOMParser().parseFromString(await resp.text(), \"text/html\");\r\n                        if (doc.querySelectorAll(\"#product-grid .card-product\").length === 0) candidateOk = false;\r\n                    }\r\n                    if (candidateOk) { url = candidateUrl; ok = true; break; }\r\n                    ok = false;\r\n                }\r\n            } catch (e) { ok = true; }\r\n\r\n            if (OPTS.remember) {\r\n                try {\r\n                    const RKEY = \"ess-recent-vehicles\";\r\n                    let rlist = [];\r\n                    try { rlist = JSON.parse(localStorage.getItem(RKEY)) || []; } catch (e) {}\r\n                    if (!Array.isArray(rlist)) rlist = [];\r\n                    rlist = rlist.filter(function (it) { return it && it.url !== url; });\r\n                    rlist.unshift({ label: vlabel, url: url });\r\n                    localStorage.setItem(RKEY, JSON.stringify(rlist.slice(0, 12)));\r\n                } catch (e) {}\r\n            }\r\n\r\n            if (!ok) {\r\n                const sizeLink = engine?.parentElement.querySelector(`.shop-by-size-link[data-category=\"${categorySelect?.value || \"\"}\"]`);\r\n                const contactLink = engine?.parentElement.querySelector(\".ess-cantfind\");\r\n                setStatusWithLinks([\r\n                    \"Sorry, we couldn't find that exact match. Please \",\r\n                    { text: \"shop by size\", href: sizeLink ? sizeLink.getAttribute(\"href\") : \"\" },\r\n                    \" or \",\r\n                    { text: \"contact us\", href: contactLink ? contactLink.getAttribute(\"href\") : \"/pages/contact-us\" },\r\n                ], true);\r\n                const cf = engine?.parentElement.querySelector(\".ess-cantfind\");\r\n                if (cf) cf.style.display = \"inline-block\";\r\n                isSearching = false;\r\n                return;\r\n            }\r\n\r\n            window.location.href = url;\r\n        } catch (error) {\r\n            console.error(\"Error handling search:\", error);\r\n            setStatus(\"An error occurred while processing your search. Please try again.\", true);\r\n            isSearching = false;\r\n        }\r\n    };\r\n\r\n    // Function to show loading state\r\n    const setLoadingState = (isLoading) => {\r\n        if (yearSelect) yearSelect.disabled = isLoading || !categorySelect?.value;\r\n        if (makeSelect) makeSelect.disabled = isLoading || !yearSelect?.value;\r\n        if (modelSelect) modelSelect.disabled = isLoading || !makeSelect?.value;\r\n        if (isTruckCovers()) {\r\n            if (cabSelect) cabSelect.disabled = isLoading || !modelSelect?.value;\r\n            if (bedSelect) bedSelect.disabled = isLoading || !cabSelect?.value;\r\n        }\r\n        if (isBoatCovers() && boatFeaturesSelect) {\r\n            const groupHidden = boatFeaturesSelectGroup?.style.display === \"none\";\r\n            boatFeaturesSelect.disabled =\r\n                isLoading || !modelSelect?.value || groupHidden;\r\n        }\r\n    };\r\n\r\n    // Event listener for Category selection with improved error handling\r\n    categorySelect?.addEventListener(\"change\", async () => {\r\n        const selectedCategory = categorySelect.value;\r\n        \r\n        // Toggle truck-specific selects\r\n        toggleTruckSelects();\r\n        toggleBoatFeaturesSelect();\r\n\r\n        // Reset dependent selects\r\n        if (yearSelect) {\r\n            yearSelect.disabled = true;\r\n            populateSelect(yearSelect, [], \"SELECT YEAR\");\r\n        }\r\n        if (makeSelect) {\r\n            makeSelect.disabled = true;\r\n            populateSelect(makeSelect, [], \"SELECT MAKE\");\r\n        }\r\n        if (modelSelect) {\r\n            modelSelect.disabled = true;\r\n            populateSelect(modelSelect, [], \"SELECT MODEL\");\r\n        }\r\n        if (boatFeaturesSelect && isBoatCovers()) {\r\n            boatFeaturesSelect.disabled = true;\r\n            boatFeaturesSelect.innerHTML = '<option value=\"\">SELECT FEATURES</option>';\r\n        }\r\n\r\n        if (!selectedCategory) {\r\n            return;\r\n        }\r\n\r\n        const cacheKey = selectedCategory;\r\n        const cachedData = getCachedCsvData(cacheKey);\r\n\r\n        if (cachedData && Array.isArray(cachedData) && cachedData.length > 0) {\r\n            csvData = cachedData;\r\n\r\n            const uniqueYears = [...new Set(\r\n                csvData\r\n                    .map(row => row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\")\r\n                    .filter(year => year)\r\n            )].sort((a, b) => {\r\n                const numA = parseInt(a, 10);\r\n                const numB = parseInt(b, 10);\r\n                return Number.isNaN(numA) || Number.isNaN(numB) ? a.localeCompare(b) : numB - numA;\r\n            });\r\n\r\n            populateSelect(yearSelect, uniqueYears, \"SELECT YEAR\");\r\n            return;\r\n        }\r\n\r\n        const csvFile = categorySelect.options[categorySelect.selectedIndex]?.dataset?.csv;\r\n        \r\n        if (!csvFile) {\r\n            console.error(\"No CSV file specified for category:\", selectedCategory);\r\n            return;\r\n        }\r\n\r\n        // Prevent multiple simultaneous loads\r\n        if (isLoading) {\r\n            console.warn(\"CSV is already loading\");\r\n            return;\r\n        }\r\n\r\n        isLoading = true;\r\n        setLoadingState(true);\r\n        setBusy(true);\r\n        setStatus(\"Loading vehicles\u2026\");\r\n\r\n        try {\r\n            // Add protocol if missing (for CDN URLs)\r\n            const csvUrl = csvFile.startsWith('//') ? `https:${csvFile}` : csvFile;\r\n            const ssKey = `ess-csv:${csvUrl}`;\r\n            let text = null;\r\n            try { const cached = sessionStorage.getItem(ssKey); if (cached) text = cached; } catch (e) {}\r\n\r\n            if (text === null) {\r\n                const response = await fetch(csvUrl, { method: 'GET', headers: { 'Accept': 'text/csv' } });\r\n                if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); }\r\n                text = await response.text();\r\n                if (!text || text.trim().length === 0) { throw new Error(\"CSV file is empty\"); }\r\n                try { if (text.length < 3000000) sessionStorage.setItem(ssKey, text); } catch (e) {}\r\n            }\r\n\r\n            csvData = parseCSV(text);\r\n\r\n            if (!csvData || csvData.length === 0) {\r\n                throw new Error(\"No data found in CSV file\");\r\n            }\r\n\r\n            cacheCsvData(cacheKey, csvData);\r\n\r\n            // Extract unique years\r\n            const uniqueYears = [...new Set(\r\n                csvData\r\n                    .map(row => row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\")\r\n                    .filter(year => year)\r\n            )].sort((a, b) => {\r\n                const numA = parseInt(a);\r\n                const numB = parseInt(b);\r\n                return isNaN(numA) || isNaN(numB) ? a.localeCompare(b) : numB - numA;\r\n            });\r\n\r\n            populateSelect(yearSelect, uniqueYears, \"SELECT YEAR\");\r\n            \r\n        } catch (error) {\r\n            console.error(\"Error loading CSV:\", error);\r\n            setStatus(`Failed to load data for ${selectedCategory}. Please try again later.`, true);\r\n            csvData = [];\r\n        } finally {\r\n            isLoading = false;\r\n            setLoadingState(false);\r\n            setBusy(false);\r\n            // Only clear the transient \"Loading\u2026\" status \u2014 preserve an error message set in catch.\r\n            if (statusEl && !statusEl.classList.contains(\"is-error\")) setStatus(\"\");\r\n        }\r\n    });\r\n\r\n    // Event listener for Year selection with error handling\r\n    yearSelect?.addEventListener(\"change\", () => {\r\n        const selectedYear = yearSelect.value;\r\n        \r\n        if (makeSelect) {\r\n            makeSelect.disabled = true;\r\n            populateSelect(makeSelect, [], \"SELECT MAKE\");\r\n        }\r\n        if (modelSelect) {\r\n            modelSelect.disabled = true;\r\n            populateSelect(modelSelect, [], \"SELECT MODEL\");\r\n        }\r\n        if (boatFeaturesSelect && isBoatCovers()) {\r\n            boatFeaturesSelect.disabled = true;\r\n            boatFeaturesSelect.innerHTML = '<option value=\"\">SELECT FEATURES</option>';\r\n        }\r\n\r\n        if (!selectedYear || !csvData || csvData.length === 0) {\r\n            return;\r\n        }\r\n\r\n        try {\r\n            const filteredData = csvData.filter(row => \r\n                (row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\") === selectedYear\r\n            );\r\n\r\n            if (filteredData.length === 0) {\r\n                console.warn(\"No makes found for year:\", selectedYear);\r\n                setStatus(\"No makes found for that year.\", true);\r\n                return;\r\n            }\r\n\r\n            const uniqueMakes = [...new Set(\r\n                filteredData\r\n                    .map(row => row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\")\r\n                    .filter(make => make)\r\n            )].sort();\r\n\r\n            populateSelect(makeSelect, uniqueMakes, \"SELECT MAKE\");\r\n            if (uniqueMakes.length === 0) { setStatus(\"No makes found for that year.\", true); }\r\n            else { setStatus(\"\"); focusNext(makeSelect); }\r\n        } catch (error) {\r\n            console.error(\"Error filtering by year:\", error);\r\n        }\r\n    });\r\n\r\n    // Event listener for Make selection with error handling\r\n    makeSelect?.addEventListener(\"change\", () => {\r\n        const selectedYear = yearSelect?.value;\r\n        const selectedMake = makeSelect?.value;\r\n        \r\n        if (modelSelect) {\r\n            modelSelect.disabled = true;\r\n            populateSelect(modelSelect, [], \"SELECT MODEL\");\r\n        }\r\n        if (cabSelect && isTruckCovers()) {\r\n            cabSelect.disabled = true;\r\n            populateSelect(cabSelect, [], \"SELECT CAB\");\r\n        }\r\n        if (bedSelect && isTruckCovers()) {\r\n            bedSelect.disabled = true;\r\n            populateSelect(bedSelect, [], \"SELECT BED\");\r\n        }\r\n        if (boatFeaturesSelect && isBoatCovers()) {\r\n            boatFeaturesSelect.disabled = true;\r\n            boatFeaturesSelect.innerHTML = '<option value=\"\">SELECT FEATURES</option>';\r\n        }\r\n\r\n        if (!selectedMake || !selectedYear || !csvData || csvData.length === 0) {\r\n            return;\r\n        }\r\n\r\n        try {\r\n            const filteredData = csvData.filter(row => \r\n                (row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\") === selectedYear &&\r\n                (row.MAKE ? row.MAKE.replace(\"MAKE_\", \"\") : \"\") === selectedMake\r\n            );\r\n\r\n            if (filteredData.length === 0) {\r\n                console.warn(\"No models found for year and make:\", selectedYear, selectedMake);\r\n                setStatus(\"No models found for that selection.\", true);\r\n                return;\r\n            }\r\n\r\n            const uniqueModels = [...new Set(\r\n                filteredData\r\n                    .map(row => row.MODEL ? row.MODEL.replace(\"MODEL_\", \"\") : \"\")\r\n                    .filter(model => model)\r\n            )].sort();\r\n\r\n            populateSelect(modelSelect, uniqueModels, \"SELECT MODEL\");\r\n            if (uniqueModels.length === 0) { setStatus(\"No models found for that selection.\", true); }\r\n            else { setStatus(\"\"); focusNext(modelSelect); }\r\n        } catch (error) {\r\n            console.error(\"Error filtering by make:\", error);\r\n        }\r\n    });\r\n\r\n    // Event listener for Model selection\r\n    modelSelect?.addEventListener(\"change\", () => {\r\n        const selectedYear = yearSelect?.value;\r\n        const selectedMake = makeSelect?.value;\r\n        const selectedModel = modelSelect?.value;\r\n\r\n        // For trucks, update cabs dropdown\r\n        if (isTruckCovers() && selectedYear && selectedMake && selectedModel) {\r\n            updateCabs(selectedYear, selectedMake, selectedModel);\r\n        }\r\n\r\n        // Boat: load feature options (or redirect if no feature variants for this Y/M/M)\r\n        if (isBoatCovers() && selectedYear && selectedMake && selectedModel) {\r\n            updateBoatFeatures(selectedYear, selectedMake, selectedModel);\r\n            return;\r\n        }\r\n\r\n        // For standard collections (not truck, not features, not boat), trigger search immediately\r\n        if (!isTruckCovers() && !isBoatCovers() && selectedYear && selectedMake && selectedModel) {\r\n            if (OPTS.submitMode === \"auto\") handleSearch(); else updateButtonState();\r\n        }\r\n        // For truck and features collections, wait for additional selections\r\n        updateButtonState();\r\n    });\r\n\r\n    // Event listener for Cab selection (trucks only)\r\n    cabSelect?.addEventListener(\"change\", () => {\r\n        const selectedYear = yearSelect?.value;\r\n        const selectedMake = makeSelect?.value;\r\n        const selectedModel = modelSelect?.value;\r\n        const selectedCab = cabSelect?.value;\r\n\r\n        if (isTruckCovers() && selectedYear && selectedMake && selectedModel && selectedCab) {\r\n            updateBeds(selectedYear, selectedMake, selectedModel, selectedCab);\r\n        }\r\n        updateButtonState();\r\n    });\r\n\r\n    // Event listener for Bed selection - triggers search for trucks\r\n    bedSelect?.addEventListener(\"change\", () => {\r\n        if (isTruckCovers()) {\r\n            const selectedYear = yearSelect?.value;\r\n            const selectedMake = makeSelect?.value;\r\n            const selectedModel = modelSelect?.value;\r\n            const selectedCab = cabSelect?.value;\r\n            const selectedBed = bedSelect?.value;\r\n\r\n            if (selectedYear && selectedMake && selectedModel && selectedCab && selectedBed) {\r\n                if (OPTS.submitMode === \"auto\") handleSearch(); else updateButtonState();\r\n            }\r\n        }\r\n    });\r\n\r\n    // Boat feature selection \u2014 CSV feature or \"All Options\" \u2192 redirect\r\n    boatFeaturesSelect?.addEventListener(\"change\", () => {\r\n        if (!isBoatCovers()) return;\r\n        const selectedYear = yearSelect?.value;\r\n        const selectedMake = makeSelect?.value;\r\n        const selectedModel = modelSelect?.value;\r\n        const v = boatFeaturesSelect?.value ?? \"\";\r\n        if (!selectedYear || !selectedMake || !selectedModel || v === \"\") {\r\n            return;\r\n        }\r\n        if (OPTS.submitMode === \"auto\") handleSearch(); else updateButtonState();\r\n        updateButtonState();\r\n    });\r\n\r\n    // Initialize truck / boat auxiliary selects visibility on page load\r\n    toggleTruckSelects();\r\n    toggleBoatFeaturesSelect();\r\n\r\n    // When category is pre-selected (e.g. smart-search.liquid on a page), load CSV and populate years\r\n    const initialCategory = categorySelect?.value;\r\n    if (initialCategory) {\r\n        const cachedData = getCachedCsvData(initialCategory);\r\n        if (cachedData && Array.isArray(cachedData) && cachedData.length > 0) {\r\n            csvData = cachedData;\r\n            const uniqueYears = [...new Set(\r\n                csvData\r\n                    .map(row => row.YEAR ? row.YEAR.replace(\"YEAR_\", \"\") : \"\")\r\n                    .filter(year => year)\r\n            )].sort((a, b) => {\r\n                const numA = parseInt(a);\r\n                const numB = parseInt(b);\r\n                return isNaN(numA) || isNaN(numB) ? a.localeCompare(b) : numB - numA;\r\n            });\r\n            populateSelect(yearSelect, uniqueYears, \"SELECT YEAR\");\r\n            if (yearSelect) yearSelect.disabled = false;\r\n            setLoadingState(false);\r\n        } else {\r\n            // No cache: trigger category change to fetch CSV and populate year dropdown\r\n            categorySelect.dispatchEvent(new Event(\"change\"));\r\n        }\r\n    }\r\n\r\n    // Recent searches (\"Search again:\") - up to OPTS.recentMax equal-width pills that expand on hover\r\n    if (OPTS.remember && engine) {\r\n        try {\r\n            let rlist = [];\r\n            try { rlist = JSON.parse(localStorage.getItem(\"ess-recent-vehicles\")) || []; } catch (e) {}\r\n            if (!Array.isArray(rlist)) rlist = [];\r\n            if (!rlist.length) {\r\n                try {\r\n                    const old = JSON.parse(localStorage.getItem(\"ess-last-vehicle\"));\r\n                    if (old && old.url && old.label) rlist = [old];\r\n                } catch (e) {}\r\n            }\r\n            rlist = rlist.filter(function (v) { return v && v.url && v.label; }).slice(0, OPTS.recentMax);\r\n            if (rlist.length) {\r\n                const wrap = document.createElement(\"div\");\r\n                wrap.className = \"ess-recent\";\r\n                const label = document.createElement(\"span\");\r\n                label.className = \"ess-recent-label\";\r\n                label.textContent = OPTS.recentLabel;\r\n                wrap.appendChild(label);\r\n                const listEl = document.createElement(\"div\");\r\n                listEl.className = \"ess-recent-list\";\r\n                rlist.forEach(function (v) {\r\n                    const a = document.createElement(\"a\");\r\n                    a.className = \"ess-recent-pill\";\r\n                    a.href = (typeof v.url === \"string\" && v.url.charAt(0) === \"/\") ? v.url : \"#\";\r\n                    a.title = v.label;\r\n                    const txt = document.createElement(\"span\");\r\n                    txt.className = \"ess-recent-text\";\r\n                    txt.textContent = v.label;\r\n                    const chev = document.createElement(\"span\");\r\n                    chev.className = \"ess-recent-chev\";\r\n                    chev.setAttribute(\"aria-hidden\", \"true\");\r\n                    a.appendChild(txt);\r\n                    a.appendChild(chev);\r\n                    listEl.appendChild(a);\r\n                });\r\n                wrap.appendChild(listEl);\r\n                const form = engine.closest(\".ess-search\") || engine.parentElement;\r\n                form.parentElement.insertBefore(wrap, form);\r\n            }\r\n        } catch (e) {}\r\n    }\r\n\r\n    // Idle prefetch of the first category's CSV (homepage / all mode only)\r\n    if (OPTS.idlePrefetch && OPTS.mode === \"all\" && categorySelect) {\r\n        const firstOpt = Array.from(categorySelect.options).find(o => o.value && o.dataset.csv);\r\n        if (firstOpt) {\r\n            const doPrefetch = () => {\r\n                const raw = firstOpt.dataset.csv;\r\n                const u = raw.startsWith(\"//\") ? `https:${raw}` : raw;\r\n                const ssKey = `ess-csv:${u}`;\r\n                try { if (sessionStorage.getItem(ssKey)) return; } catch (e) {}\r\n                fetch(u, { method: \"GET\", headers: { \"Accept\": \"text/csv\" } })\r\n                    .then(r => r.ok ? r.text() : null)\r\n                    .then(t => { if (t && t.length < 3000000) { try { sessionStorage.setItem(ssKey, t); } catch (e) {} } })\r\n                    .catch(() => {});\r\n            };\r\n            if (\"requestIdleCallback\" in window) requestIdleCallback(doPrefetch, { timeout: 4000 });\r\n            else setTimeout(doPrefetch, 2500);\r\n        }\r\n    }\r\n});\r\n\r\n\r\n"],
  "mappings": "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",
  "names": ["isLoading"]
}
