{
  "version": 3,
  "sources": ["/cdn/shop/t/28/assets/5610-d.js?cb=1789409270"],
  "sourcesContent": ["/* ymm.js */\n/* ==========================================================\n   Year / Make / Model data for the promo popup.\n   Years: 2026 back to 1996 (the range the 5610 supports).\n   Models cover the major US/Canada market makes; any make\n   without a list (or an unlisted model) falls back to the\n   \"Not listed here\" option that the popup appends automatically.\n   ========================================================== */\nwindow.YMM = {\n  makes: [\n    \"Acura\",\"Alfa Romeo\",\"Audi\",\"BMW\",\"Buick\",\"Cadillac\",\"Chevrolet\",\"Chrysler\",\"Dodge\",\"Fiat\",\n    \"Ford\",\"Genesis\",\"GMC\",\"Honda\",\"Hummer\",\"Hyundai\",\"Infiniti\",\"Isuzu\",\"Jaguar\",\"Jeep\",\"Kia\",\n    \"Land Rover\",\"Lexus\",\"Lincoln\",\"Maserati\",\"Mazda\",\"Mercedes-Benz\",\"Mercury\",\"Mini\",\"Mitsubishi\",\n    \"Nissan\",\"Oldsmobile\",\"Plymouth\",\"Pontiac\",\"Porsche\",\"Ram\",\"Saab\",\"Saturn\",\"Scion\",\"Subaru\",\n    \"Suzuki\",\"Tesla\",\"Toyota\",\"Volkswagen\",\"Volvo\"\n  ],\n  models: {\n    \"Acura\": [\"ILX\",\"TLX\",\"TL\",\"TSX\",\"RLX\",\"RL\",\"MDX\",\"RDX\",\"ZDX\",\"Integra\",\"NSX\",\"CL\",\"Legend\"],\n    \"Alfa Romeo\": [\"Giulia\",\"Stelvio\",\"4C\",\"Giulietta\",\"Tonale\"],\n    \"Audi\": [\"A3\",\"A4\",\"A4 allroad\",\"A5\",\"A6\",\"A7\",\"A8\",\"Q3\",\"Q5\",\"Q7\",\"Q8\",\"e-tron\",\"TT\",\"R8\",\"S3\",\"S4\",\"S5\",\"RS 5\",\"allroad\"],\n    \"BMW\": [\"2 Series\",\"3 Series\",\"4 Series\",\"5 Series\",\"6 Series\",\"7 Series\",\"8 Series\",\"X1\",\"X2\",\"X3\",\"X4\",\"X5\",\"X6\",\"X7\",\"Z4\",\"i3\",\"i4\",\"iX\",\"M3\",\"M4\",\"M5\"],\n    \"Buick\": [\"Enclave\",\"Encore\",\"Encore GX\",\"Envision\",\"LaCrosse\",\"Regal\",\"Verano\",\"Lucerne\",\"Century\",\"LeSabre\",\"Rendezvous\",\"Cascada\",\"Rainier\"],\n    \"Cadillac\": [\"ATS\",\"CTS\",\"CT4\",\"CT5\",\"CT6\",\"XTS\",\"XT4\",\"XT5\",\"XT6\",\"Escalade\",\"SRX\",\"DTS\",\"STS\",\"DeVille\",\"Eldorado\",\"Lyriq\"],\n    \"Chevrolet\": [\"Silverado 1500\",\"Silverado 2500HD\",\"Colorado\",\"Camaro\",\"Corvette\",\"Malibu\",\"Impala\",\"Cruze\",\"Sonic\",\"Spark\",\"Equinox\",\"Traverse\",\"Tahoe\",\"Suburban\",\"Blazer\",\"Trax\",\"Trailblazer\",\"Bolt EV\",\"Volt\",\"Cobalt\",\"Aveo\",\"HHR\",\"Express\",\"Avalanche\",\"S-10\",\"Monte Carlo\"],\n    \"Chrysler\": [\"300\",\"200\",\"Pacifica\",\"Town & Country\",\"Sebring\",\"PT Cruiser\",\"Voyager\",\"Aspen\",\"Crossfire\",\"Concorde\"],\n    \"Dodge\": [\"Charger\",\"Challenger\",\"Durango\",\"Journey\",\"Grand Caravan\",\"Dart\",\"Avenger\",\"Caliber\",\"Nitro\",\"Magnum\",\"Neon\",\"Stratus\",\"Intrepid\",\"Dakota\",\"Viper\"],\n    \"Fiat\": [\"500\",\"500L\",\"500X\",\"124 Spider\"],\n    \"Ford\": [\"F-150\",\"F-250 Super Duty\",\"F-350 Super Duty\",\"Ranger\",\"Maverick\",\"Mustang\",\"Explorer\",\"Escape\",\"Edge\",\"Expedition\",\"Bronco\",\"Bronco Sport\",\"Focus\",\"Fusion\",\"Fiesta\",\"Taurus\",\"Escort\",\"Flex\",\"EcoSport\",\"Transit\",\"Transit Connect\",\"Crown Victoria\",\"Five Hundred\",\"Freestyle\",\"Freestar\",\"Windstar\"],\n    \"Genesis\": [\"G70\",\"G80\",\"G90\",\"GV60\",\"GV70\",\"GV80\"],\n    \"GMC\": [\"Sierra 1500\",\"Sierra 2500HD\",\"Canyon\",\"Yukon\",\"Yukon XL\",\"Acadia\",\"Terrain\",\"Savana\",\"Envoy\",\"Jimmy\",\"Sonoma\",\"Hummer EV\"],\n    \"Honda\": [\"Accord\",\"Civic\",\"CR-V\",\"Pilot\",\"Odyssey\",\"HR-V\",\"Ridgeline\",\"Passport\",\"Fit\",\"Insight\",\"Element\",\"CR-Z\",\"Crosstour\",\"S2000\",\"Prelude\",\"Accord Crosstour\"],\n    \"Hummer\": [\"H1\",\"H2\",\"H3\",\"H3T\"],\n    \"Hyundai\": [\"Elantra\",\"Sonata\",\"Accent\",\"Tucson\",\"Santa Fe\",\"Kona\",\"Palisade\",\"Veloster\",\"Genesis\",\"Azera\",\"Ioniq\",\"Ioniq 5\",\"Venue\",\"Santa Cruz\",\"Nexo\",\"Tiburon\",\"Entourage\",\"Equus\",\"Veracruz\",\"Santa Fe Sport\"],\n    \"Infiniti\": [\"Q50\",\"Q60\",\"Q70\",\"QX50\",\"QX55\",\"QX60\",\"QX70\",\"QX80\",\"G35\",\"G37\",\"FX35\",\"FX45\",\"M35\",\"M45\",\"EX35\",\"JX35\",\"I30\",\"QX4\",\"QX56\"],\n    \"Isuzu\": [\"Rodeo\",\"Trooper\",\"Ascender\",\"i-Series\",\"Axiom\",\"Amigo\",\"VehiCROSS\"],\n    \"Jaguar\": [\"XE\",\"XF\",\"XJ\",\"F-Type\",\"F-Pace\",\"E-Pace\",\"I-Pace\",\"S-Type\",\"X-Type\",\"XK\"],\n    \"Jeep\": [\"Wrangler\",\"Grand Cherokee\",\"Cherokee\",\"Compass\",\"Renegade\",\"Gladiator\",\"Patriot\",\"Liberty\",\"Commander\",\"Wagoneer\",\"Grand Wagoneer\",\"Grand Cherokee L\"],\n    \"Kia\": [\"Optima\",\"Forte\",\"Rio\",\"Soul\",\"Sportage\",\"Sorento\",\"Telluride\",\"Seltos\",\"Stinger\",\"Sedona\",\"Carnival\",\"Niro\",\"K5\",\"Cadenza\",\"Spectra\",\"Amanti\",\"Sephia\",\"Borrego\",\"Rondo\"],\n    \"Land Rover\": [\"Range Rover\",\"Range Rover Sport\",\"Range Rover Evoque\",\"Range Rover Velar\",\"Discovery\",\"Discovery Sport\",\"Defender\",\"LR2\",\"LR3\",\"LR4\",\"Freelander\"],\n    \"Lexus\": [\"ES\",\"IS\",\"GS\",\"LS\",\"RC\",\"LC\",\"NX\",\"RX\",\"GX\",\"LX\",\"UX\",\"CT\",\"HS\",\"SC\",\"RZ\",\"IS F\"],\n    \"Lincoln\": [\"MKZ\",\"MKS\",\"MKX\",\"MKC\",\"MKT\",\"Continental\",\"Navigator\",\"Aviator\",\"Corsair\",\"Nautilus\",\"Town Car\",\"LS\",\"Zephyr\",\"Mark LT\"],\n    \"Maserati\": [\"Ghibli\",\"Quattroporte\",\"Levante\",\"GranTurismo\",\"GranCabrio\",\"Grecale\",\"Coupe\"],\n    \"Mazda\": [\"Mazda3\",\"Mazda6\",\"CX-3\",\"CX-30\",\"CX-5\",\"CX-9\",\"CX-50\",\"CX-90\",\"MX-5 Miata\",\"Mazda2\",\"Tribute\",\"CX-7\",\"RX-8\",\"Protege\",\"Millenia\",\"MPV\",\"B-Series\",\"MX-30\"],\n    \"Mercedes-Benz\": [\"A-Class\",\"C-Class\",\"E-Class\",\"S-Class\",\"CLA\",\"CLS\",\"GLA\",\"GLB\",\"GLC\",\"GLE\",\"GLS\",\"G-Class\",\"SL\",\"SLC\",\"SLK\",\"CLK\",\"ML-Class\",\"GL-Class\",\"GLK-Class\",\"Metris\",\"Sprinter\",\"EQS\",\"EQE\"],\n    \"Mercury\": [\"Grand Marquis\",\"Milan\",\"Sable\",\"Mariner\",\"Mountaineer\",\"Montego\",\"Cougar\",\"Villager\",\"Marauder\"],\n    \"Mini\": [\"Cooper\",\"Cooper Clubman\",\"Cooper Countryman\",\"Paceman\",\"Convertible\",\"Hardtop\"],\n    \"Mitsubishi\": [\"Outlander\",\"Outlander Sport\",\"Eclipse Cross\",\"Mirage\",\"Lancer\",\"Eclipse\",\"Galant\",\"Endeavor\",\"Montero\",\"Montero Sport\",\"Raider\",\"Diamante\",\"Mirage G4\"],\n    \"Nissan\": [\"Altima\",\"Sentra\",\"Maxima\",\"Versa\",\"Rogue\",\"Rogue Sport\",\"Murano\",\"Pathfinder\",\"Armada\",\"Frontier\",\"Titan\",\"Kicks\",\"Juke\",\"Leaf\",\"370Z\",\"350Z\",\"GT-R\",\"Cube\",\"Quest\",\"Xterra\",\"Ariya\",\"Z\",\"NV200\"],\n    \"Oldsmobile\": [\"Alero\",\"Aurora\",\"Intrigue\",\"Bravada\",\"Silhouette\",\"Cutlass\",\"Eighty-Eight\",\"Achieva\",\"Regency\"],\n    \"Plymouth\": [\"Neon\",\"Breeze\",\"Voyager\",\"Prowler\",\"Grand Voyager\"],\n    \"Pontiac\": [\"Grand Prix\",\"Grand Am\",\"G6\",\"G8\",\"G5\",\"G3\",\"Vibe\",\"Bonneville\",\"Firebird\",\"GTO\",\"Solstice\",\"Torrent\",\"Aztek\",\"Montana\",\"Sunfire\",\"Trans Sport\"],\n    \"Porsche\": [\"911\",\"718 Cayman\",\"718 Boxster\",\"Cayenne\",\"Macan\",\"Panamera\",\"Taycan\",\"Boxster\",\"Cayman\"],\n    \"Ram\": [\"1500\",\"2500\",\"3500\",\"ProMaster\",\"ProMaster City\",\"Dakota\"],\n    \"Saab\": [\"9-3\",\"9-5\",\"9-7X\",\"9-2X\",\"900\"],\n    \"Saturn\": [\"Ion\",\"Aura\",\"Vue\",\"Outlook\",\"Sky\",\"Relay\",\"L-Series\",\"S-Series\"],\n    \"Scion\": [\"tC\",\"xB\",\"xD\",\"xA\",\"FR-S\",\"iA\",\"iM\",\"iQ\"],\n    \"Subaru\": [\"Outback\",\"Forester\",\"Crosstrek\",\"Impreza\",\"Legacy\",\"Ascent\",\"WRX\",\"BRZ\",\"Baja\",\"Tribeca\",\"Solterra\",\"SVX\"],\n    \"Suzuki\": [\"Grand Vitara\",\"SX4\",\"Kizashi\",\"Forenza\",\"Aerio\",\"XL-7\",\"Reno\",\"Verona\",\"Equator\",\"Vitara\",\"Esteem\"],\n    \"Tesla\": [\"Model 3\",\"Model S\",\"Model X\",\"Model Y\",\"Roadster\",\"Cybertruck\"],\n    \"Toyota\": [\"Camry\",\"Corolla\",\"Prius\",\"RAV4\",\"Highlander\",\"4Runner\",\"Tacoma\",\"Tundra\",\"Sienna\",\"Sequoia\",\"Avalon\",\"Yaris\",\"C-HR\",\"Venza\",\"Land Cruiser\",\"Supra\",\"86\",\"GR86\",\"GR Corolla\",\"Matrix\",\"Solara\",\"FJ Cruiser\",\"Echo\",\"bZ4X\",\"Corolla Cross\",\"Prius Prime\"],\n    \"Volkswagen\": [\"Jetta\",\"Passat\",\"Golf\",\"GTI\",\"Golf R\",\"Tiguan\",\"Atlas\",\"Atlas Cross Sport\",\"Beetle\",\"Arteon\",\"Taos\",\"ID.4\",\"Touareg\",\"CC\",\"Eos\",\"Rabbit\",\"Routan\",\"GLI\"],\n    \"Volvo\": [\"S60\",\"S90\",\"V60\",\"V90\",\"XC40\",\"XC60\",\"XC90\",\"S40\",\"S80\",\"V50\",\"V70\",\"C30\",\"C70\",\"XC70\"]\n  }\n};\n\n\n/* script-d.js */\n/* ==========================================================\n   INNOVA 5610 \u2014 interactions present in the design\n   ========================================================== */\n(function () {\n  'use strict';\n\n  /* ---------- star ratings ---------- */\n  var STAR = 'M12 2.6l2.9 5.9 6.5.95-4.7 4.58 1.11 6.47L12 17.45 6.19 20.5 7.3 14.03 2.6 9.45l6.5-.95z';\n  document.querySelectorAll('[data-stars]').forEach(function (el) {\n    var v = parseFloat(el.getAttribute('data-stars')) || 5, html = '';\n    for (var i = 1; i <= 5; i++) {\n      var fill = v >= i ? 1 : (v > i - 1 ? v - (i - 1) : 0);\n      if (fill === 1) {\n        html += '<svg viewBox=\"0 0 24 24\"><path d=\"' + STAR + '\"/></svg>';\n      } else if (fill === 0) {\n        html += '<svg viewBox=\"0 0 24 24\" style=\"fill:#c9c9c9\"><path d=\"' + STAR + '\"/></svg>';\n      } else {\n        var id = 'g' + Math.random().toString(36).slice(2, 8);\n        html += '<svg viewBox=\"0 0 24 24\"><defs><linearGradient id=\"' + id + '\">' +\n          '<stop offset=\"' + (fill * 100) + '%\" stop-color=\"currentColor\"/>' +\n          '<stop offset=\"' + (fill * 100) + '%\" stop-color=\"#c9c9c9\"/></linearGradient></defs>' +\n          '<path d=\"' + STAR + '\" fill=\"url(#' + id + ')\"/></svg>';\n      }\n    }\n    el.innerHTML = html;\n  });\n\n  /* ---------- hero: rotate the truck and the two cars ----------\n     The truck (slide 1) keeps its one-time headlight ignition, so the first hold covers that 3s\n     timeline plus a lit beat. After that each photo holds 5s and crossfades in on top of the last.\n     Waits for a photo to finish loading rather than fading in a blank, pauses while the tab is\n     hidden, and stays on the truck for visitors who have asked for reduced motion. */\n  (function () {\n    var slides = document.querySelectorAll('#heroMedia .hero-slide');\n    if (slides.length < 2) return;\n    if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    var FIRST_HOLD = 4500, HOLD = 5000, FADE = 1200;\n    var cur = 0, timer = null;\n    var ready = function (el) {\n      var img = el.tagName === 'IMG' ? el : el.querySelector('img');\n      return !img || (img.complete && img.naturalWidth > 0);\n    };\n    var advance = function () {\n      var next = (cur + 1) % slides.length;\n      if (!ready(slides[next])) { timer = setTimeout(advance, 1000); return; }\n      var prev = slides[cur];\n      cur = next;\n      prev.classList.remove('is-on');\n      prev.classList.add('was-on');            // stays opaque underneath while the next fades in\n      slides[cur].classList.remove('was-on');\n      slides[cur].classList.add('is-on');\n      setTimeout(function () { prev.classList.remove('was-on'); }, FADE + 100);\n      timer = setTimeout(advance, HOLD);\n    };\n    timer = setTimeout(advance, FIRST_HOLD);\n    document.addEventListener('visibilitychange', function () {\n      clearTimeout(timer);\n      if (!document.hidden) timer = setTimeout(advance, HOLD);\n    });\n  })();\n\n  /* ---------- hero video: play once, then settle on the product still ---------- */\n  var heroVideo = document.getElementById('heroVideo');\n  var heroMedia = document.getElementById('heroMedia');\n  if (heroVideo) {\n    heroVideo.loop = false;\n    heroVideo.addEventListener('ended', function () {\n      heroVideo.pause();\n      if (heroMedia) heroMedia.classList.add('ended'); // fade in High-Res still\n    });\n  }\n\n  /* ---------- reviews carousel (Scotty + testimonials) ---------- */\n  var rstage = document.getElementById('rstage');\n  var rdots = document.getElementById('rdots');\n  if (rstage && rdots) {\n    var slides = rstage.querySelectorAll('.rslide');\n    var dots = rdots.querySelectorAll('i');\n    var show = function (n) {\n      slides.forEach(function (s, i) { s.classList.toggle('on', i === n); });\n      dots.forEach(function (d, i) { d.classList.toggle('on', i === n); });\n    };\n    dots.forEach(function (d, i) { d.addEventListener('click', function () { show(i); }); });\n  }\n\n  /* ---------- \"Speak your car's language\" expanding gallery ---------- */\n  var cards = document.getElementById('cards');\n  if (cards) {\n    var items = cards.querySelectorAll('.c');\n    items.forEach(function (c) {\n      c.addEventListener('click', function () {\n        if (c.classList.contains('open')) return;   // only one open at a time\n        items.forEach(function (x) { x.classList.remove('open'); });\n        c.classList.add('open');\n      });\n    });\n  }\n\n  /* ---------- product gallery thumbnails ---------- */\n  var thumbs = document.getElementById('galThumbs');\n  if (thumbs) {\n    var main = document.getElementById('galMain'), firstThumb = thumbs.querySelector('button');\n    thumbs.querySelectorAll('button').forEach(function (b) {\n      b.addEventListener('click', function () {\n        thumbs.querySelectorAll('button').forEach(function (x) { x.classList.remove('on'); });\n        b.classList.add('on');\n        main.src = b.getAttribute('data-src');\n        main.parentNode.classList.toggle('is-alt', b !== firstThumb);   // the offer line belongs to the first photo only\n      });\n    });\n  }\n\n  /* ---------- purchase options ---------- */\n  var opts = document.getElementById('opts');\n  if (opts) {\n    var labels = opts.querySelectorAll('.opt');\n    labels.forEach(function (l) {\n      l.addEventListener('click', function () {\n        labels.forEach(function (x) { x.classList.remove('on'); });\n        l.classList.add('on');\n        l.querySelector('input').checked = true;\n      });\n    });\n  }\n\n  /* ---------- awards: duplicate items for the seamless mobile marquee ---------- */\n  var awTrack = document.querySelector('.awards .aw-track');\n  if (awTrack) {\n    awTrack.querySelectorAll('.aw').forEach(function (aw) {\n      var c = aw.cloneNode(true);\n      c.classList.add('aw-clone');\n      c.setAttribute('aria-hidden', 'true');\n      awTrack.appendChild(c);\n    });\n  }\n\n  /* ---------- live-data pulse: build a repeating ECG waveform ---------- */\n  (function () {\n    var svg = document.querySelector('.pulse-svg');\n    if (!svg) return;\n    var W = 1200, mid = 100, beats = 4, seg = W / beats, d = 'M0 ' + mid;\n    for (var i = 0; i < beats; i++) {\n      var x = i * seg;\n      d += ' L' + (x + seg * 0.42) + ' ' + mid;                                   // flat\n      d += ' Q' + (x + seg * 0.48) + ' ' + (mid - 14) + ' ' + (x + seg * 0.54) + ' ' + mid; // P wave\n      d += ' L' + (x + seg * 0.58) + ' ' + mid;\n      d += ' L' + (x + seg * 0.60) + ' ' + (mid + 18);                            // Q\n      d += ' L' + (x + seg * 0.63) + ' ' + (mid - 70);                            // R spike\n      d += ' L' + (x + seg * 0.66) + ' ' + (mid + 34);                            // S\n      d += ' L' + (x + seg * 0.69) + ' ' + mid;\n      d += ' Q' + (x + seg * 0.80) + ' ' + (mid - 22) + ' ' + (x + seg * 0.88) + ' ' + mid; // T wave\n      d += ' L' + (x + seg) + ' ' + mid;\n    }\n    svg.querySelectorAll('path').forEach(function (p) { p.setAttribute('d', d); });\n  })();\n\n  /* ---------- \"does it work on my car?\" fit checker ---------- */\n  (function () {\n    var toggle = document.getElementById('fitToggle');\n    var panel = document.getElementById('fitPanel');\n    var yearSel = document.getElementById('fitYear');\n    var makeSel = document.getElementById('fitMake');\n    var modelSel = document.getElementById('fitModel');\n    var result = document.getElementById('fitResult');\n    var resultHead = document.querySelector('.fit-result b');\n    var resultText = document.getElementById('fitResultText');\n    if (!toggle || !panel || !yearSel || !window.YMM) return;\n\n    // keep the promise honest: exclude EV-only brand, EVs, and heavy-duty / commercial models\n    var EX_MAKES = { 'Tesla': 1 };\n    // brands with no OBD1-era (pre-1996) US presence \u2014 hidden when an older year is picked\n    var EX_MAKES_PRE96 = { 'Genesis': 1, 'Scion': 1, 'Mini': 1, 'Ram': 1, 'Fiat': 1, 'Kia': 1,\n      'Alfa Romeo': 1, 'Maserati': 1, 'Hummer': 1 };\n    var EX_MODELS = {};\n    ['e-tron', 'i3', 'i4', 'iX', 'Bolt EV', 'Lyriq', 'Ioniq 5', 'Nexo', 'I-Pace', 'EQS', 'EQE', 'Leaf',\n     'Ariya', 'Taycan', 'Solterra', 'bZ4X', 'ID.4', 'RZ', 'GV60', 'Hummer EV', 'H1',\n     'F-250 Super Duty', 'F-350 Super Duty', 'Silverado 2500HD', 'Sierra 2500HD', '2500', '3500',\n     'ProMaster', 'ProMaster City', 'Express', 'Savana', 'Sprinter', 'Transit', 'Transit Connect',\n     'Metris', 'NV200'].forEach(function (m) { EX_MODELS[m] = 1; });\n\n    var HEADERS = ['Nice choice!', \"That's a nice ride.\", 'Great taste!', 'Solid pick.', 'Ooh, good one.'];\n    var headIdx = 0;\n\n    var opt = function (sel, label, value) {\n      var o = document.createElement('option');\n      o.textContent = label; o.value = (value === undefined ? label : value);\n      sel.appendChild(o); return o;\n    };\n    var isPre96 = function () { var y = parseInt(yearSel.value, 10); return !!y && y <= 1995; };\n\n    // Years: 2026 shown as \"coming soon\" (disabled), selectable 2025 down to 1990 (OBD1 era)\n    yearSel.innerHTML = '<option value=\"\" selected disabled>Year</option>';\n    var soon = opt(yearSel, '2026 (Coming soon)', ''); soon.disabled = true;\n    for (var y = 2025; y >= 1990; y--) opt(yearSel, String(y));\n\n    var fillMakes = function () {\n      var cur = makeSel.value, pre = isPre96();\n      makeSel.innerHTML = '<option value=\"\" selected disabled>Make</option>';\n      window.YMM.makes.forEach(function (m) {\n        if (EX_MAKES[m]) return;\n        if (pre && EX_MAKES_PRE96[m]) return;\n        opt(makeSel, m);\n      });\n      if (cur) { makeSel.value = cur; if (makeSel.value !== cur) makeSel.selectedIndex = 0; }\n    };\n    var fillModels = function () {\n      var cur = modelSel.value;\n      modelSel.innerHTML = '<option value=\"\" selected disabled>Model</option>';\n      (window.YMM.models[makeSel.value] || []).forEach(function (m) { if (!EX_MODELS[m]) opt(modelSel, m); });\n      modelSel.disabled = !makeSel.value;\n      if (cur) { modelSel.value = cur; if (modelSel.value !== cur) modelSel.selectedIndex = 0; }\n    };\n    var showResult = function () {\n      if (yearSel.value && makeSel.value && modelSel.value) {\n        resultHead.textContent = HEADERS[headIdx % HEADERS.length]; headIdx++;\n        var msg = 'The Innova 5610 works with your ' + yearSel.value + ' ' + makeSel.value + ' ' + modelSel.value + '.';\n        if (isPre96()) msg += ' Just add a separate OBD1 adapter (available at innova.com).';\n        resultText.textContent = msg;\n        result.hidden = false;\n      } else {\n        result.hidden = true;\n      }\n    };\n\n    yearSel.addEventListener('change', function () { fillMakes(); fillModels(); showResult(); });\n    makeSel.addEventListener('change', function () { fillModels(); showResult(); });\n    modelSel.addEventListener('change', showResult);\n    toggle.addEventListener('click', function () {\n      var willOpen = panel.hidden;\n      panel.hidden = !willOpen;\n      toggle.setAttribute('aria-expanded', String(willOpen));\n    });\n\n    // clean state on load / bfcache restore (don't let the browser keep a stale result showing)\n    var reset = function () {\n      yearSel.selectedIndex = 0;\n      fillMakes(); makeSel.selectedIndex = 0;\n      modelSel.innerHTML = '<option value=\"\" selected disabled>Model</option>'; modelSel.disabled = true;\n      result.hidden = true;\n      panel.hidden = true; toggle.setAttribute('aria-expanded', 'false');\n    };\n    reset();\n    window.addEventListener('pageshow', function (e) { if (e.persisted) reset(); });\n  })();\n\n  /* ---------- accordions (buy box + FAQ) ---------- */\n  function accordion(root) {\n    if (!root) return;\n    root.querySelectorAll('.it').forEach(function (item) {\n      var q = item.querySelector('.q'), a = item.querySelector('.a');\n      if (item.classList.contains('open')) a.style.maxHeight = a.scrollHeight + 'px';\n      q.addEventListener('click', function () {\n        var isOpen = item.classList.contains('open');\n        root.querySelectorAll('.it.open').forEach(function (o) {\n          o.classList.remove('open');\n          o.querySelector('.a').style.maxHeight = null;\n        });\n        if (!isOpen) {\n          item.classList.add('open');\n          a.style.maxHeight = a.scrollHeight + 'px';\n        }\n      });\n    });\n  }\n  accordion(document.getElementById('acc'));\n  accordion(document.getElementById('faq'));\n\n  /* ---------- countdown ---------- */\n  var timer = document.getElementById('timer');\n  if (timer) {\n    var KEY = 'innova5610_deadline';\n    var deadline = parseInt(localStorage.getItem(KEY), 10);\n    var now = Date.now();\n    if (!deadline || deadline < now || deadline - now > 7 * 3600 * 1000) {\n      deadline = now + 5 * 3600 * 1000 + 2 * 60 * 1000 + 45 * 1000;\n      localStorage.setItem(KEY, String(deadline));\n    }\n    var pad = function (n) { return String(n).padStart(2, '0'); };\n    var tick = function () {\n      var d = Math.max(0, deadline - Date.now());\n      timer.textContent = Math.floor(d / 3600000) + ':' +\n        pad(Math.floor((d % 3600000) / 60000)) + ':' + pad(Math.floor((d % 60000) / 1000));\n    };\n    tick();\n    setInterval(tick, 1000);\n  }\n\n  /* ---------- modals (features + 3360 camera) ---------- */\n  function wireModal(modal, openBtn) {\n    if (!modal) return;\n    var open = function () {\n      modal.classList.add('open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('modal-lock');\n      modal.querySelectorAll('video').forEach(function (v) { var p = v.play(); if (p && p.catch) p.catch(function () {}); });\n    };\n    var close = function () {\n      modal.classList.remove('open');\n      modal.setAttribute('aria-hidden', 'true');\n      if (!document.querySelector('.modal.open')) document.body.classList.remove('modal-lock');\n    };\n    if (openBtn) {\n      if (openBtn.forEach) openBtn.forEach(function (b) { if (b) b.addEventListener('click', open); });\n      else openBtn.addEventListener('click', open);\n    }\n    modal.querySelectorAll('[data-close]').forEach(function (el) { el.addEventListener('click', close); });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && modal.classList.contains('open')) close();\n    });\n  }\n  wireModal(document.getElementById('featModal'), document.querySelectorAll('.js-feat-open'));\n  wireModal(document.getElementById('cam3360Modal'), [document.getElementById('cam3360Open'), document.querySelector('[data-gift-info=\"3360\"]')]);\n  wireModal(document.getElementById('gift3380Modal'), document.querySelectorAll('[data-gift-info=\"3380\"]'));\n  wireModal(document.getElementById('giftCarmdModal'), document.querySelectorAll('[data-gift-info=\"carmd\"]'));\n\n  /* ---------- influencer videos: tap to unmute (one at a time) ---------- */\n  (function () {\n    var figs = [].slice.call(document.querySelectorAll('.infl'));\n    if (!figs.length) return;\n    figs.forEach(function (fig) {\n      var vid = fig.querySelector('video');\n      var btn = fig.querySelector('.infl-sound');\n      if (!vid) return;\n      var toggle = function (e) {\n        if (e) e.preventDefault();\n        var turnOn = vid.muted;\n        figs.forEach(function (f) {\n          var v = f.querySelector('video');\n          if (v) v.muted = true;\n          f.classList.remove('on');\n        });\n        if (turnOn) {\n          vid.muted = false;\n          var p = vid.play(); if (p && p.catch) p.catch(function () {});\n          fig.classList.add('on');\n        }\n      };\n      if (btn) btn.addEventListener('click', toggle);\n      vid.addEventListener('click', toggle);\n    });\n  })();\n\n  /* ---------- scarcity: live stock counter ---------- */\n  var stockLeft = document.getElementById('stockLeft');\n  var scarFill = document.getElementById('scarFill');\n  if (stockLeft && scarFill) {\n    var pct = 4; // % of the bundle left\n    var render = function () {\n      stockLeft.textContent = pct + '%';\n      scarFill.style.width = pct + '%';          // the red bar is the stock that is LEFT\n    };\n    render();\n    setInterval(function () {\n      if (pct > 2 && Math.random() < 0.55) {\n        pct = Math.max(2, Math.round((pct - (Math.random() * 0.3 + 0.1)) * 10) / 10);\n        render();\n      }\n    }, 8000);\n  }\n\n  /* ---------- delivery date: 2 days ahead (PST) ---------- */\n  var deliveryEl = document.getElementById('deliveryDate');\n  if (deliveryEl) {\n    try {\n      var future = new Date(Date.now() + 2 * 86400000);\n      deliveryEl.textContent = new Intl.DateTimeFormat('en-US', {\n        timeZone: 'America/Los_Angeles', weekday: 'long', month: 'long', day: 'numeric'\n      }).format(future);\n    } catch (e) { /* leave fallback text */ }\n  }\n\n  /* ---------- checkout: slide-in cart, then the pre-filled cart URL ---------- */\n  var CART_BASE = 'https://www.innova.com/cart/32524554436654:1,41990059687982:1,41968968794158:1,41990063915054:1,39553005617198:1?discount=5610_BOGO3360_PARTNER,5610_PARTNERSHIPS_FP';\n  var CART_EMAIL = CART_BASE + ',CRX2000';\n  // sale cart: no 3360 camera variant; 5610_PARTNERSHIP + 5610_PARTNERSHIPS_FP bring it to $269\n  var SALE_CART = 'https://www.innova.com/cart/32524554436654:1,41990059687982:1,41968968794158:1,41990063915054:1?discount=5610_PARTNERSHIP,5610_PARTNERSHIPS_FP';\n  /* ---------- 2026 holiday offer: ONE free gift of the visitor's choice + a $20 gift card ----------\n     From 12:01 AM Pacific on Oct 8 until the end of Dec 31 the bundle swaps the 3360 for one gift the\n     visitor picks, plus a $20 Innova gift card. The offer stays the same; only the wording follows the\n     season. Times are Pacific wall clock \"YYYY-MM-DD HH:MM\", start inclusive, end exclusive.\n     Preview any phase with ?phase=prebf|bf|cm|xmas (or ?phase=off), preselect with ?gift=3360|3380|carmd.\n     Each gift has its own code, paired with 5610_PARTNERSHIPS_GIFTCARD (boot, app, shipping, gift card). Outside the\n     window everything below falls back to CART_BASE / CART_EMAIL, the everyday camera bundle. */\n  /* Each season also has its own look (colours and decoration only, the wording is untouched):\n     body.themed + body.theme-<key> switch on that season's block at the end of style-d.css. A phase\n     can borrow another season's look with theme: '<key>'. false here = seasonal wording only.\n     ?theme=off previews a season without its look. */\n  var HOLIDAY_THEMES = true;\n  var HOLIDAY_PHASES = [\n    // The user, Nov 2 2026: \"start the black friday starting Nov 6 till CM, then CM change to CM, and then change to Christmas.\n    // automatically\". Cyber Monday 2026 is Nov 30 (it was set to Dec 1, last year's date). carmd: CarMD Connect can be the\n    // gift, before Nov 6 only (\"After Nov 6, kill all CarMD offers and mentions\"). gift: the one picked at first, the 3360\n    // (\"keep the price at $349 with the freebie (3360) selected\"), the 3380 while the 3360 is sold out.\n    { key: 'prebf', from: '2026-10-08 00:01', to: '2026-11-06 00:00', lead: 'PRE-BLACK FRIDAY', badge: 'Pre-Black Friday', pick: 'Your Pre-Black Friday gift: pick one', carmd: true },\n    { key: 'bf',    from: '2026-11-06 00:00', to: '2026-11-30 00:00', lead: 'BLACK FRIDAY',     badge: 'Black Friday',     pick: 'Your Black Friday gift: pick one', gift: '3360' },\n    { key: 'cm',    from: '2026-11-30 00:00', to: '2026-12-01 00:00', lead: 'CYBER MONDAY',     badge: 'Cyber Monday',     pick: 'Your Cyber Monday gift: pick one', gift: '3360' },\n    { key: 'xmas',  from: '2026-12-01 00:00', to: '2027-01-01 00:00', lead: 'CHRISTMAS SALE',   badge: 'Christmas Sale',   pick: 'Your Christmas gift: pick one', gift: '3360' }\n  ];\n  var GIFTS = {\n    // listed in the picker's order: CarMD Connect first, and the default pick (the user's call, Oct 13 2026)\n    'carmd': { variant: '42744886525998', code: '5610_BOGOCarMD', value: 100, name: 'CarMD Connect',                 cartName: 'CarMD Connect' },\n    '3360':  { variant: '39553005617198', code: '5610_BOGO3360_PARTNER', value: 200, name: 'Innova 3360 Thermal Camera',    cartName: 'Innova 3360 Camera' },\n    '3380':  { variant: '32538802585646', code: '5610_BOGO3380',  value: 99,  name: 'Innova 3380 Inspection Camera', cartName: 'Innova 3380 Camera' }\n  };\n  // Shopify product handles, for the live stock check in the picker (a sold-out gift is hidden)\n  var GIFT_HANDLES = { '3360': 'innova-multi-purpose-infrared-inspection-camera-3360', '3380': '3380-inspection-camera', 'carmd': 'carmd-connect' };\n  var noCamera = false;   // everyday offer only: true once Shopify says the 3360 is sold out\n  /* Ask Shopify's public product JSON whether each gift's variant is still for sale (\"available\" turns\n     false once a tracked item hits zero and can't be oversold). It answers any origin, so this also works\n     on Railway. done(avail) gets avail[key] === false for a sold-out gift; a failed or slow check (5s)\n     leaves the key unset, which callers treat as in stock, so a hiccup can never blank the offer.\n     ?soldout=3360,carmd pretends those gifts are sold out, to preview the fallbacks. */\n  var checkStock = function (keys, done) {\n    if (!window.fetch) return;\n    var avail = {}, pending = keys.length;\n    var forced = ((location.search.match(/[?&]soldout=([a-z0-9,]+)/) || [])[1] || '').split(',');\n    var base = /(^|\\.)innova\\.com$/.test(location.hostname) ? '' : 'https://www.innova.com';\n    var settle = function () { if (!--pending) done(avail); };\n    keys.forEach(function (k) {\n      if (forced.indexOf(k) > -1) { avail[k] = false; settle(); return; }\n      var ctl = window.AbortController ? new AbortController() : null;\n      var timer = setTimeout(function () { if (ctl) ctl.abort(); }, 5000);\n      fetch(base + '/products/' + GIFT_HANDLES[k] + '.js', { credentials: 'omit', signal: ctl ? ctl.signal : undefined })\n        .then(function (res) { return res.ok ? res.json() : null; })\n        .then(function (p) {\n          if (!p || !p.variants) return;\n          var v = p.variants.filter(function (x) { return String(x.id) === GIFTS[k].variant; })[0];\n          avail[k] = v ? !!v.available : !!p.available;\n        })\n        .catch(function () {})\n        .then(function () { clearTimeout(timer); settle(); });\n    });\n  };\n  var GIFT_CARD_VARIANT = '41613976174638', GIFT_CARD_VALUE = 20, BUNDLE_PRICE = 349;   // $20 Innova Digital Gift Card\n  /* In the holiday links 5610_PARTNERSHIPS_GIFTCARD takes the place of 5610_PARTNERSHIPS_FP: the same free\n     boot, app and shipping, plus the $20 gift card, in one code (so it stacks with each gift's code the\n     way _FP does). The everyday and flash-sale links keep _FP, so the gift card is only ever added from\n     Oct 8. Checked at innova.com checkout with all three gifts and with CRX2000. */\n  var HOLIDAY_FREEBIES_CODE = '5610_PARTNERSHIPS_GIFTCARD';\n  var BUNDLE_ITEMS = '32524554436654:1,41990059687982:1,41968968794158:1,41990063915054:1';  // 5610, boot, shipping, app\n  var holiday = (function () {\n    var forced = (location.search.match(/[?&]phase=([a-z]+)/) || [])[1];\n    if (forced === 'off') return null;\n    var i, now;\n    for (i = 0; i < HOLIDAY_PHASES.length; i++) if (HOLIDAY_PHASES[i].key === forced) return HOLIDAY_PHASES[i];\n    try {\n      var g = {};\n      new Intl.DateTimeFormat('en-CA', { timeZone: 'America/Los_Angeles', year: 'numeric', month: '2-digit',\n        day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }).formatToParts(new Date())\n        .forEach(function (x) { g[x.type] = x.value; });\n      now = g.year + '-' + g.month + '-' + g.day + ' ' + (g.hour === '24' ? '00' : g.hour) + ':' + g.minute;\n    } catch (e) { return null; }\n    for (i = 0; i < HOLIDAY_PHASES.length; i++) {\n      if (HOLIDAY_PHASES[i].from <= now && now < HOLIDAY_PHASES[i].to) return HOLIDAY_PHASES[i];\n    }\n    return null;\n  })();\n  /* CarMD Connect is a gift only before Nov 6 (holiday.carmd, above). From then on it leaves GIFTS, so the picker, the stock\n     check, the links and everything that names the picked gift go without it; its card leaves the picker and the page\n     carries no-carmd (no CarMD Connect section). */\n  var carmdOn = !!holiday && !!holiday.carmd;\n  if (!carmdOn) delete GIFTS.carmd;\n  var giftKey = (location.search.match(/[?&]gift=(3360|3380|carmd)\\b/) || [])[1];\n  if (!GIFTS[giftKey]) giftKey = (holiday && holiday.gift) || (carmdOn ? 'carmd' : '3360');\n  /* ---------- Black Friday week at $299 (the user, Nov 2 2026: \"From Nov 26-30, still offer the freebie but drop the price\n     to $299\") ----------\n     From 12:00 AM Pacific on Nov 26 to the end of Nov 30 the gift bundle costs $299 for everyone: every price on the page\n     reads $299 and every gift link carries code, a $50 order discount (5610_EMAIL_299, made for the email price; it combines\n     with the gift codes, and Shopify has to keep it valid until Nov 30 11:59 PM). The scratch card's CRX2000 stays out of the\n     links and its popup and prize tab stay away meanwhile, so its $20 never stacks on it. A flash sale still leads with\n     its own price. Preview: ?pricedrop=on|off. */\n  var PRICE_DROP = { from: '2026-11-26 00:00', to: '2026-12-01 00:00', price: 299, code: '5610_EMAIL_299' };\n  var dropOn = !!holiday && (function () {\n    var forced = (location.search.match(/[?&]pricedrop=(on|off)\\b/) || [])[1];\n    if (forced) return forced === 'on';\n    try {\n      var g = {};\n      new Intl.DateTimeFormat('en-CA', { timeZone: 'America/Los_Angeles', year: 'numeric', month: '2-digit',\n        day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }).formatToParts(new Date())\n        .forEach(function (x) { g[x.type] = x.value; });\n      var now = g.year + '-' + g.month + '-' + g.day + ' ' + (g.hour === '24' ? '00' : g.hour) + ':' + g.minute;\n      return PRICE_DROP.from <= now && now < PRICE_DROP.to;\n    } catch (e) { return false; }\n  })();\n  if (dropOn) document.body.classList.add('drop-on');     // hides Shop Pay's installments line, worked out from $349.99\n  var bundlePrice = function () { return dropOn ? PRICE_DROP.price : BUNDLE_PRICE; };\n  /* the cart link for the bundle as it stands: the picked gift + gift card with that gift's own code\n     during the holiday window, the everyday camera bundle otherwise. withEmail (default: whether the\n     visitor already gave us their email) adds the CRX2000 $20-off code. */\n  var bundleCart = function (withEmail) {\n    if (withEmail === undefined) withEmail = emailCaptured;\n    if (dropOn) withEmail = false;               // the $299 week takes the place of CRX2000's $20\n    if (!holiday) {\n      // everyday offer; with the 3360 sold out it carries on without the camera and without its code\n      if (noCamera) return 'https://www.innova.com/cart/' + BUNDLE_ITEMS + '?discount=5610_PARTNERSHIPS_FP' + (withEmail ? ',CRX2000' : '');\n      return withEmail ? CART_EMAIL : CART_BASE;\n    }\n    var g = giftKey ? GIFTS[giftKey] : null;    // null only if every gift is sold out: gift card only\n    return 'https://www.innova.com/cart/' + BUNDLE_ITEMS + (g ? ',' + g.variant + ':1' : '') + ',' + GIFT_CARD_VARIANT + ':1' +\n      '?discount=' + (g ? g.code + ',' : '') + HOLIDAY_FREEBIES_CODE + (withEmail ? ',CRX2000' : '') + (dropOn ? ',' + PRICE_DROP.code : '');\n  };\n  /* InnovaCare+ protection plan: opt-in, off by default. The variant is spliced into\n     whichever cart URL is current, so that state's own discount is preserved verbatim. */\n  var CARE_VARIANT = '42329280643118:1';\n  var CARE_PRICE = 39;\n  var careOn = false;\n  var careRowEl = document.getElementById('careRow');\n  var careToggleEl = document.getElementById('careToggle');\n  var crowCare = document.getElementById('crowCare');\n  var cartCountEl = document.getElementById('cartCount');\n  var withCare = function (url) {\n    if (!careOn) return url;\n    var qi = url.indexOf('?');\n    return qi < 0 ? url + ',' + CARE_VARIANT\n                  : url.slice(0, qi) + ',' + CARE_VARIANT + url.slice(qi);\n  };\n  var cartGo = document.getElementById('cartGo');\n  var crowEmail = document.getElementById('crowEmail');\n  var cartTotal = document.getElementById('cartTotal');\n\n  var saleActive = false, salePriceStr = '$269', promoActive = false, promoCfg = null;\n  var lastCartUrl = null;\n  /* Other apps can add their own parameters to our cart links after the page loads: Intelligems\n     appends attributes[igId]=... so the order is credited to the visitor's test group. Every later\n     rewrite (a gift pick, InnovaCare+, the email code, the flash toggle) would wipe it, so carry over\n     anything that isn't ours (discount, payment) from the link being replaced. */\n  var keepExtras = function (oldHref, url) {\n    var q = (oldHref && oldHref.indexOf('/cart/') > -1 && oldHref.split('?')[1]) || '';\n    var extras = q.split('&').filter(function (p) { return p && !/^(discount|payment)=/i.test(p); });\n    return extras.length ? url + (url.indexOf('?') < 0 ? '?' : '&') + extras.join('&') : url;\n  };\n  var setCheckout = function (url) {\n    lastCartUrl = url;                                 // remembered so the add-on can re-apply\n    var withEmail = !saleActive && url.indexOf('CRX2000') > -1;\n    var target = withCare(url);\n    // real navigation targets (also the JS-disabled fallback for anchor triggers)\n    document.querySelectorAll('.js-checkout').forEach(function (a) { if (a.tagName === 'A') a.setAttribute('href', keepExtras(a.getAttribute('href'), target)); });\n    if (cartGo) cartGo.setAttribute('href', keepExtras(cartGo.getAttribute('href'), target));\n    if (crowEmail) crowEmail.hidden = !withEmail;      // CRX2000 line only when email captured AND not on sale\n    if (crowCare) crowCare.hidden = !careOn;\n    var base = saleActive ? (parseInt(String(salePriceStr).replace(/[^0-9]/g, ''), 10) || 0)\n                          : bundlePrice() - (withEmail ? 20 : 0);\n    if (cartTotal) cartTotal.textContent = '$' + (base + (careOn ? CARE_PRICE : 0));\n    if (cartCountEl) {\n      var n = 0;\n      document.querySelectorAll('.cart-body .citem').forEach(function (el) {\n        if (getComputedStyle(el).display !== 'none') n++;\n      });\n      if (careOn) n++;\n      cartCountEl.textContent = n + ' item' + (n === 1 ? '' : 's');\n    }\n  };\n  if (careToggleEl) {\n    careToggleEl.addEventListener('click', function () {\n      careOn = !careOn;\n      if (careRowEl) careRowEl.classList.add('hinted');   // stop nudging once they have engaged\n      careToggleEl.setAttribute('aria-checked', String(careOn));\n      if (careRowEl) careRowEl.classList.toggle('on', careOn);\n      setCheckout(lastCartUrl || bundleCart());        // re-apply against the live cart state\n    });\n  }\n  var emailCaptured = false;\n  try { emailCaptured = !!localStorage.getItem('innova_email_captured'); } catch (e) {}\n  setCheckout(bundleCart());\n\n  /* ---------- Shop Pay Installments modal: check out with the whole bundle ----------\n     Shopify's \"Continue to checkout\" button builds /cart/<5610 variant>:1 by itself, so the\n     free case, app, shipping, camera and discount codes all drop off. Catch the click in the\n     capture phase, before Shopify's own handler runs, and send it to the same cart link the\n     rest of the page uses, so whichever offer the visitor picked comes through intact,\n     including the InnovaCare+ plan when it is switched on (cartGo already carries it).\n     The modal lives in an open shadow root, which composedPath() can see into. If Shopify\n     ever renames the hook, nothing matches and their default behaviour simply returns. */\n  window.addEventListener('click', function (e) {\n    var path = e.composedPath ? e.composedPath() : [];\n    var hit = path.some(function (n) {\n      return n && n.getAttribute && n.getAttribute('data-testid') === 'sample-plans-modal-continue-to-checkout-button';\n    });\n    if (!hit || !cartGo) return;\n    var url = cartGo.getAttribute('href');\n    if (!url || url === '#') return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    // payment=shop_pay_installments is the parameter Shopify's own button adds: it opens Shop Pay\n    // with installments selected. Checked that both offers keep every free item and discount code\n    // through that handoff. Only this modal button uses it; the page's main CTA stays on the\n    // regular checkout so shoppers paying in full are not routed through a Shop Pay sign-in.\n    window.location.href = url + (url.indexOf('?') < 0 ? '?' : '&') + 'payment=shop_pay_installments';\n  }, true);\n\n  /* ---------- scheduled sale mode (driven by a Google Sheet, times in PST) ---------- */\n  /* SETUP: make a sheet with headers  Start (PST) | End (PST) | Price | 3360 Camera\n     Start/End = \"YYYY-MM-DD HH:MM\" Pacific (e.g. 2026-08-01 00:00). Price = e.g. 269.\n     3360 Camera = \"No\" to drop the free camera (default is to drop it during any sale).\n     File -> Share -> Publish to web -> CSV, then paste that link below. */\n  var SALE_SHEET_URL = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vR8_-VBtZsinlLkdfa5JdAKT7_27Y0l839zMT_yXsD5qtTwCpcxBcQN0yfgjeZ_Hg5opfnYmNfFUDrb/pub?output=csv';\n  var MSRP = 549, F_CAM = 200, F_BOOT = 20, F_APP = 99, F_SHIP = 10;\n\n  var applySale = function (cfg) {\n    saleActive = true;\n    var price = cfg.price, keepCam = !!cfg.camera && !noCamera;\n    salePriceStr = '$' + price;\n    var value = MSRP + (keepCam ? (holiday ? (giftKey ? GIFTS[giftKey].value : 0) + GIFT_CARD_VALUE : F_CAM) : 0) + F_BOOT + F_APP + F_SHIP;\n    var save = value - price, pct = Math.round(save / value * 100), off = MSRP - price;\n    document.body.classList.add('sale-mode');\n    var set = function (id, html) { var el = document.getElementById(id); if (el) el.innerHTML = html; };\n    set('barMsg', 'FLASH SALE: Get $' + off + ' OFF \u2014 the Innova 5610 is now just $' + price);\n    set('dealBadge', 'FLASH SALE');\n    // Flash deal is the lowest cash price, not a bigger % than the camera bundle (both ~60% of their\n    // own value), so lead with \"Best price\" here and keep the concrete $ in the \"You save\" button.\n    set('dealPill', 'Best price');\n    set('dealScanPrice', '<s>$' + MSRP + '</s> $' + price);\n    set('dealPrice', '$' + price);\n    set('dealValue', '$' + value + ' total value');\n    set('dealSave', 'You save $' + save + ' &rarr;');\n    set('vsCost', '$' + price);\n    set('cmpPrice', '<s>$' + MSRP + '</s> $' + price);\n    set('cartCount', (keepCam ? 5 : 4) + ' items');\n    set('cartSaveText', '$' + save + ' \u00B7 best price');\n    set('cartScanPrice', '$' + price);\n    set('cartRetail', '$' + value);\n    set('cartDiscount', '\u2212$' + save);\n    setCheckout(keepCam ? bundleCart(false) : SALE_CART);\n  };\n\n  /* ---------- announcement-bar phrase: auto-swap the lead on holiday weekends (Pacific) ---------- */\n  /* Only the words before the first colon change (e.g. \"SPECIAL OFFER\" -> \"LABOR DAY SALE\"); the rest\n     of the banner is untouched. Rule-based dates = no yearly upkeep. A live flash sale still overrides\n     this via applySale(). Runs BEFORE the NORMAL capture so the toggle restores the holiday phrase. */\n  (function () {\n    var barMsgEl = document.getElementById('barMsg');\n    if (!barMsgEl) return;\n    var addDays = function (d, n) { return new Date(d.getFullYear(), d.getMonth(), d.getDate() + n); };\n    var nthWeekday = function (y, m, wd, n) { var d = new Date(y, m, 1); var s = (wd - d.getDay() + 7) % 7; return new Date(y, m, 1 + s + (n - 1) * 7); };\n    var lastWeekday = function (y, m, wd) { var d = new Date(y, m + 1, 0); var s = (d.getDay() - wd + 7) % 7; return addDays(d, -s); };\n    var windowsFor = function (Y) {\n      var tg = nthWeekday(Y, 10, 4, 4); // Thanksgiving = 4th Thursday of November\n      return [\n        { lead: 'NEW YEAR SALE',        start: new Date(Y, 0, 1),   end: new Date(Y, 0, 1) },\n        { lead: \"PRESIDENTS' DAY SALE\", start: addDays(nthWeekday(Y, 1, 1, 3), -3), end: nthWeekday(Y, 1, 1, 3) },\n        { lead: 'MEMORIAL DAY SALE',    start: addDays(lastWeekday(Y, 4, 1), -3), end: lastWeekday(Y, 4, 1) },\n        { lead: '4TH OF JULY SALE',     start: new Date(Y, 6, 1),   end: new Date(Y, 6, 5) },\n        { lead: 'LABOR DAY SALE',       start: addDays(nthWeekday(Y, 8, 1, 1), -3), end: nthWeekday(Y, 8, 1, 1) },\n        { lead: 'BLACK FRIDAY SALE',    start: tg,                  end: addDays(tg, 3) },\n        { lead: 'CYBER MONDAY SALE',    start: addDays(tg, 4),      end: addDays(tg, 4) },\n        { lead: 'CHRISTMAS SALE',       start: new Date(Y, 11, 10), end: new Date(Y, 11, 25) },\n        { lead: 'NEW YEAR SALE',        start: new Date(Y, 11, 26), end: new Date(Y, 11, 31) }\n      ];\n    };\n    var pac;\n    try {\n      var g = {};\n      new Intl.DateTimeFormat('en-CA', { timeZone: 'America/Los_Angeles', year: 'numeric', month: '2-digit', day: '2-digit' })\n        .formatToParts(new Date()).forEach(function (x) { g[x.type] = x.value; });\n      pac = new Date(parseInt(g.year, 10), parseInt(g.month, 10) - 1, parseInt(g.day, 10));\n    } catch (e) { pac = new Date(); }\n    var W = windowsFor(pac.getFullYear()), t = pac.getTime(), lead = null;\n    for (var i = 0; i < W.length; i++) { if (t >= W[i].start.getTime() && t <= W[i].end.getTime()) { lead = W[i].lead; break; } }\n    if (lead) barMsgEl.innerHTML = barMsgEl.innerHTML.replace(/^[^:]*:/, lead + ':');\n  })();\n\n  /* ---------- 2026 holiday offer: seasonal wording + the free-gift picker ----------\n     Runs BEFORE the NORMAL capture below, so switching back from a flash deal restores this\n     wording and not the everyday offer. The flash sale is still never combined with the gifts:\n     applySale() hides every .js-camera element (the picker, the gift rows) and uses SALE_CART.\n     Gifts Shopify reports as sold out are hidden by the stock check at the end of this block. */\n  var renderGift = function () {};\n  (function () {\n    if (!holiday) return;\n    var setHTML = function (id, html) { var el = document.getElementById(id); if (el) el.innerHTML = html; };\n    var closestOf = function (id, sel) { var el = document.getElementById(id); return el && el.closest(sel); };\n    document.body.classList.add('holiday');\n    if (HOLIDAY_THEMES && !/[?&]theme=off/.test(location.search)) document.body.classList.add('themed', 'theme-' + (holiday.theme || holiday.key));\n    // the season's name as a styled chip (.hol-<key> in style-d.css); PRE- takes the red <em> accent\n    var chip = '<span class=\"hol hol-' + holiday.key + '\">' + holiday.lead.replace(/^PRE-/, '<em>PRE-</em>') + '</span>';\n    setHTML('dealBadge', holiday.badge);\n    setHTML('dtBundle', '<b>\uD83C\uDF81 + Free gift</b><span>$' + bundlePrice() + ' \u00B7 + $20 gift card</span>');\n    setHTML('picksTitle', holiday.pick);\n    setHTML('spWin', '$20 OFF <i>+</i> FREE Gift');\n    setHTML('jpGift', '<div class=\"jp-ic\">\uD83C\uDF81</div><b>FREE Gift</b><span>your pick, up to $200</span>');\n    setHTML('popSub3', 'Enter your email to lock in $20 off + your free gift');\n    setHTML('popDoneGift', 'Your free gift and $20 gift card are already in the deal.');\n    setHTML('faqGift', 'Your free gift ships right alongside your scanner at no extra cost, and the $20 gift card is digital, so there is nothing to ship.');\n    setHTML('cam3360Cta', 'Choose the 3360 &rarr;');\n\n    // from Nov 6 CarMD Connect is no gift (carmdOn): its card leaves the picker, which closes up to two columns, and the\n    // CarMD Connect section goes (body.no-carmd)\n    if (!GIFTS.carmd) {\n      document.body.classList.add('no-carmd');\n      var cmdPick = document.getElementById('pickCarmd'), cmdCard = cmdPick && cmdPick.closest('.pick');\n      if (cmdCard) { cmdCard.parentNode.classList.add('two'); cmdCard.parentNode.removeChild(cmdCard); }\n    }\n    var radios = [].slice.call(document.querySelectorAll('input[name=\"freeGift\"]'));\n    var cards = {}, imgFor = {};   // the picker photos double as the cart thumbnails (their src is Shopify-rewritten)\n    radios.forEach(function (r) {\n      cards[r.value] = r.closest('.pick');\n      var im = r.parentNode.querySelector('label img'); if (im) imgFor[r.value] = im.getAttribute('src');\n    });\n    var ciImg = document.getElementById('ciGiftImg');\n    var giftRow = closestOf('giftRowName', '.srow'), giftItem = closestOf('ciGiftName', '.citem');\n    // the gift's half of the offer line on the first gallery photo\n    var goName = document.getElementById('goGiftName'), goPic = document.getElementById('goGiftPic'), goImg = document.getElementById('goGiftImg'), goPlus = document.getElementById('goPlus');\n    // the gift's picture there: while it is CarMD Connect, a click opens the CarMD window (a copy of the\n    // CarMD Connect section, set up at the end of this file). Any other gift's picture is a plain picture,\n    // and a click on it opens the photo viewer like the rest of the photo. When CarMD Connect sells out the\n    // next gift takes its place, so the CarMD window can no longer be reached.\n    if (goPic) goPic.addEventListener('click', function (e) {\n      if (giftKey !== 'carmd') return;\n      e.stopPropagation();                         // and not the photo viewer\n      document.dispatchEvent(new CustomEvent('carmd:window'));\n    });\n    renderGift = function () {\n      var g = giftKey ? GIFTS[giftKey] : null;   // null only when every gift is sold out\n      var value = MSRP + (g ? g.value : 0) + GIFT_CARD_VALUE + F_BOOT + F_APP + F_SHIP;\n      var save = value - bundlePrice(), pct = Math.round(save / value * 100);\n      [giftRow, giftItem, goName, goPic, goPlus].forEach(function (el) { if (el) el.hidden = !g; });   // the picker itself stays, greyed out\n      if (g) {\n        setHTML('giftRowName', g.name);\n        setHTML('giftRowVal', '$' + g.value);\n        setHTML('ciGiftName', g.cartName);\n        setHTML('ciGiftSub', 'A $' + g.value + ' value, included free');\n        setHTML('ciGiftWas', '$' + g.value);\n        if (ciImg && imgFor[giftKey]) { ciImg.setAttribute('src', imgFor[giftKey]); ciImg.setAttribute('alt', g.name); }\n        if (goName && cards[giftKey]) goName.textContent = cards[giftKey].querySelector('.pick-n').textContent;\n        if (goImg && imgFor[giftKey]) goImg.setAttribute('src', imgFor[giftKey]);\n        if (goPic) {\n          var isCarmd = giftKey === 'carmd';\n          goPic.classList.toggle('is-carmd', isCarmd);\n          goPic.tabIndex = isCarmd ? 0 : -1;\n          goPic.setAttribute('aria-hidden', isCarmd ? 'false' : 'true');\n          goPic.setAttribute('aria-label', isCarmd ? 'More about CarMD Connect' : '');\n        }\n      }\n      radios.forEach(function (r) {\n        r.checked = (r.value === giftKey);\n        if (cards[r.value]) cards[r.value].classList.toggle('on', r.checked);\n      });\n      if (saleActive) return;      // the flash deal owns the banner, the numbers and the cart until they switch back\n      var offTxt = ' $' + (MSRP - bundlePrice()) + ' OFF';\n      setHTML('barMsg', chip + (g ? offTxt + ' <span class=\"and\">+</span> A FREE GIFT <span class=\"and\">+</span> $20 GIFT CARD'\n                                  : offTxt + ' <span class=\"and\">+</span> A $20 GIFT CARD'));\n      // the scanner's price wherever it shows ($299 in the Black Friday week; the flash sale sets its own)\n      var pr = '$' + bundlePrice();\n      setHTML('dealPrice', pr); setHTML('dealScanPrice', '<s>$' + MSRP + '</s> ' + pr); setHTML('vsCost', pr);\n      setHTML('cmpPrice', '<s>$' + MSRP + '</s> ' + pr); setHTML('cartScanPrice', pr);\n      setHTML('dealPill', 'Save ' + pct + '%');\n      setHTML('dealValue', '$' + value + ' total value');\n      setHTML('dealSave', 'You save $' + save + ' &rarr;');\n      setHTML('cartSaveText', '$' + save + ' &middot; ' + pct + '% OFF');\n      setHTML('cartRetail', '$' + value);\n      setHTML('cartDiscount', '&minus;$' + save);\n      setCheckout(bundleCart());\n    };\n    var soldOut = {};\n    // a sold-out gift stays in the picker, greyed out and marked, but can't be picked\n    var markSoldOut = function (key, out) {\n      soldOut[key] = out;\n      var card = cards[key]; if (!card) return;\n      card.classList.toggle('is-out', out);\n      var r = card.querySelector('input'); if (r) r.disabled = out;\n      var v = card.querySelector('.pick-v'); if (out && v) v.textContent = 'Sold out';\n    };\n    var choose = function (key) { if (!GIFTS[key] || soldOut[key]) return; giftKey = key; renderGift(); };\n    radios.forEach(function (r) { r.addEventListener('change', function () { if (r.checked) choose(r.value); }); });\n    // \"Choose the 3380\" etc. inside the gift modals (they also close the modal and scroll to the offer)\n    document.querySelectorAll('[data-pick]').forEach(function (el) {\n      el.addEventListener('click', function () { choose(el.getAttribute('data-pick')); });\n    });\n    renderGift();\n\n    /* stock check (checkStock, above): a sold-out gift stays on show but greyed out and unpickable; if it\n       was the picked one, the next gift in line is picked. If all three are gone, the bundle carries on\n       with just the gift card. */\n    var keys = Object.keys(GIFTS);\n    checkStock(keys, function (avail) {\n      var inStock = keys.filter(function (k) { return avail[k] !== false; });\n      keys.forEach(function (k) { markSoldOut(k, avail[k] === false); });\n      // the CarMD Connect section above the offer only belongs there while CarMD can be picked\n      document.body.classList.toggle('no-carmd', !GIFTS.carmd || avail.carmd === false);\n      if (!inStock.length) {                     // all three sold out: the bundle keeps the gift card\n        giftKey = null;\n        setHTML('picksTitle', keys.length === 3 ? 'All three gifts are sold out' : 'The free gifts are sold out');\n        setHTML('picksSub', 'Your $20 Innova gift card is still included.');\n        setHTML('dtBundle', '<b>\uD83C\uDF81 + Gift card</b><span>$' + bundlePrice() + ' \u00B7 + $20 gift card</span>');\n        setHTML('picksCardTitle', 'A free $20 Innova gift card');\n        setHTML('spWin', '$20 OFF <i>+</i> $20 Gift Card');\n        setHTML('jpGift', '<div class=\"jp-ic\">\uD83C\uDF81</div><b>$20 Gift Card</b><span>included free</span>');\n        setHTML('popSub3', 'Enter your email to lock in $20 off + your $20 gift card');\n        setHTML('popDoneGift', 'Your $20 gift card is already in the deal.');\n        setHTML('faqGift', 'Your $20 gift card is digital, so there is nothing to ship.');\n        renderGift();\n        return;\n      }\n      if (inStock.length === 1) {                // one left: nothing to pick between\n        setHTML('picksTitle', holiday.pick.replace(/: pick one$/, ''));\n        setHTML('picksSub', 'It ships free with your 5610.');\n      }\n      if (avail[giftKey] === false) choose(inStock[0]);\n    });\n  })();\n\n  /* capture the normal (non-sale) copy so the toggle can switch back to it */\n  var NORMAL = {};\n  ['barMsg', 'dealBadge', 'dealPill', 'dealScanPrice', 'dealPrice', 'dealValue', 'dealSave', 'vsCost', 'cmpPrice',\n   'cartCount', 'cartSaveText', 'cartScanPrice', 'cartRetail', 'cartDiscount'].forEach(function (id) {\n    var el = document.getElementById(id); if (el) NORMAL[id] = el.innerHTML;\n  });\n  var applyNormal = function () {\n    saleActive = false;\n    document.body.classList.remove('sale-mode');\n    Object.keys(NORMAL).forEach(function (id) { var el = document.getElementById(id); if (el) el.innerHTML = NORMAL[id]; });\n    setCheckout(bundleCart());\n    renderGift();                 // holiday: re-apply whichever gift they picked (no-op otherwise)\n  };\n\n  /* promo toggle: default = discounted (applySale); alt = full price + free camera (applyNormal) */\n  var dealToggle = document.getElementById('dealToggle');\n  var setToggleUI = function (mode) {\n    if (!dealToggle) return;\n    dealToggle.querySelectorAll('[data-offer]').forEach(function (b) { b.classList.toggle('on', b.getAttribute('data-offer') === mode); });\n  };\n  var activatePromo = function (cfg) {\n    promoActive = true; promoCfg = cfg;\n    /* A flash sale leads with the $269 deal and no gift, so the CarMD Connect section above the offer\n       stands down for this visit (body.flash-lead). Only while the visitor is still near the top, though:\n       the sale sheet answers a moment after load, and pulling a section out from above someone who has\n       already scrolled would jump the page under them. On that rare visit it stays, and its button\n       switches the offer to the gift bundle (data-offer-go, below). */\n    var scrolled = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop || 0, document.body.scrollTop || 0);\n    if (scrolled < 400) document.body.classList.add('flash-lead');\n    if (dealToggle) dealToggle.hidden = noCamera;   // with the camera sold out there is nothing to switch to\n    applySale(cfg);               // default to the discount\n    setToggleUI('sale');\n  };\n  if (dealToggle) dealToggle.querySelectorAll('[data-offer]').forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      var mode = btn.getAttribute('data-offer');\n      if (mode === 'sale') applySale(promoCfg); else applyNormal();\n      setToggleUI(mode);\n    });\n  });\n  /* A button that asks for the gift bundle (the CarMD Connect section's) also has to leave the flash\n     deal, on the rare visit where that section shows during a flash sale. Its data-pick, wired in the\n     holiday block above, has already made CarMD the picked gift by the time this runs. */\n  document.querySelectorAll('[data-offer-go=\"camera\"]').forEach(function (el) {\n    el.addEventListener('click', function () {\n      if (promoActive && saleActive && dealToggle && !dealToggle.hidden) { applyNormal(); setToggleUI('camera'); }\n    });\n  });\n\n  /* ---------- everyday offer: go without the camera when the 3360 is sold out ----------\n     Outside the holiday window the bundle promises a free 3360. If Shopify says it is sold out, drop it\n     everywhere rather than promise something that can't ship: the .js-camera elements hide (as they do\n     for a flash sale), the values are recalculated without it, and the cart link carries neither the\n     camera nor its code. It comes back by itself once restocked. Preview: ?soldout=3360 (during the\n     holidays add phase=off too). */\n  if (!holiday) checkStock(['3360'], function (avail) {\n    if (avail['3360'] !== false) return;\n    noCamera = true;\n    document.body.classList.add('no-camera');\n    // the camera stays on show in the offer, marked sold out, so nobody wonders where the gift went\n    var camRow = document.getElementById('giftRowName'); camRow = camRow && camRow.closest('.srow');\n    var camSv = camRow && camRow.querySelector('.sv');\n    if (camSv) { camSv.className = 'sv out'; camSv.textContent = 'Sold out'; }\n    var camBlock = document.querySelector('.gift.js-soldshow');\n    if (camBlock) {\n      var camT = camBlock.querySelector('.t'), camS = camBlock.querySelector('.s');\n      if (camT) camT.textContent = 'Free 3360 Thermal Camera: sold out';\n      if (camS) camS.textContent = 'This gift is gone for now. Everything else in your bundle is still included.';\n    }\n    var setHTML = function (id, html) { var el = document.getElementById(id); if (el) el.innerHTML = html; };\n    var value = MSRP + F_BOOT + F_APP + F_SHIP, save = value - BUNDLE_PRICE, pct = Math.round(save / value * 100);\n    // rewrite the stored everyday copy, so nothing can put the camera wording back\n    NORMAL.barMsg = (NORMAL.barMsg || 'SPECIAL OFFER').split(':')[0] + ': Get $' + (MSRP - BUNDLE_PRICE) + ' OFF';\n    NORMAL.dealPill = 'Save ' + pct + '%';\n    NORMAL.dealValue = '$' + value + ' total value';\n    NORMAL.dealSave = 'You save $' + save + ' &rarr;';\n    NORMAL.cartSaveText = '$' + save + ' &middot; ' + pct + '% OFF';\n    NORMAL.cartRetail = '$' + value;\n    NORMAL.cartDiscount = '&minus;$' + save;\n    setHTML('spWin', '$20 OFF');\n    setHTML('jpHead', '\uD83C\uDF89 You won <b>$20 OFF</b>');\n    ['jpPlus', 'jpGift'].forEach(function (id) { var el = document.getElementById(id); if (el) el.hidden = true; });\n    setHTML('popSub3', 'Enter your email to lock in $20 off');\n    setHTML('popDoneGift', '');\n    setHTML('faqGift', '');\n    if (dealToggle) dealToggle.hidden = true;      // during a flash sale there is nothing to switch to\n    if (promoActive) { applySale(promoCfg); setToggleUI('sale'); }\n    else applyNormal();\n  });\n\n  var pacificNow = function () {\n    try {\n      var g = {};\n      new Intl.DateTimeFormat('en-CA', { timeZone: 'America/Los_Angeles', year: 'numeric', month: '2-digit',\n        day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }).formatToParts(new Date())\n        .forEach(function (x) { g[x.type] = x.value; });\n      return g.year + '-' + g.month + '-' + g.day + ' ' + (g.hour === '24' ? '00' : g.hour) + ':' + g.minute;\n    } catch (e) { return null; }\n  };\n  // normalize whatever Google Sheets exports into a zero-padded \"YYYY-MM-DD HH:MM\" so string compare is safe\n  var toKey = function (s) {\n    s = (s || '').trim(); if (!s) return '';\n    var dm = s.match(/(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})/) || s.match(/(\\d{1,2})[-/](\\d{1,2})[-/](\\d{4})/);\n    if (!dm) return '';\n    var y, mo, d;\n    if (dm[1].length === 4) { y = dm[1]; mo = dm[2]; d = dm[3]; } else { mo = dm[1]; d = dm[2]; y = dm[3]; }\n    var hh = 0, mm = 0, tm = s.match(/(\\d{1,2}):(\\d{2})\\s*([ap]m)?/i);\n    if (tm) {\n      hh = parseInt(tm[1], 10); mm = parseInt(tm[2], 10);\n      var ap = (tm[3] || '').toLowerCase();\n      if (ap === 'pm' && hh < 12) hh += 12;\n      if (ap === 'am' && hh === 12) hh = 0;\n    }\n    var p = function (n, w) { n = String(parseInt(n, 10) || 0); while (n.length < w) n = '0' + n; return n; };\n    return p(y, 4) + '-' + p(mo, 2) + '-' + p(d, 2) + ' ' + p(hh, 2) + ':' + p(mm, 2);\n  };\n\n  var checkSale = function (rows) {\n    var now = pacificNow(); if (!now) return;\n    for (var i = 0; i < rows.length; i++) {\n      var start = toKey(rows[i].start), end = toKey(rows[i].end);\n      if (start && end && start <= now && now < end) {\n        activatePromo({ price: parseInt(rows[i].price, 10) || 269, camera: /^\\s*(yes|true|1)\\s*$/i.test(rows[i].camera || '') });\n        return;\n      }\n    }\n  };\n  var parseCSV = function (text) {\n    var lines = text.split(/\\r?\\n/).filter(function (l) { return l.trim(); });\n    if (lines.length < 2) return [];\n    var head = lines[0].split(',').map(function (h) { return h.trim().toLowerCase().replace(/^\"|\"$/g, ''); });\n    var find = function (names) { for (var i = 0; i < head.length; i++) for (var j = 0; j < names.length; j++) if (head[i].indexOf(names[j]) === 0) return i; return -1; };\n    var iS = find(['start']), iE = find(['end']), iP = find(['price']), iC = find(['3360', 'camera']);\n    var rows = [];\n    for (var k = 1; k < lines.length; k++) {\n      var c = lines[k].split(',').map(function (v) { return v.trim().replace(/^\"|\"$/g, ''); });\n      rows.push({ start: c[iS], end: c[iE], price: iP >= 0 ? c[iP] : '', camera: iC >= 0 ? c[iC] : '' });\n    }\n    return rows;\n  };\n\n  if (/[?&]sale=preview/.test(location.search)) {\n    activatePromo({ price: 269, camera: false });             // test the promo layout without a live window\n  } else if (/[?&]sale=off/.test(location.search)) {\n    /* preview only: ignore the sale sheet, to see the page as it looks outside a flash sale */\n  } else if (SALE_SHEET_URL) {\n    fetch(SALE_SHEET_URL + (SALE_SHEET_URL.indexOf('?') >= 0 ? '&' : '?') + '_cb=' + Math.floor(Date.now() / 60000))\n      .then(function (r) { return r.text(); })\n      .then(function (t) { checkSale(parseCSV(t)); })\n      .catch(function () { /* network/CORS failure -> stay in normal mode (fail safe) */ });\n  }\n\n  /* slide-in cart: offer-section CTAs open it; every other CTA scrolls to the offer section */\n  var cartDrawer = document.getElementById('cartDrawer');\n  if (cartDrawer) {\n    /* 5-minute \"cart reserved\" countdown \u2014 starts on first open, persists across opens */\n    var cartTimerEl = document.getElementById('cartTimer');\n    var cartEnd = 0, cartInt = null, pad2 = function (n) { return String(n).padStart(2, '0'); };\n    var renderCartTimer = function () {\n      if (!cartTimerEl) return;\n      var d = Math.max(0, cartEnd - Date.now());\n      cartTimerEl.textContent = Math.floor(d / 60000) + ':' + pad2(Math.floor((d % 60000) / 1000));\n      if (d <= 0 && cartInt) { clearInterval(cartInt); cartInt = null; }\n    };\n    var startCartTimer = function () {\n      var now = Date.now();\n      if (!cartEnd || cartEnd - now <= 0) cartEnd = now + 5 * 60 * 1000;   // (re)start a fresh 5:00 if none/expired\n      renderCartTimer();\n      if (!cartInt) cartInt = setInterval(renderCartTimer, 1000);\n    };\n\n    var openCart = function () {\n      cartDrawer.classList.add('open');       // display:block\n      void cartDrawer.offsetWidth;            // reflow so the transition runs from the off-screen state\n      cartDrawer.classList.add('show');       // slide in + fade overlay\n      cartDrawer.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('modal-lock');\n      startCartTimer();\n    };\n    var closeCart = function () {\n      cartDrawer.classList.remove('show');    // slide out\n      cartDrawer.setAttribute('aria-hidden', 'true');\n      if (!document.querySelector('.modal.open')) document.body.classList.remove('modal-lock');\n      setTimeout(function () { if (!cartDrawer.classList.contains('show')) cartDrawer.classList.remove('open'); }, 440);\n    };\n    cartDrawer.querySelectorAll('[data-cart-close]').forEach(function (el) { el.addEventListener('click', closeCart); });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && cartDrawer.classList.contains('open')) closeCart();\n    });\n\n    var scrollToBuy = function () {\n      var buy = document.getElementById('buy');\n      // scrollIntoView scrolls whatever the real container is (window.scrollTo no-ops on Shopify,\n      // where the theme makes <body> the scroller). Bar offset handled via CSS scroll-margin-top.\n      if (buy && buy.scrollIntoView) buy.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    };\n    /* Fire a CTA-click event into whatever analytics the store has (Meta Pixel, GA4, GTM dataLayer).\n       Lets you gauge interest = how many people click a buy CTA. The button_text/location params let\n       you isolate the actual \"Claim Offer\" buttons from the other CTAs in reports. No-op on the\n       standalone page (none of these globals exist there). */\n    var trackCTA = function (el) {\n      var label = (el.textContent || '').replace(/\\s+/g, ' ').trim();\n      var where = el.closest('#buy') ? 'offer'\n                : el.closest('.bar') ? 'announcement'\n                : el.closest('.hero') ? 'hero'\n                : el.closest('.final') ? 'final'\n                : el.closest('.pop') ? 'popup'\n                : el.closest('.modal') ? 'modal'\n                : el.closest('.cmd') ? 'carmd' : 'other';\n      try { if (window.fbq) fbq('trackCustom', 'ClaimOfferClick', { button_text: label, location: where }); } catch (e) {}\n      try { if (window.gtag) gtag('event', 'claim_offer_click', { button_text: label, location: where }); } catch (e) {}\n      try { if (window.dataLayer && window.dataLayer.push) window.dataLayer.push({ event: 'claim_offer_click', button_text: label, location: where }); } catch (e) {}\n    };\n    /* While the offer's own buy button (.claim-first, in the price row) is on screen, a scroll to the offer\n       would do nothing, so a button outside the offer opens the cart too. Everywhere else they scroll. */\n    var firstBuy = document.querySelector('#buy.buy-first .claim-first');\n    var onScreen = function (el) {\n      var r = el.getBoundingClientRect();\n      return r.width > 0 && r.bottom > 0 && r.top < (window.innerHeight || document.documentElement.clientHeight);\n    };\n    document.querySelectorAll('.js-checkout').forEach(function (el) {\n      var inOffer = !!el.closest('#buy');\n      el.addEventListener('click', function (e) {\n        e.preventDefault();\n        trackCTA(el);                // record the click for interest tracking\n        if (inOffer || (firstBuy && onScreen(firstBuy))) openCart();   // Claim Offer + \"You save $529\" open the cart\n        else scrollToBuy();          // all other CTAs bring the user to the offer section\n      });\n    });\n  }\n\n  /* ---------- promo popup (car matcher + email capture) ---------- */\n  /* ====== KLAVIYO SETUP: paste your two values below ======\n     KLAVIYO_PUBLIC_KEY = your public API key (a.k.a. Company/Site ID, 6 chars)\n     KLAVIYO_LIST_ID    = the List ID you want subscribers added to\n     Leave them blank to run in demo mode (no network call).            */\n  var KLAVIYO_PUBLIC_KEY = 'T9Ldwz';\n  var KLAVIYO_LIST_ID = 'UgvmRt';\n  var POPUP_DELAY_MS = 5000;   // show 5s after landing\n  var PROMO_CODE = 'CRX2000';\n\n  var POPUP_ENABLED = true;   // promo popup enabled. Set to false to temporarily turn it off.\n  var pop = POPUP_ENABLED && document.getElementById('promoPop');\n  if (pop) {\n    var SEEN_KEY = 'innova_promo_seen';\n    var steps = {};\n    pop.querySelectorAll('.pop-step').forEach(function (s) { steps[s.getAttribute('data-step')] = s; });\n    var showStep = function (n) {\n      Object.keys(steps).forEach(function (k) { steps[k].hidden = (k !== String(n)); });\n    };\n    var initScratch = null;   // assigned below; called on open so the canvas has real dimensions\n    var openPop = function () {\n      if (pop.classList.contains('open')) return;\n      pop.classList.toggle('pop--promo', promoActive);   // flash-sale variant during a promo\n      pop.classList.add('open');\n      pop.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('modal-lock');\n      if (initScratch) initScratch();\n    };\n    var popTab = document.getElementById('popTab');\n    var showTab = function () { if (popTab) { popTab.hidden = false; popTab.classList.add('show'); } };\n    var hideTab = function () { if (popTab) { popTab.classList.remove('show'); popTab.hidden = true; } };\n    var closePop = function () {\n      pop.classList.remove('open');\n      pop.setAttribute('aria-hidden', 'true');\n      try { localStorage.setItem(SEEN_KEY, '1'); } catch (e) {}\n      if (!document.querySelector('.modal.open')) document.body.classList.remove('modal-lock');\n      if (!emailCaptured) showTab();      // minimize to a re-openable corner tab (unless they signed up)\n    };\n    if (popTab) popTab.addEventListener('click', function () { hideTab(); openPop(); });\n    pop.querySelectorAll('[data-pop-close]').forEach(function (el) { el.addEventListener('click', closePop); });\n    pop.querySelectorAll('[data-pop-goto]').forEach(function (el) {\n      el.addEventListener('click', function () { showStep(promoActive ? '5' : el.getAttribute('data-pop-goto')); });\n    });\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && pop.classList.contains('open')) closePop(); });\n\n    /* jackpot claim countdown (starts when the jackpot step appears) */\n    var jpTimerEl = document.getElementById('jpTimer');\n    var jpEnd = 0, jpInt = null;\n    var startJpTimer = function () {\n      if (!jpTimerEl) return;\n      if (!jpEnd) jpEnd = Date.now() + 10 * 60 * 1000;\n      var r = function () { var d = Math.max(0, jpEnd - Date.now()); jpTimerEl.textContent = Math.floor(d / 60000) + ':' + pad2(Math.floor((d % 60000) / 1000)); if (d <= 0 && jpInt) { clearInterval(jpInt); jpInt = null; } };\n      r(); if (!jpInt) jpInt = setInterval(r, 1000);\n    };\n\n    /* scratch-off: swipe/drag to reveal the discount, then advance to email */\n    var scratch = document.getElementById('scratch');\n    var canvas = document.getElementById('scratchCanvas');\n    if (scratch && canvas && canvas.getContext) {\n      var sctx = canvas.getContext('2d');\n      var sized = false, scratching = false, revealed = false, lastPt = null;\n\n      initScratch = function () {\n        if (sized) return;\n        var r = scratch.getBoundingClientRect();\n        if (!r.width) return;                       // still hidden; will retry on next open call\n        var dpr = Math.min(window.devicePixelRatio || 1, 2);\n        canvas.width = Math.round(r.width * dpr);\n        canvas.height = Math.round(r.height * dpr);\n        sctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n        var g = sctx.createLinearGradient(0, 0, r.width, r.height);\n        g.addColorStop(0, '#cbd0d8'); g.addColorStop(.5, '#aab0ba'); g.addColorStop(1, '#cbd0d8');\n        sctx.fillStyle = g; sctx.fillRect(0, 0, r.width, r.height);\n        sized = true;\n      };\n\n      var relPos = function (e) {\n        var r = canvas.getBoundingClientRect();\n        var t = e.touches && e.touches[0];\n        return { x: (t ? t.clientX : e.clientX) - r.left, y: (t ? t.clientY : e.clientY) - r.top };\n      };\n      var eraseAt = function (x, y) {\n        sctx.globalCompositeOperation = 'destination-out';\n        sctx.beginPath(); sctx.arc(x, y, 22, 0, Math.PI * 2); sctx.fill();\n        if (lastPt) { sctx.lineWidth = 44; sctx.lineCap = 'round'; sctx.beginPath();\n          sctx.moveTo(lastPt.x, lastPt.y); sctx.lineTo(x, y); sctx.stroke(); }\n        lastPt = { x: x, y: y };\n      };\n      var pctCleared = function () {\n        try {\n          var d = sctx.getImageData(0, 0, canvas.width, canvas.height).data, clear = 0, total = 0;\n          for (var i = 3; i < d.length; i += 4 * 24) { total++; if (d[i] === 0) clear++; }\n          return total ? clear / total : 0;\n        } catch (e) { return 0; }\n      };\n      var reveal = function () {\n        if (revealed) return; revealed = true;\n        sctx.clearRect(0, 0, canvas.width, canvas.height);\n        scratch.classList.add('revealed');\n        setTimeout(function () {\n          if (promoActive) { showStep('5'); }              // -> flash-sale shop step (no email during a sale)\n          else { showStep(2); startJpTimer(); }            // -> jackpot celebration\n        }, 950);\n      };\n      var scratchMove = function (e) {\n        if (!scratching || revealed) return;\n        if (e.cancelable) e.preventDefault();\n        var p = relPos(e); eraseAt(p.x, p.y);\n        if (pctCleared() > 0.5) reveal();\n      };\n      var scratchStart = function (e) {\n        if (!sized) initScratch();\n        scratching = true; lastPt = null; scratch.classList.add('scratching');\n        scratchMove(e);\n      };\n      var scratchEnd = function () { scratching = false; lastPt = null; };\n\n      canvas.addEventListener('mousedown', scratchStart);\n      window.addEventListener('mousemove', scratchMove);\n      window.addEventListener('mouseup', scratchEnd);\n      canvas.addEventListener('touchstart', scratchStart, { passive: false });\n      canvas.addEventListener('touchmove', scratchMove, { passive: false });\n      window.addEventListener('touchend', scratchEnd);\n    }\n\n    /* email submit -> Klaviyo */\n    var form = document.getElementById('popForm');\n    var emailIn = document.getElementById('popEmail');\n    var errEl = document.getElementById('popErr');\n    var codeEl = document.getElementById('popCode');\n    if (codeEl) codeEl.textContent = PROMO_CODE;\n    var validEmail = function (v) { return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v); };\n\n    var subscribe = function (email, props) {\n      if (!KLAVIYO_PUBLIC_KEY || !KLAVIYO_LIST_ID) return Promise.resolve('demo');\n      return fetch('https://a.klaviyo.com/client/subscriptions/?company_id=' + encodeURIComponent(KLAVIYO_PUBLIC_KEY), {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'revision': '2024-10-15' },\n        body: JSON.stringify({\n          data: {\n            type: 'subscription',\n            attributes: {\n              custom_source: '5610 Landing Popup',\n              profile: { data: { type: 'profile', attributes: { email: email, properties: props } } }\n            },\n            relationships: { list: { data: { type: 'list', id: KLAVIYO_LIST_ID } } }\n          }\n        })\n      }).then(function (r) { if (!r.ok) throw new Error('Klaviyo ' + r.status); return r; });\n    };\n\n    if (form) {\n      form.addEventListener('submit', function (e) {\n        e.preventDefault();\n        var email = (emailIn.value || '').trim();\n        if (!validEmail(email)) { if (errEl) errEl.hidden = false; emailIn.focus(); return; }\n        if (errEl) errEl.hidden = true;\n        var btn = form.querySelector('.pop-submit');\n        btn.disabled = true; var label = btn.textContent; btn.textContent = 'Signing you up\u2026';\n        subscribe(email, {}).then(function () {\n          try { localStorage.setItem(SEEN_KEY, '1'); localStorage.setItem('innova_email_captured', '1'); } catch (er) {}\n          emailCaptured = true; hideTab();   // they signed up: no minimize tab\n          setCheckout(bundleCart());         // add the CRX2000 discount now that we have the email\n          showStep(4);\n        }).catch(function () {\n          btn.disabled = false; btn.textContent = label;\n          if (errEl) { errEl.hidden = false; errEl.textContent = 'Something went wrong \u2014 please try again.'; }\n        });\n      });\n    }\n\n    /* fire 5s after landing; if already seen but not signed up, keep the re-open tab available */\n    var seen = false; try { seen = !!localStorage.getItem(SEEN_KEY); } catch (e) {}\n    if (dropOn) { /* the $299 week (PRICE_DROP): no popup and no prize tab, so CRX2000's $20 never stacks on it */ }\n    else if (!seen) setTimeout(openPop, POPUP_DELAY_MS);      // shows jackpot (normal) or flash-sale (promo) variant\n    else if (!emailCaptured) showTab();\n  }\n\n  /* ---------- anchor scrolling ---------- */\n  document.querySelectorAll('a[href^=\"#\"]').forEach(function (a) {\n    a.addEventListener('click', function (e) {\n      var id = a.getAttribute('href');\n      if (id.length < 2) return;\n      var el = document.querySelector(id);\n      if (!el) return;\n      e.preventDefault();\n      // scrollIntoView targets the real scroll container (window.scrollTo no-ops on Shopify, where\n      // the theme makes <body> the scroller). Bar offset handled via CSS scroll-margin-top.\n      if (el.scrollIntoView) el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  });\n\n  /* ---------- come back to this tab: alert the title + favicon when the user leaves ---------- */\n  (function () {\n    var origTitle = document.title;\n    var favEl = document.querySelector('link[rel~=\"icon\"]');\n    if (!favEl) { favEl = document.createElement('link'); favEl.rel = 'icon'; document.head.appendChild(favEl); }\n    // On Shopify our section (and its <link rel=\"icon\">) renders inside <body>, where browsers\n    // ignore it \u2014 so the tab shows no favicon and the dot swap has nothing to affect. Move it into\n    // <head> so the icon actually displays. No-op on the standalone page (link is already in <head>).\n    else if (!favEl.closest('head')) { document.head.appendChild(favEl); }\n    var origHref = favEl.getAttribute('href');\n    var badgedHref = null;\n\n    // build a copy of the favicon with a red notification dot\n    var img = new Image();\n    img.onload = function () {\n      try {\n        var c = document.createElement('canvas'); c.width = 32; c.height = 32;\n        var ctx = c.getContext('2d');\n        ctx.drawImage(img, 0, 0, 32, 32);\n        ctx.beginPath(); ctx.arc(23, 9, 8, 0, 2 * Math.PI);\n        ctx.fillStyle = '#da291c'; ctx.fill();\n        ctx.lineWidth = 2.5; ctx.strokeStyle = '#fff'; ctx.stroke();\n        badgedHref = c.toDataURL('image/png');\n      } catch (e) { /* canvas blocked, title alert still works */ }\n    };\n    if (origHref) img.src = origHref;\n\n    var ALERTS = ['\uD83D\uDD34 Your deal is waiting', '\uD83D\uDC4B Come back for $200 OFF'];\n    var flip = null, i = 0;\n    var setFav = function (h) { if (h) favEl.setAttribute('href', h); };\n\n    document.addEventListener('visibilitychange', function () {\n      if (document.hidden) {\n        setFav(badgedHref);\n        i = 0; document.title = ALERTS[0];\n        if (!flip) flip = setInterval(function () {\n          i = (i + 1) % (ALERTS.length + 1);\n          document.title = i === 0 ? origTitle : ALERTS[i - 1];   // blink between the real title and the alerts\n        }, 1400);\n      } else {\n        if (flip) { clearInterval(flip); flip = null; }\n        document.title = origTitle;\n        setFav(origHref);\n      }\n    });\n  })();\n})();\n\n\n/* ==========================================================================\n   3D WIREFRAME SPORTS CAR\n   Hand-rolled: model-space vertices, Y-rotation, X-tilt, perspective divide,\n   painter-ordered edges. No libraries. Two instances share one model:\n     .wire  #truckWire      \"sweep\"   - a scan plane travels the length\n     .wire  #truckWireFeat  \"systems\" - each subsystem lights in turn\n   Both pause off-screen and go static under prefers-reduced-motion.\n   ========================================================================== */\n(function () {\n  'use strict';\n  var a = document.getElementById('truckWire');\n  var b = document.getElementById('truckWireFeat');\n  if (!a && !b) return;\n\n  /* ---------- model (built once, shared) ----------\n     A low sports coupe: x runs from the nose (-100) to the tail (+100), y is up, the floor is 0.\n     Every profile point carries its own half-width, so the cabin sits narrower than the fenders\n     (tumblehome) and the nose tapers in plan. The lower edge arches over each wheel instead of\n     running flat, which is most of what separates a car silhouette from a box. */\n  var V = [], E = [];\n  function vtx(x, y, z) { V.push([x, y, z]); return V.length - 1; }\n  function edge(p, q, w, kind) { E.push([p, q, w === undefined ? 1 : w, kind || '']); }\n\n  var BODY = 38, CABIN = 26, SILL = 6;\n  var WHEEL_R = 15, WHEEL_Y = 15, ARCH_R = 18, FRONT_X = -62, REAR_X = 60;\n  function arch(wx) {                                    // rear edge, up over the wheel, front edge\n    var pts = [];\n    for (var d = -30; d <= 210; d += 30) {\n      var r = d * Math.PI / 180;\n      pts.push([wx + Math.cos(r) * ARCH_R, WHEEL_Y + Math.sin(r) * ARCH_R, BODY, 0]);\n    }\n    return pts;\n  }\n  /* [x, y, half-width, cross-member?] traced nose -> roof -> tail, then back along the underside */\n  var PROFILE = [\n    [-100, 12, 30, 1], [-97, 19, 33, 1], [-80, 27, 36, 0], [-62, 37, BODY, 0],   // nose, hood, front fender\n    [ -38, 35, 33, 1],                                                           // cowl\n    [  -8, 50, CABIN, 1], [14, 51, CABIN, 1],                                    // raked windscreen, short roof\n    [  48, 39, 33, 1], [60, 40, BODY, 0], [86, 39, 36, 0],                       // fastback, rear haunch, deck\n    [  93, 42, 35, 1], [100, 36, 33, 0], [100, 22, 33, 1],                       // ducktail spoiler, tail\n    [  96,  8, 34, 0], [88, SILL, 36, 0]\n  ].concat(arch(REAR_X), arch(FRONT_X), [[-92, SILL, 34, 0], [-98, 8, 31, 0]]);\n\n  var Lp = [], Rp = [];\n  PROFILE.forEach(function (p) { Lp.push(vtx(p[0], p[1], -p[2])); Rp.push(vtx(p[0], p[1], p[2])); });\n  for (var i = 0; i < PROFILE.length; i++) {\n    var nx = (i + 1) % PROFILE.length;\n    edge(Lp[i], Lp[nx]); edge(Rp[i], Rp[nx]);\n    if (PROFILE[i][3]) edge(Lp[i], Rp[i], .5);\n  }\n  edge(Lp[4], Lp[7], .45); edge(Rp[4], Rp[7], .45);      // window sill, cowl to fastback\n\n  [-1, 1].forEach(function (sd) {\n    function side(x, y, hw) { return vtx(x, y, sd * hw); }\n    edge(side(-98, 15, 29), side(-84, 21, 35), .7);         // headlight\n  });\n\n  function ring(cx, cy, r, z, seg, w) {\n    var first = -1, prev = -1;\n    for (var k = 0; k < seg; k++) {\n      var ang = k / seg * Math.PI * 2;\n      var id = vtx(cx + Math.cos(ang) * r, cy + Math.sin(ang) * r, z);\n      if (k === 0) first = id; else edge(prev, id, w, 'wheel');\n      prev = id;\n    }\n    edge(prev, first, w, 'wheel');\n  }\n  [-1, 1].forEach(function (sd) {\n    [FRONT_X, REAR_X].forEach(function (wx) {\n      var z = sd * (BODY + 2);\n      ring(wx, WHEEL_Y, WHEEL_R, z, 18, 1);                 // tyre\n      ring(wx, WHEEL_Y, 10.5, z, 14, .55);                  // rim\n      for (var sp = 0; sp < 5; sp++) {                       // five spokes\n        var a5 = sp / 5 * Math.PI * 2 - Math.PI / 2;\n        edge(vtx(wx + Math.cos(a5) * 3, WHEEL_Y + Math.sin(a5) * 3, z),\n             vtx(wx + Math.cos(a5) * 10.5, WHEEL_Y + Math.sin(a5) * 10.5, z), 0.35, 'wheel');\n      }\n    });\n  });\n\n  /* tag every edge with the vehicle system it belongs to */\n  E.forEach(function (e) {\n    if (e[3] === 'wheel') { e[4] = 'brakes'; return; }\n    var p = V[e[0]], q = V[e[1]];\n    var my = (p[1] + q[1]) / 2, mx = (p[0] + q[0]) / 2;\n    e[4] = (my > 34 && mx > -40 && mx < 52) ? 'airbags' : (mx < -30 ? 'engine' : 'transmission');\n  });\n\n  var GRID = [];\n  for (var gx = -150; gx <= 150; gx += 30) GRID.push([[gx, 0, -95], [gx, 0, 95]]);\n  for (var gz = -95; gz <= 95; gz += 30) GRID.push([[-150, 0, gz], [150, 0, gz]]);\n\n  var SYSTEMS = [\n    { k: 'engine',       label: 'Engine & emissions' },\n    { k: 'brakes',       label: 'ABS brakes' },\n    { k: 'airbags',      label: 'SRS airbags' },\n    { k: 'transmission', label: 'Transmission' }\n  ];\n\n  var reduce = false;\n  try { reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch (e) {}\n\n  /* Line colours come from CSS, so a holiday season can restyle the car: body.theme-<key> in\n     style-d.css sets --wire* as \"r,g,b\". Outside a season nothing sets them and these fallbacks,\n     the everyday red, apply. A lit edge runs from the hot colour up toward white. */\n  function rgbVar(name, fallback) {\n    var m = null;\n    try { m = getComputedStyle(document.body).getPropertyValue(name).match(/^\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*$/); } catch (e) {}\n    return m ? [+m[1], +m[2], +m[3]] : fallback;\n  }\n  var C_LINE = rgbVar('--wire', [232, 72, 48]).join(','), C_HOT = rgbVar('--wire-hot', [255, 120, 90]);\n  var C_GLOW = rgbVar('--wire-glow', [255, 90, 60]).join(','), C_GRID = rgbVar('--wire-grid', [150, 170, 200]).join(',');\n  function lit(i, near) { return Math.round(C_HOT[i] + (Math.max(C_HOT[i], 230) - C_HOT[i]) * near); }\n\n  /* ---------- one animated instance ---------- */\n  function mount(cv, opts) {\n    if (!cv || !cv.getContext) return;\n    var ctx = cv.getContext('2d');\n    var W = 0, H = 0, dpr = 1, TILT = 0.18;\n    var labelEl = opts.labelEl || null, shownSys = -1;\n\n    function resize() {\n      var r = cv.getBoundingClientRect();\n      if (!r.width) return false;\n      dpr = Math.min(window.devicePixelRatio || 1, 2);\n      W = r.width; H = r.height;\n      cv.width = Math.round(W * dpr); cv.height = Math.round(H * dpr);\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n      return true;\n    }\n\n    function project(p, cosY, sinY, scale, cx, cy) {\n      var x = p[0] * cosY - p[2] * sinY;\n      var z = p[0] * sinY + p[2] * cosY;\n      var y = p[1] - 26;\n      var ct = Math.cos(TILT), st = Math.sin(TILT);\n      var y2 = y * ct - z * st;\n      var z2 = y * st + z * ct;\n      var d = 460 / (460 + z2);\n      return [cx + x * d * scale, cy - y2 * d * scale, z2];\n    }\n\n    function frame(t) {\n      if (!W && !resize()) return;\n      var rot = reduce ? 0.45 : 0.42 + Math.sin(t / 6500) * 0.45;\n      var cosY = Math.cos(rot), sinY = Math.sin(rot);\n      var scale = Math.min(W / 240, H / 96);\n      var cx = W / 2, cy = H / 2 + H * 0.07;\n\n      /* which system is lit, and how strongly */\n      var sysIdx = -1, sysMix = 0;\n      if (opts.mode === 'systems') {\n        var per = 2700;\n        sysIdx = reduce ? 0 : Math.floor(t / per) % SYSTEMS.length;\n        var phase = reduce ? 0.5 : (t % per) / per;\n        sysMix = Math.min(1, Math.min(phase, 1 - phase) * 6);   // ease in and out\n        if (labelEl && sysIdx !== shownSys) { labelEl.textContent = SYSTEMS[sysIdx].label; shownSys = sysIdx; }\n      }\n      var sweep = (opts.mode === 'systems' || reduce) ? 1e9 : (((t / 2600) % 1) * 300 - 150);\n\n      ctx.clearRect(0, 0, W, H);\n\n      ctx.lineWidth = 1;\n      GRID.forEach(function (g) {\n        var p = project(g[0], cosY, sinY, scale, cx, cy);\n        var q = project(g[1], cosY, sinY, scale, cx, cy);\n        var al = Math.max(0, 0.13 - ((p[2] + q[2]) / 2) / 2600);\n        if (al <= 0.005) return;\n        ctx.strokeStyle = 'rgba(' + C_GRID + ',' + al.toFixed(3) + ')';\n        ctx.beginPath(); ctx.moveTo(p[0], p[1]); ctx.lineTo(q[0], q[1]); ctx.stroke();\n      });\n\n      var pts = V.map(function (p) { return project(p, cosY, sinY, scale, cx, cy); });\n      var order = E.map(function (e, idx) { return [idx, (pts[e[0]][2] + pts[e[1]][2]) / 2]; })\n                   .sort(function (m, n) { return n[1] - m[1]; });\n\n      order.forEach(function (o) {\n        var e = E[o[0]], p = pts[e[0]], q = pts[e[1]], depth = o[1];\n        var fade = Math.max(0.18, Math.min(1, 1 - (depth + 60) / 230));\n        var near;\n        if (opts.mode === 'systems') {\n          near = (e[4] === SYSTEMS[sysIdx].k) ? sysMix : 0;\n        } else {\n          var mx = (V[e[0]][0] + V[e[1]][0]) / 2;\n          near = Math.max(0, 1 - Math.abs(mx - sweep) / 34);\n        }\n\n        ctx.lineWidth = (e[2] * 1.45 + near * 1.0);\n        if (near > 0.02) {\n          ctx.shadowBlur = 12 * near;\n          ctx.shadowColor = 'rgba(' + C_GLOW + ',' + (0.85 * near).toFixed(3) + ')';\n          ctx.strokeStyle = 'rgba(' + lit(0, near) + ',' + lit(1, near) + ',' +\n                            lit(2, near) + ',' + (fade * (0.55 + 0.45 * near)).toFixed(3) + ')';\n        } else {\n          ctx.shadowBlur = 0;\n          var dim = opts.mode === 'systems' ? 0.42 : 0.82;   // unlit systems recede\n          ctx.strokeStyle = 'rgba(' + C_LINE + ',' + (fade * dim).toFixed(3) + ')';\n        }\n        ctx.beginPath(); ctx.moveTo(p[0], p[1]); ctx.lineTo(q[0], q[1]); ctx.stroke();\n      });\n      ctx.shadowBlur = 0;\n    }\n\n    var running = false, raf = 0;\n    function tick(t) { frame(t); raf = requestAnimationFrame(tick); }\n    function start() {\n      if (running) return;\n      running = true;\n      // paint once up front: rAF is throttled in background tabs, and without this the\n      // canvas can sit blank until the tab is focused\n      try { frame(performance.now()); } catch (err) {}\n      raf = requestAnimationFrame(tick);\n    }\n    function stop() { if (running) { running = false; cancelAnimationFrame(raf); } }\n    window.addEventListener('resize', function () { W = 0; });\n\n    // Always paint one frame at mount. IntersectionObserver callbacks and rAF are both\n    // throttled while the document is hidden, so without this the canvas can stay blank\n    // for a visitor who opens the page in a background tab.\n    resize(); frame(0);\n    if (reduce) return;\n    if (window.IntersectionObserver) {\n      new IntersectionObserver(function (en) {\n        en.forEach(function (x) { x.isIntersecting ? start() : stop(); });\n      }, { threshold: 0.01 }).observe(cv);\n    } else { start(); }\n  }\n\n  mount(a, { mode: 'sweep' });\n  mount(b, { mode: 'systems', labelEl: document.getElementById('featSysLabel') });\n})();\n\n/* ==========================================================================\n   SCROLL HINT\n   The comparison tables are wider than a phone. Flag that on the section when\n   a pane actually overflows, which reveals the \"swipe\" note sitting above the\n   table. Measured rather than keyed to a breakpoint, so it never shows on a\n   viewport where the table already fits.\n   ========================================================================== */\n(function () {\n  'use strict';\n  var panes = [].slice.call(document.querySelectorAll('.cmp-wrap, .vswrap'));\n  if (!panes.length) return;\n  panes.forEach(function (pane) {\n    var sec = pane.closest('section');\n    if (!sec) return;\n    var sync = function () {\n      sec.classList.toggle('is-scrollable', pane.scrollWidth - pane.clientWidth > 4);\n    };\n    window.addEventListener('resize', sync);\n    // watch the TABLE too: the pane is a fixed-width scroll container, so its own\n    // box never changes when the content reflows as the web font loads\n    if (window.ResizeObserver) {\n      try {\n        var ro = new ResizeObserver(sync);\n        ro.observe(pane);\n        if (pane.firstElementChild) ro.observe(pane.firstElementChild);\n      } catch (e) {}\n    }\n    window.addEventListener('load', sync);\n    if (document.fonts && document.fonts.ready) { document.fonts.ready.then(sync).catch(function () {}); }\n    sync();\n  });\n})();\n\n/* ==========================================================================\n   CARMD CONNECT SECTION  (above the offer; holiday gift window only)\n   The feature list and the photo are one control: the lit feature names the callout on the photo.\n   It moves on by itself every few seconds until the visitor picks a feature, waits while the section\n   is off screen or the list is under the pointer, and stays put under prefers-reduced-motion.\n   The photo leans toward a mouse pointer (never on touch).\n   Whether the section shows at all is decided in the holiday block and activatePromo, above.\n   ========================================================================== */\n(function () {\n  'use strict';\n  // The animation is set up on a root element, so the same code drives the section on the page and its\n  // copy in the CarMD window that the CarMD picture on the offer photo opens.\n  function cmdRun(sec) {\n    var feats = [].slice.call(sec.querySelectorAll('.cmd-f'));\n    var list = sec.querySelector('.cmd-list'), stage = sec.querySelector('.cmd-stage');\n    var call = sec.querySelector('.cmd-call'), callK = sec.querySelector('.cmd-call-k'), callT = sec.querySelector('.cmd-call-t');\n    var link = sec.querySelector('.cmd-link');\n    if (!feats.length) return;\n\n    var reduce = false;\n    try { reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch (e) {}\n    var STEP = 5200;                 // keep in step with cmdProg in style-d.css\n    var cur = 0, auto = !reduce, onScreen = false, hovering = false, timer = 0;\n\n    function plan() {\n      clearTimeout(timer);\n      var run = auto && onScreen && !hovering && !document.hidden;\n      sec.classList.toggle('is-auto', run);\n      if (run) timer = setTimeout(function () { show(cur + 1, false); }, STEP);\n    }\n    function show(i, byHand) {\n      cur = (i + feats.length) % feats.length;\n      feats.forEach(function (b, k) {\n        b.classList.toggle('on', k === cur);\n        b.setAttribute('aria-pressed', k === cur ? 'true' : 'false');\n      });\n      if (call && callK && callT) {\n        call.classList.remove('swap');\n        void call.offsetWidth;                                   // restart the swap-in animation\n        callK.textContent = feats[cur].getAttribute('data-k');\n        callT.textContent = feats[cur].getAttribute('data-t');\n        call.classList.add('swap');\n      }\n      if (byHand) auto = false;                                  // a deliberate pick ends the slideshow\n      plan();\n    }\n    feats.forEach(function (b, k) { b.addEventListener('click', function () { show(k, true); }); });\n    if (list) {\n      list.addEventListener('mouseenter', function () { hovering = true; plan(); });\n      list.addEventListener('mouseleave', function () { hovering = false; plan(); });\n    }\n    document.addEventListener('visibilitychange', plan);\n\n    // run the live parts only while the section is on screen\n    function setOnScreen(v) {\n      onScreen = v;\n      sec.classList.toggle('is-idle', !v);\n      try { if (link && link.pauseAnimations) { if (v && !reduce) link.unpauseAnimations(); else link.pauseAnimations(); } } catch (e) {}\n      plan();\n    }\n    if (window.IntersectionObserver) {\n      new IntersectionObserver(function (en) {\n        en.forEach(function (x) { setOnScreen(x.isIntersecting); });\n      }, { threshold: 0.2 }).observe(sec);\n    } else { setOnScreen(true); }\n\n    // the photo leans toward the pointer; the glare follows it\n    var fine = false;\n    try { fine = window.matchMedia('(hover: hover) and (pointer: fine)').matches; } catch (e) {}\n    var tilt = stage && stage.querySelector('.cmd-tilt');\n    if (tilt && fine && !reduce) {\n      var raf = 0, px = 0, py = 0;\n      stage.addEventListener('pointermove', function (e) {\n        var r = stage.getBoundingClientRect();\n        if (!r.width) return;\n        px = (e.clientX - r.left) / r.width - 0.5;\n        py = (e.clientY - r.top) / r.height - 0.5;\n        if (raf) return;\n        raf = requestAnimationFrame(function () {\n          raf = 0;\n          tilt.style.setProperty('--ry', (px * 9).toFixed(2) + 'deg');\n          tilt.style.setProperty('--rx', (-py * 9).toFixed(2) + 'deg');\n          tilt.style.setProperty('--gx', ((px + 0.5) * 100).toFixed(1) + '%');\n          tilt.style.setProperty('--gy', ((py + 0.5) * 100).toFixed(1) + '%');\n        });\n      });\n      stage.addEventListener('pointerleave', function () {\n        tilt.style.setProperty('--ry', '0deg');\n        tilt.style.setProperty('--rx', '0deg');\n      });\n    }\n  }\n  var carmdSec = document.getElementById('carmd');\n  if (carmdSec) cmdRun(carmdSec);\n\n  /* ---------- the CarMD window ----------\n     The CarMD picture on the offer photo opens it (the user's request, Oct 14, 2026: \"the same content\n     shown at the bottom of the page, with the same animation\"). The first time, it copies the section's\n     grid in and starts the same animation on the copy. The copy drops the section's ids. Its button\n     closes the window and brings the buy button into view rather than going on to the cart, since\n     CarMD Connect is already the gift when the window can be opened. */\n  (function () {\n    var modal = document.getElementById('carmdModal');\n    if (!modal || !carmdSec) return;\n    var sheet = modal.querySelector('.cmd-sheet'), built = false, back = null;\n    var close = function () {\n      modal.classList.remove('open');\n      modal.setAttribute('aria-hidden', 'true');\n      if (!document.querySelector('.modal.open') && !document.querySelector('.lbx.open')) document.body.classList.remove('modal-lock');\n      if (back && back.focus) back.focus();\n    };\n    var open = function () {\n      if (!built) {\n        var copy = carmdSec.querySelector('.cmd-grid').cloneNode(true);\n        [].forEach.call(copy.querySelectorAll('[id]'), function (el) { el.removeAttribute('id'); });\n        var cta = copy.querySelector('.cmd-cta');\n        if (cta) {\n          cta.classList.remove('js-checkout');\n          cta.addEventListener('click', function (e) {\n            e.preventDefault();\n            close();\n            var buy = document.querySelector('.claim-first');\n            if (buy && buy.scrollIntoView) buy.scrollIntoView({ block: 'center', behavior: 'smooth' });\n          });\n        }\n        sheet.appendChild(copy);\n        cmdRun(sheet);\n        built = true;\n      }\n      back = document.activeElement;\n      modal.classList.add('open');\n      modal.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('modal-lock');\n      var x = modal.querySelector('.cmd-x'); if (x) x.focus();\n    };\n    document.addEventListener('carmd:window', open);\n    modal.querySelectorAll('[data-close]').forEach(function (el) { el.addEventListener('click', close); });\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && modal.classList.contains('open')) close(); });\n  })();\n\n  /* ---------- photo viewer: the offer's photos full size, with zoom ----------\n     A click (or tap) on the photo, or on the button in its corner, opens it at the photo on show. The\n     arrows, the thumbnails, a swipe or the arrow keys move between photos; Esc, the x or a click beside\n     the photo closes it. A click (or tap) on the photo zooms in at that spot: then the mouse looks\n     around by moving (a finger by dragging), and another click zooms back out. The zoom goes as far as\n     the photo's own pixels allow, between 2x and 3x. */\n  (function () {\n    var box = document.getElementById('lightbox'), main = document.getElementById('galMain');\n    if (!box || !main) return;\n    var frame = main.parentNode, stage = document.getElementById('lbxStage'), img = document.getElementById('lbxImg');\n    var count = document.getElementById('lbxCount'), hint = document.getElementById('lbxHint'), strip = document.getElementById('lbxThumbs');\n    var srcs = [].map.call(document.querySelectorAll('#galThumbs button'), function (b) { return b.getAttribute('data-src'); });\n    if (!srcs.length) return;\n    var touch = window.matchMedia && window.matchMedia('(hover: none)').matches;\n    var words = { idle: touch ? 'Tap to zoom, swipe for more' : 'Click to zoom',\n                  zoomed: touch ? 'Drag to look around, tap to zoom out' : 'Move to look around, click to zoom out' };\n    var at = 0, zoomed = false, Z = 2, ox = 0.5, oy = 0.5, lastFocus = null, down = null, skipUntil = 0;\n    var clamp = function (v) { return isFinite(v) ? Math.max(0, Math.min(1, v)) : 0.5; };\n    var origin = function (x, y) { ox = x; oy = y; img.style.transformOrigin = (x * 100).toFixed(2) + '% ' + (y * 100).toFixed(2) + '%'; };\n    var zoom = function (on, x, y) {\n      if (on && !img.offsetWidth) return;             // the photo is still loading\n      zoomed = on;\n      box.classList.toggle('zoomed', on);\n      if (on) {\n        Z = Math.min(3, Math.max(2, (img.naturalWidth || 1200) / img.offsetWidth));\n        origin(x, y);\n        img.style.transform = 'scale(' + Z.toFixed(3) + ')';\n      } else img.style.transform = '';\n      hint.textContent = on ? words.zoomed : words.idle;\n    };\n    var show = function (n) {\n      at = (n + srcs.length) % srcs.length;\n      zoom(false);\n      // the photo on show stays until the next one has loaded, then it is swapped in\n      var want = srcs[at], next = new Image();\n      next.onload = next.onerror = function () { if (srcs[at] === want) img.src = want; };\n      next.src = want;\n      img.alt = 'Innova 5610, photo ' + (at + 1) + ' of ' + srcs.length;\n      count.textContent = (at + 1) + ' / ' + srcs.length;\n      [].forEach.call(strip.children, function (b, k) { b.classList.toggle('on', k === at); });\n      [at + 1, at - 1].forEach(function (k) { var p = new Image(); p.src = srcs[(k + srcs.length) % srcs.length]; });\n    };\n    srcs.forEach(function (src, n) {\n      var b = document.createElement('button');\n      b.type = 'button'; b.setAttribute('aria-label', 'Photo ' + (n + 1));\n      var t = document.createElement('img'); t.src = src; t.alt = '';\n      b.appendChild(t);\n      b.addEventListener('click', function () { show(n); });\n      strip.appendChild(b);\n    });\n    var open = function () {\n      var n = srcs.indexOf(main.getAttribute('src'));\n      lastFocus = document.activeElement;\n      box.classList.add('open');\n      box.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('modal-lock');\n      show(n < 0 ? 0 : n);\n      box.querySelector('.lbx-x').focus();\n    };\n    var close = function () {\n      box.classList.remove('open');\n      box.setAttribute('aria-hidden', 'true');\n      zoom(false);\n      if (!document.querySelector('.modal.open')) document.body.classList.remove('modal-lock');\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    };\n    frame.addEventListener('click', function (e) { if (!e.target.closest('.go-gift')) open(); });\n    box.querySelectorAll('[data-lbx-close]').forEach(function (b) { b.addEventListener('click', close); });\n    document.getElementById('lbxPrev').addEventListener('click', function () { show(at - 1); });\n    document.getElementById('lbxNext').addEventListener('click', function () { show(at + 1); });\n    document.addEventListener('keydown', function (e) {\n      if (!box.classList.contains('open')) return;\n      if (e.key === 'Escape') close();\n      else if (e.key === 'ArrowRight') show(at + 1);\n      else if (e.key === 'ArrowLeft') show(at - 1);\n    });\n    // the page behind must not scroll while the viewer is open\n    box.addEventListener('wheel', function (e) { e.preventDefault(); }, { passive: false });\n    box.addEventListener('touchmove', function (e) { e.preventDefault(); }, { passive: false });\n    stage.addEventListener('pointerdown', function (e) {\n      down = { x: e.clientX, y: e.clientY, ox: ox, oy: oy, type: e.pointerType, moved: false };\n    });\n    stage.addEventListener('pointermove', function (e) {\n      if (zoomed && e.pointerType === 'mouse') {      // a mouse looks around just by moving\n        var sr = stage.getBoundingClientRect();\n        origin(clamp((e.clientX - sr.left - img.offsetLeft) / img.offsetWidth), clamp((e.clientY - sr.top - img.offsetTop) / img.offsetHeight));\n        return;\n      }\n      if (!down || down.type === 'mouse') return;\n      var dx = e.clientX - down.x, dy = e.clientY - down.y;\n      if (Math.abs(dx) + Math.abs(dy) > 8) down.moved = true;\n      // a finger drags the zoomed photo along with it\n      if (zoomed) origin(clamp(down.ox - dx / ((Z - 1) * img.offsetWidth)), clamp(down.oy - dy / ((Z - 1) * img.offsetHeight)));\n    });\n    stage.addEventListener('pointerup', function (e) {\n      var d = down; down = null;\n      if (!d || d.type === 'mouse') return;\n      var dx = e.clientX - d.x, dy = e.clientY - d.y;\n      if (!zoomed && Math.abs(dx) > 50 && Math.abs(dx) > Math.abs(dy) * 1.5) show(at + (dx < 0 ? 1 : -1));   // a swipe\n      if (d.moved || Math.abs(dx) + Math.abs(dy) > 8) skipUntil = Date.now() + 300;   // a click right after is part of the gesture\n    });\n    stage.addEventListener('pointercancel', function () { down = null; });\n    stage.addEventListener('click', function (e) {\n      if (Date.now() < skipUntil) return;\n      if (e.target !== img) { close(); return; }      // beside the photo\n      if (zoomed) { zoom(false); return; }\n      var r = img.getBoundingClientRect();\n      zoom(true, clamp((e.clientX - r.left) / r.width), clamp((e.clientY - r.top) / r.height));\n    });\n    hint.textContent = words.idle;\n  })();\n})();\n"],
  "mappings": "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",
  "names": ["slides", "timer", "y", "now", "pct", "cards", "i"]
}
