{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/w21-custom-section-power-calculator.js?w21_revision=single-set-20261014-1"],
  "sourcesContent": ["(() => {\r\n  // Install bounds before the initialization guard: a theme preview may already\r\n  // have an older calculator instance, whose inputs must still obey these limits.\r\n  const limitsRevision = 'rounded-controls-help-20261016-1';\r\n  const normalizeApplianceValue = (field, number, max) => {\r\n    const rounded = field === 'charges' ? Math.round(number * 2) / 2\r\n      : field === 'batteryWh' ? Math.round(number) : Math.floor(number);\r\n    return Number.isFinite(rounded) ? Math.min(max, Math.max(0, rounded)) : 0;\r\n  };\r\n  if (window.w21PowerCalculatorLimitsRevision !== limitsRevision) {\r\n    const applyApplianceLimits = (event) => {\r\n      const input = event.target;\r\n      if (!(input instanceof HTMLInputElement)) return;\r\n      const card = input.closest('.w21-power-calculator__app :is([data-device-id], [data-catalogue-device-id])');\r\n      if (!card || !['watts', 'hours', 'minutes', 'batteryWh', 'charges'].includes(input.dataset.field)) return;\r\n      const hours = card.querySelector('input[data-field=\"hours\"]');\r\n      const minutes = card.querySelector('input[data-field=\"minutes\"]');\r\n      const roundedField = ['batteryWh', 'charges'].includes(input.dataset.field);\r\n      const max = ['watts', 'batteryWh', 'charges'].includes(input.dataset.field) ? 99999 : input.dataset.field === 'hours' ? 24 : Number(hours?.value) >= 24 ? 0 : 59;\r\n      input.min = '0';\r\n      input.max = String(max);\r\n      input.step = input.dataset.field === 'charges' ? '0.5' : '1';\r\n      if (input.value !== '') {\r\n        const number = Number(input.value);\r\n        // Keep fractional text intact while typing; commit rounding on change.\r\n        const bounded = roundedField && event.type !== 'change'\r\n          ? Math.min(max, Math.max(0, Number.isFinite(number) ? number : 0))\r\n          : normalizeApplianceValue(input.dataset.field, number, max);\r\n        if (number !== bounded) input.value = String(bounded);\r\n      }\r\n      if (hours && minutes) {\r\n        const fullDay = Number(hours.value) >= 24;\r\n        minutes.max = fullDay ? '0' : '59';\r\n        minutes.disabled = fullDay;\r\n        if (fullDay && minutes.value !== '0') {\r\n          minutes.value = '0';\r\n          // Keep any existing calculator instance's energy state in sync.\r\n          minutes.dispatchEvent(new Event('input', { bubbles: true }));\r\n        }\r\n      }\r\n      card.dataset.limitsRevision = limitsRevision;\r\n    };\r\n    document.addEventListener('input', applyApplianceLimits, true);\r\n    document.addEventListener('change', applyApplianceLimits, true);\r\n    document.addEventListener('focusin', applyApplianceLimits, true);\r\n    window.w21PowerCalculatorLimitsRevision = limitsRevision;\r\n  }\r\n  if (window.w21PowerCalculatorAssetsLoaded) return;\r\n  window.w21PowerCalculatorAssetsLoaded = true;\r\n  const initializeCalculator = (root) => {\r\n    if (!root || root.dataset.initialized === 'true') return;\r\n    root.dataset.initialized = 'true';\r\n\r\n    const locale = ['nl', 'de'].includes(root.dataset.locale) ? root.dataset.locale : 'en';\r\n    // Native number steppers paint an OS background. Keep the number input,\r\n    // bounds and keyboard behaviour, but draw only transparent SVG arrows.\r\n    const syncNumberStepper = box => {\r\n      const input = box.querySelector('input');\r\n      box.querySelectorAll('[data-number-step]').forEach(button => { button.disabled = input.disabled; });\r\n    };\r\n    let numberHold = null;\r\n    const stopNumberHold = event => {\r\n      if (!numberHold || (event?.pointerId !== undefined && event.pointerId !== numberHold.pointerId)) return;\r\n      window.clearTimeout(numberHold.timer);\r\n      numberHold = null;\r\n    };\r\n    window.addEventListener('pointerup', stopNumberHold, true);\r\n    window.addEventListener('pointercancel', stopNumberHold, true);\r\n    window.addEventListener('blur', () => stopNumberHold());\r\n    document.addEventListener('visibilitychange', () => { if (document.hidden) stopNumberHold(); });\r\n    const addNumberStepper = input => {\r\n      const box = input.parentElement;\r\n      if (box.querySelector('[data-number-step]')) return;\r\n      const stepper = document.createElement('span');\r\n      stepper.className = 'w21-power-calculator__number-stepper';\r\n      const actionLabels = { en: ['Increase', 'Decrease'], nl: ['Verhogen', 'Verlagen'], de: ['Erh\u00F6hen', 'Verringern'] }[locale];\r\n      [1, -1].forEach((direction, index) => {\r\n        const button = document.createElement('button');\r\n        button.type = 'button';\r\n        button.dataset.numberStep = String(direction);\r\n        button.setAttribute('aria-label', `${actionLabels[index]}: ${input.getAttribute('aria-label') || ''}`);\r\n        button.innerHTML = `<svg viewBox=\"0 0 12 8\" aria-hidden=\"true\"><path d=\"${direction === 1 ? 'M1 7L6 1l5 6Z' : 'M1 1l5 6 5-6Z'}\"/></svg>`;\r\n        let pointerStepped = false;\r\n        const stepValue = () => {\r\n          if (!input.isConnected || !button.isConnected || input.disabled || input.readOnly || button.disabled) return false;\r\n          const previous = input.value;\r\n          input.stepUp(direction);\r\n          if (input.value === previous) return false;\r\n          input.dispatchEvent(new Event('input', { bubbles: true }));\r\n          input.dispatchEvent(new Event('change', { bubbles: true }));\r\n          return true;\r\n        };\r\n        button.addEventListener('pointerdown', event => {\r\n          event.preventDefault();\r\n          if (event.button !== 0 || event.isPrimary === false ||\r\n            !input.closest('[data-device-id], [data-catalogue-device-id]')) return;\r\n          event.stopPropagation();\r\n          stopNumberHold();\r\n          pointerStepped = true;\r\n          if (!stepValue()) return;\r\n          const hold = { button, pointerId: event.pointerId, timer: null };\r\n          numberHold = hold;\r\n          const repeat = () => {\r\n            if (numberHold !== hold) return;\r\n            if (!root.isConnected || !stepValue()) { stopNumberHold(); return; }\r\n            hold.timer = window.setTimeout(repeat, 90);\r\n          };\r\n          hold.timer = window.setTimeout(repeat, 350);\r\n        });\r\n        button.addEventListener('pointerleave', event => {\r\n          if (numberHold?.button === button) stopNumberHold(event);\r\n        });\r\n        button.addEventListener('contextmenu', event => {\r\n          if (input.closest('[data-device-id], [data-catalogue-device-id]')) event.preventDefault();\r\n        });\r\n        button.addEventListener('click', event => {\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n          // Pointer-down already supplies the first step. Keyboard activation\r\n          // remains a single step; releasing a held pointer never adds an extra.\r\n          if (event.detail > 0 && pointerStepped) { pointerStepped = false; return; }\r\n          pointerStepped = false;\r\n          stepValue();\r\n        });\r\n        stepper.appendChild(button);\r\n      });\r\n      box.appendChild(stepper);\r\n      syncNumberStepper(box);\r\n    };\r\n    root.querySelectorAll('.w21-power-calculator__solar-hours-field > input[type=\"number\"]:not([readonly])').forEach(addNumberStepper);\r\n    root.addEventListener('input', event => {\r\n      if (!(event.target instanceof HTMLInputElement)) return;\r\n      const group = event.target.closest('[data-device-id], [data-catalogue-device-id]') || event.target.parentElement;\r\n      group.querySelectorAll('.w21-power-calculator__solar-hours-field').forEach(syncNumberStepper);\r\n    });\r\n    const translations = {\r\n      en: {\r\n        introEyebrow: 'Configure and calculate', introTitle: 'Let\u2019s build your setup', introText: 'We help you create a personalised setup based on your appliances, daily usage and expected solar input.', benefitsLabel: 'Calculator benefits', benefitQuick: 'Quick personalised result', benefitSolar: 'Practical solar estimate', benefitSimple: 'No technical knowledge needed', calculateSetup: 'Calculate my power setup', closeCalculator: 'Close power calculator', setup: 'Setup', appliances: 'Appliances', result: 'Result', step1: 'Step 1', step2: 'Step 2', step3: 'Step 3', mixText: \"Our recommendation is a starting point. Compare alternatives and build the combination you prefer.\", addPowerStation: 'Add power station', switchPowerStation: 'Switch power station', powerStation: 'Power station', threeOptions: '3 options', addExpansionBattery: 'Add expansion battery', addSolarPanels: 'Add solar panel(s)', switchSolarPanels: 'Switch solar panel(s)', hideSolarPanels: 'Hide solar panel(s)', solarPanel: 'Solar panel', choose: 'Choose', sunlightProfile: 'Sunlight Profile', northEurope: 'North Europe', southEurope: 'South Europe', custom: 'Custom', next: 'Next', back: 'Back', scenarioTitle: 'Add your appliances', scenarioText: 'Select the appliances you will use or add your own. Adjust the settings to reflect your daily routine.', simultaneousTitle: 'Select simultaneous use', simultaneousText: 'Select the appliances that may run at the same time. This calculates peak power.', estimateShort: 'This calculation is an estimate.', reset: 'Reset', openResults: 'Open results', closeResults: 'Close results', disclaimer: '<span class=\"w21-power-calculator__disclaimer-intro\">This calculation is an estimate. </span>Actual runtime of your power station may vary depending on temperature, battery age, inverter efficiency, device usage, and peak power demand. Expected solar input includes an estimated 20% allowance for real-world losses. Source: <span class=\"w21-power-calculator__solar-source\">European Commission PVGIS</span> (June\u2013July averages).',\r\n        selectSetup: 'Select setup', outputEmpty: 'Select a power station to see available output.', capacityEmpty: 'Select a setup to see available capacity.', outputLeft: 'left', capacityLeft: 'left', outputExceeded: 'Output exceeded by', capacityShort: 'Capacity short by', dailyUse: 'Daily use', solarInput: 'Solar input', netDailyNeed: 'Daily energy need', batteryCapacity: 'Battery capacity', solarCapacity: 'Solar capacity', peakPower: 'Peak power', hours: 'Hours', minutes: 'Minutes', chargesPerDay: 'Charges per day', charge: 'charge', watts: 'Watt', addCustomDevice: 'Add custom appliance', selectedAppliances: 'Selected appliances', selectedAppliancesHelp: 'Adjust wattage and daily use.', selectedEmpty: 'No appliances selected yet.', customDeviceName: 'Custom Appliance', compatible: 'Compatible', notCompatible: 'Not compatible with selected power station', selected: 'selected', capacity: 'Capacity', output: 'Output', extraCapacity: 'Extra capacity', estDailyInput: 'Solar input', barcode: 'EAN', outputLimitSelectStation: 'Select a power station to set output limits.', customOutputMax: 'Custom appliance max output', simultaneousCurrent: 'Current simultaneous output', simultaneousLimitReached: 'This would exceed the selected power station output.', dailyGroup: 'Add daily essentials', dailyGroupHelp: 'Everyday appliances up to 100W', comfortGroup: 'Add comfort essentials', comfortGroupHelp: 'Comfort appliances up to 1200W', highGroup: 'Add high-power essentials', highGroupHelp: 'High-power appliances above 1200W', backpackTraveler: 'Back-Pack Traveler', comfortVanlife: 'Comfort Vanlife', offGridTraveler: 'Off-Grid Traveler', customSetup: 'Custom Setup'\r\n      },\r\n      nl: {\r\n        introEyebrow: 'Configureer en bereken', introTitle: 'Stel jouw setup samen', introText: 'We helpen je een persoonlijke setup samen te stellen op basis van je apparaten, dagelijks gebruik en verwachte zonne-opbrengst.', benefitsLabel: 'Voordelen van de calculator', benefitQuick: 'Snel persoonlijk resultaat', benefitSolar: 'Praktische schatting van zonne-energie', benefitSimple: 'Geen technische kennis nodig', calculateSetup: 'Bereken mijn stroomsetup', closeCalculator: 'Sluit stroomcalculator', setup: 'Setup', appliances: 'Apparaten', result: 'Resultaat', step1: 'Stap 1', step2: 'Stap 2', step3: 'Stap 3', mixText: 'Ons advies is een uitgangspunt. Vergelijk alternatieven en stel de combinatie samen die jouw voorkeur heeft.', addPowerStation: 'Voeg powerstation toe', switchPowerStation: 'Wissel powerstation', powerStation: 'Powerstation', threeOptions: '3 opties', addExpansionBattery: 'Voeg uitbreidingsaccu toe', addSolarPanels: 'Voeg zonnepaneel(en) toe', switchSolarPanels: 'Wissel zonnepaneel(en)', hideSolarPanels: 'Verberg zonnepanelen', solarPanel: 'Zonnepaneel', choose: 'Kies', sunlightProfile: 'Zonlichtprofiel', northEurope: 'Noord-Europa', southEurope: 'Zuid-Europa', custom: 'Aangepast', next: 'Volgende', back: 'Terug', scenarioTitle: 'Voeg je apparaten toe', scenarioText: 'Kies de apparaten die je gaat gebruiken of voeg je eigen apparaat toe. Pas de instellingen aan op jouw dagelijkse gebruik.', simultaneousTitle: 'Selecteer gelijktijdig gebruik', simultaneousText: 'Selecteer de apparaten die tegelijkertijd kunnen werken. Hiermee berekenen we het piekvermogen.', estimateShort: 'Deze berekening is een schatting.', reset: 'Reset', openResults: 'Open resultaten', closeResults: 'Sluit resultaten', disclaimer: '<span class=\"w21-power-calculator__disclaimer-intro\">Deze berekening is een schatting. </span>De werkelijke gebruiksduur van je powerstation kan vari\u00EBren door temperatuur, leeftijd van de accu, effici\u00EBntie van de omvormer, apparaatgebruik en piekvermogen. Bij de verwachte zonne-opbrengst is rekening gehouden met circa 20% verlies in de praktijk. Bron: <span class=\"w21-power-calculator__solar-source\">Europese Commissie PVGIS</span> (gemiddelden juni\u2013juli).',\r\n        selectSetup: 'Selecteer een setup', outputEmpty: 'Selecteer een powerstation om het beschikbare vermogen te zien.', capacityEmpty: 'Selecteer een setup om de beschikbare capaciteit te zien.', outputLeft: 'over', capacityLeft: 'over', outputExceeded: 'Vermogen overschreden met', capacityShort: 'Capaciteit tekort met', dailyUse: 'Dagelijks verbruik', solarInput: 'Zonne-opbrengst', netDailyNeed: 'Dagelijkse energiebehoefte', batteryCapacity: 'Accucapaciteit', solarCapacity: 'Zonnecapaciteit', peakPower: 'Piekvermogen', hours: 'Uren', minutes: 'Minuten', chargesPerDay: 'Laadbeurten per dag', charge: 'laadbeurt', watts: 'Watt', addCustomDevice: 'Voeg eigen apparaat toe', selectedAppliances: 'Geselecteerde apparaten', selectedAppliancesHelp: 'Pas het wattage en dagelijks gebruik aan.', selectedEmpty: 'Nog geen apparaten geselecteerd.', customDeviceName: 'Eigen apparaat', compatible: 'Compatibel', notCompatible: 'Niet compatibel met het geselecteerde powerstation', selected: 'geselecteerd', capacity: 'Capaciteit', output: 'Vermogen', extraCapacity: 'Extra capaciteit', estDailyInput: 'Zonne-opbrengst', barcode: 'EAN', outputLimitSelectStation: 'Selecteer een powerstation om vermogenslimieten in te stellen.', customOutputMax: 'Maximaal vermogen eigen apparaat', simultaneousCurrent: 'Huidig gelijktijdig vermogen', simultaneousLimitReached: 'Dit overschrijdt het vermogen van het geselecteerde powerstation.', dailyGroup: 'Voeg dagelijkse apparaten toe', dailyGroupHelp: 'Dagelijkse apparaten tot 100W', comfortGroup: 'Voeg comfortapparaten toe', comfortGroupHelp: 'Comfortapparaten tot 1200W', highGroup: 'Voeg apparaten met hoog vermogen toe', highGroupHelp: 'Apparaten boven 1200W', backpackTraveler: 'Backpackreiziger', comfortVanlife: 'Comfort Vanlife', offGridTraveler: 'Off-grid reiziger', customSetup: 'Aangepaste setup'\r\n      },\r\n      de: {\r\n        introEyebrow: 'Konfigurieren und berechnen', introTitle: 'Stelle dein Setup zusammen', introText: 'Wir helfen dir, ein pers\u00F6nliches Setup anhand deiner Ger\u00E4te, der t\u00E4glichen Nutzung und des erwarteten Solarertrags zusammenzustellen.', benefitsLabel: 'Vorteile des Rechners', benefitQuick: 'Schnelles pers\u00F6nliches Ergebnis', benefitSolar: 'Praxisnahe Solarsch\u00E4tzung', benefitSimple: 'Keine technischen Kenntnisse erforderlich', calculateSetup: 'Mein Strom-Setup berechnen', closeCalculator: 'Stromrechner schlie\u00DFen', setup: 'Setup', appliances: 'Ger\u00E4te', result: 'Ergebnis', step1: 'Schritt 1', step2: 'Schritt 2', step3: 'Schritt 3', mixText: 'W\u00E4hle deine Powerstation und optionale Solarmodule. Stelle das Setup zusammen, das zu dir passt.', addPowerStation: 'Powerstation hinzuf\u00FCgen', switchPowerStation: 'Powerstation wechseln', powerStation: 'Powerstation', threeOptions: '3 Optionen', addExpansionBattery: 'Zusatzakku hinzuf\u00FCgen', addSolarPanels: 'Solarmodul(e) hinzuf\u00FCgen', switchSolarPanels: 'Solarmodul(e) wechseln', hideSolarPanels: 'Solarmodule ausblenden', solarPanel: 'Solarmodul', choose: 'Ausw\u00E4hlen', sunlightProfile: 'Sonnenlichtprofil', northEurope: 'Nordeuropa', southEurope: 'S\u00FCdeuropa', custom: 'Benutzerdefiniert', next: 'Weiter', back: 'Zur\u00FCck', scenarioTitle: 'F\u00FCge deine Ger\u00E4te hinzu', scenarioText: 'F\u00FCge deine Ger\u00E4te hinzu. Beginne mit unserer empfohlenen t\u00E4glichen Nutzung. Passe Leistung und Nutzung an dein Setup an. Findest du dein Ger\u00E4t nicht? F\u00FCge ein eigenes Ger\u00E4t hinzu.', simultaneousTitle: 'Gleichzeitige Nutzung ausw\u00E4hlen', simultaneousText: 'W\u00E4hle die Ger\u00E4te aus, die gleichzeitig laufen k\u00F6nnen. Daraus berechnen wir die Spitzenleistung.', estimateShort: 'Diese Berechnung ist eine Sch\u00E4tzung.', reset: 'Zur\u00FCcksetzen', openResults: 'Ergebnisse \u00F6ffnen', closeResults: 'Ergebnisse schlie\u00DFen', disclaimer: '<span class=\"w21-power-calculator__disclaimer-intro\">Diese Berechnung ist eine Sch\u00E4tzung. </span>Die tats\u00E4chliche Laufzeit deiner Powerstation kann je nach Temperatur, Akkualter, Wechselrichtereffizienz, Ger\u00E4tenutzung und Spitzenleistung variieren. Beim erwarteten Solarertrag sind etwa 20% Praxisverluste ber\u00FCcksichtigt. Quelle: <span class=\"w21-power-calculator__solar-source\">Europ\u00E4ische Kommission PVGIS</span> (Durchschnitt Juni\u2013Juli).',\r\n        selectSetup: 'Setup ausw\u00E4hlen', outputEmpty: 'W\u00E4hle eine Powerstation, um die verf\u00FCgbare Leistung zu sehen.', capacityEmpty: 'W\u00E4hle ein Setup, um die verf\u00FCgbare Kapazit\u00E4t zu sehen.', outputLeft: '\u00FCbrig', capacityLeft: '\u00FCbrig', outputExceeded: 'Leistung \u00FCberschritten um', capacityShort: 'Kapazit\u00E4t unterschritten um', dailyUse: 'T\u00E4glicher Verbrauch', solarInput: 'Solarertrag', netDailyNeed: 'T\u00E4glicher Energiebedarf', batteryCapacity: 'Akkukapazit\u00E4t', solarCapacity: 'Solarkapazit\u00E4t', peakPower: 'Spitzenleistung', hours: 'Stunden', minutes: 'Minuten', chargesPerDay: 'Ladevorg\u00E4nge pro Tag', charge: 'Ladevorgang', watts: 'Watt', addCustomDevice: 'Eigenes Ger\u00E4t hinzuf\u00FCgen', selectedAppliances: 'Ausgew\u00E4hlte Ger\u00E4te', selectedAppliancesHelp: 'Leistung und t\u00E4gliche Nutzung anpassen.', selectedEmpty: 'Noch keine Ger\u00E4te ausgew\u00E4hlt.', customDeviceName: 'Eigenes Ger\u00E4t', compatible: 'Kompatibel', notCompatible: 'Nicht mit der ausgew\u00E4hlten Powerstation kompatibel', selected: 'ausgew\u00E4hlt', capacity: 'Kapazit\u00E4t', output: 'Leistung', extraCapacity: 'Zus\u00E4tzliche Kapazit\u00E4t', estDailyInput: 'Solarertrag', barcode: 'EAN', outputLimitSelectStation: 'W\u00E4hle eine Powerstation, um Leistungsgrenzen festzulegen.', customOutputMax: 'Maximale Leistung des eigenen Ger\u00E4ts', simultaneousCurrent: 'Aktuelle gleichzeitige Leistung', simultaneousLimitReached: 'Dies \u00FCberschreitet die Leistung der ausgew\u00E4hlten Powerstation.', dailyGroup: 'Alltagsger\u00E4te hinzuf\u00FCgen', dailyGroupHelp: 'Alltagsger\u00E4te bis 100W', comfortGroup: 'Komfortger\u00E4te hinzuf\u00FCgen', comfortGroupHelp: 'Komfortger\u00E4te bis 1200W', highGroup: 'Leistungsstarke Ger\u00E4te hinzuf\u00FCgen', highGroupHelp: 'Ger\u00E4te \u00FCber 1200W', backpackTraveler: 'Rucksackreisender', comfortVanlife: 'Komfort Vanlife', offGridTraveler: 'Off-grid Reisender', customSetup: 'Benutzerdefiniertes Setup'\r\n      }\r\n    };\r\n    const labels = { ...translations.en, ...translations[locale] };\r\n    const calculatorIntroCopy = {\r\n      en: { introEyebrow: 'Configurator', introTitle: 'Calculate your setup (5 min)', calculateSetup: 'Start calculator', closeCalculator: 'Close calculator' },\r\n      nl: { introEyebrow: 'Configurator', introTitle: 'Bereken je setup (5 min)', calculateSetup: 'Start calculator', closeCalculator: 'Sluit calculator' },\r\n      de: { introEyebrow: 'Konfigurator', introTitle: 'Berechne dein Setup (5 Min.)', calculateSetup: 'Rechner starten', closeCalculator: 'Rechner schlie\u00DFen' }\r\n    }[locale];\r\n    Object.assign(labels, calculatorIntroCopy);\r\n    const batteryApplianceCopy = {\r\n      en: { chargePower: 'Charge power', deviceBattery: 'Battery', chargesPerDay: 'Charges (day)', appliancePower: 'Power' },\r\n      nl: { chargePower: 'Laadvermogen', deviceBattery: 'Batterij', chargesPerDay: 'Keer (dag)', appliancePower: 'Vermogen' },\r\n      de: { chargePower: 'Ladeleistung', deviceBattery: 'Akku', chargesPerDay: 'Ladungen (Tag)', appliancePower: 'Leistung' }\r\n    }[locale];\r\n    Object.assign(batteryApplianceCopy, {\r\n      nl: {\r\n        batteryHelpTitle: 'Batterijcapaciteit (Apparaat)', powerHelpTitle: 'Vermogen (Apparaat)', simultaneousHelpTitle: 'Aan/Uit',\r\n        batteryHelp: 'Dit is de batterijcapaciteit van jouw apparaat in wattuur (Wh). Controleer de capaciteit en pas deze zo nodig aan. Staat de capaciteit niet in Wh vermeld, maar heb je wel de batterijspanning (V) en de capaciteit in Ah of mAh? Dan kun je deze omrekenen.',\r\n        batteryHelpSections: [\r\n          { heading: 'Van V en Ah naar Wh', lines: ['Volt (V) \u00D7 amp\u00E8re-uur (Ah) = wattuur (Wh).'] },\r\n          { heading: 'Van mAh naar Wh', lines: ['Milliamp\u00E8re-uur (mAh) \u00F7 1.000 = amp\u00E8re-uur (Ah).', 'Vermenigvuldig vervolgens: volt (V) \u00D7 amp\u00E8re-uur (Ah) = wattuur (Wh).'] }\r\n        ],\r\n        powerHelp: 'Dit is het vermogen van jouw apparaat in watt (W). Controleer het vermogen en pas dit zo nodig aan. Je vindt deze waarde meestal op het typeplaatje of in de handleiding.',\r\n        simultaneousHelp: 'Zet deze schakelaar alleen op \u2018Aan\u2019 voor apparaten die je tegelijk gebruikt. Hiermee berekenen we hun gezamenlijke vermogen en controleren we welke powerstation hierbij past. Apparaten op \u2018Uit\u2019 tellen niet mee in dit gezamenlijke vermogen. We controleren wel of ieder apparaat afzonderlijk op de powerstation kan werken.'\r\n      },\r\n      en: {\r\n        batteryHelpTitle: 'Battery capacity (Appliance)', powerHelpTitle: 'Power (Appliance)', simultaneousHelpTitle: 'On/Off',\r\n        batteryHelp: 'This is your appliance\u2019s battery capacity in watt-hours (Wh). Check the capacity and adjust it if needed. Is the capacity not listed in Wh, but you have the battery voltage (V) and capacity in Ah or mAh? You can convert these values.',\r\n        batteryHelpSections: [\r\n          { heading: 'From V and Ah to Wh', lines: ['Volts (V) \u00D7 ampere-hours (Ah) = watt-hours (Wh).'] },\r\n          { heading: 'From mAh to Wh', lines: ['Milliampere-hours (mAh) \u00F7 1,000 = ampere-hours (Ah).', 'Then multiply: volts (V) \u00D7 ampere-hours (Ah) = watt-hours (Wh).'] }\r\n        ],\r\n        powerHelp: 'This is your appliance\u2019s power in watts (W). Check the power and adjust it if needed. You can usually find this value on the rating label or in the manual.',\r\n        simultaneousHelp: 'Set this switch to \u2018On\u2019 only for appliances you use at the same time. We use their combined power to check which power station is suitable. Appliances set to \u2018Off\u2019 do not count towards this combined power. We still check whether each appliance can run individually on the power station.'\r\n      },\r\n      de: {\r\n        batteryHelpTitle: 'Akkukapazit\u00E4t (Ger\u00E4t)', powerHelpTitle: 'Leistung (Ger\u00E4t)', simultaneousHelpTitle: 'Ein/Aus',\r\n        batteryHelp: 'Dies ist die Akkukapazit\u00E4t deines Ger\u00E4ts in Wattstunden (Wh). Pr\u00FCfe die Kapazit\u00E4t und passe sie bei Bedarf an. Ist die Kapazit\u00E4t nicht in Wh angegeben, aber du kennst die Akkuspannung (V) und die Kapazit\u00E4t in Ah oder mAh? Dann kannst du diese Werte umrechnen.',\r\n        batteryHelpSections: [\r\n          { heading: 'Von V und Ah zu Wh', lines: ['Volt (V) \u00D7 Amperestunden (Ah) = Wattstunden (Wh).'] },\r\n          { heading: 'Von mAh zu Wh', lines: ['Milliamperestunden (mAh) \u00F7 1.000 = Amperestunden (Ah).', 'Multipliziere anschlie\u00DFend: Volt (V) \u00D7 Amperestunden (Ah) = Wattstunden (Wh).'] }\r\n        ],\r\n        powerHelp: 'Dies ist die Leistung deines Ger\u00E4ts in Watt (W). Pr\u00FCfe die Leistung und passe sie bei Bedarf an. Diesen Wert findest du meistens auf dem Typenschild oder in der Bedienungsanleitung.',\r\n        simultaneousHelp: 'Stelle diesen Schalter nur f\u00FCr Ger\u00E4te auf \u201EEin\u201C, die du gleichzeitig verwendest. Anhand ihrer Gesamtleistung pr\u00FCfen wir, welche Powerstation geeignet ist. Ger\u00E4te auf \u201EAus\u201C z\u00E4hlen nicht zu dieser Gesamtleistung. Wir pr\u00FCfen weiterhin, ob jedes Ger\u00E4t einzeln mit der Powerstation betrieben werden kann.'\r\n      }\r\n    }[locale]);\r\n    Object.assign(labels, batteryApplianceCopy);\r\n    Object.assign(labels, {\r\n      en: { step5: 'Step 5', recommendedTitle: 'Result', recommendedText: 'Set your (trip) duration and choose whether to include solar panels. Your suggested setup updates automatically.', yourSelection: 'Your selection', recommendationEmpty: 'Add appliances in step 1 to see a recommendation.', selectionEmpty: 'Select a power station in step 3.', recommendationUnavailable: 'No available setup covers these energy and power requirements.', recommendationBasis: 'Based on one day of battery capacity and your sunlight profile.', solarShortfall: 'The compatible solar panels cannot fully cover your daily energy use. Additional charging is needed.' },\r\n      nl: { step5: 'Stap 5', recommendedTitle: 'Resultaat', recommendedText: 'Stel je (reis)duur in en kies of je zonnepanelen wilt meenemen. Je aanbevolen setup wordt automatisch bijgewerkt.', yourSelection: 'Jouw selectie', recommendationEmpty: 'Voeg apparaten toe in stap 1 om een aanbeveling te zien.', selectionEmpty: 'Selecteer een powerstation in stap 3.', recommendationUnavailable: 'Geen beschikbare setup dekt deze energie- en vermogensbehoefte.', recommendationBasis: 'Gebaseerd op \u00E9\u00E9n dag accucapaciteit en jouw zonlichtprofiel.', solarShortfall: 'De compatibele zonnepanelen dekken je dagelijkse energieverbruik niet volledig. Extra opladen is nodig.' },\r\n      de: { step5: 'Schritt 5', recommendedTitle: 'Ergebnis', recommendedText: 'Vergleiche deine Auswahl mit unserem empfohlenen Setup. Finde die Kombination f\u00FCr deinen Energiebedarf.', yourSelection: 'Deine Auswahl', recommendationEmpty: 'F\u00FCge Ger\u00E4te in Schritt 1 hinzu um eine Empfehlung zu sehen.', selectionEmpty: 'W\u00E4hle eine Powerstation in Schritt 3.', recommendationUnavailable: 'Kein verf\u00FCgbares Setup deckt diesen Energie- und Leistungsbedarf.', recommendationBasis: 'Basierend auf Akkukapazit\u00E4t f\u00FCr einen Tag und deinem Sonnenlichtprofil.', solarShortfall: 'Die kompatiblen Solarmodule decken deinen t\u00E4glichen Energiebedarf nicht vollst\u00E4ndig. Zus\u00E4tzliches Laden ist erforderlich.' }\r\n    }[locale]);\r\n    labels.recommendationBasis = {\r\n      en: 'Based on one day of energy use with at least 20% battery reserve. Optional solar charging uses your sunlight profile.',\r\n      nl: 'Gebaseerd op \u00E9\u00E9n dag energieverbruik met minimaal 20% accureserve. Optioneel opladen via de zon gebruikt jouw zonlichtprofiel.',\r\n      de: 'Basierend auf dem Energiebedarf f\u00FCr einen Tag mit mindestens 20% Akkureserve. Optionales Solarladen ber\u00FCcksichtigt dein Sonnenlichtprofil.'\r\n    }[locale];\r\n    Object.assign(labels, {\r\n      en: { enableSolarPanels: 'Enable solar panel(s)', disableSolarPanels: 'Disable solar panel(s)' },\r\n      nl: { enableSolarPanels: 'Zonnepanelen inschakelen', disableSolarPanels: 'Zonnepanelen uitschakelen' },\r\n      de: { enableSolarPanels: 'Solarmodule aktivieren', disableSolarPanels: 'Solarmodule deaktivieren' }\r\n    }[locale]);\r\n    labels.solarAdvice = labels.disableSolarPanels;\r\n    labels.daysUnit = { en: 'days', nl: 'dagen', de: 'Tage' }[locale];\r\n    Object.assign(labels, {\r\n      en: { daysAway: 'Days away', tripAssumptions: 'Start with a full battery. No charging from the mains or your vehicle is included.', recommendationBasis: 'Based on your trip duration with at least 20% battery reserve at the end of each day. Optional solar charging uses your sunlight profile.' },\r\n      nl: { daysAway: 'Aantal dagen onderweg', tripAssumptions: 'Je vertrekt met een volle accu. Opladen via netstroom of je voertuig telt niet mee.', recommendationBasis: 'Gebaseerd op je reisduur met minimaal 20% accureserve aan het einde van elke dag. Optioneel opladen via de zon gebruikt jouw zonlichtprofiel.' },\r\n      de: { daysAway: 'Tage unterwegs', tripAssumptions: 'Du startest mit einem vollen Akku. Laden \u00FCber das Stromnetz oder dein Fahrzeug wird nicht ber\u00FCcksichtigt.', recommendationBasis: 'Basierend auf deiner Reisedauer mit mindestens 20% Akkureserve am Ende jedes Tages. Optionales Solarladen ber\u00FCcksichtigt dein Sonnenlichtprofil.' }\r\n    }[locale]);\r\n    labels.recommendationBasis = {\r\n      en: 'The advice keeps 20% of the main unit capacity in reserve at the end of each day. Expansion batteries and solar input do not increase this reserve.',\r\n      nl: 'Het advies houdt aan het einde van elke dag 20% van de hoofdunitcapaciteit als reserve. Uitbreidingsaccu\u2019s en zonne-opbrengst verhogen die reserve niet.',\r\n      de: 'Die Empfehlung h\u00E4lt am Ende jedes Tages 20% der Kapazit\u00E4t der Haupteinheit als Reserve. Zusatzakkus und Solarertrag erh\u00F6hen diese Reserve nicht.'\r\n    }[locale];\r\n    labels.selectedAppliancesText = {\r\n      en: \"These are the appliances you've selected. This calculates your daily energy consumption.\",\r\n      nl: 'Dit zijn de apparaten die je hebt geselecteerd. Hiermee berekenen we je dagelijkse energieverbruik.',\r\n      de: 'Dies sind deine ausgew\u00E4hlten Ger\u00E4te. Damit berechnen wir deinen t\u00E4glichen Energieverbrauch.'\r\n    }[locale];\r\n    Object.assign(labels, {\r\n      en: { simultaneousTitle: 'Calculate peak power', emptyAppliance: 'Add appliances step 1', step4: 'Step 3', dashboardTitle: 'Live calculation dashboard', dashboardText: 'Explore your results. See how your setup matches your needs. Adjust your setup to see what changes.' },\r\n      nl: { simultaneousTitle: 'Bereken het piekvermogen', emptyAppliance: 'Voeg apparaten toe in stap 1', step4: 'Stap 3', dashboardTitle: 'Live berekeningsoverzicht', dashboardText: 'Bekijk je resultaten. Zie hoe jouw setup aansluit op je behoeften. Pas je setup aan om te zien wat er verandert.' },\r\n      de: { simultaneousTitle: 'Spitzenleistung berechnen', emptyAppliance: 'Ger\u00E4te in Schritt 1 hinzuf\u00FCgen', step4: 'Schritt 3', dashboardTitle: 'Live-Berechnungs\u00FCbersicht', dashboardText: 'Entdecke deine Ergebnisse. Sieh wie dein Setup zu deinen Bed\u00FCrfnissen passt. Passe dein Setup an und sieh was sich ver\u00E4ndert.' }\r\n    }[locale]);\r\n    const applicationCategoryLabels = {\r\n      en: { household: 'Household Appliances', pro: 'Pro (Tools) Appliances', custom: 'Custom Appliances', proEmpty: 'No Pro (Tools) appliances available yet.' },\r\n      nl: { household: 'Huishoudelijke apparaten', pro: 'Pro-apparaten (gereedschap)', custom: 'Eigen apparaten', proEmpty: 'Er zijn nog geen Pro-apparaten (gereedschap) beschikbaar.' },\r\n      de: { household: 'Haushaltsger\u00E4te', pro: 'Pro-Ger\u00E4te (Werkzeuge)', custom: 'Eigene Ger\u00E4te', proEmpty: 'Noch keine Pro-Ger\u00E4te (Werkzeuge) verf\u00FCgbar.' }\r\n    }[locale];\r\n\r\n    labels.step4 = { en: 'Step 2', nl: 'Stap 2', de: 'Schritt 2' }[locale];\r\n    Object.assign(labels, {\r\n      en: { offerStep: 'Step 4', offerTitle: 'Your setup & price', offerIntro: 'Review your selected setup and add it to your cart.', editOffer: 'Edit my setup', offerTotal: 'Total setup price', offerShipping: 'Shipping and any additional discounts are calculated at checkout.', offerShippingPolicy: 'Shipping policy', viewCart: 'View cart', offerEmpty: 'Select a setup to see your price.', offerQuantity: 'Quantity', offerEach: 'each', offerSavings: 'Product savings', offerTaxIncluded: 'Taxes included.', offerTaxCheckout: 'Taxes calculated at checkout.', offerUnavailable: 'One or more selected products are unavailable.', offerPriceMissing: 'Pricing is unavailable. Check the selected products or contact us.', addSetup: 'Add setup to cart', addingSetup: 'Adding setup\u2026', addedSetup: 'Added to cart', offerAdded: 'Your selected setup has been added to your cart.', offerError: 'We could not add the complete setup. Check your cart before trying again.', offerPriceChanged: 'Prices have changed. Review your updated total before adding your setup.' },\r\n      nl: { offerStep: 'Stap 4', offerTitle: 'Jouw setup & prijs', offerIntro: 'Controleer je geselecteerde setup en voeg deze toe aan je winkelwagen.', editOffer: 'Wijzig mijn setup', offerTotal: 'Totale setupprijs', offerShipping: 'Verzendkosten en eventuele extra kortingen worden berekend bij het afrekenen.', offerShippingPolicy: 'Verzendbeleid', viewCart: 'Bekijk winkelwagen', offerEmpty: 'Selecteer een setup om je prijs te zien.', offerQuantity: 'Aantal', offerEach: 'per stuk', offerSavings: 'Productkorting', offerTaxIncluded: 'Inclusief belastingen.', offerTaxCheckout: 'Belastingen worden berekend bij het afrekenen.', offerUnavailable: 'Een of meer geselecteerde producten zijn niet beschikbaar.', offerPriceMissing: 'Prijzen zijn niet beschikbaar. Controleer de geselecteerde producten of neem contact op.', addSetup: 'Voeg setup toe aan winkelwagen', addingSetup: 'Setup toevoegen\u2026', addedSetup: 'Toegevoegd aan winkelwagen', offerAdded: 'Je geselecteerde setup is toegevoegd aan je winkelwagen.', offerError: 'De complete setup kon niet worden toegevoegd. Controleer je winkelwagen voordat je opnieuw probeert.', offerPriceChanged: 'De prijzen zijn gewijzigd. Controleer je bijgewerkte totaal voordat je de setup toevoegt.' },\r\n      de: { offerStep: 'Schritt 4', offerTitle: 'Dein Setup & Preis', offerIntro: 'Pr\u00FCfe dein ausgew\u00E4hltes Setup und lege es in deinen Warenkorb.', editOffer: 'Mein Setup \u00E4ndern', offerTotal: 'Gesamtpreis des Setups', offerShipping: 'Versandkosten und zus\u00E4tzliche Rabatte werden beim Checkout berechnet.', offerShippingPolicy: 'Versandbedingungen', viewCart: 'Warenkorb ansehen', offerEmpty: 'W\u00E4hle ein Setup, um den Preis zu sehen.', offerQuantity: 'Anzahl', offerEach: 'pro St\u00FCck', offerSavings: 'Produktrabatt', offerTaxIncluded: 'Steuern enthalten.', offerTaxCheckout: 'Steuern werden beim Checkout berechnet.', offerUnavailable: 'Mindestens ein ausgew\u00E4hltes Produkt ist nicht verf\u00FCgbar.', offerPriceMissing: 'Preise sind nicht verf\u00FCgbar. Pr\u00FCfe die ausgew\u00E4hlten Produkte oder kontaktiere uns.', addSetup: 'Setup in den Warenkorb', addingSetup: 'Setup wird hinzugef\u00FCgt\u2026', addedSetup: 'Im Warenkorb', offerAdded: 'Dein ausgew\u00E4hltes Setup wurde in den Warenkorb gelegt.', offerError: 'Das komplette Setup konnte nicht hinzugef\u00FCgt werden. Pr\u00FCfe vor einem erneuten Versuch deinen Warenkorb.', offerPriceChanged: 'Die Preise haben sich ge\u00E4ndert. Pr\u00FCfe den aktualisierten Gesamtpreis, bevor du dein Setup hinzuf\u00FCgst.' }\r\n    }[locale]);\r\n    Object.assign(labels, {\r\n      en: { offerOverview: 'Overview', offerItemCount: 'Total items', offerUnitPrice: 'Unit price', offerLineTotal: 'Line total', offerIncrease: 'Increase quantity', offerDecrease: 'Decrease quantity', offerFixedQuantity: 'One power station per setup' },\r\n      nl: { offerOverview: 'Overzicht', offerItemCount: 'Totaal aantal artikelen', offerUnitPrice: 'Prijs per stuk', offerLineTotal: 'Regelbedrag', offerIncrease: 'Verhoog aantal', offerDecrease: 'Verlaag aantal', offerFixedQuantity: 'E\u00E9n powerstation per setup' },\r\n      de: { offerOverview: '\u00DCbersicht', offerItemCount: 'Gesamtanzahl der Artikel', offerUnitPrice: 'St\u00FCckpreis', offerLineTotal: 'Positionssumme', offerIncrease: 'Anzahl erh\u00F6hen', offerDecrease: 'Anzahl verringern', offerFixedQuantity: 'Eine Powerstation pro Setup' }\r\n    }[locale]);\r\n    Object.assign(labels, {\r\n      en: { sunHours: 'Sun hours', changeSunlightProfile: 'Change sunlight profile', chooseSunlightProfile: 'Choose sunlight profile', closeSunlightProfile: 'Close sunlight profile choices' },\r\n      nl: { sunHours: 'Zonuren', changeSunlightProfile: 'Wijzig zonlichtprofiel', chooseSunlightProfile: 'Kies je zonlichtprofiel', closeSunlightProfile: 'Sluit zonlichtprofielkeuze' },\r\n      de: { sunHours: 'Sonnenstunden', changeSunlightProfile: 'Sonnenlichtprofil \u00E4ndern', chooseSunlightProfile: 'Sonnenlichtprofil ausw\u00E4hlen', closeSunlightProfile: 'Sonnenlichtprofilauswahl schlie\u00DFen' }\r\n    }[locale]);\r\n    Object.assign(labels, {\r\n      en: { requiredAccessories: 'Required for your setup', requiredAccessoriesHelp: 'Starts at one per setup. Already own it? Set the quantity to zero.', recommendedAccessories: 'Recommended extras', recommendedAccessoriesHelp: 'Optional products. Add only what you need.', accessoryRequired: 'Required', accessoryOptional: 'Optional', accessorySelect: 'Include this extra', accessoryMissing: 'Product could not be matched to this EAN. Contact us, or set the quantity to zero if you already own it.', accessoryRulesInvalid: 'Some required accessory rules could not be read. Contact us to check your setup.' },\r\n      nl: { requiredAccessories: 'Benodigd voor jouw setup', requiredAccessoriesHelp: 'Start op \u00E9\u00E9n per setup. Heb je dit al? Zet het aantal op nul.', recommendedAccessories: 'Aanbevolen extra\u2019s', recommendedAccessoriesHelp: 'Optionele producten. Voeg alleen toe wat je nodig hebt.', accessoryRequired: 'Benodigd', accessoryOptional: 'Optioneel', accessorySelect: 'Voeg deze extra toe', accessoryMissing: 'Dit EAN kon niet aan een product worden gekoppeld. Neem contact op, of zet het aantal op nul als je dit al hebt.', accessoryRulesInvalid: 'Een of meer regels voor benodigde accessoires konden niet worden gelezen. Neem contact op om je setup te controleren.' },\r\n      de: { requiredAccessories: 'F\u00FCr dein Setup ben\u00F6tigt', requiredAccessoriesHelp: 'Startet bei einem St\u00FCck pro Setup. Schon vorhanden? Setze die Anzahl auf null.', recommendedAccessories: 'Empfohlene Extras', recommendedAccessoriesHelp: 'Optionale Produkte. F\u00FCge nur hinzu, was du brauchst.', accessoryRequired: 'Ben\u00F6tigt', accessoryOptional: 'Optional', accessorySelect: 'Dieses Extra hinzuf\u00FCgen', accessoryMissing: 'Dieser EAN konnte kein Produkt zugeordnet werden. Kontaktiere uns oder setze die Anzahl auf null, wenn du es bereits besitzt.', accessoryRulesInvalid: 'Einige Regeln f\u00FCr ben\u00F6tigtes Zubeh\u00F6r konnten nicht gelesen werden. Kontaktiere uns, um dein Setup zu pr\u00FCfen.' }\r\n    }[locale]);\r\n    root.closest('.w21-power-calculator')?.querySelectorAll('[data-i18n]').forEach((element) => {\r\n      const translation = labels[element.dataset.i18n];\r\n      if (translation) element.textContent = translation;\r\n    });\r\n    root.closest('.w21-power-calculator')?.querySelectorAll('[data-i18n-html]').forEach((element) => {\r\n      const translation = labels[element.dataset.i18nHtml];\r\n      if (translation) element.innerHTML = translation;\r\n    });\r\n    root.closest('.w21-power-calculator')?.querySelectorAll('[data-i18n-aria-label]').forEach((element) => {\r\n      const translation = labels[element.dataset.i18nAriaLabel];\r\n      if (translation) element.setAttribute('aria-label', translation);\r\n    });\r\n\r\n    Object.assign(labels, {\r\n      selectSetup: 'Select setup',\r\n      outputEmpty: 'Select a power station to see available output.',\r\n      capacityEmpty: 'Select a setup to see available capacity.',\r\n      outputLeft: 'left',\r\n      capacityLeft: 'left',\r\n      outputExceeded: 'Output exceeded by',\r\n      capacityShort: 'Capacity short by',\r\n      dailyUse: 'Daily use',\r\n      solarInput: 'Solar input',\r\n      netDailyNeed: 'Daily energy need',\r\n      batteryCapacity: 'Battery capacity',\r\n      solarCapacity: 'Solar capacity',\r\n      peakPower: 'Peak power',\r\n      hours: 'Hours',\r\n      minutes: 'Minutes',\r\n      chargesPerDay: 'Charges per day',\r\n      charge: 'charge',\r\n      watts: 'Watt',\r\n      addCustomDevice: 'Add custom appliance',\r\n      selectedAppliances: 'Selected appliances',\r\n      selectedAppliancesHelp: 'Adjust wattage and daily use.',\r\n      selectedEmpty: 'No appliances selected yet.',\r\n      customDeviceName: 'Custom Appliance',\r\n      compatible: 'Compatible',\r\n      notCompatible: 'Not compatible with selected power station',\r\n      selected: 'selected',\r\n      capacity: 'Capacity',\r\n      output: 'Output',\r\n      extraCapacity: 'Extra capacity',\r\n      estDailyInput: 'Solar input',\r\n      barcode: 'EAN',\r\n      outputLimitSelectStation: 'Select a power station to set output limits.',\r\n      customOutputMax: 'Custom appliance max output',\r\n      simultaneousCurrent: 'Current simultaneous output',\r\n      simultaneousLimitReached: 'This would exceed the selected power station output.'\r\n    }, translations[locale]);\r\n    // Reuse the same intro copy after the legacy translation merge so that\r\n    // subsequent open/close actions keep the labels shown on first render.\r\n    Object.assign(labels, calculatorIntroCopy, batteryApplianceCopy);\r\n    Object.assign(labels, {\r\n      change: locale === 'nl' ? 'Wijzigen' : locale === 'de' ? '\u00C4ndern' : 'Change',\r\n      compatibleCount: locale === 'nl' ? 'compatibel' : locale === 'de' ? 'kompatibel' : 'compatible',\r\n      selectPowerFirst: locale === 'nl' ? 'Kies eerst een powerstation' : locale === 'de' ? 'Zuerst Powerstation w\u00E4hlen' : 'Select power first',\r\n      decreaseExpansion: locale === 'nl' ? 'Verminder uitbreidingsaccu\u2019s' : locale === 'de' ? 'Zusatzakkus verringern' : 'Decrease expansion batteries',\r\n      increaseExpansion: locale === 'nl' ? 'Voeg uitbreidingsaccu toe' : locale === 'de' ? 'Zusatzakku hinzuf\u00FCgen' : 'Increase expansion batteries',\r\n      selectRegion: locale === 'nl' ? 'Selecteer' : locale === 'de' ? 'Ausw\u00E4hlen' : 'Select'\r\n      ,practicalSolarInput: locale === 'nl' ? 'Praktische zonne-opbrengst' : locale === 'de' ? 'Praktischer Solarertrag' : 'Practical solar input'\r\n      ,expectedSolarInput: locale === 'nl' ? 'Verwachte zonne-opbrengst' : locale === 'de' ? 'Erwarteter Solarertrag' : 'Expected solar input'\r\n      ,shortCapacity: locale === 'nl' ? 'Capaciteit' : locale === 'de' ? 'Kapazit\u00E4t' : 'Capacity'\r\n      ,shortSolar: locale === 'nl' ? 'Zon' : locale === 'de' ? 'Solar' : 'Solar'\r\n      ,shortConsumption: locale === 'nl' ? 'Verbruik' : locale === 'de' ? 'Verbrauch' : 'Consumption'\r\n      ,decreaseSolar: locale === 'nl' ? 'Verminder zonnepanelen' : locale === 'de' ? 'Solarmodule verringern' : 'Decrease solar panels'\r\n      ,increaseSolar: locale === 'nl' ? 'Voeg zonnepaneel toe' : locale === 'de' ? 'Solarmodul hinzuf\u00FCgen' : 'Increase solar panels'\r\n      ,removeFromSimultaneous: locale === 'nl' ? 'Verwijder uit gelijktijdig gebruik' : locale === 'de' ? 'Aus gleichzeitiger Nutzung entfernen' : 'Remove from simultaneous use'\r\n      ,includeInSimultaneous: locale === 'nl' ? 'Voeg toe aan gelijktijdig gebruik' : locale === 'de' ? 'Zur gleichzeitigen Nutzung hinzuf\u00FCgen' : 'Include in simultaneous use'\r\n      ,excludeFromSimultaneous: locale === 'nl' ? 'Sluit uit van gelijktijdig gebruik' : locale === 'de' ? 'Von gleichzeitiger Nutzung ausschlie\u00DFen' : 'Exclude from simultaneous use'\r\n    });\r\n    Object.assign(labels, {\r\n      en: { output: 'Power', capacity: 'Battery', extraCapacity: 'Battery', shortCapacity: 'Battery', peakPower: 'Power', netDailyNeed: 'Consumption', practicalSolarInput: 'Solar Input', batteryCapacity: 'Battery', solarInput: 'Solar Input', shortSolar: 'Solar Input' },\r\n      nl: { output: 'Vermogen', capacity: 'Accu', extraCapacity: 'Accu', shortCapacity: 'Accu', peakPower: 'Vermogen', netDailyNeed: 'Verbruik', practicalSolarInput: 'Zonne-opbrengst', batteryCapacity: 'Accu', solarInput: 'Zonne-opbrengst', shortSolar: 'Zonne-opbrengst' },\r\n      de: { output: 'Leistung', capacity: 'Akku', extraCapacity: 'Akku', shortCapacity: 'Akku', peakPower: 'Leistung', netDailyNeed: 'Verbrauch', practicalSolarInput: 'Solarertrag', batteryCapacity: 'Akku', solarInput: 'Solarertrag', shortSolar: 'Solarertrag' }\r\n    }[locale]);\r\n    const audienceNames = { rv_weekend_camper: labels.backpackTraveler, rv_comfort_vanlife: labels.comfortVanlife, rv_off_grid_camper: labels.offGridTraveler };\r\n    const plusIcon = '<svg class=\"w21-power-calculator__plus-symbol\" viewBox=\"0 0 20 20\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M10 4v12M4 10h12\"/></svg>';\r\n    const minusIcon = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 10h12\"/></svg>';\r\n    const checkIcon = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m4.5 10 3.5 3.5 7.5-8\"/></svg>';\r\n    const configurationElement = document.getElementById('w21-calculator-config-' + root.dataset.sectionId);\r\n    let configuredProducts = {};\r\n    try {\r\n      configuredProducts = JSON.parse(configurationElement?.textContent || '{}');\r\n    } catch (error) {\r\n      console.warn('Power calculator product configuration could not be read.', error);\r\n    }\r\n    const productReferences = Object.fromEntries([\r\n      ['move_800', 'EveBase Move 800 Power Station'],\r\n      ['move_1800', 'EveBase Move 1800 Power Station'],\r\n      ['move_2000', 'EveBase Move 2000 Power Station'],\r\n      ['expansion', 'Move 1800 Expansion Battery'],\r\n      ['f120', 'Flexsolar F120 Portable Solar Panel'],\r\n      ['f240', 'Flexsolar F240 Portable Solar Panel'],\r\n      ['f360', 'Flexsolar F360 Portable Solar Panel']\r\n    ].map(([id, title]) => [id, { title, url: '', image: '', barcode: '', ...configuredProducts[id] }]));\r\n    const audiences = [\r\n      { id: 'rv_weekend_camper', name: 'Back-Pack Traveler' },\r\n      { id: 'rv_comfort_vanlife', name: 'Comfort Vanlife' },\r\n      { id: 'rv_off_grid_camper', name: 'Off-Grid Traveler' }\r\n    ];\r\n\r\n    const scenarioSelections = {\r\n      rv_weekend_camper: ['led_lighting', 'phone', 'music_speaker', 'camera'],\r\n      rv_comfort_vanlife: ['led_lighting', 'phone', 'music_speaker', 'laptop', 'fan', 'coffee_machine_camping'],\r\n      rv_off_grid_camper: ['led_lighting', 'phone', 'music_speaker', 'laptop', 'fan', 'coffee_machine_camping', 'mini_electric_kettle', 'electric_grill']\r\n    };\r\n\r\n    const powerStations = [\r\n      { id: 'move_800', segmentName: 'Move 800', output: 800, capacity: 512, compatibleSolar: ['f120'], compatibleExpansion: false },\r\n      { id: 'move_1800', segmentName: 'Move 1800', output: 1800, capacity: 1536, compatibleSolar: ['f120', 'f240', 'f360'], compatibleExpansion: true },\r\n      { id: 'move_2000', segmentName: 'Move 2000', output: 2000, capacity: 2048, compatibleSolar: ['f120', 'f240', 'f360'], compatibleExpansion: false }\r\n    ].map((item) => ({ ...item, ...productReferences[item.id], name: productReferences[item.id].title, segmentName: item.segmentName }));\r\n\r\n    const expansionBattery = { id: 'expansion', ...productReferences.expansion, name: productReferences.expansion.title, segmentName: 'Move 1800 Exp', capacity: 1536, maxQuantity: 2 };\r\n    const solarPanels = [\r\n      { id: 'f120', segmentName: 'F120', watts: 120 },\r\n      { id: 'f240', segmentName: 'F240', watts: 240 },\r\n      { id: 'f360', segmentName: 'F360', watts: 360 }\r\n    ].map((item) => ({ ...item, ...productReferences[item.id], name: productReferences[item.id].title, segmentName: item.segmentName }));\r\n\r\n    const solarMaxByStation = {\r\n      move_800: { f120: 1, f240: 0, f360: 0 },\r\n      move_1800: { f120: 3, f240: 2, f360: 1 },\r\n      move_2000: { f120: 3, f240: 2, f360: 1 }\r\n    };\r\n\r\n    // Energy defaults are defined in the shared appliance catalogue below.\r\n\r\n    const openDeviceGroups = new Set(['household']);\r\n    let applianceSearch = '';\r\n    const openOnlyDeviceGroup = (groupId) => {\r\n      openDeviceGroups.clear();\r\n      if (groupId) openDeviceGroups.add(groupId);\r\n    };\r\n\r\n    const solarRegions = {\r\n      north: { practicalSunHours: 4.0 },\r\n      south: { practicalSunHours: 5.5 },\r\n      custom: { practicalSunHours: 7.0 }\r\n    };\r\n    // A finite input bound prevents unsafe/cart-overflow quantities, not a\r\n    // connection limit. Standalone panels have no powerstation connection cap.\r\n    const maxProductQuantity = 99999;\r\n    const maxStationQuantity = 1;\r\n    const state = { step: 1, audienceId: '', selectedPowerStationId: '', stationCount: 0, expansionCount: 0, selectedSolarId: '', solarCount: 0, devices: [], customCount: 0, selectionSequence: 0, solarRegion: 'north', solarSunHours: solarRegions.north.practicalSunHours, reserveEnabled: true };\r\n    let rememberedSolarSelection = null;\r\n    // Advice is independent of the customer's products. It updates Mix & Match\r\n    // until a manual product/count change, and reconnects only via Switch.\r\n    let selectionIsManual = false;\r\n    let currentRecommendation = null;\r\n    const rememberSolarSelection = () => {\r\n      if (state.selectedSolarId && state.solarCount > 0) {\r\n        rememberedSolarSelection = { id: state.selectedSolarId, count: state.solarCount };\r\n      }\r\n    };\r\n    const getSetupSelection = () => ({\r\n      selectedPowerStationId: state.selectedPowerStationId,\r\n      stationCount: state.stationCount,\r\n      expansionCount: state.expansionCount,\r\n      selectedSolarId: state.selectedSolarId,\r\n      solarCount: state.solarCount\r\n    });\r\n    const sameSetup = (a, b) => ['selectedPowerStationId', 'stationCount', 'expansionCount', 'selectedSolarId', 'solarCount'].every((key) => a[key] === b[key]);\r\n    const getRecommendedSelection = choice => ({\r\n      selectedPowerStationId: choice.station.id,\r\n      stationCount: maxStationQuantity,\r\n      expansionCount: choice.expansionCount,\r\n      selectedSolarId: choice.solar?.panel.id || '',\r\n      solarCount: choice.solar?.quantity || 0\r\n    });\r\n    const markCustomScenario = () => { state.audienceId = 'custom'; };\r\n    Object.assign(labels, {\r\n      en: { switchSetup: 'Switch setup', viewSetup: 'View setup', sunHours: 'Sun hours' },\r\n      nl: { switchSetup: 'Wissel setup', viewSetup: 'Bekijk setup', sunHours: 'Zonuren' },\r\n      de: { switchSetup: 'Setup wechseln', viewSetup: 'Setup ansehen', sunHours: 'Sonnenstunden' }\r\n    }[locale]);\r\n\r\n    const stepButtons = Array.from(root.querySelectorAll('[data-step-button]'));\r\n    const panels = Array.from(root.querySelectorAll('[data-step-panel]'));\r\n    const audienceGrid = root.querySelector('[data-audience-grid]');\r\n    const powerProductGrid = root.querySelector('[data-power-product-grid]');\r\n    const solarProductGrid = root.querySelector('[data-solar-product-grid]');\r\n    // Persistent copies share state, not DOM nodes or IDs. Recalculation must\r\n    // not replace a focused sunlight input or a range-slider thumb.\r\n    const sunlightTemplate = root.querySelector('.w21-power-calculator__solar-region');\r\n    root.querySelectorAll('[data-result-settings]').forEach((settings, index) => {\r\n      if (!sunlightTemplate || settings.querySelector('[data-sunlight-picker]')) return;\r\n      const profile = sunlightTemplate.cloneNode(true);\r\n      profile.removeAttribute('data-mix-sunlight');\r\n      profile.setAttribute('data-results-sunlight', '');\r\n      profile.hidden = true;\r\n      const ids = new Map();\r\n      profile.querySelectorAll('[id]').forEach(el => { const previous = el.id; el.id += '-results-' + index; ids.set(previous, el.id); });\r\n      profile.querySelectorAll('[aria-controls], [aria-labelledby], [for]').forEach(el => {\r\n        ['aria-controls', 'aria-labelledby', 'for'].forEach(name => { if (el.hasAttribute(name)) el.setAttribute(name, el.getAttribute(name).split(' ').map(id => ids.get(id) || id).join(' ')); });\r\n      });\r\n      profile.querySelectorAll('.w21-power-calculator__number-stepper').forEach(el => el.remove());\r\n      settings.appendChild(profile);\r\n      profile.querySelectorAll('input[type=\"number\"]').forEach(addNumberStepper);\r\n    });\r\n    const solarRegionButtons = Array.from(root.querySelectorAll('[data-solar-region]'));\r\n    const sunlightPickers = Array.from(root.querySelectorAll('[data-sunlight-picker]'));\r\n    const customSolarHoursInputs = Array.from(root.querySelectorAll('[data-custom-solar-hours]'));\r\n    root.querySelectorAll('[data-sunlight-picker] [data-custom-solar-hours]').forEach(input => {\r\n      input.setAttribute('aria-label', labels.sunHours);\r\n      input.closest('[data-sunlight-custom]').querySelector('[data-i18n=\"sunHours\"]').textContent = labels.sunHours;\r\n      addNumberStepper(input);\r\n    });\r\n    const deviceGrid = root.querySelector('[data-device-grid]');\r\n    const resultMetrics = [root.querySelector('[data-step-results]')].filter(Boolean);\r\n    const stationOutput = root.querySelector('[data-station-output]');\r\n    const appliancesOutput = root.querySelector('[data-appliances-output]');\r\n    const outputStatus = root.querySelector('[data-output-status]');\r\n    const capacityTotal = root.querySelector('[data-capacity-total]');\r\n    const capacityStack = root.querySelector('[data-capacity-stack]');\r\n    const capacityStatus = root.querySelector('[data-capacity-status]');\r\n    const summaryShell = root.querySelector('[data-summary-shell]');\r\n    const summaryPanel = root.querySelector('[data-summary-panel]');\r\n    const summaryConclusion = root.querySelector('[data-summary-conclusion]');\r\n    const summaryToggle = root.querySelector('[data-summary-toggle]');\r\n    const resultStacks = [capacityStack, root.querySelector('[data-step-results-stack]')].filter(Boolean);\r\n    const resultSettings = new Map(resultStacks.map(stack => [stack, stack.querySelector('[data-result-settings]')]));\r\n    const disclaimerToggle = root.querySelector('[data-disclaimer-toggle]');\r\n    const mobileResultsMedia = window.matchMedia('(max-width: 699px)');\r\n    const calculatorSection = root.closest('.w21-power-calculator') || root;\r\n    const compactFlow = calculatorSection.dataset.compactFlow !== 'false';\r\n    calculatorSection.dataset.compactFlow = String(compactFlow);\r\n    // Keep the former intro steps available for rollback, but do not display\r\n    // another overview above the actual calculator steps.\r\n    const introProcess = calculatorSection.querySelector('[data-intro-process]');\r\n    const introCards = calculatorSection.querySelector('[data-intro-cards]');\r\n    if (introProcess) introProcess.hidden = true;\r\n    if (introCards) introCards.hidden = true;\r\n    if (compactFlow) {\r\n      root.querySelector('[data-step-panel=\"3\"]').hidden = true;\r\n      Object.assign(labels, {\r\n        en: { selectionEmpty: 'No power station selected. Switch to the suggested setup.', offerEmpty: 'Add appliances in step 1 to see your setup and price.' },\r\n        nl: { selectionEmpty: 'Geen powerstation geselecteerd. Wissel naar de aanbevolen setup.', offerEmpty: 'Voeg apparaten toe in stap 1 om jouw setup en prijs te zien.' },\r\n        de: { selectionEmpty: 'Keine Powerstation ausgew\u00E4hlt. Wechsle zum empfohlenen Setup.', offerEmpty: 'F\u00FCge Ger\u00E4te in Schritt 1 hinzu, um dein Setup und den Preis zu sehen.' }\r\n      }[locale]);\r\n    }\r\n    // Temporary presentation pause; change the section flags to restore the UI.\r\n    const floatingResultsEnabled = calculatorSection.dataset.hideFloatingResults !== 'true';\r\n    if (!floatingResultsEnabled) {\r\n      if (summaryShell) summaryShell.hidden = true;\r\n      calculatorSection.style.setProperty('--w21-summary-height', '0px');\r\n    }\r\n    const calculatorContent = calculatorSection.querySelector('[data-calculator-content]');\r\n    const calculatorDisclosure = calculatorSection.querySelector('[data-calculator-disclosure]');\r\n    const calculatorStart = calculatorSection.querySelector('[data-calculator-start]');\r\n    const calculatorDisclosureLabel = calculatorSection.querySelector('[data-calculator-disclosure-label]');\r\n    const solarDisclosure = root.querySelector('[data-solar-disclosure]');\r\n    const solarOptions = root.querySelector('[data-solar-options]');\r\n    const solarDisclosureLabel = root.querySelector('[data-solar-disclosure-label]');\r\n    const powerDisclosure = root.querySelector('[data-power-disclosure]');\r\n    const expansionDisclosure = root.querySelector('[data-expansion-disclosure]');\r\n    const sunlightDisclosure = sunlightTemplate?.querySelector('[data-sunlight-disclosure]');\r\n    const powerPickerMeta = root.querySelector('[data-power-picker-meta]');\r\n    const solarPickerMeta = root.querySelector('[data-solar-picker-meta]');\r\n    const powerMobileLabel = root.querySelector('[data-power-mobile-label]');\r\n    const solarMobileLabel = root.querySelector('[data-solar-mobile-label]');\r\n    const syncSummaryToggle = () => {\r\n      const expanded = root.classList.contains('is-summary-open');\r\n      summaryToggle?.setAttribute('aria-expanded', String(expanded));\r\n      summaryToggle?.setAttribute('aria-label', expanded ? labels.closeResults : labels.openResults);\r\n    };\r\n    syncSummaryToggle();\r\n\r\n    const summaryHoverMedia = window.matchMedia('(hover: hover) and (pointer: fine)');\r\n    let summaryHoverTimer = 0;\r\n    let summaryCloseTimer = 0;\r\n    let summaryPointerInside = false;\r\n    let summaryPinned = false;\r\n    let summaryHoverSuppressed = false;\r\n    const clearSummaryTimers = () => {\r\n      window.clearTimeout(summaryHoverTimer); window.clearTimeout(summaryCloseTimer);\r\n      summaryHoverTimer = 0; summaryCloseTimer = 0;\r\n    };\r\n    const setSummaryOpen = (open, pinned = false) => {\r\n      if (open && !floatingResultsEnabled) return;\r\n      clearSummaryTimers();\r\n      summaryPinned = open && pinned;\r\n      root.classList.toggle('is-summary-open', open);\r\n      syncSummaryToggle();\r\n      if (!open) {\r\n        root.classList.remove('is-disclaimer-open');\r\n        disclaimerToggle?.setAttribute('aria-expanded', 'false');\r\n      }\r\n      queueSummaryPosition();\r\n    };\r\n    const closeSummary = () => {\r\n      summaryHoverSuppressed = summaryPointerInside;\r\n      setSummaryOpen(false);\r\n    };\r\n    const scheduleSummaryClose = () => {\r\n      window.clearTimeout(summaryCloseTimer);\r\n      if (summaryPinned || summaryPointerInside || summaryShell?.contains(document.activeElement)) return;\r\n      summaryCloseTimer = window.setTimeout(() => {\r\n        if (!summaryPinned && !summaryPointerInside && !summaryShell?.contains(document.activeElement)) setSummaryOpen(false);\r\n      }, 250);\r\n    };\r\n    summaryShell?.addEventListener('pointerenter', event => {\r\n      if (!floatingResultsEnabled || event.pointerType !== 'mouse' || !summaryHoverMedia.matches) return;\r\n      summaryPointerInside = true;\r\n      window.clearTimeout(summaryCloseTimer);\r\n      if (summaryHoverSuppressed || root.classList.contains('is-summary-open')) return;\r\n      summaryHoverTimer = window.setTimeout(() => {\r\n        if (summaryPointerInside && !summaryHoverSuppressed && summaryHoverMedia.matches && !calculatorContent?.hidden) setSummaryOpen(true);\r\n      }, 350);\r\n    });\r\n    summaryShell?.addEventListener('pointerleave', event => {\r\n      if (event.pointerType !== 'mouse') return;\r\n      summaryPointerInside = false; summaryHoverSuppressed = false;\r\n      window.clearTimeout(summaryHoverTimer); summaryHoverTimer = 0;\r\n      scheduleSummaryClose();\r\n    });\r\n    summaryShell?.addEventListener('focusin', () => window.clearTimeout(summaryCloseTimer));\r\n    summaryShell?.addEventListener('focusout', () => window.setTimeout(scheduleSummaryClose, 0));\r\n    summaryShell?.addEventListener('keydown', event => {\r\n      if (event.key !== 'Escape' || !root.classList.contains('is-summary-open')) return;\r\n      event.preventDefault(); closeSummary();\r\n      summaryToggle?.focus({ preventScroll: true });\r\n    });\r\n    summaryHoverMedia.addEventListener?.('change', () => {\r\n      clearSummaryTimers(); summaryPointerInside = false; summaryHoverSuppressed = false;\r\n      if (!summaryHoverMedia.matches && !summaryPinned) setSummaryOpen(false);\r\n    });\r\n\r\n    // Follow the calculator language, never the customer's browser locale.\r\n    const numberLocale = { en: 'en-US', nl: 'nl-NL', de: 'de-DE' }[locale];\r\n    const formatNumber = (value, digits = 0) => !Number.isFinite(value) ? '0' : value.toLocaleString(numberLocale, { maximumFractionDigits: digits, minimumFractionDigits: 0 });\r\n    const escapeHtml = (value) => String(value ?? '').replace(/[&<>'\"]/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', \"'\": '&#39;', '\"': '&quot;' }[character]));\r\n    const fitCustomNameInput = (input) => {\r\n      if (!input) return;\r\n      input.style.fontSize = '';\r\n      let size = parseFloat(window.getComputedStyle(input).fontSize) || 14;\r\n      const minimumSize = 10;\r\n      while (input.scrollWidth > input.clientWidth && size > minimumSize) {\r\n        size -= 0.5;\r\n        input.style.fontSize = `${size}px`;\r\n      }\r\n    };\r\n    const clamp = (value, min, max) => Math.max(min, Math.min(value, max));\r\n    const getSelectedPowerStation = () => powerStations.find((product) => product.id === state.selectedPowerStationId) || null;\r\n    // Recommendations use the same product markup, without mutating selection.\r\n    const getSelectedSetupItems = (selection = state) => {\r\n      const station = selection.stationCount > 0 ? powerStations.find(product => product.id === selection.selectedPowerStationId) : null;\r\n      const panel = solarPanels.find(product => product.id === selection.selectedSolarId);\r\n      const expansionCount = station?.compatibleExpansion ? clamp(Math.floor(Number(selection.expansionCount) || 0), 0, expansionBattery.maxQuantity) : 0;\r\n      const solarCount = panel ? clamp(Math.floor(Number(selection.solarCount) || 0), 0, station ? solarMaxByStation[station.id]?.[panel.id] || 0 : maxProductQuantity) : 0;\r\n      return [\r\n        ...(station && selection.stationCount > 0 ? [{ product: station, quantity: maxStationQuantity }] : []),\r\n        ...(expansionCount ? [{ product: expansionBattery, quantity: expansionCount }] : []),\r\n        ...(solarCount ? [{ product: panel, quantity: solarCount }] : [])\r\n      ];\r\n    };\r\n    const getOutputLimit = () => {\r\n      const station = getSelectedPowerStation();\r\n      return station ? station.output : Infinity;\r\n    };\r\n    const isCustomDevice = (device) => device.isCustom === true || device.id === 'custom_device' || device.id.startsWith('custom_');\r\n    const finalizeClonedDevices = (devices, hasPreset) => {\r\n      const groupRank = (device) => {\r\n        const watts = getDevicePower(device);\r\n        return watts <= 100 ? 0 : watts <= 1200 ? 1 : 2;\r\n      };\r\n      const normalized = devices.map((device, sourceIndex) => ({\r\n        ...device,\r\n        active: hasPreset ? Boolean(device.active) : false,\r\n        simultaneous: hasPreset ? Boolean(device.active) : false,\r\n        selectionOrder: null,\r\n        sourceIndex\r\n      }));\r\n      let selectionOrder = 0;\r\n\r\n      normalized\r\n        .filter((device) => device.active)\r\n        .sort((a, b) => groupRank(a) - groupRank(b) || a.sourceIndex - b.sourceIndex)\r\n        .forEach((device) => { device.selectionOrder = ++selectionOrder; });\r\n\r\n      return normalized;\r\n    };\r\n    // Shared catalogue: identical ratings and usage defaults in every scenario.\r\n    const applianceCatalog = [\r\n      [\r\n        \"phone\",\r\n        \"Mobile\",\r\n        \"Mobiel\",\r\n        \"Mobiltelefon\",\r\n        20,\r\n        \"battery\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"tablet\",\r\n        \"Tablet\",\r\n        \"Tablet\",\r\n        \"Tablet\",\r\n        20,\r\n        \"battery\",\r\n        1,\r\n        30\r\n      ],\r\n      [\r\n        \"laptop\",\r\n        \"Laptop\",\r\n        \"Laptop\",\r\n        \"Laptop\",\r\n        65,\r\n        \"battery\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"camera\",\r\n        \"Camera\",\r\n        \"Camera\",\r\n        \"Kamera\",\r\n        40,\r\n        \"battery\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"drone\",\r\n        \"Drone\",\r\n        \"Drone\",\r\n        \"Drohne\",\r\n        30,\r\n        \"battery\",\r\n        1,\r\n        30\r\n      ],\r\n      [\r\n        \"cpap_machine\",\r\n        \"CPAP device\",\r\n        \"CPAP-apparaat\",\r\n        \"CPAP-Ger\u00E4t\",\r\n        50,\r\n        \"ac\",\r\n        8,\r\n        0\r\n      ],\r\n      [\r\n        \"led_lighting\",\r\n        \"LED light\",\r\n        \"LED lamp\",\r\n        \"LED-Lampe\",\r\n        10,\r\n        \"ac\",\r\n        4,\r\n        0\r\n      ],\r\n      [\r\n        \"compressor_cooler_m\",\r\n        \"Compressor coolbox (40L)\",\r\n        \"Compressor koelbox (40L)\",\r\n        \"Kompressor-K\u00FChlbox (40L)\",\r\n        45,\r\n        \"measured\",\r\n        24,\r\n        0\r\n      ],\r\n      [\r\n        \"fridge\",\r\n        \"Gas fridge (RV)\",\r\n        \"Gaskoelkast (camper)\",\r\n        \"Gas-K\u00FChlschrank (Wohnmobil)\",\r\n        5,\r\n        \"dc\",\r\n        24,\r\n        0\r\n      ],\r\n      [\r\n        \"coffee_machine_camping\",\r\n        \"Coffee machine (12V)\",\r\n        \"Koffiezetapparaat (12V)\",\r\n        \"Kaffeemaschine (12V)\",\r\n        170,\r\n        \"dc\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"coffee_machine_pods\",\r\n        \"Nespresso machine (230V)\",\r\n        \"Nespresso apparaat (230V)\",\r\n        \"Nespresso-Maschine (230V)\",\r\n        1300,\r\n        \"ac\",\r\n        0,\r\n        10\r\n      ],\r\n      [\r\n        \"mini_electric_kettle\",\r\n        \"Mini kettle (12V)\",\r\n        \"Mini waterkoker (12V)\",\r\n        \"Mini-Wasserkocher (12V)\",\r\n        200,\r\n        \"dc\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"toaster\",\r\n        \"Toaster\",\r\n        \"Broodrooster\",\r\n        \"Toaster\",\r\n        750,\r\n        \"ac\",\r\n        0,\r\n        10\r\n      ],\r\n      [\r\n        \"air_fryer\",\r\n        \"Air fryer\",\r\n        \"Airfryer\",\r\n        \"Hei\u00DFluftfritteuse\",\r\n        1700,\r\n        \"ac\",\r\n        0,\r\n        20\r\n      ],\r\n      [\r\n        \"electric_grill\",\r\n        \"Electric grill\",\r\n        \"Elektrische grill\",\r\n        \"Elektrischer Grill\",\r\n        1500,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"tyre_inflator\",\r\n        \"Tyre inflator\",\r\n        \"Bandenpomp\",\r\n        \"Reifenpumpe\",\r\n        20,\r\n        \"battery\",\r\n        1,\r\n        30\r\n      ],\r\n      [\r\n        \"led_television\",\r\n        \"LED television (50 inch)\",\r\n        \"LED televisie (50 inch)\",\r\n        \"LED-Fernseher (50 Zoll)\",\r\n        60,\r\n        \"ac\",\r\n        2,\r\n        0\r\n      ],\r\n      [\r\n        \"bike_battery\",\r\n        \"Bike battery\",\r\n        \"Fietsaccu\",\r\n        \"Fahrradakku\",\r\n        170,\r\n        \"battery\",\r\n        3,\r\n        0\r\n      ],\r\n      [\r\n        \"ecomat_heater\",\r\n        \"Mini heater\",\r\n        \"Mini heater\",\r\n        \"Mini-Heizger\u00E4t\",\r\n        1200,\r\n        \"ac\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"travel_hair_dryer\",\r\n        \"Hair dryer (12V)\",\r\n        \"Haarf\u00F6hn (12V)\",\r\n        \"Haartrockner (12V)\",\r\n        120,\r\n        \"dc\",\r\n        0,\r\n        10\r\n      ],\r\n      [\r\n        \"fan\",\r\n        \"Fan\",\r\n        \"Ventilator\",\r\n        \"Ventilator\",\r\n        30,\r\n        \"ac\",\r\n        4,\r\n        0\r\n      ],\r\n      [\r\n        \"roof_air_conditioner\",\r\n        \"Roof air conditioner\",\r\n        \"Dakairco\",\r\n        \"Dachklimaanlage\",\r\n        800,\r\n        \"ac\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"music_speaker\",\r\n        \"Mini speaker\",\r\n        \"Mini speaker\",\r\n        \"Mini-Lautsprecher\",\r\n        20,\r\n        \"ac\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"party_speaker\",\r\n        \"Party speaker\",\r\n        \"Partyspeaker\",\r\n        \"Party-Lautsprecher\",\r\n        80,\r\n        \"ac\",\r\n        4,\r\n        0\r\n      ],\r\n      [\r\n        \"flashlight\",\r\n        \"Flashlight\",\r\n        \"Zaklamp\",\r\n        \"Taschenlampe\",\r\n        5,\r\n        \"battery\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"water_pump\",\r\n        \"Water pump\",\r\n        \"Waterpomp\",\r\n        \"Wasserpumpe\",\r\n        40,\r\n        \"dc\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"starlink\",\r\n        \"Starlink\",\r\n        \"Starlink\",\r\n        \"Starlink\",\r\n        100,\r\n        \"ac\",\r\n        4,\r\n        0\r\n      ],\r\n      [\r\n        \"wifi_router\",\r\n        \"Wi-Fi router\",\r\n        \"Wifi router\",\r\n        \"WLAN-Router\",\r\n        15,\r\n        \"ac\",\r\n        8,\r\n        0\r\n      ],\r\n      [\r\n        \"battery_tool\",\r\n        \"Battery tool (18V/5Ah)\",\r\n        \"Accugereedschap (18V/5Ah)\",\r\n        \"Akkuwerkzeug (18V/5Ah)\",\r\n        90,\r\n        \"battery\",\r\n        1,\r\n        0\r\n      ],\r\n      [\r\n        \"hammer_drill\",\r\n        \"Hammer drill\",\r\n        \"Boorhamer\",\r\n        \"Bohrhammer\",\r\n        800,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"angle_grinder\",\r\n        \"Angle grinder\",\r\n        \"Haakse slijper\",\r\n        \"Winkelschleifer\",\r\n        900,\r\n        \"ac\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"circular_saw\",\r\n        \"Circular saw\",\r\n        \"Cirkelzaag\",\r\n        \"Kreiss\u00E4ge\",\r\n        1400,\r\n        \"ac\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"vacuum_cleaner\",\r\n        \"Vacuum cleaner\",\r\n        \"Stofzuiger\",\r\n        \"Staubsauger\",\r\n        1000,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"sander\",\r\n        \"Sander\",\r\n        \"Schuurmachine\",\r\n        \"Schleifmaschine\",\r\n        300,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"plunge_router\",\r\n        \"Plunge router\",\r\n        \"Bovenfrees\",\r\n        \"Oberfr\u00E4se\",\r\n        1200,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"reciprocating_saw\",\r\n        \"Reciprocating saw\",\r\n        \"Reciprozaag\",\r\n        \"S\u00E4bels\u00E4ge\",\r\n        1100,\r\n        \"ac\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"jigsaw\",\r\n        \"Jigsaw\",\r\n        \"Decoupeerzaag\",\r\n        \"Stichs\u00E4ge\",\r\n        650,\r\n        \"ac\",\r\n        0,\r\n        30\r\n      ],\r\n      [\r\n        \"table_saw\",\r\n        \"Table saw\",\r\n        \"Tafelzaag\",\r\n        \"Tischkreiss\u00E4ge\",\r\n        1900,\r\n        \"ac\",\r\n        0,\r\n        15\r\n      ],\r\n      [\r\n        \"led_floodlight\",\r\n        \"LED work light\",\r\n        \"LED werklamp\",\r\n        \"LED-Arbeitsleuchte\",\r\n        30,\r\n        \"ac\",\r\n        4,\r\n        0\r\n      ]\r\n    ];\r\n    const roundEnergyWh = (value) => value === 1 ? 1 : Math.round(value / 5) * 5;\r\n    const AC_EFFICIENCY = 0.90;\r\n    // Overall 230V charging efficiency already includes inverter AND charger\r\n    // losses. Do not also divide a battery charge by AC_EFFICIENCY.\r\n    const CHARGING_EFFICIENCY = 0.80;\r\n    // Editable reference capacities, not model-specific product specifications.\r\n    const referenceBatteryWh = { phone: 20, tablet: 30, laptop: 50, camera: 15, drone: 60, bike_battery: 500, battery_tool: 90, tyre_inflator: 20, flashlight: 10 };\r\n    const proApplianceIds = new Set(['battery_tool', 'hammer_drill', 'angle_grinder', 'circular_saw', 'vacuum_cleaner', 'sander', 'plunge_router', 'reciprocating_saw', 'jigsaw', 'table_saw', 'led_floodlight']);\r\n    const cloneDevices = (audienceId) => {\r\n      const preset = audiences.find((item) => item.id === audienceId);\r\n      const selected = preset ? scenarioSelections[preset.id] : [];\r\n      const devices = applianceCatalog.map(([id, en, nl, de, watts, energyMode, hours, minutes]) => {\r\n        const batteryWh = referenceBatteryWh[id];\r\n        return {\r\n          id, name: { en, nl, de }[locale], watts, energyMode,\r\n          applicationType: proApplianceIds.has(id) ? 'pro' : 'household',\r\n          usageType: batteryWh !== undefined ? 'charges' : 'timed',\r\n          batteryWh,\r\n          charges: 1, hours, minutes,\r\n          // Already includes power-station losses; do not apply an efficiency again.\r\n          practicalWhPerHour: energyMode === 'measured' ? 35 : undefined,\r\n          active: selected.includes(id), simultaneous: selected.includes(id)\r\n        };\r\n      });\r\n      return finalizeClonedDevices(devices, Boolean(preset));\r\n    };\r\n    const syncSelectionSequence = () => {\r\n      state.selectionSequence = state.devices.reduce((highest, device) => Math.max(highest, Number(device.selectionOrder) || 0), 0);\r\n    };\r\n    // Existing appliances are Household; future tools explicitly opt into Pro.\r\n    const getDeviceGroupId = (device) => device.applicationType === 'pro' ? 'pro' : 'household';\r\n    const getTimeHours = (device) => {\r\n      // Stored legacy hours never make a charger a continuous 24-hour load.\r\n      if (device.usageType === 'charges') return 0;\r\n      const hours = clamp(Math.floor(Number(device.hours) || 0), 0, 24);\r\n      return hours === 24 ? 24 : hours + clamp(Math.floor(Number(device.minutes) || 0), 0, 59) / 60;\r\n    };\r\n    let consumptionDialog;\r\n    root.addEventListener('click', event => {\r\n      const trigger = event.target.closest('[data-consumption-help]');\r\n      if (!trigger) return;\r\n      if (!consumptionDialog) {\r\n        consumptionDialog = document.createElement('dialog');\r\n        consumptionDialog.className = 'w21-consumption-dialog';\r\n        const closeLabel = { en: 'Close', nl: 'Sluiten', de: 'Schlie\u00DFen' }[locale];\r\n        consumptionDialog.setAttribute('aria-labelledby', 'w21-consumption-dialog-title');\r\n        const sectionTextStyle = getComputedStyle(root);\r\n        consumptionDialog.style.fontFamily = sectionTextStyle.fontFamily;\r\n        consumptionDialog.style.fontSize = sectionTextStyle.fontSize;\r\n        consumptionDialog.style.color = sectionTextStyle.color;\r\n        consumptionDialog.innerHTML = `<button type=\"button\" class=\"w21-consumption-dialog-close\" aria-label=\"${closeLabel}\"><svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><path d=\"m5 5 10 10M15 5 5 15\"/></svg></button><h2 id=\"w21-consumption-dialog-title\" class=\"w21-consumption-dialog-title\">${escapeHtml(labels.netDailyNeed)}</h2><p></p>`;\r\n        document.body.appendChild(consumptionDialog);\r\n        consumptionDialog.querySelector('button').addEventListener('click', () => consumptionDialog.close());\r\n        consumptionDialog.addEventListener('click', e => {\r\n          const rect = consumptionDialog.getBoundingClientRect();\r\n          if (e.target === consumptionDialog && (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom)) consumptionDialog.close();\r\n        });\r\n      }\r\n      consumptionDialog.querySelector('.w21-consumption-dialog-title').textContent = trigger.dataset.helpTitle || labels.netDailyNeed;\r\n      const helpBody = consumptionDialog.querySelector('p');\r\n      helpBody.textContent = trigger.dataset.helpText;\r\n      if (trigger.dataset.helpSections) {\r\n        const sections = JSON.parse(trigger.dataset.helpSections);\r\n        sections.forEach(section => {\r\n          const heading = document.createElement('strong');\r\n          heading.textContent = section.heading;\r\n          helpBody.append(document.createElement('br'), document.createElement('br'), heading);\r\n          section.lines.forEach(line => helpBody.append(document.createElement('br'), document.createTextNode(line)));\r\n        });\r\n      }\r\n      consumptionDialog.showModal();\r\n    });\r\n    const getDevicePower = device => Math.max(Number(device.peakWatts ?? device.watts) || 0, 0);\r\n    const getDeviceDailyWh = (device) => {\r\n      if (device.usageType === 'charges') {\r\n        const batteryWh = Math.max(Number(device.batteryWh) || 0, 0);\r\n        const charges = Math.max(Number(device.charges) || 0, 0);\r\n        return roundEnergyWh(batteryWh * charges / CHARGING_EFFICIENCY);\r\n      }\r\n      const watts = Math.max(Number(device.watts) || 0, 0);\r\n      const efficiency = device.energyMode === 'battery' ? CHARGING_EFFICIENCY : device.energyMode === 'ac' ? AC_EFFICIENCY : 1;\r\n      // Apply losses to the complete energy calculation, then round once.\r\n      // Rounding a corrected wattage first can erase losses for small loads.\r\n      const calculationWatts = device.energyMode === 'measured' ? watts * 35 / 45 : watts / efficiency;\r\n      return roundEnergyWh(calculationWatts * getTimeHours(device));\r\n    };\r\n    const getSolarWh = () => {\r\n      const panel = solarPanels.find((item) => item.id === state.selectedSolarId);\r\n      return panel ? panel.watts * state.solarSunHours * state.solarCount : 0;\r\n    };\r\n    const getBatteryCapacity = () => { const station = getSelectedPowerStation(); return station && state.stationCount > 0 ? station.capacity + (Math.min(state.expansionCount, getExpansionMax()) * expansionBattery.capacity) : 0; };\r\n    const getTotals = () => {\r\n      let dailyWh = 0;\r\n      let simultaneousW = 0;\r\n      let highestSeparateW = 0;\r\n      state.devices.forEach((device) => {\r\n        if (!device.active) return;\r\n        const watts = getDevicePower(device);\r\n        dailyWh += getDeviceDailyWh(device);\r\n        highestSeparateW = Math.max(highestSeparateW, watts);\r\n        if (device.simultaneous) simultaneousW += watts;\r\n      });\r\n      // Only On appliances add together; every selected appliance must also fit individually.\r\n      const peakW = Math.max(simultaneousW, highestSeparateW);\r\n      const station = getSelectedPowerStation();\r\n      const outputW = station ? station.output : 0;\r\n      const batteryCapacity = getBatteryCapacity();\r\n      const solarWh = getSolarWh();\r\n      const availableWh = batteryCapacity + solarWh;\r\n      return { dailyWh, peakW, outputW, batteryCapacity, solarWh, availableWh, outputRemaining: outputW - peakW, capacityRemaining: availableWh - dailyWh };\r\n    };\r\n    const getInitials = (name) => name.split(/\\s+/).slice(0, 2).map((part) => part.charAt(0)).join('').toUpperCase();\r\n    const getProductImageHtml = (product) => product.image ? `<img src=\"${product.image}\" alt=\"${product.name}\">` : `<span class=\"w21-power-calculator__product-placeholder\">${getInitials(product.name)}</span>`;\r\n    const getSolarMax = (solarId) => {\r\n      const station = getSelectedPowerStation();\r\n      return station ? (state.stationCount > 0 ? solarMaxByStation[station.id]?.[solarId] || 0 : 0) : maxProductQuantity;\r\n    };\r\n    const getExpansionMax = () => getSelectedPowerStation()?.compatibleExpansion && state.stationCount > 0\r\n      ? expansionBattery.maxQuantity : 0;\r\n    const cleanupCompatibility = () => {\r\n      const station = getSelectedPowerStation();\r\n      state.stationCount = station ? clamp(Math.floor(Number(state.stationCount) || 0), 0, maxStationQuantity) : 0;\r\n      if (state.stationCount === 0) state.selectedPowerStationId = '';\r\n      state.expansionCount = clamp(state.expansionCount, 0, getExpansionMax());\r\n      if (state.selectedSolarId && getSolarMax(state.selectedSolarId) === 0) { state.selectedSolarId = ''; state.solarCount = 0; }\r\n      if (state.selectedSolarId) state.solarCount = clamp(state.solarCount, 0, getSolarMax(state.selectedSolarId));\r\n      if (state.solarCount === 0) state.selectedSolarId = '';\r\n    };\r\n\r\n\r\n\r\n    const setStep = (step, { render = true } = {}) => {\r\n      state.step = Math.min(Math.max(step, 1), compactFlow ? 2 : 4);\r\n      stepButtons.forEach((button) => { const isActive = Number(button.dataset.stepButton) === state.step; button.classList.toggle('is-active', isActive); button.setAttribute('aria-current', isActive ? 'step' : 'false'); });\r\n      panels.forEach((panel) => panel.classList.toggle('is-active', Number(panel.dataset.stepPanel) === state.step));\r\n      if (render) renderAll();\r\n    };\r\n\r\n    const renderAudienceTabs = () => {\r\n      if (!audienceGrid) return;\r\n      audienceGrid.innerHTML = '';\r\n      audiences.forEach((audience) => {\r\n        const button = document.createElement('button');\r\n        button.type = 'button';\r\n        button.className = `w21-power-calculator__preset-tab${audience.id === state.audienceId ? ' is-active' : ''}`;\r\n        button.textContent = audienceNames[audience.id] || audience.name;\r\n        button.addEventListener('click', () => {\r\n          state.audienceId = state.audienceId === audience.id ? '' : audience.id;\r\n          state.customCount = 0;\r\n          state.devices = cloneDevices(state.audienceId);\r\n          syncSelectionSequence();\r\n          \r\n          openDeviceGroups.clear();\r\n          renderAll();\r\n        });\r\n        audienceGrid.appendChild(button);\r\n      });\r\n\r\n      if (state.audienceId !== 'custom') return;\r\n\r\n      const customButton = document.createElement('span');\r\n      customButton.className = `w21-power-calculator__preset-tab${state.audienceId === 'custom' ? ' is-active' : ''}`;\r\n      customButton.textContent = labels.customSetup;\r\n      customButton.setAttribute('aria-current', 'true');\r\n      audienceGrid.appendChild(customButton);\r\n    };\r\n\r\n    const getStationBars = (station) => `<div class=\"w21-power-calculator__product-bars\">\r\n      <div class=\"w21-power-calculator__product-bar-row\">\r\n        <span class=\"w21-power-calculator__product-bar-row-head\"><span>${labels.capacity}</span><strong>${formatNumber(station.capacity)}Wh</strong></span>\r\n        <span class=\"w21-power-calculator__product-bar\"></span>\r\n      </div>\r\n      <div class=\"w21-power-calculator__product-bar-row\">\r\n        <span class=\"w21-power-calculator__product-bar-row-head\"><span>${labels.output}</span><strong>${formatNumber(station.output)}W</strong></span>\r\n        <span class=\"w21-power-calculator__product-bar w21-power-calculator__product-bar--output\"></span>\r\n      </div>\r\n    </div>`;\r\n    const getExpansionBars = () => `<div class=\"w21-power-calculator__product-bars\">\r\n      <div class=\"w21-power-calculator__product-bar-row w21-power-calculator__product-bar-row--value-below\">\r\n        <span class=\"w21-power-calculator__product-bar-row-head\"><span>${labels.extraCapacity}</span></span>\r\n        <span class=\"w21-power-calculator__product-bar\"></span>\r\n        <strong class=\"w21-power-calculator__product-bar-value\">${formatNumber(expansionBattery.capacity)}Wh</strong>\r\n      </div>\r\n    </div>`;\r\n    const solarPerDayLabel = { en: 'p/day', nl: 'p/dag', de: 'pro Tag' }[locale];\r\n    const getSolarBars = (panel) => `<div class=\"w21-power-calculator__product-bars\">\r\n      <div class=\"w21-power-calculator__product-bar-row w21-power-calculator__product-bar-row--value-below\">\r\n        <span class=\"w21-power-calculator__product-bar-row-head\"><span>${labels.expectedSolarInput}</span></span>\r\n        <span class=\"w21-power-calculator__product-bar w21-power-calculator__product-bar--solar\"></span>\r\n        <strong class=\"w21-power-calculator__product-bar-value\">+${formatNumber(panel.watts * state.solarSunHours)}Wh (${solarPerDayLabel})</strong>\r\n      </div>\r\n    </div>`;\r\n\r\n    const getMixQuantityControls = (kind, id, quantity, maximum) => {\r\n      const button = direction => `<button type=\"button\" class=\"w21-power-calculator__quantity-button\" data-core-direction=\"${direction}\" data-core-kind=\"${kind}\" data-core-id=\"${id}\"${kind === 'solar' ? ` data-solar-${direction > 0 ? 'plus' : 'minus'}` : kind === 'expansion' ? ` data-expansion-${direction > 0 ? 'plus' : 'minus'}` : ''} aria-label=\"${escapeHtml(direction > 0 ? labels.offerIncrease : labels.offerDecrease)}\"${(direction > 0 ? quantity >= maximum : quantity <= 0) || maximum === 0 ? ' disabled' : ''}>${direction > 0 ? plusIcon : minusIcon}</button>`;\r\n      return `<span class=\"w21-power-calculator__${kind === 'expansion' ? 'expansion' : 'solar'}-controls w21-power-calculator__core-controls\">${button(-1)}<input type=\"text\" inputmode=\"numeric\" maxlength=\"5\" class=\"w21-power-calculator__offer-value-field\" data-core-quantity data-core-kind=\"${kind}\" data-core-id=\"${id}\" value=\"${quantity}\" aria-label=\"${escapeHtml(labels.offerQuantity)}\"${kind === 'station' ? ' readonly' : ''}${maximum === 0 ? ' disabled' : ''}>${maximum < maxProductQuantity ? `<strong>/ ${maximum}</strong>` : ''}${button(1)}</span>`;\r\n    };\r\n    root.addEventListener('click', event => {\r\n      const button = event.target.closest('[data-core-direction]');\r\n      if (!button || button.disabled) return;\r\n      changeSetupQuantity(button.dataset.coreKind, Number(button.dataset.coreDirection), button.dataset.coreId);\r\n    });\r\n    const commitCoreQuantity = event => {\r\n      const input = event.target.closest('[data-core-quantity]');\r\n      if (!input || input.disabled || offerBusy) return;\r\n      const kind = input.dataset.coreKind;\r\n      const max = kind === 'station' ? maxStationQuantity : kind === 'expansion' ? getExpansionMax() : getSolarMax(input.dataset.coreId);\r\n      const quantity = clamp(Math.floor(Number(input.value) || 0), 0, max);\r\n      input.value = String(quantity);\r\n      setSetupQuantity(kind, quantity, input.dataset.coreId);\r\n    };\r\n    root.addEventListener('change', commitCoreQuantity);\r\n    root.addEventListener('focusout', commitCoreQuantity);\r\n    const renderProducts = () => {\r\n      if (!powerProductGrid || !solarProductGrid) return;\r\n      powerProductGrid.innerHTML = '';\r\n      solarProductGrid.innerHTML = '';\r\n      const powerOpen = root.classList.contains('is-power-picker-open');\r\n      powerProductGrid.hidden = !powerOpen;\r\n      powerDisclosure?.setAttribute('aria-expanded', String(powerOpen));\r\n      if (state.selectedPowerStationId !== 'move_1800') state.expansionCount = 0;\r\n      let selectedMove1800Card = null;\r\n      const orderedPowerStations = mobileResultsMedia.matches && state.selectedPowerStationId\r\n        ? [...powerStations].sort((a, b) => Number(b.id === state.selectedPowerStationId) - Number(a.id === state.selectedPowerStationId))\r\n        : powerStations;\r\n      orderedPowerStations.forEach((station) => {\r\n        const card = document.createElement('div');\r\n        const isActive = state.selectedPowerStationId === station.id;\r\n        card.setAttribute('role', 'group');\r\n        card.className = `w21-power-calculator__product-card${isActive ? ' is-active' : ''}`;\r\n        card.innerHTML = `<span class=\"w21-power-calculator__product-media\">${getProductImageHtml(station)}</span><span class=\"w21-power-calculator__product-content\"><span class=\"w21-power-calculator__product-head\"><strong class=\"w21-power-calculator__product-title\">${station.name}</strong><button type=\"button\" class=\"w21-power-calculator__product-check\" data-product-check aria-pressed=\"${isActive}\" aria-label=\"${escapeHtml(station.name)}\">${checkIcon}</button></span>${getStationBars(station)}${isActive ? getMixQuantityControls('station', station.id, state.stationCount, maxStationQuantity) : ''}</span>`;\r\n        card.addEventListener('click', (event) => {\r\n          if (event.target.closest('[data-core-quantity], [data-core-direction]')) return;\r\n          const pickerWasOpen = mobileResultsMedia.matches && root.classList.contains('is-power-picker-open');\r\n          if (mobileResultsMedia.matches && !pickerWasOpen && state.selectedPowerStationId !== station.id) return;\r\n          if (pickerWasOpen) {\r\n            root.classList.remove('is-power-picker-open');\r\n            powerDisclosure?.setAttribute('aria-expanded', 'false');\r\n          }\r\n          selectionIsManual = true;\r\n\r\n          if (state.selectedPowerStationId === station.id) {\r\n            state.selectedPowerStationId = '';\r\n            state.stationCount = 0;\r\n            state.expansionCount = 0;\r\n          } else {\r\n            state.selectedPowerStationId = station.id;\r\n            state.stationCount = maxStationQuantity;\r\n            cleanupCompatibility();\r\n          }\r\n          renderAll();\r\n        });\r\n        powerProductGrid.appendChild(card);\r\n        if (station.id === 'move_1800' && isActive) selectedMove1800Card = card;\r\n      });\r\n\r\n      const station = getSelectedPowerStation();\r\n      if (powerPickerMeta) powerPickerMeta.textContent = station ? labels.change : (powerStations.length === 3 ? labels.threeOptions : `${powerStations.length}`);\r\n      if (powerMobileLabel) powerMobileLabel.textContent = powerOpen ? cartCopy.hidePower : cartCopy.power;\r\n      powerDisclosure?.classList.toggle('has-selection', Boolean(station));\r\n      if (solarPickerMeta) {\r\n        const compatibleSolarCount = solarPanels.filter((panel) => getSolarMax(panel.id) > 0).length;\r\n        solarPickerMeta.textContent = state.selectedSolarId ? labels.change : `${compatibleSolarCount} ${labels.compatibleCount}`;\r\n      }\r\n      if (solarMobileLabel) solarMobileLabel.textContent = state.selectedSolarId ? labels.switchSolarPanels : labels.addSolarPanels;\r\n      solarDisclosure?.classList.toggle('has-selection', Boolean(state.selectedSolarId));\r\n      if (station?.id === 'move_1800' && selectedMove1800Card) {\r\n        const expansionCard = document.createElement('div');\r\n        expansionCard.className = `w21-power-calculator__product-card w21-power-calculator__product-card--expansion${state.expansionCount > 0 ? ' is-active' : ''}`;\r\n        expansionCard.innerHTML = `<span class=\"w21-power-calculator__product-media\">${getProductImageHtml(expansionBattery)}</span><span class=\"w21-power-calculator__product-content\"><span class=\"w21-power-calculator__product-head\"><strong class=\"w21-power-calculator__product-title\">${expansionBattery.name}</strong><span class=\"w21-power-calculator__product-check\" data-product-check>${checkIcon}</span></span>${getExpansionBars()}${getMixQuantityControls('expansion', 'expansion', state.expansionCount, getExpansionMax())}</span>`;\r\n        expansionCard.addEventListener('click', (event) => {\r\n          if (event.target.closest('button, input')) return;\r\n          selectionIsManual = true;\r\n\r\n          if (mobileResultsMedia.matches) {\r\n            state.expansionCount = state.expansionCount > 0 ? 0 : 1;\r\n            renderAll();\r\n            return;\r\n          }\r\n\r\n          if (event.target.closest('[data-product-check]')) {\r\n            state.expansionCount = state.expansionCount > 0 ? 0 : 1;\r\n            renderAll();\r\n            return;\r\n          }\r\n\r\n          if (state.expansionCount === 0) {\r\n            state.expansionCount = 1;\r\n          } else if (state.expansionCount === 1) {\r\n            state.expansionCount = 0;\r\n          }\r\n\r\n          renderAll();\r\n        });\r\n        powerProductGrid.appendChild(expansionCard);\r\n      }\r\n\r\n      if (expansionDisclosure) expansionDisclosure.hidden = !(station?.id === 'move_1800' && state.expansionCount === 0);\r\n\r\n      const orderedSolarPanels = mobileResultsMedia.matches && state.selectedSolarId\r\n        ? [...solarPanels].sort((a, b) => Number(b.id === state.selectedSolarId) - Number(a.id === state.selectedSolarId))\r\n        : solarPanels;\r\n      orderedSolarPanels.forEach((panel) => {\r\n        const maxQuantity = getSolarMax(panel.id);\r\n        const isSelectedType = state.selectedSolarId === panel.id;\r\n        const compatible = maxQuantity > 0;\r\n        const isActive = isSelectedType && state.solarCount > 0;\r\n        const card = document.createElement('div');\r\n        card.className = `w21-power-calculator__product-card${isActive ? ' is-active' : ''}${!compatible ? ' is-disabled' : ''}`;\r\n        card.innerHTML = `<span class=\"w21-power-calculator__product-media\">${getProductImageHtml(panel)}</span><span class=\"w21-power-calculator__product-content\"><span class=\"w21-power-calculator__product-head\"><strong class=\"w21-power-calculator__product-title\">${panel.name}</strong><span class=\"w21-power-calculator__product-check\" data-product-check>${checkIcon}</span></span>${getSolarBars(panel)}${getMixQuantityControls('solar', panel.id, isSelectedType ? state.solarCount : 0, maxQuantity)}</span>`;\r\n        card.addEventListener('click', (event) => {\r\n          if (!compatible || event.target.closest('button, input')) return;\r\n\r\n          const pickerWasOpen = mobileResultsMedia.matches && root.classList.contains('is-solar-picker-open');\r\n          if (mobileResultsMedia.matches && !pickerWasOpen && !isSelectedType) return;\r\n          selectionIsManual = true;\r\n          if (pickerWasOpen) {\r\n            root.classList.remove('is-solar-picker-open');\r\n            solarDisclosure?.setAttribute('aria-expanded', 'false');\r\n          }\r\n\r\n          if (isSelectedType) {\r\n            state.selectedSolarId = '';\r\n            state.solarCount = 0;\r\n            rememberedSolarSelection = null;\r\n            renderAll();\r\n            return;\r\n          }\r\n\r\n          state.selectedSolarId = panel.id;\r\n          state.solarCount = 1;\r\n          syncSolarAdvice(true);\r\n\r\n          renderAll();\r\n        });\r\n        solarProductGrid.appendChild(card);\r\n      });\r\n\r\n      if (mobileResultsMedia.matches && !root.classList.contains('is-solar-picker-open')) {\r\n        solarOptions.hidden = !state.selectedSolarId;\r\n      }\r\n    };\r\n\r\n    const drawerCopy = {\r\n      en: { title: 'Add appliances', search: 'Search appliances\u2026', custom: 'Custom appliance', done: 'Done', one: 'appliance', many: 'appliances', close: 'Close appliance list', empty: 'No appliances found. Try another search or add a custom appliance.' },\r\n      nl: { title: 'Voeg apparaten toe', search: 'Zoek apparaten\u2026', custom: 'Eigen apparaat', done: 'Gereed', one: 'apparaat', many: 'apparaten', close: 'Sluit apparatenlijst', empty: 'Geen apparaten gevonden. Zoek opnieuw of voeg een eigen apparaat toe.' },\r\n      de: { title: 'Ger\u00E4te hinzuf\u00FCgen', search: 'Ger\u00E4te suchen\u2026', custom: 'Eigenes Ger\u00E4t', done: 'Fertig', one: 'Ger\u00E4t', many: 'Ger\u00E4te', close: 'Ger\u00E4teliste schlie\u00DFen', empty: 'Keine Ger\u00E4te gefunden. Suche erneut oder f\u00FCge ein eigenes Ger\u00E4t hinzu.' }\r\n    }[locale];\r\n    const applianceDrawer = document.createElement('dialog');\r\n    const applianceDrawerId = `w21-appliance-drawer-${root.dataset.sectionId || 'calculator'}`;\r\n    applianceDrawer.className = 'w21-power-calculator__appliance-drawer';\r\n    applianceDrawer.dataset.applianceDrawer = '';\r\n    applianceDrawer.id = applianceDrawerId;\r\n    applianceDrawer.setAttribute('aria-labelledby', applianceDrawerId + '-title');\r\n    applianceDrawer.innerHTML = `<header class=\"w21-power-calculator__drawer-header\"><div class=\"w21-power-calculator__drawer-heading\"><h2 tabindex=\"-1\" autofocus id=\"${applianceDrawerId}-title\">${drawerCopy.title}</h2><button type=\"button\" data-appliance-close aria-label=\"${drawerCopy.close}\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\"><path d=\"m5 5 10 10M15 5 5 15\"/></svg></button></div><label class=\"w21-power-calculator__drawer-search\"><span class=\"sr-only\">${drawerCopy.search}</span><input type=\"search\" data-appliance-search placeholder=\"${drawerCopy.search}\"></label><button type=\"button\" class=\"w21-power-calculator__solar-disclosure-button w21-power-calculator__catalogue-add-custom\" data-drawer-add-custom><span class=\"w21-power-calculator__solar-disclosure-icon\" aria-hidden=\"true\">${plusIcon}</span><span>${drawerCopy.custom}</span></button></header><div class=\"w21-power-calculator__drawer-scroll\"><div data-appliance-catalogue data-drawer-list aria-label=\"${labels.appliances}\"></div><p data-catalogue-empty hidden>${drawerCopy.empty}</p></div><footer class=\"w21-power-calculator__drawer-footer\"><button type=\"button\" class=\"w21-power-calculator__button w21-power-calculator__button--primary\" data-appliance-done></button></footer>`;\r\n    root.appendChild(applianceDrawer);\r\n    const drawerSearch = applianceDrawer.querySelector('[data-appliance-search]');\r\n    const drawerHeading = applianceDrawer.querySelector('h2');\r\n    const drawerList = applianceDrawer.querySelector('[data-drawer-list]');\r\n    const drawerRows = new Map();\r\n    let drawerSelectionHandler = () => {};\r\n    let drawerReturnFocus = null;\r\n    let drawerRestoreFocus = true;\r\n    let drawerScrollLock = null;\r\n    const syncDrawerTrigger = () => {\r\n      deviceGrid?.querySelectorAll('[data-open-appliance-drawer]').forEach(button => {\r\n        button.setAttribute('aria-controls', applianceDrawerId);\r\n        button.setAttribute('aria-expanded', String(applianceDrawer.open));\r\n      });\r\n    };\r\n    const renderDrawerRows = () => {\r\n      const devices = [...state.devices].sort((a, b) => (a.sourceIndex ?? Number.MAX_SAFE_INTEGER) - (b.sourceIndex ?? Number.MAX_SAFE_INTEGER));\r\n      const focusedRow = document.activeElement?.closest('[data-catalogue-item]');\r\n      const focusedRowIndex = focusedRow ? [...drawerList.children].indexOf(focusedRow) : -1;\r\n      const ids = new Set(devices.map(device => device.id));\r\n      drawerRows.forEach((row, id) => { if (!ids.has(id)) { row.remove(); drawerRows.delete(id); } });\r\n      const query = applianceSearch.trim().toLocaleLowerCase(locale);\r\n      let matches = 0;\r\n      devices.forEach((device, index) => {\r\n        let row = drawerRows.get(device.id);\r\n        if (!row) {\r\n          row = document.createElement('label');\r\n          row.className = 'w21-power-calculator__drawer-appliance';\r\n          row.dataset.catalogueItem = device.id;\r\n          // Keep a real checkbox for keyboard/screen-reader behavior, with the\r\n          // same white box and orange SVG check used by the editable cards.\r\n          row.innerHTML = `<span data-drawer-appliance-name></span><span class=\"w21-power-calculator__drawer-selection\"><input type=\"checkbox\" data-device-select><span class=\"w21-power-calculator__device-select\" data-drawer-check aria-hidden=\"true\">${checkIcon}</span></span>`;\r\n          row.querySelector('input').addEventListener('change', () => drawerSelectionHandler(row.dataset.catalogueItem));\r\n          drawerRows.set(device.id, row);\r\n        }\r\n        row.querySelector('[data-drawer-appliance-name]').textContent = device.name;\r\n        const checkbox = row.querySelector('input');\r\n        checkbox.checked = Boolean(device.active);\r\n        checkbox.setAttribute('aria-label', device.name);\r\n        row.classList.toggle('is-active', Boolean(device.active));\r\n        row.hidden = Boolean(query && !device.name.toLocaleLowerCase(locale).includes(query));\r\n        if (!row.hidden) matches += 1;\r\n        if (drawerList.children[index] !== row) drawerList.insertBefore(row, drawerList.children[index] || null);\r\n      });\r\n      applianceDrawer.querySelector('[data-catalogue-empty]').hidden = matches > 0;\r\n      const count = state.devices.filter(device => device.active).length;\r\n      applianceDrawer.querySelector('[data-appliance-done]').textContent = `${drawerCopy.done} (${count} ${count === 1 ? drawerCopy.one : drawerCopy.many})`;\r\n      if (applianceDrawer.open && focusedRowIndex >= 0 && !focusedRow.isConnected) {\r\n        const visibleRows = [...drawerList.children].filter(row => !row.hidden);\r\n        (visibleRows[Math.min(focusedRowIndex, visibleRows.length - 1)]?.querySelector('input') || drawerHeading).focus({ preventScroll: true });\r\n      }\r\n      syncDrawerTrigger();\r\n    };\r\n    const openApplianceDrawer = trigger => {\r\n      if (applianceDrawer.open) return;\r\n      drawerReturnFocus = trigger;\r\n      drawerRestoreFocus = true;\r\n      renderDrawerRows();\r\n      applianceDrawer.showModal();\r\n      const body = document.body;\r\n      drawerScrollLock = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };\r\n      const gutter = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\r\n      if (gutter) body.style.paddingRight = `${parseFloat(getComputedStyle(body).paddingRight) + gutter}px`;\r\n      body.style.overflow = 'hidden';\r\n      syncDrawerTrigger();\r\n      // Focus the non-editable heading, including during native showModal\r\n      // autofocus, so touch users can browse without opening their keyboard.\r\n      drawerHeading.focus({ preventScroll: true });\r\n    };\r\n    const closeApplianceDrawer = (restoreFocus = true) => {\r\n      if (!applianceDrawer.open) return;\r\n      drawerRestoreFocus = restoreFocus;\r\n      applianceDrawer.close();\r\n    };\r\n    applianceDrawer.addEventListener('close', () => {\r\n      if (drawerScrollLock) {\r\n        document.body.style.overflow = drawerScrollLock.overflow;\r\n        document.body.style.paddingRight = drawerScrollLock.paddingRight;\r\n        drawerScrollLock = null;\r\n      }\r\n      syncDrawerTrigger();\r\n      if (drawerRestoreFocus) {\r\n        const trigger = drawerReturnFocus?.isConnected ? drawerReturnFocus : deviceGrid?.querySelector('[data-open-appliance-drawer]');\r\n        trigger?.focus({ preventScroll: true });\r\n      }\r\n    });\r\n    applianceDrawer.addEventListener('cancel', event => { event.preventDefault(); closeApplianceDrawer(); });\r\n    applianceDrawer.addEventListener('click', event => {\r\n      if (event.target !== applianceDrawer) return;\r\n      const box = applianceDrawer.getBoundingClientRect();\r\n      if (event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom) closeApplianceDrawer();\r\n    });\r\n    applianceDrawer.querySelector('[data-appliance-close]').addEventListener('click', () => closeApplianceDrawer());\r\n    applianceDrawer.querySelector('[data-appliance-done]').addEventListener('click', () => closeApplianceDrawer());\r\n    drawerSearch.addEventListener('input', () => {\r\n      applianceSearch = drawerSearch.value;\r\n      renderDrawerRows();\r\n      applianceDrawer.querySelector('.w21-power-calculator__drawer-scroll').scrollTop = 0;\r\n    });\r\n    applianceDrawer.querySelector('[data-drawer-add-custom]').addEventListener('click', () => {\r\n      closeApplianceDrawer(false);\r\n      addCustomDevice();\r\n    });\r\n\r\n    const simultaneousChoiceCopy = {\r\n      en: { on: 'On', off: 'Off' }, nl: { on: 'Aan', off: 'Uit' }, de: { on: 'Ein', off: 'Aus' }\r\n    }[locale];\r\n    const simultaneousChoiceContent = () => `<span data-simultaneous-value=\"true\" aria-hidden=\"true\">${simultaneousChoiceCopy.on}</span><span data-simultaneous-value=\"false\" aria-hidden=\"true\">${simultaneousChoiceCopy.off}</span>`;\r\n\r\n    const renderDeviceGrid = () => {\r\n      if (!deviceGrid) return;\r\n      const limit = getOutputLimit();\r\n      const focused = document.activeElement;\r\n      deviceGrid.innerHTML = '';\r\n      const selectedSection = document.createElement('section');\r\n      selectedSection.className = 'w21-power-calculator__appliance-selection';\r\n      selectedSection.dataset.applianceSelection = '';\r\n      selectedSection.setAttribute('aria-label', labels.selectedAppliances);\r\n      // Keep the original outlined workspace and unchanged editable cards.\r\n      selectedSection.innerHTML = '<div class=\"w21-power-calculator__appliance-dropzone\"><svg class=\"w21-power-calculator__dropzone-outline\" aria-hidden=\"true\" focusable=\"false\"><rect/></svg><div class=\"w21-power-calculator__selection-list\" data-selection-scroll-list><div class=\"w21-power-calculator__selected-device-grid\" data-selection-grid></div></div></div>';\r\n      const selectionGrid = selectedSection.querySelector('[data-selection-grid]');\r\n      deviceGrid.appendChild(selectedSection);\r\n\r\n\r\n      const devicesForDisplay = [...state.devices].sort((a, b) => {\r\n        if (a.active !== b.active) return Number(b.active) - Number(a.active);\r\n        if (a.active && b.active) {\r\n          return Number(isCustomDevice(a)) - Number(isCustomDevice(b)) || (Number(a.selectionOrder) || Number.MAX_SAFE_INTEGER) - (Number(b.selectionOrder) || Number.MAX_SAFE_INTEGER);\r\n        }\r\n        return (a.sourceIndex ?? 0) - (b.sourceIndex ?? 0);\r\n      });\r\n\r\n      const createDeviceCard = (device, expanded = false) => {\r\n        const isCustom = isCustomDevice(device);\r\n        const watts = Math.max(Number(device.watts) || 0, 0);\r\n        const isIncompatible = false;\r\n\r\n        const card = document.createElement('div');\r\n        const hours = Math.max(Number(device.hours) || 0, 0);\r\n        const minutes = clamp(Math.max(Number(device.minutes) || 0, 0), 0, 59);\r\n        const charges = Math.max(Number(device.charges) || 0, 0);\r\n        const batteryWh = Math.max(Number(device.batteryWh) || 0, 0);\r\n        const customLimitMessage = !isCustom && isIncompatible\r\n          ? `<small class=\"w21-power-calculator__device-limit\">${formatNumber(watts)}W \u00B7 Max ${formatNumber(limit)}W</small>`\r\n          : '';\r\n        const wattsMaxAttribute = ' max=\"99999\"';\r\n        // Charger power stays in the model for output checks, but is no longer\r\n        // an editable/displayed field on battery-appliance cards.\r\n        const powerControl = device.usageType === 'charges' ? '' : `<label class=\"w21-power-calculator__field\"><span>${labels.appliancePower}</span><input type=\"number\" min=\"0\"${wattsMaxAttribute} step=\"1\" value=\"${watts}\" data-field=\"watts\"></label>`;\r\n        const usageControls = device.usageType === 'charges'\r\n          ? `<label class=\"w21-power-calculator__field\"><span>${labels.deviceBattery}</span><input type=\"number\" min=\"0\" max=\"99999\" step=\"1\" inputmode=\"numeric\" value=\"${batteryWh}\" data-field=\"batteryWh\"></label><label class=\"w21-power-calculator__field\"><span>${labels.chargesPerDay}</span><input type=\"number\" min=\"0\" max=\"99999\" step=\"0.5\" inputmode=\"decimal\" value=\"${charges}\" data-field=\"charges\"></label>`\r\n          : `<label class=\"w21-power-calculator__field\"><span>${labels.hours}</span><input type=\"number\" min=\"0\" max=\"24\" step=\"1\" value=\"${hours}\" data-field=\"hours\"></label><label class=\"w21-power-calculator__field\"><span>${labels.minutes}</span><input type=\"number\" min=\"0\" max=\"${hours >= 24 ? 0 : 59}\" step=\"1\" value=\"${hours >= 24 ? 0 : minutes}\" data-field=\"minutes\"${hours >= 24 ? ' disabled' : ''}></label>`;\r\n\r\n        const defaultCustomName = device.defaultName || `${labels.customDeviceName} ${state.customCount || 1}`;\r\n        const titleContent = isCustom && device.active\r\n          ? `<input class=\"w21-power-calculator__device-name-input${device.nameCustomized ? '' : ' is-default'}\" type=\"text\" value=\"${escapeHtml(device.name)}\" data-field=\"name\" data-default-name=\"${escapeHtml(defaultCustomName)}\" aria-label=\"Custom appliance name\">`\r\n          : `<span class=\"w21-power-calculator__device-name\">${escapeHtml(device.name)}</span>`;\r\n\r\n        card.className = `w21-power-calculator__device${device.active ? ' is-active' : ''}${expanded ? ' is-expanded is-catalogue-card' : ''}${isIncompatible ? ' is-incompatible' : ''}`;\r\n        card.dataset.deviceId = device.id;\r\n        // Catalogue rows only choose an appliance. The unchanged value fields\r\n        // are created once the appliance is added to the selected workspace.\r\n        const valueControls = expanded ? '' : `<div class=\"w21-power-calculator__device-controls${device.usageType === 'charges' ? ' is-charges' : ' is-timed'}\">${powerControl}${usageControls}</div>`;\r\n        card.innerHTML = `<div class=\"w21-power-calculator__device-main\"><div class=\"w21-power-calculator__device-title\">${titleContent}</div>${device.active ? customLimitMessage : ''}</div><button type=\"button\" class=\"w21-power-calculator__switch\" aria-label=\"${escapeHtml(device.name)}\" aria-pressed=\"${device.active ? 'true' : 'false'}\"${isIncompatible && !device.active ? ' disabled aria-disabled=\"true\"' : ''}></button>${valueControls}`;\r\n        if (expanded) card.querySelector('.w21-power-calculator__device-name').title = device.name;\r\n\r\n        const selectionButton = card.querySelector('.w21-power-calculator__switch');\r\n        selectionButton.className = 'w21-power-calculator__device-select';\r\n        selectionButton.dataset.deviceSelect = '';\r\n        selectionButton.setAttribute('role', 'checkbox');\r\n        selectionButton.setAttribute('aria-checked', String(device.active));\r\n        selectionButton.removeAttribute('aria-pressed');\r\n        selectionButton.innerHTML = device.active ? checkIcon : '';\r\n        if (device.active || expanded) {\r\n          const simultaneousLabel = { en: 'Use simultaneously', nl: 'Gelijktijdig gebruiken', de: 'Gleichzeitig verwenden' }[locale];\r\n          const row = document.createElement('div');\r\n          row.className = 'w21-power-calculator__device-simultaneous';\r\n          row.innerHTML = `<span>${simultaneousLabel}</span><button type=\"button\" class=\"w21-power-calculator__switch w21-power-calculator__simultaneous-choice\" data-device-simultaneous role=\"switch\" aria-label=\"${simultaneousLabel}: ${escapeHtml(device.name)}\" aria-checked=\"${device.simultaneous}\">${simultaneousChoiceContent()}</button><button type=\"button\" class=\"w21-power-calculator__consumption-help\" data-consumption-help aria-haspopup=\"dialog\" aria-label=\"${simultaneousLabel} info\"><svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\"/><g transform=\"translate(2 2) scale(.8)\"><path d=\"M7.5 7a2.5 2.5 0 0 1 5 .2c0 1.8-2.5 1.8-2.5 3.6\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"10\" cy=\"14.3\" r=\"1\" fill=\"#fff\"/></g></svg></button>`;\r\n          const info = row.querySelector('[data-consumption-help]');\r\n          row.querySelector(':scope > span').remove();\r\n          row.insertBefore(info, row.firstElementChild);\r\n          info.dataset.helpTitle = labels.simultaneousHelpTitle;\r\n          info.dataset.helpText = labels.simultaneousHelp;\r\n          row.querySelector('[data-device-simultaneous]').addEventListener('click', () => {\r\n            if (!device.active) {\r\n              selectionButton.click();\r\n              return;\r\n            }\r\n            markCustomScenario();\r\n            device.simultaneous = !device.simultaneous;\r\n            device.simultaneousConfigured = true;\r\n            renderAll();\r\n          });\r\n          card.insertBefore(row, selectionButton);\r\n        }\r\n        card.querySelectorAll('.w21-power-calculator__device-controls .w21-power-calculator__field').forEach(field => {\r\n          const input = field.querySelector('input');\r\n          const label = field.querySelector('span');\r\n          input.setAttribute('aria-label', label.textContent);\r\n          field.className = 'w21-power-calculator__device-input-field';\r\n          input.classList.add('w21-power-calculator__solar-region-hours');\r\n          label.className = 'w21-power-calculator__device-field-label';\r\n          const explanation = input.dataset.field === 'batteryWh' ? labels.batteryHelp\r\n            : input.dataset.field === 'watts' ? labels.powerHelp : '';\r\n          if (explanation) {\r\n            const help = document.createElement('button');\r\n            help.type = 'button';\r\n            help.className = 'w21-power-calculator__consumption-help';\r\n            help.dataset.consumptionHelp = '';\r\n            help.dataset.helpTitle = input.dataset.field === 'batteryWh' ? labels.batteryHelpTitle : labels.powerHelpTitle;\r\n            help.dataset.helpText = explanation;\r\n            if (input.dataset.field === 'batteryWh') help.dataset.helpSections = JSON.stringify(labels.batteryHelpSections);\r\n            help.setAttribute('aria-label', `${input.getAttribute('aria-label')} info: ${device.name}`);\r\n            help.setAttribute('aria-haspopup', 'dialog');\r\n            help.innerHTML = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\"/><g transform=\"translate(2 2) scale(.8)\"><path d=\"M7.5 7a2.5 2.5 0 0 1 5 .2c0 1.8-2.5 1.8-2.5 3.6\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"10\" cy=\"14.3\" r=\"1\" fill=\"#fff\"/></g></svg>';\r\n            label.appendChild(help);\r\n          }\r\n          const valueBox = document.createElement('span');\r\n          valueBox.className = 'w21-power-calculator__solar-hours-field w21-power-calculator__device-value';\r\n          field.appendChild(valueBox);\r\n          valueBox.appendChild(input);\r\n          if (input.dataset.field !== 'charges') {\r\n            const unit = document.createElement('span');\r\n            unit.className = 'w21-power-calculator__device-unit';\r\n            unit.setAttribute('aria-hidden', 'true');\r\n            unit.textContent = { watts: 'W', batteryWh: 'Wh', hours: 'h', minutes: 'm' }[input.dataset.field];\r\n            valueBox.appendChild(unit);\r\n          }\r\n          addNumberStepper(input);\r\n        });\r\n        selectionButton.addEventListener('click', () => {\r\n          if (isIncompatible && !device.active) return;\r\n          markCustomScenario();\r\n          if (isCustomDevice(device) && device.active) {\r\n            state.devices = state.devices.filter((item) => item.id !== device.id);\r\n            renderAll();\r\n            return;\r\n          }\r\n          device.active = !device.active;\r\n\r\n          if (device.active) {\r\n            if (!device.simultaneousConfigured) device.simultaneous = true;\r\n            device.selectionOrder = ++state.selectionSequence;\r\n          } else {\r\n            device.simultaneous = false;\r\n            device.simultaneousConfigured = false;\r\n            device.selectionOrder = null;\r\n            openOnlyDeviceGroup(getDeviceGroupId(device));\r\n          }\r\n\r\n          renderAll();\r\n        });\r\n\r\n        card.querySelectorAll('input').forEach((input) => input.addEventListener('input', () => {\r\n          markCustomScenario();\r\n          renderAudienceTabs();\r\n          const field = input.dataset.field;\r\n          if (field === 'name') {\r\n            device.name = input.value;\r\n            device.nameCustomized = input.value !== input.dataset.defaultName;\r\n            input.classList.toggle('is-default', !device.nameCustomized);\r\n            fitCustomNameInput(input);\r\n            \r\n            return;\r\n          }\r\n          const numericValue = Number(input.value || '0');\r\n          let value = normalizeApplianceValue(field, numericValue, 99999);\r\n\r\n          const fieldMax = { watts: 99999, batteryWh: 99999, charges: 99999, hours: 24, minutes: device.hours >= 24 ? 0 : 59 }[field];\r\n          if (fieldMax !== undefined) {\r\n            value = clamp(value, 0, fieldMax);\r\n            if (input.value !== '' && numericValue !== value && (!['batteryWh', 'charges'].includes(field) || numericValue < 0 || numericValue > fieldMax)) input.value = String(value);\r\n          }\r\n          device[field] = value;\r\n          if (field === 'hours') {\r\n            const minutesInput = card.querySelector('[data-field=\"minutes\"]');\r\n            if (value === 24) {\r\n              device.minutes = 0;\r\n              minutesInput.value = '0';\r\n            }\r\n            minutesInput.max = value === 24 ? '0' : '59';\r\n            minutesInput.disabled = value === 24;\r\n          }\r\n\r\n          // Synchronize both views without rebuilding the input being typed.\r\n          deviceGrid.querySelectorAll('[data-device-id], [data-catalogue-device-id]').forEach(otherCard => {\r\n            if (otherCard === card || (otherCard.dataset.deviceId || otherCard.dataset.catalogueDeviceId) !== device.id) return;\r\n            otherCard.querySelectorAll('input[data-field]').forEach(otherInput => {\r\n              otherInput.value = String(device[otherInput.dataset.field] ?? '');\r\n              if (otherInput.dataset.field === 'minutes') {\r\n                otherInput.max = device.hours >= 24 ? '0' : '59';\r\n                otherInput.disabled = device.hours >= 24;\r\n              }\r\n            });\r\n          });\r\n          renderStatus();\r\n          renderResults();\r\n        }));\r\n\r\n        card.querySelectorAll('input[data-field=\"watts\"], input[data-field=\"batteryWh\"], input[data-field=\"charges\"], input[data-field=\"hours\"], input[data-field=\"minutes\"]').forEach(input => {\r\n          const commitValue = () => { input.value = String(device[input.dataset.field]); };\r\n          input.addEventListener('change', commitValue);\r\n          input.addEventListener('blur', commitValue);\r\n        });\r\n\r\n        return card;\r\n      };\r\n\r\n      // Preserve every editable appliance card; the add card is always last.\r\n      devicesForDisplay.filter(device => device.active).forEach(device => selectionGrid.appendChild(createDeviceCard(device)));\r\n      const addCard = document.createElement('button');\r\n      addCard.type = 'button';\r\n      addCard.className = 'w21-power-calculator__solar-disclosure-button w21-power-calculator__catalogue-add-custom w21-power-calculator__appliance-add-card';\r\n      if (!state.devices.some(device => device.active)) addCard.classList.add('is-empty');\r\n      addCard.dataset.openApplianceDrawer = '';\r\n      addCard.setAttribute('aria-haspopup', 'dialog');\r\n      addCard.innerHTML = `<span class=\"w21-power-calculator__solar-disclosure-icon\" aria-hidden=\"true\">${plusIcon}</span><strong>${drawerCopy.title}</strong>`;\r\n      addCard.addEventListener('click', () => openApplianceDrawer(addCard));\r\n      selectionGrid.appendChild(addCard);\r\n      drawerSelectionHandler = id => {\r\n        const device = state.devices.find(item => item.id === id);\r\n        if (!device) return;\r\n        // Reuse the unchanged card's selection handler, including its usage\r\n        // defaults, simultaneous setting, custom removal and recommendation.\r\n        const card = selectionGrid.querySelector(`[data-device-id=\"${id}\"]`) || createDeviceCard(device);\r\n        card.querySelector('[data-device-select]').click();\r\n      };\r\n      renderDrawerRows();\r\n      if (focused?.closest('[data-device-id]') && !applianceDrawer.open) {\r\n        const id = focused.closest('[data-device-id]').dataset.deviceId;\r\n        const selector = focused.dataset.field ? `[data-field=\"${focused.dataset.field}\"]`\r\n          : focused.hasAttribute('data-device-simultaneous') ? '[data-device-simultaneous]' : '[data-device-select]';\r\n        (selectionGrid.querySelector(`[data-device-id=\"${id}\"] ${selector}`) || addCard).focus({ preventScroll: true });\r\n      }\r\n      window.requestAnimationFrame(() => {\r\n        deviceGrid.querySelectorAll('.w21-power-calculator__device-name-input').forEach(fitCustomNameInput);\r\n      });\r\n    };\r\n\r\n    const tripEnergyLabels = {\r\n      en: { consumption: 'Total consumption', solar: 'Expected solar input' },\r\n      nl: { consumption: 'Totaal verbruik', solar: 'Verwachte zonne-opbrengst' },\r\n      de: { consumption: 'Gesamtverbrauch', solar: 'Erwarteter Solarertrag' }\r\n    }[locale];\r\n    const getTripEnergy = totals => {\r\n      const days = clamp(Number(root.querySelector('[data-trip-days-number]')?.value) || 1, 0.5, 14);\r\n      // Display period totals without changing the daily balance used by advice.\r\n      return { days, consumptionWh: totals.dailyWh * days, solarWh: totals.solarWh * days };\r\n    };\r\n\r\n    const renderStatus = () => {\r\n      if (ensureRecommendedSetup()) { renderProducts(); }\r\n      const station = getSelectedPowerStation();\r\n      const totals = getTotals();\r\n      const period = getTripEnergy(totals);\r\n\r\n      if (stationOutput) stationOutput.textContent = station ? `${formatNumber(station.output)}W` : labels.selectSetup;\r\n      if (appliancesOutput) appliancesOutput.textContent = `${formatNumber(totals.peakW)}W`;\r\n      if (outputStatus) outputStatus.textContent = station\r\n        ? (totals.outputRemaining >= 0 ? `${formatNumber(totals.outputRemaining)}W ${labels.outputLeft}` : `${labels.outputExceeded} ${formatNumber(Math.abs(totals.outputRemaining))}W`)\r\n        : labels.outputEmpty;\r\n\r\n      if (capacityTotal) capacityTotal.textContent = station ? formatNumber(totals.availableWh) + 'Wh' : labels.selectSetup;\r\n      if (capacityStatus) capacityStatus.textContent = !station ? labels.capacityEmpty : totals.capacityRemaining >= 0\r\n        ? formatNumber(totals.capacityRemaining) + 'Wh ' + labels.capacityLeft\r\n        : labels.capacityShort + ' ' + formatNumber(Math.abs(totals.capacityRemaining)) + 'Wh';\r\n      if (!resultStacks.length) return;\r\n      const hasAppliances = state.devices.some(device => device.active);\r\n      const hasSolar = Boolean(state.selectedSolarId && state.solarCount > 0);\r\n      const barLabels = {\r\n        en: { appliances: tripEnergyLabels.consumption, capacity: 'Battery', solar: tripEnergyLabels.solar },\r\n        nl: { appliances: tripEnergyLabels.consumption, capacity: 'Accu', solar: tripEnergyLabels.solar },\r\n        de: { appliances: tripEnergyLabels.consumption, capacity: 'Akku', solar: tripEnergyLabels.solar }\r\n      }[locale];\r\n      const days = period.days;\r\n      const powerNeeded = totals.peakW;\r\n      const recommendedChoice = hasAppliances\r\n        ? getRecommendedChoice(totals.dailyWh, powerNeeded, days) : null;\r\n      // The customer's reserve choice applies to every setup, including maximum previews.\r\n      const reserveRatio = getReserveRatio();\r\n      const insufficient = Boolean(station && hasAppliances &&\r\n        !coversTrip(totals.batteryCapacity, totals.dailyWh, totals.solarWh, days, station.capacity, reserveRatio));\r\n      const supply = [\r\n        { type: 'battery', label: barLabels.capacity, value: hasAppliances && station ? totals.batteryCapacity : 0 },\r\n        ...(hasAppliances && hasSolar ? [{ type: 'solar', label: barLabels.solar, value: period.solarWh }] : [])\r\n      ];\r\n      const supplyWh = supply.reduce((sum, segment) => sum + segment.value, 0);\r\n      const scale = Math.max(1, period.consumptionWh, supplyWh);\r\n      const consumptionWh = hasAppliances ? period.consumptionWh : 0;\r\n      const consumption = `\r\n        <div class=\"w21-power-calculator__segmented-capacity-group is-appliances${insufficient ? ' is-shortfall' : ''}\" data-energy-bar=\"appliances\" data-wh=\"${period.consumptionWh}\" data-daily-wh=\"${totals.dailyWh}\" data-energy-days=\"${days}\">\r\n          <div class=\"w21-power-calculator__segmented-capacity-labels\"><div class=\"w21-power-calculator__segmented-capacity-label\"><span>${barLabels.appliances}</span></div></div>\r\n          <div class=\"w21-power-calculator__segmented-capacity-bar\"><div class=\"w21-power-calculator__segmented-capacity-segment\"><span class=\"w21-power-calculator__segmented-capacity-fill\" style=\"width: ${consumptionWh / scale * 100}%\"></span></div></div>\r\n          <div class=\"w21-power-calculator__segmented-capacity-values\"><div class=\"w21-power-calculator__segmented-capacity-value\"><strong>${hasAppliances ? `${formatNumber(consumptionWh)}Wh` : '\u2013'}</strong></div></div>\r\n        </div>`;\r\n      // Empty supply still reserves its label, track and value row.\r\n      const supplyWidth = supplyWh > 0 ? supplyWh / scale * 100 : 100;\r\n      const segmentSize = segment => Math.max(segment.value, 1);\r\n      const supplyBar = supply.length ? `\r\n        <div class=\"w21-power-calculator__segmented-capacity-group is-supply\" data-energy-supply>\r\n          <div class=\"w21-power-calculator__segmented-capacity-labels\" style=\"width: ${supplyWidth}%\">${supply.map(segment => `\r\n            <div class=\"w21-power-calculator__segmented-capacity-label\" style=\"--w21-segment-size: ${segmentSize(segment)}\"><span>${segment.label}</span></div>`).join('')}</div>\r\n          <div class=\"w21-power-calculator__segmented-capacity-bar\">\r\n            <div class=\"w21-power-calculator__supply-parts\" style=\"width: ${supplyWidth}%\">${supply.map(segment => `\r\n                <div class=\"w21-power-calculator__segmented-capacity-segment${segment.type === 'solar' ? ' is-solar' : ''}\" data-energy-bar=\"${segment.type}\" data-wh=\"${segment.value}\"${segment.type === 'solar' ? ` data-daily-wh=\"${totals.solarWh}\" data-energy-days=\"${days}\"` : ''} style=\"--w21-segment-size: ${segmentSize(segment)}\"><span class=\"w21-power-calculator__segmented-capacity-fill\" style=\"width: ${segment.value > 0 ? 100 : 0}%\"></span></div>`).join('')}\r\n            </div>\r\n          </div>\r\n          <div class=\"w21-power-calculator__segmented-capacity-values\" style=\"width: ${supplyWidth}%\">${supply.map(segment => `\r\n            <div class=\"w21-power-calculator__segmented-capacity-value\" style=\"--w21-segment-size: ${segmentSize(segment)}\"><strong>${segment.value > 0 ? `${formatNumber(segment.value)}Wh` : '\u2013'}</strong></div>`).join('')}</div>\r\n        </div>` : '';\r\n      let conclusion = `<div class=\"w21-power-calculator__energy-status is-neutral\" data-setup-status=\"neutral\" data-setup-message=\"empty\" role=\"status\"><span class=\"w21-power-calculator__setup-plus w21-power-calculator__energy-status-icon\" aria-hidden=\"true\">${minusIcon}</span><div class=\"w21-power-calculator__energy-status-text\"><span>\u2013</span></div></div>`;\r\n      const suggestedSelection = currentRecommendation ? getRecommendedSelection(currentRecommendation) : null;\r\n      // The entire result must describe one setup. Manual choices stay visible;\r\n      // the independently calculated recommendation is only adopted by Switch.\r\n      const visibleSelection = selectionIsManual ? getSetupSelection() : suggestedSelection;\r\n      const visibleItems = hasAppliances && visibleSelection ? getSelectedSetupItems(visibleSelection) : [];\r\n      const powerShort = Boolean(station && powerNeeded > station.output);\r\n      const needsSetup = hasAppliances && (!station || insufficient || powerShort);\r\n      const previewTitle = selectionIsManual ? labels.yourSelection\r\n        : { en: 'Recommended setup', nl: 'Aanbevolen setup', de: 'Empfohlenes Setup' }[locale];\r\n      const visibleCards = visibleItems.length ? `<div data-summary-recommendation data-results-setup=\"${selectionIsManual ? 'manual' : 'automatic'}\" role=\"group\" aria-label=\"${escapeHtml(previewTitle)}\">${renderCombination(visibleItems, true)}</div>` : '';\r\n      const differs = Boolean(suggestedSelection && !sameSetup(getSetupSelection(), suggestedSelection));\r\n      if (hasAppliances) {\r\n        let messageKey = 'works';\r\n        let statusKind = needsSetup ? 'error' : 'success';\r\n        // A hard output ceiling takes precedence over a capacity shortfall.\r\n        // Individually oversized appliances cannot be fixed by using them apart.\r\n        const activeDevices = state.devices.filter(device => device.active);\r\n        const oversizedDevices = activeDevices.filter(device => getDevicePower(device) > 2000);\r\n        if (powerNeeded > 2000) {\r\n          statusKind = 'error';\r\n          messageKey = oversizedDevices.length > 1 ? 'maximumOutputMultiple'\r\n            : oversizedDevices.length === 1 ? (activeDevices.length === 1 ? 'maximumOutputSingle' : 'maximumOutputOne')\r\n            : 'maximumOutputCombined';\r\n        } else if (!station) messageKey = 'selectionEmpty';\r\n        else if (!recommendedChoice && needsSetup) {\r\n          messageKey = powerShort && insufficient ? 'maximumBoth' : powerShort ? 'maximumOutput'\r\n            : root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true' ? 'maximumCapacity' : 'maximumBattery';\r\n        } else if (needsSetup) {\r\n          messageKey = powerShort && insufficient ? 'moreBoth' : powerShort ? 'moreOutput' : 'moreCapacity';\r\n        } else if (differs) {\r\n          const lessCapacity = currentRecommendation.capacity < totals.batteryCapacity;\r\n          const lessOutput = currentRecommendation.station.output < station.output;\r\n          const solarPreferred = currentRecommendation.solar && currentRecommendation.expansionCount < state.expansionCount;\r\n          messageKey = solarPreferred ? 'solar' : lessCapacity && lessOutput ? 'lessBoth' : lessCapacity ? 'lessCapacity' : lessOutput ? 'lessOutput' : 'works';\r\n          statusKind = messageKey === 'works' ? 'success' : 'advice';\r\n        }\r\n        const crossIcon = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><path d=\"M5 5l10 10M15 5L5 15\"/></svg>';\r\n        const switchIcon = '<svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><path d=\"M15.5 6.5A6 6 0 0 0 5 5l-1.5 1.5M4.5 13.5A6 6 0 0 0 15 15l1.5-1.5M3.5 3.5v3h3M16.5 16.5v-3h-3\"/></svg>';\r\n        const message = (messageKey === 'selectionEmpty' ? labels.selectionEmpty : setupConclusionCopy[messageKey])\r\n          + (powerNeeded > 2000 && insufficient ? ` ${setupConclusionCopy.outputAlsoCapacity}` : '');\r\n        const canSwitch = differs && messageKey !== 'works' && Boolean(recommendedChoice);\r\n        // Keep the status badge read-only. Switching is now a labelled action\r\n        // on the right, rather than an icon-only button before the message.\r\n        const leadingIcon = `<span class=\"w21-power-calculator__setup-plus w21-power-calculator__energy-status-icon\" aria-hidden=\"true\">${canSwitch ? switchIcon : needsSetup ? crossIcon : checkIcon}</span>`;\r\n        const switchAction = canSwitch ? `<button type=\"button\" class=\"w21-power-calculator__button w21-power-calculator__button--primary w21-power-calculator__conclusion-action\" data-summary-switch>${switchIcon}<span>${escapeHtml(labels.switchSetup)}</span></button>` : '';\r\n        const outputExplanation = messageKey.startsWith('maximumOutput') && powerNeeded > 2000;\r\n        conclusion = `<div class=\"w21-power-calculator__energy-status is-${statusKind}\" data-setup-status=\"${statusKind}\" data-setup-message=\"${messageKey}\"${outputExplanation ? ' data-output-explanation' : ''} role=\"status\">${leadingIcon}<div class=\"w21-power-calculator__energy-status-text\"><span>${escapeHtml(message)}</span></div><div class=\"w21-power-calculator__energy-status-actions\" data-setup-actions>${switchAction}</div></div>`;\r\n      }\r\n      if (summaryConclusion) {\r\n        const toggleFocused = document.activeElement === summaryToggle;\r\n        summaryConclusion.innerHTML = conclusion;\r\n        // Keep the same toggle node/listeners across calculation updates.\r\n        const status = summaryConclusion.querySelector('[data-setup-status]');\r\n        if (summaryToggle && status) {\r\n          let actions = status.querySelector('[data-setup-actions]');\r\n          if (!actions) {\r\n            actions = document.createElement('div');\r\n            actions.className = 'w21-power-calculator__energy-status-actions';\r\n            actions.dataset.setupActions = '';\r\n            status.appendChild(actions);\r\n          }\r\n          actions.appendChild(summaryToggle);\r\n          if (toggleFocused) summaryToggle.focus({ preventScroll: true });\r\n        }\r\n        summaryConclusion.hidden = !conclusion;\r\n      }\r\n      // Do not replace the controls during calculation: a focused input or\r\n      // dragging range thumb must keep its DOM node and pointer interaction.\r\n      resultStacks.forEach(stack => {\r\n        const settings = resultSettings.get(stack);\r\n        const metrics = stack.querySelector('[data-results], [data-step-results]');\r\n        [...stack.children].forEach(child => { if (child !== settings && child !== metrics && child !== summaryConclusion) child.remove(); });\r\n        metrics.insertAdjacentHTML('beforebegin', (stack === capacityStack ? '' : conclusion) + consumption + supplyBar);\r\n        stack.insertAdjacentHTML('beforeend', visibleCards);\r\n        const consumptionValues = stack.querySelector('.is-appliances .w21-power-calculator__segmented-capacity-values');\r\n        if (consumptionValues) consumptionValues.style.width = `${consumptionWh > 0 ? consumptionWh / scale * 100 : 100}%`;\r\n      });\r\n      // Duration and appliance edits also update profile visibility without\r\n      // rebuilding either focused input or the result controls.\r\n      renderSolarRegions();\r\n      renderOffer();\r\n    };\r\n\r\n    // Both views delegate to persistent containers and use the latest selection.\r\n    resultStacks.forEach(stack => stack.addEventListener('click', event => {\r\n      const productToggle = event.target.closest('[data-result-product-toggle]');\r\n      if (productToggle && stack.contains(productToggle)) {\r\n        event.preventDefault();\r\n        const productId = productToggle.dataset.resultProductToggle;\r\n        if (productId === state.selectedPowerStationId) {\r\n          state.selectedPowerStationId = '';\r\n          state.stationCount = 0;\r\n          state.expansionCount = 0;\r\n        } else if (productId === 'expansion' && state.expansionCount > 0) {\r\n          state.expansionCount = 0;\r\n        } else if (productId === state.selectedSolarId && state.solarCount > 0) {\r\n          state.selectedSolarId = '';\r\n          state.solarCount = 0;\r\n          rememberedSolarSelection = null;\r\n        } else return;\r\n        const restoreFocus = document.activeElement === productToggle;\r\n        selectionIsManual = true;\r\n        renderAll();\r\n        if (restoreFocus) {\r\n          const next = stack.querySelector('[data-result-product-toggle], [data-summary-switch], [data-setup-status]');\r\n          if (next) { if (next.hasAttribute('data-setup-status')) next.tabIndex = -1; next.focus({ preventScroll: true }); }\r\n        }\r\n        return;\r\n      }\r\n      const quantityButton = event.target.closest('[data-summary-quantity]');\r\n      if (quantityButton && stack.contains(quantityButton)) {\r\n        if (quantityButton.disabled || !quantityButton.closest('[data-summary-recommendation]')) return;\r\n        event.preventDefault();\r\n        const kind = quantityButton.dataset.summaryQuantity;\r\n        const direction = Number(quantityButton.dataset.summaryDirection);\r\n        if (changeSetupQuantity(kind, direction, quantityButton.dataset.summaryPanel)) {\r\n          const nextControls = [...stack.querySelectorAll('[data-summary-quantity]')].filter(control =>\r\n            control.dataset.summaryQuantity === kind && !control.disabled);\r\n          (nextControls.find(control => Number(control.dataset.summaryDirection) === direction) || nextControls[0])?.focus({ preventScroll: true });\r\n        }\r\n        return;\r\n      }\r\n    }));\r\n    root.addEventListener('click', event => {\r\n      const action = event.target.closest('[data-summary-switch]');\r\n      if (!action || !root.contains(action) || !getSuggestedChoice()) return;\r\n      event.preventDefault();\r\n      selectionIsManual = false;\r\n      const fromSummary = action.closest('[data-summary-conclusion]');\r\n      const fromOffer = action.closest('[data-offer-section]');\r\n      renderAll();\r\n      const status = (fromOffer ? fromOffer.querySelector('[data-offer-conclusion]') : fromSummary ? summaryConclusion : root.querySelector('[data-step-results-stack]'))?.querySelector('[data-setup-status]');\r\n      if (status) { status.tabIndex = -1; status.focus({ preventScroll: true }); }\r\n    });\r\n\r\n    const coversTrip = (capacity, dailyWh, solarWh, days, mainUnitCapacity, reserveRatio = getReserveRatio()) => {\r\n      let remaining = capacity;\r\n      for (let day = 0; day < days; day += 1) {\r\n        // Daily balance: generation can offset use, but surplus cannot exceed storage.\r\n        const fraction = Math.min(1, days - day);\r\n        remaining = Math.min(capacity, remaining + (solarWh - dailyWh) * fraction);\r\n        if (remaining + 1e-9 < mainUnitCapacity * reserveRatio) return false;\r\n      }\r\n      return true;\r\n    };\r\n    const getReserveRatio = () => state.reserveEnabled === false ? 0 : 0.2;\r\n\r\n    const revealSelectedSolar = () => {\r\n      if (!state.selectedSolarId || state.solarCount <= 0) return;\r\n      if (solarOptions) solarOptions.hidden = false;\r\n      if (mobileResultsMedia.matches) root.classList.add('is-solar-picker-open');\r\n      solarDisclosure?.setAttribute('aria-expanded', 'true');\r\n      if (solarDisclosureLabel) solarDisclosureLabel.textContent = labels.hideSolarPanels;\r\n    };\r\n\r\n    const getRecommendedChoice = (dailyWh, outputNeeded, days) => {\r\n      const wantsSolar = root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true';\r\n      const candidates = powerStations.flatMap(station => {\r\n        if (station.output < outputNeeded) return [];\r\n        const expansionMax = station.compatibleExpansion ? expansionBattery.maxQuantity : 0;\r\n        // One main unit, with panels tried before increasing expansion capacity.\r\n        for (let expansionCount = 0; expansionCount <= expansionMax; expansionCount += 1) {\r\n          const capacity = station.capacity + expansionCount * expansionBattery.capacity;\r\n          const batterySufficient = coversTrip(capacity, dailyWh, 0, days, station.capacity);\r\n          const requiredInput = Math.max(0, dailyWh - (capacity - station.capacity * getReserveRatio()) / days);\r\n          const solar = wantsSolar && !batterySufficient ? solarPanels.flatMap(panel => {\r\n            const perPanel = panel.watts * state.solarSunHours;\r\n            if (perPanel <= 0) return [];\r\n            const quantity = Math.max(1, Math.ceil((requiredInput - 1e-9) / perPanel));\r\n            const input = perPanel * quantity;\r\n            return quantity <= (solarMaxByStation[station.id]?.[panel.id] || 0)\r\n              && coversTrip(capacity, dailyWh, input, days, station.capacity)\r\n              ? [{ panel, quantity, input }] : [];\r\n          }).sort((a, b) => a.input - b.input || a.quantity - b.quantity)[0] || null : null;\r\n          if (batterySufficient || solar) {\r\n            return [{ station, stationCount: 1, expansionCount, capacity, solar, sufficient: true }];\r\n          }\r\n        }\r\n        return [];\r\n      });\r\n      // Preserve the preference for sufficient sets without extra batteries.\r\n      const rank = candidate => candidate.expansionCount === 0 ? 0\r\n        : wantsSolar && candidate.solar ? 1 : 2;\r\n      return candidates.sort((a, b) =>\r\n        rank(a) - rank(b) || a.capacity - b.capacity || a.expansionCount - b.expansionCount || a.station.output - b.station.output\r\n      )[0];\r\n    };\r\n\r\n    const setupConclusionCopy = {\r\n      en: {\r\n        works: 'Your current setup works.',\r\n        moreCapacity: 'Your current setup needs more capacity.',\r\n        moreOutput: 'Your current setup needs more output power.',\r\n        moreBoth: 'Your current setup needs more capacity and output power.',\r\n        lessCapacity: 'Your current setup works. A lower-capacity setup also meets your needs.',\r\n        lessOutput: 'Your current setup works. A lower-output setup also meets your needs.',\r\n        lessBoth: 'Your current setup works. A smaller setup also meets your needs.',\r\n        solar: 'Your current setup works. Solar power could reduce the need for extra batteries.',\r\n        maximumOutput: 'Maximum output reached. Reduce appliance power or simultaneous use.',\r\n        maximumOutputSingle: 'Maximum power limit reached. Your appliance requires more than 2,000W. You can adjust its entered wattage in step 1.',\r\n        maximumOutputOne: 'Maximum power limit reached. One of your appliances requires more than 2,000W. You can adjust its entered wattage in step 1.',\r\n        maximumOutputMultiple: 'Maximum power limit reached. Some of your appliances require more than 2,000W. You can adjust their entered wattage in step 1.',\r\n        maximumOutputCombined: 'Maximum power limit of 2,000W reached. Avoid using one or more appliances simultaneously. Set the on/off switch in step 1 to \u2018Off\u2019 or adjust the wattage of your appliances.',\r\n        outputAlsoCapacity: 'This setup also has insufficient energy for your selected duration.',\r\n        maximumBattery: 'Maximum battery capacity reached. Enable solar power or reduce energy usage.',\r\n        maximumCapacity: 'Maximum capacity reached. Reduce energy usage or off-grid days.',\r\n        maximumBoth: 'Maximum setup reached. Reduce energy usage and power demand.'\r\n      },\r\n      nl: {\r\n        works: 'Je huidige setup voldoet.',\r\n        moreCapacity: 'Je huidige setup heeft meer capaciteit nodig.',\r\n        moreOutput: 'Je huidige setup heeft meer uitgangsvermogen nodig.',\r\n        moreBoth: 'Je huidige setup heeft meer capaciteit en uitgangsvermogen nodig.',\r\n        lessCapacity: 'Je huidige setup voldoet. Een setup met minder capaciteit voldoet ook aan je behoeften.',\r\n        lessOutput: 'Je huidige setup voldoet. Een setup met minder uitgangsvermogen voldoet ook aan je behoeften.',\r\n        lessBoth: 'Je huidige setup voldoet. Een kleinere setup voldoet ook aan je behoeften.',\r\n        solar: 'Je huidige setup voldoet. Zonne-energie kan de behoefte aan extra accu\u2019s verminderen.',\r\n        maximumOutput: 'Maximaal uitgangsvermogen bereikt. Verlaag apparaatvermogen of gelijktijdig gebruik.',\r\n        maximumOutputSingle: 'Maximaal vermogen bereikt. Je apparaat heeft meer dan 2.000W vermogen nodig. Je kunt het ingevulde vermogen aanpassen in stap 1.',\r\n        maximumOutputOne: 'Maximaal vermogen bereikt. E\u00E9n van je apparaten heeft meer dan 2.000W vermogen nodig. Je kunt het ingevulde vermogen aanpassen in stap 1.',\r\n        maximumOutputMultiple: 'Maximaal vermogen bereikt. Sommige apparaten hebben meer dan 2.000W vermogen nodig. Je kunt het ingevulde vermogen aanpassen in stap 1.',\r\n        maximumOutputCombined: 'Maximaal vermogen van 2.000W bereikt. Gebruik \u00E9\u00E9n of meerdere apparaten niet gelijktijdig. Zet de aan/uit schakelaar in stap 1 op \u2018Uit\u2019 of pas het vermogen van je apparaten aan.',\r\n        outputAlsoCapacity: 'Deze setup biedt ook onvoldoende energie voor de ingestelde gebruiksduur.',\r\n        maximumBattery: 'Maximale accucapaciteit bereikt. Schakel zonne-energie in of verlaag het energieverbruik.',\r\n        maximumCapacity: 'Maximale capaciteit bereikt. Verlaag het energieverbruik of het aantal off-grid dagen.',\r\n        maximumBoth: 'Maximale setup bereikt. Verlaag het energieverbruik en het benodigde vermogen.'\r\n      },\r\n      de: {\r\n        works: 'Dein aktuelles Setup reicht aus.',\r\n        moreCapacity: 'Dein aktuelles Setup ben\u00F6tigt mehr Kapazit\u00E4t.',\r\n        moreOutput: 'Dein aktuelles Setup ben\u00F6tigt mehr Ausgangsleistung.',\r\n        moreBoth: 'Dein aktuelles Setup ben\u00F6tigt mehr Kapazit\u00E4t und Ausgangsleistung.',\r\n        lessCapacity: 'Dein aktuelles Setup reicht aus. Ein Setup mit weniger Kapazit\u00E4t deckt deinen Bedarf ebenfalls.',\r\n        lessOutput: 'Dein aktuelles Setup reicht aus. Ein Setup mit weniger Ausgangsleistung deckt deinen Bedarf ebenfalls.',\r\n        lessBoth: 'Dein aktuelles Setup reicht aus. Ein kleineres Setup deckt deinen Bedarf ebenfalls.',\r\n        solar: 'Dein aktuelles Setup reicht aus. Solarenergie k\u00F6nnte den Bedarf an Zusatzakkus verringern.',\r\n        maximumOutput: 'Maximale Ausgangsleistung erreicht. Reduziere Ger\u00E4teleistung oder gleichzeitige Nutzung.',\r\n        maximumOutputSingle: 'Maximale Leistungsgrenze erreicht. Dein Ger\u00E4t ben\u00F6tigt mehr als 2.000W. Du kannst die eingegebene Leistung in Schritt 1 anpassen.',\r\n        maximumOutputOne: 'Maximale Leistungsgrenze erreicht. Eines deiner Ger\u00E4te ben\u00F6tigt mehr als 2.000W. Du kannst die eingegebene Leistung in Schritt 1 anpassen.',\r\n        maximumOutputMultiple: 'Maximale Leistungsgrenze erreicht. Einige deiner Ger\u00E4te ben\u00F6tigen mehr als 2.000W. Du kannst die eingegebene Leistung deiner Ger\u00E4te in Schritt 1 anpassen.',\r\n        maximumOutputCombined: 'Maximale Leistung von 2.000W erreicht. Verwende ein oder mehrere Ger\u00E4te nicht gleichzeitig. Stelle den Ein/Aus-Schalter in Schritt 1 auf \u201EAus\u201C oder passe die Leistung deiner Ger\u00E4te an.',\r\n        outputAlsoCapacity: 'Dieses Setup bietet au\u00DFerdem nicht genug Energie f\u00FCr die eingestellte Nutzungsdauer.',\r\n        maximumBattery: 'Maximale Akkukapazit\u00E4t erreicht. Aktiviere Solarenergie oder reduziere den Energieverbrauch.',\r\n        maximumCapacity: 'Maximale Kapazit\u00E4t erreicht. Reduziere den Energieverbrauch oder die Off-grid-Tage.',\r\n        maximumBoth: 'Maximales Setup erreicht. Reduziere Energieverbrauch und Leistungsbedarf.'\r\n      }\r\n    }[locale];\r\n    const getMaximumChoice = (dailyWh, outputNeeded, days) => {\r\n      // Preview the maximum energy available from one compatible set. It is\r\n      // never labelled sufficient unless it also passes output and reserve checks.\r\n      const station = powerStations.find(item => item.id === (outputNeeded > 1800 ? 'move_2000' : 'move_1800'));\r\n      const expansionCount = station.compatibleExpansion ? expansionBattery.maxQuantity : 0;\r\n      const capacity = station.capacity + expansionCount * expansionBattery.capacity;\r\n      const wantsSolar = root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true';\r\n      const solar = wantsSolar && state.solarSunHours > 0 && !coversTrip(capacity, dailyWh, 0, days, station.capacity)\r\n        ? solarPanels.map(panel => ({ panel, quantity: solarMaxByStation[station.id]?.[panel.id] || 0 }))\r\n          .filter(item => item.quantity > 0).sort((a, b) => b.panel.watts * b.quantity - a.panel.watts * a.quantity)[0] : null;\r\n      return { station, stationCount: 1, expansionCount, capacity, solar };\r\n    };\r\n    const getSuggestedChoice = () => {\r\n      if (!state.devices.some(device => device.active)) return null;\r\n      const totals = getTotals();\r\n      const days = getTripEnergy(totals).days;\r\n      // Keep energy sizing independent of the absolute output warning. Actual\r\n      // output is still checked against the selected unit by renderStatus.\r\n      return getRecommendedChoice(totals.dailyWh, Math.min(totals.peakW, 2000), days)\r\n        || getMaximumChoice(totals.dailyWh, totals.peakW, days);\r\n    };\r\n    const changeSetupQuantity = (kind, direction, panelId) => {\r\n      if (![-1, 1].includes(direction)) return false;\r\n      const quantity = kind === 'station' ? state.stationCount : kind === 'expansion' ? state.expansionCount\r\n        : state.selectedSolarId === panelId ? state.solarCount : 0;\r\n      return setSetupQuantity(kind, quantity + direction, panelId);\r\n    };\r\n    const setSetupQuantity = (kind, value, panelId) => {\r\n      const station = getSelectedPowerStation();\r\n      const previous = getSetupSelection();\r\n      const quantity = clamp(Math.floor(Number(value) || 0), 0, maxProductQuantity);\r\n      if (kind === 'station') {\r\n        if (!station) return false;\r\n        state.stationCount = Math.min(quantity, maxStationQuantity);\r\n        if (!quantity) state.selectedPowerStationId = '';\r\n      } else if (kind === 'expansion') {\r\n        if (!station?.compatibleExpansion) return false;\r\n        state.expansionCount = clamp(quantity, 0, getExpansionMax());\r\n      } else if (kind === 'solar') {\r\n        const maximum = getSolarMax(panelId);\r\n        if (!maximum || !solarPanels.some(panel => panel.id === panelId)) return false;\r\n        state.solarCount = clamp(quantity, 0, maximum);\r\n        state.selectedSolarId = state.solarCount > 0 ? panelId : '';\r\n        if (state.solarCount === 0) rememberedSolarSelection = null;\r\n        else syncSolarAdvice(true);\r\n      } else return false;\r\n      cleanupCompatibility();\r\n      if (sameSetup(previous, getSetupSelection())) return false;\r\n      selectionIsManual = true;\r\n      renderAll();\r\n      return true;\r\n    };\r\n    const ensureRecommendedSetup = () => {\r\n      currentRecommendation = getSuggestedChoice();\r\n      if (selectionIsManual) return false;\r\n      const selection = currentRecommendation ? getRecommendedSelection(currentRecommendation)\r\n        : { selectedPowerStationId: '', stationCount: 0, expansionCount: 0, selectedSolarId: '', solarCount: 0 };\r\n      if (sameSetup(getSetupSelection(), selection)) return false;\r\n      rememberSolarSelection();\r\n      Object.assign(state, selection);\r\n      cleanupCompatibility();\r\n      rememberSolarSelection();\r\n      revealSelectedSolar();\r\n      return true;\r\n    };\r\n\r\n    const renderCombination = (items, editable = false) => `<div class=\"w21-power-calculator__setup-row\">${items.map(({ product, quantity }) => {\r\n      const bars = product.id === 'expansion' ? getExpansionBars() : product.watts !== undefined ? getSolarBars(product) : getStationBars(product);\r\n      const isExpansion = product.id === 'expansion';\r\n      const isSolar = product.watts !== undefined;\r\n      const ownStation = getSelectedPowerStation();\r\n      const maxQuantity = isExpansion ? getExpansionMax() : isSolar ? getSolarMax(product.id) : maxStationQuantity;\r\n      const ownQuantity = isExpansion ? state.expansionCount : isSolar ? state.selectedSolarId === product.id ? state.solarCount : 0 : state.stationCount;\r\n      const selected = isExpansion ? state.expansionCount > 0 : isSolar ? state.selectedSolarId === product.id && state.solarCount > 0 : state.selectedPowerStationId === product.id;\r\n      const toggleLabel = { en: 'Deselect', nl: 'Deselecteer', de: 'Abw\u00E4hlen' }[locale];\r\n      const productCheck = editable\r\n        ? `<button type=\"button\" class=\"w21-power-calculator__product-check\" data-product-check data-result-product-toggle=\"${escapeHtml(product.id)}\" aria-pressed=\"${selected}\" aria-label=\"${escapeHtml(`${toggleLabel}: ${product.name}`)}\">${checkIcon}</button>`\r\n        : `<span class=\"w21-power-calculator__product-check\" data-product-check aria-hidden=\"true\">${checkIcon}</span>`;\r\n      const quantityAttributes = direction => editable\r\n        ? `data-summary-quantity=\"${isExpansion ? 'expansion' : isSolar ? 'solar' : 'station'}\" data-summary-direction=\"${direction}\"${isSolar ? ` data-summary-panel=\"${escapeHtml(product.id)}\"` : ''}`\r\n        : '';\r\n      const controls = `<span class=\"w21-power-calculator__${isExpansion ? 'expansion' : 'solar'}-controls\"><button type=\"button\" class=\"w21-power-calculator__quantity-button\" ${quantityAttributes(-1)} ${!editable || !maxQuantity || ownQuantity <= 0 ? 'disabled' : ''} aria-label=\"${labels.offerDecrease}\">${minusIcon}</button><input type=\"text\" inputmode=\"numeric\" maxlength=\"5\" class=\"w21-power-calculator__offer-value-field\" data-core-quantity data-core-kind=\"${isExpansion ? 'expansion' : isSolar ? 'solar' : 'station'}\" data-core-id=\"${product.id}\" value=\"${ownQuantity}\" aria-label=\"${escapeHtml(labels.offerQuantity)}\"${!isExpansion && !isSolar ? ' readonly' : ''}${editable ? '' : ' disabled'}>${maxQuantity < maxProductQuantity ? `<strong>/ ${maxQuantity}</strong>` : ''}<button type=\"button\" class=\"w21-power-calculator__quantity-button\" ${quantityAttributes(1)} ${!editable || !maxQuantity || ownQuantity >= maxQuantity ? 'disabled' : ''} aria-label=\"${labels.offerIncrease}\">${plusIcon}</button></span>`;\r\n      return `<div class=\"w21-power-calculator__product-card w21-power-calculator__setup-product${selected ? ' is-active' : ''}\" data-suggested-product=\"${product.id}\" data-suggested-count=\"${quantity}\"><span class=\"w21-power-calculator__product-media\">${getProductImageHtml(product)}</span><span class=\"w21-power-calculator__product-content\"><span class=\"w21-power-calculator__product-head\"><strong class=\"w21-power-calculator__product-title\">${escapeHtml(product.name)}</strong>${productCheck}</span>${bars}${controls}</span></div>`;\r\n    }).join(`<span class=\"w21-power-calculator__setup-plus\" aria-hidden=\"true\">${plusIcon}</span>`)}</div>`;\r\n\r\n    // Commerce is a separate review of the actual selection, never of a\r\n    // different background recommendation. No prices or variants are invented.\r\n    const commerce = configuredProducts._commerce || {};\r\n    const offerSection = root.querySelector('[data-offer-section]');\r\n    const offerItems = root.querySelector('[data-offer-items]');\r\n    if (compactFlow && offerSection) {\r\n      const results = root.querySelector('[data-recommended-section]');\r\n      offerSection.dataset.mergedOffer = '';\r\n      offerSection.setAttribute('aria-label', labels.offerTitle);\r\n      // Move, do not clone: preserve one set of fields, listeners and IDs. Stay\r\n      // outside the result stack, whose dynamic children are rebuilt on edits.\r\n      results.insertBefore(offerSection, results.querySelector('.w21-power-calculator__result-disclaimer'));\r\n    }\r\n    let offerBusy = false;\r\n    let offerMessage = '';\r\n    let offerShowCart = false;\r\n    const addedProductKeys = new Set();\r\n    let busyProductId = '';\r\n    let lastOfferSelectionKey = '';\r\n    let lastCoreOfferRenderKey = '';\r\n    const offerKey = items => JSON.stringify(items.map(({ product, quantity }) => [product.id, product.variantId, quantity]));\r\n    const hasOfferPrice = product => typeof product.price === 'number' && Number.isSafeInteger(product.price) && product.price >= 0;\r\n    const canBuyOfferItem = product => hasOfferPrice(product) && Number.isSafeInteger(Number(product.variantId)) && Number(product.variantId) > 0 && Boolean(product.handle) && product.available === true;\r\n    const cartCopy = {\r\n      en: { add: 'Add to cart', adding: 'Adding\u2026', added: 'Added', choose: 'Choose products', power: 'Show power stations', hidePower: 'Hide power stations' },\r\n      nl: { add: 'In winkelwagen', adding: 'Toevoegen\u2026', added: 'Toegevoegd', choose: 'Kies producten', power: 'Toon powerstations', hidePower: 'Verberg powerstations' },\r\n      de: { add: 'In den Warenkorb', adding: 'Hinzuf\u00FCgen\u2026', added: 'Hinzugef\u00FCgt', choose: 'Produkte w\u00E4hlen', power: 'Powerstations anzeigen', hidePower: 'Powerstations ausblenden' }\r\n    }[locale];\r\n    Object.assign(labels, {\r\n      en: { offerAdded: 'This product has been added to your cart.', offerError: 'This product could not be added. Check your cart before trying again.', offerPriceChanged: 'The price has changed. Review the updated card price before adding this product.' },\r\n      nl: { offerAdded: 'Dit product is toegevoegd aan je winkelwagen.', offerError: 'Dit product kon niet worden toegevoegd. Controleer je winkelwagen voordat je opnieuw probeert.', offerPriceChanged: 'De prijs is gewijzigd. Controleer de bijgewerkte prijs op de kaart voordat je dit product toevoegt.' },\r\n      de: { offerAdded: 'Dieses Produkt wurde in den Warenkorb gelegt.', offerError: 'Dieses Produkt konnte nicht hinzugef\u00FCgt werden. Pr\u00FCfe vor einem erneuten Versuch deinen Warenkorb.', offerPriceChanged: 'Der Preis hat sich ge\u00E4ndert. Pr\u00FCfe den aktualisierten Kartenpreis, bevor du dieses Produkt hinzuf\u00FCgst.' }\r\n    }[locale]);\r\n    const productCartIcon = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 3h2l3 13h10l3-9H6\"/><circle cx=\"9\" cy=\"20\" r=\"1\"/><circle cx=\"18\" cy=\"20\" r=\"1\"/></svg>';\r\n    const productCartButton = (product, quantity, invalidRules = false) => {\r\n      const added = addedProductKeys.has(offerKey([{ product, quantity }]));\r\n      return `<button type=\"button\" class=\"w21-power-calculator__button w21-power-calculator__button--primary w21-power-calculator__product-cart\" data-add-product=\"${escapeHtml(product.id)}\" aria-label=\"${escapeHtml(`${cartCopy.add}: ${product.name}`)}\" aria-busy=\"${offerBusy && busyProductId === product.id}\"${offerBusy || invalidRules || added || quantity <= 0 || !canBuyOfferItem(product) || !Number.isSafeInteger(product.price * quantity) ? ' disabled' : ''}>${productCartIcon}<span data-product-cart-label>${offerBusy && busyProductId === product.id ? cartCopy.adding : added ? cartCopy.added : cartCopy.add}</span></button>`;\r\n    };\r\n    const money = cents => {\r\n      const currency = commerce.currency || 'EUR';\r\n      const amount = (cents / 100).toLocaleString(numberLocale, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n      try {\r\n        const symbol = new Intl.NumberFormat(numberLocale, { style: 'currency', currency }).formatToParts(0).find(part => part.type === 'currency').value;\r\n        return `${symbol} ${amount}`;\r\n      } catch (_) { return `${currency} ${amount}`; }\r\n    };\r\n    const protectCalculatorLinks = () => {\r\n      const hint = { en: 'Opens in a new tab', nl: 'Opent in een nieuw tabblad', de: '\u00D6ffnet in einem neuen Tab' }[locale];\r\n      root.querySelectorAll('a[href]').forEach(link => {\r\n        const href = link.getAttribute('href').trim();\r\n        if (!href || href.startsWith('#')) return;\r\n        let destination;\r\n        try { destination = new URL(href, window.location.href); } catch (_) { return; }\r\n        if (!['http:', 'https:'].includes(destination.protocol)) return;\r\n        if (destination.origin === window.location.origin && destination.pathname === window.location.pathname && destination.search === window.location.search && destination.hash) return;\r\n        link.target = '_blank';\r\n        link.rel = [...new Set([...link.relList, 'noopener', 'noreferrer'])].join(' ');\r\n        if (!link.title) link.title = hint;\r\n      });\r\n    };\r\n    // Shared field sizes use the widest digits of the actual theme font. The\r\n    // price/quantity inputs keep their limits; only their visible width changes.\r\n    const offerMeasureCanvas = document.createElement('canvas');\r\n    const offerMeasureContext = offerMeasureCanvas.getContext('2d');\r\n    const measureOfferText = (element, text, size) => {\r\n      const style = window.getComputedStyle(element);\r\n      offerMeasureContext.font = `${style.fontWeight} ${size}px ${style.fontFamily}`;\r\n      const displayed = style.textTransform === 'uppercase' ? text.toUpperCase() : style.textTransform === 'lowercase' ? text.toLowerCase() : text;\r\n      return offerMeasureContext.measureText(displayed).width + Math.max(0, displayed.length - 1) * (parseFloat(style.letterSpacing) || 0);\r\n    };\r\n    const fitOfferFields = () => {\r\n      if (!offerSection || !offerMeasureContext) return;\r\n      const quantityField = offerSection.querySelector('[data-core-quantity], [data-accessory-quantity]');\r\n      const priceField = offerSection.querySelector('.w21-power-calculator__offer-line-price');\r\n      const cartButton = offerSection.querySelector('[data-add-product]');\r\n      if (!quantityField || !priceField || !cartButton) return;\r\n      if (!priceField.getBoundingClientRect().width) return;\r\n      const widest = (element, texts, size) => Math.ceil(Math.max(...texts.map(text => measureOfferText(element, text, size))));\r\n      const digits = Array.from({ length: 10 }, (_, digit) => String(digit));\r\n      const padding = element => { const style = getComputedStyle(element); return parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth); };\r\n      const quantityWidth = widest(quantityField, digits.map(digit => digit.repeat(3)), 16) + padding(quantityField) + 2;\r\n      const priceWidth = widest(priceField, digits.slice(1).map(digit => money(Number(digit.repeat(7)))), 16) + padding(priceField) + 2;\r\n      const cartSize = parseFloat(getComputedStyle(cartButton).fontSize);\r\n      const cartWidth = widest(cartButton, [cartCopy.add, cartCopy.adding, cartCopy.added], cartSize) + padding(cartButton) + 16 + 8 + 2;\r\n      offerSection.style.setProperty('--w21-offer-quantity-width', `${quantityWidth}px`);\r\n      offerSection.style.setProperty('--w21-offer-price-width', `${priceWidth}px`);\r\n      offerSection.style.setProperty('--w21-offer-cart-width', `${cartWidth}px`);\r\n      const values = priceField.closest('.w21-power-calculator__offer-purchase-values');\r\n      const valuesWidth = values.querySelector('.w21-power-calculator__offer-quantity-controls').getBoundingClientRect().width\r\n        + priceField.getBoundingClientRect().width + (parseFloat(getComputedStyle(values).columnGap) || 0);\r\n      const row = priceField.closest('.w21-power-calculator__offer-item');\r\n      const availableWidth = row.getBoundingClientRect().width - padding(row);\r\n      // Both spaces are at least 10% of the card's usable width. Leave an\r\n      // additional 2px on the product side so values are always closer to cart.\r\n      const productWidth = Math.max(0, Math.min(availableWidth * 0.5, availableWidth * 0.8 - valuesWidth - cartWidth - 2));\r\n      const productGap = availableWidth * 0.9 - productWidth - valuesWidth - cartWidth;\r\n      offerSection.style.setProperty('--w21-offer-values-width', `${valuesWidth}px`);\r\n      offerSection.style.setProperty('--w21-offer-product-width', `${productWidth}px`);\r\n      offerSection.style.setProperty('--w21-offer-product-gap', `${productGap}px`);\r\n      offerSection.querySelectorAll('[data-core-quantity], [data-accessory-quantity]').forEach(input => {\r\n        const available = input.clientWidth - parseFloat(getComputedStyle(input).paddingLeft) - parseFloat(getComputedStyle(input).paddingRight);\r\n        const textWidth = measureOfferText(input, input.value || '0', 16);\r\n        input.style.fontSize = `${Math.min(16, Math.floor(16 * available / Math.max(1, textWidth)))}px`;\r\n      });\r\n      offerSection.querySelectorAll('[data-offer-line-price], [data-accessory-line-price]').forEach(text => {\r\n        const field = text.closest('.w21-power-calculator__offer-line-price');\r\n        const available = field.clientWidth - parseFloat(getComputedStyle(field).paddingLeft) - parseFloat(getComputedStyle(field).paddingRight);\r\n        text.style.fontSize = `${Math.min(16, Math.floor(16 * available / Math.max(1, measureOfferText(field, text.textContent, 16))))}px`;\r\n        field.title = text.textContent;\r\n      });\r\n    };\r\n    window.addEventListener('resize', fitOfferFields);\r\n    document.fonts?.ready.then(fitOfferFields);\r\n    root.addEventListener('input', event => { if (event.target.matches('[data-core-quantity], [data-accessory-quantity]')) fitOfferFields(); });\r\n    root.addEventListener('click', event => { if (event.target.closest('a[href]')) protectCalculatorLinks(); });\r\n    // Accessory rules are evaluated only against actual core products. They do\r\n    // not recurse and never enter the power, capacity or recommendation logic.\r\n    const accessoryCatalogue = new Map();\r\n    (Array.isArray(configuredProducts._accessories) ? configuredProducts._accessories : []).forEach(record => {\r\n      if (!record || typeof record !== 'object') return;\r\n      const ean = String(record.barcode ?? '').trim();\r\n      if (!/^\\d+$/.test(ean)) return;\r\n      const variants = accessoryCatalogue.get(ean) || new Map();\r\n      variants.set(String(record.variantId), { ...record, id: `accessory_${record.variantId}`, name: String(record.title || ean) });\r\n      accessoryCatalogue.set(ean, variants);\r\n    });\r\n    const accessoryQuantities = new Map();\r\n    const accessoryNodes = new Map();\r\n    const coreOfferNodes = new Map();\r\n    const maxAccessoryQuantity = 99999;\r\n    const normalizeAccessoryQuantity = value => {\r\n      const numeric = Number(value);\r\n      return Number.isFinite(numeric) ? clamp(Math.floor(numeric), 0, maxAccessoryQuantity) : 0;\r\n    };\r\n    const readAccessoryRules = value => {\r\n      const rules = [];\r\n      let invalid = false;\r\n      if (value == null || value === '') return { rules, invalid };\r\n      if (typeof value !== 'string') return { rules, invalid: true };\r\n      // Decode only the characters allowed by this rule format. Do this before\r\n      // splitting: the semicolon in &gt; must never expose a bare accessory EAN.\r\n      const namedCharacters = { amp: '&', gt: '>', lt: '<', equals: '=', semi: ';', nbsp: '\\u00a0' };\r\n      const numericCharacters = { 32: ' ', 38: '&', 59: ';', 60: '<', 61: '=', 62: '>', 160: '\\u00a0' };\r\n      let decoded = value;\r\n      for (let pass = 0; pass < 4; pass += 1) {\r\n        const next = decoded.replace(/&(?:#(\\d+)|#x([\\da-f]+)|([a-z]+));/gi, (entity, decimal, hex, name) => {\r\n          if (name) {\r\n            const character = namedCharacters[name.toLowerCase()];\r\n            return typeof character === 'string' ? character : entity;\r\n          }\r\n          return numericCharacters[decimal ? Number(decimal) : parseInt(hex, 16)] ?? entity;\r\n        });\r\n        if (next === decoded) break;\r\n        decoded = next;\r\n      }\r\n      // Unknown or incompletely decoded entities are rejected as one field,\r\n      // not split into fragments that could become unconditional recommendations.\r\n      if (decoded.includes('&')) return { rules, invalid: true };\r\n      decoded.split(';').forEach(raw => {\r\n        const text = raw.trim();\r\n        if (!text) return;\r\n        const parts = text.split(/[=>]/).map(part => part.trim());\r\n        if (parts.length > 2 || parts.some(part => !/^\\d+$/.test(part))) { invalid = true; return; }\r\n        rules.push({ condition: parts.length === 2 ? parts[0] : '', ean: parts.at(-1) });\r\n      });\r\n      return { rules, invalid };\r\n    };\r\n    const getOfferBundle = () => {\r\n      const baseItems = getSelectedSetupItems();\r\n      // Empty ruleBarcode must not fall back to the old illustrative barcode.\r\n      const actualEans = new Set(baseItems.map(({ product }) => String(product.ruleBarcode ?? product.barcode ?? '').trim()).filter(Boolean));\r\n      const selectedVariants = new Set(baseItems.map(({ product }) => String(product.variantId)));\r\n      const coreHandles = new Set(Object.values(productReferences).map(product => product.handle).filter(Boolean));\r\n      const eligible = new Map();\r\n      let invalidRequired = false;\r\n      baseItems.forEach(({ product }) => {\r\n        [['required', product.requiredAccessories], ['optional', product.recommendedAccessories]].forEach(([kind, value]) => {\r\n          const parsed = readAccessoryRules(value);\r\n          if (kind === 'required' && parsed.invalid) invalidRequired = true;\r\n          parsed.rules.forEach(({ condition, ean }) => {\r\n            if (condition && !actualEans.has(condition)) return;\r\n            const previous = eligible.get(ean);\r\n            if (!previous || kind === 'required') eligible.set(ean, kind);\r\n          });\r\n        });\r\n      });\r\n      const rows = [];\r\n      eligible.forEach((kind, ean) => {\r\n        // Ambiguous EANs are not guessed. A core product already in the setup\r\n        // satisfies the rule; other core units must be changed in Mix & Match.\r\n        const matches = accessoryCatalogue.get(ean);\r\n        let product = matches?.size === 1 ? matches.values().next().value : null;\r\n        if (baseItems.some(({ product: core }) => String(core.ruleBarcode ?? core.barcode ?? '').trim() === ean)\r\n          || (product && selectedVariants.has(String(product.variantId)))) return;\r\n        if (product && coreHandles.has(product.handle)) product = null;\r\n        const previous = accessoryQuantities.get(ean);\r\n        // Current EAN rules advise one per setup, whether required or optional.\r\n        // Preserve customer overrides, including zero, through every recalculation.\r\n        const entry = previous || { quantity: 1, edited: false, kind };\r\n        if (!entry.edited && entry.kind !== kind) entry.quantity = 1;\r\n        entry.kind = kind;\r\n        accessoryQuantities.set(ean, entry);\r\n        rows.push({ ean, kind, product: product || { id: `missing_${ean}`, name: `EAN ${ean}`, unresolved: true }, quantity: entry.quantity });\r\n      });\r\n      const items = [...baseItems];\r\n      rows.filter(row => row.quantity > 0).forEach(({ product, quantity }) => {\r\n        const existing = items.find(item => product.variantId != null && String(item.product.variantId) === String(product.variantId));\r\n        if (existing) existing.quantity += quantity;\r\n        else items.push({ product, quantity });\r\n      });\r\n      return { baseItems, rows, items, invalidRequired };\r\n    };\r\n    const setAccessoryQuantity = (ean, quantity) => {\r\n      const row = getOfferBundle().rows.find(item => item.ean === ean);\r\n      if (!row || offerBusy) return false;\r\n      const entry = accessoryQuantities.get(ean);\r\n      const next = normalizeAccessoryQuantity(quantity);\r\n      const changed = next !== entry.quantity;\r\n      entry.quantity = next;\r\n      entry.edited = true;\r\n      if (changed) renderOffer();\r\n      return true;\r\n    };\r\n    const renderAccessories = bundle => {\r\n      const eligibleEans = new Set(bundle.rows.map(row => row.ean));\r\n      accessoryNodes.forEach((node, ean) => {\r\n        if (!eligibleEans.has(ean)) { node.remove(); accessoryNodes.delete(ean); }\r\n      });\r\n      ['required', 'optional'].forEach(kind => {\r\n        const group = offerSection.querySelector(`[data-accessory-group=\"${kind}\"]`);\r\n        if (!group) return;\r\n        const container = group.querySelector('[data-accessory-rows]');\r\n        const rows = bundle.rows.filter(row => row.kind === kind);\r\n        group.hidden = rows.length === 0;\r\n        rows.forEach(({ ean, product, quantity }, index) => {\r\n          let node = accessoryNodes.get(ean);\r\n          if (!node) {\r\n            node = document.createElement('div');\r\n            node.className = 'w21-power-calculator__offer-item w21-power-calculator__accessory-item';\r\n            node.dataset.accessoryEan = ean;\r\n            const name = escapeHtml(product.name);\r\n            const title = product.url ? `<a href=\"${escapeHtml(product.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${name}</a>` : name;\r\n            const image = product.image ? `<img src=\"${escapeHtml(product.image)}\" alt=\"${name}\" loading=\"lazy\">` : '<span class=\"w21-power-calculator__product-placeholder\" aria-hidden=\"true\">+</span>';\r\n            const control = direction => `<button type=\"button\" class=\"w21-power-calculator__quantity-button\" data-offer-quantity-kind=\"accessory\" data-offer-product-id=\"${ean}\" data-offer-direction=\"${direction}\" aria-label=\"${escapeHtml(`${direction > 0 ? labels.offerIncrease : labels.offerDecrease}: ${product.name}`)}\">${direction > 0 ? plusIcon : minusIcon}</button>`;\r\n            node.innerHTML = `<div class=\"w21-power-calculator__offer-product-info\"><span class=\"w21-power-calculator__offer-image\">${image}</span><div class=\"w21-power-calculator__offer-description\"><strong>${title}</strong><span class=\"w21-power-calculator__offer-stock\" data-accessory-stock></span></div></div><div class=\"w21-power-calculator__offer-purchase-values\"><div class=\"w21-power-calculator__offer-quantity-controls\" role=\"group\" aria-label=\"${escapeHtml(`${labels.offerQuantity}: ${product.name}`)}\">${control(1)}<input type=\"text\" inputmode=\"numeric\" maxlength=\"5\" class=\"w21-power-calculator__offer-value-field\" data-accessory-quantity=\"${ean}\" aria-label=\"${escapeHtml(`${labels.offerQuantity}: ${product.name}`)}\">${control(-1)}</div><strong class=\"w21-power-calculator__offer-line-price w21-power-calculator__offer-value-field\"><span class=\"sr-only\">${labels.offerLineTotal}: </span><span data-accessory-line-price></span></strong></div><div data-accessory-cart></div>`;\r\n            accessoryNodes.set(ean, node);\r\n          }\r\n          // Preserve focused inputs and caret while totals update.\r\n          if (container.children[index] !== node) container.insertBefore(node, container.children[index] || null);\r\n          node.dataset.accessoryKind = kind;\r\n          node.dataset.accessoryCount = quantity;\r\n          node.classList.toggle('is-selected', quantity > 0);\r\n          const input = node.querySelector('[data-accessory-quantity]');\r\n          if (document.activeElement !== input) input.value = String(quantity);\r\n          input.classList.toggle('is-wide-quantity', quantity >= 1000);\r\n          input.disabled = offerBusy;\r\n          node.querySelectorAll('[data-offer-direction]').forEach(button => {\r\n            button.disabled = offerBusy || (Number(button.dataset.offerDirection) < 0 ? quantity <= 0 : quantity >= maxAccessoryQuantity);\r\n          });\r\n          node.querySelector('[data-accessory-line-price]').textContent = quantity === 0 ? money(0) : hasOfferPrice(product) ? money(product.price * quantity) : '\u2013';\r\n          const cart = node.querySelector('[data-accessory-cart]');\r\n          const cartHtml = productCartButton(product, quantity, bundle.invalidRequired);\r\n          if (!cart.firstElementChild) cart.innerHTML = cartHtml;\r\n          else {\r\n            const template = document.createElement('template'); template.innerHTML = cartHtml;\r\n            const next = template.content.firstElementChild;\r\n            cart.firstElementChild.disabled = next.disabled;\r\n            cart.firstElementChild.querySelector('[data-product-cart-label]').textContent = next.querySelector('[data-product-cart-label]').textContent;\r\n            cart.firstElementChild.setAttribute('aria-busy', next.getAttribute('aria-busy'));\r\n          }\r\n          const stock = node.querySelector('[data-accessory-stock]');\r\n          stock.textContent = product.unresolved ? labels.accessoryMissing : product.available === false ? labels.offerUnavailable : '';\r\n          stock.hidden = !stock.textContent;\r\n        });\r\n      });\r\n      const warning = offerSection.querySelector('[data-accessory-warning]');\r\n      if (warning) { warning.hidden = !bundle.invalidRequired; warning.textContent = bundle.invalidRequired ? labels.accessoryRulesInvalid : ''; }\r\n    };\r\n    const renderOffer = () => {\r\n      if (!offerSection || !offerItems) return;\r\n      const bundle = getOfferBundle();\r\n      const { items, baseItems } = bundle;\r\n      const key = offerKey(items);\r\n      if (key !== lastOfferSelectionKey) { offerMessage = ''; offerShowCart = false; lastOfferSelectionKey = key; }\r\n      const selected = baseItems.length > 0;\r\n      offerSection.classList.toggle('is-empty-offer', !selected);\r\n      const coreRenderKey = JSON.stringify([offerKey(baseItems), baseItems.map(({ product }) => [product.price, product.available]), offerBusy, state.solarSunHours, bundle.invalidRequired]);\r\n      // Accessory edits must not remove a core button between pointerdown and\r\n      // click when an accessory quantity field loses focus.\r\n      if (coreRenderKey !== lastCoreOfferRenderKey) {\r\n        lastCoreOfferRenderKey = coreRenderKey;\r\n        const eligible = new Set(baseItems.map(item => item.product.id));\r\n        coreOfferNodes.forEach((node, id) => { if (!eligible.has(id)) { node.remove(); coreOfferNodes.delete(id); } });\r\n        offerItems.querySelector('.w21-power-calculator__offer-empty')?.remove();\r\n        baseItems.forEach(({ product, quantity }, index) => {\r\n        const title = escapeHtml(product.name);\r\n        const name = product.url ? `<a href=\"${escapeHtml(product.url)}\" target=\"_blank\" rel=\"noopener noreferrer\">${title}</a>` : title;\r\n        const kind = product.id === 'expansion' ? 'expansion' : product.watts !== undefined ? 'solar' : 'station';\r\n        const maximum = kind === 'station' ? maxStationQuantity : kind === 'expansion' ? getExpansionMax() : getSolarMax(product.id);\r\n        const quantityButton = direction => `<button type=\"button\" class=\"w21-power-calculator__quantity-button\" data-offer-quantity-kind=\"${kind}\" data-offer-product-id=\"${escapeHtml(product.id)}\" data-offer-direction=\"${direction}\" aria-label=\"${escapeHtml(`${direction > 0 ? labels.offerIncrease : labels.offerDecrease}: ${product.name}`)}\"${offerBusy || (direction > 0 ? quantity >= maximum : quantity <= 0) ? ' disabled' : ''}>${direction > 0 ? plusIcon : minusIcon}</button>`;\r\n        const controls = `<div class=\"w21-power-calculator__offer-purchase-values\"><div class=\"w21-power-calculator__offer-quantity-controls\" role=\"group\" aria-label=\"${escapeHtml(`${labels.offerQuantity}: ${product.name}`)}\">${quantityButton(1)}<input type=\"text\" inputmode=\"numeric\" maxlength=\"5\" class=\"w21-power-calculator__offer-value-field\" value=\"${quantity}\" data-offer-count-value data-core-quantity data-core-kind=\"${kind}\" data-core-id=\"${escapeHtml(product.id)}\" aria-label=\"${escapeHtml(`${labels.offerQuantity}: ${product.name}`)}\"${kind === 'station' ? ' readonly' : ''}${offerBusy ? ' disabled' : ''}>${quantityButton(-1)}</div><strong class=\"w21-power-calculator__offer-line-price w21-power-calculator__offer-value-field\"><span class=\"sr-only\">${labels.offerLineTotal}: </span><span data-offer-line-price>${hasOfferPrice(product) ? escapeHtml(money(product.price * quantity)) : '\u2013'}</span></strong></div>${productCartButton(product, quantity, bundle.invalidRequired)}`;\r\n        const bars = kind === 'station' ? getStationBars(product) : kind === 'expansion' ? getExpansionBars() : getSolarBars(product);\r\n        const template = document.createElement('template');\r\n        template.innerHTML = `<div class=\"w21-power-calculator__offer-item is-selected${kind === 'solar' || kind === 'expansion' ? ` w21-power-calculator__offer-item--${kind}` : ''}\" data-offer-product=\"${product.id}\" data-offer-quantity=\"${quantity}\"><div class=\"w21-power-calculator__offer-product-info\"><span class=\"w21-power-calculator__offer-image\">${getProductImageHtml(product)}</span><div class=\"w21-power-calculator__offer-description\"><strong>${name}</strong>${bars}<span class=\"w21-power-calculator__offer-stock\"${product.available === false ? '' : ' hidden'}>${labels.offerUnavailable}</span></div></div>${controls}</div>`;\r\n        const next = template.content.firstElementChild;\r\n        let node = coreOfferNodes.get(product.id);\r\n        if (!node) { node = next; coreOfferNodes.set(product.id, node); }\r\n        else {\r\n          node.dataset.offerQuantity = String(quantity);\r\n          const input = node.querySelector('[data-core-quantity]');\r\n          // Switch adopts automatic advice even while this field is focused.\r\n          // Do not let a later focusout commit the previous manual count again.\r\n          if (document.activeElement !== input || !selectionIsManual) input.value = String(quantity);\r\n          input.disabled = offerBusy;\r\n          node.querySelectorAll('[data-offer-direction]').forEach(control => {\r\n            control.disabled = offerBusy || (Number(control.dataset.offerDirection) > 0 ? quantity >= maximum : quantity <= 0);\r\n          });\r\n          const oldBars = node.querySelector('.w21-power-calculator__product-bars');\r\n          if (oldBars.innerHTML !== next.querySelector('.w21-power-calculator__product-bars').innerHTML) oldBars.innerHTML = next.querySelector('.w21-power-calculator__product-bars').innerHTML;\r\n          node.querySelector('[data-offer-line-price]').textContent = next.querySelector('[data-offer-line-price]').textContent;\r\n          node.querySelector('.w21-power-calculator__offer-stock').hidden = product.available !== false;\r\n          const cart = node.querySelector('[data-add-product]'), nextCart = next.querySelector('[data-add-product]');\r\n          cart.disabled = nextCart.disabled; cart.querySelector('[data-product-cart-label]').textContent = nextCart.querySelector('[data-product-cart-label]').textContent; cart.setAttribute('aria-busy', nextCart.getAttribute('aria-busy'));\r\n        }\r\n        if (offerItems.children[index] !== node) offerItems.insertBefore(node, offerItems.children[index] || null);\r\n        });\r\n        if (!selected) offerItems.replaceChildren();\r\n      }\r\n      renderAccessories(bundle);\r\n      const messageNode = root.querySelector('[data-offer-message]');\r\n      messageNode.textContent = offerMessage;\r\n      root.querySelector('[data-offer-cart]').hidden = !offerShowCart;\r\n      // Use the same conclusion DOM for every state, including its actions and\r\n      // the neutral dash. Purchase-only renders need not replace a focused action.\r\n      const conclusion = root.querySelector('[data-offer-conclusion]');\r\n      const status = root.querySelector('[data-step-results-stack] [data-setup-status]');\r\n      if (status && conclusion.firstElementChild?.outerHTML !== status.outerHTML) {\r\n        conclusion.replaceChildren(status.cloneNode(true));\r\n      }\r\n      protectCalculatorLinks();\r\n      fitOfferFields();\r\n    };\r\n    offerSection?.addEventListener('click', event => {\r\n      const button = event.target.closest('[data-offer-quantity-kind]');\r\n      if (!button || !offerSection.contains(button) || button.disabled || offerBusy) return;\r\n      const kind = button.dataset.offerQuantityKind;\r\n      if (!['station', 'expansion', 'solar', 'accessory'].includes(kind)) return;\r\n      event.preventDefault();\r\n      const id = button.dataset.offerProductId;\r\n      const direction = Number(button.dataset.offerDirection);\r\n      const restoreFocus = document.activeElement === button;\r\n      const changed = kind === 'accessory'\r\n        ? setAccessoryQuantity(id, (accessoryQuantities.get(id)?.quantity || 0) + direction)\r\n        : changeSetupQuantity(kind, direction, id);\r\n      if (!changed || !restoreFocus) return;\r\n      const controls = [...offerSection.querySelectorAll('[data-offer-quantity-kind]')].filter(control =>\r\n        control.dataset.offerQuantityKind === kind && control.dataset.offerProductId === id && !control.disabled);\r\n      const next = controls.find(control => Number(control.dataset.offerDirection) === direction) || controls[0]\r\n        || offerSection.querySelector('[data-summary-switch], [data-add-product]');\r\n      next?.focus({ preventScroll: true });\r\n    });\r\n    const editAccessoryQuantity = (event, commit) => {\r\n      const input = event.target.closest('[data-accessory-quantity]');\r\n      if (!input || !offerSection.contains(input) || offerBusy) return;\r\n      if (!commit && input.value === '') return;\r\n      const quantity = normalizeAccessoryQuantity(input.value);\r\n      if (commit || !/^\\d*$/.test(input.value) || Number(input.value) !== quantity) input.value = String(quantity);\r\n      if (!commit || accessoryQuantities.get(input.dataset.accessoryQuantity)?.quantity !== quantity) {\r\n        setAccessoryQuantity(input.dataset.accessoryQuantity, quantity);\r\n      }\r\n    };\r\n    offerSection?.addEventListener('input', event => editAccessoryQuantity(event, false));\r\n    offerSection?.addEventListener('change', event => editAccessoryQuantity(event, true));\r\n    offerSection?.addEventListener('focusout', event => editAccessoryQuantity(event, true));\r\n    offerSection?.addEventListener('click', async event => {\r\n      const button = event.target.closest('[data-add-product]');\r\n      if (!button || button.disabled || offerBusy) return;\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      // Commit a temporarily blank field even when a click is programmatic.\r\n      offerSection.querySelectorAll('[data-accessory-quantity]').forEach(input => {\r\n        editAccessoryQuantity({ target: input }, true);\r\n      });\r\n      const bundle = getOfferBundle();\r\n      const selectedItem = bundle.items.find(item => item.product.id === button.dataset.addProduct);\r\n      if (!selectedItem) return;\r\n      const items = [selectedItem];\r\n      const requestedSelection = getSetupSelection();\r\n      const key = offerKey(items);\r\n      const selectionKey = offerKey(bundle.items);\r\n      if (bundle.invalidRequired || addedProductKeys.has(key) || !items.every(({ product, quantity }) => quantity > 0 && canBuyOfferItem(product) && Number.isSafeInteger(product.price * quantity))) return;\r\n      offerBusy = true; busyProductId = selectedItem.product.id; offerMessage = ''; offerShowCart = false; renderOffer();\r\n      const route = String(window.Shopify?.routes?.root || commerce.rootUrl || '/').replace(/\\/?$/, '/');\r\n      let submitted = false;\r\n      try {\r\n        // Recheck this card's exact variant. Do not add any other products or\r\n        // accessories silently. Changed prices require another explicit click.\r\n        const productRequests = new Map();\r\n        const fresh = await Promise.all(items.map(async ({ product }) => {\r\n          if (!productRequests.has(product.handle)) productRequests.set(product.handle, (async () => {\r\n            const response = await fetch(`${route}products/${encodeURIComponent(product.handle)}.js`, { credentials: 'same-origin', cache: 'no-store', headers: { Accept: 'application/json' } });\r\n            if (!response.ok) throw new Error(labels.offerPriceMissing);\r\n            return response.json();\r\n          })());\r\n          const data = await productRequests.get(product.handle);\r\n          const variant = data.variants?.find(item => String(item.id) === String(product.variantId));\r\n          if (!variant || typeof variant.price !== 'number') throw new Error(labels.offerUnavailable);\r\n          return { product, variant };\r\n        }));\r\n        if (!sameSetup(getSetupSelection(), requestedSelection) || offerKey(getOfferBundle().items) !== selectionKey) return;\r\n        const priceChanged = fresh.some(({ product, variant }) => product.price !== variant.price);\r\n        fresh.forEach(({ product, variant }) => { product.price = variant.price; product.compareAtPrice = variant.compare_at_price; product.available = variant.available; });\r\n        if (fresh.some(({ product }) => !canBuyOfferItem(product))) { offerMessage = labels.offerUnavailable; return; }\r\n        if (priceChanged) { offerMessage = labels.offerPriceChanged; return; }\r\n        submitted = true;\r\n        const response = await fetch(`${route}cart/add.js`, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ items: items.map(({ product, quantity }) => ({ id: Number(product.variantId), quantity })) }) });\r\n        const result = await response.json();\r\n        if (!response.ok) throw new Error(typeof result.description === 'string' ? result.description : labels.offerError);\r\n        addedProductKeys.add(key);\r\n        offerMessage = labels.offerAdded; offerShowCart = true;\r\n        document.dispatchEvent(new CustomEvent('cart:refresh'));\r\n      } catch (error) {\r\n        offerMessage = submitted ? `${labels.offerError}${error.message && error.message !== labels.offerError ? ` ${error.message}` : ''}` : (error.message === labels.offerUnavailable ? labels.offerUnavailable : labels.offerPriceMissing);\r\n        offerShowCart = submitted;\r\n      } finally { offerBusy = false; busyProductId = ''; renderOffer(); }\r\n    });\r\n\r\n    const solarAdviceButtons = [...root.querySelectorAll('[data-solar-advice], [data-summary-solar-advice]')];\r\n    const syncSolarAdvice = checked => {\r\n      solarAdviceButtons.forEach(control => {\r\n        control.setAttribute('aria-checked', String(checked));\r\n        const label = control.closest('.w21-power-calculator__solar-advice-option')?.querySelector('[data-i18n=\"solarAdvice\"]');\r\n        if (label) label.textContent = checked ? labels.disableSolarPanels : labels.enableSolarPanels;\r\n      });\r\n    };\r\n    syncSolarAdvice(root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true');\r\n    solarAdviceButtons.forEach(button => button.addEventListener('click', () => {\r\n      const checked = button.getAttribute('aria-checked') !== 'true';\r\n      syncSolarAdvice(checked);\r\n      if (!checked) {\r\n        rememberSolarSelection();\r\n        state.selectedSolarId = '';\r\n        state.solarCount = 0;\r\n        // A previous recommendation must not restore solar after opting out.\r\n        root.classList.remove('is-solar-picker-open');\r\n      } else if (rememberedSolarSelection) {\r\n        const max = getSolarMax(rememberedSolarSelection.id);\r\n        if (max > 0) {\r\n          state.selectedSolarId = rememberedSolarSelection.id;\r\n          state.solarCount = Math.min(rememberedSolarSelection.count, max);\r\n          revealSelectedSolar();\r\n        }\r\n      }\r\n      renderAll();\r\n    }));\r\n\r\n    const reserveCopy = {\r\n      en: { enable: 'Enable 20% battery reserve', disable: 'Disable 20% battery reserve', on: 'The advice keeps 20% of the main unit capacity in reserve at the end of each day. Expansion batteries and solar input do not increase this reserve.', off: 'Battery reserve is disabled. The advice may use the full battery capacity; no 20% main-unit reserve is held back.' },\r\n      nl: { enable: '20% accureserve inschakelen', disable: '20% accureserve uitschakelen', on: 'Het advies houdt aan het einde van elke dag 20% van de hoofdunitcapaciteit als reserve. Uitbreidingsaccu\u2019s en zonne-opbrengst verhogen die reserve niet.', off: 'De accureserve is uitgeschakeld. Het advies mag de volledige accucapaciteit gebruiken; er wordt geen 20% reserve van de hoofdunit aangehouden.' },\r\n      de: { enable: '20% Akkureserve aktivieren', disable: '20% Akkureserve deaktivieren', on: 'Die Empfehlung h\u00E4lt am Ende jedes Tages 20% der Kapazit\u00E4t der Haupteinheit als Reserve. Zusatzakkus und Solarertrag erh\u00F6hen diese Reserve nicht.', off: 'Die Akkureserve ist deaktiviert. Die Empfehlung darf die volle Akkukapazit\u00E4t nutzen; es werden keine 20% der Haupteinheit als Reserve zur\u00FCckgehalten.' }\r\n    }[locale];\r\n    const reserveButtons = [...root.querySelectorAll('[data-battery-reserve]')];\r\n    const syncBatteryReserve = () => {\r\n      reserveButtons.forEach(button => {\r\n        button.setAttribute('aria-checked', String(state.reserveEnabled));\r\n        button.parentElement.querySelector('[data-reserve-label]').textContent = state.reserveEnabled ? reserveCopy.disable : reserveCopy.enable;\r\n      });\r\n      labels.recommendationBasis = state.reserveEnabled ? reserveCopy.on : reserveCopy.off;\r\n      root.querySelectorAll('[data-i18n=\"recommendationBasis\"]').forEach(node => { node.textContent = labels.recommendationBasis; });\r\n    };\r\n    syncBatteryReserve();\r\n    reserveButtons.forEach(button => button.addEventListener('click', () => {\r\n      state.reserveEnabled = !state.reserveEnabled;\r\n      syncBatteryReserve();\r\n      renderAll();\r\n    }));\r\n\r\n    const tripNumber = root.querySelector('[data-trip-days-number]');\r\n    const tripSliders = [...root.querySelectorAll('[data-trip-days], [data-summary-trip-days]')];\r\n    const tripNumbers = [...root.querySelectorAll('[data-trip-days-number], [data-summary-trip-days-number]')];\r\n    const daysToSliderPosition = (days) => days <= 7 ? (days - 0.5) / 6.5 * 70 : 70 + (days - 7) / 7 * 30;\r\n    const sliderPositionToDays = (position) => position <= 70 ? 0.5 + position / 70 * 6.5 : 7 + (position - 70) / 30 * 7;\r\n    let syncedTripDays = null;\r\n    const syncTripDays = (rawValue, render = true) => {\r\n      const numericValue = Number(String(rawValue).replace(',', '.'));\r\n      const boundedValue = Number.isFinite(numericValue) && String(rawValue).trim() !== '' ? numericValue : 1;\r\n      const days = clamp(Math.round(boundedValue * 2) / 2, 0.5, 14);\r\n      const changed = days !== syncedTripDays;\r\n      syncedTripDays = days;\r\n      tripSliders.forEach(slider => {\r\n        slider.value = String(daysToSliderPosition(days));\r\n        slider.setAttribute('aria-valuetext', formatNumber(days, 1) + ' ' + labels.daysUnit);\r\n      });\r\n      tripNumbers.forEach(number => { number.value = String(days); });\r\n      // Recalculate advice without replacing the focused duration controls.\r\n      if (render && changed) {\r\n          renderStatus(); renderResults();\r\n      }\r\n    };\r\n    syncTripDays(tripNumber?.value || 1, false);\r\n    tripNumbers.forEach(number => {\r\n      number.addEventListener('input', () => { if (number.value !== '') syncTripDays(number.value); });\r\n      number.addEventListener('change', () => syncTripDays(number.value));\r\n    });\r\n    tripSliders.forEach(slider => {\r\n      slider.addEventListener('input', () => syncTripDays(sliderPositionToDays(Number(slider.value))));\r\n      slider.addEventListener('keydown', (event) => {\r\n        slider.classList.add('is-interacting');\r\n        const current = Number(tripNumber?.value) || 1;\r\n        const next = { ArrowRight: current + 0.5, ArrowUp: current + 0.5, ArrowLeft: current - 0.5, ArrowDown: current - 0.5, Home: 0.5, End: 14, PageUp: current + 1, PageDown: current - 1 }[event.key];\r\n        if (next !== undefined) {\r\n          event.preventDefault();\r\n          syncTripDays(next);\r\n        }\r\n      });\r\n      slider.addEventListener('keyup', () => slider.classList.remove('is-interacting'));\r\n      slider.addEventListener('blur', () => slider.classList.remove('is-interacting'));\r\n    });\r\n\r\n    const renderResults = () => {\r\n      if (!resultMetrics.length) return;\r\n      const totals = getTotals();\r\n      const period = getTripEnergy(totals);\r\n\r\n      const groupNames = {\r\n        en: { setup: 'Selected Setup', needs: 'Appliances' },\r\n        nl: { setup: 'Geselecteerde Setup', needs: 'Apparaten' },\r\n        de: { setup: 'Ausgew\u00E4hltes Setup', needs: 'Ger\u00E4te' }\r\n      }[locale];\r\n      const metrics = [\r\n        [labels.output, totals.outputW, 'W', labels.output],\r\n        [labels.batteryCapacity, totals.batteryCapacity, 'Wh', labels.shortCapacity],\r\n        [tripEnergyLabels.solar, period.solarWh, 'Wh', tripEnergyLabels.solar],\r\n        [labels.peakPower, totals.peakW, 'W', labels.peakPower],\r\n        [tripEnergyLabels.consumption, period.consumptionWh, 'Wh', tripEnergyLabels.consumption]\r\n      ];\r\n      const hasStation = Boolean(getSelectedPowerStation());\r\n      const hasAppliances = state.devices.some((device) => device.active);\r\n      const hasSolar = Boolean(state.selectedSolarId && state.solarCount > 0);\r\n      const setupMetrics = hasSolar ? metrics.slice(0, 3) : metrics.slice(0, 2);\r\n      resultMetrics.forEach(metrics => { metrics.style.gridTemplateColumns = '2fr ' + setupMetrics.length + 'fr'; });\r\n      const helpText = {\r\n        en: 'Total consumption shows the estimated battery energy your appliance(s) need over your selected number of days. We multiply daily use by the selected duration and include estimated energy losses.',\r\n        nl: 'Totaal verbruik toont de geschatte accu-energie die je apparaten nodig hebben voor het gekozen aantal dagen. We vermenigvuldigen het dagelijks verbruik met de gekozen duur en nemen geschatte energieverliezen mee.',\r\n        de: 'Gesamtverbrauch zeigt die gesch\u00E4tzte Akkuenergie deiner Ger\u00E4te f\u00FCr die gew\u00E4hlte Anzahl an Tagen. Wir multiplizieren den t\u00E4glichen Verbrauch mit der gew\u00E4hlten Dauer und ber\u00FCcksichtigen gesch\u00E4tzte Energieverluste.'\r\n      }[locale];\r\n      const consumptionHelp = `<button type=\"button\" class=\"w21-power-calculator__consumption-help\" data-consumption-help data-help-text=\"${escapeHtml(helpText)}\" aria-label=\"${escapeHtml(tripEnergyLabels.consumption)} info\" aria-haspopup=\"dialog\"><svg viewBox=\"0 0 20 20\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\"/><g transform=\"translate(2 2) scale(.8)\"><path d=\"M7.5 7a2.5 2.5 0 0 1 5 .2c0 1.8-2.5 1.8-2.5 3.6\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><circle cx=\"10\" cy=\"14.3\" r=\"1\" fill=\"#fff\"/></g></svg></button>`;\r\n      const metricHelp = {\r\n        en: {\r\n          appliancePower: 'Only appliances set to On add to simultaneous power. Each selected appliance must also fit individually within the power station output. Switching Off does not remove daily energy consumption.',\r\n          stationPower: 'Power shows the rated output of your selected power station. Appliance(s) used at the same time must stay within this limit. Adding expansion batteries or solar panels does not increase the output.',\r\n          battery: `Battery shows the total capacity of your power station and expansion batteries. ${labels.recommendationBasis} Solar input is shown separately.`,\r\n          solar: 'Expected solar input shows expected generation over your selected number of days. Usable solar energy depends on daily consumption and battery storage; surplus generation cannot exceed available storage.'\r\n        },\r\n        nl: {\r\n          appliancePower: 'Alleen apparaten op Aan tellen samen mee in het gelijktijdige vermogen. Ieder geselecteerd apparaat moet ook afzonderlijk binnen het vermogen van de powerstation passen. Uitzetten verwijdert het dagelijkse energieverbruik niet.',\r\n          stationPower: 'Vermogen toont het nominale uitgangsvermogen van je powerstation. Apparaten die tegelijk werken moeten binnen deze grens blijven. Uitbreidingsaccu\u2019s en zonnepanelen verhogen dit vermogen niet.',\r\n          battery: `Accu toont de totale capaciteit van je powerstation en uitbreidingsaccu\u2019s. ${labels.recommendationBasis} Zonne-opbrengst staat apart.`,\r\n          solar: 'Verwachte zonne-opbrengst toont de verwachte opwekking voor het gekozen aantal dagen. Bruikbare zonne-energie hangt af van dagelijks verbruik en accuopslag; een overschot kan de beschikbare opslag niet overschrijden.'\r\n        },\r\n        de: {\r\n          appliancePower: 'Nur Ger\u00E4te auf Ein z\u00E4hlen zur gleichzeitigen Gesamtleistung. Jedes ausgew\u00E4hlte Ger\u00E4t muss auch einzeln zur Ausgangsleistung der Powerstation passen. Ausschalten entfernt den t\u00E4glichen Energieverbrauch nicht.',\r\n          stationPower: 'Leistung zeigt die Nennleistung deiner Powerstation. Gleichzeitig verwendete Ger\u00E4te m\u00FCssen innerhalb dieser Grenze bleiben. Zusatzakkus und Solarmodule erh\u00F6hen die Ausgangsleistung nicht.',\r\n          battery: `Akku zeigt die Gesamtkapazit\u00E4t deiner Powerstation und Zusatzakkus. ${labels.recommendationBasis} Solarertrag wird separat angezeigt.`,\r\n          solar: 'Erwarteter Solarertrag zeigt die erwartete Erzeugung f\u00FCr die gew\u00E4hlte Anzahl an Tagen. Nutzbare Solarenergie h\u00E4ngt vom t\u00E4glichen Verbrauch und Akkuspeicher ab; \u00DCbersch\u00FCsse k\u00F6nnen den verf\u00FCgbaren Speicher nicht \u00FCberschreiten.'\r\n        }\r\n      }[locale];\r\n      const makeMetricHelp = (title, text) => consumptionHelp\r\n        .replace('data-consumption-help', `data-consumption-help data-help-title=\"${escapeHtml(title)}\"`)\r\n        .replace(`data-help-text=\"${escapeHtml(helpText)}\"`, `data-help-text=\"${escapeHtml(text)}\"`)\r\n        .replace(`aria-label=\"${escapeHtml(tripEnergyLabels.consumption)} info\"`, `aria-label=\"${escapeHtml(title)} info\"`);\r\n      const metricCard = ([label, value, unit, shortLabel], index, hasData, group) => `\r\n        <div class=\"w21-power-calculator__result-card\">\r\n          <span data-short-label=\"${shortLabel}\">${label}${group === 'needs' ? makeMetricHelp(label, index === 0 ? metricHelp.appliancePower : helpText) : makeMetricHelp(label, index === 0 ? metricHelp.stationPower : index === 1 ? metricHelp.battery : metricHelp.solar)}</span>\r\n          <strong>${hasData ? formatNumber(value) + unit : '\u2013'}</strong>\r\n        </div>`;\r\n      const markup = `\r\n        <div class=\"w21-power-calculator__result-section\">\r\n          <div class=\"w21-power-calculator__result-group-heading\">${groupNames.needs}</div>\r\n          <div class=\"w21-power-calculator__result-group w21-power-calculator__result-group--needs\">\r\n          ${metrics.slice(3).map((metric, index) => metricCard(metric, index, hasAppliances, 'needs')).join('')}\r\n          </div>\r\n        </div>\r\n        <div class=\"w21-power-calculator__result-section\">\r\n          <div class=\"w21-power-calculator__result-group-heading\">${groupNames.setup}</div>\r\n          <div class=\"w21-power-calculator__result-group\" style=\"--metric-count: ${setupMetrics.length}\">\r\n          ${setupMetrics.map((metric, index) => metricCard(metric, index, hasStation)).join('')}\r\n          </div>\r\n        </div>\r\n      `;\r\n      resultMetrics.forEach(metrics => { metrics.innerHTML = markup; });\r\n    };\r\n\r\n    function addCustomDevice() {\r\n      markCustomScenario();\r\n      const usedNumbers = new Set(state.devices.filter(isCustomDevice).map((device) => Number(device.customNumber) || Number((device.defaultName || device.id).match(/(\\d+)$/)?.[1])));\r\n      let customNumber = 1;\r\n      while (usedNumbers.has(customNumber)) customNumber += 1;\r\n      state.customCount = customNumber;\r\n      const customId = `custom_${Date.now()}_${customNumber}`;\r\n      const defaultName = `${labels.customDeviceName} ${customNumber}`;\r\n      state.devices.push({ id: customId, isCustom: true, customNumber, name: defaultName, defaultName, nameCustomized: false, usageType: 'timed', watts: 0, hours: 0, minutes: 0, active: true, simultaneous: true, selectionOrder: ++state.selectionSequence });\r\n      renderAll();\r\n\r\n      window.requestAnimationFrame(() => {\r\n        const firstCustomInput = deviceGrid?.querySelector(`[data-device-id=\"${customId}\"] .w21-power-calculator__device-name-input`);\r\n        firstCustomInput?.focus();\r\n        firstCustomInput?.select();\r\n      });\r\n    }\r\n    const positionSunlightPicker = picker => {\r\n      const panel = picker.querySelector('[data-sunlight-popover]');\r\n      if (!panel || panel.hidden) return;\r\n      picker.classList.remove('opens-up');\r\n      panel.style.setProperty('--w21-sunlight-offset-x', '0px');\r\n      const anchor = picker.getBoundingClientRect();\r\n      const bounds = panel.getBoundingClientRect();\r\n      const panelHeight = bounds.height;\r\n      // The list is wider than the profile. Clamp it to the viewport instead\r\n      // of squeezing its region names into the width of the trigger row.\r\n      const gutter = 16;\r\n      const offset = Math.max(gutter, Math.min(bounds.left, window.innerWidth - gutter - bounds.width)) - bounds.left;\r\n      panel.style.setProperty('--w21-sunlight-offset-x', `${offset}px`);\r\n      // Keep a near-bottom profile chooser visible without moving the page.\r\n      picker.classList.toggle('opens-up', window.innerHeight - anchor.bottom < panelHeight + 16 && anchor.top > panelHeight + 16);\r\n    };\r\n    const setSunlightPickerOpen = (picker, open, returnFocus = false) => {\r\n      const panel = picker.querySelector('[data-sunlight-popover]');\r\n      const trigger = picker.querySelector('[data-sunlight-change]');\r\n      if (!panel || !trigger) return;\r\n      open = Boolean(open && !picker.hidden);\r\n      panel.hidden = !open;\r\n      picker.classList.toggle('is-open', open);\r\n      trigger.setAttribute('aria-expanded', String(open));\r\n      if (open) {\r\n        positionSunlightPicker(picker);\r\n        panel.querySelector('[aria-checked=\"true\"]')?.focus({ preventScroll: true });\r\n      } else {\r\n        picker.classList.remove('opens-up');\r\n        if (returnFocus && !picker.hidden) trigger.focus({ preventScroll: true });\r\n      }\r\n    };\r\n    const renderSolarRegions = () => {\r\n      const regionNames = { north: labels.northEurope, south: labels.southEurope, custom: labels.custom };\r\n      solarRegionButtons.forEach((button) => {\r\n        const isActive = button.dataset.solarRegion === state.solarRegion;\r\n        button.classList.toggle('is-active', isActive);\r\n        button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\r\n        const regionSwitch = button.querySelector('.w21-power-calculator__switch');\r\n        regionSwitch?.setAttribute('aria-pressed', isActive ? 'true' : 'false');\r\n        regionSwitch?.setAttribute('aria-label', `${labels.selectRegion} ${regionNames[button.dataset.solarRegion]}`);\r\n      });\r\n      root.querySelectorAll('[data-sunlight-name]').forEach(el => { el.textContent = regionNames[state.solarRegion] || regionNames.north; });\r\n      const displayedSunHours = state.solarSunHours.toLocaleString(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 });\r\n      root.querySelectorAll('[data-sunlight-hours]').forEach(el => { el.textContent = displayedSunHours; });\r\n      customSolarHoursInputs.forEach(input => {\r\n        if (input !== document.activeElement) input.value = solarRegions.custom.practicalSunHours.toFixed(1);\r\n      });\r\n      sunlightPickers.forEach(picker => {\r\n        picker.querySelectorAll('[data-sunlight-choice]').forEach(choice => {\r\n          const active = choice.dataset.sunlightChoice === state.solarRegion;\r\n          choice.classList.toggle('is-active', active);\r\n          choice.setAttribute('aria-checked', String(active));\r\n          choice.tabIndex = active ? 0 : -1;\r\n          choice.querySelector('[data-sunlight-choice-hours]').textContent = solarRegions[choice.dataset.sunlightChoice].practicalSunHours.toLocaleString(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 });\r\n        });\r\n        const trigger = picker.querySelector('[data-sunlight-change]');\r\n        trigger.setAttribute('aria-label', `${labels.changeSunlightProfile}: ${regionNames[state.solarRegion]} \u2014 ${displayedSunHours} h`);\r\n        trigger.title = labels.changeSunlightProfile;\r\n        const custom = state.solarRegion === 'custom';\r\n        picker.classList.toggle('is-custom-profile', custom);\r\n        picker.querySelector('[data-sunlight-preset]').hidden = custom;\r\n        const field = picker.querySelector('[data-sunlight-custom]');\r\n        if (field) field.hidden = !custom;\r\n      });\r\n      const solarEnabled = root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true';\r\n      const solarSelected = Boolean(state.selectedSolarId && state.solarCount > 0);\r\n      if (sunlightTemplate) sunlightTemplate.hidden = !solarSelected;\r\n      const showResultProfile = solarEnabled && (solarSelected || Boolean(currentRecommendation?.solar));\r\n      root.querySelectorAll('[data-results-sunlight]').forEach(profile => { profile.hidden = !showResultProfile; });\r\n      sunlightPickers.forEach(picker => {\r\n        if (picker.hidden) setSunlightPickerOpen(picker, false);\r\n        else positionSunlightPicker(picker);\r\n      });\r\n    };\r\n    let summaryPositionFrame = 0;\r\n    const updateMobileCartDock = () => {\r\n      if (mobileResultsMedia.matches) {\r\n        calculatorSection.style.setProperty('--w21-mobile-cart-height', '0px');\r\n        return;\r\n      }\r\n      calculatorSection.style.removeProperty('--w21-mobile-cart-height');\r\n    };\r\n    const syncSummaryPosition = () => {\r\n      summaryPositionFrame = 0;\r\n      if (!summaryShell || !summaryPanel) return;\r\n      if (!floatingResultsEnabled) {\r\n        summaryShell.classList.remove('is-visible', 'is-at-section-end');\r\n        calculatorSection.style.setProperty('--w21-summary-height', '0px');\r\n        return;\r\n      }\r\n\r\n      updateMobileCartDock();\r\n      const summaryHeight = Math.ceil(summaryShell.getBoundingClientRect().height);\r\n      const calculatorIsOpen = calculatorContent ? !calculatorContent.hidden : true;\r\n\r\n      calculatorSection.style.setProperty('--w21-summary-height', `${summaryHeight}px`);\r\n      calculatorSection.classList.remove('is-summary-at-end');\r\n      summaryShell.classList.toggle('is-visible', calculatorIsOpen);\r\n      summaryShell.classList.remove('is-at-section-end');\r\n    };\r\n    const queueSummaryPosition = () => {\r\n      if (!floatingResultsEnabled || summaryPositionFrame) return;\r\n      summaryPositionFrame = window.requestAnimationFrame(syncSummaryPosition);\r\n    };\r\n    const renderAll = () => { cleanupCompatibility(); ensureRecommendedSetup(); rememberSolarSelection(); renderSolarRegions(); renderAudienceTabs(); renderProducts(); renderDeviceGrid(); renderStatus(); renderResults(); queueSummaryPosition(); };\r\n\r\n    root.querySelectorAll('[data-next-step]').forEach((button) => button.addEventListener('click', () => setStep(state.step + 1)));\r\n    root.querySelectorAll('[data-prev-step]').forEach((button) => button.addEventListener('click', () => setStep(state.step - 1)));\r\n    sunlightPickers.forEach(picker => {\r\n      const choices = Array.from(picker.querySelectorAll('[data-sunlight-choice]'));\r\n      const choose = choice => {\r\n        const region = solarRegions[choice.dataset.sunlightChoice];\r\n        if (!region) return;\r\n        state.solarRegion = choice.dataset.sunlightChoice;\r\n        state.solarSunHours = region.practicalSunHours;\r\n        // Profile changes do not detach automatic product advice or edit a manual setup.\r\n        renderAll();\r\n      };\r\n      picker.querySelector('[data-sunlight-change]').addEventListener('click', () => {\r\n        const open = picker.querySelector('[data-sunlight-popover]').hidden;\r\n        sunlightPickers.forEach(other => { if (other !== picker) setSunlightPickerOpen(other, false); });\r\n        setSunlightPickerOpen(picker, open);\r\n      });\r\n      picker.querySelector('[data-sunlight-close]').addEventListener('click', () => setSunlightPickerOpen(picker, false, true));\r\n      choices.forEach(choice => {\r\n        choice.addEventListener('click', () => {\r\n          choose(choice);\r\n          setSunlightPickerOpen(picker, false, true);\r\n          if (choice.dataset.sunlightChoice === 'custom' && !picker.hidden) picker.querySelector('[data-custom-solar-hours]').focus({ preventScroll: true });\r\n        });\r\n        choice.addEventListener('keydown', event => {\r\n          const index = choices.indexOf(choice);\r\n          let next;\r\n          if (event.key === 'ArrowDown' || event.key === 'ArrowRight') next = choices[(index + 1) % choices.length];\r\n          if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') next = choices[(index + choices.length - 1) % choices.length];\r\n          if (event.key === 'Home') next = choices[0];\r\n          if (event.key === 'End') next = choices[choices.length - 1];\r\n          if (!next) return;\r\n          event.preventDefault();\r\n          choose(next);\r\n          next.focus({ preventScroll: true });\r\n        });\r\n      });\r\n      picker.addEventListener('keydown', event => {\r\n        if (event.key !== 'Escape' || picker.querySelector('[data-sunlight-popover]').hidden) return;\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n        setSunlightPickerOpen(picker, false, true);\r\n      });\r\n      picker.addEventListener('focusout', event => {\r\n        if (!picker.contains(event.relatedTarget)) setSunlightPickerOpen(picker, false);\r\n      });\r\n    });\r\n    document.addEventListener('pointerdown', event => {\r\n      sunlightPickers.forEach(picker => { if (!picker.contains(event.target)) setSunlightPickerOpen(picker, false); });\r\n    });\r\n    window.addEventListener('resize', () => sunlightPickers.forEach(positionSunlightPicker));\r\n    document.addEventListener('scroll', () => sunlightPickers.forEach(positionSunlightPicker), true);\r\n    solarRegionButtons.forEach((button) => button.addEventListener('click', (event) => {\r\n      const region = solarRegions[button.dataset.solarRegion];\r\n      if (!region) return;\r\n      state.solarRegion = button.dataset.solarRegion;\r\n      state.solarSunHours = region.practicalSunHours;\r\n      if (mobileResultsMedia.matches && !event.target.closest('input')) {\r\n        const profile = button.closest('[data-results-sunlight]');\r\n        if (profile) {\r\n          profile.classList.remove('is-profile-open');\r\n          profile.querySelector('[data-sunlight-disclosure]')?.setAttribute('aria-expanded', 'false');\r\n        } else {\r\n          root.classList.remove('is-sunlight-open');\r\n          sunlightDisclosure?.setAttribute('aria-expanded', 'false');\r\n        }\r\n      }\r\n      renderAll();\r\n    }));\r\n    solarRegionButtons.forEach((button) => button.addEventListener('keydown', (event) => {\r\n      if (button.tagName === 'BUTTON' || event.target.closest('input') || (event.key !== 'Enter' && event.key !== ' ')) return;\r\n      event.preventDefault();\r\n      button.click();\r\n    }));\r\n    customSolarHoursInputs.forEach(input => {\r\n      input.addEventListener('input', () => {\r\n        const practicalSunHours = clamp(Number(input.value.replace(',', '.')) || 0, 0, 12);\r\n        solarRegions.custom.practicalSunHours = practicalSunHours;\r\n        state.solarRegion = 'custom';\r\n        state.solarSunHours = practicalSunHours;\r\n        renderAll();\r\n      });\r\n      input.addEventListener('change', () => {\r\n        input.value = solarRegions.custom.practicalSunHours.toFixed(1);\r\n      });\r\n    });\r\n    summaryToggle?.addEventListener('click', () => {\r\n      if (summaryShell?.classList.contains('is-at-section-end')) return;\r\n      const willOpen = !root.classList.contains('is-summary-open');\r\n      if (willOpen) { summaryHoverSuppressed = false; setSummaryOpen(true, true); }\r\n      else closeSummary();\r\n    });\r\n\r\n    disclaimerToggle?.addEventListener('click', () => {\r\n      const willOpen = !root.classList.contains('is-disclaimer-open');\r\n      root.classList.toggle('is-disclaimer-open', willOpen);\r\n      disclaimerToggle.setAttribute('aria-expanded', String(willOpen));\r\n      window.requestAnimationFrame(queueSummaryPosition);\r\n    });\r\n\r\n    const processCopy = {\r\n      en: { label: 'Calculator steps', long: ['Choose your appliances', 'View your setup & price'], short: ['Appliances', 'Setup & price'] },\r\n      nl: { label: 'Configuratiestappen', long: ['Kies je apparaten', 'Bekijk je setup & prijs'], short: ['Apparaten', 'Setup & prijs'] },\r\n      de: { label: 'Konfigurationsschritte', long: ['W\u00E4hle deine Ger\u00E4te', 'Setup & Preis ansehen'], short: ['Ger\u00E4te', 'Setup & Preis'] }\r\n    }[locale];\r\n    if (introProcess) {\r\n      introProcess.setAttribute('aria-label', processCopy.label);\r\n      ['long', 'short'].forEach(length => {\r\n        introProcess.querySelectorAll(`[data-process-${length}]`).forEach(label => {\r\n          label.textContent = processCopy[length][Number(label.getAttribute(`data-process-${length}`)) - 1];\r\n        });\r\n      });\r\n    }\r\n    const introSteps = {\r\n      en: [[\"Add your appliance(s)\",\"Set their power and daily usage time.\"],[\"Result\",\"Set your trip duration and compare suitable setups.\"],[\"Mix & Match\",\"Choose your power station and optional solar panels.\"],[labels.offerTitle,labels.offerIntro]],\r\n      nl: [[\"Voeg je apparaten toe\",\"Stel het vermogen en de dagelijkse gebruiksduur in.\"],[\"Resultaat\",\"Stel je reisduur in en vergelijk passende setups.\"],[\"Mix & Match\",\"Kies je powerstation en optionele zonnepanelen.\"],[labels.offerTitle,labels.offerIntro]],\r\n      de: [[\"Ger\u00E4te hinzuf\u00FCgen\",\"Stelle Leistung und t\u00E4gliche Nutzungsdauer ein.\"],[\"Ergebnis\",\"Stelle deine Reisedauer ein und vergleiche passende Setups.\"],[\"Mix & Match\",\"W\u00E4hle deine Powerstation und optionale Solarmodule.\"],[labels.offerTitle,labels.offerIntro]]\r\n    }[locale];\r\n    if (compactFlow) {\r\n      introSteps[1] = {\r\n        en: ['Result & price', 'Set your duration, review your setup and see your price.'],\r\n        nl: ['Resultaat & prijs', 'Stel je duur in, bekijk je setup en zie je prijs.'],\r\n        de: ['Ergebnis & Preis', 'Stelle deine Dauer ein, pr\u00FCfe dein Setup und sieh den Preis.']\r\n      }[locale];\r\n    }\r\n    calculatorSection.querySelectorAll('[data-intro-step]').forEach(card => {\r\n      const step = Number(card.dataset.introStep);\r\n      const [title, description] = introSteps[step - 1];\r\n      card.querySelector('.w21-power-calculator__intro-step-title').textContent = title;\r\n      card.querySelector('.w21-power-calculator__intro-step-description').textContent = description;\r\n      card.querySelector('[data-intro-step-label]').textContent = { en: 'Step', nl: 'Stap', de: 'Schritt' }[locale] + ' ' + step;\r\n    });\r\n    if (calculatorDisclosureLabel && calculatorContent?.hidden) calculatorDisclosureLabel.textContent = labels.calculateSetup;\r\n    let disclosureTransitionFrame = 0;\r\n    const setCalculatorExpanded = (willOpen, openAppliances = false) => {\r\n      if (!calculatorContent) return;\r\n\r\n      // Click state changes are immediate; restore normal hover transitions\r\n      // only after the new state has been resolved by the browser.\r\n      window.cancelAnimationFrame(disclosureTransitionFrame);\r\n      calculatorDisclosure?.classList.add('is-changing-state');\r\n      calculatorContent.hidden = !willOpen;\r\n      calculatorSection.classList.toggle('is-expanded', willOpen);\r\n      calculatorDisclosure?.setAttribute('aria-expanded', String(willOpen));\r\n      calculatorStart?.setAttribute('aria-expanded', String(willOpen));\r\n      if (calculatorDisclosureLabel) {\r\n        calculatorDisclosureLabel.textContent = willOpen ? labels.closeCalculator : labels.calculateSetup;\r\n      }\r\n      if (calculatorDisclosure) void window.getComputedStyle(calculatorDisclosure).color;\r\n      disclosureTransitionFrame = window.requestAnimationFrame(() => {\r\n        calculatorDisclosure?.classList.remove('is-changing-state');\r\n        disclosureTransitionFrame = 0;\r\n      });\r\n\r\n      if (willOpen) {\r\n        closeSummary();\r\n        // Inputs already keep the results current. Opening changes visibility,\r\n        // not the setup, so preserve existing cards and focused input nodes.\r\n        setStep(1, { render: false });\r\n        window.requestAnimationFrame(() => {\r\n          if (calculatorContent.hidden) return;\r\n          queueSummaryPosition();\r\n          fitOfferFields();\r\n          const behavior = window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\r\n          root.querySelector('[data-step-panel=\"1\"] .w21-power-calculator__usage-main')?.scrollIntoView({ behavior, block: 'start' });\r\n        });\r\n        if (openAppliances && !state.devices.some(device => device.active) && !state.selectedPowerStationId && !state.selectedSolarId) {\r\n          // Keep the selected workspace as the return point when Done closes\r\n          // the drawer, rather than jumping back up to the intro button.\r\n          const trigger = deviceGrid?.querySelector('[data-open-appliance-drawer]');\r\n          trigger?.focus({ preventScroll: true });\r\n          openApplianceDrawer(trigger || calculatorDisclosure);\r\n        }\r\n      } else {\r\n        closeApplianceDrawer(false);\r\n        closeSummary();\r\n        calculatorSection.classList.remove('is-summary-at-end');\r\n        summaryShell?.classList.remove('is-visible', 'is-at-section-end');\r\n        calculatorSection.querySelector('[data-calculator-intro]')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n      }\r\n    };\r\n    calculatorDisclosure?.addEventListener('click', () => {\r\n      const willOpen = calculatorContent?.hidden !== false;\r\n      setCalculatorExpanded(willOpen, willOpen);\r\n    });\r\n    // Step 1 is an entry point, never a second toggle: clicking it while open\r\n    // returns to appliances without hiding the calculator or rebuilding inputs.\r\n    calculatorStart?.addEventListener('click', () => setCalculatorExpanded(true, true));\r\n\r\n    powerDisclosure?.addEventListener('click', () => {\r\n      const willOpen = !root.classList.contains('is-power-picker-open');\r\n      root.classList.toggle('is-power-picker-open', willOpen);\r\n      powerProductGrid.hidden = !willOpen;\r\n      powerDisclosure.setAttribute('aria-expanded', String(willOpen));\r\n      if (powerMobileLabel) powerMobileLabel.textContent = willOpen ? cartCopy.hidePower : cartCopy.power;\r\n      queueSummaryPosition();\r\n    });\r\n\r\n    expansionDisclosure?.addEventListener('click', () => {\r\n      if (state.selectedPowerStationId !== 'move_1800') return;\r\n      selectionIsManual = true;\r\n      state.expansionCount = 1;\r\n      renderAll();\r\n    });\r\n\r\n    root.querySelectorAll('[data-sunlight-disclosure]').forEach(disclosure => disclosure.addEventListener('click', () => {\r\n      const profile = disclosure.closest('[data-results-sunlight]');\r\n      const container = profile || root;\r\n      const className = profile ? 'is-profile-open' : 'is-sunlight-open';\r\n      const willOpen = !container.classList.contains(className);\r\n      container.classList.toggle(className, willOpen);\r\n      disclosure.setAttribute('aria-expanded', String(willOpen));\r\n      queueSummaryPosition();\r\n    }));\r\n\r\n    solarDisclosure?.addEventListener('click', () => {\r\n      if (!solarOptions) return;\r\n      if (mobileResultsMedia.matches) {\r\n        const willOpen = !root.classList.contains('is-solar-picker-open');\r\n        root.classList.toggle('is-solar-picker-open', willOpen);\r\n        root.classList.remove('is-sunlight-open');\r\n        sunlightDisclosure?.setAttribute('aria-expanded', 'false');\r\n        solarOptions.hidden = !willOpen && !state.selectedSolarId;\r\n        solarDisclosure.setAttribute('aria-expanded', String(willOpen));\r\n        if (solarDisclosureLabel) solarDisclosureLabel.textContent = labels.addSolarPanels;\r\n        queueSummaryPosition();\r\n        return;\r\n      }\r\n\r\n      const willOpen = solarOptions.hidden;\r\n      solarOptions.hidden = !willOpen;\r\n      solarDisclosure.setAttribute('aria-expanded', String(willOpen));\r\n      if (solarDisclosureLabel) solarDisclosureLabel.textContent = willOpen ? labels.hideSolarPanels : labels.addSolarPanels;\r\n      queueSummaryPosition();\r\n    });\r\n\r\n    window.addEventListener('scroll', queueSummaryPosition, { passive: true });\r\n    window.addEventListener('resize', queueSummaryPosition, { passive: true });\r\n    mobileResultsMedia.addEventListener?.('change', queueSummaryPosition);\r\n    if ('ResizeObserver' in window && summaryPanel) {\r\n      new ResizeObserver(queueSummaryPosition).observe(summaryPanel);\r\n    }\r\n\r\n    stepButtons.forEach((button) => button.addEventListener('click', () => setStep(Number(button.dataset.stepButton))));\r\n\r\n    // One calculation per shop origin, shared across page/locale paths. Keep\r\n    // inputs, not catalogue metadata, prices, stock, results or cart responses.\r\n    const calculationStorageKey = 'w21-power-calculator:calculation:v1';\r\n    const calculationLifetime = 24 * 60 * 60 * 1000;\r\n    const getCalculationInputs = () => ({\r\n      audienceId: state.audienceId,\r\n      devices: state.devices.map(device => ({\r\n        id: device.id,\r\n        active: Boolean(device.active),\r\n        simultaneous: Boolean(device.simultaneous),\r\n        simultaneousConfigured: Boolean(device.simultaneousConfigured),\r\n        selectionOrder: device.selectionOrder,\r\n        ...(isCustomDevice(device) ? { name: device.name, nameCustomized: Boolean(device.nameCustomized) } : {}),\r\n        ...(device.usageType === 'charges'\r\n          ? { batteryWh: device.batteryWh, charges: device.charges }\r\n          : { watts: device.watts, hours: device.hours, minutes: device.minutes })\r\n      })),\r\n      settings: {\r\n        days: syncedTripDays ?? 1,\r\n        reserveEnabled: state.reserveEnabled,\r\n        solarEnabled: root.querySelector('[data-solar-advice]')?.getAttribute('aria-checked') === 'true',\r\n        solarRegion: state.solarRegion,\r\n        customSunHours: solarRegions.custom.practicalSunHours\r\n      },\r\n      setup: { ...getSetupSelection(), manual: selectionIsManual },\r\n      rememberedSolar: rememberedSolarSelection,\r\n      accessories: [...accessoryQuantities].filter(([, entry]) => entry.edited).map(([ean, entry]) => ({ ean, quantity: entry.quantity }))\r\n    });\r\n    const restoreCalculation = () => {\r\n      try {\r\n        const stored = window.localStorage.getItem(calculationStorageKey);\r\n        if (!stored) return;\r\n        const removeStored = () => window.localStorage.removeItem(calculationStorageKey);\r\n        if (stored.length > 512000) { removeStored(); return; }\r\n        const saved = JSON.parse(stored);\r\n        const age = Date.now() - saved?.updatedAt;\r\n        if (saved?.version !== 1 || !Number.isFinite(saved.updatedAt) || age < 0 || age >= calculationLifetime ||\r\n          !saved.inputs || !Array.isArray(saved.inputs.devices) || saved.inputs.devices.length > 1000) {\r\n          removeStored(); return;\r\n        }\r\n        const input = saved.inputs;\r\n        const bounded = (value, fallback, maximum, step = 1) => typeof value === 'number' && Number.isFinite(value)\r\n          ? clamp(step > 0 ? Math.round(value / step) * step : value, 0, maximum) : fallback;\r\n        const deviceById = new Map(state.devices.map(device => [device.id, device]));\r\n        const seen = new Set();\r\n        input.devices.forEach((record, index) => {\r\n          if (!record || typeof record.id !== 'string' || seen.has(record.id)) return;\r\n          seen.add(record.id);\r\n          let device = deviceById.get(record.id);\r\n          if (!device && /^custom_\\d{1,16}_[1-9]\\d{0,4}$/.test(record.id)) {\r\n            const customNumber = Number(record.id.split('_').at(-1));\r\n            const defaultName = `${labels.customDeviceName} ${customNumber}`;\r\n            device = { id: record.id, isCustom: true, customNumber, name: defaultName, defaultName, nameCustomized: false, usageType: 'timed', watts: 0, hours: 0, minutes: 0 };\r\n            state.devices.push(device);\r\n            state.customCount = Math.max(state.customCount, customNumber);\r\n          }\r\n          if (!device) return; // Removed catalogue entries are not resurrected.\r\n          device.active = record.active === true;\r\n          device.simultaneous = device.active && record.simultaneous === true;\r\n          device.simultaneousConfigured = record.simultaneousConfigured === true;\r\n          device.selectionOrder = device.active ? bounded(record.selectionOrder, index + 1, 1000000000) || index + 1 : null;\r\n          if (isCustomDevice(device)) {\r\n            device.nameCustomized = record.nameCustomized === true;\r\n            device.name = device.nameCustomized && typeof record.name === 'string' ? record.name.slice(0, 500) : device.defaultName;\r\n          }\r\n          if (device.usageType === 'charges') {\r\n            device.batteryWh = bounded(record.batteryWh, device.batteryWh, 99999);\r\n            device.charges = bounded(record.charges, device.charges, 99999, 0.5);\r\n          } else {\r\n            device.watts = bounded(record.watts, device.watts, 99999);\r\n            device.hours = bounded(record.hours, device.hours, 24);\r\n            device.minutes = device.hours >= 24 ? 0 : bounded(record.minutes, device.minutes, 59);\r\n          }\r\n        });\r\n        state.audienceId = input.audienceId === 'custom' || audiences.some(audience => audience.id === input.audienceId) ? input.audienceId : '';\r\n        const settings = input.settings || {};\r\n        state.reserveEnabled = settings.reserveEnabled !== false;\r\n        syncBatteryReserve();\r\n        const solarEnabled = settings.solarEnabled !== false;\r\n        syncSolarAdvice(solarEnabled);\r\n        state.solarRegion = ['north', 'south', 'custom'].includes(settings.solarRegion) ? settings.solarRegion : 'north';\r\n        solarRegions.custom.practicalSunHours = bounded(settings.customSunHours, 7, 12, 0);\r\n        state.solarSunHours = solarRegions[state.solarRegion].practicalSunHours;\r\n        syncTripDays(bounded(settings.days, 1, 14, 0.5), false);\r\n        const setup = input.setup || {};\r\n        state.selectedPowerStationId = powerStations.some(station => station.id === setup.selectedPowerStationId) && bounded(setup.stationCount, 0, 1) > 0 ? setup.selectedPowerStationId : '';\r\n        state.stationCount = state.selectedPowerStationId ? maxStationQuantity : 0;\r\n        state.expansionCount = bounded(setup.expansionCount, 0, expansionBattery.maxQuantity);\r\n        state.selectedSolarId = solarEnabled && solarPanels.some(panel => panel.id === setup.selectedSolarId) ? setup.selectedSolarId : '';\r\n        state.solarCount = state.selectedSolarId ? bounded(setup.solarCount, 0, maxProductQuantity) : 0;\r\n        selectionIsManual = setup.manual === true;\r\n        const remembered = input.rememberedSolar;\r\n        rememberedSolarSelection = remembered && solarPanels.some(panel => panel.id === remembered.id)\r\n          ? { id: remembered.id, count: bounded(remembered.count, 0, maxProductQuantity) } : null;\r\n        if (Array.isArray(input.accessories)) input.accessories.slice(0, 1000).forEach(entry => {\r\n          if (!entry || typeof entry.ean !== 'string' || !/^\\d{1,32}$/.test(entry.ean) || typeof entry.quantity !== 'number' || !Number.isFinite(entry.quantity)) return;\r\n          accessoryQuantities.set(entry.ean, { quantity: normalizeAccessoryQuantity(entry.quantity), edited: true, kind: '' });\r\n        });\r\n      } catch (error) {\r\n        // Storage may be blocked or malformed. Never make the calculator depend\r\n        // on it, and only remove this calculator's own invalid record.\r\n        try { window.localStorage.removeItem(calculationStorageKey); } catch (ignored) { /* Browser policy. */ }\r\n      }\r\n    };\r\n    state.devices = cloneDevices(state.audienceId);\r\n    restoreCalculation();\r\n    syncSelectionSequence();\r\n    setStep(1);\r\n\r\n    // Initialize the comparison after rendering, so restoring/recalculating,\r\n    // opening, closing and revisiting never extend the 24-hour lifetime.\r\n    let lastCalculationInputs = JSON.stringify(getCalculationInputs());\r\n    let calculationSaveTimer;\r\n    const flushCalculation = () => {\r\n      window.clearTimeout(calculationSaveTimer);\r\n      calculationSaveTimer = null;\r\n      const inputs = getCalculationInputs();\r\n      const serialized = JSON.stringify(inputs);\r\n      if (serialized === lastCalculationInputs) return;\r\n      try {\r\n        window.localStorage.setItem(calculationStorageKey, JSON.stringify({ version: 1, updatedAt: Date.now(), inputs }));\r\n        lastCalculationInputs = serialized;\r\n      } catch (error) { /* Quota/private-mode restrictions must not affect inputs. */ }\r\n    };\r\n    const queueCalculationSave = () => {\r\n      window.clearTimeout(calculationSaveTimer);\r\n      calculationSaveTimer = window.setTimeout(flushCalculation, 200);\r\n    };\r\n    // Capture before handlers can replace a clicked card. The deferred save\r\n    // reads the resulting shared state, including drawer and keyboard changes.\r\n    ['input', 'change', 'click', 'keydown'].forEach(type => calculatorSection.addEventListener(type, queueCalculationSave, true));\r\n    window.addEventListener('pagehide', flushCalculation);\r\n    document.addEventListener('visibilitychange', () => { if (document.hidden) flushCalculation(); });\r\n    queueSummaryPosition();\r\n  };\r\n  const initializeWithin = (container) => container.querySelectorAll('.w21-power-calculator__app[data-section-id]').forEach(initializeCalculator);\r\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => initializeWithin(document), { once: true });\r\n  else initializeWithin(document);\r\n  document.addEventListener('shopify:section:load', (event) => initializeWithin(event.target));\r\n})();\r\n"],
  "mappings": "CAAC,IAAM,CAGL,MAAM,eAAiB,mCACjB,wBAA0B,CAAC,MAAO,OAAQ,MAAQ,CACtD,MAAM,QAAU,QAAU,UAAY,KAAK,MAAM,OAAS,CAAC,EAAI,EAC3D,QAAU,YAAc,KAAK,MAAM,MAAM,EAAI,KAAK,MAAM,MAAM,EAClE,OAAO,OAAO,SAAS,OAAO,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,OAAO,CAAC,EAAI,CAC1E,EACA,GAAI,OAAO,mCAAqC,eAAgB,CAC9D,MAAM,qBAAwB,OAAU,CACtC,MAAM,MAAQ,MAAM,OACpB,GAAI,EAAE,iBAAiB,kBAAmB,OAC1C,MAAM,KAAO,MAAM,QAAQ,8EAA8E,EACzG,GAAI,CAAC,MAAQ,CAAC,CAAC,QAAS,QAAS,UAAW,YAAa,SAAS,EAAE,SAAS,MAAM,QAAQ,KAAK,EAAG,OACnG,MAAM,MAAQ,KAAK,cAAc,2BAA2B,EACtD,QAAU,KAAK,cAAc,6BAA6B,EAC1D,aAAe,CAAC,YAAa,SAAS,EAAE,SAAS,MAAM,QAAQ,KAAK,EACpE,IAAM,CAAC,QAAS,YAAa,SAAS,EAAE,SAAS,MAAM,QAAQ,KAAK,EAAI,MAAQ,MAAM,QAAQ,QAAU,QAAU,GAAK,OAAO,OAAO,KAAK,GAAK,GAAK,EAAI,GAI9J,GAHA,MAAM,IAAM,IACZ,MAAM,IAAM,OAAO,GAAG,EACtB,MAAM,KAAO,MAAM,QAAQ,QAAU,UAAY,MAAQ,IACrD,MAAM,QAAU,GAAI,CACtB,MAAM,OAAS,OAAO,MAAM,KAAK,EAE3B,QAAU,cAAgB,MAAM,OAAS,SAC3C,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,OAAO,SAAS,MAAM,EAAI,OAAS,CAAC,CAAC,EAC/D,wBAAwB,MAAM,QAAQ,MAAO,OAAQ,GAAG,EACxD,SAAW,UAAS,MAAM,MAAQ,OAAO,OAAO,EACtD,CACA,GAAI,OAAS,QAAS,CACpB,MAAM,QAAU,OAAO,MAAM,KAAK,GAAK,GACvC,QAAQ,IAAM,QAAU,IAAM,KAC9B,QAAQ,SAAW,QACf,SAAW,QAAQ,QAAU,MAC/B,QAAQ,MAAQ,IAEhB,QAAQ,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EAE/D,CACA,KAAK,QAAQ,eAAiB,cAChC,EACA,SAAS,iBAAiB,QAAS,qBAAsB,EAAI,EAC7D,SAAS,iBAAiB,SAAU,qBAAsB,EAAI,EAC9D,SAAS,iBAAiB,UAAW,qBAAsB,EAAI,EAC/D,OAAO,iCAAmC,cAC5C,CACA,GAAI,OAAO,+BAAgC,OAC3C,OAAO,+BAAiC,GACxC,MAAM,qBAAwB,MAAS,CACrC,GAAI,CAAC,MAAQ,KAAK,QAAQ,cAAgB,OAAQ,OAClD,KAAK,QAAQ,YAAc,OAE3B,MAAM,OAAS,CAAC,KAAM,IAAI,EAAE,SAAS,KAAK,QAAQ,MAAM,EAAI,KAAK,QAAQ,OAAS,KAG5E,kBAAoB,KAAO,CAC/B,MAAM,MAAQ,IAAI,cAAc,OAAO,EACvC,IAAI,iBAAiB,oBAAoB,EAAE,QAAQ,QAAU,CAAE,OAAO,SAAW,MAAM,QAAU,CAAC,CACpG,EACA,IAAI,WAAa,KACjB,MAAM,eAAiB,OAAS,CAC1B,CAAC,YAAe,OAAO,YAAc,QAAa,MAAM,YAAc,WAAW,YACrF,OAAO,aAAa,WAAW,KAAK,EACpC,WAAa,KACf,EACA,OAAO,iBAAiB,YAAa,eAAgB,EAAI,EACzD,OAAO,iBAAiB,gBAAiB,eAAgB,EAAI,EAC7D,OAAO,iBAAiB,OAAQ,IAAM,eAAe,CAAC,EACtD,SAAS,iBAAiB,mBAAoB,IAAM,CAAM,SAAS,QAAQ,eAAe,CAAG,CAAC,EAC9F,MAAM,iBAAmB,OAAS,CAChC,MAAM,IAAM,MAAM,cAClB,GAAI,IAAI,cAAc,oBAAoB,EAAG,OAC7C,MAAM,QAAU,SAAS,cAAc,MAAM,EAC7C,QAAQ,UAAY,uCACpB,MAAM,aAAe,CAAE,GAAI,CAAC,WAAY,UAAU,EAAG,GAAI,CAAC,WAAY,UAAU,EAAG,GAAI,CAAC,aAAW,YAAY,CAAE,EAAE,MAAM,EACzH,CAAC,EAAG,EAAE,EAAE,QAAQ,CAAC,UAAW,QAAU,CACpC,MAAM,OAAS,SAAS,cAAc,QAAQ,EAC9C,OAAO,KAAO,SACd,OAAO,QAAQ,WAAa,OAAO,SAAS,EAC5C,OAAO,aAAa,aAAc,GAAG,aAAa,KAAK,CAAC,KAAK,MAAM,aAAa,YAAY,GAAK,EAAE,EAAE,EACrG,OAAO,UAAY,uDAAuD,YAAc,EAAI,gBAAkB,eAAe,YAC7H,IAAI,eAAiB,GACrB,MAAM,UAAY,IAAM,CACtB,GAAI,CAAC,MAAM,aAAe,CAAC,OAAO,aAAe,MAAM,UAAY,MAAM,UAAY,OAAO,SAAU,MAAO,GAC7G,MAAM,SAAW,MAAM,MAEvB,OADA,MAAM,OAAO,SAAS,EAClB,MAAM,QAAU,SAAiB,IACrC,MAAM,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EACzD,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EACnD,GACT,EACA,OAAO,iBAAiB,cAAe,OAAS,CAO9C,GANA,MAAM,eAAe,EACjB,MAAM,SAAW,GAAK,MAAM,YAAc,IAC5C,CAAC,MAAM,QAAQ,8CAA8C,IAC/D,MAAM,gBAAgB,EACtB,eAAe,EACf,eAAiB,GACb,CAAC,UAAU,GAAG,OAClB,MAAM,KAAO,CAAE,OAAQ,UAAW,MAAM,UAAW,MAAO,IAAK,EAC/D,WAAa,KACb,MAAM,OAAS,IAAM,CACnB,GAAI,aAAe,KACnB,IAAI,CAAC,KAAK,aAAe,CAAC,UAAU,EAAG,CAAE,eAAe,EAAG,MAAQ,CACnE,KAAK,MAAQ,OAAO,WAAW,OAAQ,EAAE,EAC3C,EACA,KAAK,MAAQ,OAAO,WAAW,OAAQ,GAAG,CAC5C,CAAC,EACD,OAAO,iBAAiB,eAAgB,OAAS,CAC3C,YAAY,SAAW,QAAQ,eAAe,KAAK,CACzD,CAAC,EACD,OAAO,iBAAiB,cAAe,OAAS,CAC1C,MAAM,QAAQ,8CAA8C,GAAG,MAAM,eAAe,CAC1F,CAAC,EACD,OAAO,iBAAiB,QAAS,OAAS,CAKxC,GAJA,MAAM,eAAe,EACrB,MAAM,gBAAgB,EAGlB,MAAM,OAAS,GAAK,eAAgB,CAAE,eAAiB,GAAO,MAAQ,CAC1E,eAAiB,GACjB,UAAU,CACZ,CAAC,EACD,QAAQ,YAAY,MAAM,CAC5B,CAAC,EACD,IAAI,YAAY,OAAO,EACvB,kBAAkB,GAAG,CACvB,EACA,KAAK,iBAAiB,iFAAiF,EAAE,QAAQ,gBAAgB,EACjI,KAAK,iBAAiB,QAAS,OAAS,CACtC,GAAI,EAAE,MAAM,kBAAkB,kBAAmB,QACnC,MAAM,OAAO,QAAQ,8CAA8C,GAAK,MAAM,OAAO,eAC7F,iBAAiB,0CAA0C,EAAE,QAAQ,iBAAiB,CAC9F,CAAC,EACD,MAAM,aAAe,CACnB,GAAI,CACF,aAAc,0BAA2B,WAAY,8BAA0B,UAAW,0GAA2G,cAAe,sBAAuB,aAAc,4BAA6B,aAAc,2BAA4B,cAAe,gCAAiC,eAAgB,2BAA4B,gBAAiB,yBAA0B,MAAO,QAAS,WAAY,aAAc,OAAQ,SAAU,MAAO,SAAU,MAAO,SAAU,MAAO,SAAU,QAAS,qGAAsG,gBAAiB,oBAAqB,mBAAoB,uBAAwB,aAAc,gBAAiB,aAAc,YAAa,oBAAqB,wBAAyB,eAAgB,qBAAsB,kBAAmB,wBAAyB,gBAAiB,sBAAuB,WAAY,cAAe,OAAQ,SAAU,gBAAiB,mBAAoB,YAAa,eAAgB,YAAa,eAAgB,OAAQ,SAAU,KAAM,OAAQ,KAAM,OAAQ,cAAe,sBAAuB,aAAc,yGAA0G,kBAAmB,0BAA2B,iBAAkB,mFAAoF,cAAe,mCAAoC,MAAO,QAAS,YAAa,eAAgB,aAAc,gBAAiB,WAAY,mbAChlD,YAAa,eAAgB,YAAa,kDAAmD,cAAe,4CAA6C,WAAY,OAAQ,aAAc,OAAQ,eAAgB,qBAAsB,cAAe,oBAAqB,SAAU,YAAa,WAAY,cAAe,aAAc,oBAAqB,gBAAiB,mBAAoB,cAAe,iBAAkB,UAAW,aAAc,MAAO,QAAS,QAAS,UAAW,cAAe,kBAAmB,OAAQ,SAAU,MAAO,OAAQ,gBAAiB,uBAAwB,mBAAoB,sBAAuB,uBAAwB,gCAAiC,cAAe,8BAA+B,iBAAkB,mBAAoB,WAAY,aAAc,cAAe,6CAA8C,SAAU,WAAY,SAAU,WAAY,OAAQ,SAAU,cAAe,iBAAkB,cAAe,cAAe,QAAS,MAAO,yBAA0B,+CAAgD,gBAAiB,8BAA+B,oBAAqB,8BAA+B,yBAA0B,uDAAwD,WAAY,uBAAwB,eAAgB,iCAAkC,aAAc,yBAA0B,iBAAkB,iCAAkC,UAAW,4BAA6B,cAAe,oCAAqC,iBAAkB,qBAAsB,eAAgB,kBAAmB,gBAAiB,oBAAqB,YAAa,cAC3nD,EACA,GAAI,CACF,aAAc,yBAA0B,WAAY,wBAAyB,UAAW,kIAAmI,cAAe,8BAA+B,aAAc,6BAA8B,aAAc,yCAA0C,cAAe,+BAAgC,eAAgB,2BAA4B,gBAAiB,yBAA0B,MAAO,QAAS,WAAY,YAAa,OAAQ,YAAa,MAAO,SAAU,MAAO,SAAU,MAAO,SAAU,QAAS,+GAAgH,gBAAiB,wBAAyB,mBAAoB,sBAAuB,aAAc,eAAgB,aAAc,WAAY,oBAAqB,4BAA6B,eAAgB,2BAA4B,kBAAmB,yBAA0B,gBAAiB,uBAAwB,WAAY,cAAe,OAAQ,OAAQ,gBAAiB,kBAAmB,YAAa,eAAgB,YAAa,cAAe,OAAQ,YAAa,KAAM,WAAY,KAAM,QAAS,cAAe,wBAAyB,aAAc,6HAA8H,kBAAmB,iCAAkC,iBAAkB,kGAAmG,cAAe,oCAAqC,MAAO,QAAS,YAAa,kBAAmB,aAAc,mBAAoB,WAAY,ydAC5sD,YAAa,sBAAuB,YAAa,kEAAmE,cAAe,4DAA6D,WAAY,OAAQ,aAAc,OAAQ,eAAgB,4BAA6B,cAAe,wBAAyB,SAAU,qBAAsB,WAAY,kBAAmB,aAAc,6BAA8B,gBAAiB,iBAAkB,cAAe,kBAAmB,UAAW,eAAgB,MAAO,OAAQ,QAAS,UAAW,cAAe,sBAAuB,OAAQ,YAAa,MAAO,OAAQ,gBAAiB,0BAA2B,mBAAoB,0BAA2B,uBAAwB,4CAA6C,cAAe,mCAAoC,iBAAkB,iBAAkB,WAAY,aAAc,cAAe,qDAAsD,SAAU,eAAgB,SAAU,aAAc,OAAQ,WAAY,cAAe,mBAAoB,cAAe,kBAAmB,QAAS,MAAO,yBAA0B,iEAAkE,gBAAiB,mCAAoC,oBAAqB,+BAAgC,yBAA0B,oEAAqE,WAAY,gCAAiC,eAAgB,gCAAiC,aAAc,4BAA6B,iBAAkB,6BAA8B,UAAW,uCAAwC,cAAe,wBAAyB,iBAAkB,mBAAoB,eAAgB,kBAAmB,gBAAiB,oBAAqB,YAAa,kBAC/xD,EACA,GAAI,CACF,aAAc,8BAA+B,WAAY,6BAA8B,UAAW,iJAAyI,cAAe,wBAAyB,aAAc,qCAAmC,aAAc,+BAA6B,cAAe,4CAA6C,eAAgB,6BAA8B,gBAAiB,4BAA0B,MAAO,QAAS,WAAY,YAAU,OAAQ,WAAY,MAAO,YAAa,MAAO,YAAa,MAAO,YAAa,QAAS,sGAAoG,gBAAiB,6BAA2B,mBAAoB,wBAAyB,aAAc,eAAgB,aAAc,aAAc,oBAAqB,2BAAyB,eAAgB,8BAA4B,kBAAmB,yBAA0B,gBAAiB,yBAA0B,WAAY,aAAc,OAAQ,eAAa,gBAAiB,oBAAqB,YAAa,aAAc,YAAa,eAAa,OAAQ,oBAAqB,KAAM,SAAU,KAAM,YAAU,cAAe,gCAA2B,aAAc,wMAAuL,kBAAmB,qCAAmC,iBAAkB,2GAAmG,cAAe,0CAAwC,MAAO,kBAAgB,YAAa,uBAAqB,aAAc,0BAAwB,WAAY,+cAC/yD,YAAa,qBAAmB,YAAa,sEAAiE,cAAe,kEAA0D,WAAY,WAAS,aAAc,WAAS,eAAgB,+BAA6B,cAAe,iCAA+B,SAAU,yBAAuB,WAAY,cAAe,aAAc,6BAA2B,gBAAiB,mBAAiB,cAAe,oBAAkB,UAAW,kBAAmB,MAAO,UAAW,QAAS,UAAW,cAAe,0BAAwB,OAAQ,cAAe,MAAO,OAAQ,gBAAiB,iCAA4B,mBAAoB,2BAAsB,uBAAwB,6CAA2C,cAAe,sCAAiC,iBAAkB,mBAAiB,WAAY,aAAc,cAAe,wDAAsD,SAAU,gBAAc,SAAU,eAAa,OAAQ,WAAY,cAAe,8BAAyB,cAAe,cAAe,QAAS,MAAO,yBAA0B,+DAA6D,gBAAiB,0CAAwC,oBAAqB,kCAAmC,yBAA0B,uEAAkE,WAAY,iCAA4B,eAAgB,4BAA0B,aAAc,iCAA4B,iBAAkB,6BAA2B,UAAW,0CAAqC,cAAe,0BAAqB,iBAAkB,oBAAqB,eAAgB,kBAAmB,gBAAiB,qBAAsB,YAAa,2BAC7vD,CACF,EACM,OAAS,CAAE,GAAG,aAAa,GAAI,GAAG,aAAa,MAAM,CAAE,EACvD,oBAAsB,CAC1B,GAAI,CAAE,aAAc,eAAgB,WAAY,+BAAgC,eAAgB,mBAAoB,gBAAiB,kBAAmB,EACxJ,GAAI,CAAE,aAAc,eAAgB,WAAY,2BAA4B,eAAgB,mBAAoB,gBAAiB,kBAAmB,EACpJ,GAAI,CAAE,aAAc,eAAgB,WAAY,+BAAgC,eAAgB,kBAAmB,gBAAiB,sBAAoB,CAC1J,EAAE,MAAM,EACR,OAAO,OAAO,OAAQ,mBAAmB,EACzC,MAAM,qBAAuB,CAC3B,GAAI,CAAE,YAAa,eAAgB,cAAe,UAAW,cAAe,gBAAiB,eAAgB,OAAQ,EACrH,GAAI,CAAE,YAAa,eAAgB,cAAe,WAAY,cAAe,aAAc,eAAgB,UAAW,EACtH,GAAI,CAAE,YAAa,eAAgB,cAAe,OAAQ,cAAe,iBAAkB,eAAgB,UAAW,CACxH,EAAE,MAAM,EACR,OAAO,OAAO,qBAAsB,CAClC,GAAI,CACF,iBAAkB,gCAAiC,eAAgB,sBAAuB,sBAAuB,UACjH,YAAa,+PACb,oBAAqB,CACnB,CAAE,QAAS,sBAAuB,MAAO,CAAC,kDAA4C,CAAE,EACxF,CAAE,QAAS,kBAAmB,MAAO,CAAC,4DAAoD,6EAAuE,CAAE,CACrK,EACA,UAAW,4KACX,iBAAkB,sVACpB,EACA,GAAI,CACF,iBAAkB,+BAAgC,eAAgB,oBAAqB,sBAAuB,SAC9G,YAAa,iPACb,oBAAqB,CACnB,CAAE,QAAS,sBAAuB,MAAO,CAAC,qDAAkD,CAAE,EAC9F,CAAE,QAAS,iBAAkB,MAAO,CAAC,0DAAwD,oEAAiE,CAAE,CAClK,EACA,UAAW,mKACX,iBAAkB,oTACpB,EACA,GAAI,CACF,iBAAkB,8BAAyB,eAAgB,sBAAoB,sBAAuB,UACtG,YAAa,wRACb,oBAAqB,CACnB,CAAE,QAAS,qBAAsB,MAAO,CAAC,sDAAmD,CAAE,EAC9F,CAAE,QAAS,gBAAiB,MAAO,CAAC,4DAA0D,qFAA+E,CAAE,CACjL,EACA,UAAW,8LACX,iBAAkB,sVACpB,CACF,EAAE,MAAM,CAAC,EACT,OAAO,OAAO,OAAQ,oBAAoB,EAC1C,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,MAAO,SAAU,iBAAkB,SAAU,gBAAiB,mHAAoH,cAAe,iBAAkB,oBAAqB,oDAAqD,eAAgB,oCAAqC,0BAA2B,iEAAkE,oBAAqB,kEAAmE,eAAgB,sGAAuG,EACpoB,GAAI,CAAE,MAAO,SAAU,iBAAkB,YAAa,gBAAiB,oHAAqH,cAAe,gBAAiB,oBAAqB,2DAA4D,eAAgB,wCAAyC,0BAA2B,kEAAmE,oBAAqB,qEAAgE,eAAgB,yGAA0G,EACnpB,GAAI,CAAE,MAAO,YAAa,iBAAkB,WAAY,gBAAiB,6GAA2G,cAAe,gBAAiB,oBAAqB,oEAA+D,eAAgB,2CAAyC,0BAA2B,uEAAqE,oBAAqB,gFAA2E,eAAgB,oIAA4H,CAC/qB,EAAE,MAAM,CAAC,EACT,OAAO,oBAAsB,CAC3B,GAAI,wHACJ,GAAI,uIACJ,GAAI,kJACN,EAAE,MAAM,EACR,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,kBAAmB,wBAAyB,mBAAoB,wBAAyB,EAC/F,GAAI,CAAE,kBAAmB,2BAA4B,mBAAoB,2BAA4B,EACrG,GAAI,CAAE,kBAAmB,yBAA0B,mBAAoB,0BAA2B,CACpG,EAAE,MAAM,CAAC,EACT,OAAO,YAAc,OAAO,mBAC5B,OAAO,SAAW,CAAE,GAAI,OAAQ,GAAI,QAAS,GAAI,MAAO,EAAE,MAAM,EAChE,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,SAAU,YAAa,gBAAiB,qFAAsF,oBAAqB,2IAA4I,EACrS,GAAI,CAAE,SAAU,wBAAyB,gBAAiB,sFAAuF,oBAAqB,+IAAgJ,EACtT,GAAI,CAAE,SAAU,iBAAkB,gBAAiB,kHAA6G,oBAAqB,qJAAmJ,CAC1U,EAAE,MAAM,CAAC,EACT,OAAO,oBAAsB,CAC3B,GAAI,sJACJ,GAAI,gKACJ,GAAI,2JACN,EAAE,MAAM,EACR,OAAO,uBAAyB,CAC9B,GAAI,2FACJ,GAAI,sGACJ,GAAI,sGACN,EAAE,MAAM,EACR,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,kBAAmB,uBAAwB,eAAgB,wBAAyB,MAAO,SAAU,eAAgB,6BAA8B,cAAe,qGAAsG,EAC9Q,GAAI,CAAE,kBAAmB,2BAA4B,eAAgB,+BAAgC,MAAO,SAAU,eAAgB,4BAA6B,cAAe,kHAAmH,EACrS,GAAI,CAAE,kBAAmB,4BAA6B,eAAgB,uCAAkC,MAAO,YAAa,eAAgB,+BAA6B,cAAe,qIAAgI,CAC1T,EAAE,MAAM,CAAC,EACT,MAAM,0BAA4B,CAChC,GAAI,CAAE,UAAW,uBAAwB,IAAK,yBAA0B,OAAQ,oBAAqB,SAAU,0CAA2C,EAC1J,GAAI,CAAE,UAAW,2BAA4B,IAAK,8BAA+B,OAAQ,kBAAmB,SAAU,2DAA4D,EAClL,GAAI,CAAE,UAAW,qBAAmB,IAAK,4BAA0B,OAAQ,mBAAiB,SAAU,oDAA+C,CACvJ,EAAE,MAAM,EAER,OAAO,MAAQ,CAAE,GAAI,SAAU,GAAI,SAAU,GAAI,WAAY,EAAE,MAAM,EACrE,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,UAAW,SAAU,WAAY,qBAAsB,WAAY,sDAAuD,UAAW,gBAAiB,WAAY,oBAAqB,cAAe,oEAAqE,oBAAqB,kBAAmB,SAAU,YAAa,WAAY,oCAAqC,cAAe,WAAY,UAAW,OAAQ,aAAc,kBAAmB,iBAAkB,kBAAmB,iBAAkB,gCAAiC,iBAAkB,iDAAkD,kBAAmB,qEAAsE,SAAU,oBAAqB,YAAa,qBAAiB,WAAY,gBAAiB,WAAY,mDAAoD,WAAY,4EAA6E,kBAAmB,0EAA2E,EACthC,GAAI,CAAE,UAAW,SAAU,WAAY,qBAAsB,WAAY,yEAA0E,UAAW,oBAAqB,WAAY,oBAAqB,cAAe,gFAAiF,oBAAqB,gBAAiB,SAAU,qBAAsB,WAAY,2CAA4C,cAAe,SAAU,UAAW,WAAY,aAAc,iBAAkB,iBAAkB,yBAA0B,iBAAkB,iDAAkD,iBAAkB,6DAA8D,kBAAmB,2FAA4F,SAAU,iCAAkC,YAAa,wBAAoB,WAAY,6BAA8B,WAAY,2DAA4D,WAAY,uGAAwG,kBAAmB,2FAA4F,EACntC,GAAI,CAAE,UAAW,YAAa,WAAY,qBAAsB,WAAY,uEAAkE,UAAW,uBAAqB,WAAY,yBAA0B,cAAe,2EAAyE,oBAAqB,qBAAsB,SAAU,oBAAqB,WAAY,6CAA2C,cAAe,SAAU,UAAW,eAAa,aAAc,gBAAiB,iBAAkB,qBAAsB,iBAAkB,0CAA2C,iBAAkB,iEAA4D,kBAAmB,8FAAsF,SAAU,yBAA0B,YAAa,kCAA2B,WAAY,eAAgB,WAAY,4DAA0D,WAAY,gHAA2G,kBAAmB,gHAAwG,CAC3rC,EAAE,MAAM,CAAC,EACT,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,cAAe,WAAY,eAAgB,cAAe,eAAgB,aAAc,eAAgB,aAAc,cAAe,oBAAqB,cAAe,oBAAqB,mBAAoB,6BAA8B,EACtP,GAAI,CAAE,cAAe,YAAa,eAAgB,0BAA2B,eAAgB,iBAAkB,eAAgB,cAAe,cAAe,iBAAkB,cAAe,iBAAkB,mBAAoB,+BAA6B,EACjQ,GAAI,CAAE,cAAe,eAAa,eAAgB,2BAA4B,eAAgB,gBAAc,eAAgB,iBAAkB,cAAe,oBAAkB,cAAe,oBAAqB,mBAAoB,6BAA8B,CACvQ,EAAE,MAAM,CAAC,EACT,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,SAAU,YAAa,sBAAuB,0BAA2B,sBAAuB,0BAA2B,qBAAsB,gCAAiC,EACxL,GAAI,CAAE,SAAU,UAAW,sBAAuB,yBAA0B,sBAAuB,0BAA2B,qBAAsB,4BAA6B,EACjL,GAAI,CAAE,SAAU,gBAAiB,sBAAuB,8BAA4B,sBAAuB,iCAA+B,qBAAsB,uCAAqC,CACvM,EAAE,MAAM,CAAC,EACT,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,oBAAqB,0BAA2B,wBAAyB,qEAAsE,uBAAwB,qBAAsB,2BAA4B,6CAA8C,kBAAmB,WAAY,kBAAmB,WAAY,gBAAiB,qBAAsB,iBAAkB,2GAA4G,sBAAuB,kFAAmF,EAC1lB,GAAI,CAAE,oBAAqB,2BAA4B,wBAAyB,sEAAiE,uBAAwB,0BAAsB,2BAA4B,0DAA2D,kBAAmB,WAAY,kBAAmB,YAAa,gBAAiB,sBAAuB,iBAAkB,mHAAoH,sBAAuB,uHAAwH,EAClpB,GAAI,CAAE,oBAAqB,gCAA2B,wBAAyB,oFAAkF,uBAAwB,oBAAqB,2BAA4B,0DAAwD,kBAAmB,cAAY,kBAAmB,WAAY,gBAAiB,6BAA2B,iBAAkB,gIAAiI,sBAAuB,0HAA+G,CACvqB,EAAE,MAAM,CAAC,EACT,KAAK,QAAQ,uBAAuB,GAAG,iBAAiB,aAAa,EAAE,QAAS,SAAY,CAC1F,MAAM,YAAc,OAAO,QAAQ,QAAQ,IAAI,EAC3C,cAAa,QAAQ,YAAc,YACzC,CAAC,EACD,KAAK,QAAQ,uBAAuB,GAAG,iBAAiB,kBAAkB,EAAE,QAAS,SAAY,CAC/F,MAAM,YAAc,OAAO,QAAQ,QAAQ,QAAQ,EAC/C,cAAa,QAAQ,UAAY,YACvC,CAAC,EACD,KAAK,QAAQ,uBAAuB,GAAG,iBAAiB,wBAAwB,EAAE,QAAS,SAAY,CACrG,MAAM,YAAc,OAAO,QAAQ,QAAQ,aAAa,EACpD,aAAa,QAAQ,aAAa,aAAc,WAAW,CACjE,CAAC,EAED,OAAO,OAAO,OAAQ,CACpB,YAAa,eACb,YAAa,kDACb,cAAe,4CACf,WAAY,OACZ,aAAc,OACd,eAAgB,qBAChB,cAAe,oBACf,SAAU,YACV,WAAY,cACZ,aAAc,oBACd,gBAAiB,mBACjB,cAAe,iBACf,UAAW,aACX,MAAO,QACP,QAAS,UACT,cAAe,kBACf,OAAQ,SACR,MAAO,OACP,gBAAiB,uBACjB,mBAAoB,sBACpB,uBAAwB,gCACxB,cAAe,8BACf,iBAAkB,mBAClB,WAAY,aACZ,cAAe,6CACf,SAAU,WACV,SAAU,WACV,OAAQ,SACR,cAAe,iBACf,cAAe,cACf,QAAS,MACT,yBAA0B,+CAC1B,gBAAiB,8BACjB,oBAAqB,8BACrB,yBAA0B,sDAC5B,EAAG,aAAa,MAAM,CAAC,EAGvB,OAAO,OAAO,OAAQ,oBAAqB,oBAAoB,EAC/D,OAAO,OAAO,OAAQ,CACpB,OAAQ,SAAW,KAAO,WAAa,SAAW,KAAO,YAAW,SACpE,gBAAiB,SAAW,KAAO,aAAe,SAAW,KAAO,aAAe,aACnF,iBAAkB,SAAW,KAAO,8BAAgC,SAAW,KAAO,gCAA+B,qBACrH,kBAAmB,SAAW,KAAO,oCAAiC,SAAW,KAAO,yBAA2B,+BACnH,kBAAmB,SAAW,KAAO,4BAA8B,SAAW,KAAO,2BAA0B,+BAC/G,aAAc,SAAW,KAAO,YAAc,SAAW,KAAO,eAAc,SAC7E,oBAAqB,SAAW,KAAO,6BAA+B,SAAW,KAAO,0BAA4B,wBACpH,mBAAoB,SAAW,KAAO,4BAA8B,SAAW,KAAO,yBAA2B,uBACjH,cAAe,SAAW,KAAO,aAAe,SAAW,KAAO,eAAc,WAChF,WAAY,SAAW,KAAO,MAA0B,QACxD,iBAAkB,SAAW,KAAO,WAAa,SAAW,KAAO,YAAc,cACjF,cAAe,SAAW,KAAO,yBAA2B,SAAW,KAAO,yBAA2B,wBACzG,cAAe,SAAW,KAAO,uBAAyB,SAAW,KAAO,2BAA0B,wBACtG,uBAAwB,SAAW,KAAO,qCAAuC,SAAW,KAAO,uCAAyC,+BAC5I,sBAAuB,SAAW,KAAO,oCAAsC,SAAW,KAAO,2CAA0C,8BAC3I,wBAAyB,SAAW,KAAO,qCAAuC,SAAW,KAAO,6CAA4C,+BACnJ,CAAC,EACD,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,OAAQ,QAAS,SAAU,UAAW,cAAe,UAAW,cAAe,UAAW,UAAW,QAAS,aAAc,cAAe,oBAAqB,cAAe,gBAAiB,UAAW,WAAY,cAAe,WAAY,aAAc,EACtQ,GAAI,CAAE,OAAQ,WAAY,SAAU,OAAQ,cAAe,OAAQ,cAAe,OAAQ,UAAW,WAAY,aAAc,WAAY,oBAAqB,kBAAmB,gBAAiB,OAAQ,WAAY,kBAAmB,WAAY,iBAAkB,EACzQ,GAAI,CAAE,OAAQ,WAAY,SAAU,OAAQ,cAAe,OAAQ,cAAe,OAAQ,UAAW,WAAY,aAAc,YAAa,oBAAqB,cAAe,gBAAiB,OAAQ,WAAY,cAAe,WAAY,aAAc,CAChQ,EAAE,MAAM,CAAC,EACT,MAAM,cAAgB,CAAE,kBAAmB,OAAO,iBAAkB,mBAAoB,OAAO,eAAgB,mBAAoB,OAAO,eAAgB,EACpJ,SAAW,6IACX,UAAY,2FACZ,UAAY,wGACZ,qBAAuB,SAAS,eAAe,yBAA2B,KAAK,QAAQ,SAAS,EACtG,IAAI,mBAAqB,CAAC,EAC1B,GAAI,CACF,mBAAqB,KAAK,MAAM,sBAAsB,aAAe,IAAI,CAC3E,OAAS,MAAO,CACd,QAAQ,KAAK,4DAA6D,KAAK,CACjF,CACA,MAAM,kBAAoB,OAAO,YAAY,CAC3C,CAAC,WAAY,gCAAgC,EAC7C,CAAC,YAAa,iCAAiC,EAC/C,CAAC,YAAa,iCAAiC,EAC/C,CAAC,YAAa,6BAA6B,EAC3C,CAAC,OAAQ,qCAAqC,EAC9C,CAAC,OAAQ,qCAAqC,EAC9C,CAAC,OAAQ,qCAAqC,CAChD,EAAE,IAAI,CAAC,CAAC,GAAI,KAAK,IAAM,CAAC,GAAI,CAAE,MAAO,IAAK,GAAI,MAAO,GAAI,QAAS,GAAI,GAAG,mBAAmB,EAAE,CAAE,CAAC,CAAC,CAAC,EAC7F,UAAY,CAChB,CAAE,GAAI,oBAAqB,KAAM,oBAAqB,EACtD,CAAE,GAAI,qBAAsB,KAAM,iBAAkB,EACpD,CAAE,GAAI,qBAAsB,KAAM,mBAAoB,CACxD,EAEM,mBAAqB,CACzB,kBAAmB,CAAC,eAAgB,QAAS,gBAAiB,QAAQ,EACtE,mBAAoB,CAAC,eAAgB,QAAS,gBAAiB,SAAU,MAAO,wBAAwB,EACxG,mBAAoB,CAAC,eAAgB,QAAS,gBAAiB,SAAU,MAAO,yBAA0B,uBAAwB,gBAAgB,CACpJ,EAEM,cAAgB,CACpB,CAAE,GAAI,WAAY,YAAa,WAAY,OAAQ,IAAK,SAAU,IAAK,gBAAiB,CAAC,MAAM,EAAG,oBAAqB,EAAM,EAC7H,CAAE,GAAI,YAAa,YAAa,YAAa,OAAQ,KAAM,SAAU,KAAM,gBAAiB,CAAC,OAAQ,OAAQ,MAAM,EAAG,oBAAqB,EAAK,EAChJ,CAAE,GAAI,YAAa,YAAa,YAAa,OAAQ,IAAM,SAAU,KAAM,gBAAiB,CAAC,OAAQ,OAAQ,MAAM,EAAG,oBAAqB,EAAM,CACnJ,EAAE,IAAK,OAAU,CAAE,GAAG,KAAM,GAAG,kBAAkB,KAAK,EAAE,EAAG,KAAM,kBAAkB,KAAK,EAAE,EAAE,MAAO,YAAa,KAAK,WAAY,EAAE,EAE7H,iBAAmB,CAAE,GAAI,YAAa,GAAG,kBAAkB,UAAW,KAAM,kBAAkB,UAAU,MAAO,YAAa,gBAAiB,SAAU,KAAM,YAAa,CAAE,EAC5K,YAAc,CAClB,CAAE,GAAI,OAAQ,YAAa,OAAQ,MAAO,GAAI,EAC9C,CAAE,GAAI,OAAQ,YAAa,OAAQ,MAAO,GAAI,EAC9C,CAAE,GAAI,OAAQ,YAAa,OAAQ,MAAO,GAAI,CAChD,EAAE,IAAK,OAAU,CAAE,GAAG,KAAM,GAAG,kBAAkB,KAAK,EAAE,EAAG,KAAM,kBAAkB,KAAK,EAAE,EAAE,MAAO,YAAa,KAAK,WAAY,EAAE,EAE7H,kBAAoB,CACxB,SAAU,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,CAAE,EACtC,UAAW,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,CAAE,EACvC,UAAW,CAAE,KAAM,EAAG,KAAM,EAAG,KAAM,CAAE,CACzC,EAIM,iBAAmB,IAAI,IAAI,CAAC,WAAW,CAAC,EAC9C,IAAI,gBAAkB,GACtB,MAAM,oBAAuB,SAAY,CACvC,iBAAiB,MAAM,EACnB,SAAS,iBAAiB,IAAI,OAAO,CAC3C,EAEM,aAAe,CACnB,MAAO,CAAE,kBAAmB,CAAI,EAChC,MAAO,CAAE,kBAAmB,GAAI,EAChC,OAAQ,CAAE,kBAAmB,CAAI,CACnC,EAGM,mBAAqB,MACrB,mBAAqB,EACrB,MAAQ,CAAE,KAAM,EAAG,WAAY,GAAI,uBAAwB,GAAI,aAAc,EAAG,eAAgB,EAAG,gBAAiB,GAAI,WAAY,EAAG,QAAS,CAAC,EAAG,YAAa,EAAG,kBAAmB,EAAG,YAAa,QAAS,cAAe,aAAa,MAAM,kBAAmB,eAAgB,EAAK,EAChS,IAAI,yBAA2B,KAG3B,kBAAoB,GACpB,sBAAwB,KAC5B,MAAM,uBAAyB,IAAM,CAC/B,MAAM,iBAAmB,MAAM,WAAa,IAC9C,yBAA2B,CAAE,GAAI,MAAM,gBAAiB,MAAO,MAAM,UAAW,EAEpF,EACM,kBAAoB,KAAO,CAC/B,uBAAwB,MAAM,uBAC9B,aAAc,MAAM,aACpB,eAAgB,MAAM,eACtB,gBAAiB,MAAM,gBACvB,WAAY,MAAM,UACpB,GACM,UAAY,CAAC,EAAG,IAAM,CAAC,yBAA0B,eAAgB,iBAAkB,kBAAmB,YAAY,EAAE,MAAO,KAAQ,EAAE,GAAG,IAAM,EAAE,GAAG,CAAC,EACpJ,wBAA0B,SAAW,CACzC,uBAAwB,OAAO,QAAQ,GACvC,aAAc,mBACd,eAAgB,OAAO,eACvB,gBAAiB,OAAO,OAAO,MAAM,IAAM,GAC3C,WAAY,OAAO,OAAO,UAAY,CACxC,GACM,mBAAqB,IAAM,CAAE,MAAM,WAAa,QAAU,EAChE,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,YAAa,eAAgB,UAAW,aAAc,SAAU,WAAY,EAClF,GAAI,CAAE,YAAa,eAAgB,UAAW,eAAgB,SAAU,SAAU,EAClF,GAAI,CAAE,YAAa,iBAAkB,UAAW,gBAAiB,SAAU,eAAgB,CAC7F,EAAE,MAAM,CAAC,EAET,MAAM,YAAc,MAAM,KAAK,KAAK,iBAAiB,oBAAoB,CAAC,EACpE,OAAS,MAAM,KAAK,KAAK,iBAAiB,mBAAmB,CAAC,EAC9D,aAAe,KAAK,cAAc,sBAAsB,EACxD,iBAAmB,KAAK,cAAc,2BAA2B,EACjE,iBAAmB,KAAK,cAAc,2BAA2B,EAGjE,iBAAmB,KAAK,cAAc,qCAAqC,EACjF,KAAK,iBAAiB,wBAAwB,EAAE,QAAQ,CAAC,SAAU,QAAU,CAC3E,GAAI,CAAC,kBAAoB,SAAS,cAAc,wBAAwB,EAAG,OAC3E,MAAM,QAAU,iBAAiB,UAAU,EAAI,EAC/C,QAAQ,gBAAgB,mBAAmB,EAC3C,QAAQ,aAAa,wBAAyB,EAAE,EAChD,QAAQ,OAAS,GACjB,MAAM,IAAM,IAAI,IAChB,QAAQ,iBAAiB,MAAM,EAAE,QAAQ,IAAM,CAAE,MAAM,SAAW,GAAG,GAAI,GAAG,IAAM,YAAc,MAAO,IAAI,IAAI,SAAU,GAAG,EAAE,CAAG,CAAC,EAClI,QAAQ,iBAAiB,2CAA2C,EAAE,QAAQ,IAAM,CAClF,CAAC,gBAAiB,kBAAmB,KAAK,EAAE,QAAQ,MAAQ,CAAM,GAAG,aAAa,IAAI,GAAG,GAAG,aAAa,KAAM,GAAG,aAAa,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,IAAM,IAAI,IAAI,EAAE,GAAK,EAAE,EAAE,KAAK,GAAG,CAAC,CAAG,CAAC,CAC5L,CAAC,EACD,QAAQ,iBAAiB,uCAAuC,EAAE,QAAQ,IAAM,GAAG,OAAO,CAAC,EAC3F,SAAS,YAAY,OAAO,EAC5B,QAAQ,iBAAiB,sBAAsB,EAAE,QAAQ,gBAAgB,CAC3E,CAAC,EACD,MAAM,mBAAqB,MAAM,KAAK,KAAK,iBAAiB,qBAAqB,CAAC,EAC5E,gBAAkB,MAAM,KAAK,KAAK,iBAAiB,wBAAwB,CAAC,EAC5E,uBAAyB,MAAM,KAAK,KAAK,iBAAiB,2BAA2B,CAAC,EAC5F,KAAK,iBAAiB,kDAAkD,EAAE,QAAQ,OAAS,CACzF,MAAM,aAAa,aAAc,OAAO,QAAQ,EAChD,MAAM,QAAQ,wBAAwB,EAAE,cAAc,wBAAwB,EAAE,YAAc,OAAO,SACrG,iBAAiB,KAAK,CACxB,CAAC,EACD,MAAM,WAAa,KAAK,cAAc,oBAAoB,EACpD,cAAgB,CAAC,KAAK,cAAc,qBAAqB,CAAC,EAAE,OAAO,OAAO,EAC1E,cAAgB,KAAK,cAAc,uBAAuB,EAC1D,iBAAmB,KAAK,cAAc,0BAA0B,EAChE,aAAe,KAAK,cAAc,sBAAsB,EACxD,cAAgB,KAAK,cAAc,uBAAuB,EAC1D,cAAgB,KAAK,cAAc,uBAAuB,EAC1D,eAAiB,KAAK,cAAc,wBAAwB,EAC5D,aAAe,KAAK,cAAc,sBAAsB,EACxD,aAAe,KAAK,cAAc,sBAAsB,EACxD,kBAAoB,KAAK,cAAc,2BAA2B,EAClE,cAAgB,KAAK,cAAc,uBAAuB,EAC1D,aAAe,CAAC,cAAe,KAAK,cAAc,2BAA2B,CAAC,EAAE,OAAO,OAAO,EAC9F,eAAiB,IAAI,IAAI,aAAa,IAAI,OAAS,CAAC,MAAO,MAAM,cAAc,wBAAwB,CAAC,CAAC,CAAC,EAC1G,iBAAmB,KAAK,cAAc,0BAA0B,EAChE,mBAAqB,OAAO,WAAW,oBAAoB,EAC3D,kBAAoB,KAAK,QAAQ,uBAAuB,GAAK,KAC7D,YAAc,kBAAkB,QAAQ,cAAgB,QAC9D,kBAAkB,QAAQ,YAAc,OAAO,WAAW,EAG1D,MAAM,aAAe,kBAAkB,cAAc,sBAAsB,EACrE,WAAa,kBAAkB,cAAc,oBAAoB,EACnE,eAAc,aAAa,OAAS,IACpC,aAAY,WAAW,OAAS,IAChC,cACF,KAAK,cAAc,uBAAuB,EAAE,OAAS,GACrD,OAAO,OAAO,OAAQ,CACpB,GAAI,CAAE,eAAgB,4DAA6D,WAAY,uDAAwD,EACvJ,GAAI,CAAE,eAAgB,mEAAoE,WAAY,8DAA+D,EACrK,GAAI,CAAE,eAAgB,mEAAiE,WAAY,6EAAwE,CAC7K,EAAE,MAAM,CAAC,GAGX,MAAM,uBAAyB,kBAAkB,QAAQ,sBAAwB,OAC5E,yBACC,eAAc,aAAa,OAAS,IACxC,kBAAkB,MAAM,YAAY,uBAAwB,KAAK,GAEnE,MAAM,kBAAoB,kBAAkB,cAAc,2BAA2B,EAC/E,qBAAuB,kBAAkB,cAAc,8BAA8B,EACrF,gBAAkB,kBAAkB,cAAc,yBAAyB,EAC3E,0BAA4B,kBAAkB,cAAc,oCAAoC,EAChG,gBAAkB,KAAK,cAAc,yBAAyB,EAC9D,aAAe,KAAK,cAAc,sBAAsB,EACxD,qBAAuB,KAAK,cAAc,+BAA+B,EACzE,gBAAkB,KAAK,cAAc,yBAAyB,EAC9D,oBAAsB,KAAK,cAAc,6BAA6B,EACtE,mBAAqB,kBAAkB,cAAc,4BAA4B,EACjF,gBAAkB,KAAK,cAAc,0BAA0B,EAC/D,gBAAkB,KAAK,cAAc,0BAA0B,EAC/D,iBAAmB,KAAK,cAAc,2BAA2B,EACjE,iBAAmB,KAAK,cAAc,2BAA2B,EACjE,kBAAoB,IAAM,CAC9B,MAAM,SAAW,KAAK,UAAU,SAAS,iBAAiB,EAC1D,eAAe,aAAa,gBAAiB,OAAO,QAAQ,CAAC,EAC7D,eAAe,aAAa,aAAc,SAAW,OAAO,aAAe,OAAO,WAAW,CAC/F,EACA,kBAAkB,EAElB,MAAM,kBAAoB,OAAO,WAAW,oCAAoC,EAChF,IAAI,kBAAoB,EACpB,kBAAoB,EACpB,qBAAuB,GACvB,cAAgB,GAChB,uBAAyB,GAC7B,MAAM,mBAAqB,IAAM,CAC/B,OAAO,aAAa,iBAAiB,EAAG,OAAO,aAAa,iBAAiB,EAC7E,kBAAoB,EAAG,kBAAoB,CAC7C,EACM,eAAiB,CAAC,KAAM,OAAS,KAAU,CAC3C,MAAQ,CAAC,yBACb,mBAAmB,EACnB,cAAgB,MAAQ,OACxB,KAAK,UAAU,OAAO,kBAAmB,IAAI,EAC7C,kBAAkB,EACb,OACH,KAAK,UAAU,OAAO,oBAAoB,EAC1C,kBAAkB,aAAa,gBAAiB,OAAO,GAEzD,qBAAqB,EACvB,EACM,aAAe,IAAM,CACzB,uBAAyB,qBACzB,eAAe,EAAK,CACtB,EACM,qBAAuB,IAAM,CACjC,OAAO,aAAa,iBAAiB,EACjC,iBAAiB,sBAAwB,cAAc,SAAS,SAAS,aAAa,KAC1F,kBAAoB,OAAO,WAAW,IAAM,CACtC,CAAC,eAAiB,CAAC,sBAAwB,CAAC,cAAc,SAAS,SAAS,aAAa,GAAG,eAAe,EAAK,CACtH,EAAG,GAAG,EACR,EACA,cAAc,iBAAiB,eAAgB,OAAS,CAClD,CAAC,wBAA0B,MAAM,cAAgB,SAAW,CAAC,kBAAkB,UACnF,qBAAuB,GACvB,OAAO,aAAa,iBAAiB,EACjC,0BAA0B,KAAK,UAAU,SAAS,iBAAiB,KACvE,kBAAoB,OAAO,WAAW,IAAM,CACtC,sBAAwB,CAAC,wBAA0B,kBAAkB,SAAW,CAAC,mBAAmB,QAAQ,eAAe,EAAI,CACrI,EAAG,GAAG,GACR,CAAC,EACD,cAAc,iBAAiB,eAAgB,OAAS,CAClD,MAAM,cAAgB,UAC1B,qBAAuB,GAAO,uBAAyB,GACvD,OAAO,aAAa,iBAAiB,EAAG,kBAAoB,EAC5D,qBAAqB,EACvB,CAAC,EACD,cAAc,iBAAiB,UAAW,IAAM,OAAO,aAAa,iBAAiB,CAAC,EACtF,cAAc,iBAAiB,WAAY,IAAM,OAAO,WAAW,qBAAsB,CAAC,CAAC,EAC3F,cAAc,iBAAiB,UAAW,OAAS,CAC7C,MAAM,MAAQ,UAAY,CAAC,KAAK,UAAU,SAAS,iBAAiB,IACxE,MAAM,eAAe,EAAG,aAAa,EACrC,eAAe,MAAM,CAAE,cAAe,EAAK,CAAC,EAC9C,CAAC,EACD,kBAAkB,mBAAmB,SAAU,IAAM,CACnD,mBAAmB,EAAG,qBAAuB,GAAO,uBAAyB,GACzE,CAAC,kBAAkB,SAAW,CAAC,eAAe,eAAe,EAAK,CACxE,CAAC,EAGD,MAAM,aAAe,CAAE,GAAI,QAAS,GAAI,QAAS,GAAI,OAAQ,EAAE,MAAM,EAC/D,aAAe,CAAC,MAAO,OAAS,IAAO,OAAO,SAAS,KAAK,EAAU,MAAM,eAAe,aAAc,CAAE,sBAAuB,OAAQ,sBAAuB,CAAE,CAAC,EAApG,IAChE,WAAc,OAAU,OAAO,OAAS,EAAE,EAAE,QAAQ,WAAa,YAAe,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,QAAS,IAAK,QAAS,GAAE,SAAS,CAAE,EACnK,mBAAsB,OAAU,CACpC,GAAI,CAAC,MAAO,OACZ,MAAM,MAAM,SAAW,GACvB,IAAI,KAAO,WAAW,OAAO,iBAAiB,KAAK,EAAE,QAAQ,GAAK,GAClE,MAAM,YAAc,GACpB,KAAO,MAAM,YAAc,MAAM,aAAe,KAAO,aACrD,MAAQ,GACR,MAAM,MAAM,SAAW,GAAG,IAAI,IAElC,EACM,MAAQ,CAAC,MAAO,IAAK,MAAQ,KAAK,IAAI,IAAK,KAAK,IAAI,MAAO,GAAG,CAAC,EAC/D,wBAA0B,IAAM,cAAc,KAAM,SAAY,QAAQ,KAAO,MAAM,sBAAsB,GAAK,KAEhH,sBAAwB,CAAC,UAAY,QAAU,CACnD,MAAM,QAAU,UAAU,aAAe,EAAI,cAAc,KAAK,SAAW,QAAQ,KAAO,UAAU,sBAAsB,EAAI,KACxH,MAAQ,YAAY,KAAK,SAAW,QAAQ,KAAO,UAAU,eAAe,EAC5E,eAAiB,SAAS,oBAAsB,MAAM,KAAK,MAAM,OAAO,UAAU,cAAc,GAAK,CAAC,EAAG,EAAG,iBAAiB,WAAW,EAAI,EAC5I,WAAa,MAAQ,MAAM,KAAK,MAAM,OAAO,UAAU,UAAU,GAAK,CAAC,EAAG,EAAG,QAAU,kBAAkB,QAAQ,EAAE,IAAI,MAAM,EAAE,GAAK,EAAI,kBAAkB,EAAI,EACpK,MAAO,CACL,GAAI,SAAW,UAAU,aAAe,EAAI,CAAC,CAAE,QAAS,QAAS,SAAU,kBAAmB,CAAC,EAAI,CAAC,EACpG,GAAI,eAAiB,CAAC,CAAE,QAAS,iBAAkB,SAAU,cAAe,CAAC,EAAI,CAAC,EAClF,GAAI,WAAa,CAAC,CAAE,QAAS,MAAO,SAAU,UAAW,CAAC,EAAI,CAAC,CACjE,CACF,EACM,eAAiB,IAAM,CAC3B,MAAM,QAAU,wBAAwB,EACxC,OAAO,QAAU,QAAQ,OAAS,GACpC,EACM,eAAkB,QAAW,OAAO,WAAa,IAAQ,OAAO,KAAO,iBAAmB,OAAO,GAAG,WAAW,SAAS,EACxH,sBAAwB,CAAC,QAAS,YAAc,CACpD,MAAM,UAAa,QAAW,CAC5B,MAAM,MAAQ,eAAe,MAAM,EACnC,OAAO,OAAS,IAAM,EAAI,OAAS,KAAO,EAAI,CAChD,EACM,WAAa,QAAQ,IAAI,CAAC,OAAQ,eAAiB,CACvD,GAAG,OACH,OAAQ,UAAY,EAAQ,OAAO,OAAU,GAC7C,aAAc,UAAY,EAAQ,OAAO,OAAU,GACnD,eAAgB,KAChB,WACF,EAAE,EACF,IAAI,eAAiB,EAErB,kBACG,OAAQ,QAAW,OAAO,MAAM,EAChC,KAAK,CAAC,EAAG,IAAM,UAAU,CAAC,EAAI,UAAU,CAAC,GAAK,EAAE,YAAc,EAAE,WAAW,EAC3E,QAAS,QAAW,CAAE,OAAO,eAAiB,EAAE,cAAgB,CAAC,EAE7D,UACT,EAEM,iBAAmB,CACvB,CACE,QACA,SACA,SACA,eACA,GACA,UACA,EACA,CACF,EACA,CACE,SACA,SACA,SACA,SACA,GACA,UACA,EACA,EACF,EACA,CACE,SACA,SACA,SACA,SACA,GACA,UACA,EACA,CACF,EACA,CACE,SACA,SACA,SACA,SACA,GACA,UACA,EACA,CACF,EACA,CACE,QACA,QACA,QACA,SACA,GACA,UACA,EACA,EACF,EACA,CACE,eACA,cACA,gBACA,gBACA,GACA,KACA,EACA,CACF,EACA,CACE,eACA,YACA,WACA,YACA,GACA,KACA,EACA,CACF,EACA,CACE,sBACA,2BACA,2BACA,8BACA,GACA,WACA,GACA,CACF,EACA,CACE,SACA,kBACA,uBACA,iCACA,EACA,KACA,GACA,CACF,EACA,CACE,yBACA,uBACA,0BACA,uBACA,IACA,KACA,EACA,EACF,EACA,CACE,sBACA,2BACA,4BACA,4BACA,KACA,KACA,EACA,EACF,EACA,CACE,uBACA,oBACA,wBACA,0BACA,IACA,KACA,EACA,EACF,EACA,CACE,UACA,UACA,eACA,UACA,IACA,KACA,EACA,EACF,EACA,CACE,YACA,YACA,WACA,uBACA,KACA,KACA,EACA,EACF,EACA,CACE,iBACA,iBACA,oBACA,qBACA,KACA,KACA,EACA,EACF,EACA,CACE,gBACA,gBACA,aACA,cACA,GACA,UACA,EACA,EACF,EACA,CACE,iBACA,2BACA,0BACA,0BACA,GACA,KACA,EACA,CACF,EACA,CACE,eACA,eACA,YACA,cACA,IACA,UACA,EACA,CACF,EACA,CACE,gBACA,cACA,cACA,oBACA,KACA,KACA,EACA,CACF,EACA,CACE,oBACA,mBACA,oBACA,qBACA,IACA,KACA,EACA,EACF,EACA,CACE,MACA,MACA,aACA,aACA,GACA,KACA,EACA,CACF,EACA,CACE,uBACA,uBACA,WACA,kBACA,IACA,KACA,EACA,CACF,EACA,CACE,gBACA,eACA,eACA,oBACA,GACA,KACA,EACA,CACF,EACA,CACE,gBACA,gBACA,eACA,qBACA,GACA,KACA,EACA,CACF,EACA,CACE,aACA,aACA,UACA,eACA,EACA,UACA,EACA,CACF,EACA,CACE,aACA,aACA,YACA,cACA,GACA,KACA,EACA,EACF,EACA,CACE,WACA,WACA,WACA,WACA,IACA,KACA,EACA,CACF,EACA,CACE,cACA,eACA,cACA,cACA,GACA,KACA,EACA,CACF,EACA,CACE,eACA,yBACA,4BACA,yBACA,GACA,UACA,EACA,CACF,EACA,CACE,eACA,eACA,YACA,aACA,IACA,KACA,EACA,EACF,EACA,CACE,gBACA,gBACA,iBACA,kBACA,IACA,KACA,EACA,EACF,EACA,CACE,eACA,eACA,aACA,eACA,KACA,KACA,EACA,EACF,EACA,CACE,iBACA,iBACA,aACA,cACA,IACA,KACA,EACA,EACF,EACA,CACE,SACA,SACA,gBACA,kBACA,IACA,KACA,EACA,EACF,EACA,CACE,gBACA,gBACA,aACA,eACA,KACA,KACA,EACA,EACF,EACA,CACE,oBACA,oBACA,cACA,kBACA,KACA,KACA,EACA,EACF,EACA,CACE,SACA,SACA,gBACA,eACA,IACA,KACA,EACA,EACF,EACA,CACE,YACA,YACA,YACA,oBACA,KACA,KACA,EACA,EACF,EACA,CACE,iBACA,iBACA,eACA,qBACA,GACA,KACA,EACA,CACF,CACF,EACM,cAAiB,OAAU,QAAU,EAAI,EAAI,KAAK,MAAM,MAAQ,CAAC,EAAI,EACrE,cAAgB,GAGhB,oBAAsB,GAEtB,mBAAqB,CAAE,MAAO,GAAI,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,MAAO,GAAI,aAAc,IAAK,aAAc,GAAI,cAAe,GAAI,WAAY,EAAG,EACxJ,gBAAkB,IAAI,IAAI,CAAC,eAAgB,eAAgB,gBAAiB,eAAgB,iBAAkB,SAAU,gBAAiB,oBAAqB,SAAU,YAAa,gBAAgB,CAAC,EACtM,aAAgB,YAAe,CACnC,MAAM,OAAS,UAAU,KAAM,MAAS,KAAK,KAAO,UAAU,EACxD,SAAW,OAAS,mBAAmB,OAAO,EAAE,EAAI,CAAC,EACrD,QAAU,i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",
  "names": ["station", "response", "metrics", "willOpen"]
}
