{"version":3,"file":"bundle.js","sources":["../../frontend/node_modules/svelte/internal/index.mjs","../../frontend/node_modules/svelte/store/index.mjs","../../frontend/node_modules/@stripe/stripe-js/dist/index.mjs","../../frontend/src/StateSelectStep.svelte","../../frontend/node_modules/svelte/motion/index.mjs","../../frontend/node_modules/svelte-range-slider-pips/src/RangePips.svelte","../../frontend/node_modules/svelte-range-slider-pips/src/RangeSlider.svelte","../../frontend/src/v2/V2QuoteStep.svelte","../../frontend/src/v2/v2RateCalculator.js","../../frontend/src/v2/V2QuoteResult.svelte","../../frontend/src/V2Flow.svelte","../../frontend/src/WelcomeStep.svelte","../../frontend/src/components/HelpBlock.svelte","../../frontend/src/components/PlaceAutocomplete.svelte","../../frontend/src/components/PlaceAutocompleteLegacy.svelte","../../frontend/src/components/PhoneInput.svelte","../../frontend/src/components/InputField.svelte","../../frontend/src/UserInfoStep.svelte","../../frontend/src/BikeDetailsStep.svelte","../../frontend/src/components/SignatureModal.svelte","../../frontend/src/components/TermsModal.svelte","../../frontend/src/AgreePayStep.svelte","../../frontend/src/components/BikeInsureLoader.svelte","../../frontend/src/PaymentStep.svelte","../../frontend/src/BoundPolicyView.svelte","../../frontend/src/components/ProgressBar.svelte","../../frontend/node_modules/marked/lib/marked.esm.js","../../frontend/node_modules/dompurify/dist/purify.es.mjs","../../frontend/src/ChatWidget.svelte","../../frontend/src/components/MaintenanceModal.svelte","../../frontend/src/stores/widgetMode.js","../../frontend/src/App.svelte","../../frontend/src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n    // @ts-ignore\n    for (const k in src)\n        tar[k] = src[k];\n    return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n    return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n    element.__svelte_meta = {\n        loc: { file, line, column, char }\n    };\n}\nfunction run(fn) {\n    return fn();\n}\nfunction blank_object() {\n    return Object.create(null);\n}\nfunction run_all(fns) {\n    fns.forEach(run);\n}\nfunction is_function(thing) {\n    return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n    return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n    if (!src_url_equal_anchor) {\n        src_url_equal_anchor = document.createElement('a');\n    }\n    src_url_equal_anchor.href = url;\n    return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n    return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n    return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n    if (store != null && typeof store.subscribe !== 'function') {\n        throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n    }\n}\nfunction subscribe(store, ...callbacks) {\n    if (store == null) {\n        return noop;\n    }\n    const unsub = store.subscribe(...callbacks);\n    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n    let value;\n    subscribe(store, _ => value = _)();\n    return value;\n}\nfunction component_subscribe(component, store, callback) {\n    component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n    if (definition) {\n        const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n        return definition[0](slot_ctx);\n    }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n    return definition[1] && fn\n        ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n        : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n    if (definition[2] && fn) {\n        const lets = definition[2](fn(dirty));\n        if ($$scope.dirty === undefined) {\n            return lets;\n        }\n        if (typeof lets === 'object') {\n            const merged = [];\n            const len = Math.max($$scope.dirty.length, lets.length);\n            for (let i = 0; i < len; i += 1) {\n                merged[i] = $$scope.dirty[i] | lets[i];\n            }\n            return merged;\n        }\n        return $$scope.dirty | lets;\n    }\n    return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n    if (slot_changes) {\n        const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n        slot.p(slot_context, slot_changes);\n    }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n    const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n    update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n    if ($$scope.ctx.length > 32) {\n        const dirty = [];\n        const length = $$scope.ctx.length / 32;\n        for (let i = 0; i < length; i++) {\n            dirty[i] = -1;\n        }\n        return dirty;\n    }\n    return -1;\n}\nfunction exclude_internal_props(props) {\n    const result = {};\n    for (const k in props)\n        if (k[0] !== '$')\n            result[k] = props[k];\n    return result;\n}\nfunction compute_rest_props(props, keys) {\n    const rest = {};\n    keys = new Set(keys);\n    for (const k in props)\n        if (!keys.has(k) && k[0] !== '$')\n            rest[k] = props[k];\n    return rest;\n}\nfunction compute_slots(slots) {\n    const result = {};\n    for (const key in slots) {\n        result[key] = true;\n    }\n    return result;\n}\nfunction once(fn) {\n    let ran = false;\n    return function (...args) {\n        if (ran)\n            return;\n        ran = true;\n        fn.call(this, ...args);\n    };\n}\nfunction null_to_empty(value) {\n    return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n    store.set(value);\n    return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n    return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n    const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n    return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n    ? () => window.performance.now()\n    : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n    now = fn;\n}\nfunction set_raf(fn) {\n    raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n    tasks.forEach(task => {\n        if (!task.c(now)) {\n            tasks.delete(task);\n            task.f();\n        }\n    });\n    if (tasks.size !== 0)\n        raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n    tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n    let task;\n    if (tasks.size === 0)\n        raf(run_tasks);\n    return {\n        promise: new Promise(fulfill => {\n            tasks.add(task = { c: callback, f: fulfill });\n        }),\n        abort() {\n            tasks.delete(task);\n        }\n    };\n}\n\nconst globals = (typeof window !== 'undefined'\n    ? window\n    : typeof globalThis !== 'undefined'\n        ? globalThis\n        : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n    constructor(options) {\n        this.options = options;\n        this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n    }\n    observe(element, listener) {\n        this._listeners.set(element, listener);\n        this._getObserver().observe(element, this.options);\n        return () => {\n            this._listeners.delete(element);\n            this._observer.unobserve(element); // this line can probably be removed\n        };\n    }\n    _getObserver() {\n        var _a;\n        return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n            var _a;\n            for (const entry of entries) {\n                ResizeObserverSingleton.entries.set(entry.target, entry);\n                (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n            }\n        }));\n    }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n    is_hydrating = true;\n}\nfunction end_hydrating() {\n    is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n    // Return first index of value larger than input value in the range [low, high)\n    while (low < high) {\n        const mid = low + ((high - low) >> 1);\n        if (key(mid) <= value) {\n            low = mid + 1;\n        }\n        else {\n            high = mid;\n        }\n    }\n    return low;\n}\nfunction init_hydrate(target) {\n    if (target.hydrate_init)\n        return;\n    target.hydrate_init = true;\n    // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n    let children = target.childNodes;\n    // If target is <head>, there may be children without claim_order\n    if (target.nodeName === 'HEAD') {\n        const myChildren = [];\n        for (let i = 0; i < children.length; i++) {\n            const node = children[i];\n            if (node.claim_order !== undefined) {\n                myChildren.push(node);\n            }\n        }\n        children = myChildren;\n    }\n    /*\n    * Reorder claimed children optimally.\n    * We can reorder claimed children optimally by finding the longest subsequence of\n    * nodes that are already claimed in order and only moving the rest. The longest\n    * subsequence of nodes that are claimed in order can be found by\n    * computing the longest increasing subsequence of .claim_order values.\n    *\n    * This algorithm is optimal in generating the least amount of reorder operations\n    * possible.\n    *\n    * Proof:\n    * We know that, given a set of reordering operations, the nodes that do not move\n    * always form an increasing subsequence, since they do not move among each other\n    * meaning that they must be already ordered among each other. Thus, the maximal\n    * set of nodes that do not move form a longest increasing subsequence.\n    */\n    // Compute longest increasing subsequence\n    // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n    const m = new Int32Array(children.length + 1);\n    // Predecessor indices + 1\n    const p = new Int32Array(children.length);\n    m[0] = -1;\n    let longest = 0;\n    for (let i = 0; i < children.length; i++) {\n        const current = children[i].claim_order;\n        // Find the largest subsequence length such that it ends in a value less than our current value\n        // upper_bound returns first greater value, so we subtract one\n        // with fast path for when we are on the current longest subsequence\n        const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n        p[i] = m[seqLen] + 1;\n        const newLen = seqLen + 1;\n        // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n        m[newLen] = i;\n        longest = Math.max(newLen, longest);\n    }\n    // The longest increasing subsequence of nodes (initially reversed)\n    const lis = [];\n    // The rest of the nodes, nodes that will be moved\n    const toMove = [];\n    let last = children.length - 1;\n    for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n        lis.push(children[cur - 1]);\n        for (; last >= cur; last--) {\n            toMove.push(children[last]);\n        }\n        last--;\n    }\n    for (; last >= 0; last--) {\n        toMove.push(children[last]);\n    }\n    lis.reverse();\n    // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n    toMove.sort((a, b) => a.claim_order - b.claim_order);\n    // Finally, we move the nodes\n    for (let i = 0, j = 0; i < toMove.length; i++) {\n        while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n            j++;\n        }\n        const anchor = j < lis.length ? lis[j] : null;\n        target.insertBefore(toMove[i], anchor);\n    }\n}\nfunction append(target, node) {\n    target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n    const append_styles_to = get_root_for_style(target);\n    if (!append_styles_to.getElementById(style_sheet_id)) {\n        const style = element('style');\n        style.id = style_sheet_id;\n        style.textContent = styles;\n        append_stylesheet(append_styles_to, style);\n    }\n}\nfunction get_root_for_style(node) {\n    if (!node)\n        return document;\n    const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n    if (root && root.host) {\n        return root;\n    }\n    return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n    const style_element = element('style');\n    append_stylesheet(get_root_for_style(node), style_element);\n    return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n    append(node.head || node, style);\n    return style.sheet;\n}\nfunction append_hydration(target, node) {\n    if (is_hydrating) {\n        init_hydrate(target);\n        if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n            target.actual_end_child = target.firstChild;\n        }\n        // Skip nodes of undefined ordering\n        while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n            target.actual_end_child = target.actual_end_child.nextSibling;\n        }\n        if (node !== target.actual_end_child) {\n            // We only insert if the ordering of this node should be modified or the parent node is not target\n            if (node.claim_order !== undefined || node.parentNode !== target) {\n                target.insertBefore(node, target.actual_end_child);\n            }\n        }\n        else {\n            target.actual_end_child = node.nextSibling;\n        }\n    }\n    else if (node.parentNode !== target || node.nextSibling !== null) {\n        target.appendChild(node);\n    }\n}\nfunction insert(target, node, anchor) {\n    target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n    if (is_hydrating && !anchor) {\n        append_hydration(target, node);\n    }\n    else if (node.parentNode !== target || node.nextSibling != anchor) {\n        target.insertBefore(node, anchor || null);\n    }\n}\nfunction detach(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\nfunction destroy_each(iterations, detaching) {\n    for (let i = 0; i < iterations.length; i += 1) {\n        if (iterations[i])\n            iterations[i].d(detaching);\n    }\n}\nfunction element(name) {\n    return document.createElement(name);\n}\nfunction element_is(name, is) {\n    return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n    const target = {};\n    for (const k in obj) {\n        if (has_prop(obj, k)\n            // @ts-ignore\n            && exclude.indexOf(k) === -1) {\n            // @ts-ignore\n            target[k] = obj[k];\n        }\n    }\n    return target;\n}\nfunction svg_element(name) {\n    return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n    return document.createTextNode(data);\n}\nfunction space() {\n    return text(' ');\n}\nfunction empty() {\n    return text('');\n}\nfunction comment(content) {\n    return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n    node.addEventListener(event, handler, options);\n    return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n    return function (event) {\n        event.preventDefault();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_propagation(fn) {\n    return function (event) {\n        event.stopPropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_immediate_propagation(fn) {\n    return function (event) {\n        event.stopImmediatePropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction self(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.target === this)\n            fn.call(this, event);\n    };\n}\nfunction trusted(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.isTrusted)\n            fn.call(this, event);\n    };\n}\nfunction attr(node, attribute, value) {\n    if (value == null)\n        node.removeAttribute(attribute);\n    else if (node.getAttribute(attribute) !== value)\n        node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n    // @ts-ignore\n    const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n    for (const key in attributes) {\n        if (attributes[key] == null) {\n            node.removeAttribute(key);\n        }\n        else if (key === 'style') {\n            node.style.cssText = attributes[key];\n        }\n        else if (key === '__value') {\n            node.value = node[key] = attributes[key];\n        }\n        else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n            node[key] = attributes[key];\n        }\n        else {\n            attr(node, key, attributes[key]);\n        }\n    }\n}\nfunction set_svg_attributes(node, attributes) {\n    for (const key in attributes) {\n        attr(node, key, attributes[key]);\n    }\n}\nfunction set_custom_element_data_map(node, data_map) {\n    Object.keys(data_map).forEach((key) => {\n        set_custom_element_data(node, key, data_map[key]);\n    });\n}\nfunction set_custom_element_data(node, prop, value) {\n    if (prop in node) {\n        node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n    }\n    else {\n        attr(node, prop, value);\n    }\n}\nfunction set_dynamic_element_data(tag) {\n    return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n    node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n    const value = new Set();\n    for (let i = 0; i < group.length; i += 1) {\n        if (group[i].checked)\n            value.add(group[i].__value);\n    }\n    if (!checked) {\n        value.delete(__value);\n    }\n    return Array.from(value);\n}\nfunction init_binding_group(group) {\n    let _inputs;\n    return {\n        /* push */ p(...inputs) {\n            _inputs = inputs;\n            _inputs.forEach(input => group.push(input));\n        },\n        /* remove */ r() {\n            _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n        }\n    };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n    let _group = get_binding_group(group);\n    let _inputs;\n    function get_binding_group(group) {\n        for (let i = 0; i < indexes.length; i++) {\n            group = group[indexes[i]] = group[indexes[i]] || [];\n        }\n        return group;\n    }\n    function push() {\n        _inputs.forEach(input => _group.push(input));\n    }\n    function remove() {\n        _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n    }\n    return {\n        /* update */ u(new_indexes) {\n            indexes = new_indexes;\n            const new_group = get_binding_group(group);\n            if (new_group !== _group) {\n                remove();\n                _group = new_group;\n                push();\n            }\n        },\n        /* push */ p(...inputs) {\n            _inputs = inputs;\n            push();\n        },\n        /* remove */ r: remove\n    };\n}\nfunction to_number(value) {\n    return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n    const array = [];\n    for (let i = 0; i < ranges.length; i += 1) {\n        array.push({ start: ranges.start(i), end: ranges.end(i) });\n    }\n    return array;\n}\nfunction children(element) {\n    return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n    if (nodes.claim_info === undefined) {\n        nodes.claim_info = { last_index: 0, total_claimed: 0 };\n    }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n    // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n    init_claim_info(nodes);\n    const resultNode = (() => {\n        // We first try to find an element after the previous one\n        for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                return node;\n            }\n        }\n        // Otherwise, we try to find one before\n        // We iterate in reverse so that we don't go too far back\n        for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                else if (replacement === undefined) {\n                    // Since we spliced before the last_index, we decrease it\n                    nodes.claim_info.last_index--;\n                }\n                return node;\n            }\n        }\n        // If we can't find any matching node, we create a new one\n        return createNode();\n    })();\n    resultNode.claim_order = nodes.claim_info.total_claimed;\n    nodes.claim_info.total_claimed += 1;\n    return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n    return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n        const remove = [];\n        for (let j = 0; j < node.attributes.length; j++) {\n            const attribute = node.attributes[j];\n            if (!attributes[attribute.name]) {\n                remove.push(attribute.name);\n            }\n        }\n        remove.forEach(v => node.removeAttribute(v));\n        return undefined;\n    }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n        const dataStr = '' + data;\n        if (node.data.startsWith(dataStr)) {\n            if (node.data.length !== dataStr.length) {\n                return node.splitText(dataStr.length);\n            }\n        }\n        else {\n            node.data = dataStr;\n        }\n    }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n    );\n}\nfunction claim_space(nodes) {\n    return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n        node.data = '' + data;\n        return undefined;\n    }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n    for (let i = start; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n            return i;\n        }\n    }\n    return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n    // find html opening tag\n    const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n    const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n    if (start_index === end_index) {\n        return new HtmlTagHydration(undefined, is_svg);\n    }\n    init_claim_info(nodes);\n    const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n    detach(html_tag_nodes[0]);\n    detach(html_tag_nodes[html_tag_nodes.length - 1]);\n    const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n    for (const n of claimed_nodes) {\n        n.claim_order = nodes.claim_info.total_claimed;\n        nodes.claim_info.total_claimed += 1;\n    }\n    return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n    data = '' + data;\n    if (text.data === data)\n        return;\n    text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n    if (~contenteditable_truthy_values.indexOf(attr_value)) {\n        set_data_contenteditable(text, data);\n    }\n    else {\n        set_data(text, data);\n    }\n}\nfunction set_input_value(input, value) {\n    input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n    try {\n        input.type = type;\n    }\n    catch (e) {\n        // do nothing\n    }\n}\nfunction set_style(node, key, value, important) {\n    if (value == null) {\n        node.style.removeProperty(key);\n    }\n    else {\n        node.style.setProperty(key, value, important ? 'important' : '');\n    }\n}\nfunction select_option(select, value, mounting) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        if (option.__value === value) {\n            option.selected = true;\n            return;\n        }\n    }\n    if (!mounting || value !== undefined) {\n        select.selectedIndex = -1; // no option should be selected\n    }\n}\nfunction select_options(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        option.selected = ~value.indexOf(option.__value);\n    }\n}\nfunction select_value(select) {\n    const selected_option = select.querySelector(':checked');\n    return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n    return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n    if (crossorigin === undefined) {\n        crossorigin = false;\n        try {\n            if (typeof window !== 'undefined' && window.parent) {\n                void window.parent.document;\n            }\n        }\n        catch (error) {\n            crossorigin = true;\n        }\n    }\n    return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n    const computed_style = getComputedStyle(node);\n    if (computed_style.position === 'static') {\n        node.style.position = 'relative';\n    }\n    const iframe = element('iframe');\n    iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n        'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.tabIndex = -1;\n    const crossorigin = is_crossorigin();\n    let unsubscribe;\n    if (crossorigin) {\n        iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n        unsubscribe = listen(window, 'message', (event) => {\n            if (event.source === iframe.contentWindow)\n                fn();\n        });\n    }\n    else {\n        iframe.src = 'about:blank';\n        iframe.onload = () => {\n            unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n            // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n            // see https://github.com/sveltejs/svelte/issues/4233\n            fn();\n        };\n    }\n    append(node, iframe);\n    return () => {\n        if (crossorigin) {\n            unsubscribe();\n        }\n        else if (unsubscribe && iframe.contentWindow) {\n            unsubscribe();\n        }\n        detach(iframe);\n    };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n    element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, bubbles, cancelable, detail);\n    return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n    return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n    const result = [];\n    let started = 0;\n    for (const node of head.childNodes) {\n        if (node.nodeType === 8 /* comment node */) {\n            const comment = node.textContent.trim();\n            if (comment === `HEAD_${nodeId}_END`) {\n                started -= 1;\n                result.push(node);\n            }\n            else if (comment === `HEAD_${nodeId}_START`) {\n                started += 1;\n                result.push(node);\n            }\n        }\n        else if (started > 0) {\n            result.push(node);\n        }\n    }\n    return result;\n}\nclass HtmlTag {\n    constructor(is_svg = false) {\n        this.is_svg = false;\n        this.is_svg = is_svg;\n        this.e = this.n = null;\n    }\n    c(html) {\n        this.h(html);\n    }\n    m(html, target, anchor = null) {\n        if (!this.e) {\n            if (this.is_svg)\n                this.e = svg_element(target.nodeName);\n            /** #7364  target for <template> may be provided as #document-fragment(11) */\n            else\n                this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n            this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n            this.c(html);\n        }\n        this.i(anchor);\n    }\n    h(html) {\n        this.e.innerHTML = html;\n        this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert(this.t, this.n[i], anchor);\n        }\n    }\n    p(html) {\n        this.d();\n        this.h(html);\n        this.i(this.a);\n    }\n    d() {\n        this.n.forEach(detach);\n    }\n}\nclass HtmlTagHydration extends HtmlTag {\n    constructor(claimed_nodes, is_svg = false) {\n        super(is_svg);\n        this.e = this.n = null;\n        this.l = claimed_nodes;\n    }\n    c(html) {\n        if (this.l) {\n            this.n = this.l;\n        }\n        else {\n            super.c(html);\n        }\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert_hydration(this.t, this.n[i], anchor);\n        }\n    }\n}\nfunction attribute_to_object(attributes) {\n    const result = {};\n    for (const attribute of attributes) {\n        result[attribute.name] = attribute.value;\n    }\n    return result;\n}\nfunction get_custom_elements_slots(element) {\n    const result = {};\n    element.childNodes.forEach((node) => {\n        result[node.slot || 'default'] = true;\n    });\n    return result;\n}\nfunction construct_svelte_component(component, props) {\n    return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n    let hash = 5381;\n    let i = str.length;\n    while (i--)\n        hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n    return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n    const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n    managed_styles.set(doc, info);\n    return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n    const step = 16.666 / duration;\n    let keyframes = '{\\n';\n    for (let p = 0; p <= 1; p += step) {\n        const t = a + (b - a) * ease(p);\n        keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n    }\n    const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n    const name = `__svelte_${hash(rule)}_${uid}`;\n    const doc = get_root_for_style(node);\n    const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n    if (!rules[name]) {\n        rules[name] = true;\n        stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n    }\n    const animation = node.style.animation || '';\n    node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n    active += 1;\n    return name;\n}\nfunction delete_rule(node, name) {\n    const previous = (node.style.animation || '').split(', ');\n    const next = previous.filter(name\n        ? anim => anim.indexOf(name) < 0 // remove specific animation\n        : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n    );\n    const deleted = previous.length - next.length;\n    if (deleted) {\n        node.style.animation = next.join(', ');\n        active -= deleted;\n        if (!active)\n            clear_rules();\n    }\n}\nfunction clear_rules() {\n    raf(() => {\n        if (active)\n            return;\n        managed_styles.forEach(info => {\n            const { ownerNode } = info.stylesheet;\n            // there is no ownerNode if it runs on jsdom.\n            if (ownerNode)\n                detach(ownerNode);\n        });\n        managed_styles.clear();\n    });\n}\n\nfunction create_animation(node, from, fn, params) {\n    if (!from)\n        return noop;\n    const to = node.getBoundingClientRect();\n    if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n        return noop;\n    const { delay = 0, duration = 300, easing = identity, \n    // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n    start: start_time = now() + delay, \n    // @ts-ignore todo:\n    end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n    let running = true;\n    let started = false;\n    let name;\n    function start() {\n        if (css) {\n            name = create_rule(node, 0, 1, duration, delay, easing, css);\n        }\n        if (!delay) {\n            started = true;\n        }\n    }\n    function stop() {\n        if (css)\n            delete_rule(node, name);\n        running = false;\n    }\n    loop(now => {\n        if (!started && now >= start_time) {\n            started = true;\n        }\n        if (started && now >= end) {\n            tick(1, 0);\n            stop();\n        }\n        if (!running) {\n            return false;\n        }\n        if (started) {\n            const p = now - start_time;\n            const t = 0 + 1 * easing(p / duration);\n            tick(t, 1 - t);\n        }\n        return true;\n    });\n    start();\n    tick(0, 1);\n    return stop;\n}\nfunction fix_position(node) {\n    const style = getComputedStyle(node);\n    if (style.position !== 'absolute' && style.position !== 'fixed') {\n        const { width, height } = style;\n        const a = node.getBoundingClientRect();\n        node.style.position = 'absolute';\n        node.style.width = width;\n        node.style.height = height;\n        add_transform(node, a);\n    }\n}\nfunction add_transform(node, a) {\n    const b = node.getBoundingClientRect();\n    if (a.left !== b.left || a.top !== b.top) {\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n    }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n    current_component = component;\n}\nfunction get_current_component() {\n    if (!current_component)\n        throw new Error('Function called outside component initialization');\n    return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n    get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n    get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n    get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n    get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n    const component = get_current_component();\n    return (type, detail, { cancelable = false } = {}) => {\n        const callbacks = component.$$.callbacks[type];\n        if (callbacks) {\n            // TODO are there situations where events could be dispatched\n            // in a server (non-DOM) environment?\n            const event = custom_event(type, detail, { cancelable });\n            callbacks.slice().forEach(fn => {\n                fn.call(component, event);\n            });\n            return !event.defaultPrevented;\n        }\n        return true;\n    };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n    get_current_component().$$.context.set(key, context);\n    return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n    return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n    return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n    return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n    const callbacks = component.$$.callbacks[event.type];\n    if (callbacks) {\n        // @ts-ignore\n        callbacks.slice().forEach(fn => fn.call(this, event));\n    }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n    if (!update_scheduled) {\n        update_scheduled = true;\n        resolved_promise.then(flush);\n    }\n}\nfunction tick() {\n    schedule_update();\n    return resolved_promise;\n}\nfunction add_render_callback(fn) {\n    render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n    flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n//    for afterUpdates called during the initial onMount, which are called in\n//    reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n//    dirty_components array and will cause a reentrant call to flush(). Because\n//    the flush index is kept outside the function, the reentrant call will pick\n//    up where the earlier call left off and go through all dirty components. The\n//    current_component value is saved and restored so that the reentrant call will\n//    not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n//    callback called a second time; the seen_callbacks set, outside the flush()\n//    function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n    // Do not reenter flush while dirty components are updated, as this can\n    // result in an infinite loop. Instead, let the inner flush handle it.\n    // Reentrancy is ok afterwards for bindings etc.\n    if (flushidx !== 0) {\n        return;\n    }\n    const saved_component = current_component;\n    do {\n        // first, call beforeUpdate functions\n        // and update components\n        try {\n            while (flushidx < dirty_components.length) {\n                const component = dirty_components[flushidx];\n                flushidx++;\n                set_current_component(component);\n                update(component.$$);\n            }\n        }\n        catch (e) {\n            // reset dirty state to not end up in a deadlocked state and then rethrow\n            dirty_components.length = 0;\n            flushidx = 0;\n            throw e;\n        }\n        set_current_component(null);\n        dirty_components.length = 0;\n        flushidx = 0;\n        while (binding_callbacks.length)\n            binding_callbacks.pop()();\n        // then, once components are updated, call\n        // afterUpdate functions. This may cause\n        // subsequent updates...\n        for (let i = 0; i < render_callbacks.length; i += 1) {\n            const callback = render_callbacks[i];\n            if (!seen_callbacks.has(callback)) {\n                // ...so guard against infinite loops\n                seen_callbacks.add(callback);\n                callback();\n            }\n        }\n        render_callbacks.length = 0;\n    } while (dirty_components.length);\n    while (flush_callbacks.length) {\n        flush_callbacks.pop()();\n    }\n    update_scheduled = false;\n    seen_callbacks.clear();\n    set_current_component(saved_component);\n}\nfunction update($$) {\n    if ($$.fragment !== null) {\n        $$.update();\n        run_all($$.before_update);\n        const dirty = $$.dirty;\n        $$.dirty = [-1];\n        $$.fragment && $$.fragment.p($$.ctx, dirty);\n        $$.after_update.forEach(add_render_callback);\n    }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n    const filtered = [];\n    const targets = [];\n    render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n    targets.forEach((c) => c());\n    render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n    if (!promise) {\n        promise = Promise.resolve();\n        promise.then(() => {\n            promise = null;\n        });\n    }\n    return promise;\n}\nfunction dispatch(node, direction, kind) {\n    node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n    outros = {\n        r: 0,\n        c: [],\n        p: outros // parent group\n    };\n}\nfunction check_outros() {\n    if (!outros.r) {\n        run_all(outros.c);\n    }\n    outros = outros.p;\n}\nfunction transition_in(block, local) {\n    if (block && block.i) {\n        outroing.delete(block);\n        block.i(local);\n    }\n}\nfunction transition_out(block, local, detach, callback) {\n    if (block && block.o) {\n        if (outroing.has(block))\n            return;\n        outroing.add(block);\n        outros.c.push(() => {\n            outroing.delete(block);\n            if (callback) {\n                if (detach)\n                    block.d(1);\n                callback();\n            }\n        });\n        block.o(local);\n    }\n    else if (callback) {\n        callback();\n    }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n    const options = { direction: 'in' };\n    let config = fn(node, params, options);\n    let running = false;\n    let animation_name;\n    let task;\n    let uid = 0;\n    function cleanup() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n        tick(0, 1);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        if (task)\n            task.abort();\n        running = true;\n        add_render_callback(() => dispatch(node, true, 'start'));\n        task = loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(1, 0);\n                    dispatch(node, true, 'end');\n                    cleanup();\n                    return running = false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(t, 1 - t);\n                }\n            }\n            return running;\n        });\n    }\n    let started = false;\n    return {\n        start() {\n            if (started)\n                return;\n            started = true;\n            delete_rule(node);\n            if (is_function(config)) {\n                config = config(options);\n                wait().then(go);\n            }\n            else {\n                go();\n            }\n        },\n        invalidate() {\n            started = false;\n        },\n        end() {\n            if (running) {\n                cleanup();\n                running = false;\n            }\n        }\n    };\n}\nfunction create_out_transition(node, fn, params) {\n    const options = { direction: 'out' };\n    let config = fn(node, params, options);\n    let running = true;\n    let animation_name;\n    const group = outros;\n    group.r += 1;\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        add_render_callback(() => dispatch(node, false, 'start'));\n        loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(0, 1);\n                    dispatch(node, false, 'end');\n                    if (!--group.r) {\n                        // this will result in `end()` being called,\n                        // so we don't need to clean up here\n                        run_all(group.c);\n                    }\n                    return false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(1 - t, t);\n                }\n            }\n            return running;\n        });\n    }\n    if (is_function(config)) {\n        wait().then(() => {\n            // @ts-ignore\n            config = config(options);\n            go();\n        });\n    }\n    else {\n        go();\n    }\n    return {\n        end(reset) {\n            if (reset && config.tick) {\n                config.tick(1, 0);\n            }\n            if (running) {\n                if (animation_name)\n                    delete_rule(node, animation_name);\n                running = false;\n            }\n        }\n    };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n    const options = { direction: 'both' };\n    let config = fn(node, params, options);\n    let t = intro ? 0 : 1;\n    let running_program = null;\n    let pending_program = null;\n    let animation_name = null;\n    function clear_animation() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function init(program, duration) {\n        const d = (program.b - t);\n        duration *= Math.abs(d);\n        return {\n            a: t,\n            b: program.b,\n            d,\n            duration,\n            start: program.start,\n            end: program.start + duration,\n            group: program.group\n        };\n    }\n    function go(b) {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        const program = {\n            start: now() + delay,\n            b\n        };\n        if (!b) {\n            // @ts-ignore todo: improve typings\n            program.group = outros;\n            outros.r += 1;\n        }\n        if (running_program || pending_program) {\n            pending_program = program;\n        }\n        else {\n            // if this is an intro, and there's a delay, we need to do\n            // an initial tick and/or apply CSS animation immediately\n            if (css) {\n                clear_animation();\n                animation_name = create_rule(node, t, b, duration, delay, easing, css);\n            }\n            if (b)\n                tick(0, 1);\n            running_program = init(program, duration);\n            add_render_callback(() => dispatch(node, b, 'start'));\n            loop(now => {\n                if (pending_program && now > pending_program.start) {\n                    running_program = init(pending_program, duration);\n                    pending_program = null;\n                    dispatch(node, running_program.b, 'start');\n                    if (css) {\n                        clear_animation();\n                        animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n                    }\n                }\n                if (running_program) {\n                    if (now >= running_program.end) {\n                        tick(t = running_program.b, 1 - t);\n                        dispatch(node, running_program.b, 'end');\n                        if (!pending_program) {\n                            // we're done\n                            if (running_program.b) {\n                                // intro — we can tidy up immediately\n                                clear_animation();\n                            }\n                            else {\n                                // outro — needs to be coordinated\n                                if (!--running_program.group.r)\n                                    run_all(running_program.group.c);\n                            }\n                        }\n                        running_program = null;\n                    }\n                    else if (now >= running_program.start) {\n                        const p = now - running_program.start;\n                        t = running_program.a + running_program.d * easing(p / running_program.duration);\n                        tick(t, 1 - t);\n                    }\n                }\n                return !!(running_program || pending_program);\n            });\n        }\n    }\n    return {\n        run(b) {\n            if (is_function(config)) {\n                wait().then(() => {\n                    // @ts-ignore\n                    config = config(options);\n                    go(b);\n                });\n            }\n            else {\n                go(b);\n            }\n        },\n        end() {\n            clear_animation();\n            running_program = pending_program = null;\n        }\n    };\n}\n\nfunction handle_promise(promise, info) {\n    const token = info.token = {};\n    function update(type, index, key, value) {\n        if (info.token !== token)\n            return;\n        info.resolved = value;\n        let child_ctx = info.ctx;\n        if (key !== undefined) {\n            child_ctx = child_ctx.slice();\n            child_ctx[key] = value;\n        }\n        const block = type && (info.current = type)(child_ctx);\n        let needs_flush = false;\n        if (info.block) {\n            if (info.blocks) {\n                info.blocks.forEach((block, i) => {\n                    if (i !== index && block) {\n                        group_outros();\n                        transition_out(block, 1, 1, () => {\n                            if (info.blocks[i] === block) {\n                                info.blocks[i] = null;\n                            }\n                        });\n                        check_outros();\n                    }\n                });\n            }\n            else {\n                info.block.d(1);\n            }\n            block.c();\n            transition_in(block, 1);\n            block.m(info.mount(), info.anchor);\n            needs_flush = true;\n        }\n        info.block = block;\n        if (info.blocks)\n            info.blocks[index] = block;\n        if (needs_flush) {\n            flush();\n        }\n    }\n    if (is_promise(promise)) {\n        const current_component = get_current_component();\n        promise.then(value => {\n            set_current_component(current_component);\n            update(info.then, 1, info.value, value);\n            set_current_component(null);\n        }, error => {\n            set_current_component(current_component);\n            update(info.catch, 2, info.error, error);\n            set_current_component(null);\n            if (!info.hasCatch) {\n                throw error;\n            }\n        });\n        // if we previously had a then/catch block, destroy it\n        if (info.current !== info.pending) {\n            update(info.pending, 0);\n            return true;\n        }\n    }\n    else {\n        if (info.current !== info.then) {\n            update(info.then, 1, info.value, promise);\n            return true;\n        }\n        info.resolved = promise;\n    }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n    const child_ctx = ctx.slice();\n    const { resolved } = info;\n    if (info.current === info.then) {\n        child_ctx[info.value] = resolved;\n    }\n    if (info.current === info.catch) {\n        child_ctx[info.error] = resolved;\n    }\n    info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n    block.d(1);\n    lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n    transition_out(block, 1, 1, () => {\n        lookup.delete(block.key);\n    });\n}\nfunction fix_and_destroy_block(block, lookup) {\n    block.f();\n    destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n    block.f();\n    outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n    let o = old_blocks.length;\n    let n = list.length;\n    let i = o;\n    const old_indexes = {};\n    while (i--)\n        old_indexes[old_blocks[i].key] = i;\n    const new_blocks = [];\n    const new_lookup = new Map();\n    const deltas = new Map();\n    const updates = [];\n    i = n;\n    while (i--) {\n        const child_ctx = get_context(ctx, list, i);\n        const key = get_key(child_ctx);\n        let block = lookup.get(key);\n        if (!block) {\n            block = create_each_block(key, child_ctx);\n            block.c();\n        }\n        else if (dynamic) {\n            // defer updates until all the DOM shuffling is done\n            updates.push(() => block.p(child_ctx, dirty));\n        }\n        new_lookup.set(key, new_blocks[i] = block);\n        if (key in old_indexes)\n            deltas.set(key, Math.abs(i - old_indexes[key]));\n    }\n    const will_move = new Set();\n    const did_move = new Set();\n    function insert(block) {\n        transition_in(block, 1);\n        block.m(node, next);\n        lookup.set(block.key, block);\n        next = block.first;\n        n--;\n    }\n    while (o && n) {\n        const new_block = new_blocks[n - 1];\n        const old_block = old_blocks[o - 1];\n        const new_key = new_block.key;\n        const old_key = old_block.key;\n        if (new_block === old_block) {\n            // do nothing\n            next = new_block.first;\n            o--;\n            n--;\n        }\n        else if (!new_lookup.has(old_key)) {\n            // remove old block\n            destroy(old_block, lookup);\n            o--;\n        }\n        else if (!lookup.has(new_key) || will_move.has(new_key)) {\n            insert(new_block);\n        }\n        else if (did_move.has(old_key)) {\n            o--;\n        }\n        else if (deltas.get(new_key) > deltas.get(old_key)) {\n            did_move.add(new_key);\n            insert(new_block);\n        }\n        else {\n            will_move.add(old_key);\n            o--;\n        }\n    }\n    while (o--) {\n        const old_block = old_blocks[o];\n        if (!new_lookup.has(old_block.key))\n            destroy(old_block, lookup);\n    }\n    while (n)\n        insert(new_blocks[n - 1]);\n    run_all(updates);\n    return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n    const keys = new Set();\n    for (let i = 0; i < list.length; i++) {\n        const key = get_key(get_context(ctx, list, i));\n        if (keys.has(key)) {\n            throw new Error('Cannot have duplicate keys in a keyed each');\n        }\n        keys.add(key);\n    }\n}\n\nfunction get_spread_update(levels, updates) {\n    const update = {};\n    const to_null_out = {};\n    const accounted_for = { $$scope: 1 };\n    let i = levels.length;\n    while (i--) {\n        const o = levels[i];\n        const n = updates[i];\n        if (n) {\n            for (const key in o) {\n                if (!(key in n))\n                    to_null_out[key] = 1;\n            }\n            for (const key in n) {\n                if (!accounted_for[key]) {\n                    update[key] = n[key];\n                    accounted_for[key] = 1;\n                }\n            }\n            levels[i] = n;\n        }\n        else {\n            for (const key in o) {\n                accounted_for[key] = 1;\n            }\n        }\n    }\n    for (const key in to_null_out) {\n        if (!(key in update))\n            update[key] = undefined;\n    }\n    return update;\n}\nfunction get_spread_object(spread_props) {\n    return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n    'allowfullscreen',\n    'allowpaymentrequest',\n    'async',\n    'autofocus',\n    'autoplay',\n    'checked',\n    'controls',\n    'default',\n    'defer',\n    'disabled',\n    'formnovalidate',\n    'hidden',\n    'inert',\n    'ismap',\n    'loop',\n    'multiple',\n    'muted',\n    'nomodule',\n    'novalidate',\n    'open',\n    'playsinline',\n    'readonly',\n    'required',\n    'reversed',\n    'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n    return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n    const attributes = Object.assign({}, ...args);\n    if (attrs_to_add) {\n        const classes_to_add = attrs_to_add.classes;\n        const styles_to_add = attrs_to_add.styles;\n        if (classes_to_add) {\n            if (attributes.class == null) {\n                attributes.class = classes_to_add;\n            }\n            else {\n                attributes.class += ' ' + classes_to_add;\n            }\n        }\n        if (styles_to_add) {\n            if (attributes.style == null) {\n                attributes.style = style_object_to_string(styles_to_add);\n            }\n            else {\n                attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n            }\n        }\n    }\n    let str = '';\n    Object.keys(attributes).forEach(name => {\n        if (invalid_attribute_name_character.test(name))\n            return;\n        const value = attributes[name];\n        if (value === true)\n            str += ' ' + name;\n        else if (boolean_attributes.has(name.toLowerCase())) {\n            if (value)\n                str += ' ' + name;\n        }\n        else if (value != null) {\n            str += ` ${name}=\"${value}\"`;\n        }\n    });\n    return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n    const style_object = {};\n    for (const individual_style of style_attribute.split(';')) {\n        const colon_index = individual_style.indexOf(':');\n        const name = individual_style.slice(0, colon_index).trim();\n        const value = individual_style.slice(colon_index + 1).trim();\n        if (!name)\n            continue;\n        style_object[name] = value;\n    }\n    for (const name in style_directive) {\n        const value = style_directive[name];\n        if (value) {\n            style_object[name] = value;\n        }\n        else {\n            delete style_object[name];\n        }\n    }\n    return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n    const str = String(value);\n    const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n    pattern.lastIndex = 0;\n    let escaped = '';\n    let last = 0;\n    while (pattern.test(str)) {\n        const i = pattern.lastIndex - 1;\n        const ch = str[i];\n        escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n        last = i + 1;\n    }\n    return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n    // keep booleans, null, and undefined for the sake of `spread`\n    const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n    return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n    const result = {};\n    for (const key in obj) {\n        result[key] = escape_attribute_value(obj[key]);\n    }\n    return result;\n}\nfunction each(items, fn) {\n    let str = '';\n    for (let i = 0; i < items.length; i += 1) {\n        str += fn(items[i], i);\n    }\n    return str;\n}\nconst missing_component = {\n    $$render: () => ''\n};\nfunction validate_component(component, name) {\n    if (!component || !component.$$render) {\n        if (name === 'svelte:component')\n            name += ' this={...}';\n        throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n    }\n    return component;\n}\nfunction debug(file, line, column, values) {\n    console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n    console.log(values); // eslint-disable-line no-console\n    return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n    function $$render(result, props, bindings, slots, context) {\n        const parent_component = current_component;\n        const $$ = {\n            on_destroy,\n            context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n            // these will be immediately discarded\n            on_mount: [],\n            before_update: [],\n            after_update: [],\n            callbacks: blank_object()\n        };\n        set_current_component({ $$ });\n        const html = fn(result, props, bindings, slots);\n        set_current_component(parent_component);\n        return html;\n    }\n    return {\n        render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n            on_destroy = [];\n            const result = { title: '', head: '', css: new Set() };\n            const html = $$render(result, props, {}, $$slots, context);\n            run_all(on_destroy);\n            return {\n                html,\n                css: {\n                    code: Array.from(result.css).map(css => css.code).join('\\n'),\n                    map: null // TODO\n                },\n                head: result.title + result.head\n            };\n        },\n        $$render\n    };\n}\nfunction add_attribute(name, value, boolean) {\n    if (value == null || (boolean && !value))\n        return '';\n    const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n    return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n    return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n    return Object.keys(style_object)\n        .filter(key => style_object[key])\n        .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n        .join(' ');\n}\nfunction add_styles(style_object) {\n    const styles = style_object_to_string(style_object);\n    return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n    const index = component.$$.props[name];\n    if (index !== undefined) {\n        component.$$.bound[index] = callback;\n        callback(component.$$.ctx[index]);\n    }\n}\nfunction create_component(block) {\n    block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n    block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n    const { fragment, after_update } = component.$$;\n    fragment && fragment.m(target, anchor);\n    if (!customElement) {\n        // onMount happens before the initial afterUpdate\n        add_render_callback(() => {\n            const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n            // if the component was destroyed immediately\n            // it will update the `$$.on_destroy` reference to `null`.\n            // the destructured on_destroy may still reference to the old array\n            if (component.$$.on_destroy) {\n                component.$$.on_destroy.push(...new_on_destroy);\n            }\n            else {\n                // Edge case - component was destroyed immediately,\n                // most likely as a result of a binding initialising\n                run_all(new_on_destroy);\n            }\n            component.$$.on_mount = [];\n        });\n    }\n    after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n    const $$ = component.$$;\n    if ($$.fragment !== null) {\n        flush_render_callbacks($$.after_update);\n        run_all($$.on_destroy);\n        $$.fragment && $$.fragment.d(detaching);\n        // TODO null out other refs, including component.$$ (but need to\n        // preserve final state?)\n        $$.on_destroy = $$.fragment = null;\n        $$.ctx = [];\n    }\n}\nfunction make_dirty(component, i) {\n    if (component.$$.dirty[0] === -1) {\n        dirty_components.push(component);\n        schedule_update();\n        component.$$.dirty.fill(0);\n    }\n    component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n    const parent_component = current_component;\n    set_current_component(component);\n    const $$ = component.$$ = {\n        fragment: null,\n        ctx: [],\n        // state\n        props,\n        update: noop,\n        not_equal,\n        bound: blank_object(),\n        // lifecycle\n        on_mount: [],\n        on_destroy: [],\n        on_disconnect: [],\n        before_update: [],\n        after_update: [],\n        context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n        // everything else\n        callbacks: blank_object(),\n        dirty,\n        skip_bound: false,\n        root: options.target || parent_component.$$.root\n    };\n    append_styles && append_styles($$.root);\n    let ready = false;\n    $$.ctx = instance\n        ? instance(component, options.props || {}, (i, ret, ...rest) => {\n            const value = rest.length ? rest[0] : ret;\n            if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n                if (!$$.skip_bound && $$.bound[i])\n                    $$.bound[i](value);\n                if (ready)\n                    make_dirty(component, i);\n            }\n            return ret;\n        })\n        : [];\n    $$.update();\n    ready = true;\n    run_all($$.before_update);\n    // `false` as a special case of no DOM component\n    $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n    if (options.target) {\n        if (options.hydrate) {\n            start_hydrating();\n            const nodes = children(options.target);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.l(nodes);\n            nodes.forEach(detach);\n        }\n        else {\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.c();\n        }\n        if (options.intro)\n            transition_in(component.$$.fragment);\n        mount_component(component, options.target, options.anchor, options.customElement);\n        end_hydrating();\n        flush();\n    }\n    set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n    SvelteElement = class extends HTMLElement {\n        constructor() {\n            super();\n            this.attachShadow({ mode: 'open' });\n        }\n        connectedCallback() {\n            const { on_mount } = this.$$;\n            this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n            // @ts-ignore todo: improve typings\n            for (const key in this.$$.slotted) {\n                // @ts-ignore todo: improve typings\n                this.appendChild(this.$$.slotted[key]);\n            }\n        }\n        attributeChangedCallback(attr, _oldValue, newValue) {\n            this[attr] = newValue;\n        }\n        disconnectedCallback() {\n            run_all(this.$$.on_disconnect);\n        }\n        $destroy() {\n            destroy_component(this, 1);\n            this.$destroy = noop;\n        }\n        $on(type, callback) {\n            // TODO should this delegate to addEventListener?\n            if (!is_function(callback)) {\n                return noop;\n            }\n            const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n            callbacks.push(callback);\n            return () => {\n                const index = callbacks.indexOf(callback);\n                if (index !== -1)\n                    callbacks.splice(index, 1);\n            };\n        }\n        $set($$props) {\n            if (this.$$set && !is_empty($$props)) {\n                this.$$.skip_bound = true;\n                this.$$set($$props);\n                this.$$.skip_bound = false;\n            }\n        }\n    };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n    $destroy() {\n        destroy_component(this, 1);\n        this.$destroy = noop;\n    }\n    $on(type, callback) {\n        if (!is_function(callback)) {\n            return noop;\n        }\n        const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n        callbacks.push(callback);\n        return () => {\n            const index = callbacks.indexOf(callback);\n            if (index !== -1)\n                callbacks.splice(index, 1);\n        };\n    }\n    $set($$props) {\n        if (this.$$set && !is_empty($$props)) {\n            this.$$.skip_bound = true;\n            this.$$set($$props);\n            this.$$.skip_bound = false;\n        }\n    }\n}\n\nfunction dispatch_dev(type, detail) {\n    document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n    dispatch_dev('SvelteDOMRemove', { node });\n    detach(node);\n}\nfunction detach_between_dev(before, after) {\n    while (before.nextSibling && before.nextSibling !== after) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction detach_before_dev(after) {\n    while (after.previousSibling) {\n        detach_dev(after.previousSibling);\n    }\n}\nfunction detach_after_dev(before) {\n    while (before.nextSibling) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n    const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n    if (has_prevent_default)\n        modifiers.push('preventDefault');\n    if (has_stop_propagation)\n        modifiers.push('stopPropagation');\n    if (has_stop_immediate_propagation)\n        modifiers.push('stopImmediatePropagation');\n    dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n    const dispose = listen(node, event, handler, options);\n    return () => {\n        dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n        dispose();\n    };\n}\nfunction attr_dev(node, attribute, value) {\n    attr(node, attribute, value);\n    if (value == null)\n        dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n    else\n        dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n    node[property] = value;\n    dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n    node.dataset[property] = value;\n    dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n    data = '' + data;\n    if (text.data === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n    if (~contenteditable_truthy_values.indexOf(attr_value)) {\n        set_data_contenteditable_dev(text, data);\n    }\n    else {\n        set_data_dev(text, data);\n    }\n}\nfunction validate_each_argument(arg) {\n    if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n        let msg = '{#each} only iterates over array-like objects.';\n        if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n            msg += ' You can use a spread to convert this iterable into an array.';\n        }\n        throw new Error(msg);\n    }\n}\nfunction validate_slots(name, slot, keys) {\n    for (const slot_key of Object.keys(slot)) {\n        if (!~keys.indexOf(slot_key)) {\n            console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n        }\n    }\n}\nfunction validate_dynamic_element(tag) {\n    const is_string = typeof tag === 'string';\n    if (tag && !is_string) {\n        throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n    }\n}\nfunction validate_void_dynamic_element(tag) {\n    if (tag && is_void(tag)) {\n        console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n    }\n}\nfunction construct_svelte_component_dev(component, props) {\n    const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n    try {\n        const instance = new component(props);\n        if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n            throw new Error(error_message);\n        }\n        return instance;\n    }\n    catch (err) {\n        const { message } = err;\n        if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n            throw new Error(error_message);\n        }\n        else {\n            throw err;\n        }\n    }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n    constructor(options) {\n        if (!options || (!options.target && !options.$$inline)) {\n            throw new Error(\"'target' is a required option\");\n        }\n        super();\n    }\n    $destroy() {\n        super.$destroy();\n        this.$destroy = () => {\n            console.warn('Component was already destroyed'); // eslint-disable-line no-console\n        };\n    }\n    $capture_state() { }\n    $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n    constructor(options) {\n        super(options);\n    }\n}\nfunction loop_guard(timeout) {\n    const start = Date.now();\n    return () => {\n        if (Date.now() - start > timeout) {\n            throw new Error('Infinite loop detected');\n        }\n    };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier} [start]\n */\nfunction readable(value, start) {\n    return {\n        subscribe: writable(value, start).subscribe\n    };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=} start\n */\nfunction writable(value, start = noop) {\n    let stop;\n    const subscribers = new Set();\n    function set(new_value) {\n        if (safe_not_equal(value, new_value)) {\n            value = new_value;\n            if (stop) { // store is ready\n                const run_queue = !subscriber_queue.length;\n                for (const subscriber of subscribers) {\n                    subscriber[1]();\n                    subscriber_queue.push(subscriber, value);\n                }\n                if (run_queue) {\n                    for (let i = 0; i < subscriber_queue.length; i += 2) {\n                        subscriber_queue[i][0](subscriber_queue[i + 1]);\n                    }\n                    subscriber_queue.length = 0;\n                }\n            }\n        }\n    }\n    function update(fn) {\n        set(fn(value));\n    }\n    function subscribe(run, invalidate = noop) {\n        const subscriber = [run, invalidate];\n        subscribers.add(subscriber);\n        if (subscribers.size === 1) {\n            stop = start(set) || noop;\n        }\n        run(value);\n        return () => {\n            subscribers.delete(subscriber);\n            if (subscribers.size === 0 && stop) {\n                stop();\n                stop = null;\n            }\n        };\n    }\n    return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n    const single = !Array.isArray(stores);\n    const stores_array = single\n        ? [stores]\n        : stores;\n    const auto = fn.length < 2;\n    return readable(initial_value, (set) => {\n        let started = false;\n        const values = [];\n        let pending = 0;\n        let cleanup = noop;\n        const sync = () => {\n            if (pending) {\n                return;\n            }\n            cleanup();\n            const result = fn(single ? values[0] : values, set);\n            if (auto) {\n                set(result);\n            }\n            else {\n                cleanup = is_function(result) ? result : noop;\n            }\n        };\n        const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n            values[i] = value;\n            pending &= ~(1 << i);\n            if (started) {\n                sync();\n            }\n        }, () => {\n            pending |= (1 << i);\n        }));\n        started = true;\n        sync();\n        return function stop() {\n            run_all(unsubscribers);\n            cleanup();\n            // We need to set this to false because callbacks can still happen despite having unsubscribed:\n            // Callbacks might already be placed in the queue which doesn't know it should no longer\n            // invoke this derived store.\n            started = false;\n        };\n    });\n}\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * @param store - store to make readonly\n */\nfunction readonly(store) {\n    return {\n        subscribe: store.subscribe.bind(store)\n    };\n}\n\nexport { derived, readable, readonly, writable };\n","var RELEASE_TRAIN = 'basil';\n\nvar runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion(version) {\n  return version === 3 ? 'v3' : version;\n};\n\nvar ORIGIN = 'https://js.stripe.com';\nvar STRIPE_JS_URL = \"\".concat(ORIGIN, \"/\").concat(RELEASE_TRAIN, \"/stripe.js\");\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar STRIPE_JS_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/(v3|[a-z]+)\\/stripe\\.js(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\n\nvar isStripeJSURL = function isStripeJSURL(url) {\n  return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);\n};\n\nvar findScript = function findScript() {\n  var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(ORIGIN, \"\\\"]\"));\n\n  for (var i = 0; i < scripts.length; i++) {\n    var script = scripts[i];\n\n    if (!isStripeJSURL(script.src)) {\n      continue;\n    }\n\n    return script;\n  }\n\n  return null;\n};\n\nvar injectScript = function injectScript(params) {\n  var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n  var script = document.createElement('script');\n  script.src = \"\".concat(STRIPE_JS_URL).concat(queryString);\n  var headOrBody = document.head || document.body;\n\n  if (!headOrBody) {\n    throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n  }\n\n  headOrBody.appendChild(script);\n  return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n  if (!stripe || !stripe._registerWrapper) {\n    return;\n  }\n\n  stripe._registerWrapper({\n    name: 'stripe-js',\n    version: \"7.9.0\",\n    startTime: startTime\n  });\n};\n\nvar stripePromise$1 = null;\nvar onErrorListener = null;\nvar onLoadListener = null;\n\nvar onError = function onError(reject) {\n  return function (cause) {\n    reject(new Error('Failed to load Stripe.js', {\n      cause: cause\n    }));\n  };\n};\n\nvar onLoad = function onLoad(resolve, reject) {\n  return function () {\n    if (window.Stripe) {\n      resolve(window.Stripe);\n    } else {\n      reject(new Error('Stripe.js not available'));\n    }\n  };\n};\n\nvar loadScript = function loadScript(params) {\n  // Ensure that we only attempt to load Stripe.js at most once\n  if (stripePromise$1 !== null) {\n    return stripePromise$1;\n  }\n\n  stripePromise$1 = new Promise(function (resolve, reject) {\n    if (typeof window === 'undefined' || typeof document === 'undefined') {\n      // Resolve to null when imported server side. This makes the module\n      // safe to import in an isomorphic code base.\n      resolve(null);\n      return;\n    }\n\n    if (window.Stripe && params) {\n      console.warn(EXISTING_SCRIPT_MESSAGE);\n    }\n\n    if (window.Stripe) {\n      resolve(window.Stripe);\n      return;\n    }\n\n    try {\n      var script = findScript();\n\n      if (script && params) {\n        console.warn(EXISTING_SCRIPT_MESSAGE);\n      } else if (!script) {\n        script = injectScript(params);\n      } else if (script && onLoadListener !== null && onErrorListener !== null) {\n        var _script$parentNode;\n\n        // remove event listeners\n        script.removeEventListener('load', onLoadListener);\n        script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error,\n        // reload script to trigger 'load' event\n\n        (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script);\n        script = injectScript(params);\n      }\n\n      onLoadListener = onLoad(resolve, reject);\n      onErrorListener = onError(reject);\n      script.addEventListener('load', onLoadListener);\n      script.addEventListener('error', onErrorListener);\n    } catch (error) {\n      reject(error);\n      return;\n    }\n  }); // Resets stripePromise on error\n\n  return stripePromise$1[\"catch\"](function (error) {\n    stripePromise$1 = null;\n    return Promise.reject(error);\n  });\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n  if (maybeStripe === null) {\n    return null;\n  }\n\n  var pk = args[0];\n  var isTestKey = pk.match(/^pk_test/); // @ts-expect-error this is not publicly typed\n\n  var version = runtimeVersionToUrlVersion(maybeStripe.version);\n  var expectedVersion = RELEASE_TRAIN;\n\n  if (isTestKey && version !== expectedVersion) {\n    console.warn(\"Stripe.js@\".concat(version, \" was loaded on the page, but @stripe/stripe-js@\").concat(\"7.9.0\", \" expected Stripe.js@\").concat(expectedVersion, \". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning\"));\n  }\n\n  var stripe = maybeStripe.apply(undefined, args);\n  registerWrapper(stripe, startTime);\n  return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nvar stripePromise;\nvar loadCalled = false;\n\nvar getStripePromise = function getStripePromise() {\n  if (stripePromise) {\n    return stripePromise;\n  }\n\n  stripePromise = loadScript(null)[\"catch\"](function (error) {\n    // clear cache on error\n    stripePromise = null;\n    return Promise.reject(error);\n  });\n  return stripePromise;\n}; // Execute our own script injection after a tick to give users time to do their\n// own script injection.\n\n\nPromise.resolve().then(function () {\n  return getStripePromise();\n})[\"catch\"](function (error) {\n  if (!loadCalled) {\n    console.warn(error);\n  }\n});\nvar loadStripe = function loadStripe() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  loadCalled = true;\n  var startTime = Date.now(); // if previous attempts are unsuccessful, will re-load script\n\n  return getStripePromise().then(function (maybeStripe) {\n    return initStripe(maybeStripe, args, startTime);\n  });\n};\n\nexport { loadStripe };\n","<script>\n  import { createEventDispatcher, getContext } from 'svelte';\n\n  const dispatch = createEventDispatcher();\n  const ctx = getContext('app');\n\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const locations = INITIAL_DATA.locations || [];\n  const quoteNoticeEnabled = INITIAL_DATA.quoteNoticeEnabled || false;\n  const quoteNoticeMessage = INITIAL_DATA.quoteNoticeMessage || '';\n\n  let selectedStateCode = ctx.selectedState?.code || '';\n\n  function handleContinue() {\n    if (!selectedStateCode) return;\n    const location = locations.find(l => l.state_code === selectedStateCode);\n    dispatch('stateSelected', {\n      locationId: location?.id,\n      stateCode: selectedStateCode,\n      stateName: location?.state_name || selectedStateCode,\n      useV2Api: location?.use_v2_api || false,\n    });\n  }\n</script>\n\n<div class=\"state-select-container\">\n  <div class=\"state-select-content\">\n    {#if quoteNoticeEnabled && quoteNoticeMessage}\n      <div class=\"quote-notice\" role=\"alert\">\n        {@html quoteNoticeMessage}\n      </div>\n    {/if}\n\n    <h1 class=\"state-select-title\">Get BikeInsure Quote</h1>\n    <p class=\"state-select-subtitle\">Instant Coverage. Simple Enrollment.</p>\n    <p class=\"state-select-instruction\">Select your state to continue.</p>\n\n    <div class=\"state-select-field\">\n      <select bind:value={selectedStateCode} class=\"state-dropdown\" class:has-value={selectedStateCode}>\n        <option value=\"\" disabled>Choose your state</option>\n        {#each locations as loc}\n          <option value={loc.state_code}>{loc.state_name}</option>\n        {/each}\n      </select>\n      <p class=\"state-availability-note\">Available nationwide. Coverage varies by state.</p>\n    </div>\n\n    <button\n      class=\"btn-continue\"\n      class:active={selectedStateCode}\n      disabled={!selectedStateCode}\n      on:click={handleContinue}\n    >\n      Get Quote\n    </button>\n\n    <div class=\"coverage-highlights\">\n      <h2 class=\"highlights-header\">Coverage Highlights</h2>\n      <div class=\"highlights-grid\">\n        <div class=\"highlights-col\">\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Accidental damage</span>\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Listed accessories covered</span>\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Replacement-cost value</span>\n        </div>\n        <div class=\"highlights-col\">\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Theft optional</span>\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Transit included</span>\n          <span class=\"highlight-item\"><img src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" class=\"highlight-check\" /> Monthly payments</span>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"legal-disclaimer\">\n      <p>Ride Covered LLC dba BikeInsure is a licensed insurance producer offering bicycle and eBike coverage across the United States. BikeInsure collaborates with Great American Insurance Company, which underwrites the policy and holds an A+ rating from AM Best. The authorized insurers of BikeInsure operate in all 50 states and Washington, DC. BikeInsure (BikeInsure Insurance Solutions in California) is responsible for recommending, soliciting, and selling the bike insurance coverage. For more information regarding terms, conditions, pricing, and other details, please visit the BikeInsure website.</p>\n    </div>\n  </div>\n</div>\n\n<style>\n  .state-select-container {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    min-height: 80vh;\n    padding: 2rem 1rem;\n  }\n\n  .state-select-content {\n    text-align: center;\n    max-width: 520px;\n    width: 100%;\n  }\n\n  .quote-notice {\n    text-align: center;\n    margin: 0 0 1.75rem;\n    color: #1a1a2e;\n    font-size: 0.95rem;\n    line-height: 1.55;\n  }\n\n  .quote-notice :global(p) {\n    margin: 0 0 0.5rem;\n  }\n\n  .quote-notice :global(p:last-child) {\n    margin-bottom: 0;\n  }\n\n  .state-select-title {\n    font-size: 1.85rem;\n    font-weight: 700;\n    color: #1a1a2e;\n    margin: 0 0 1.25rem;\n  }\n\n  .state-select-subtitle {\n    font-size: 1.35rem;\n    font-weight: 600;\n    color: #1a1a2e;\n    margin: 0 0 0.5rem;\n  }\n\n  .state-select-instruction {\n    font-size: 1.2rem;\n    font-weight: 400;\n    color: #000000;\n    margin: 20px 0 2rem;\n  }\n\n  .state-select-field {\n    margin-bottom: 1.75rem;\n  }\n\n  .state-dropdown {\n    width: 100%;\n    padding: 0.875rem 1rem;\n    font-size: 1rem;\n    border: 2px solid #e5e7eb;\n    border-radius: 0.5rem;\n    background: #fff;\n    color: #9ca3af;\n    appearance: none;\n    -webkit-appearance: none;\n    background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n    background-repeat: no-repeat;\n    background-position: right 1rem center;\n    cursor: pointer;\n    transition: border-color 0.2s;\n  }\n\n  .state-dropdown.has-value {\n    color: #1a1a2e;\n  }\n\n  .state-dropdown:focus {\n    outline: none;\n    border-color: #007bff;\n    box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.15);\n  }\n\n  .state-availability-note {\n    font-size: 1rem;\n    color: #000000;\n    margin: 0.8rem 0 0;\n  }\n\n  .btn-continue {\n    width: 100%;\n    padding: 18px 60px;\n    font-size: 22px;\n    font-weight: 800;\n    color: #BD181B;\n    background: #fff;\n    border: 4px solid #BD181B;\n    border-radius: 50px;\n    cursor: pointer;\n    transition: all 0.3s ease;    \n    max-width: 340px;\n  }\n\n  .btn-continue.active {\n    color: #fff;\n    background: #BD181B;\n    border-color: #BD181B;\n  }\n\n  .btn-continue.active:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(189, 24, 27, 0.4);\n  }\n\n  .btn-continue.active:active {\n    transform: translateY(0);\n  }\n\n  .btn-continue:disabled {\n    cursor: not-allowed;\n  }\n\n  .coverage-highlights {\n    margin-top: 2.5rem;\n    width: 100%;\n  }\n\n  .highlights-header {\n    font-size: 1.25rem;\n    font-weight: 700;\n    color: #1a1a2e;\n    margin: 0 0 1rem;\n  }\n\n  .highlights-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 0.5rem 1.5rem;\n    text-align: left;\n  }\n\n  .highlights-col {\n    display: flex;\n    flex-direction: column;\n    gap: 0.5rem;\n  }\n\n  .highlight-item {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 0.92rem;\n    font-weight: 500;\n    color: #374151;\n    line-height: 1.65;\n  }\n\n  .highlight-check {\n    width: 16px;\n    height: 16px;\n    flex-shrink: 0;\n  }\n\n  .legal-disclaimer {\n    margin-top: 2rem;\n    padding-top: 1.5rem;\n    border-top: 1px solid #e5e7eb;\n  }\n\n  .legal-disclaimer p {\n    font-size: 0.7rem;\n    color: #888;\n    line-height: 1.5;\n    text-align: justify;\n    margin: 0;\n  }\n\n  @media (max-width: 600px) {\n    .state-select-container {\n      justify-content: flex-start;\n      min-height: auto;\n      padding-top: 1.5rem;\n    }\n  }\n\n  @media (max-width: 480px) {\n    .state-select-title {\n      font-size: 1.4rem;\n    }\n  }\n</style>\n","import { writable } from '../store/index.mjs';\nimport { now, loop, assign } from '../internal/index.mjs';\nimport { linear } from '../easing/index.mjs';\n\nfunction is_date(obj) {\n    return Object.prototype.toString.call(obj) === '[object Date]';\n}\n\nfunction tick_spring(ctx, last_value, current_value, target_value) {\n    if (typeof current_value === 'number' || is_date(current_value)) {\n        // @ts-ignore\n        const delta = target_value - current_value;\n        // @ts-ignore\n        const velocity = (current_value - last_value) / (ctx.dt || 1 / 60); // guard div by 0\n        const spring = ctx.opts.stiffness * delta;\n        const damper = ctx.opts.damping * velocity;\n        const acceleration = (spring - damper) * ctx.inv_mass;\n        const d = (velocity + acceleration) * ctx.dt;\n        if (Math.abs(d) < ctx.opts.precision && Math.abs(delta) < ctx.opts.precision) {\n            return target_value; // settled\n        }\n        else {\n            ctx.settled = false; // signal loop to keep ticking\n            // @ts-ignore\n            return is_date(current_value) ?\n                new Date(current_value.getTime() + d) : current_value + d;\n        }\n    }\n    else if (Array.isArray(current_value)) {\n        // @ts-ignore\n        return current_value.map((_, i) => tick_spring(ctx, last_value[i], current_value[i], target_value[i]));\n    }\n    else if (typeof current_value === 'object') {\n        const next_value = {};\n        for (const k in current_value) {\n            // @ts-ignore\n            next_value[k] = tick_spring(ctx, last_value[k], current_value[k], target_value[k]);\n        }\n        // @ts-ignore\n        return next_value;\n    }\n    else {\n        throw new Error(`Cannot spring ${typeof current_value} values`);\n    }\n}\nfunction spring(value, opts = {}) {\n    const store = writable(value);\n    const { stiffness = 0.15, damping = 0.8, precision = 0.01 } = opts;\n    let last_time;\n    let task;\n    let current_token;\n    let last_value = value;\n    let target_value = value;\n    let inv_mass = 1;\n    let inv_mass_recovery_rate = 0;\n    let cancel_task = false;\n    function set(new_value, opts = {}) {\n        target_value = new_value;\n        const token = current_token = {};\n        if (value == null || opts.hard || (spring.stiffness >= 1 && spring.damping >= 1)) {\n            cancel_task = true; // cancel any running animation\n            last_time = now();\n            last_value = new_value;\n            store.set(value = target_value);\n            return Promise.resolve();\n        }\n        else if (opts.soft) {\n            const rate = opts.soft === true ? .5 : +opts.soft;\n            inv_mass_recovery_rate = 1 / (rate * 60);\n            inv_mass = 0; // infinite mass, unaffected by spring forces\n        }\n        if (!task) {\n            last_time = now();\n            cancel_task = false;\n            task = loop(now => {\n                if (cancel_task) {\n                    cancel_task = false;\n                    task = null;\n                    return false;\n                }\n                inv_mass = Math.min(inv_mass + inv_mass_recovery_rate, 1);\n                const ctx = {\n                    inv_mass,\n                    opts: spring,\n                    settled: true,\n                    dt: (now - last_time) * 60 / 1000\n                };\n                const next_value = tick_spring(ctx, last_value, value, target_value);\n                last_time = now;\n                last_value = value;\n                store.set(value = next_value);\n                if (ctx.settled) {\n                    task = null;\n                }\n                return !ctx.settled;\n            });\n        }\n        return new Promise(fulfil => {\n            task.promise.then(() => {\n                if (token === current_token)\n                    fulfil();\n            });\n        });\n    }\n    const spring = {\n        set,\n        update: (fn, opts) => set(fn(target_value, value), opts),\n        subscribe: store.subscribe,\n        stiffness,\n        damping,\n        precision\n    };\n    return spring;\n}\n\nfunction get_interpolator(a, b) {\n    if (a === b || a !== a)\n        return () => a;\n    const type = typeof a;\n    if (type !== typeof b || Array.isArray(a) !== Array.isArray(b)) {\n        throw new Error('Cannot interpolate values of different type');\n    }\n    if (Array.isArray(a)) {\n        const arr = b.map((bi, i) => {\n            return get_interpolator(a[i], bi);\n        });\n        return t => arr.map(fn => fn(t));\n    }\n    if (type === 'object') {\n        if (!a || !b)\n            throw new Error('Object cannot be null');\n        if (is_date(a) && is_date(b)) {\n            a = a.getTime();\n            b = b.getTime();\n            const delta = b - a;\n            return t => new Date(a + t * delta);\n        }\n        const keys = Object.keys(b);\n        const interpolators = {};\n        keys.forEach(key => {\n            interpolators[key] = get_interpolator(a[key], b[key]);\n        });\n        return t => {\n            const result = {};\n            keys.forEach(key => {\n                result[key] = interpolators[key](t);\n            });\n            return result;\n        };\n    }\n    if (type === 'number') {\n        const delta = b - a;\n        return t => a + t * delta;\n    }\n    throw new Error(`Cannot interpolate ${type} values`);\n}\nfunction tweened(value, defaults = {}) {\n    const store = writable(value);\n    let task;\n    let target_value = value;\n    function set(new_value, opts) {\n        if (value == null) {\n            store.set(value = new_value);\n            return Promise.resolve();\n        }\n        target_value = new_value;\n        let previous_task = task;\n        let started = false;\n        let { delay = 0, duration = 400, easing = linear, interpolate = get_interpolator } = assign(assign({}, defaults), opts);\n        if (duration === 0) {\n            if (previous_task) {\n                previous_task.abort();\n                previous_task = null;\n            }\n            store.set(value = target_value);\n            return Promise.resolve();\n        }\n        const start = now() + delay;\n        let fn;\n        task = loop(now => {\n            if (now < start)\n                return true;\n            if (!started) {\n                fn = interpolate(value, new_value);\n                if (typeof duration === 'function')\n                    duration = duration(value, new_value);\n                started = true;\n            }\n            if (previous_task) {\n                previous_task.abort();\n                previous_task = null;\n            }\n            const elapsed = now - start;\n            if (elapsed > duration) {\n                store.set(value = new_value);\n                return false;\n            }\n            // @ts-ignore\n            store.set(value = fn(easing(elapsed / duration)));\n            return true;\n        });\n        return task.promise;\n    }\n    return {\n        set,\n        update: (fn, opts) => set(fn(target_value, value), opts),\n        subscribe: store.subscribe\n    };\n}\n\nexport { spring, tweened };\n","<script>\n\n  // range slider props\n  export let range = false;\n  export let min = 0;\n  export let max = 100;\n  export let step = 1;\n  export let values = [(max + min) / 2];\n  export let vertical = false;\n  export let reversed = false;\n  export let hoverable = true;\n  export let disabled = false;\n\n  // range pips / values props\n  export let pipstep = undefined;\n  export let all = true;\n  export let first = undefined;\n  export let last = undefined;\n  export let rest = undefined;\n\n  // formatting props\n  export let prefix = \"\";\n  export let suffix = \"\";\n  export let formatter = (v,i,p) => v;\n\n  // stylistic props\n  export let focus = undefined;\n  export let orientationStart = undefined;\n\n  // methods\n  export let percentOf = undefined;\n  export let moveHandle = undefined;\n  export let fixFloat = undefined;\n  export let normalisedClient = undefined;\n\n  let clientStart;\n\n  $: pipStep = pipstep || ((max - min) / step >= ( vertical ? 50 : 100 ) ? (max - min) / ( vertical ? 10 : 20 ) : 1);\n\n  $: pipCount = parseInt((max - min) / (step * pipStep), 10);\n\n  $: pipVal = function(val) {\n    return fixFloat( min + val * step * pipStep );\n  };\n\n  $: isSelected = function(val) {\n    return values.some(v => fixFloat(v) === fixFloat(val));\n  };\n\n  $: inRange = function(val) {\n    if (range === \"min\") {\n      return values[0] > val;\n    } else if (range === \"max\") {\n      return values[0] < val;\n    } else if (range) {\n      return values[0] < val && values[1] > val;\n    }\n  };\n\n  /**\n   * function to run when the user clicks on a label\n   * we store the original client position so we can check if the user has moved the mouse/finger\n   * @param {event} e the event from browser\n   **/\n  function labelDown(e) {\n    e = normalisedClient(e);\n    clientStart = { x: e.clientX, y: e.clientY };\n  }\n\n  /**\n   * function to run when the user releases the mouse/finger\n   * we check if the user has moved the mouse/finger, if not we \"click\" the label\n   * and move the handle it to the label position\n   * @param {number} val the value of the label\n   * @param {event} e the event from browser\n   */\n  function labelUp(val,e) {\n    e = normalisedClient(e);\n    if ( !disabled ) {\n      const distanceMoved = Math.sqrt( Math.pow( clientStart.x - e.clientX, 2 ) + Math.pow( clientStart.y - e.clientY, 2 ) );\n      if ( clientStart && ( distanceMoved <= 5 ) ) {\n        moveHandle( undefined, val );\n      }\n    }\n  }\n</script>\n\n<style>\n  :global(.rangeSlider) {\n    --pip: var(--range-pip, lightslategray);\n    --pip-text: var(--range-pip-text, var(--pip));\n    --pip-active: var(--range-pip-active, darkslategrey);\n    --pip-active-text: var(--range-pip-active-text, var(--pip-active));\n    --pip-hover: var(--range-pip-hover, darkslategrey);\n    --pip-hover-text: var(--range-pip-hover-text, var(--pip-hover));\n    --pip-in-range: var(--range-pip-in-range, var(--pip-active));\n    --pip-in-range-text: var(--range-pip-in-range-text, var(--pip-active-text));\n  }\n  :global(.rangePips) {\n    position: absolute;\n    height: 1em;\n    left: 0;\n    right: 0;\n    bottom: -1em;\n  }\n  :global(.rangePips.vertical) {\n    height: auto;\n    width: 1em;\n    left: 100%;\n    right: auto;\n    top: 0;\n    bottom: 0;\n  }\n  :global(.rangePips .pip) {\n    height: 0.4em;\n    position: absolute;\n    top: 0.25em;\n    width: 1px;\n    white-space: nowrap;\n  }\n  :global(.rangePips.vertical .pip) {\n    height: 1px;\n    width: 0.4em;\n    left: 0.25em;\n    top: auto;\n    bottom: auto;\n  }\n  :global(.rangePips .pipVal) {\n    position: absolute;\n    top: 0.4em;\n    transform: translate(-50%, 25%);\n  }\n  :global(.rangePips.vertical .pipVal) {\n    position: absolute;\n    top: 0;\n    left: 0.4em;\n    transform: translate(25%, -50%);\n  }\n  :global(.rangePips .pip) {\n    transition: all 0.15s ease;\n  }\n  :global(.rangePips .pipVal) {\n    transition: all 0.15s ease, font-weight 0s linear;\n  }\n  :global(.rangePips .pip) {\n    color: lightslategray;\n    color: var(--pip-text);\n    background-color: lightslategray;\n    background-color: var(--pip);\n  }\n  :global(.rangePips .pip.selected) {\n    color: darkslategrey;\n    color: var(--pip-active-text);\n    background-color: darkslategrey;\n    background-color: var(--pip-active);\n  }\n  :global(.rangePips.hoverable:not(.disabled) .pip:hover) {\n    color: darkslategrey;\n    color: var(--pip-hover-text);\n    background-color: darkslategrey;\n    background-color: var(--pip-hover);\n  }\n  :global(.rangePips .pip.in-range) {\n    color: darkslategrey;\n    color: var(--pip-in-range-text);\n    background-color: darkslategrey;\n    background-color: var(--pip-in-range);\n  }\n  :global(.rangePips .pip.selected) {\n    height: 0.75em;\n  }\n  :global(.rangePips.vertical .pip.selected) {\n    height: 1px;\n    width: 0.75em;\n  }\n  :global(.rangePips .pip.selected .pipVal) {\n    font-weight: bold;\n    top: 0.75em;\n  }\n  :global(.rangePips.vertical .pip.selected .pipVal) {\n    top: 0;\n    left: 0.75em;\n  }\n  :global(.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover) {\n    transition: none;\n  }\n  :global(.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover .pipVal) {\n    transition: none;\n    font-weight: bold;\n  }\n</style>\n\n<!-- svelte-ignore a11y-click-events-have-key-events -->\n<div \n  class=\"rangePips\" \n  class:disabled\n  class:hoverable \n  class:vertical \n  class:reversed \n  class:focus \n>\n  {#if ( all && first !== false ) || first }\n    <span\n      class=\"pip first\"\n      class:selected={isSelected(min)}\n      class:in-range={inRange(min)}\n      style=\"{orientationStart}: 0%;\"\n      on:pointerdown={(e)=>{labelDown(e)}}\n      on:pointerup={(e)=>{labelUp(min,e)}}\n    >\n      {#if all === 'label' || first === 'label'}\n        <span class=\"pipVal\">\n          {#if prefix}<span class=\"pipVal-prefix\">{prefix}</span>{/if}{@html formatter(fixFloat(min),0,0)}{#if suffix}<span class=\"pipVal-suffix\">{suffix}</span>{/if}\n        </span>\n      {/if}\n    </span>\n  {/if}\n\n  {#if ( all && rest !== false ) || rest}\n    {#each Array(pipCount + 1) as _, i}\n      {#if pipVal(i) !== min && pipVal(i) !== max}\n        <span\n          class=\"pip\"\n          class:selected={isSelected(pipVal(i))}\n          class:in-range={inRange(pipVal(i))}\n          style=\"{orientationStart}: {percentOf(pipVal(i))}%;\"\n          on:pointerdown={(e)=>{labelDown(e)}}\n          on:pointerup={(e)=>{labelUp(pipVal(i),e)}}\n        >\n          {#if all === 'label' || rest === 'label'}\n            <span class=\"pipVal\">\n              {#if prefix}<span class=\"pipVal-prefix\">{prefix}</span>{/if}{@html formatter(pipVal(i),i,percentOf(pipVal(i)))}{#if suffix}<span class=\"pipVal-suffix\">{suffix}</span>{/if}\n            </span>\n          {/if}\n        </span>\n      {/if}\n    {/each}\n  {/if}\n\n  {#if ( all && last !== false ) || last}\n    <span\n      class=\"pip last\"\n      class:selected={isSelected(max)}\n      class:in-range={inRange(max)}\n      style=\"{orientationStart}: 100%;\"\n      on:pointerdown={(e)=>{labelDown(e)}}\n      on:pointerup={(e)=>{labelUp(max,e)}}\n    >\n      {#if all === 'label' || last === 'label'}\n        <span class=\"pipVal\">\n          {#if prefix}<span class=\"pipVal-prefix\">{prefix}</span>{/if}{@html formatter(fixFloat(max),pipCount,100)}{#if suffix}<span class=\"pipVal-suffix\">{suffix}</span>{/if}\n        </span>\n      {/if}\n    </span>\n  {/if}\n  \n</div>\n","<svelte:options immutable={false} />\n\n<script>\n  import { spring } from \"svelte/motion\";\n  import { createEventDispatcher } from \"svelte\";\n  import RangePips from \"./RangePips.svelte\";\n\n  // dom references\n  export let slider = undefined;\n\n  // range slider props\n  export let range = false;\n  export let pushy = false;\n  export let min = 0;\n  export let max = 100;\n  export let step = 1;\n  export let values = [(max + min) / 2];\n  export let vertical = false;\n  export let float = false;\n  export let reversed = false;\n  export let hoverable = true;\n  export let disabled = false;\n\n  // range pips / values props\n  export let pips = false;\n  export let pipstep = undefined;\n  export let all = undefined;\n  export let first = undefined;\n  export let last = undefined;\n  export let rest = undefined;\n\n  // formatting props\n  export let id = undefined;\n  export let prefix = \"\";\n  export let suffix = \"\";\n  export let formatter = (v,i,p) => v;\n  export let handleFormatter = formatter;\n  export let ariaLabels = [];\n\n  // stylistic props\n  export let precision = 2;\n  export let springValues = { stiffness: 0.15, damping: 0.4 };\n\n  // prepare dispatched events\n  const dispatch = createEventDispatcher();\n\n  // state management\n  let valueLength = 0;\n  let focus = false;\n  let handleActivated = false;\n  let handlePressed = false;\n  let keyboardActive = false;\n  let activeHandle = values.length - 1;\n  let startValue;\n  let previousValue;\n\n  // copy the initial values in to a spring function which\n  // will update every time the values array is modified\n\n  let springPositions;\n\n  /**\n   * make sure the value is coerced to a float value\n   * @param {number} v the value to fix\n   * @return {number} a float version of the input\n   **/\n  const fixFloat = (v) => parseFloat((+v).toFixed(precision));\n\n  $: {\n\n    // check that \"values\" is an array, or set it as array\n    // to prevent any errors in springs, or range trimming\n    if ( !Array.isArray( values ) ) {\n      values = [(max + min) / 2];\n      console.error( \"'values' prop should be an Array (https://github.com/simeydotme/svelte-range-slider-pips#slider-props)\" );\n    }\n    // trim the range so it remains as a min/max (only 2 handles)\n    // and also align the handles to the steps\n    const trimmedAlignedValues = trimRange(values.map((v) => alignValueToStep(v)));\n    if ( !(values.length === trimmedAlignedValues.length) || !values.every((element, index) => fixFloat(element) === trimmedAlignedValues[index]) ) {\n      values = trimmedAlignedValues;\n    }\n\n    // check if the valueLength (length of values[]) has changed,\n    // because if so we need to re-seed the spring function with the\n    // new values array.\n    if ( valueLength !== values.length ) {\n      // set the initial spring values when the slider initialises,\n      // or when values array length has changed\n      springPositions = spring(values.map((v) => percentOf(v)), springValues );\n    } else {\n      // update the value of the spring function for animated handles\n      // whenever the values has updated\n      springPositions.set(values.map((v) => percentOf(v)));\n    }\n    // set the valueLength for the next check\n    valueLength = values.length;\n\n    if ( values.length > 1 && !Array.isArray(ariaLabels) ) {\n      console.warn( `'ariaLabels' prop should be an Array (https://github.com/simeydotme/svelte-range-slider-pips#slider-props)` );\n    }\n\n  };\n\n  /**\n   * take in a value, and then calculate that value's percentage\n   * of the overall range (min-max);\n   * @param {number} val the value we're getting percent for\n   * @return {number} the percentage value\n   **/\n  $: percentOf = function (val) {\n    let perc = ((val - min) / (max - min)) * 100;\n    if (isNaN(perc) || perc <= 0) {\n      return 0;\n    } else if (perc >= 100) {\n      return 100;\n    } else {\n      return fixFloat(perc);\n    }\n  };\n\n  /**\n   * clamp a value from the range so that it always\n   * falls within the min/max values\n   * @param {number} val the value to clamp\n   * @return {number} the value after it's been clamped\n   **/\n  $: clampValue = function (val) {\n    // return the min/max if outside of that range\n    return val <= min ? min : val >= max ? max : val;\n  };\n\n  /**\n   * align the value with the steps so that it\n   * always sits on the closest (above/below) step\n   * @param {number} val the value to align\n   * @return {number} the value after it's been aligned\n   **/\n  $: alignValueToStep = function (val) {\n\t\n    // sanity check for performance\n    if (val <= min) {\n      return fixFloat(min);\n    } else if (val >= max) {\n      return fixFloat(max);\n    } else {\n      val = fixFloat(val);\n    }\n\t\n    // find the middle-point between steps\n    // and see if the value is closer to the\n    // next step, or previous step\n    let remainder = (val - min) % step;\n    let aligned = val - remainder;\n    if (Math.abs(remainder) * 2 >= step) {\n      aligned += remainder > 0 ? step : -step;\n    }\n    // make sure the value is within acceptable limits\n    aligned = clampValue(aligned);\n    // make sure the returned value is set to the precision desired\n    // this is also because javascript often returns weird floats\n    // when dealing with odd numbers and percentages\n    return fixFloat(aligned);\n  };\n\n  /**\n   * the orientation of the handles/pips based on the\n   * input values of vertical and reversed\n   **/\n  $: orientationStart = vertical ? reversed ? 'top' : 'bottom' : reversed ? 'right' : 'left';\n  $: orientationEnd = vertical ? reversed ? 'bottom' : 'top' : reversed ? 'left' : 'right';\n\n  /**\n   * helper func to get the index of an element in it's DOM container\n   * @param {object} el dom object reference we want the index of\n   * @returns {number} the index of the input element\n   **/\n  function index(el) {\n    if (!el) return -1;\n    var i = 0;\n    while ((el = el.previousElementSibling)) {\n      i++;\n    }\n    return i;\n  }\n\n  /**\n   * normalise a mouse or touch event to return the\n   * client (x/y) object for that event\n   * @param {event} e a mouse/touch event to normalise\n   * @returns {object} normalised event client object (x,y)\n   **/\n  function normalisedClient(e) {\n    if (e.type.includes(\"touch\")) {\n      return e.touches[0] || e.changedTouches[0];\n    } else {\n      return e;\n    }\n  }\n\n  /**\n   * check if an element is a handle on the slider\n   * @param {object} el dom object reference we want to check\n   * @returns {boolean}\n   **/\n  function targetIsHandle(el) {\n    const handles = slider.querySelectorAll(\".handle\");\n    const isHandle = Array.prototype.includes.call(handles, el);\n    const isChild = Array.prototype.some.call(handles, (e) => e.contains(el));\n    return isHandle || isChild;\n  }\n\n  /**\n   * trim the values array based on whether the property\n   * for 'range' is 'min', 'max', or truthy. This is because we\n   * do not want more than one handle for a min/max range, and we do\n   * not want more than two handles for a true range.\n   * @param {array} values the input values for the rangeSlider\n   * @return {array} the range array for creating a rangeSlider\n   **/\n  function trimRange(values) {\n    if (range === \"min\" || range === \"max\") {\n      return values.slice(0, 1);\n    } else if (range) {\n      return values.slice(0, 2);\n    } else {\n      return values;\n    }\n  }\n\n  /**\n   * helper to return the slider dimensions for finding\n   * the closest handle to user interaction\n   * @return {object} the range slider DOM client rect\n   **/\n  function getSliderDimensions() {\n    return slider.getBoundingClientRect();\n  }\n\n  /**\n   * helper to return closest handle to user interaction\n   * @param {object} clientPos the client{x,y} positions to check against\n   * @return {number} the index of the closest handle to clientPos\n   **/\n  function getClosestHandle(clientPos) {\n    // first make sure we have the latest dimensions\n    // of the slider, as it may have changed size\n    const dims = getSliderDimensions();\n    // calculate the interaction position, percent and value\n    let handlePos = 0;\n    let handlePercent = 0;\n    let handleVal = 0;\n    if (vertical) {\n      handlePos = clientPos.clientY - dims.top;\n      handlePercent = (handlePos / dims.height) * 100;\n      handlePercent = reversed ? handlePercent : 100 - handlePercent;\n    } else {\n      handlePos = clientPos.clientX - dims.left;\n      handlePercent = (handlePos / dims.width) * 100;\n      handlePercent = reversed ? 100 - handlePercent : handlePercent;\n    }\n    handleVal = ((max - min) / 100) * handlePercent + min;\n\n    let closest;\n\n    // if we have a range, and the handles are at the same\n    // position, we want a simple check if the interaction\n    // value is greater than return the second handle\n    if (range === true && values[0] === values[1]) {\n      if (handleVal > values[1]) {\n        return 1;\n      } else {\n        return 0;\n      }\n      // if there are multiple handles, and not a range, then\n      // we sort the handles values, and return the first one closest\n      // to the interaction value\n    } else {\n      closest = values.indexOf(\n        [...values].sort((a, b) => Math.abs(handleVal - a) - Math.abs(handleVal - b))[0]\n      );\n    }\n    return closest;\n  }\n\n  /**\n   * take the interaction position on the slider, convert\n   * it to a value on the range, and then send that value\n   * through to the moveHandle() method to set the active\n   * handle's position\n   * @param {object} clientPos the client{x,y} of the interaction\n   **/\n  function handleInteract(clientPos) {\n    // first make sure we have the latest dimensions\n    // of the slider, as it may have changed size\n    const dims = getSliderDimensions();\n    // calculate the interaction position, percent and value\n    let handlePos = 0;\n    let handlePercent = 0;\n    let handleVal = 0;\n    if (vertical) {\n      handlePos = clientPos.clientY - dims.top;\n      handlePercent = (handlePos / dims.height) * 100;\n      handlePercent = reversed ? handlePercent : 100 - handlePercent;\n    } else {\n      handlePos = clientPos.clientX - dims.left;\n      handlePercent = (handlePos / dims.width) * 100;\n      handlePercent = reversed ? 100 - handlePercent : handlePercent;\n    }\n    handleVal = ((max - min) / 100) * handlePercent + min;\n    // move handle to the value\n    moveHandle(activeHandle, handleVal);\n  }\n\n  /**\n   * move a handle to a specific value, respecting the clamp/align rules\n   * @param {number} index the index of the handle we want to move\n   * @param {number} value the value to move the handle to\n   * @return {number} the value that was moved to (after alignment/clamping)\n   **/\n  function moveHandle(index, value) {\n    // align & clamp the value so we're not doing extra\n    // calculation on an out-of-range value down below\n    value = alignValueToStep(value);\n    // use the active handle if handle index is not provided\n    if ( typeof index === 'undefined' ) {\n      index = activeHandle;\n    }\n    // if this is a range slider perform special checks\n    if (range) {\n      // restrict the handles of a range-slider from\n      // going past one-another unless \"pushy\" is true\n      if (index === 0 && value > values[1]) {\n        if (pushy) {\n          values[1] = value;\n        } else {\n          value = values[1];\n        }\n      } else if (index === 1 && value < values[0]) {\n        if (pushy) {\n          values[0] = value;\n        } else {\n          value = values[0];\n        }\n      }\n    }\n\n    // if the value has changed, update it\n    if (values[index] !== value) {\n      values[index] = value;\n    }\n\n    // fire the change event when the handle moves,\n    // and store the previous value for the next time\n    if (previousValue !== value) {\n      eChange();\n      previousValue = value;\n    }\n    return value;\n  }\n\n  /**\n   * helper to find the beginning range value for use with css style\n   * @param {array} values the input values for the rangeSlider\n   * @return {number} the beginning of the range\n   **/\n  function rangeStart(values) {\n    if (range === \"min\") {\n      return 0;\n    } else {\n      return values[0];\n    }\n  }\n\n  /**\n   * helper to find the ending range value for use with css style\n   * @param {array} values the input values for the rangeSlider\n   * @return {number} the end of the range\n   **/\n  function rangeEnd(values) {\n    if (range === \"max\") {\n      return 0;\n    } else if (range === \"min\") {\n      return 100 - values[0];\n    } else {\n      return 100 - values[1];\n    }\n  }\n\n  /**\n   * helper to take a string of html and return only the text\n   * @param {string} possibleHtml the string that may contain html\n   * @return {string} the text from the input\n   */\n  function pureText(possibleHtml) {\n    return `${possibleHtml}`.replace(/<[^>]*>/g, '');\n  }\n\n  /**\n   * when the user has unfocussed (blurred) from the\n   * slider, deactivate all handles\n   * @param {event} e the event from browser\n   **/\n  function sliderBlurHandle(e) {\n    if (keyboardActive) {\n      focus = false;\n      handleActivated = false;\n      handlePressed = false;\n    }\n  }\n\n  /**\n   * when the user focusses the handle of a slider\n   * set it to be active\n   * @param {event} e the event from browser\n   **/\n  function sliderFocusHandle(e) {\n    if ( !disabled ) {\n      activeHandle = index(e.target);\n      focus = true;\n    }\n  }\n\n  /**\n   * handle the keyboard accessible features by checking the\n   * input type, and modfier key then moving handle by appropriate amount\n   * @param {event} e the event from browser\n   **/\n  function sliderKeydown(e) {\n    if ( !disabled ) {\n      const handle = index(e.target);\n      let jump = e.ctrlKey || e.metaKey || e.shiftKey ? step * 10 : step;\n      let prevent = false;\n\n      switch (e.key) {\n        case \"PageDown\":\n          jump *= 10;\n        case \"ArrowRight\":\n        case \"ArrowUp\":\n          moveHandle(handle, values[handle] + jump);\n          prevent = true;\n          break;\n        case \"PageUp\":\n          jump *= 10;\n        case \"ArrowLeft\":\n        case \"ArrowDown\":\n          moveHandle(handle, values[handle] - jump);\n          prevent = true;\n          break;\n        case \"Home\":\n          moveHandle(handle, min);\n          prevent = true;\n          break;\n        case \"End\":\n          moveHandle(handle, max);\n          prevent = true;\n          break;\n      }\n      if (prevent) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    }\n  }\n\n  /**\n   * function to run when the user touches\n   * down on the slider element anywhere\n   * @param {event} e the event from browser\n   **/\n  function sliderInteractStart(e) {\n    if ( !disabled ) {\n      const el = e.target;\n      const clientPos = normalisedClient(e);\n      // set the closest handle as active\n      focus = true;\n      handleActivated = true;\n      handlePressed = true;\n      activeHandle = getClosestHandle(clientPos);\n\n      // fire the start event\n      startValue = previousValue = alignValueToStep(values[activeHandle]);\n      eStart();\n\n      // for touch devices we want the handle to instantly\n      // move to the position touched for more responsive feeling\n      if (e.type === \"touchstart\" && !el.matches(\".pipVal\")) {\n        handleInteract(clientPos);\n      }\n    }\n  }\n\n  /**\n   * function to run when the user stops touching\n   * down on the slider element anywhere\n   * @param {event} e the event from browser\n   **/\n  function sliderInteractEnd(e) {\n    // fire the stop event for touch devices\n    if (e.type === \"touchend\") {\n      eStop();\n    }\n    handlePressed = false;\n  }\n\n  /**\n   * unfocus the slider if the user clicked off of\n   * it, somewhere else on the screen\n   * @param {event} e the event from browser\n   **/\n  function bodyInteractStart(e) {\n    keyboardActive = false;\n    if (focus && e.target !== slider && !slider.contains(e.target)) {\n      focus = false;\n    }\n  }\n\n  /**\n   * send the clientX through to handle the interaction\n   * whenever the user moves acros screen while active\n   * @param {event} e the event from browser\n   **/\n  function bodyInteract(e) {\n    if ( !disabled ) {\n      if (handleActivated) {\n        handleInteract(normalisedClient(e));\n      }\n    }\n  }\n\n  /**\n   * if user triggers mouseup on the body while\n   * a handle is active (without moving) then we\n   * trigger an interact event there\n   * @param {event} e the event from browser\n   **/\n  function bodyMouseUp(e) {\n    if ( !disabled ) {\n      const el = e.target;\n      // this only works if a handle is active, which can\n      // only happen if there was sliderInteractStart triggered\n      // on the slider, already\n      if (handleActivated) {\n        if (el === slider || slider.contains(el)) {\n          focus = true;\n          // don't trigger interact if the target is a handle (no need) or\n          // if the target is a label (we want to move to that value from rangePips)\n          if (!targetIsHandle(el) && !el.matches(\".pipVal\")) {\n            handleInteract(normalisedClient(e));\n          }\n        }\n        // fire the stop event for mouse device\n        // when the body is triggered with an active handle\n        eStop();\n      }\n    }\n    handleActivated = false;\n    handlePressed = false;\n  }\n\n  /**\n   * if user triggers touchend on the body then we\n   * defocus the slider completely\n   * @param {event} e the event from browser\n   **/\n  function bodyTouchEnd(e) {\n    handleActivated = false;\n    handlePressed = false;\n  }\n\n  function bodyKeyDown(e) {\n    if ( !disabled ) {\n      if (e.target === slider || slider.contains(e.target)) {\n        keyboardActive = true;\n      }\n    }\n  }\n\n  function eStart() {\n    !disabled && dispatch(\"start\", {\n      activeHandle,\n      value: startValue,\n      values: values.map((v) => alignValueToStep(v)),\n    });\n  }\n\n  function eStop() {\n    !disabled && dispatch(\"stop\", {\n      activeHandle,\n      startValue: startValue,\n      value: values[activeHandle],\n      values: values.map((v) => alignValueToStep(v)),\n    });\n  }\n\n  function eChange() {\n    !disabled && dispatch(\"change\", {\n      activeHandle,\n      startValue: startValue,\n      previousValue:\n        typeof previousValue === \"undefined\" ? startValue : previousValue,\n      value: values[activeHandle],\n      values: values.map((v) => alignValueToStep(v)),\n    });\n  }\n</script>\n\n<style>\n  :global(.rangeSlider) {\n    --slider: var(--range-slider, #d7dada);\n    --handle-inactive: var(--range-handle-inactive, #99a2a2);\n    --handle: var(--range-handle, #838de7);\n    --handle-focus: var(--range-handle-focus, #4a40d4);\n    --handle-border: var(--range-handle-border, var(--handle));\n    --range-inactive: var(--range-range-inactive, var(--handle-inactive));\n    --range: var(--range-range, var(--handle-focus));\n    --float-inactive: var(--range-float-inactive, var(--handle-inactive));\n    --float: var(--range-float, var(--handle-focus));\n    --float-text: var(--range-float-text, white);\n  }\n  :global(.rangeSlider) {\n    position: relative;\n    border-radius: 100px;\n    height: 0.5em;\n    margin: 1em;\n    transition: opacity 0.2s ease;\n    user-select: none;\n  }\n  :global(.rangeSlider *) {\n    user-select: none;\n  }\n  :global(.rangeSlider.pips) {\n    margin-bottom: 1.8em;\n  }\n  :global(.rangeSlider.pip-labels) {\n    margin-bottom: 2.8em;\n  }\n  :global(.rangeSlider.vertical) {\n    display: inline-block;\n    border-radius: 100px;\n    width: 0.5em;\n    min-height: 200px;\n  }\n  :global(.rangeSlider.vertical.pips) {\n    margin-right: 1.8em;\n    margin-bottom: 1em;\n  }\n  :global(.rangeSlider.vertical.pip-labels) {\n    margin-right: 2.8em;\n    margin-bottom: 1em;\n  }\n  :global(.rangeSlider .rangeHandle) {\n    position: absolute;\n    display: block;\n    height: 1.4em;\n    width: 1.4em;\n    top: 0.25em;\n    bottom: auto;\n    transform: translateY(-50%) translateX(-50%);\n    z-index: 2;\n  }\n  :global(.rangeSlider.reversed .rangeHandle) {\n    transform: translateY(-50%) translateX(50%);\n  }\n  :global(.rangeSlider.vertical .rangeHandle) {\n    left: 0.25em;\n    top: auto;\n    transform: translateY(50%) translateX(-50%);\n  }\n  :global(.rangeSlider.vertical.reversed .rangeHandle) {\n    transform: translateY(-50%) translateX(-50%);\n  }\n  :global(.rangeSlider .rangeNub),\n  :global(.rangeSlider .rangeHandle:before) {\n    position: absolute;\n    left: 0;\n    top: 0;\n    display: block;\n    border-radius: 10em;\n    height: 100%;\n    width: 100%;\n    transition: box-shadow 0.2s ease;\n  }\n  :global(.rangeSlider .rangeHandle:before) {\n    content: \"\";\n    left: 1px;\n    top: 1px;\n    bottom: 1px;\n    right: 1px;\n    height: auto;\n    width: auto;\n    box-shadow: 0 0 0 0px var(--handle-border);\n    opacity: 0;\n  }\n  :global(.rangeSlider.hoverable:not(.disabled) .rangeHandle:hover:before) {\n    box-shadow: 0 0 0 8px var(--handle-border);\n    opacity: 0.2;\n  }\n  :global(.rangeSlider.hoverable:not(.disabled) .rangeHandle.press:before),\n  :global(.rangeSlider.hoverable:not(.disabled) .rangeHandle.press:hover:before) {\n    box-shadow: 0 0 0 12px var(--handle-border);\n    opacity: 0.4;\n  }\n  :global(.rangeSlider.range:not(.min):not(.max) .rangeNub) {\n    border-radius: 10em 10em 10em 1.6em;\n  }\n  :global(.rangeSlider.range .rangeHandle:nth-of-type(1) .rangeNub) {\n    transform: rotate(-135deg);\n  }\n  :global(.rangeSlider.range .rangeHandle:nth-of-type(2) .rangeNub) {\n    transform: rotate(45deg);\n  }\n  :global(.rangeSlider.range.reversed .rangeHandle:nth-of-type(1) .rangeNub) {\n    transform: rotate(45deg);\n  }\n  :global(.rangeSlider.range.reversed .rangeHandle:nth-of-type(2) .rangeNub) {\n    transform: rotate(-135deg);\n  }\n  :global(.rangeSlider.range.vertical .rangeHandle:nth-of-type(1) .rangeNub) {\n    transform: rotate(135deg);\n  }\n  :global(.rangeSlider.range.vertical .rangeHandle:nth-of-type(2) .rangeNub) {\n    transform: rotate(-45deg);\n  }\n  :global(.rangeSlider.range.vertical.reversed .rangeHandle:nth-of-type(1) .rangeNub) {\n    transform: rotate(-45deg);\n  }\n  :global(.rangeSlider.range.vertical.reversed .rangeHandle:nth-of-type(2) .rangeNub) {\n    transform: rotate(135deg);\n  }\n  :global(.rangeSlider .rangeFloat) {\n    display: block;\n    position: absolute;\n    left: 50%;\n    top: -0.5em;\n    transform: translate(-50%, -100%);\n    font-size: 1em;\n    text-align: center;\n    opacity: 0;\n    pointer-events: none;\n    white-space: nowrap;\n    transition: all 0.2s ease;\n    font-size: 0.9em;\n    padding: 0.2em 0.4em;\n    border-radius: 0.2em;\n  }\n  :global(.rangeSlider .rangeHandle.active .rangeFloat),\n  :global(.rangeSlider.hoverable .rangeHandle:hover .rangeFloat) {\n    opacity: 1;\n    top: -0.2em;\n    transform: translate(-50%, -100%);\n  }\n  :global(.rangeSlider .rangeBar) {\n    position: absolute;\n    display: block;\n    transition: background 0.2s ease;\n    border-radius: 1em;\n    height: 0.5em;\n    top: 0;\n    user-select: none;\n    z-index: 1;\n  }\n  :global(.rangeSlider.vertical .rangeBar) {\n    width: 0.5em;\n    height: auto;\n  }\n  :global(.rangeSlider) {\n    background-color: #d7dada;\n    background-color: var(--slider);\n  }\n  :global(.rangeSlider .rangeBar) {\n    background-color: #99a2a2;\n    background-color: var(--range-inactive);\n  }\n  :global(.rangeSlider.focus .rangeBar) {\n    background-color: #838de7;\n    background-color: var(--range);\n  }\n  :global(.rangeSlider .rangeNub) {\n    background-color: #99a2a2;\n    background-color: var(--handle-inactive);\n  }\n  :global(.rangeSlider.focus .rangeNub) {\n    background-color: #838de7;\n    background-color: var(--handle);\n  }\n  :global(.rangeSlider .rangeHandle.active .rangeNub) {\n    background-color: #4a40d4;\n    background-color: var(--handle-focus);\n  }\n  :global(.rangeSlider .rangeFloat) {\n    color: white;\n    color: var(--float-text);\n    background-color: #99a2a2;\n    background-color: var(--float-inactive);\n  }\n  :global(.rangeSlider.focus .rangeFloat) {\n    background-color: #4a40d4;\n    background-color: var(--float);\n  }\n  :global(.rangeSlider.disabled) {\n    opacity: 0.5;\n  }\n  :global(.rangeSlider.disabled .rangeNub) {\n    background-color: #d7dada;\n    background-color: var(--slider);\n  }\n</style>\n\n<!-- svelte-ignore a11y-click-events-have-key-events -->\n<div\n  {id}\n  bind:this={slider}\n  role=\"none\"\n  class=\"rangeSlider\"\n  class:range\n  class:disabled\n  class:hoverable\n  class:vertical\n  class:reversed\n  class:focus\n  class:min={range === 'min'}\n  class:max={range === 'max'}\n  class:pips\n  class:pip-labels={all === 'label' || first === 'label' || last === 'label' || rest === 'label'}\n  on:mousedown={sliderInteractStart}\n  on:mouseup={sliderInteractEnd}\n  on:touchstart|preventDefault={sliderInteractStart}\n  on:touchend|preventDefault={sliderInteractEnd}\n>\n  {#each values as value, index}\n    <span\n      role=\"slider\"\n      class=\"rangeHandle\"\n      class:active={focus && activeHandle === index}\n      class:press={handlePressed && activeHandle === index}\n      data-handle={index}\n      on:blur={sliderBlurHandle}\n      on:focus={sliderFocusHandle}\n      on:keydown={sliderKeydown}\n      style=\"{orientationStart}: {$springPositions[index]}%; z-index: {activeHandle === index ? 3 : 2};\"\n      aria-label={ariaLabels[index]}\n      aria-valuemin={range === true && index === 1 ? values[0] : min}\n      aria-valuemax={range === true && index === 0 ? values[1] : max}\n      aria-valuenow={value}\n      aria-valuetext=\"{prefix}{pureText(handleFormatter(value,index,percentOf(value)))}{suffix}\"\n      aria-orientation={vertical ? 'vertical' : 'horizontal'}\n      aria-disabled={disabled}\n      {disabled}\n      tabindex=\"{ disabled ? -1 : 0 }\"\n    >\n      <span class=\"rangeNub\" />\n      {#if float}\n        <span class=\"rangeFloat\">\n          {#if prefix}<span class=\"rangeFloat-prefix\">{prefix}</span>{/if}{@html handleFormatter(value,index,percentOf(value))}{#if suffix}<span class=\"rangeFloat-suffix\">{suffix}</span>{/if}\n        </span>\n      {/if}\n    </span>\n  {/each}\n  {#if range}\n    <span\n      class=\"rangeBar\"\n      style=\"{orientationStart}: {rangeStart($springPositions)}%; \n             {orientationEnd}: {rangeEnd($springPositions)}%;\" />\n  {/if}\n  {#if pips}\n    <RangePips\n      {values}\n      {min}\n      {max}\n      {step}\n      {range}\n      {vertical}\n      {reversed}\n      {orientationStart}\n      {hoverable}\n      {disabled}\n      {all}\n      {first}\n      {last}\n      {rest}\n      {pipstep}\n      {prefix}\n      {suffix}\n      {formatter}\n      {focus}\n      {percentOf}\n      {moveHandle}\n      {fixFloat}\n      {normalisedClient}\n    />\n  {/if}\n</div>\n\n<svelte:window\n  on:mousedown={bodyInteractStart}\n  on:touchstart={bodyInteractStart}\n  on:mousemove={bodyInteract}\n  on:touchmove={bodyInteract}\n  on:mouseup={bodyMouseUp}\n  on:touchend={bodyTouchEnd}\n  on:keydown={bodyKeyDown} />\n","<script>\n  import { createEventDispatcher } from 'svelte';\n  import RangeSlider from 'svelte-range-slider-pips';\n\n  const dispatch = createEventDispatcher();\n\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const memberships = INITIAL_DATA.memberships || [];\n  const ebikeRejectionDisclaimer =\n    INITIAL_DATA.disclaimers?.ebikeRejection ||\n    '<p>We appreciate your interest in insuring your e-bike. However, since your e-bike does not meet the <strong>3-class e-bike requirement</strong> of a maximum <strong>750-watts</strong> and a <strong>28-mph pedal-assist limit</strong>, it is not eligible for coverage.</p>';\n\n  // E-bike eligibility modal (same flow as V1 BikeDetailsStep)\n  let showEbikeModal = false;\n  let pendingEbikeBikeIndex = null;\n  let ebikeVerificationAnswer = null;\n\n  // Casual bike verification modal (catches e-bike owners mis-selecting Casual)\n  const CASUAL_REQUIREMENTS = [\n    'Not an e-bike.',\n    'No racing or competitive events.',\n    'U.S. & Canada coverage territory.',\n  ];\n  let showCasualModal = false;\n  let pendingCasualBikeIndex = null;\n\n  const USAGE_TYPES = [\n    {\n      id: 'casual',\n      label: 'Casual Riding',\n      image: '/static/Bikeinsure-iCON-CASUAL_COMP.png',\n      color: '#032B5C',\n      borderColor: '#032B5C',\n      description: 'No racing license required.',\n      territory: 'UNITED STATES',\n      territoryExtra: '+ Canada Territory',\n    },\n    {\n      id: 'competitive',\n      label: 'Competitive Racing',\n      image: '/static/Bikeinsure-iCON-COMPETITIVE_COMP.png',\n      color: '#c53030',\n      borderColor: '#c53030',\n      description: 'Casual riding + racing events.',\n      territory: 'WORLDWIDE',\n      territoryExtra: 'Coverage Territory',\n    },\n    {\n      id: 'ebike',\n      label: 'Electric Bikes',\n      image: '/static/Bikeinsure-iCON-EBIKE_COMP.png',\n      color: '#1A5F92',\n      borderColor: '#1A5F92',\n      description: 'Up to 28 mph.',\n      territory: 'UNITED STATES',\n      territoryExtra: '+ Canada Territory',\n    }\n  ];\n\n  export let initialState = null;\n\n  const MAX_BIKES = 5;\n\n  let bikes = initialState?.bikes\n    ? initialState.bikes.map(b => ({\n        value: b.value,\n        usageType: b.usageType,\n        coverageTouched: true,\n      }))\n    : [{ value: [500], usageType: null, coverageTouched: false }];\n  let selectedMembership = initialState?.selectedMembership ?? 'none';\n\n  $: isValid = bikes.every(b => b.usageType !== null && b.coverageTouched);\n\n  function markCoverageTouched(index) {\n    if (!bikes[index].coverageTouched) {\n      bikes[index].coverageTouched = true;\n      bikes = bikes;\n    }\n  }\n\n  function addBike() {\n    if (bikes.length >= MAX_BIKES) return;\n    bikes = [...bikes, { value: [500], usageType: null, coverageTouched: false }];\n  }\n\n  function removeBike(index) {\n    if (bikes.length <= 1) return;\n    bikes = bikes.filter((_, i) => i !== index);\n  }\n\n  function handleGetQuote() {\n    if (!isValid) return;\n    dispatch('getQuote', {\n      bikes: bikes.map(b => ({ value: b.value[0], usageType: b.usageType })),\n      membership: selectedMembership\n    });\n  }\n\n  function handleUsageTypeSelect(bikeIndex, type) {\n    if (type.id === 'ebike') {\n      pendingEbikeBikeIndex = bikeIndex;\n      ebikeVerificationAnswer = null;\n      showEbikeModal = true;\n      return;\n    }\n    if (type.id === 'casual') {\n      pendingCasualBikeIndex = bikeIndex;\n      showCasualModal = true;\n      return;\n    }\n    bikes[bikeIndex].usageType = type.id;\n    bikes = bikes;\n  }\n\n  function handleCasualVerification(answer) {\n    const bikeIndex = pendingCasualBikeIndex;\n    closeCasualModal();\n    if (bikeIndex == null) return;\n    // \"No\": the rider is an e-bike or racing rider. Leave the usage unset so\n    // they pick Competitive or Electric from the cards.\n    if (answer !== 'yes') return;\n    bikes[bikeIndex].usageType = 'casual';\n    bikes = bikes;\n  }\n\n  function closeCasualModal() {\n    showCasualModal = false;\n    pendingCasualBikeIndex = null;\n  }\n\n  function handleEbikeVerification(answer) {\n    ebikeVerificationAnswer = answer;\n    if (answer === 'yes' && pendingEbikeBikeIndex != null) {\n      bikes[pendingEbikeBikeIndex].usageType = 'ebike';\n      bikes = bikes;\n      closeEbikeModal();\n    }\n  }\n\n  function closeEbikeModal() {\n    showEbikeModal = false;\n    pendingEbikeBikeIndex = null;\n    ebikeVerificationAnswer = null;\n  }\n</script>\n\n<div class=\"v2-quote-container\">\n  <div class=\"v2-quote-content\">\n    <h1 class=\"v2-quote-title\">Get BikeInsure Quote</h1>\n\n    {#each bikes as bike, i}\n      <!-- Section 1: Usage Type -->\n      <div class=\"section-card\">\n        <div class=\"bike-card-header\">\n          <label class=\"section-label\">How do you ride? <span class=\"required\">*</span></label>\n          {#if bikes.length > 1}\n            <button type=\"button\" class=\"btn-remove-bike\" on:click={() => removeBike(i)} aria-label=\"Remove bike {i + 1}\">&times;</button>\n          {/if}\n        </div>\n        <p class=\"section-sublabel\">Select one</p>\n        <div class=\"bike-usage-options\">\n          {#each USAGE_TYPES as type}\n            <button\n              type=\"button\"\n              class=\"bike-usage-card\"\n              class:selected={bike.usageType === type.id}\n              style=\"--usage-color: {type.color}; --border-color: {type.borderColor}\"\n              on:click={() => handleUsageTypeSelect(i, type)}\n            >\n              <div class=\"card-image\">\n                <img src={type.image} alt={type.label} />\n              </div>\n              <div class=\"card-body\">\n                <div class=\"card-label\">{type.label}</div>\n                <div class=\"card-desc\">{type.description}</div>\n                <div class=\"card-territory\">{type.territory}</div>\n                <div class=\"card-territory-extra\">{type.territoryExtra}</div>\n              </div>\n              <div class=\"card-radio\" class:checked={bike.usageType === type.id}>\n                {#if bike.usageType === type.id}\n                  <img class=\"check-icon\" src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n                {/if}\n              </div>\n            </button>\n          {/each}\n        </div>\n      </div>\n\n      <!-- Section 2: Coverage Amount -->\n      <div class=\"section-card\">\n        <label class=\"section-label\">Choose your coverage amount <span class=\"required\">*</span></label>\n        <p class=\"section-sublabel\">Bike price + listed accessories</p>\n        <div class=\"price-slider-container\">\n          <RangeSlider\n            bind:values={bike.value}\n            on:change={() => markCoverageTouched(i)}\n            min={500}\n            max={30000}\n            step={100}\n            pips\n            all=\"label\"\n            first=\"label\"\n            last=\"label\"\n            rest=\"label\"\n            formatter={(v) => `$${v.toLocaleString()}`}\n            float\n            hoverable\n          />\n        </div>\n\n        {#if bike.usageType && !bike.coverageTouched}\n          <p class=\"coverage-warning\">Move slider to set coverage amount.</p>\n        {/if}\n\n        <div class=\"purchase-price-label\">\n          Bike Price + Listed Accessories:\n          {#if bike.coverageTouched}\n            <span class=\"purchase-price\">\n              {Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(bike.value[0])}\n            </span>\n          {:else}\n            <span class=\"purchase-price-placeholder\">$0</span>\n          {/if}\n        </div>\n      </div>\n    {/each}\n\n    <!-- Section 3: Membership Savings -->\n    {#if memberships.length > 0}\n      <div class=\"section-card\">\n        <label class=\"section-label\">Cycling Membership <span class=\"required\">*</span></label>\n        <p class=\"section-sublabel\">Select if applicable to receive savings</p>\n        <div class=\"membership-options\">\n          <label class=\"membership-option\">\n            <input type=\"radio\" bind:group={selectedMembership} value=\"none\" />\n            <span class=\"membership-label\">No membership</span>\n          </label>\n          {#each memberships as m}\n            <label class=\"membership-option\">\n              <input type=\"radio\" bind:group={selectedMembership} value={String(m.id)} />\n              <span class=\"membership-label\">{m.name}</span>\n            </label>\n          {/each}\n        </div>\n      </div>\n    {/if}\n\n    <p class=\"multi-bike-note\">Multi-bike discount available &ndash;<br/>add another bike at enrollment.</p>\n\n    <button\n      class=\"btn-get-quote\"\n      disabled={!isValid}\n      on:click={handleGetQuote}\n    >\n      See Your Price\n    </button>\n\n    <p class=\"footer-note\">Secure enrollment &bull; Coverage starts same day</p>\n  </div>\n</div>\n\n<!-- E-Bike eligibility (same as V1 BikeDetailsStep) -->\n{#if showEbikeModal}\n  <div\n    class=\"modal-overlay\"\n    on:click={closeEbikeModal}\n    on:keydown={(e) => e.key === 'Escape' && closeEbikeModal()}\n    role=\"button\"\n    tabindex=\"0\"\n  >\n    <!-- svelte-ignore a11y-click-events-have-key-events -->\n    <div class=\"modal-content ebike-modal\" on:click|stopPropagation role=\"dialog\" aria-modal=\"true\">\n      <button type=\"button\" class=\"modal-close\" on:click={closeEbikeModal} aria-label=\"Close\">&times;</button>\n\n      {#if ebikeVerificationAnswer === null}\n        <h3 class=\"ebike-modal-title\">Verify E-Bike Eligibility</h3>\n        <div class=\"ebike-requirements\">\n          <div class=\"requirement-item\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\" />\n              <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </svg>\n            <span>Class 1, 2, or 3.</span>\n          </div>\n          <div class=\"requirement-item\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\" />\n              <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </svg>\n            <span>750-Watt max.</span>\n          </div>\n          <div class=\"requirement-item\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\" />\n              <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </svg>\n            <span>Top pedal-assist speed 28 mph.</span>\n          </div>\n        </div>\n      {/if}\n\n      {#if ebikeVerificationAnswer === null}\n        <div class=\"ebike-question\">\n          <div class=\"ebike-verification-buttons\">\n            <button type=\"button\" class=\"verification-btn verification-yes\" on:click={() => handleEbikeVerification('yes')}>\n              Yes\n            </button>\n            <button type=\"button\" class=\"verification-btn verification-no\" on:click={() => handleEbikeVerification('no')}>\n              No\n            </button>\n          </div>\n        </div>\n      {:else}\n        <div class=\"ebike-rejection\">\n          <div class=\"ebike-rejection-body\">{@html ebikeRejectionDisclaimer}</div>\n          <button type=\"button\" class=\"verification-btn verification-yes ebike-got-it\" on:click={closeEbikeModal}>\n            Got it - Thanks\n          </button>\n        </div>\n      {/if}\n    </div>\n  </div>\n{/if}\n\n<!-- Casual bike verification (catches e-bike owners mis-selecting Casual) -->\n{#if showCasualModal}\n  <div\n    class=\"modal-overlay\"\n    on:click={closeCasualModal}\n    on:keydown={(e) => e.key === 'Escape' && closeCasualModal()}\n    role=\"button\"\n    tabindex=\"0\"\n  >\n    <!-- svelte-ignore a11y-click-events-have-key-events -->\n    <div class=\"modal-content ebike-modal\" on:click|stopPropagation role=\"dialog\" aria-modal=\"true\">\n      <button type=\"button\" class=\"modal-close\" on:click={closeCasualModal} aria-label=\"Close\">&times;</button>\n\n      <h3 class=\"ebike-modal-title\">Verify Casual Eligibility</h3>\n      <div class=\"ebike-requirements\">\n        {#each CASUAL_REQUIREMENTS as req}\n          <div class=\"requirement-item\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\" />\n              <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </svg>\n            <span>{req}</span>\n          </div>\n        {/each}\n      </div>\n\n      <div class=\"casual-question\">\n        <p class=\"casual-question-prompt\">Does this match how you&rsquo;ll ride this <strong>policy year</strong>?</p>\n        <p class=\"casual-question-helper\">If this is an e-bike, or you ride in a triathlon, gran fondo, gravel event, or race, choose &ldquo;No&rdquo; and select the appropriate coverage.</p>\n      </div>\n\n      <div class=\"ebike-verification-buttons\">\n        <button type=\"button\" class=\"verification-btn verification-yes\" on:click={() => handleCasualVerification('yes')}>\n          Yes &mdash; Casual\n        </button>\n        <button type=\"button\" class=\"verification-btn verification-no\" on:click={() => handleCasualVerification('no')}>\n          No\n        </button>\n      </div>\n    </div>\n  </div>\n{/if}\n\n<style>\n  .v2-quote-container {\n    display: flex;\n    justify-content: center;\n    padding: 1.5rem 1rem;\n  }\n\n  .v2-quote-content {\n    max-width: 650px;\n    width: 100%;\n  }\n\n  .v2-quote-title {\n    font-size: 1.6rem;\n    font-weight: 700;\n    color: #1a1a2e;\n    text-align: center;\n    margin: 0 0 1.5rem;\n  }\n\n  .section-card {\n    background: #fff;\n    border: 1px solid #e5e7eb;\n    border-radius: 12px;\n    padding: 22px 24px;\n    margin-bottom: 16px;\n  }\n\n  .section-label {\n    font-size: 1rem;\n    font-weight: 700;\n    color: #1a1a2e;\n    display: block;\n    margin-bottom: 0.25rem;\n  }\n\n  .section-sublabel {\n    font-size: 0.82rem;\n    color: #777;\n    margin: 0 0 0.75rem;\n  }\n\n  .required {\n    color: #c53030;\n  }\n\n  .bike-card-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin-bottom: -5px;\n  }\n\n  /* Bike Usage Cards */\n  .bike-usage-options {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 14px;\n    margin-top: 12px;\n  }\n\n  .bike-usage-card {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    text-align: center;\n    padding: 22px 10px 24px;\n    background: white;\n    border: 1px solid #ddd;\n    border-left: 4px solid var(--border-color, #2E5C8A);\n    border-radius: 10px;\n    cursor: pointer;\n    transition: all 0.25s ease;\n    width: 100%;\n  }\n\n  .bike-usage-card:hover {\n    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n    transform: translateY(-2px);\n  }\n\n  .bike-usage-card.selected {\n    background: var(--usage-color, #2E5C8A);\n    border-color: var(--usage-color, #2E5C8A);\n    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n  }\n\n  .bike-usage-card.selected .card-label,\n  .bike-usage-card.selected .card-desc,\n  .bike-usage-card.selected .card-territory,\n  .bike-usage-card.selected .card-territory-extra {\n    color: #fff;\n  }\n\n  .card-image {\n    width: 110px;\n    height: 110px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 8px;\n  }\n\n  .card-image img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n\n  .card-body {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 1px;\n  }\n\n  .card-label {\n    font-size: 0.9rem;\n    font-weight: 700;\n    color: #1a1a2e;\n    margin-bottom: 1px;\n  }\n\n  .card-desc {\n    font-size: 0.72rem;\n    color: #6B7280;\n    margin-bottom: 5px;\n  }\n\n  .card-territory {\n    font-size: 1.3rem;\n    font-weight: 900;\n    color: #1a1a2e;\n    text-transform: uppercase;\n    line-height: 1.15;\n    letter-spacing: -0.01em;\n    white-space: nowrap;\n  }\n\n  .card-territory-extra {\n    font-size: 0.55rem;\n    font-weight: 600;\n    color: #000;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n  }\n\n  .card-radio {\n    width: 28px;\n    height: 28px;\n    border-radius: 50%;\n    border: 2px solid #ccc;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin-top: 14px;\n    transition: all 0.2s ease;\n    background: transparent;\n  }\n\n  .card-radio.checked {\n    border: none;\n    background: transparent;\n  }\n\n  .check-icon {\n    width: 32px;\n    height: 32px;\n    object-fit: contain;\n  }\n\n  .btn-remove-bike {\n    background: none;\n    border: none;\n    font-size: 1.3rem;\n    line-height: 1;\n    color: #999;\n    cursor: pointer;\n    padding: 0 4px;\n    transition: color 0.2s;\n  }\n\n  .btn-remove-bike:hover {\n    color: #c53030;\n  }\n\n  .btn-add-bike {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n    width: 100%;\n    padding: 12px;\n    margin-top: 10px;\n    background: #f8f9fa;\n    border: 2px dashed #ccc;\n    border-radius: 10px;\n    color: #2E5C8A;\n    font-size: 0.9rem;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.2s;\n  }\n\n  .btn-add-bike:hover {\n    background: #eef3f8;\n    border-color: #2E5C8A;\n  }\n\n  .multi-bike-discount-note {\n    text-align: center;\n    font-size: 0.8rem;\n    color: #16a34a;\n    font-weight: 600;\n    margin-top: 8px;\n  }\n\n  :global(.price-slider-container) {\n    padding: 0 20px !important;\n  }\n\n  .price-slider-container {\n    padding: 20px 0;\n  }\n\n  :global(.rangeSlider) {\n    --range-slider: #2E5C8A !important;\n    --range-handle-inactive: #2E5C8A !important;\n    --range-handle: #2E5C8A !important;\n    --range-handle-focus: #3a7ab5 !important;\n    --range-pip: #94a3b8 !important;\n    --range-pip-text: #64748b !important;\n  }\n\n  :global(.rangeSlider .rangeHandle) {\n    width: 20px !important;\n    height: 20px !important;\n    border-radius: 50% !important;\n    background: #2E5C8A !important;\n    border: 3px solid white !important;\n    box-shadow: 0 2px 6px rgba(0,0,0,0.3) !important;\n  }\n\n  :global(.rangeSlider .rangeBar) {\n    height: 6px !important;\n    background: #2E5C8A !important;\n    border-radius: 3px !important;\n  }\n\n  :global(.rangeSlider .rangeNub) {\n    height: 6px !important;\n    background: #e2e8f0 !important;\n    border-radius: 3px !important;\n  }\n\n  :global(.rangeSlider .rangePips .pip) {\n    color: #64748b !important;\n    font-size: 11px !important;\n    font-weight: 500 !important;\n  }\n\n  :global(.rangeSlider .rangePips .pip.selected) {\n    color: #2E5C8A !important;\n    font-weight: 600 !important;\n  }\n\n  .slider-range-labels {\n    display: flex;\n    justify-content: space-between;\n    font-size: 0.8rem;\n    color: #888;\n    margin-top: 4px;\n  }\n\n  .purchase-price-label {\n    text-align: center;\n    margin-top: 12px;\n    font-size: 0.9rem;\n    color: #555;\n  }\n\n  .purchase-price {\n    color: #2E5C8A;\n    font-weight: 600;\n  }\n\n  .purchase-price-placeholder {\n    color: #888;\n    font-style: italic;\n    font-weight: 500;\n  }\n\n  .coverage-warning {\n    text-align: center;\n    margin: 8px 0 0;\n    font-size: 0.85rem;\n    color: #c53030;\n    font-weight: 600;\n  }\n\n  /* Membership radio options */\n  .membership-options {\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n    margin-top: 8px;\n  }\n\n  .membership-option {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    cursor: pointer;\n    font-size: 0.95rem;\n    color: #333;\n    padding: 4px 0;\n  }\n\n  .membership-option input[type=\"radio\"] {\n    width: 18px;\n    height: 18px;\n    accent-color: #1a1a2e;\n    cursor: pointer;\n    margin: 0;\n  }\n\n  .membership-label {\n    user-select: none;\n  }\n\n  /* Get Quote button */\n  .btn-get-quote {\n    width: 100%;\n    padding: 18px 60px;\n    font-size: 18px;\n    font-weight: 800;\n    color: #fff;\n    background: linear-gradient(135deg, #c53030 0%, #e53e3e 100%);\n    border: none;\n    border-radius: 50px;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    margin: 0.5rem auto 0 ;\n    max-width: 340px;\n    display: block;\n  }\n\n  .btn-get-quote:hover:not(:disabled) {\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n  }\n\n  .btn-get-quote:active:not(:disabled) {\n    transform: translateY(0);\n  }\n\n  .btn-get-quote:disabled {\n    opacity: 0.5;\n    cursor: not-allowed;\n  }\n\n  .multi-bike-note {\n    text-align: center;\n    font-size: 0.85rem;\n    color: #555;\n    margin: 1rem 0 0.5rem;\n    line-height: 1.5;\n  }\n\n  .footer-note {\n    text-align: center;\n    font-size: 0.8rem;\n    color: #888;\n    margin: 0.75rem 0 0;\n  }\n\n  @media (max-width: 600px) {\n    .v2-quote-title {\n      font-size: 1.3rem;\n    }\n\n    .bike-usage-options {\n      grid-template-columns: 1fr;\n    }\n\n    .bike-usage-card {\n      flex-direction: row;\n      text-align: left;\n      padding: 14px 16px;\n      gap: 16px;\n    }\n\n    .card-image {\n      width: 70px;\n      height: 70px;\n      flex-shrink: 0;\n      margin-bottom: 0;\n    }\n\n    .card-body {\n      align-items: flex-start;\n    }\n\n    .card-territory {\n      font-size: 0.9rem;\n      color: #000;\n    }\n\n    .card-territory-extra {\n      color: #000;\n    }\n\n    .card-radio {\n      position: absolute;\n      top: 8px;\n      right: 10px;\n      margin-top: 0;\n      border: none;\n    }\n\n    .card-radio:not(.checked) {\n      display: none;\n    }\n  }\n\n  /* E-bike verification modal (aligned with V1 BikeDetailsStep) */\n  .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.6);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 9999;\n    padding: 20px;\n    animation: v2-ebike-fadeIn 0.3s ease;\n  }\n\n  .modal-content {\n    background: white;\n    border-radius: 16px;\n    max-width: 600px;\n    width: 100%;\n    max-height: 90vh;\n    overflow-y: auto;\n    position: relative;\n    animation: v2-ebike-slideUp 0.3s ease;\n    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n  }\n\n  .ebike-modal {\n    padding: 2.5rem;\n  }\n\n  @media (max-width: 768px) {\n    .ebike-modal {\n      padding: 2rem 1.5rem;\n    }\n  }\n\n  .ebike-modal-title {\n    margin-bottom: 1rem;\n    color: #333;\n    text-align: center;\n    font-weight: 600;\n    font-size: 24px;\n  }\n\n  .modal-close {\n    position: absolute;\n    top: 20px;\n    right: 20px;\n    background: none;\n    border: none;\n    font-size: 32px;\n    color: #999;\n    cursor: pointer;\n    width: 40px;\n    height: 40px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 50%;\n    transition: all 0.2s;\n    line-height: 1;\n  }\n\n  .modal-close:hover {\n    background: #f5f5f5;\n    color: #333;\n  }\n\n  .ebike-requirements {\n    background: #f8f9fa;\n    border-radius: 12px;\n    padding: 1.5rem;\n    margin-bottom: 2rem;\n  }\n\n  .requirement-item {\n    display: flex;\n    align-items: center;\n    gap: 1rem;\n    padding: 0.75rem 0;\n  }\n\n  .requirement-item:not(:last-child) {\n    border-bottom: 1px solid #e0e0e0;\n  }\n\n  .requirement-item svg {\n    flex-shrink: 0;\n  }\n\n  .requirement-item span {\n    font-size: 16px;\n    color: #333;\n    font-weight: 500;\n  }\n\n  .ebike-question {\n    text-align: center;\n  }\n\n  .casual-question {\n    text-align: center;\n    color: #333;\n  }\n\n  .casual-question-prompt {\n    margin: 0 0 0.5rem;\n    font-size: 18px;\n    font-weight: 500;\n  }\n\n  .casual-question-helper {\n    margin: 0;\n    font-size: 14px;\n    color: #666;\n    line-height: 1.5;\n  }\n\n  .ebike-verification-buttons {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 1rem;\n    margin-top: 1.5rem;\n  }\n\n  .verification-btn {\n    padding: 1rem 2rem;\n    font-size: 18px;\n    font-weight: 600;\n    border: 2px solid #e0e0e0;\n    border-radius: 12px;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    background: white;\n  }\n\n  .verification-btn:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  }\n\n  .verification-yes {\n    border-color: #2e5c8a;\n    color: #2e5c8a;\n  }\n\n  .verification-yes:hover {\n    background: #2e5c8a;\n    color: white;\n  }\n\n  .verification-no {\n    border-color: #dc3545;\n    color: #dc3545;\n  }\n\n  .verification-no:hover {\n    background: #dc3545;\n    color: white;\n  }\n\n  .ebike-rejection {\n    text-align: center;\n    padding: 1rem 0;\n  }\n\n  .ebike-rejection-body {\n    margin-bottom: 1rem;\n    color: #333;\n    line-height: 1.6;\n    text-align: left;\n  }\n\n  .ebike-got-it {\n    width: 100%;\n    padding: 12px;\n    margin-top: 1rem;\n  }\n\n  @keyframes v2-ebike-fadeIn {\n    from {\n      opacity: 0;\n    }\n    to {\n      opacity: 1;\n    }\n  }\n\n  @keyframes v2-ebike-slideUp {\n    from {\n      transform: translateY(50px);\n      opacity: 0;\n    }\n    to {\n      transform: translateY(0);\n      opacity: 1;\n    }\n  }\n</style>\n","/**\n * V2 Rate Calculator\n *\n * Local rate engine that mirrors the GA underwriter pricing.\n * Per-state tables: DEFAULT, TN, TX, HI, FL — see STATE_PRICING_CONFIGS.\n *\n * Two-tier pricing: Tier 1 on first $2,000 (new rates); Tier 2 on excess (legacy pdRates/thRates).\n */\n\nconst DEFAULT_DEDUCTIBLE = 150;\nconst TIER1_AMOUNT = 2000;\n\n/**\n * Pricing matrix keyed by 2-letter state code (e.g. 'TN').\n * DEFAULT is used for any state not listed or when state is missing.\n *\n * TN differs only on PD association factor (no association discount in TN).\n * TX has custom PD rates (lower competitive Tier 1, different Tier 2 across all usages).\n * FL matches DEFAULT Tier 1 with lower Tier 2 rates (GA Florida filing).\n * intlPd / intlTh apply when usage is competitive (100% of competitive).\n */\nexport const STATE_PRICING_CONFIGS = {\n  DEFAULT: {\n    /** Tier 1 (first $2k) — new GA rates */\n    pdTier1Rates: { casual: 9.6, competitive: 10.4, ebike: 9.6 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 4.2 },\n    /** Tier 2 (above $2k) — same as legacy single-tier rates */\n    pdRates: { casual: 3.6, competitive: 10.4, ebike: 3.6 },\n    thRates: { casual: 1.2, competitive: 1.2, ebike: 4.2 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 0.9,\n      assocTh: 1.0,\n    },\n  },\n  TN: {\n    pdTier1Rates: { casual: 9.6, competitive: 10.4, ebike: 9.6 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 4.2 },\n    pdRates: { casual: 3.6, competitive: 10.4, ebike: 3.6 },\n    thRates: { casual: 1.2, competitive: 1.2, ebike: 4.2 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 1.0,\n      assocTh: 1.0,\n    },\n  },\n  TX: {\n    pdTier1Rates: { casual: 9.6, competitive: 9.6, ebike: 9.6 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 4.2 },\n    pdRates: { casual: 2.592, competitive: 7.488, ebike: 2.592 },\n    thRates: { casual: 1.2, competitive: 1.2, ebike: 4.2 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 0.9,\n      assocTh: 1.0,\n    },\n  },\n  HI: {\n    pdTier1Rates: { casual: 9.6, competitive: 10.0, ebike: 9.6 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 4.0 },\n    pdRates: { casual: 3.5, competitive: 10.0, ebike: 3.5 },\n    thRates: { casual: 1.2, competitive: 1.2, ebike: 4.0 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 0.9,\n      assocTh: 1.0,\n    },\n  },\n  FL: {\n    pdTier1Rates: { casual: 9.6, competitive: 10.4, ebike: 9.6 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 4.2 },\n    pdRates: { casual: 1.71, competitive: 4.9419, ebike: 1.71 },\n    thRates: { casual: 0.57, competitive: 0.57, ebike: 1.995 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 0.9,\n      assocTh: 1.0,\n    },\n  },\n  PA: {\n    pdTier1Rates: { casual: 11.3, competitive: 32.65, ebike: 11.3 },\n    thTier1Rates: { casual: 2.4, competitive: 2.4, ebike: 7.0 },\n    pdRates: { casual: 3.6, competitive: 10.4, ebike: 3.6 },\n    thRates: { casual: 1.2, competitive: 1.2, ebike: 4.2 },\n    dedFactors: {\n      pd: { 150: 1.0 },\n      th: { 150: 1.0 },\n    },\n    paymentFee: 2.0,\n    factors: {\n      multiBikePd: 0.95,\n      multiBikeTh: 1.0,\n      intlPd: 1.1,\n      intlTh: 1.1,\n      assocPd: 0.9,\n      assocTh: 1.0,\n    },\n    renewalFactors: {\n      1: {\n        pd: { casual: 0.8495, competitive: 0.2941, ebike: 0.8495 },\n        th: { casual: 1.0, competitive: 1.0, ebike: 0.3429 },\n      },\n      2: {\n        pd: { casual: 1.0, competitive: 0.4411, ebike: 1.0 },\n        th: { casual: 1.0, competitive: 1.0, ebike: 0.5143 },\n      },\n      3: {\n        pd: { casual: 1.0, competitive: 0.6616, ebike: 1.0 },\n        th: { casual: 1.0, competitive: 1.0, ebike: 0.7714 },\n      },\n      4: {\n        pd: { casual: 1.0, competitive: 0.9925, ebike: 1.0 },\n        th: { casual: 1.0, competitive: 1.0, ebike: 1.0 },\n      },\n      5: {\n        pd: { casual: 1.0, competitive: 1.0, ebike: 1.0 },\n        th: { casual: 1.0, competitive: 1.0, ebike: 1.0 },\n      },\n    },\n  },\n};\n\n/** @param {string | undefined | null} state */\nexport function resolvePricingConfig(state) {\n  const key = (state && String(state).trim().toUpperCase()) || '';\n  if (key && STATE_PRICING_CONFIGS[key]) {\n    return STATE_PRICING_CONFIGS[key];\n  }\n  return STATE_PRICING_CONFIGS.DEFAULT;\n}\n\n/** Default payment fee (same for all states today); use resolvePricingConfig for state-specific. */\nexport const PD_PAYMENT_FEE = STATE_PRICING_CONFIGS.DEFAULT.paymentFee;\n\nconst PA_REFERENCE_DATE = new Date(2026, 3, 29); // April 29, 2026 (month is 0-indexed)\n\n/**\n * Compute renewal period (1-5) for PA renewal customers.\n * @param {string|Date} coverageEndDate - existing policy coverage end date\n * @returns {number|null} 1-5 or null if no date (new business)\n */\nexport function computeRenewalPeriod(coverageEndDate) {\n  if (!coverageEndDate) return null;\n  const endDate = coverageEndDate instanceof Date ? coverageEndDate : new Date(coverageEndDate);\n  if (isNaN(endDate.getTime())) return null;\n  const diffMs = endDate.getTime() - PA_REFERENCE_DATE.getTime();\n  if (diffMs <= 0) return 1;\n  const yearsDiff = diffMs / (365 * 24 * 60 * 60 * 1000);\n  return Math.min(Math.max(Math.ceil(yearsDiff), 1), 5);\n}\n\n/**\n * Monthly premium for one tier band.\n * @param {number} tierAmount - Dollars in this band (e.g. 2000 for tier 1)\n * @param {number} tierRate - Annual $/100 rate for this band\n * @param {number} factorProduct - Combined modifier factors\n */\nexport function calcTierMonthly(tierAmount, tierRate, factorProduct) {\n  return Math.round((tierAmount / 100) * (tierRate / 12) * factorProduct * 100) / 100;\n}\n\n/**\n * Two-tier monthly premium for one coverage type (PD or TH).\n */\nfunction calculateCoverageMonthly(bikeValue, tier1Rate, tier2Rate, factorProduct) {\n  const tier2Amount = Math.max(0, bikeValue - TIER1_AMOUNT);\n  const tier1Monthly = calcTierMonthly(TIER1_AMOUNT, tier1Rate, factorProduct);\n  const tier2Monthly =\n    tier2Amount > 0 ? calcTierMonthly(tier2Amount, tier2Rate, factorProduct) : 0;\n  return tier1Monthly + tier2Monthly;\n}\n\nfunction rateForUsage(rates, usageType) {\n  return rates[usageType] ?? rates.casual;\n}\n\n/**\n * Calculate V2 quote for a single bike.\n *\n * @param {number} bikeValue       - Bike value in dollars\n * @param {string} usageType       - 'casual' | 'competitive' | 'ebike'\n * @param {boolean} hasAssociation - Association membership selected\n * @param {object} [opts]          - Optional overrides\n * @param {number} [opts.deductible]  - Default 150\n * @param {boolean} [opts.multiBike=false]\n * @param {string} [opts.state]    - 2-letter state code (policy location from step 0)\n * @param {boolean} [opts.international] - Override international factor; default true when usageType === 'competitive'\n * @param {boolean} [opts.includePaymentFee=true] - When false, monthly amounts exclude the policy installment fee (use when summing multiple bikes; add fee once at policy level).\n * @param {number} [opts.renewalPeriod] - PA renewal period (1-5); applies renewalFactors from config when set.\n * @returns {{ pdOnly: { monthly: number, annual: number }, pdTheft: { monthly: number, annual: number }, deductible: number }}\n */\nexport function calculateV2Quote(bikeValue, usageType, hasAssociation, opts = {}) {\n  const stateKey = (opts.state && String(opts.state).trim().toUpperCase()) || '';\n  const isPARenewal = stateKey === 'PA' && opts.renewalPeriod;\n  const cfg = isPARenewal\n    ? STATE_PRICING_CONFIGS.PA\n    : resolvePricingConfig(stateKey === 'PA' ? '' : opts.state);\n  const deductible = opts.deductible ?? DEFAULT_DEDUCTIBLE;\n  const multiBike = opts.multiBike || false;\n  const isInternational = opts.international ?? usageType === 'competitive';\n  const includePaymentFee = opts.includePaymentFee !== false;\n\n  const pdDed = cfg.dedFactors.pd[deductible] ?? 1.0;\n  const thDed = cfg.dedFactors.th[deductible] ?? 1.0;\n  const pdIntlF = isInternational ? cfg.factors.intlPd : 1.0;\n  const thIntlF = isInternational ? cfg.factors.intlTh : 1.0;\n  const pdMultiF = multiBike ? cfg.factors.multiBikePd : 1.0;\n  const thMultiF = multiBike ? cfg.factors.multiBikeTh : 1.0;\n  const pdAssocF = hasAssociation ? cfg.factors.assocPd : 1.0;\n  const thAssocF = hasAssociation ? cfg.factors.assocTh : 1.0;\n\n  let pdRenF = 1.0;\n  let thRenF = 1.0;\n  const rp = opts.renewalPeriod;\n  if (rp && cfg.renewalFactors && cfg.renewalFactors[rp]) {\n    const renCfg = cfg.renewalFactors[rp];\n    pdRenF = rateForUsage(renCfg.pd, usageType);\n    thRenF = rateForUsage(renCfg.th, usageType);\n  }\n\n  const pdTier1 = rateForUsage(cfg.pdTier1Rates, usageType);\n  const pdTier2 = rateForUsage(cfg.pdRates, usageType);\n  const thTier1 = rateForUsage(cfg.thTier1Rates, usageType);\n  const thTier2 = rateForUsage(cfg.thRates, usageType);\n\n  const pdFactor = pdDed * pdIntlF * pdMultiF * pdAssocF * pdRenF;\n  const thFactor = thDed * thIntlF * thMultiF * thAssocF * thRenF;\n\n  const pdMonthly = calculateCoverageMonthly(bikeValue, pdTier1, pdTier2, pdFactor);\n  const thMonthly = calculateCoverageMonthly(bikeValue, thTier1, thTier2, thFactor);\n\n  const fee = includePaymentFee ? cfg.paymentFee : 0;\n  const pdOnlyMonthly = pdMonthly + fee;\n  const pdTheftMonthly = pdMonthly + thMonthly + fee;\n\n  return {\n    pdOnly: { monthly: pdOnlyMonthly, annual: pdMonthly * 12 },\n    pdTheft: { monthly: pdTheftMonthly, annual: (pdMonthly + thMonthly) * 12 },\n    deductible,\n  };\n}\n\n/**\n * Calculate V2 quote for multiple bikes.\n * Each bike is rated individually with its own usage type;\n * multi-bike discount applies when count > 1.\n * Payment fee is applied once per policy, not per bike.\n *\n * @param {{ value: number, usageType: string }[]} bikes - Array of bike objects\n * @param {boolean} hasAssociation\n * @param {object} [opts]\n * @param {string} [opts.state] - 2-letter state code\n * @returns {{ pdOnly: { monthly: number, annual: number }, pdTheft: { monthly: number, annual: number }, deductible: number, bikeCount: number, perBike: Array, paymentFee: number }}\n */\nexport function calculateV2MultiQuote(bikes, hasAssociation, opts = {}) {\n  const cfg = resolvePricingConfig(opts.state);\n  const fee = cfg.paymentFee;\n  const multiBike = bikes.length > 1;\n\n  const perBike = bikes.map((b) =>\n    calculateV2Quote(b.value, b.usageType, hasAssociation, {\n      ...opts,\n      multiBike,\n      includePaymentFee: false,\n    }),\n  );\n\n  let pdSum = 0;\n  let thSum = 0;\n  let pdAnnualSum = 0;\n  let thAnnualSum = 0;\n\n  for (const q of perBike) {\n    const pdM = q.pdOnly.monthly;\n    const thM = q.pdTheft.monthly - q.pdOnly.monthly;\n    pdSum += pdM;\n    thSum += thM;\n    pdAnnualSum += q.pdOnly.annual;\n    thAnnualSum += q.pdTheft.annual - q.pdOnly.annual;\n  }\n\n  const deductible = perBike[0]?.deductible ?? opts.deductible ?? DEFAULT_DEDUCTIBLE;\n\n  return {\n    pdOnly: { monthly: pdSum + fee, annual: pdAnnualSum },\n    pdTheft: { monthly: pdSum + thSum + fee, annual: pdAnnualSum + thAnnualSum },\n    deductible,\n    bikeCount: bikes.length,\n    perBike,\n    paymentFee: fee,\n  };\n}\n","<script>\n  import { createEventDispatcher } from 'svelte';\n  import { calculateV2Quote, calculateV2MultiQuote, resolvePricingConfig } from './v2RateCalculator.js';\n\n  export let bikes = [];\n  export let hasAssociation = false;\n  /** 2-letter state code from policy location (step 0); empty uses DEFAULT pricing */\n  export let stateCode = '';\n\n  const dispatch = createEventDispatcher();\n\n  const USAGE_META = {\n    casual: {\n      label: 'casual',\n      image: '/static/Bikeinsure-iCON-CASUAL_COMP.png',\n      color: '#002B5C',\n      headline: 'Casual \\u2022 Non-competitive',\n      territory: 'USA + Canada Territory',\n    },\n    competitive: {\n      label: 'competitive',\n      image: '/static/Bikeinsure-iCON-COMPETITIVE_COMP.png',\n      color: '#c53030',\n      headline: 'Competitive \\u2022 Casual riding + racing events',\n      territory: 'Worldwide territory',\n    },\n    ebike: {\n      label: 'ebike',\n      image: '/static/Bikeinsure-iCON-EBIKE_COMP.png',\n      color: '#1A5F92',\n      headline: 'Electric Bike \\u2022 Up to 28 mph pedal assist',\n      territory: 'USA + Canada Territory',\n    },\n  };\n\n  /** Coverage grid: competitive = worldwide; casual + ebike only = USA + Canada */\n  $: territoryInclusionLabel = bikes.some((b) => b.usageType === 'competitive')\n    ? 'Worldwide territory'\n    : 'USA + Canada Territory';\n\n  let selectedPlans = bikes.map(() => 'pdTheft');\n\n  $: multiBike = bikes.length > 1;\n  $: pricingCfg = resolvePricingConfig(stateCode);\n  $: multiResult = calculateV2MultiQuote(bikes, hasAssociation, { state: stateCode });\n  $: perBikeQuotes = multiResult.perBike;\n\n  function fmtPrice(val) {\n    return val % 1 === 0 ? `$${val}.00` : `$${val.toFixed(2)}`;\n  }\n\n  function fmtValue(val) {\n    return val.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0 });\n  }\n\n  $: anyTheft = selectedPlans.some(p => p === 'pdTheft');\n  $: allTheft = selectedPlans.every(p => p === 'pdTheft');\n  $: theftLabel = allTheft ? 'Theft selected' : anyTheft ? 'Theft on some bikes' : 'Theft optional';\n  $: theftHighlight = anyTheft;\n\n\n  $: deductible = perBikeQuotes.length > 0 ? perBikeQuotes[0].deductible : 150;\n\n  function handleContinue() {\n    dispatch('continue', { bikes, hasAssociation, selectedPlans });\n  }\n</script>\n\n<div class=\"v2-result-container\">\n  <div class=\"v2-result-content\">\n\n    {#each bikes as bike, i}\n      {@const bq = perBikeQuotes[i]}\n      {@const meta = USAGE_META[bike.usageType] || USAGE_META.casual}\n      <div class=\"bike-quote-card\">\n        <div class=\"bike-quote-header\">\n          <img class=\"bike-quote-icon\" src={meta.image} alt={meta.label} />\n          <h2 class=\"result-title\">Your BikeInsure Quote</h2>\n          <div class=\"bike-quote-coverage\">{fmtValue(bike.value)} Coverage</div>\n          <div class=\"bike-quote-usage\">{meta.headline}</div>\n        </div>\n        <div class=\"plan-toggle\" style=\"--plan-color: {meta.color}\">\n          <button\n            class=\"plan-btn\"\n            class:selected={selectedPlans[i] === 'pdOnly'}\n            on:click={() => { selectedPlans[i] = 'pdOnly'; selectedPlans = selectedPlans; }}\n          >\n            <span class=\"plan-name\">Bike Coverage Only</span>\n            <span class=\"plan-price-row\">\n              <span class=\"plan-price\">{fmtPrice(bq.pdOnly.monthly)}<span class=\"plan-period\">/mo.</span></span>\n              {#if selectedPlans[i] === 'pdOnly'}\n                <img class=\"plan-check\" src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n              {/if}\n            </span>\n          </button>\n\n          <button\n            class=\"plan-btn\"\n            class:selected={selectedPlans[i] === 'pdTheft'}\n            on:click={() => { selectedPlans[i] = 'pdTheft'; selectedPlans = selectedPlans; }}\n          >\n            <span class=\"plan-name\">Bike Coverage + Theft</span>\n            <span class=\"plan-price-row\">\n              <span class=\"plan-price\">{fmtPrice(bq.pdTheft.monthly)}<span class=\"plan-period\">/mo.</span></span>\n              {#if selectedPlans[i] === 'pdTheft'}\n                <img class=\"plan-check\" src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n              {/if}\n            </span>\n          </button>\n        </div>\n      </div>\n    {/each}\n\n\n    <p class=\"plan-subtitle\">Annual Policy &bull; Monthly payments</p>\n\n    <h3 class=\"covered-heading\">Your Coverage Includes:</h3>\n\n    <div class=\"coverage-grid\">\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>Accidental damage</span>\n      </div>\n      <div class=\"cov-item\" class:cov-disabled={!anyTheft}>\n        {#if anyTheft}\n          <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n          <span class=\"cov-highlight\">Theft protection added</span>\n        {:else}\n          <svg class=\"cov-x\" viewBox=\"0 0 270 270\" fill=\"currentColor\"><path transform=\"scale(0.527344 0.527344)\" d=\"M394.445 90.0744C402.035 88.6991 417.425 105.863 420.546 110.727C426.393 119.838 414.335 127.854 408.439 133.74L310.459 231.57C302.306 239.714 293.926 247.65 285.876 255.893C289.062 259.453 292.655 262.696 296.042 266.067L408.284 377.944C415.385 385.046 428.101 392.417 418.415 402.554C414.952 406.18 411.385 409.701 407.85 413.256C402.762 418.372 397.25 425.595 389.676 419.313C384.669 415.159 380.155 410.028 375.549 405.422L292.904 322.755C280.616 310.419 268.403 298.004 255.937 285.846C251.458 290.797 246.541 295.45 241.793 300.146L130.339 412.007C127.276 415.08 123.936 419.284 120.149 421.388C111.871 423.694 105.62 414.497 100.432 409.413C83.5272 392.849 89.4608 392.202 103.697 377.95L214.638 266.773C218.313 263.132 222.184 259.645 225.744 255.893L107.784 137.166C103.422 132.817 91.5547 123.485 90.7551 117.192C89.8196 109.83 96.7627 105.537 101.348 100.972C106.212 96.1297 113.449 85.6805 121.431 91.8353C126.259 95.5575 130.582 100.643 134.886 104.97L241.597 211.066C246.348 215.736 250.961 220.654 255.937 225.077C258.654 222.207 261.562 219.507 264.36 216.715L374.491 107.33C379.4 102.527 387.878 91.3872 394.445 90.0744Z\"/></svg>\n          <span>Theft not included</span>\n        {/if}\n      </div>\n\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>Transit included</span>\n      </div>\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>Replacement-cost value</span>\n      </div>\n\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>Listed accessories</span>\n      </div>\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>No depreciation</span>\n      </div>\n\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>{territoryInclusionLabel}</span>\n      </div>\n      <div class=\"cov-item\">\n        <img class=\"cov-check\" src=\"/static/frontend/check-mark-black.png\" alt=\"✓\" />\n        <span>${deductible} deductible</span>\n      </div>\n    </div>\n\n    {#if bikes.length > 1}\n      <p class=\"multi-bike-note\">{bikes.length} bikes &mdash; multi-bike discount applied</p>\n    {:else}\n      <p class=\"multi-bike-note\">Multi-bike discount available &ndash;<br/>add another bike at enrollment.</p>\n    {/if}\n\n    <button class=\"btn-cta\" on:click={handleContinue}>Get Covered Today</button>\n\n    <p class=\"footer-note\">Secure enrollment &bull; Coverage starts same day</p>\n  </div>\n</div>\n\n<style>\n  .v2-result-container {\n    display: flex;\n    justify-content: center;\n    padding: 2rem 1rem;\n    min-height: 100%;\n  }\n\n  .v2-result-content {\n    max-width: 480px;\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n  }\n\n  .bike-quote-card {\n    width: 100%;\n    margin-bottom: 1rem;\n  }\n\n  .bike-quote-header {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    text-align: center;\n    gap: 4px;\n    margin-bottom: 1.25rem;\n  }\n\n  .bike-quote-icon {\n    width: 150px;\n    height: 150px;\n    object-fit: contain;\n    margin-bottom: 8px;\n  }\n\n  .result-title {\n    font-size: 1.65rem;\n    font-weight: 800;\n    color: #1a1a2e;\n    margin: 0;\n  }\n\n  .bike-quote-coverage {\n    font-size: 1.2rem;\n    font-weight: 700;\n    color: #1a1a2e;\n  }\n\n  .bike-quote-usage {\n    font-size: 0.95rem;\n    font-weight: 500;\n    color: #444;\n  }\n\n\n  .plan-toggle {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 12px;\n    width: 100%;\n    margin-bottom: 0.75rem;\n  }\n\n  .plan-btn {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: 18px 14px;\n    border: 2px solid #ccc;\n    border-radius: 10px;\n    background: #fff;\n    cursor: pointer;\n    transition: all 0.25s ease;\n    text-align: center;\n  }\n\n  .plan-btn:hover {\n    border-color: #999;\n  }\n\n  .plan-btn.selected {\n    background: var(--plan-color, #1a1a2e);\n    border-color: var(--plan-color, #1a1a2e);\n    color: #fff;\n  }\n\n  .plan-btn.selected .plan-name,\n  .plan-btn.selected .plan-price,\n  .plan-btn.selected .plan-period {\n    color: #fff;\n  }\n\n  .plan-price-row {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n  }\n\n  .plan-check {\n    width: 22px;\n    height: 22px;\n    object-fit: contain;\n    flex-shrink: 0;\n    margin-left:23px;\n  }\n\n  .plan-name {\n    font-size: 1.1rem;\n    font-weight: 600;\n    color: #333;\n    margin-bottom: 4px;\n  }\n\n  .plan-price {\n    font-size: 1.5rem;\n    font-weight: 800;\n    color: #1a1a2e;\n    line-height: 1.1;\n  }\n\n  .plan-period {\n    font-size: 0.85rem;\n    font-weight: 500;\n    color: #555;\n  }\n\n  .plan-subtitle {\n    font-size: 0.85rem;\n    color: #555;\n    text-align: center;\n    margin: 0 0 1.5rem;\n    font-weight: 500;\n  }\n\n  .covered-heading {\n    font-size: 1.1rem;\n    font-weight: 800;\n    color: #1a1a2e;\n    text-align: center;\n    letter-spacing: 0.01em;\n    margin: 0 0 1rem;\n  }\n\n  .coverage-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 14px 24px;\n    width: 100%;\n    padding: 0 0.25rem;\n    margin-bottom: 1.5rem;\n  }\n\n  .cov-item {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 1rem;\n    font-weight: 600;\n    color: #1a1a2e;\n  }\n\n  .cov-check {\n    width: 20px;\n    height: 20px;\n    flex-shrink: 0;\n  }\n\n  .cov-highlight {\n    color: #2E5C8A;\n    font-weight: 700;\n  }\n\n  .cov-disabled {\n    color: #888888;\n  }\n\n  .cov-x {\n    width: 18px;\n    height: 18px;\n    flex-shrink: 0;\n  }\n\n  .multi-bike-note {\n    font-size: 0.85rem;\n    color: #555;\n    text-align: center;\n    margin: 0 0 1.5rem;\n    line-height: 1.5;\n  }\n\n  .btn-cta {\n    width: 70%;\n    padding: 16px 40px;\n    font-size: 1.15rem;\n    font-weight: 700;\n    color: #fff;\n    background: #c53030;\n    border: none;\n    border-radius: 50px;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    letter-spacing: 0.01em;\n  }\n\n  .btn-cta:hover {\n    background: #b12828;\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n  }\n\n  .btn-cta:active {\n    transform: translateY(0);\n  }\n\n  .footer-note {\n    font-size: 0.8rem;\n    color: #777;\n    text-align: center;\n    margin-top: 0.75rem;\n  }\n\n  @media (max-width: 480px) {\n    .plan-toggle {\n      grid-template-columns: 1fr;\n    }\n\n    .coverage-grid {\n      gap: 10px 16px;\n    }\n\n    .cov-item {\n      font-size: 0.88rem;\n    }\n\n    .btn-cta {\n      width: 85%;\n    }\n  }\n</style>\n","<script>\n  import { createEventDispatcher, getContext, onMount, onDestroy } from 'svelte';\n  import V2QuoteStep from './v2/V2QuoteStep.svelte';\n  import V2QuoteResult from './v2/V2QuoteResult.svelte';\n\n  const dispatch = createEventDispatcher();\n  const ctx = getContext('app');\n\n  /** Policy location state (2-letter), from App after step 0 */\n  export let stateCode = '';\n\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const legalDisclaimer = INITIAL_DATA.disclaimers?.welcome || '<p>Ride Covered LLC dba BikeInsure is a specialty insurance agency dedicated to offering cyclists in the United States affordable bicycle coverage. The BikeInsure plan is administered by a licensed insurance producer BikeInsure is not an insurance company. BikeInsure is a service mark of Ride Covered LLC. Actual insurance coverage is recommended, solicited, and sold by BikeInsure (in California, BikeInsure Insurance Solutions). To learn about terms, conditions, pricing, and other details please visit the BikeInsure website.</p>';\n\n  let v2Step = 1;\n  let quoteInputs = { bikes: [], hasAssociation: false };\n\n  // Lifted form state so V2QuoteStep can be restored on back navigation\n  let formState = null;\n\n  function handleGetQuote(event) {\n    const { bikes, membership } = event.detail;\n    const hasAssociation = membership && membership !== 'none';\n    quoteInputs = { bikes, hasAssociation, membership };\n\n    // Save form state for back-nav restoration\n    formState = {\n      bikes: bikes.map(b => ({\n        value: [b.value],\n        usageType: b.usageType,\n        coverageTouched: true,\n      })),\n      selectedMembership: membership,\n    };\n\n    v2Step = 2;\n    history.pushState({ v2Step: 2 }, '');\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n  }\n\n  function handlePopState(event) {\n    if (v2Step > 1) {\n      v2Step = v2Step - 1;\n    }\n  }\n\n  onMount(() => {\n    window.addEventListener('popstate', handlePopState);\n  });\n\n  onDestroy(() => {\n    window.removeEventListener('popstate', handlePopState);\n  });\n\n  function handleQuoteResultContinue(event) {\n    const { bikes, hasAssociation, selectedPlans } = event.detail;\n    dispatch('continueToEnrollment', {\n      bikes,\n      hasAssociation,\n      selectedPlans,\n      membership: quoteInputs.membership,\n    });\n  }\n</script>\n\n<div class=\"v2-flow\">\n  {#if v2Step === 1}\n    <V2QuoteStep initialState={formState} on:getQuote={handleGetQuote} />\n  {:else if v2Step === 2}\n    <V2QuoteResult\n      bikes={quoteInputs.bikes}\n      hasAssociation={quoteInputs.hasAssociation}\n      {stateCode}\n      on:continue={handleQuoteResultContinue}\n    />\n  {/if}\n\n  <div class=\"v2-legal-text\">\n    {@html legalDisclaimer}\n  </div>\n</div>\n\n<style>\n  .v2-flow {\n    width: 100%;\n  }\n\n  .v2-legal-text {\n    max-width: 520px;\n    margin: 0 auto;\n    padding: 1.5rem 1rem 2rem;\n    font-size: 11px;\n    line-height: 1.4;\n    color: #888;\n    text-align: justify;\n  }\n</style>\n","<script>\n  import { getContext } from 'svelte';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  \n  // Access context values\n  $: partnerSlug = ctx.partnerSlug;\n  $: API_BASE_URL = ctx.API_BASE_URL;\n  \n  // Get pricing from context\n  const { pricing } = ctx;\n  const basePrice = pricing.formatPrice(pricing.BASE_PRICE);\n  const theftPrice = pricing.formatPrice(pricing.getTheftPrice());\n  const theftAddon = pricing.formatPrice(pricing.THEFT_ADDON);\n  \n  // Get disclaimers from INITIAL_DATA\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const welcomeDisclaimer = INITIAL_DATA.disclaimers?.welcome || '<p>Ride Covered LLC dba BikeInsure is a specialty insurance agency dedicated to offering cyclists in the United States affordable bicycle coverage. The BikeInsure plan is administered by a licensed insurance producer BikeInsure is not an insurance company. BikeInsure is a service mark of Ride Covered LLC. Actual insurance coverage is recommended, solicited, and sold by BikeInsure (in California, BikeInsure Insurance Solutions). To learn about terms, conditions, pricing, and other details please visit the BikeInsure website.</p>';\n  \n  // No validation needed for welcome step\n  export function validateWelcome() {\n    return true;\n  }\n</script>\n\n<div class=\"welcome-container\">\n  <div class=\"welcome-content\">\n    <p class=\"welcome-intro\">\n      Based on your state, this is the current BikeInsure coverage available to you.\n    </p>\n    <p class=\"welcome-territory\">\n      The policy's coverage territory includes United States and Canada.\n    </p>\n\n    <!-- Coverage Cards -->\n    <div class=\"coverage-cards\">\n      <!-- Ba sic Coverage Card -->\n      <div class=\"coverage-card basic-coverage\">\n        <div class=\"card-header\">\n          <img src=\"/static/simple-logo.png\" alt=\"BikeInsure\" class=\"card-logo\" />\n          <h2 class=\"coverage-title\"><span class=\"coverage-type\">Bike</span>Coverage</h2>\n          <div class=\"price\">\n            <span class=\"amount\">${basePrice}</span>\n            <span class=\"period\">/mo.</span>\n          </div>\n        </div>\n        \n        <div class=\"coverage-details\">\n          <div class=\"coverage-limit\">$100 DEDUCTIBLE</div>\n          <div class=\"coverage-limit\">$10,000 LIMIT</div>\n          <div class=\"coverage-types\">BIKE | ACCESSORIES | TRANSIT</div>\n        </div>\n      </div>\n      \n      <!-- Theft Protection Card -->\n      <div class=\"coverage-card theft-protection\">\n        <div class=\"card-header\">\n          <div class=\"shield-icon\"><img src=\"/static/shield.png\" alt=\"BikeInsure\" class=\"card-logo\" /></div>\n          <h2 class=\"coverage-title\"><span class=\"coverage-type\">Theft</span>Protection</h2>\n          <div class=\"price\">\n            <span class=\"plus\">+</span>\n            <span class=\"amount\">${theftAddon}</span>\n            <span class=\"period\">/mo.</span>\n          </div>\n        </div>\n        \n        <div class=\"coverage-details\">\n          <div class=\"coverage-limit\">$250 DEDUCTIBLE</div>\n          <div class=\"coverage-limit\">$10,000 LIMIT</div>\n          <div class=\"coverage-types\">+ THEFT</div>\n        </div>\n      </div>\n    </div>\n    \n    <!-- Get Started Button -->\n    <button class=\"get-started-btn\" on:click={ctx.nextStep}>\n      Get BikeInsure\n    </button>\n    \n    <!-- Legal Text -->\n    <div class=\"legal-text\">\n      {@html welcomeDisclaimer}\n    </div>\n  </div>\n</div>\n\n<style>\n  .welcome-container {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n\n    margin-top: 40px;\n  }\n  \n  .welcome-content {\n    max-width: 500px;\n    width: 100%;\n    text-align: center;\n  }\n\n  .welcome-intro {\n    font-size: 1.4rem;\n    font-weight: 600;\n    color: #242424;\n    margin: -30px 0 0.5rem;\n    line-height: 1.5;\n  }\n\n  .welcome-territory {\n    font-size: 1rem;\n    font-weight: 400;\n    font-style: normal;\n    color: #4b5563;\n    margin: 0 0 60px;\n    line-height: 1.5;\n  }\n\n  .tagline {\n    font-size: 18px;\n    color: #666;\n    font-weight: 300;\n    margin: 0;\n    font-style: italic;\n  }\n  \n  .coverage-cards {\n    display: flex;\n    flex-direction: column;\n    gap: 60px;\n    margin-bottom: 40px;\n  }\n  \n  .coverage-card {\n    border-radius: 12px;\n    padding: 25px;\n    color: white;\n    text-align: center;\n    box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);\n  }\n  \n  .basic-coverage {\n    background: #001535;\n  }\n  \n  .theft-protection {\n    background: #001535;\n  }\n  \n  .card-header {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin-bottom: 20px;\n  }\n  \n  .card-logo {\n    height: 90px;\n    width: auto;\n    margin-bottom: 10px;\n    margin-top: -62px;\n  }\n  \n  .shield-icon {\n    font-size: 40px;\n    margin-bottom: 10px;\n  }\n  \n  .coverage-title {\n    font-size: 32px;\n    font-weight: 300;\n    margin: 0 0 15px 0;\n    line-height: 1.2;\n  }\n  \n  .coverage-type {\n    font-weight: 600;\n  }\n  \n  .price {\n    display: flex;\n    align-items: baseline;\n    justify-content: center;\n    gap: 5px;\n    margin-bottom: 15px;\n  }\n  \n  .plus {\n    font-size: 24px;\n    font-weight: 300;\n  }\n  \n  .amount {\n    font-size: 36px;\n    font-weight: 700;\n  }\n  \n  .period {\n    font-size: 16px;\n    font-weight: 300;\n  }\n  \n  .coverage-details {\n    border-top: 1px solid rgba(255, 255, 255, 0.3);\n    padding-top: 15px;\n  }\n  \n  .coverage-limit {\n    font-size: 16px;\n    font-weight: 600;\n    margin-bottom: 10px;\n    letter-spacing: 0.5px;\n  }\n  \n  .coverage-types {\n    font-size: 14px;\n    font-weight: 600;\n    letter-spacing: 0.5px;\n    margin-top:20px;\n  }\n  \n  .get-started-btn {\n    background: linear-gradient(135deg, #c53030 0%, #e53e3e 100%);\n    color: white;\n    border: none;\n    border-radius: 50px;\n    padding: 18px 60px;\n    font-size: 18px;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    margin-bottom: 30px;\n  }\n  \n  .get-started-btn:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n  }\n  \n  .get-started-btn:active {\n    transform: translateY(0);\n  }\n  \n  .legal-text {\n    font-size: 11px;\n    line-height: 1.4;\n    color: #666;\n    text-align: justify;\n    padding: 0 10px;\n  }\n  \n  .legal-text p {\n    margin: 0;\n  }\n  \n  @media (max-width: 768px) {\n    .welcome-container {\n      padding: 15px;\n    }\n    \n    .welcome-content {\n      max-width: 100%;\n    }\n    \n    .main-logo {\n      height: 100px;\n    }\n    \n    .tagline {\n      font-size: 16px;\n    }\n    \n    .coverage-card {\n      padding: 20px;\n    }\n    \n    \n    .amount {\n      font-size: 28px;\n    }\n    \n    .get-started-btn {\n      padding: 15px 50px;\n      font-size: 16px;\n    }\n    \n    .legal-text {\n      font-size: 10px;\n    }\n  }\n</style>\n","<div class=\"help-block\">\n  <div class=\"help-info\">\n    <span class=\"help-title\">Having an enrollment issue?</span>\n    <a href=\"mailto:help@bikeinsure.com\" class=\"help-link\">help@bikeinsure.com</a>\n    <a href=\"tel:8882453467\" class=\"help-link\">888-245-3467</a>\n  </div>\n  <div class=\"help-divider\"></div>\n  <div class=\"help-icon\">\n    <img src=\"/static/frontend/help-icon.png\" alt=\"Help\" />\n  </div>\n</div>\n\n<style>\n  .help-block {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 1rem;\n    max-width: 270px;\n    margin: 2rem auto 1rem;\n    padding: 0.75rem 1.25rem;\n    background: #f8f9fa;\n    border: 1px solid #e0e0e0;\n    border-radius: 15px;\n    font-size: 0.65rem;\n  }\n\n  .help-info {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 0.1rem;\n  }\n\n  .help-title {\n    font-size: 0.7rem;\n    font-weight: 700;\n    color: #1a1a1a;\n  }\n\n  .help-link {\n    font-size: 0.65rem;\n    color: #555;\n    text-decoration: none;\n  }\n\n  .help-link:hover {\n    text-decoration: underline;\n    color: #333;\n  }\n\n  .help-divider {\n    width: 1px;\n    height: 40px;\n    background: #ccc;\n  }\n\n  .help-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-shrink: 0;\n  }\n\n  .help-icon img {\n    width: 40px;\n    height: 40px;\n  }\n</style>\n","<script>\n  // This component includes code in the root HTML file that loads this component to override the default Google Places autocomplete styles set on shadow root elements\n\n  import { onMount, createEventDispatcher } from 'svelte';\n\n  let inputElement;\n  let mapElement;\n  let map;\n  let marker;\n\n  const dispatch = createEventDispatcher();\n\n  export let apiKey = process.env.GOOGLE_MAPS;\n  export let placeholder = 'Enter a location';\n  export let country = 'US';\n  export let error = [];\n  export let ColumnAddressDisplay = false;\n  export let vertical = false;\n  export let hideMap = true;\n  export let address = '';\n\n  export let countries = [{value: 'US', label: 'United States'}, {value: 'CA', label: 'Canada'}];\n  let selected = '';\n\n  let autocomplete;\n  let isUserSelecting = false; // Flag to prevent reactive update during user selection\n  let lastSetAddress = ''; // Track the last address we set programmatically\n\n  $:console.log('DEBUG: PlaceAutocomplete selected:', address);\n  \n  // Reactively update the input when address prop changes\n  // BUT only if it's different from what we last set and user isn't actively selecting\n  $: if (autocomplete && address && !isUserSelecting && address !== lastSetAddress) {\n    updateInputValue(address);\n  }\n  \n  function setAutocompleteValue(value) {\n    if (!autocomplete || !value) return;\n    \n    try {\n      // Track that we're setting this programmatically\n      lastSetAddress = value;\n      \n      // Try to access the shadow root (Google's component uses Shadow DOM)\n      const shadowRoot = autocomplete.shadowRoot;\n      if (shadowRoot) {\n        const input = shadowRoot.querySelector('input');\n        if (input) {\n          input.value = value;\n          // Trigger input event so Google knows the value changed\n          input.dispatchEvent(new Event('input', { bubbles: true }));\n          // Blur the input to prevent Google from opening the address picker\n          input.blur();\n          console.log('Set autocomplete value via shadowRoot:', value);\n          return;\n        }\n      }\n      \n      // Fallback: Try to find input in regular DOM\n      const input = autocomplete.querySelector('input');\n      if (input) {\n        input.value = value;\n        input.dispatchEvent(new Event('input', { bubbles: true }));\n        // Blur the input to prevent Google from opening the address picker\n        input.blur();\n        console.log('Set autocomplete value via querySelector:', value);\n      }\n    } catch (error) {\n      console.error('Error setting autocomplete value:', error);\n    }\n  }\n  \n  function updateInputValue(value) {\n    setAutocompleteValue(value);\n  }\n\n  onMount(() => {\n    if (!window.google) {\n      const script = document.createElement('script');\n      script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places,marker`;\n      script.async = true;\n      script.onload = () => {\n        initMap();\n        initAutocomplete();\n      };\n      document.body.appendChild(script);\n    } else {\n      initMap();\n      initAutocomplete();\n    }\n  });\n\n  function initMap() {\n    if (!mapElement) return;\n    const position = { lat: 0, lng: 0 };\n    map = new google.maps.Map(mapElement, {\n      center: position,\n      zoom: 10,\n      mapId: 'address_map',\n    });\n    const pinElement = new google.maps.marker.PinElement({\n      scale: 0.8,\n    });\n    marker = new google.maps.marker.AdvancedMarkerElement({\n      map,\n      position,\n      content: pinElement.element,\n    });\n  }\n\n  function initAutocomplete() {\n    if (!inputElement) return;\n    \n    // Remove existing autocomplete element if it exists\n    const existingAutocomplete = inputElement.querySelector('gmp-place-autocomplete');\n    if (existingAutocomplete) {\n      existingAutocomplete.remove();\n    }\n    \n    autocomplete = new google.maps.places.PlaceAutocompleteElement({\n      includedRegionCodes: Object.values(countries).map(c => c.value.toLowerCase()),\n    });\n    inputElement.appendChild(autocomplete);\n    \n    // Use the new event handling approach for PlaceAutocompleteElement\n    autocomplete.addEventListener('gmp-select', handlePlaceChanged);\n    autocomplete.addEventListener('changed', onInput);\n    \n    // Set initial value if address is provided\n    // Wait longer for the Google component to fully initialize\n    // Try multiple times with increasing delays as Google might reset the field\n    if (address) {\n      const attempts = [200, 500, 1000];\n      attempts.forEach(delay => {\n        setTimeout(() => {\n          setAutocompleteValue(address);\n        }, delay);\n      });\n    }\n    autocomplete.style.setProperty('background-color', 'transparent');\n    autocomplete.style.setProperty('height', '42px');\n    autocomplete.style.setProperty('border-radius', '6px');\n    autocomplete.style.setProperty('border', 'solid 1px #d7d9dd');\n\n    // Detect clicks on the clear button (far right side of input)\n    autocomplete.addEventListener('click', handleClearButtonClick);\n  }\n  \n  function handleClearButtonClick(event) {\n    const rect = autocomplete.getBoundingClientRect();\n    const clickX = event.clientX;\n    const clearButtonZone = rect.right - 40; // Clear button is typically in the last 40px\n    \n    // If click is in the clear button area\n    if (clickX >= clearButtonZone && selected) {\n      // Check if the input gets cleared after a short delay      \n      handleInputCleared();\n    }\n  }\n  \n  function handleInputCleared() {\n    // Reset selected data\n    console.log('Clear button clicked - input cleared');\n    selected = '';\n    \n    // Reset map if it exists\n    if (map) {\n      map.setCenter({ lat: 0, lng: 0 });\n      map.setZoom(10);\n      marker.position = { lat: 0, lng: 0 };\n    }\n    \n    // Dispatch clear event\n    dispatch('clear');\n    dispatch('select', null);\n  }\n\n  function onInput(event) {\n    console.log(event);\n  }\n\n  // Create a named function for the event handler so we can remove it\n  async function handlePlaceChanged({ placePrediction }) {\n    // Set flag to prevent reactive update while user is selecting\n    isUserSelecting = true;\n    \n    const place = placePrediction.toPlace();\n    await place.fetchFields({ fields: ['addressComponents', 'formattedAddress', 'adrFormatAddress', 'location'] });\n    selected = parseAddress(place);\n    country = selected.country;\n    \n    // Update lastSetAddress to the new address the user selected\n    lastSetAddress = selected.line1 || '';\n    \n    // Update map\n    if (map && place.location) {\n      map.setCenter(place.location);\n      map.setZoom(15);\n      marker.position = place.location;\n    }\n    dispatch('select', selected);\n    \n    // Reset flag after a short delay to allow parent component to update\n    setTimeout(() => {\n      isUserSelecting = false;\n    }, 500);\n  }\n\n  function parseAddress(place) {\n    error = [];\n    const components = {};\n    if (place) {\n      place.addressComponents?.forEach(component => {\n        const types = component.types;\n        \n        if (types.includes('street_number')) components.street_number = component.longText;\n        if (types.includes('route')) components.route = component.longText;\n        if (types.includes('locality')) components.city = component.longText;\n        if (types.includes('administrative_area_level_1')) components.state = component.shortText;\n        if (types.includes('country')) components.country = component.shortText;\n        if (types.includes('postal_code')) components.postal_code = component.longText;\n        if (types.includes('subpremise')) components.subpremise = component.longText;\n        if (!components.city && types.includes('sublocality')) {\n          components.city = component.longText;\n        }\n        if (!components.city && types.includes('postal_town')) {\n          components.city = component.longText;\n        }\n      });\n      \n      components.line1 = `${components.street_number || ''} ${components.route || ''} ${components.subpremise ? `, ${components.subpremise}` : ''}`.trim();\n    }\n    return components;\n  }\n\n  function updateCountry() {\n    selected = '';\n    inputElement.value = '';\n\n    if (autocomplete) {\n      // Remove the old event listener properly\n      autocomplete.removeEventListener('gmp-select', handlePlaceChanged);\n      initAutocomplete();\n    }\n  }\n\n  export function getValue() {\n    const place = autocomplete.getPlace();\n    return parseAddress(place);\n  }\n</script>\n\n<style type=\"text/scss\">\n  input {\n    padding: 0.5rem 0.75rem;\n    width: 100%;\n    font-size: 1rem;\n    border: 1px solid #ccc;\n    border-radius: 6px;\n  }\n\n  .map {\n    width:100%;\n    height:0;    \n\n    &.selected {\n      height:200px;\n      @media screen and (max-width: 768px) {\n        height:170px;\n      }\n    }\n  }\n\n\n  .error {\n    bottom: -17px;\n  }\n\n  .address-error {\n    border: 1px solid red !important;\n    border-radius: 6px;\n  }\n\n  .place-autocomplete-card {\n    width: 100%;\n    background: white;\n    border-radius: 7px;\n\n\n  }\n  :global(.place-autocomplete-card input ){\n    color:black !important;\n  }\n\n  .map-container {\n    border: 5px solid white;\n    border-radius: 7px;\n    box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);\n    margin-top:10px;\n    &:not(.selected) {\n      display:none;\n    }\n  }\n\n</style>\n\n<div class=\"flex items-start flex-col-reverse {!vertical ? 'sm:flex-row' : ''} {$$props.class || ''}\" class:vertical={vertical}>\n  <div class=\"flex-1 w-full max-xs:w-full\">\n    <div class=\"place-autocomplete-card\" class:address-error={error?.length} id=\"place-autocomplete-card\" bind:this={inputElement}>\n      <gmpx-place-autocomplete bind:this={autocomplete} />\n    </div>\n  </div>  \n</div>\n{#if Array.isArray(error) && error.length}\n  <p class=\"error text-left mt-1 text-red-600 text-xs\">Please add a valid address, missing fields: {error.join(', ')}</p>\n{/if}\n\n\n{#if !hideMap}\n<div class=\"gap-4 border-5 border-white rounded-md shadow-md mt-5 map-container\" class:selected={selected}>  \n    <div class='map ' class:selected={selected} bind:this={mapElement} id=\"map\"></div>\n</div>\n{/if}\n\n","<script>\n  import { onMount, createEventDispatcher } from 'svelte';\n  \n  export let address = '';\n  export let apiKey = process.env.GOOGLE_MAPS;\n  export let label = 'Address';\n  export let required = false;\n  export let containerBg = '#eee'; // Background of parent container\n  \n  const dispatch = createEventDispatcher();\n  \n  let autocomplete;\n  let inputElement;\n  let isGoogleLoaded = false;\n  \n  onMount(() => {\n    if (!window.google) {\n      // Load Google Maps script dynamically\n      const script = document.createElement('script');\n      script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`;\n      script.async = true;\n      script.onload = () => {\n        isGoogleLoaded = true;\n        initAutocomplete();\n      };\n      script.onerror = () => {\n        console.error('Failed to load Google Maps JavaScript API');\n      };\n      document.head.appendChild(script);\n    } else {\n      isGoogleLoaded = true;\n      initAutocomplete();\n    }\n    \n    // Detect browser autocomplete (not Google Places)\n    // Browser autocomplete doesn't trigger normal input events, so we need to listen for change\n    if (inputElement) {\n      // Listen for input events (covers manual typing AND some autocomplete scenarios)\n      inputElement.addEventListener('input', handleBrowserAutofill);\n      // Also listen for change events (covers form autocomplete)\n      inputElement.addEventListener('change', handleBrowserAutofill);\n      // Animationstart trick - detects when Chrome autofills with yellow background\n      inputElement.addEventListener('animationstart', handleBrowserAutofill);\n    }\n    \n    return () => {\n      if (inputElement) {\n        inputElement.removeEventListener('input', handleBrowserAutofill);\n        inputElement.removeEventListener('change', handleBrowserAutofill);\n        inputElement.removeEventListener('animationstart', handleBrowserAutofill);\n      }\n    };\n  });\n  \n  function initAutocomplete() {\n    if (!window.google || !inputElement) {\n      console.error('Google Maps API or input element not available');\n      return;\n    }\n    \n    autocomplete = new google.maps.places.Autocomplete(inputElement, {\n      componentRestrictions: { country: ['us', 'ca'] },\n      fields: ['address_components', 'geometry'],\n      types: ['address']\n    });\n    \n    // Set initial value if provided\n    if (address) {\n      inputElement.value = address;\n    }\n    \n    autocomplete.addListener('place_changed', handlePlaceChanged);\n  }\n  \n  function handlePlaceChanged() {\n    const place = autocomplete.getPlace();\n    \n    if (!place.address_components) {\n      console.log('No address components found');\n      return;\n    }\n    \n    console.log('Legacy autocomplete - place:', place);\n    console.log('Legacy autocomplete - place.address_components:', place.address_components);\n    const addressData = extractAddressComponents(place.address_components);\n    \n    console.log('Legacy autocomplete - extracted address:', addressData);\n    \n    // Don't overwrite the input - Google already populated it\n    // Just dispatch the structured data\n    dispatch('placeChanged', addressData);\n  }\n  \n  function handleBrowserAutofill(event) {\n    // Detect when browser autocomplete fills the address field\n    // This happens when user selects a saved address from browser's autofill dropdown\n    const value = inputElement.value;\n    \n    if (value && value.trim() !== '') {\n      console.log('Browser autocomplete detected, address value:', value);\n      \n      // Update the bound address prop\n      address = value;\n      \n      // Dispatch a simple event with just the street address\n      // The parent component (UserInfoStep) will handle updating city/state/zip from other fields\n      dispatch('placeChanged', {\n        street: value,\n        city: '', // Let browser autocomplete fill these separately\n        state: '',\n        zip: '',\n        country: 'US',\n        isBrowserAutofill: true // Flag to indicate this came from browser autocomplete\n      });\n    }\n  }\n  \n  function extractAddressComponents(components) {\n    const result = {\n      street_number: '',\n      route: '',\n      locality: '',\n      sublocality: '',\n      administrative_area_level_3: '',\n      administrative_area_level_1: '',\n      country: '',\n      postal_code: ''\n    };\n    \n    components.forEach(component => {\n      const addressType = component.types[0];\n      \n      if (addressType === 'street_number') {\n        result.street_number = component.short_name;\n      } else if (addressType === 'route') {\n        result.route = component.long_name;\n      } else if (addressType === 'locality') {\n        result.locality = component.long_name;\n      } else if (addressType === 'sublocality' || addressType === 'sublocality_level_1') {\n        result.sublocality = component.long_name;\n      } else if (addressType === 'administrative_area_level_3') {\n        result.administrative_area_level_3 = component.long_name;\n      } else if (addressType === 'administrative_area_level_1') {\n        result.administrative_area_level_1 = component.short_name;\n      } else if (addressType === 'country') {\n        result.country = component.short_name;\n      } else if (addressType === 'postal_code') {\n        result.postal_code = component.short_name;\n      }\n    });\n    \n    // Try multiple sources for city (locality, sublocality, or administrative_area_level_3)\n    const city = result.locality || result.sublocality || result.administrative_area_level_3 || '';\n\n    inputElement.value = `${result.street_number} ${result.route}`;\n    \n    return {\n      street: `${result.street_number} ${result.route}`,\n      city: city,\n      state: result.administrative_area_level_1,\n      zip: result.postal_code,\n      country: result.country\n    };\n  }\n</script>\n\n<div class=\"address-wrapper\">\n  <div class=\"relative\">\n    <label \n      for=\"address-input\"\n      class=\"floating-label\"\n      style=\"background: linear-gradient(to bottom, {containerBg} 50%, white 50%);\"\n    >\n      {label}\n      {#if required}<span class=\"required\"> *</span>{/if}\n    </label>\n    \n    <input\n      id=\"address-input\"\n      bind:this={inputElement}\n      type=\"text\"\n      placeholder=\"\"\n      class=\"address-input\"\n      autocomplete=\"street-address\"\n      name=\"address\"\n    />\n  </div>\n</div>\n\n<style>\n  \n  .relative {\n    position: relative;\n  }\n  \n  .floating-label {\n    position: absolute;\n    left: 0.5rem;\n    top: -0.5rem;\n    display: inline-block;\n    padding: 0 0.25rem;\n    font-size: .75rem;\n    font-weight: 500;\n    color: #334155;\n  }\n  \n  .required {\n    color: #dc2626;\n  }\n  \n  .address-input {\n    width: 100%;\n    padding: 0.75rem;\n    font-size: 1rem;\n    background-color: white;\n    border-radius: 0.375rem;\n    color: #111827;\n    outline: 1px solid #d1d5db;\n    outline-offset: -1px;\n    transition: all 0.15s ease;\n  }\n  \n  .address-input:focus {\n    outline: 2px solid #00A3E0;\n    outline-offset: -2px;\n  }\n  \n  /* Detect Chrome autofill - triggers animationstart event */\n  @keyframes onAutoFillStart {\n    from { /* dummy */ }\n    to { /* dummy */ }\n  }\n  \n  .address-input:-webkit-autofill {\n    animation-name: onAutoFillStart;\n    animation-duration: 0.001s;\n  }\n</style>\n\n","<script>\n  export let value = '';\n  export let label = 'Phone Number';\n  export let required = false;\n  export let placeholder = '';\n  export let containerBg = '#eee'; // Background of parent container\n  \n  // Format phone number as (XXX) XXX-XXXX\n  function formatPhoneNumber(input) {\n    // Remove all non-digits\n    const digits = input.replace(/\\D/g, '');\n    \n    // Limit to 10 digits\n    const limited = digits.substring(0, 10);\n    \n    // Format based on length\n    if (limited.length === 0) {\n      return '';\n    } else if (limited.length <= 3) {\n      return `(${limited}`;\n    } else if (limited.length <= 6) {\n      return `(${limited.slice(0, 3)}) ${limited.slice(3)}`;\n    } else {\n      return `(${limited.slice(0, 3)}) ${limited.slice(3, 6)}-${limited.slice(6)}`;\n    }\n  }\n  \n  // Handle input\n  function handleInput(event) {\n    const input = event.target.value;\n    \n    // Extract raw digits for the actual value (max 10)\n    const rawDigits = input.replace(/\\D/g, '').substring(0, 10);\n    value = rawDigits;\n    \n    // Format and update the input field\n    const formatted = formatPhoneNumber(rawDigits);\n    event.target.value = formatted;\n  }\n  \n  // Compute formatted display value reactively\n  $: displayValue = formatPhoneNumber(value);\n</script>\n\n<div class=\"phone-input-wrapper\">\n  <div class=\"relative\">\n    <label \n      for=\"phone-input\"\n      class=\"floating-label\"\n      style=\"background: linear-gradient(to bottom, {containerBg} 50%, white 50%);\"\n    >\n      {label}\n      {#if required}<span class=\"required\"> *</span>{/if}\n    </label>\n    \n    <input\n      id=\"phone-input\"\n      type=\"tel\"\n      value={displayValue}\n      on:input={handleInput}\n      placeholder={placeholder}\n      {required}\n      autocomplete=\"tel\"\n      inputmode=\"numeric\"\n      class=\"phone-input\"\n    />\n  </div>\n</div>\n\n<style lang=\"scss\">\n  .phone-input-wrapper {\n  }\n  \n  .relative {\n    position: relative;\n  }\n  \n  .floating-label {\n    position: absolute;\n    left: 0.5rem;\n    top: -0.5rem;\n    display: inline-block;\n    padding: 0 0.25rem;\n    font-size: .75rem;\n    font-weight: 500;\n    color: #334155;\n    \n    .required {\n      color: #dc2626;\n    }\n  }\n  \n  .phone-input {\n    width: 100%;\n    padding: 0.75rem;\n    font-size: 1rem;\n    background-color: white;\n    border-radius: 0.375rem;\n    color: #111827;\n    outline: 1px solid #d1d5db;\n    outline-offset: -1px;\n    transition: all 0.15s ease;\n    \n    &:focus {\n      outline: 2px solid #00A3E0;\n      outline-offset: -2px;\n    }\n    \n    &::placeholder {\n      color: #9ca3af;\n    }\n    \n    &:disabled {\n      background-color: #f3f4f6;\n      cursor: not-allowed;\n    }\n  }\n</style>\n\n","<script>\n  export let id;\n  export let label;\n  export let value = '';\n  export let type = 'text';\n  export let required = false;\n  export let error = null;\n  export let disabled = false;\n  export let helpText = '';\n  export let inputClass = '';\n  export let step = undefined;\n  export let min = undefined;\n  export let max = undefined;\n  export let placeholder = '';\n  export let containerBg = '#eee'; // Background of parent container\n  export let autocomplete = undefined; // Browser autocomplete hint\n  export let name = undefined; // Input name attribute\n  \n  // Forward all events\n  import { createEventDispatcher } from 'svelte';\n  const dispatch = createEventDispatcher();\n  \n  function handleInput(e) {\n    value = e.target.value;\n    dispatch('input', e);\n  }\n  \n  function handleChange(e) {\n    dispatch('change', e);\n  }\n  \n  function handleBlur(e) {\n    dispatch('blur', e);\n  }\n  \n  function handleFocus(e) {\n    dispatch('focus', e);\n  }\n</script>\n\n<div class=\"form-group\">\n  <div class=\"relative\">\n    <label \n      for={id} \n      class=\"absolute -top-2 left-2 inline-block px-1 text-xs font-medium\"\n      style=\"color:#334155; background: linear-gradient(to bottom, {containerBg} 50%, white 50%);\"\n    >\n      {label}\n      {#if required}\n        <span class=\"text-red-600\"> *</span>\n      {/if}\n    </label>\n    <input\n      {id}\n      {type}\n      {value}\n      {disabled}\n      {step}\n      {min}\n      {max}\n      name={name}\n      autocomplete={autocomplete}\n      placeholder={placeholder}\n      on:input={handleInput}\n      on:change={handleChange}\n      on:blur={handleBlur}\n      on:focus={handleFocus}\n      class=\"block w-full rounded-md bg-white px-3 py-3 text-base text-black outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-bike-blue sm:text-sm/6 {inputClass}\"\n      class:outline-red-500={error}\n      class:focus:outline-red-500={error}\n    />\n  </div>\n  \n  {#if error}\n    <span class=\"error-message text-red-600 text-xs mt-1 block\">{error}</span>\n  {/if}\n  \n  {#if helpText}\n    <small class=\"help-text mt-1 block text-xs text-gray-600\">{helpText}</small>\n  {/if}\n</div>\n\n<style>\n  /* Hide spinner arrows for number inputs with no-spinner class */\n  :global(.no-spinner)::-webkit-outer-spin-button,\n  :global(.no-spinner)::-webkit-inner-spin-button {\n    -webkit-appearance: none;\n    appearance: none;\n    margin: 0;\n  }\n\n  input {\n    font-size: 1em;\n  }\n  \n  :global(.no-spinner[type=number]) {\n    -moz-appearance: textfield;\n    appearance: textfield;\n  }\n</style>\n\n","<script>\n  import { getContext } from 'svelte';\n  import HelpBlock from './components/HelpBlock.svelte';\n  \n  // Toggle between legacy and new Google Places API\n  const USE_LEGACY_AUTOCOMPLETE = true; // Set to true to use legacy API\n  \n  // Dynamic import based on flag\n  import PlaceAutocomplete from './components/PlaceAutocomplete.svelte';\n  import PlaceAutocompleteLegacy from './components/PlaceAutocompleteLegacy.svelte';\n  import PhoneInput from './components/PhoneInput.svelte';\n  import InputField from './components/InputField.svelte';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  \n  // Access context values\n  const { userInfo } = ctx; // userInfo is the store\n  $: errors = ctx.errors;\n\n  // V2: address state must match the coverage state selected in step 0\n  $: coverageState = ctx.selectedState;\n  $: addressStateMismatch = (() => {\n    if (!coverageState?.code || !$userInfo.state) return false;\n    const addr = $userInfo.state.trim().toUpperCase();\n    const cov = coverageState.code.trim().toUpperCase();\n    if (addr.length === 2) return addr !== cov;\n    const covName = (coverageState.name || '').trim().toUpperCase();\n    return covName ? addr !== covName : false;\n  })();\n  \n  // Get disclaimers from INITIAL_DATA\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const userDetailsPrivacyDisclaimer = INITIAL_DATA.disclaimers?.userDetailsPrivacy || '<p>By submitting the applicant mobile number, you consent to receive call or SMS messages from BikeInsure. Standard phone carrier rates may apply.</p>';\n  \n  // Export validate function for parent to call\n  export function validateUserInfo() {\n    console.log('DEBUG: Validating user info at step transition:', $userInfo);\n    console.log('DEBUG: Current address during validation:', $userInfo.address);\n    const newErrors = {};\n    \n    if (!$userInfo.firstName.trim()) {\n      newErrors.firstName = 'First name is required';\n      console.log('DEBUG: Missing firstName');\n    }\n    \n    if (!$userInfo.lastName.trim()) {\n      newErrors.lastName = 'Last name is required';\n      console.log('DEBUG: Missing lastName');\n    }\n    \n    if (!$userInfo.email.trim()) {\n      newErrors.email = 'Email is required';\n      console.log('DEBUG: Missing email');\n    } else if (!/\\S+@\\S+\\.\\S+/.test($userInfo.email)) {\n      newErrors.email = 'Email is invalid';\n      console.log('DEBUG: Invalid email format');\n    }\n    \n    if (!$userInfo.phone.trim()) {\n      newErrors.phone = 'Phone number is required';\n      console.log('DEBUG: Missing phone');\n    }\n    \n    if (!$userInfo.address.trim()) {\n      newErrors.address = 'Address is required';\n      console.log('DEBUG: Missing address');\n    }\n    \n    if (!$userInfo.city.trim()) {\n      newErrors.city = 'City is required';\n      console.log('DEBUG: Missing city');\n    }\n    \n    if (!$userInfo.state.trim()) {\n      newErrors.state = 'State is required';\n      console.log('DEBUG: Missing state');\n    } else if (addressStateMismatch) {\n      newErrors.state = 'State does not match your selected coverage state';\n    }\n    \n    if (!$userInfo.zipCode.trim()) {\n      newErrors.zipCode = 'ZIP code is required';\n      console.log('DEBUG: Missing zipCode');\n    }\n    \n    console.log('DEBUG: Validation errors:', newErrors);\n    ctx.errors = newErrors;\n    const isValid = Object.keys(newErrors).length === 0;\n    console.log('DEBUG: Validation result:', isValid);\n    return isValid;\n  }\n  \n  function handleInput() {\n    ctx.triggerAutoSave(); // This now only saves to localStorage and debounces server sync\n  }\n\n  function handleAddressSelect(event) {\n    const detail = event.detail;\n    if (!detail) return;\n    \n    console.log('DEBUG: Address detail:', detail);\n    \n    // Legacy component returns { street, city, state, zip, country }\n    // New component returns { street_number, route, city, state, postal_code }\n    \n    if (detail.street) {\n      // Legacy format\n      $userInfo.address = detail.street;\n      $userInfo.city = detail.city || '';\n      $userInfo.state = detail.state || '';\n      $userInfo.zipCode = detail.zip || '';\n    } else {\n      // New format\n      if (detail.street_number && detail.route) {\n        $userInfo.address = `${detail.street_number} ${detail.route}`;\n      } else if (detail.route) {\n        $userInfo.address = detail.route;\n      }\n      \n      if (detail.city) {\n        $userInfo.city = detail.city;\n      }\n      \n      if (detail.state) {\n        $userInfo.state = detail.state;\n      }\n      \n      if (detail.postal_code) {\n        $userInfo.zipCode = detail.postal_code;\n      }\n    }\n    \n    // Clear any previous address-related errors\n    const newErrors = { ...ctx.errors };\n    delete newErrors.address;\n    delete newErrors.city;\n    delete newErrors.state;\n    delete newErrors.zipCode;\n    ctx.errors = newErrors;\n    \n    console.log('DEBUG: Updated userInfo after address select:', {\n      address: $userInfo.address,\n      city: $userInfo.city,\n      state: $userInfo.state,\n      zipCode: $userInfo.zipCode\n    });\n    \n    // Force immediate save to ensure address is persisted\n    ctx.triggerAutoSave();\n    \n    // Also trigger a manual save to localStorage immediately\n    setTimeout(() => {\n      console.log('DEBUG: Address after timeout:', $userInfo.address);\n    }, 100);\n  }\n</script>\n\n<div class=\"signup-container\">\n  \n  <!-- Form Content -->\n  <div class=\"form-content\">\n    <!-- Header Section -->\n  \n  <div class=\"form-row\">\n    <InputField\n      id=\"firstName\"\n      label=\"First Name\"\n      name=\"given-name\"\n      autocomplete=\"given-name\"\n      bind:value={$userInfo.firstName}\n      required={true}\n      error={errors.firstName}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n    \n    <InputField\n      id=\"lastName\"\n      label=\"Last Name\"\n      name=\"family-name\"\n      autocomplete=\"family-name\"\n      bind:value={$userInfo.lastName}\n      required={true}\n      error={errors.lastName}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n  </div>\n  \n  <div class=\"form-row\">\n    <InputField\n      id=\"email\"\n      type=\"email\"\n      label=\"Email Address\"\n      name=\"email\"\n      autocomplete=\"email\"\n      bind:value={$userInfo.email}\n      required={true}\n      error={errors.email}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n  </div>\n  <div class=\"form-group mb-7\">\n    <PhoneInput \n      bind:value={$userInfo.phone}\n      label=\"Phone Number\"\n      required={true}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n    {#if errors.phone}\n      <span class=\"error-message\" style=\"bottom: 38px;\">{errors.phone}</span>\n    {/if}\n   \n  </div>\n  \n  <div class=\"form-row\">\n    <div class=\"form-group\">\n      {#if USE_LEGACY_AUTOCOMPLETE}\n        <PlaceAutocompleteLegacy \n          address={$userInfo.address}\n          label=\"Address\"\n          required={true}\n          containerBg=\"white\"\n          on:placeChanged={handleAddressSelect} \n        />\n      {:else}\n        <PlaceAutocomplete \n          bind:address={$userInfo.address} \n          on:select={handleAddressSelect} \n          bind:error={errors.address} \n        />\n      {/if}\n      {#if errors.address}\n        <span class=\"error-message\">{errors.address}</span>\n      {/if}\n    </div>\n  </div>\n  <div class=\"form-row\">\n    <InputField\n      id=\"addressLine2\"\n      label=\"Apartment\"\n      bind:value={$userInfo.addressLine2}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n  </div> \n  \n  <div class=\"form-row\">\n    <InputField\n      id=\"city\"\n      label=\"City\"\n      name=\"city\"\n      autocomplete=\"address-level2\"\n      bind:value={$userInfo.city}\n      required={true}\n      containerBg=\"white\"\n      error={errors.city}\n      on:input={handleInput}\n    />\n    \n    <InputField\n      id=\"state\"\n      label=\"State\"\n      name=\"state\"\n      autocomplete=\"address-level1\"\n      bind:value={$userInfo.state}\n      required={true}\n      containerBg=\"white\"\n      error={errors.state}\n      on:input={handleInput}\n    />\n    \n    <InputField\n      id=\"zipCode\"\n      label=\"ZIP Code\"\n      name=\"postal-code\"\n      autocomplete=\"postal-code\"\n      bind:value={$userInfo.zipCode}\n      required={true}\n      error={errors.zipCode}\n      containerBg=\"white\"\n      on:input={handleInput}\n    />\n  </div>\n  \n    {#if addressStateMismatch}\n      <div class=\"state-mismatch-warning\">\n        <p>State does not match your selected coverage state.</p>\n        <p>Please update your address to continue.</p>\n        <button type=\"button\" class=\"change-state-link\" on:click={() => window.location.hash = 'state'}>\n          Change Selected State\n        </button>\n      </div>\n    {/if}\n\n    <!-- Submit Button -->\n    <button\n      class=\"submit-btn\"\n      class:disabled={addressStateMismatch}\n      on:click={addressStateMismatch ? null : ctx.nextStep}\n      disabled={addressStateMismatch}\n      type=\"button\"\n    >\n      Agree & Continue\n    </button>\n    \n    <!-- Required Fields Note -->\n    <div class=\"required-note\">\n      <span>* Required Field</span>\n    </div>\n    \n    <!-- Privacy Notice -->\n    <div class=\"privacy-notice\">\n      <h3>Your privacy is important to us.</h3>\n      <p>{@html userDetailsPrivacyDisclaimer}</p>\n    </div>\n  </div>\n</div>\n\n<HelpBlock />\n\n<style>\n  .signup-container {\n    background: white;\n    padding: 30px;\n    border-radius: 10px;\n  }\n  .logo-section {\n    flex: 1;\n    text-align: center;\n  }\n  \n  .header-logo {\n    height: 60px;\n    width: auto;\n  }\n  \n  .form-content {\n    max-width: 500px;\n    margin: 0 auto;\n  }\n    \n  :global(.form-group) {\n    flex: 1;\n    position:relative;\n  }\n  \n  /* Keep styling for inputs that don't use Tailwind classes */\n  input:not([class*=\"block\"]), select:not([class*=\"block\"]) {\n    width: 100%;\n    padding: 10px;\n    border: 1px solid #ddd;\n    border-radius: 6px;\n    font-size: 16px;\n    transition: border-color 0.3s;\n    background-color: #f9f9f9;\n  }\n  \n  input:not([class*=\"block\"]):focus, select:not([class*=\"block\"]):focus {\n    outline: none;\n    border-color: #007bff;\n    background-color: white;\n  }\n  \n  .error-message {\n    color: #dc3545;\n    font-size: 12px;\n    margin-top: 5px;\n    display: block;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n  }\n  \n  \n  .required-note {\n    text-align: center;\n    margin: 20px 0;\n    font-size: 14px;\n    color: #666;\n  }\n  \n  .privacy-notice {\n    margin-top: 30px;\n    padding-top: 20px;\n    border-top: 1px solid #eee;\n  }\n  \n  .privacy-notice h3 {\n    font-size: 16px;\n    font-weight: 600;\n    color: #333;\n    margin: 0 0 15px 0;\n  }\n  \n  .privacy-notice p {\n    font-size: 13px;\n    line-height: 1.5;\n    color: #666;\n    margin: 0;\n    text-align: justify;\n  }\n\n  .form-row {\n    display: flex;\n    gap: 15px;\n  }\n  \n  .phone-disclaimer {\n    margin-top: -15px;\n    font-size: 12px;\n    line-height: 1.5;\n    color: #64748b;\n  }\n  \n  .phone-disclaimer :global(p) {\n    margin: 0;\n    font-size: 12px;\n  }\n  \n  .state-mismatch-warning {\n    text-align: center;\n    margin: 20px 0 10px;\n    color: #333;\n    font-size: 15px;\n    line-height: 1.6;\n  }\n\n  .state-mismatch-warning p {\n    margin: 0;\n  }\n\n  .change-state-link {\n    background: none;\n    border: none;\n    color: #1a3f7a;\n    font-size: 16px;\n    font-weight: 600;\n    cursor: pointer;\n    text-decoration: none;\n    padding: 0;\n    margin-top: 4px;\n  }\n\n  .change-state-link:hover {\n    text-decoration: underline;\n  }\n\n  .submit-btn.disabled {\n    opacity: 0.5;\n    cursor: not-allowed;\n    pointer-events: none;\n  }\n\n  @media (max-width: 768px) {\n    .header {\n      padding: 15px 20px;\n    }\n    \n    .header-logo {\n      height: 50px;\n    }\n    \n    .form-content {\n      padding: 20px;\n    }\n    \n    .form-row {\n      flex-direction: column;\n      gap:25px;\n    }\n    \n    .submit-btn {\n      padding: 15px 25px;\n      font-size: 15px;\n    }\n  }\n</style> ","<script>\n  import { getContext, onMount } from 'svelte';\n  import RangeSlider from 'svelte-range-slider-pips';\n  import InputField from './components/InputField.svelte';\n  import HelpBlock from './components/HelpBlock.svelte';\n  import { calculateV2Quote } from './v2/v2RateCalculator.js';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  const { pricing } = ctx;\n  \n  // Access context values\n  $: bikes = ctx.bikes;\n  $: questions = ctx.questions;\n  \n  // V1 fallback pricing\n  const basePriceFormatted = pricing.formatPrice(pricing.BASE_PRICE);\n  const theftPriceFormatted = pricing.formatPrice(pricing.getTheftPrice());\n\n  const PROHIBITED_ACCESSORY_PATTERNS = [\n    // Footwear\n    /\\bshoes?\\b/i, /\\bcleats?\\b/i, /\\bs[\\s-]?phyre\\b/i, /\\bsphyre\\b/i, /\\btorch\\b/i, /\\bsidi\\b/i,\n    // Phones & Electronics\n    /\\bearbuds?\\b/i, /\\bairpods?\\b/i, /\\bheadphones?\\b/i, /\\bheart\\s*rate\\s*monitor\\b/i, /\\bhrm\\b/i,\n    // Clothing\n    /\\bclothing\\b/i, /\\bclothes\\b/i, /\\bjackets?\\b/i, /\\bjerseys?\\b/i, /\\bshirts?\\b/i, /\\bshorts?\\b/i,\n    /\\bpants?\\b/i, /\\bgloves?\\b/i, /\\bsocks?\\b/i, /\\bbibs?\\b/i,\n    // Eyewear\n    /\\bglasses\\b/i, /\\bsunglasses\\b/i, /\\beyewear\\b/i,\n    // Bags & Carried Items\n    /\\bbackpacks?\\b/i, /\\bpurses?\\b/i, /\\bwallets?\\b/i, /\\bfanny\\s*packs?\\b/i, /\\bhitch\\s*racks?\\b/i,\n    // Personal Items\n    /\\bkeys?\\b/i, /\\bwatch(?:es)?\\b/i, /\\bjewelry\\b/i, /\\btools?\\b/i,\n  ];\n\n  const PROHIBITED_MSG = 'Not eligible. Bike-attached accessories and a helmet are covered.';\n\n  function isProhibitedAccessory(text) {\n    return PROHIBITED_ACCESSORY_PATTERNS.some(re => re.test(text));\n  }\n\n  let accessoryWarnings = {};\n\n  const CHOICE_TO_USAGE = {\n    'casual': 'casual',\n    'competitive': 'competitive', 'race': 'competitive',\n    'electric': 'ebike', 'ebike': 'ebike', 'e-bike': 'ebike',\n  };\n\n  function getBikeUsageType(bike, bikeIndex) {\n    // Check actual bike-usage answer first — user may have changed it after\n    // the initial V2 quote selection, so v2QuoteData can be stale.\n    const choiceId = bike['bike-usage']?.choice;\n    if (choiceId) {\n      const bikeUsageQ = questions.find(q => q.slug === 'bike-usage');\n      const match = bikeUsageQ?.choices?.find(c => String(c.id) === String(choiceId));\n      if (match) {\n        const key = Object.keys(CHOICE_TO_USAGE).find(k => match.answer.toLowerCase().includes(k));\n        if (key) return CHOICE_TO_USAGE[key];\n      }\n    }\n    const v2 = ctx.v2QuoteData;\n    if (v2?.bikes?.[bikeIndex]?.usageType) return v2.bikes[bikeIndex].usageType;\n    return 'casual';\n  }\n\n  function getV2BikePrice(bike, bikeIndex, withTheft) {\n    const v2 = ctx.v2QuoteData;\n    if (!v2) return null;\n    const bikeValue = parseFloat(bike['bike-purchase-price']?.text_answer) || 500;\n    const bikeList = ctx.bikes.get ? ctx.bikes.get() : ctx.bikes;\n    const multiBike = bikeList.length > 1;\n    const usageType = getBikeUsageType(bike, bikeIndex);\n    const q = calculateV2Quote(bikeValue, usageType, v2.hasAssociation, {\n      multiBike,\n      state: ctx.selectedState?.code,\n      includePaymentFee: false,\n    });\n    return pricing.formatPrice(withTheft ? q.pdTheft.monthly : q.pdOnly.monthly);\n  }\n\n  \n  // Get disclaimers from INITIAL_DATA\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const ebikeRejectionDisclaimer = INITIAL_DATA.disclaimers?.ebikeRejection || '<p>We appreciate your interest in insuring your e-bike. However, since your e-bike does not meet the <strong>3-class e-bike requirement</strong> of a maximum <strong>750-watts</strong> and a <strong>28-mph pedal-assist limit</strong>, it is not eligible for coverage.</p>';\n  \n  // Validation state\n  let validationErrors = [];\n\n  let extreme = 50000;\n  let v2 = { max: extreme, step: extreme/2, values: [0, extreme/2] }\n  \n  // Accordion state - track which bikes are expanded\n  let expandedBikes = new Set([0]); // Start with first bike expanded\n  \n  // E-bike verification modal state\n  let showEbikeModal = false;\n  let currentEbikeBikeIndex = null;\n  let currentEbikeQuestionSlug = null;\n  let pendingEbikeChoiceId = null;\n  let ebikeVerificationAnswer = null; // 'yes' or 'no'\n\n  // Casual eligibility checklist shown in the casual verification modal\n  const CASUAL_REQUIREMENTS = [\n    'Not an e-bike.',\n    'No racing or competitive events.',\n    'U.S. & Canada coverage territory.',\n  ];\n\n  // Casual bike verification modal state (catches e-bike owners mis-selecting Casual)\n  let showCasualModal = false;\n  let pendingCasualBikeIndex = null;\n  let pendingCasualQuestionSlug = null;\n  let pendingCasualChoiceId = null;\n  // Track bikes the user has explicitly confirmed as truly casual (not electric).\n  // In the V1 flow casual is auto-selected, so we also gate the Continue button\n  // on this confirmation rather than only on the usage-card click.\n  let casualConfirmedBikes = new Set();\n  // True when the casual modal was opened by the Continue gate (vs. a card click),\n  // so we know to auto-advance after the user confirms.\n  let casualGateContinuing = false;\n  \n  // Helper function to get/set slider values (RangeSlider needs array)\n  function getSliderValue(bike, slug) {\n    const textAnswer = bike[slug]?.text_answer;\n    // Only use saved value if it exists and is valid, otherwise default to 500\n    const value = (textAnswer && textAnswer !== '' && textAnswer !== '0') \n      ? parseFloat(textAnswer) \n      : 500;\n    return [value];\n  }\n  \n  function setSliderValue(bike, slug, values) {\n    if (!bike[slug]) {\n      bike[slug] = {text_answer: '', choice: null, other: '', items: [], question: null, question_slug: slug, collection_index: 0};\n    }\n    bike[slug].text_answer = String(values[0]);\n    \n    // Force Svelte reactivity by reassigning the bikes array\n    bikes = bikes;\n    handleInput();\n  }\n  \n  function toggleBike(index) {\n    if (expandedBikes.has(index)) {\n      // Collapse the clicked bike\n      expandedBikes = new Set();\n    } else {\n      // Expand only the clicked bike, collapse all others\n      expandedBikes = new Set([index]);\n    }\n  }\n  \n  // Get dynamic bike header info\n  function getBikeHeaderInfo(bike, index) {\n    const manufacturer = bike['bike-manufacturer']?.text_answer || '';\n    const model = bike['bike-model']?.text_answer || '';\n    \n    // Get coverage type\n    const theftProtection = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n    const coverageType = (theftProtection === 'true' || theftProtection === true) ? 'BikeCoverage + Theft' : 'BikeCoverage Only';\n    \n    let bikeInfo = '';\n    if (manufacturer && model) {\n      bikeInfo = `${manufacturer} • ${model}`;\n    } else if (manufacturer) {\n      bikeInfo = manufacturer;\n    } else if (model) {\n      bikeInfo = model;\n    } else {\n      bikeInfo = `${index + 1} • Manufacturer • Model`;\n    }\n    \n    return `${bikeInfo} • ${coverageType}`;\n  }\n  \n  \n  // Export validate function for parent to call\n  export function validateBikes() {\n    // Clear any previous validation errors\n    validationErrors = [];\n    \n    // Basic validation - ensure at least one bike\n    if (bikes.length === 0) {\n      validationErrors.push('At least one bike is required');\n      return false;\n    }\n    \n    // Validate each bike has required fields\n    for (let i = 0; i < bikes.length; i++) {\n      const bike = bikes[i];\n      const bikeNumber = i + 1;\n      \n      // Check manufacturer\n      const make = bike['bike-manufacturer']?.text_answer;\n      if (!make || (typeof make === 'string' && make.trim() === '')) {\n        validationErrors.push(`Bike ${bikeNumber}: Manufacturer is required`);\n      }\n      \n      // Check model  \n      const model = bike['bike-model']?.text_answer;\n      if (!model || (typeof model === 'string' && model.trim() === '')) {\n        validationErrors.push(`Bike ${bikeNumber}: Model is required`);\n      }\n      \n      // Check model year\n      const yearValue = bike['bike-model-year']?.text_answer;\n      if (!yearValue || (typeof yearValue === 'string' && yearValue.trim() === '')) {\n        validationErrors.push(`Bike ${bikeNumber}: Model year is required`);\n      } else {\n        const year = parseInt(yearValue);\n        if (isNaN(year) || year < 1900 || year > new Date().getFullYear() + 1) {\n          validationErrors.push(`Bike ${bikeNumber}: Invalid model year`);\n        }\n      }\n      \n      // Check purchase price\n      const priceValue = bike['bike-purchase-price']?.text_answer;\n      if (!priceValue || (typeof priceValue === 'string' && priceValue.trim() === '')) {\n        validationErrors.push(`Bike ${bikeNumber}: Purchase price is required`);\n      } else {\n        const price = parseFloat(priceValue);\n        if (isNaN(price) || price <= 0) {\n          validationErrors.push(`Bike ${bikeNumber}: Invalid purchase price`);\n        }\n      }\n      \n      // Check theft protection selection (check both old and new question slugs)\n      const theftValue = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n      if (!theftValue || (theftValue !== 'true' && theftValue !== 'false')) {\n        validationErrors.push(`Bike ${bikeNumber}: Please select theft protection option`);\n      }\n    }\n    \n    // Scroll to first error if any exist\n    if (validationErrors.length > 0) {\n      setTimeout(() => {\n        const errorElement = document.querySelector('.validation-errors');\n        if (errorElement) {\n          errorElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        }\n      }, 100);\n      return false;\n    }\n\n    // Casual is auto-selected by default, so it never triggers the usage-card\n    // modal. Gate the Continue action: for any bike still marked casual that the\n    // user hasn't explicitly confirmed, verify it isn't actually an e-bike.\n    for (let i = 0; i < bikes.length; i++) {\n      if (casualConfirmedBikes.has(i)) continue;\n      if (getBikeUsageType(bikes[i], i) === 'casual') {\n        if (openCasualGate(i)) return false;\n      }\n    }\n\n    return true;\n  }\n  \n  function addBike() {\n    const newBike = {};\n    const newIndex = bikes.length;\n    \n    // Initialize bike with empty answers for all questions\n    if (questions.length > 0) {\n      questions.forEach(question => {\n        const defaultValue = {\n          text_answer: '',\n          choice: null,\n          other: '',\n          items: [], // For List questions\n          question: question.id,\n          question_slug: question.slug,\n          collection_index: newIndex\n        };\n        \n        // Auto-select \"Casual\" for bike usage\n        if (question.slug === 'bike-usage' && question.choices && question.choices.length > 0) {\n          const casualChoice = question.choices.find(c => c.answer.toLowerCase() === 'casual');\n          if (casualChoice) {\n            defaultValue.choice = String(casualChoice.id);\n          }\n        }\n        \n        // Auto-select theft protection (true) - ensure it's set as string 'true'\n        if (question.slug === 'theft-protection' || question.slug === 'bikeinsure-plan-options') {\n          defaultValue.text_answer = 'true';\n        }\n        \n        newBike[question.slug] = defaultValue;\n      });\n    }\n    \n    // Update bikes array and force reactivity\n    bikes = [...bikes, newBike];\n    ctx.bikes = bikes;\n    \n    // Collapse all existing bikes and only expand the new one\n    expandedBikes = new Set([newIndex]);\n    \n    ctx.triggerAutoSave(); // This now only saves to localStorage\n  }\n  \n  function removeBike(index) {\n    ctx.bikes = bikes.filter((_, i) => i !== index);\n    // Bike indices shift after removal; reset casual confirmations to avoid\n    // stale indices skipping verification (a re-prompt is harmless).\n    casualConfirmedBikes = new Set();\n    \n    // Update expanded bikes - remove the deleted index and adjust higher indices\n    const newExpanded = new Set();\n    expandedBikes.forEach(expandedIndex => {\n      if (expandedIndex < index) {\n        newExpanded.add(expandedIndex);\n      } else if (expandedIndex > index) {\n        newExpanded.add(expandedIndex - 1);\n      }\n      // Skip the deleted index\n    });\n    expandedBikes = newExpanded;\n    \n    ctx.triggerAutoSave(); // This now only saves to localStorage\n  }\n  \n  function handleInput() {\n    // Update context with the modified bikes array to propagate changes\n    ctx.bikes = bikes;\n    ctx.triggerAutoSave(); // This now only saves to localStorage and debounces server sync\n  }\n  \n  // E-bike verification handlers\n  function handleBikeUsageSelect(bikeIndex, questionSlug, choiceId, choiceAnswer) {\n    // Check if this is an e-bike selection\n    if (choiceAnswer.toLowerCase().includes('electric') || \n        choiceAnswer.toLowerCase().includes('ebike') || \n        choiceAnswer.toLowerCase().includes('e-bike')) {\n      // Show the e-bike verification modal\n      currentEbikeBikeIndex = bikeIndex;\n      currentEbikeQuestionSlug = questionSlug;\n      pendingEbikeChoiceId = choiceId;\n      ebikeVerificationAnswer = null;\n      showEbikeModal = true;\n    } else if (choiceAnswer.toLowerCase().includes('casual')) {\n      // Casual selection: verify it isn't actually an e-bike before committing\n      pendingCasualBikeIndex = bikeIndex;\n      pendingCasualQuestionSlug = questionSlug;\n      pendingCasualChoiceId = choiceId;\n      showCasualModal = true;\n    } else {\n      // For other selections (competitive), just set the value directly\n      bikes[bikeIndex][questionSlug].choice = String(choiceId);\n      handleInput();\n    }\n  }\n\n  function handleCasualVerification(answer) {\n    const bikeIndex = pendingCasualBikeIndex;\n    const questionSlug = pendingCasualQuestionSlug;\n    const choiceId = pendingCasualChoiceId;\n    const wasGateContinuing = casualGateContinuing;\n    closeCasualModal();\n    if (bikeIndex == null || !questionSlug) return;\n\n    // \"No\": the rider is an e-bike or racing rider. Leave the usage unconfirmed\n    // so they pick Competitive or Electric from the cards.\n    if (answer !== 'yes') return;\n\n    // \"Yes — Casual\": commit the selection and remember it so the Continue\n    // gate doesn't re-prompt for this bike.\n    bikes[bikeIndex][questionSlug].choice = String(choiceId);\n    casualConfirmedBikes.add(bikeIndex);\n    handleInput();\n    // If this was triggered by the Continue button, resume advancing.\n    if (wasGateContinuing && typeof ctx.nextStep === 'function') {\n      ctx.nextStep();\n    }\n  }\n\n  function closeCasualModal() {\n    showCasualModal = false;\n    pendingCasualBikeIndex = null;\n    pendingCasualQuestionSlug = null;\n    pendingCasualChoiceId = null;\n    casualGateContinuing = false;\n  }\n\n  // Open the casual verification for a bike whose usage is already casual\n  // (e.g. the auto-selected default), gating the Continue action.\n  function openCasualGate(bikeIndex) {\n    const bikeUsageQuestion = questions.find(q => q.slug === 'bike-usage');\n    const casualChoice = bikeUsageQuestion?.choices\n      ? findUsageChoice(bikeUsageQuestion.choices, 'casual')\n      : null;\n    if (!casualChoice) return false;\n    pendingCasualBikeIndex = bikeIndex;\n    pendingCasualQuestionSlug = 'bike-usage';\n    pendingCasualChoiceId = casualChoice.id;\n    casualGateContinuing = true;\n    showCasualModal = true;\n    return true;\n  }\n  \n  function handleEbikeVerification(answer) {\n    ebikeVerificationAnswer = answer;\n    \n    if (answer === 'yes') {\n      // E-bike meets standards, proceed with selection\n      bikes[currentEbikeBikeIndex][currentEbikeQuestionSlug].choice = String(pendingEbikeChoiceId);\n      handleInput();\n      closeEbikeModal();\n    } else {\n      // E-bike doesn't meet standards, show message and close\n      // The modal will show the rejection message before closing\n    }\n  }\n  \n  function closeEbikeModal() {\n    showEbikeModal = false;\n    currentEbikeBikeIndex = null;\n    currentEbikeQuestionSlug = null;\n    pendingEbikeChoiceId = null;\n    ebikeVerificationAnswer = null;\n  }\n\n  // Search terms to match V2 usage types against backend choice answer text\n  const V2_USAGE_SEARCH = {\n    'casual': ['casual'],\n    'competitive': ['competitive', 'race'],\n    'ebike': ['electric', 'ebike', 'e-bike'],\n  };\n\n  function findUsageChoice(choices, v2UsageType) {\n    const terms = V2_USAGE_SEARCH[v2UsageType] || ['casual'];\n    return choices.find(c => {\n      const answer = c.answer.toLowerCase();\n      return terms.some(t => answer.includes(t));\n    });\n  }\n\n  function prefillV2Bikes() {\n    const v2 = ctx.v2QuoteData;\n    if (!v2 || !v2.bikes || v2.bikes.length === 0) return;\n\n    const bikeUsageQuestion = questions.find(q => q.slug === 'bike-usage');\n    const theftSlug = questions.find(q => q.slug === 'theft-protection') ? 'theft-protection' : 'bikeinsure-plan-options';\n\n    for (let i = 0; i < v2.bikes.length; i++) {\n      const v2Bike = v2.bikes[i];\n      const planForBike = v2.selectedPlans?.[i] || 'pdTheft';\n      const theftValue = planForBike === 'pdTheft' ? 'true' : 'false';\n\n      addBike();\n      const bike = ctx.bikes[i];\n      if (!bike) continue;\n\n      if (bike['bike-purchase-price']) {\n        bike['bike-purchase-price'].text_answer = String(v2Bike.value);\n      }\n\n      if (bike[theftSlug]) {\n        bike[theftSlug].text_answer = theftValue;\n      }\n\n      if (bike['bike-usage'] && bikeUsageQuestion?.choices) {\n        const match = findUsageChoice(bikeUsageQuestion.choices, v2Bike.usageType);\n        if (match) {\n          bike['bike-usage'].choice = String(match.id);\n        }\n      }\n\n      // Usage was already verified on the V2 quote step; don't re-prompt here.\n      casualConfirmedBikes.add(i);\n    }\n\n    ctx.bikes = bikes;\n    expandedBikes = new Set([0]);\n  }\n\n  onMount(() => {\n    console.log('BikeDetailsStep mounted. Bikes count:', ctx.bikes.length);\n    if (ctx.bikes.length === 0 && ctx.v2QuoteData) {\n      console.log('V2 flow: pre-filling bikes from quote data...');\n      prefillV2Bikes();\n    } else if (ctx.bikes.length === 0) {\n      console.log('No bikes found, adding first bike with defaults...');\n      addBike();\n    } else {\n      ctx.bikes.forEach((bike, idx) => {\n        const theftValue = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n        console.log(`Bike ${idx} theft protection value:`, theftValue);\n      });\n    }\n  });\n</script>\n\n<div class=\"step-content form-content\">\n\n  \n  \n  {#if validationErrors.length > 0}\n    <div class=\"validation-errors\">\n      <h3>❌ Please fix the following errors:</h3>\n      <ul>\n        {#each validationErrors as error}\n          <li>{error}</li>\n        {/each}\n      </ul>\n    </div>\n  {/if}\n  \n  <div class=\"bikes-section\">\n    \n    {#each bikes as bike, index}\n      <div class=\"bike-accordion\">\n        <!-- svelte-ignore a11y-click-events-have-key-events -->\n        <div class=\"bike-header\" on:click={() => toggleBike(index)}>\n          <div class=\"bike-header-content\">\n            <div class=\"bike-header-icon\">\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" class=\"chevron\" class:expanded={expandedBikes.has(index)}>\n                <polyline points=\"6,9 12,15 18,9\"></polyline>\n              </svg>\n            </div>\n            <div class=\"bike-header-info\">\n              <div class=\"bike-title\">Bike # {index + 1}</div>\n              <div class=\"bike-subtitle\">{getBikeHeaderInfo(bike, index)}</div>\n            </div>\n          </div>\n          <button class=\"btn btn-danger btn-sm remove-btn\" on:click|stopPropagation={() => removeBike(index)}>\n            ×\n          </button>\n        </div>\n        \n        {#if expandedBikes.has(index)}\n        <div class=\"bike-content\">\n        \n        <!-- Dynamic form fields based on questions -->\n        {#if questions.length > 0}\n          {#each questions as question}\n            {@const fieldId = `${question.slug}-${index}`}\n            {#if !bike[question.slug]}\n              {bike[question.slug] = {text_answer: '', choice: null, other: '', question: question.id, question_slug: question.slug, collection_index: index}}\n            {/if}\n            \n            <div class=\"form-row\">\n              {#if question.type === 'Text'}\n                <InputField\n                  id=\"{fieldId}\"\n                  label=\"{question.question}\"\n                  bind:value={bike[question.slug].text_answer}\n                  required={question.required}\n                  placeholder={question.placeholder_text || ''}\n                  containerBg=\"white\"\n                  on:input={handleInput}\n                />\n              {:else if question.type === 'Integer'}\n                <InputField\n                  id=\"{fieldId}\"\n                  type=\"number\"\n                  label=\"{question.question}\"\n                  bind:value={bike[question.slug].text_answer}\n                  required={question.required}\n                  placeholder={question.placeholder_text || ''}\n                  containerBg=\"white\"\n                  inputClass={question.slug === 'bike-model-year' ? 'no-spinner' : ''}\n                  on:input={(e) => {\n                    if (question.slug === 'bike-model-year') {\n                      const target = e.detail?.target || e.target;\n                      if (target && target.value && target.value.length > 4) {\n                        const trimmedValue = target.value.slice(0, 4);\n                        bike[question.slug].text_answer = trimmedValue;\n                        target.value = trimmedValue;\n                      }\n                    }\n                    handleInput();\n                  }}\n                />\n              {:else if question.type === 'Decimal'}\n                {#if question.slug === 'bike-purchase-price'}\n                  <!-- Custom Range Slider for Purchase Price -->\n                  <label for=\"{fieldId}\" class=\"form-label\">\n                    {question.question}\n                    {#if question.required}<span class=\"text-red-600\"> *</span>{/if}\n                  </label>\n                  <div class=\"price-slider-container\">\n                    <RangeSlider\n                      values={getSliderValue(bike, question.slug)}\n                      on:change={(e) => setSliderValue(bike, question.slug, e.detail.values)}\n                      min={500}\n                      max={30000}\n                      step={100}\n                      pips\n                      pipstep={v2.step}\n                      all=\"label\"\n                      first=\"label\"\n                      last=\"label\"\n                      rest=\"label\"\n                      formatter={(v) => `$${v.toLocaleString()}`}\n                      float\n                      hoverable\n                    />\n                  </div>\n                  <div class=\"purchase-price-label\" style=\"margin-bottom:20px;\">\n                    Bike Price + Listed Accessories: <span class=\"purchase-price\">\n                      {Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(Number(bike[question.slug]?.text_answer) || 500)}\n                    </span>\n                  </div>\n                {:else}\n                  <InputField\n                    id=\"{fieldId}\"\n                    type=\"number\"\n                    step=\"0.01\"\n                    label=\"{question.question}\"\n                    bind:value={bike[question.slug].text_answer}\n                    required={question.required}\n                    placeholder={question.placeholder_text || ''}\n                    containerBg=\"white\"\n                    on:input={handleInput}\n                  />\n                {/if}\n              {:else if question.type === 'Number'}\n                <InputField\n                  id=\"{fieldId}\"\n                  type=\"number\"\n                  step=\"0.01\"\n                  label=\"{question.question}\"\n                  bind:value={bike[question.slug].text_answer}\n                  required={question.required}\n                  placeholder={question.placeholder_text || ''}\n                  containerBg=\"white\"\n                  on:input={handleInput}\n                />\n              {:else if question.type === 'TextArea'}\n                <div class=\"relative mb-5\">\n                  <label \n                    for=\"{fieldId}\"\n                    class=\"absolute -top-2 left-2 inline-block px-1 text-sm font-medium\"\n                    style=\"color:#334155; background: linear-gradient(to bottom, white 50%, white 50%);\"\n                  >\n                    {question.question}\n                    {#if question.required}\n                      <span class=\"text-red-600\"> *</span>\n                    {/if}\n                  </label>\n                  <textarea\n                    id=\"{fieldId}\"\n                    bind:value={bike[question.slug].text_answer}\n                    placeholder={question.placeholder_text || ''}\n                    on:input={handleInput}\n                    class=\"block w-full rounded-md bg-white px-3 py-3 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-bike-blue sm:text-sm/6 min-h-[80px] resize-vertical\"\n                  ></textarea>\n                </div>\n              {:else if question.type === 'List'}\n                <div class=\"form-label-with-tooltip\">\n                  <label for=\"{fieldId}\" class=\"form-label\">\n                    {question.question}\n                    {#if question.required}<span class=\"text-red-600\"> *</span>{/if}\n                  </label>\n                  <div class=\"tooltip-wrapper\">\n                    <div class=\"info-icon\">\n                      <img src=\"/static/INFO_BikeInsure_001535-EEEEEE_button_COMP.png\" alt=\"Info\" class=\"info-icon-img\" />\n                    </div>\n                    <div class=\"tooltip-text\">\n                      List all non-stock-attached accessories and components, as well as your helmet, to ensure coverage. Add each item using \"+\" or paste a list (comma-separated or one per line).\n                    </div>\n                  </div>\n                </div>\n                <div class=\"accessories-help-text\">\n                  <p>List attached components and helmet (make &amp; model).</p>\n                  <p><strong>Example:</strong> Garmin 840, Shimano PD-R8000 Pedals, Kask Wasabi Helmet</p>\n                  <p><strong>Not covered:</strong> shoes, glasses, phones, clothing, or items inside bags.</p>\n                </div>\n                <div class=\"list-input\">\n                  {#each bike[question.slug].items || [] as item, itemIndex}\n                    <div class=\"list-item\">\n                      <input\n                        type=\"text\"\n                        style=\"font-size: 1em;\"\n                        bind:value={item}\n                        on:input={() => {\n                          if (isProhibitedAccessory(item)) {\n                            accessoryWarnings[index] = PROHIBITED_MSG;\n                          } else {\n                            accessoryWarnings[index] = '';\n                          }\n                          bike[question.slug].items[itemIndex] = item;\n                          handleInput();\n                        }}\n                        placeholder={question.placeholder_text || 'Enter item'}\n                      />\n                      <button \n                        type=\"button\" \n                        class=\"btn btn-remove\"\n                        on:click={() => {\n                          bike[question.slug].items = bike[question.slug].items.filter((_, i) => i !== itemIndex);\n                          handleInput();\n                        }}\n                      >\n                        ×\n                      </button>\n                    </div>\n                  {/each}\n                  \n                  {#if accessoryWarnings[index]}\n                    <div class=\"accessory-warning\">{accessoryWarnings[index]}</div>\n                  {/if}\n\n                  <div class=\"add-item\">\n                    <input\n                      type=\"text\"\n                      style=\"font-size: 1em;\"\n                      placeholder={question.placeholder_text || 'Enter make and model (one per line)'}\n                      on:blur={(e) => {\n                        const val = e.target.value.trim();\n                        if (val) {\n                          if (isProhibitedAccessory(val)) {\n                            accessoryWarnings[index] = PROHIBITED_MSG;\n                            e.target.value = '';\n                            return;\n                          }\n                          accessoryWarnings[index] = '';\n                          if (!bike[question.slug].items) bike[question.slug].items = [];\n                          bike[question.slug].items = [...bike[question.slug].items, val];\n                          e.target.value = '';\n                          handleInput();\n                        }\n                      }}\n                      on:keydown={(e) => {\n                        if (e.key === 'Enter' && e.target.value.trim()) {\n                          e.preventDefault();\n                          const val = e.target.value.trim();\n                          if (isProhibitedAccessory(val)) {\n                            accessoryWarnings[index] = PROHIBITED_MSG;\n                            e.target.value = '';\n                            return;\n                          }\n                          accessoryWarnings[index] = '';\n                          if (!bike[question.slug].items) bike[question.slug].items = [];\n                          bike[question.slug].items = [...bike[question.slug].items, val];\n                          e.target.value = '';\n                          handleInput();\n                        }\n                      }}\n                      on:paste={(e) => {\n                        const pastedText = e.clipboardData.getData('text');\n                        if (pastedText.includes(',') || pastedText.includes(';') || pastedText.includes('\\n')) {\n                          e.preventDefault();\n                          const items = pastedText\n                            .split(/[,;\\n]+/)\n                            .map(item => item.trim())\n                            .filter(item => item.length > 0);\n\n                          const blocked = items.filter(isProhibitedAccessory);\n                          const allowed = items.filter(t => !isProhibitedAccessory(t));\n\n                          if (blocked.length) {\n                            accessoryWarnings[index] = PROHIBITED_MSG + ' Removed: ' + blocked.join(', ');\n                          } else {\n                            accessoryWarnings[index] = '';\n                          }\n\n                          if (allowed.length) {\n                            if (!bike[question.slug].items) bike[question.slug].items = [];\n                            bike[question.slug].items = [...bike[question.slug].items, ...allowed];\n                            e.target.value = '';\n                            handleInput();\n                          }\n                        } else if (isProhibitedAccessory(pastedText.trim())) {\n                          e.preventDefault();\n                          accessoryWarnings[index] = PROHIBITED_MSG;\n                        }\n                      }}\n                    />\n                    <button \n                      type=\"button\" \n                      class=\"btn btn-add\"\n                      on:click={(e) => {\n                        const input = e.target.previousElementSibling;\n                        if (input && input.value.trim()) {\n                          const val = input.value.trim();\n                          if (isProhibitedAccessory(val)) {\n                            accessoryWarnings[index] = PROHIBITED_MSG;\n                            input.value = '';\n                            return;\n                          }\n                          accessoryWarnings[index] = '';\n                          if (!bike[question.slug].items) bike[question.slug].items = [];\n                          bike[question.slug].items = [...bike[question.slug].items, val];\n                          input.value = '';\n                          handleInput();\n                        }\n                      }}\n                      title=\"Add item\"\n                    >\n                      +\n                    </button>\n                  </div>\n                </div>\n              {:else if question.type === 'Boolean'}\n                {#if question.slug === 'theft-protection' || question.slug === 'bikeinsure-plan-options'}\n                  <!-- Custom Plan Options Display -->\n                  <label for=\"{fieldId}\" class=\"form-label\">\n                    {question.question}\n                    {#if question.required}<span class=\"text-red-600\"> *</span>{/if}\n                  </label>\n                  <div class=\"plan-options\">\n                    <button\n                      type=\"button\"\n                      class=\"plan-option\"\n                      class:selected={bike[question.slug].text_answer === 'true'}\n                      on:click={() => {\n                        bike[question.slug].text_answer = 'true';\n                        bikes = bikes;\n                        handleInput();\n                      }}\n                    >\n                      <div class=\"plan-header\">\n                        <span class=\"plan-name\">BikeCoverage + Theft</span>\n                        <span class=\"plan-price\">${ctx.useV2Api ? getV2BikePrice(bike, index, true) : theftPriceFormatted}/mo.</span>\n                      </div>\n                      {#if bike[question.slug].text_answer === 'true'}\n                        <div class=\"plan-checkmark\">\n                          <img src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n                        </div>\n                      {/if}\n                    </button>\n                    \n                    <button\n                      type=\"button\"\n                      class=\"plan-option\"\n                      class:selected={bike[question.slug].text_answer === 'false'}\n                      on:click={() => {\n                        bike[question.slug].text_answer = 'false';\n                        bikes = bikes;\n                        handleInput();\n                      }}\n                    >\n                      <div class=\"plan-header\">\n                        <span class=\"plan-name\">BikeCoverage Only</span>\n                        <span class=\"plan-price\">${ctx.useV2Api ? getV2BikePrice(bike, index, false) : basePriceFormatted}/mo.</span>\n                      </div>\n                      {#if bike[question.slug].text_answer === 'false'}\n                        <div class=\"plan-checkmark\">\n                          <img src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n                        </div>\n                      {/if}\n                    </button>\n                  </div>\n                  {#if ctx.useV2Api && ctx.bikes.length > 1}\n                    <div class=\"multi-bike-discount-badge\">\n                      Multi-bike discount applied\n                    </div>\n                  {/if}\n                {:else}\n                  <div class=\"boolean-input\">\n                    <label class=\"radio-label\">\n                      <input\n                        type=\"radio\"\n                        name=\"{fieldId}\"\n                        value=\"true\"\n                        bind:group={bike[question.slug].text_answer}\n                        on:change={handleInput}\n                      />\n                      Yes\n                    </label>\n                    <label class=\"radio-label\">\n                      <input\n                        type=\"radio\"\n                        name=\"{fieldId}\"\n                        value=\"false\"\n                        bind:group={bike[question.slug].text_answer}\n                        on:change={handleInput}\n                      />\n                      No\n                    </label>\n                  </div>\n                {/if}\n              {:else if question.type === 'Choice' || question.type === 'DynamicPricing' || question.type === 'SingleChoice'}\n                {#if question.slug === 'bike-usage'}\n                  <!-- Custom Bike Usage Image Selector -->\n                  <label for=\"{fieldId}\" class=\"form-label\">\n                    {question.question}\n                    {#if question.required}<span class=\"text-red-600\"> *</span>{/if}\n                  </label>\n                  <div class=\"bike-usage-options\">\n                    {#each question.choices || [] as choice}\n                      {@const usageType = choice.answer.toLowerCase()}\n                      {@const imageMap = {\n                        'casual': 'Bikeinsure-iCON-CASUAL_COMP.png',\n                        'competitive': 'Bikeinsure-iCON-COMPETITIVE_COMP.png',\n                        'electric': 'Bikeinsure-iCON-EBIKE_COMP.png',\n                        'ebike': 'Bikeinsure-iCON-EBIKE_COMP.png',\n                        'e-bike': 'Bikeinsure-iCON-EBIKE_COMP.png'\n                      }}\n                      {@const colorMap = {\n                        'casual': '#002B5C',\n                        'competitive': '#BD181B',\n                        'electric': '#1A5F92',\n                        'ebike': '#1A5F92',\n                        'e-bike': '#1A5F92'\n                      }}\n                      {@const imageSrc = imageMap[usageType] || imageMap['casual']}\n                      {@const checkmarkColor = colorMap[usageType] || '#2E5C8A'}\n                      \n                      <button\n                        type=\"button\"\n                        class=\"bike-usage-card\"\n                        class:selected={bike[question.slug].choice === String(choice.id)}\n                        style=\"--usage-color: {checkmarkColor}\"\n                        on:click={() => handleBikeUsageSelect(index, question.slug, choice.id, choice.answer)}\n                      >\n                        <div class=\"bike-usage-image\">\n                          <img src=\"/static/{imageSrc}\" alt={choice.answer} />\n                        </div>\n                        <div class=\"bike-usage-label\">{choice.answer}</div>\n                        {#if bike[question.slug].choice === String(choice.id)}\n                          <img class=\"bike-usage-check\" src=\"/static/frontend/CHECK_White_BikeInsure_COMP.png\" alt=\"Selected\" />\n                        {/if}\n                      </button>\n                    {/each}\n                  </div>\n                {:else}\n                  <label for=\"{fieldId}\" class=\"form-label\">\n                    {question.question}\n                    {#if question.required}<span class=\"text-red-600\"> *</span>{/if}\n                  </label>\n                  <select \n                    id=\"{fieldId}\" \n                    bind:value={bike[question.slug].choice} \n                    on:change={handleInput}\n                  >\n                    <option value=\"\">Select {question.question.toLowerCase()}</option>\n                    {#each question.choices || [] as choice}\n                      <option value={String(choice.id)}>{choice.answer}</option>\n                    {/each}\n                  </select>\n                {/if}\n              {/if}\n              \n            </div>\n          {/each}\n        {/if}\n        </div>\n        {/if}\n      </div>\n    {/each}\n    \n    <button class=\"add-bike-btn\" on:click={addBike}>\n      <i class=\"fa-solid fa-plus\"></i> Add Another Bike\n    </button>\n\n     <!-- Submit Button -->\n     <button class=\"submit-btn\" on:click={ctx.nextStep} type=\"button\">\n      Continue\n    </button>\n\n  </div>\n</div>\n\n<HelpBlock />\n\n<!-- E-Bike Verification Modal -->\n{#if showEbikeModal}\n  <div class=\"modal-overlay\" on:click={closeEbikeModal} on:keydown={(e) => e.key === 'Escape' && closeEbikeModal()} role=\"button\" tabindex=\"0\">\n    <!-- svelte-ignore a11y-click-events-have-key-events -->\n    <div class=\"modal-content ebike-modal\" on:click|stopPropagation role=\"dialog\" aria-modal=\"true\">\n      <button class=\"modal-close\" on:click={closeEbikeModal}>&times;</button>\n      \n      {#if ebikeVerificationAnswer === null}\n      <h3 style=\"margin-bottom: 1rem; color: #333; text-align: center; font-weight:600; font-size:24px\">Verify E-Bike Eligibility</h3>\n      <div class=\"ebike-requirements\">\n        <div class=\"requirement-item\">\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\"/>\n            <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n          </svg>\n          <span>Class 1, 2, or 3.</span>\n        </div>\n        <div class=\"requirement-item\">\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\"/>\n            <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n          </svg>\n          <span>750-Watt max.</span>\n        </div>\n        <div class=\"requirement-item\">\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\"/>\n            <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n          </svg>\n          <span>Top pedal-assist speed 28 mph.</span>\n        </div>\n      </div>\n      {/if}\n      \n      {#if ebikeVerificationAnswer === null}\n        <div class=\"ebike-question\">\n          \n          <div class=\"ebike-verification-buttons\">\n            <button \n              type=\"button\" \n              class=\"verification-btn verification-yes\"\n              on:click={() => handleEbikeVerification('yes')}\n            >\n              Yes\n            </button>\n            <button \n              type=\"button\" \n              class=\"verification-btn verification-no\"\n              on:click={() => handleEbikeVerification('no')}\n            >\n              No\n            </button>\n          </div>\n        </div>\n      {:else if ebikeVerificationAnswer === 'yes'}\n        <div class=\"ebike-success\">\n          <p style=\"color: #28a745; font-weight: 500; text-align: center;\">\n            ✓ E-bike verified! Proceeding with enrollment...\n          </p>\n        </div>\n      {:else}\n        <div class=\"ebike-rejection\">\n          <div style=\"margin-bottom: 1rem; color: #333; line-height: 1.6;\">\n            {@html ebikeRejectionDisclaimer}\n          </div>\n          <button \n            type=\"button\" \n            class=\"verification-btn verification-yes svelte-ew6p1v\"\n            on:click={closeEbikeModal}\n            style=\"width: 100%; padding: 12px; margin-top: 1rem;\"\n          >\n            Got it - Thanks\n          </button>\n        </div>\n      {/if}\n    </div>\n  </div>\n{/if}\n\n<!-- Casual Bike Verification Modal (catches e-bike owners mis-selecting Casual) -->\n{#if showCasualModal}\n  <div class=\"modal-overlay\" on:click={closeCasualModal} on:keydown={(e) => e.key === 'Escape' && closeCasualModal()} role=\"button\" tabindex=\"0\">\n    <!-- svelte-ignore a11y-click-events-have-key-events -->\n    <div class=\"modal-content ebike-modal\" on:click|stopPropagation role=\"dialog\" aria-modal=\"true\">\n      <button class=\"modal-close\" on:click={closeCasualModal}>&times;</button>\n\n      <h3 style=\"margin-bottom: 1rem; color: #333; text-align: center; font-weight:600; font-size:24px\">Verify Casual Eligibility</h3>\n      <div class=\"ebike-requirements\">\n        {#each CASUAL_REQUIREMENTS as req}\n          <div class=\"requirement-item\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"#2E5C8A\"/>\n              <path d=\"M7 12L10.5 15.5L17 9\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            <span>{req}</span>\n          </div>\n        {/each}\n      </div>\n\n      <div class=\"casual-question\">\n        <p class=\"casual-question-prompt\">Does this match how you&rsquo;ll ride this <strong>policy year</strong>?</p>\n        <p class=\"casual-question-helper\">If this is an e-bike, or you ride in a triathlon, gran fondo, gravel event, or race, choose &ldquo;No&rdquo; and select the appropriate coverage.</p>\n      </div>\n\n      <div class=\"ebike-verification-buttons\">\n        <button\n          type=\"button\"\n          class=\"verification-btn verification-yes\"\n          on:click={() => handleCasualVerification('yes')}\n        >\n          Yes &mdash; Casual\n        </button>\n        <button\n          type=\"button\"\n          class=\"verification-btn verification-no\"\n          on:click={() => handleCasualVerification('no')}\n        >\n          No\n        </button>\n      </div>\n    </div>\n  </div>\n{/if}\n\n<style lang=\"scss\">\n  @import './styles/variables.scss';\n\n  :global(.rangeNub) {\n    display: none !important;\n  }\n\n  :global(.pipVal){\n    font-size:14px !important;\n  }\n\n  :global(.price-slider-container){\n\n    padding: 0 20px !important;\n  }\n\n  .purchase-price-label {\n    width:100%;\n    text-align:center;\n  }\n\n  .purchase-price {\n    color:$bike-blue;\n    font-weight:600;\n  }\n\n  .validation-errors {\n    background-color: #ffebee;\n    border: 2px solid #f44336;\n    border-radius: $border-radius;\n    padding: $spacing-lg;\n    margin-bottom: 25px;\n\n    h3 {\n      color: #d32f2f;\n      margin: 0 0 15px 0;\n      font-size: $font-size-xl;\n    }\n\n    ul {\n      margin: 0;\n      padding-left: 20px;\n      color: #d32f2f;\n    }\n\n    li {\n      margin-bottom: 8px;\n      font-weight: 500;\n    }\n  }\n\n  .add-bike-btn {\n    background-color: white;\n    color: black;\n    font-size: 20px;\n    border-radius: 20px;\n    margin: 0 auto;\n    display: block;\n    border: 2px solid #e0e0e0;\n    padding: $spacing-md $spacing-lg;\n    transition: all 0.2s;\n    cursor: pointer;\n\n    &:hover {\n      border-color: $danger-color;\n      background-color: #f8f9fa;\n    }\n\n    i {\n      color: $danger-color;\n      margin-right: $spacing-sm;\n    }\n  }\n\n  .submit-btn {\n    width: 100%;\n    background: linear-gradient(135deg, $bike-red 0%, $bike-red-light 100%);\n    color: white;\n    border: none;\n    border-radius: 50px;\n    padding: 18px 30px;\n    font-size: $font-size-lg;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    margin: $spacing-lg 0;\n\n    &:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n    }\n\n    &:active {\n      transform: translateY(0);\n    }\n  }\n\n  .step-content {\n    max-width: 800px;\n    margin: 0 auto;\n    max-width: 537px;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    width: 100%;\n  }\n  \n  .bikes-section {\n    margin-top: 20px;\n    width: 100%;;\n  }\n  \n  .bike-accordion {\n    border: 1px solid #e0e0e0;\n    border-radius: $border-radius;\n    margin-bottom: $spacing-md;\n    background-color: white;\n    overflow: hidden;\n    box-shadow: $shadow-sm;\n\n    .bike-header {\n      background: linear-gradient(135deg, $bike-blue 0%, $bike-blue-light 100%);\n      color: white;\n      padding: $spacing-md $spacing-lg;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      transition: background-color 0.2s;\n\n      &:hover {\n        background: linear-gradient(135deg, $bike-blue-light 0%, #3d6ba3 100%);\n      }\n\n      .bike-header-content {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n\n        .bike-header-icon {\n          display: flex;\n          align-items: center;\n\n          .chevron {\n            transition: transform 0.2s ease;\n\n            &.expanded {\n              transform: rotate(180deg);\n            }\n          }\n        }\n\n        .bike-header-info {\n          display: flex;\n          flex-direction: column;\n          gap: 2px;\n\n          .bike-title {\n            font-size: $font-size-lg;\n            font-weight: 600;\n            line-height: 1.2;\n          }\n\n          .bike-subtitle {\n            font-size: 13px;\n            opacity: 0.9;\n            font-weight: 400;\n          }\n        }\n      }\n\n      .remove-btn {\n        background: rgba(255, 255, 255, 0.2);\n        border: none;\n        color: white;\n        width: 24px;\n        height: 24px;\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: $font-size-xl;\n        line-height: 1;\n        cursor: pointer;\n        transition: background-color 0.2s;\n\n        &:hover {\n          background: rgba(255, 255, 255, 0.3);\n        }\n      }\n    }\n\n    .bike-content {\n      padding: $spacing-lg;\n      background-color: white;\n      border-top: 1px solid rgba(255, 255, 255, 0.1);\n    }\n  }\n  \n  /* Form label styling for non-input components */\n  .form-label {\n    display: block;\n    font-size: 14px;\n    font-weight: 500;\n    color: #334155;\n    margin-bottom: 8px;\n  }\n  \n  /* Keep styling for inputs that don't use Tailwind classes */\n  input:not([class*=\"block\"]), select:not([class*=\"block\"]), textarea:not([class*=\"block\"]) {\n    width: 100%;\n    padding: 12px;\n    border: 1px solid #ddd;\n    border-radius: 6px;\n    font-size: 14px;\n    transition: border-color 0.3s;\n  }\n  \n  input:not([class*=\"block\"]):focus, select:not([class*=\"block\"]):focus, textarea:not([class*=\"block\"]):focus {\n    outline: none;\n    border-color: #007bff;\n  }\n  \n  textarea {\n    resize: vertical;\n    min-height: 80px;\n  }\n  \n  .btn {\n    padding: 10px 20px;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 14px;\n    transition: background-color 0.3s;\n  }\n  \n  .btn-secondary {\n    background-color: #6c757d;\n    color: white;\n  }\n  \n  .btn-secondary:hover {\n    background-color: #5a6268;\n  }\n  \n  .btn-danger {\n    background-color: #dc3545;\n    color: white;\n  }\n  \n  .btn-danger:hover {\n    background-color: #c82333;\n  }\n  \n  .btn-sm {\n    padding: 5px 10px;\n    font-size: 12px;\n  }\n  \n  /* List input styles */\n  .form-label-with-tooltip {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    margin-bottom: 8px;\n  }\n\n  .form-label-with-tooltip .form-label {\n    margin-bottom: 0;\n  }\n\n  .tooltip-wrapper {\n    position: relative;\n    display: inline-flex;\n    align-items: center;\n  }\n\n  .info-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 20px;\n    height: 20px;\n    cursor: help;\n    transition: all 0.2s ease;\n  }\n\n  .info-icon-img {\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n  }\n\n  .info-icon:hover {\n    transform: scale(1.15);\n  }\n\n  .tooltip-text {\n    position: absolute;\n    bottom: 100%;\n    left: 50%;\n    transform: translateX(-50%) translateY(-8px);\n    background-color: #1f2937;\n    color: white;\n    padding: 12px 16px;\n    border-radius: 8px;\n    font-size: 13px;\n    line-height: 1.5;\n    white-space: normal;\n    width: 320px;\n    max-width: 90vw;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n    opacity: 0;\n    visibility: hidden;\n    transition: all 0.2s ease;\n    z-index: 1000;\n    pointer-events: none;\n  }\n\n  .tooltip-text::after {\n    content: '';\n    position: absolute;\n    top: 100%;\n    left: 50%;\n    transform: translateX(-50%);\n    border: 6px solid transparent;\n    border-top-color: #1f2937;\n  }\n\n  .tooltip-wrapper:hover .tooltip-text {\n    opacity: 1;\n    visibility: visible;\n    transform: translateX(-50%) translateY(-12px);\n  }\n\n  .accessories-help-text {\n    margin: 0.25rem 0 0.75rem;\n  }\n\n  .accessories-help-text p {\n    margin: 0;\n    font-size: 0.82rem;\n    color: #555;\n    line-height: 1.5;\n  }\n\n  .accessory-warning {\n    background: #fef2f2;\n    border: 1px solid #fca5a5;\n    border-radius: 6px;\n    color: #b91c1c;\n    font-size: 0.78rem;\n    padding: 0.4rem 0.6rem;\n    margin-bottom: 6px;\n    max-width: calc(100% - 48px);\n  }\n\n  .list-input {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n  }\n  \n  .list-item {\n    display: flex;\n    gap: 8px;\n    align-items: center;\n  }\n  \n  .list-item input {\n    flex: 1;\n    margin: 0;\n  }\n  \n  .list-item .btn-remove {\n    min-width: 32px;\n    height: 32px;\n    padding: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 18px;\n    line-height: 1;\n  }\n  \n  .add-item {\n    display: flex;\n    gap: 8px;\n    align-items: center;\n    margin-top: 4px;\n  }\n  \n  .add-item input {\n    flex: 1;\n    margin: 0;\n  }\n  \n  .btn-add {\n    background: white;\n    color: #001535;\n    border: 2px solid #c53030;\n    border-radius: 50%;\n    width: 36px;\n    height: 36px;\n    min-width: 36px;\n    cursor: pointer;\n    font-size: 28px;\n    font-weight: 600;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    transition: all 0.2s ease;\n    box-shadow: 0 2px 8px rgba(197, 48, 48, 0.2);\n    text-align: center;\n    line-height: 0;\n  }\n  \n  .btn-add:hover {\n    transform: scale(1.1);\n    box-shadow: 0 4px 12px rgba(197, 48, 48, 0.3);\n    border-color: #e53e3e;\n  }\n  \n  .btn-add:active {\n    transform: scale(1.05);\n  }\n  \n  /* Boolean input styles */\n  .boolean-input {\n    display: flex;\n    gap: 20px;\n    margin-top: 8px;\n  }\n  \n  .radio-label {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-weight: normal;\n    cursor: pointer;\n    margin-bottom: 0;\n  }\n  \n  .radio-label input[type=\"radio\"] {\n    width: auto;\n    margin: 0;\n    padding: 0;\n  }\n  \n  /* Price Slider Styles */\n  .price-slider-container {\n    padding: 20px 0;\n    margin-top: 10px;\n  }\n  \n  .price-display {\n    text-align: center;\n    margin-top: 20px;\n    font-size: 16px;\n    color: #333;\n    \n    strong {\n      color: $bike-blue;\n      font-size: 20px;\n    }\n  }\n  \n  /* Range Slider Custom Styles */\n  :global(.rangeSlider) {\n    --range-slider: #{$bike-blue} !important;\n    --range-handle-inactive: #{$bike-blue} !important;\n    --range-handle: #{$bike-blue} !important;\n    --range-handle-focus: #{$bike-blue-light} !important;\n    --range-pip: #94a3b8 !important;\n    --range-pip-text: #64748b !important;\n    --range-pip-active: #1e40af !important;\n    --range-pip-hover: #3b82f6 !important;\n    margin: 20px 0;\n  }\n  \n  :global(.rangeSlider .rangeHandle) {\n    width: 20px !important;\n    height: 20px !important;\n    border-radius: 50% !important;\n    background: #{$bike-blue} !important;\n    border: 3px solid white !important;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2) !important;\n    cursor: grab !important;\n    \n    &:active {\n      cursor: grabbing !important;\n    }\n  }\n  \n  :global(.rangeSlider .rangeBar) {\n    height: 6px !important;\n    background: #{$bike-blue} !important;\n    border-radius: 3px !important;\n  }\n  \n  :global(.rangeSlider .rangeNub) {\n    height: 6px !important;\n    background: #e2e8f0 !important;\n    border-radius: 3px !important;\n  }\n  \n  :global(.rangeSlider .rangePips .pip) {\n    color: #64748b !important;\n    font-size: 11px !important;\n    font-weight: 500 !important;\n  }\n  \n  :global(.rangeSlider .rangePips .pip.selected) {\n    color: #{$bike-blue} !important;\n    font-weight: 600 !important;\n  }\n  \n  /* Plan Options Styles */\n  .plan-options {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n    margin-top: 8px;\n  }\n  \n  .plan-option {\n    position: relative;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 20px 24px;\n    background: white;\n    border: 2px solid #e0e0e0;\n    border-radius: 12px;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    text-align: left;\n    width: 100%;\n    \n    &:hover {\n      border-color: #{$bike-blue};\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n    }\n    \n    &.selected {\n      background: #264873;\n      border-color: #264873;\n      color: white;\n      \n      .plan-name, .plan-price {\n        color: white;\n      }\n    }\n  }\n  \n  .plan-header {\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n    flex: 1;\n  }\n  \n  .plan-name {\n    font-size: 15px;\n    font-weight: 600;\n    color: #333;\n  }\n  \n  .plan-price {\n    font-size: 16px;\n    font-weight: 500;\n    color: #666;\n  }\n  \n  .multi-bike-discount-badge {\n    text-align: center;\n    font-size: 13px;\n    font-weight: 600;\n    color: #1A5F92;\n    margin-top: 8px;\n  }\n\n  .plan-checkmark {\n    position: absolute;\n    top: 50%;\n    right: 20px;\n    transform: translateY(-50%);\n    width: 36px;\n    height: 36px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    \n    img {\n      width: 100%;\n      height: 100%;\n      object-fit: contain;\n    }\n  }\n\n  /* Bike Usage Image Selector Styles */\n  .bike-usage-options {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 12px;\n    margin-top: 12px;\n    align-items: stretch;\n    \n    @media (max-width: 768px) {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  .bike-usage-card {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 4px;\n    padding: 20px 16px;\n\n    @media (max-width: 768px) {\n      flex-direction: row;\n      align-items: center;\n      gap: 12px;\n      padding: 14px 16px;\n    }\n    background: white;\n    border: 2px solid #e0e0e0;\n    border-radius: 12px;\n    cursor: pointer;\n    transition: all 0.25s ease;\n    \n    &:hover {\n      border-color: var(--usage-color, #{$bike-blue});\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n    }\n    \n    &.selected {\n      background: var(--usage-color, #{$bike-blue});\n      border-color: var(--usage-color, #{$bike-blue});\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);\n      \n      .bike-usage-label {\n        color: #fff;\n        font-weight: 600;\n      }\n    }\n  }\n  \n  .bike-usage-image {\n    width: 90px;\n    height: 90px;\n    flex-shrink: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    \n    img {\n      width: 100%;\n      height: 100%;\n      object-fit: contain;\n    }\n  }\n\n  .bike-usage-label {\n    font-size: 1.05rem;\n    font-weight: 600;\n    color: #333;\n    text-align: center;\n    transition: all 0.25s ease;\n\n    @media (max-width: 768px) {\n      text-align: left;\n      flex: 1;\n    }\n  }\n\n  .bike-usage-check {\n    position: absolute;\n    top: 8px;\n    right: 10px;\n    width: 24px;\n    height: 24px;\n    object-fit: contain;\n\n    @media (max-width: 768px) {\n      width: 34px;\n      height: 34px;\n    }\n  }\n  \n  @keyframes checkmarkPop {\n    0% {\n      transform: scale(0);\n      opacity: 0;\n    }\n    50% {\n      transform: scale(1.1);\n    }\n    100% {\n      transform: scale(1);\n      opacity: 1;\n    }\n  }\n\n  /* E-Bike Verification Modal Styles */\n  .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.6);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 9999;\n    padding: 20px;\n    animation: fadeIn 0.3s ease;\n  }\n  \n  .modal-content {\n    background: white;\n    border-radius: 16px;\n    max-width: 600px;\n    width: 100%;\n    max-height: 90vh;\n    overflow-y: auto;\n    position: relative;\n    animation: slideUp 0.3s ease;\n    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n  }\n  \n  .ebike-modal {\n    padding: 2.5rem;\n    \n    @media (max-width: 768px) {\n      padding: 2rem 1.5rem;\n    }\n  }\n  \n  .modal-close {\n    position: absolute;\n    top: 20px;\n    right: 20px;\n    background: none;\n    border: none;\n    font-size: 32px;\n    color: #999;\n    cursor: pointer;\n    width: 40px;\n    height: 40px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 50%;\n    transition: all 0.2s;\n    \n    &:hover {\n      background: #f5f5f5;\n      color: #333;\n    }\n  }\n  \n  .ebike-requirements {\n    background: #f8f9fa;\n    border-radius: 12px;\n    padding: 1.5rem;\n    margin-bottom: 2rem;\n  }\n  \n  .requirement-item {\n    display: flex;\n    align-items: center;\n    gap: 1rem;\n    padding: 0.75rem 0;\n    \n    &:not(:last-child) {\n      border-bottom: 1px solid #e0e0e0;\n    }\n    \n    svg {\n      flex-shrink: 0;\n    }\n    \n    span {\n      font-size: 16px;\n      color: #333;\n      font-weight: 500;\n    }\n  }\n  \n  .ebike-question {\n    text-align: center;\n    \n    h3 {\n      font-size: 18px;\n      font-weight: 600;\n    }\n  }\n\n  .casual-question {\n    text-align: center;\n    color: #333;\n  }\n\n  .casual-question-prompt {\n    margin: 0 0 0.5rem;\n    font-size: 18px;\n    font-weight: 500;\n  }\n\n  .casual-question-helper {\n    margin: 0;\n    font-size: 14px;\n    color: #666;\n    line-height: 1.5;\n  }\n  \n  .ebike-verification-buttons {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 1rem;\n    margin-top: 1.5rem;\n  }\n  \n  .verification-btn {\n    padding: 1rem 2rem;\n    font-size: 18px;\n    font-weight: 600;\n    border: 2px solid #e0e0e0;\n    border-radius: 12px;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    background: white;\n    \n    &:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n    }\n  }\n  \n  .verification-yes {\n    border-color: #{$bike-blue};\n    color: #{$bike-blue};\n    \n    &:hover {\n      background: #{$bike-blue};\n      color: white;\n    }\n  }\n  \n  .verification-no {\n    border-color: #dc3545;\n    color: #dc3545;\n    \n    &:hover {\n      background: #dc3545;\n      color: white;\n    }\n  }\n  \n  .ebike-rejection {\n    text-align: center;\n    padding: 1rem 0;\n  }\n  \n  .ebike-success {\n    padding: 2rem 0;\n    text-align: center;\n  }\n  \n  @keyframes fadeIn {\n    from {\n      opacity: 0;\n    }\n    to {\n      opacity: 1;\n    }\n  }\n  \n  @keyframes slideUp {\n    from {\n      transform: translateY(50px);\n      opacity: 0;\n    }\n    to {\n      transform: translateY(0);\n      opacity: 1;\n    }\n  }\n</style> ","<script>\n  import { createEventDispatcher, onMount } from 'svelte';\n  \n  const dispatch = createEventDispatcher();\n  \n  export let existingSignature = '';\n  \n  let canvas;\n  let ctx;\n  let isDrawing = false;\n  let hasDrawn = false;\n  \n  // Touch/mouse coordinates\n  let lastX = 0;\n  let lastY = 0;\n  \n  onMount(() => {\n    if (canvas) {\n      ctx = canvas.getContext('2d');\n      setupCanvas();\n      \n      // Load existing signature if provided\n      if (existingSignature) {\n        loadExistingSignature();\n      }\n    }\n  });\n  \n  function setupCanvas() {\n    // Set canvas size\n    canvas.width = canvas.offsetWidth;\n    canvas.height = canvas.offsetHeight;\n    \n    // Set drawing styles\n    ctx.strokeStyle = '#000';\n    ctx.lineWidth = 2;\n    ctx.lineCap = 'round';\n    ctx.lineJoin = 'round';\n    \n    // Fill with white background\n    ctx.fillStyle = '#fff';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n  }\n  \n  function loadExistingSignature() {\n    const img = new Image();\n    img.onload = () => {\n      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n      hasDrawn = true;\n    };\n    img.src = existingSignature;\n  }\n  \n  function getCoordinates(event) {\n    const rect = canvas.getBoundingClientRect();\n    const scaleX = canvas.width / rect.width;\n    const scaleY = canvas.height / rect.height;\n    \n    if (event.touches) {\n      // Touch event\n      const touch = event.touches[0];\n      return {\n        x: (touch.clientX - rect.left) * scaleX,\n        y: (touch.clientY - rect.top) * scaleY\n      };\n    } else {\n      // Mouse event\n      return {\n        x: (event.clientX - rect.left) * scaleX,\n        y: (event.clientY - rect.top) * scaleY\n      };\n    }\n  }\n  \n  function startDrawing(event) {\n    event.preventDefault();\n    isDrawing = true;\n    hasDrawn = true;\n    \n    const coords = getCoordinates(event);\n    lastX = coords.x;\n    lastY = coords.y;\n    \n    ctx.beginPath();\n    ctx.moveTo(lastX, lastY);\n  }\n  \n  function draw(event) {\n    if (!isDrawing) return;\n    event.preventDefault();\n    \n    const coords = getCoordinates(event);\n    \n    ctx.lineTo(coords.x, coords.y);\n    ctx.stroke();\n    \n    lastX = coords.x;\n    lastY = coords.y;\n  }\n  \n  function stopDrawing(event) {\n    if (!isDrawing) return;\n    event.preventDefault();\n    isDrawing = false;\n  }\n  \n  function clearSignature() {\n    ctx.fillStyle = '#fff';\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n    hasDrawn = false;\n  }\n  \n  function saveSignature() {\n    if (!hasDrawn) {\n      alert('Please provide a signature before saving.');\n      return;\n    }\n    \n    const signatureData = canvas.toDataURL('image/png');\n    dispatch('save', { signatureData });\n  }\n  \n  function closeModal() {\n    dispatch('close');\n  }\n  \n  // Prevent scrolling when drawing on mobile\n  function preventScroll(event) {\n    event.preventDefault();\n  }\n</script>\n\n<div class=\"modal-overlay\" on:click={closeModal}>\n  <div class=\"modal-content\" on:click|stopPropagation>\n    <!-- Modal Header -->\n    <div class=\"modal-header\">\n      <h3>eSign:</h3>\n      <button class=\"close-btn\" on:click={closeModal}>\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n          <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n          <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n        </svg>\n      </button>\n    </div>\n    \n    <!-- Instructions -->\n    <div class=\"instructions\">\n      <p>Please sign in one continuous motion using finger on mobile device or mouse pointer if using a computer.</p>\n    </div>\n    \n    <!-- Signature Canvas -->\n    <div class=\"canvas-container\">\n      <canvas\n        bind:this={canvas}\n        class=\"signature-canvas\"\n        on:mousedown={startDrawing}\n        on:mousemove={draw}\n        on:mouseup={stopDrawing}\n        on:mouseleave={stopDrawing}\n        on:touchstart={startDrawing}\n        on:touchmove={draw}\n        on:touchend={stopDrawing}\n        on:touchcancel={stopDrawing}\n        on:touchstart={preventScroll}\n        on:touchmove={preventScroll}\n      ></canvas>\n    </div>\n    \n    <!-- Signature Label -->\n    <div class=\"signature-label\">\n      <span>Applicant's Signature</span>\n    </div>\n    \n    <!-- Action Buttons -->\n    <div class=\"modal-actions\">\n      <button class=\"btn btn-secondary\" on:click={clearSignature}>\n        Clear Signature\n      </button>\n      <button class=\"btn btn-primary\" on:click={saveSignature}>\n        Save Signature\n      </button>\n    </div>\n  </div>\n</div>\n\n<style lang=\"scss\">\n  @import '../styles/variables.scss';\n\n  .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.5);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 1000;\n    padding: $spacing-lg;\n  }\n  \n  .modal-content {\n    background: white;\n    border-radius: $border-radius-lg;\n    width: 100%;\n    max-width: 600px;\n    max-height: 90vh;\n    overflow-y: auto;\n    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n  }\n  \n  .modal-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: $spacing-lg $spacing-xl;\n    border-bottom: 1px solid #eee;\n    \n    h3 {\n      font-size: $font-size-xl;\n      font-weight: 600;\n      color: #333;\n      margin: 0;\n    }\n    \n    .close-btn {\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: $spacing-sm;\n      border-radius: 50%;\n      width: 40px;\n      height: 40px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: background-color 0.2s;\n      \n      &:hover {\n        background-color: #f0f0f0;\n      }\n      \n      svg {\n        color: #666;\n      }\n    }\n  }\n  \n  .instructions {\n    padding: $spacing-lg $spacing-xl;\n    \n    p {\n      font-size: $font-size-base;\n      color: #666;\n      margin: 0;\n      line-height: 1.5;\n    }\n  }\n  \n  .canvas-container {\n    padding: 0 $spacing-xl;\n    margin-bottom: $spacing-md;\n  }\n  \n  .signature-canvas {\n    width: 100%;\n    height: 250px;\n    border: 2px solid #ddd;\n    border-radius: $border-radius;\n    cursor: crosshair;\n    touch-action: none; // Prevent scrolling on touch devices\n    background: white;\n  }\n  \n  .signature-label {\n    padding: 0 $spacing-xl $spacing-lg;\n    text-align: left;\n    \n    span {\n      font-size: $font-size-base;\n      color: #333;\n      font-weight: 500;\n    }\n  }\n  \n  .modal-actions {\n    display: flex;\n    gap: $spacing-md;\n    padding: $spacing-lg $spacing-xl;\n    border-top: 1px solid #eee;\n    justify-content: flex-end;\n  }\n  \n  .btn {\n    padding: 12px 24px;\n    border-radius: 50px;\n    font-size: $font-size-base;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.2s;\n    border: none;\n    \n    &.btn-secondary {\n      background-color: #6c757d;\n      color: white;\n      \n      &:hover {\n        background-color: #5a6268;\n      }\n    }\n    \n    &.btn-primary {\n      background: linear-gradient(135deg, $bike-red 0%, $bike-red-light 100%);\n      color: white;\n      \n      &:hover {\n        transform: translateY(-1px);\n        box-shadow: 0 4px 12px rgba(197, 48, 48, 0.3);\n      }\n    }\n  }\n  \n  @media (max-width: 768px) {\n    .modal-overlay {\n      padding: $spacing-md;\n    }\n    \n    .modal-header, .instructions, .signature-label {\n      padding-left: $spacing-lg;\n      padding-right: $spacing-lg;\n    }\n    \n    .canvas-container {\n      padding: 0 $spacing-lg;\n    }\n    \n    .modal-actions {\n      padding: $spacing-lg;\n      flex-direction: column;\n      \n      .btn {\n        width: 100%;\n      }\n    }\n    \n    .signature-canvas {\n      height: 200px;\n    }\n  }\n</style>\n","<script>\n  import { createEventDispatcher } from 'svelte';\n  \n  const dispatch = createEventDispatcher();\n  \n  function closeModal() {\n    dispatch('close');\n  }\n  \n  function handleBackdropClick(event) {\n    if (event.target === event.currentTarget) {\n      closeModal();\n    }\n  }\n</script>\n\n<div class=\"modal-backdrop\" on:click={handleBackdropClick}>\n  <div class=\"modal-container\">\n    <div class=\"modal-header\">\n      <h2>Terms of Use & Certification</h2>\n      <button class=\"close-btn\" on:click={closeModal}>\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n          <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n          <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n        </svg>\n      </button>\n    </div>\n    \n    <div class=\"modal-content\">\n      <div class=\"terms-document\">\n        <div class=\"section\">\n          <p class=\"signature-notice\">\n            <strong>eSIGNATURE NOTICE:</strong> The applicant's 'Terms of Use & Certification' eSignature will be placed on the following disclosures herein and will be available at the BikeInsure customer portal via a secure log-in upon policy issuance.\n          </p>\n        </div>\n\n        <div class=\"section\">\n          <h3>Equipment Insurance Application</h3>\n          <h4>Great American Spirit Insurance Fraud Notices</h4>\n          <p class=\"form-reference\">EIP-NC-A002 (12/21) | NC residences only</p>\n        </div>\n\n        <div class=\"section\">\n          <h3>Ride Covered LLC dba BikeInsure Terms and Conditions Notice</h3>\n          \n          <div class=\"subsection\">\n            <h4>CONDITIONS FOR USE OF THIS SITE:</h4>\n            <p>By using this website, you signify your agreement to the terms, and conditions contained in these legal notices. Please read these terms carefully. We reserve the right to add, delete, or otherwise modify portions of these terms at any time. User access to, and use of this website is subject to all applicable federal, state, and local laws, and regulations. The state of Maryland law, and United States federal law will govern the interpretation and enforcement of these terms and conditions.</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>DISCLAIMER:</h4>\n            <p>This website has been prepared solely for the purpose of providing information about Ride Covered LLC dba BikeInsure, and the services, and products it offers through its subsidiaries. BikeInsure has compiled this website in good faith. However, no representation is made as to the completeness or accuracy of the information it contains. You should be aware that this information may be incomplete, may contain errors or may have become out of date. BikeInsure makes no commitment and disclaims any duty to update any of those reports. THIS WEBSITE, AND THE INFORMATION CONTAINED HEREIN (INCLUDING ANY REFERENCES TO PRODUCTS OR SERVICES) ARE PROVIDED \"AS IS\" WITHOUT ANY WARRANTY OR IMPLIED TERM OF ANY KIND. RIDE COVERED LLC DBA BIKEINSURE, AND ITS SUBSIDIARIES SHALL NOT BE SUBJECT TO LIABILITY FOR ANY DAMAGES OF ANY KIND, WHETHER DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL OR OTHERWISE, WHETHER OR NOT ADVISED OF THE POSSIBILITY THEREOF, UNDER ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE PROVISION OF INFORMATION ON THIS WEBSITE.</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>CALIFORNIA:</h4>\n            <p>Ride Covered LLC dba BikeInsure Insurance Solutions in the State of California.</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>TRADEMARKS:</h4>\n            <p>BIKEINSURE®, BikeInsure graphic icon, BikeInsure with graphic icon, and \"enjoy the ride. you're covered.®\" tagline are registered trademarks of Ride Covered LLC dba BikeInsure. All other trademarks are property of BikeInsure or its subsidiaries unless otherwise designated.</p>\n            \n            <p>The Great American Insurance Group eagle logo and the wordmarks Great American® and Great American Insurance Group® are registered service marks of Great American Insurance Company, 301 E. 4th Street, Cincinnati, OH 45202.</p>\n            \n            <p>Use of the Great American Insurance Company service mark and logo are granted to Ride Covered LLC dba BikeInsure via Service Mark License Agreement.</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>COPYRIGHTS:</h4>\n            <p>© {new Date().getFullYear()} Ride Covered LLC dba BikeInsure. All rights reserved. No materials from this website may be copied, reproduced, republished, posted, or distributed in any way, except as expressly permitted herein or with the prior consent of BikeInsure. © {new Date().getFullYear()} Great American Insurance Company. All rights reserved. 5506-SES.</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>LINKS TO OTHER MATERIALS:</h4>\n            <p>Some of the links available to you through this website will allow you to leave the BikeInsure website. The Internet sites, and the material that you can access there are not under the control of BikeInsure, and BikeInsure makes no representations, and disclaims all liability with respect thereto. The links are provided only for your convenience, and their inclusion does not constitute nor imply approval or endorsement by BikeInsure of the sites or their content.</p>\n          </div>\n        </div>\n\n        <div class=\"section\">\n          <h3>Great American Spirit Insurance Company</h3>\n          <h4>Fraud Notices</h4>\n          \n          <div class=\"subsection\">\n            <p class=\"notice-header\">NOTICE TO APPLICANTS:</p>\n            <p>\"ANY PERSON WHO KNOWINGLY AND WITH INTENT TO DEFRAUD ANY INSURANCE COMPANY OR OTHER PERSON FILES AN APPLICATION FOR INSURANCE OR STATEMENT OF CLAIM CONTAINING ANY MATERIALLY FALSE INFORMATION, OR CONCEALS FOR THE PURPOSE OF MISLEADING, INFORMATION CONCERNING ANY FACT MATERIAL THERETO, COMMITS A FRAUDULENT INSURANCE ACT WHICH IS A CRIME AND MAY SUBJECT SUCH PERSON TO CRIMINAL AND CIVIL PENALTIES.\"</p>\n          </div>\n\n          <div class=\"subsection\">\n            <h4>FRAUD NOTICES – FOR APPLICANTS OF THE FOLLOWING STATES:</h4>\n            \n            <div class=\"state-notices\">\n              <div class=\"state-notice\">\n                <h5>ALABAMA:</h5>\n                <p>ANY PERSON WHO KNOWINGLY PRESENTS A FALSE OR FRAUDULENT CLAIM FOR PAYMENT OF A LOSS OR BENEFIT OR WHO KNOWINGLY PRESENTS FALSE INFORMATION IN AN APPLICATION FOR INSURANCE IS GUILTY OF A CRIME AND MAY BE SUBJECT TO RESTITUTION, FINES OR CONFINEMENT IN PRISON, OR ANY COMBINATION THEREOF.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>ALASKA:</h5>\n                <p>A PERSON WHO KNOWINGLY AND WITH INTENT TO INJURE, DEFRAUD, OR DECEIVE AN INSURANCE COMPANY FILES A CLAIM CONTAINING FALSE, INCOMPLETE, OR MISLEADING INFORMATION MAY BE PROSECUTED UNDER STATE LAW.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>ARKANSAS:</h5>\n                <p>ANY PERSON WHO KNOWINGLY PRESENTS A FALSE OR FRAUDULENT CLAIM FOR PAYMENT OF A LOSS OR BENEFIT OR KNOWINGLY PRESENTS FALSE INFORMATION IN AN APPLICATION FOR INSURANCE IS GUILTY OF A CRIME AND MAY BE SUBJECT TO FINES AND CONFINEMENT IN PRISON.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>ARIZONA:</h5>\n                <p>FOR YOUR PROTECTION ARIZONA LAW REQUIRES THE FOLLOWING STATEMENT TO APPEAR ON THIS FORM. ANY PERSON WHO KNOWINGLY PRESENTS A FALSE OR FRAUDULENT CLAIM FOR PAYMENT OF A LOSS IS SUBJECT TO CRIMINAL AND CIVIL PENALTIES.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>CALIFORNIA:</h5>\n                <p>FOR YOUR PROTECTION CALIFORNIA LAW REQUIRES THE FOLLOWING TO APPEAR ON THIS FORM: ANY PERSON WHO KNOWINGLY PRESENTS FALSE OR FRAUDULENT INFORMATION TO OBTAIN OR AMEND INSURANCE COVERAGE OR TO MAKE A CLAIM FOR THE PAYMENT OF A LOSS IS GUILTY OF A CRIME AND MAY BE SUBJECT TO FINES AND CONFINEMENT IN STATE PRISON.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>COLORADO:</h5>\n                <p>IT IS UNLAWFUL TO KNOWINGLY PROVIDE FALSE, INCOMPLETE, OR MISLEADING FACTS OR INFORMATION TO AN INSURANCE COMPANY FOR THE PURPOSE OF DEFRAUDING OR ATTEMPTING TO DEFRAUD THE COMPANY. PENALTIES MAY INCLUDE IMPRISONMENT, FINES, DENIAL OF INSURANCE, AND CIVIL DAMAGES. ANY INSURANCE COMPANY OR AGENT OF AN INSURANCE COMPANY WHO KNOWINGLY PROVIDES FALSE, INCOMPLETE, OR MISLEADING FACTS OR INFORMATION TO A POLICYHOLDER OR CLAIMANT FOR THE PURPOSE OF DEFRAUDING OR ATTEMPTING TO DEFRAUD THE POLICYHOLDER OR CLAIMANT WITH REGARD TO A SETTLEMENT OR AWARD PAYABLE FROM INSURANCE PROCEEDS SHALL BE REPORTED TO THE COLORADO DIVISION OF INSURANCE WITHIN THE DEPARTMENT OF REGULATORY AGENCIES.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>DELAWARE:</h5>\n                <p>ANY PERSON WHO KNOWINGLY, AND WITH INTENT TO INJURE, DEFRAUD OR DECEIVE ANY INSURER, FILES A STATEMENT OF CLAIM CONTAINING ANY FALSE, INCOMPLETE OR MISLEADING INFORMATION IS GUILTY OF A FELONY.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>DISTRICT OF COLUMBIA:</h5>\n                <p>WARNING: IT IS A CRIME TO PROVIDE FALSE OR MISLEADING INFORMATION TO AN INSURER FOR THE PURPOSE OF DEFRAUDING THE INSURER OR ANY OTHER PERSON. PENALTIES INCLUDE IMPRISONMENT AND/OR FINES. IN ADDITION, AN INSURER MAY DENY INSURANCE BENEFITS IF FALSE INFORMATION MATERIALLY RELATED TO A CLAIM WAS PROVIDED BY THE APPLICANT.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>FLORIDA:</h5>\n                <p>ANY PERSON WHO KNOWINGLY AND WITH INTENT TO INJURE, DEFRAUD, OR DECEIVE ANY INSURER FILES A STATEMENT OF CLAIM OR AN APPLICATION CONTAINING ANY FALSE, INCOMPLETE OR MISLEADING INFORMATION IS GUILTY OF A FELONY OF THE THIRD DEGREE.</p>\n              </div>\n\n              <div class=\"state-notice\">\n                <h5>NEW YORK:</h5>\n                <p>ANY PERSON WHO KNOWINGLY AND WITH INTENT TO DEFRAUD ANY INSURANCE COMPANY OR OTHER PERSON FILES AN APPLICATION FOR COMMERCIAL INSURANCE OR A STATEMENT OF CLAIM FOR ANY COMMERCIAL OR PERSONAL INSURANCE BENEFITS CONTAINING ANY MATERIALLY FALSE INFORMATION, OR CONCEALS FOR THE PURPOSE OF MISLEADING, INFORMATION CONCERNING ANY FACT MATERIAL THERETO, AND ANY PERSON WHO, IN CONNECTION WITH SUCH APPLICATION OR CLAIM, KNOWINGLY MAKES OR KNOWINGLY ASSISTS, ABETS, SOLICITS OR CONSPIRES WITH ANOTHER TO MAKE A FALSE REPORT OF THE THEFT, DESTRUCTION, DAMAGE OR CONVERSION OF ANY MOTOR VEHICLE TO A LAW ENFORCEMENT AGENCY, THE DEPARTMENT OF MOTOR VEHICLES OR AN INSURANCE COMPANY, COMMITS A FRAUDULENT INSURANCE ACT, WHICH IS A CRIME, AND SHALL ALSO BE SUBJECT TO A CIVIL PENALTY NOT TO EXCEED FIVE THOUSAND DOLLARS AND THE VALUE OF THE SUBJECT MOTOR VEHICLE OR STATED CLAIM FOR EACH VIOLATION.</p>\n              </div>\n\n              <!-- Additional states can be added here if needed -->\n            </div>\n          </div>\n        </div>\n\n        <div class=\"section\">\n          <h3>Applicant Consent to Fee Charges in Premium</h3>\n          <p class=\"form-reference\">EIP-GN-F002 (12/21)</p>\n          \n          <p>North Carolina statute G.S. 58-33-85(b) states, \"No insurer, agent, broker, or limited representative shall knowingly charge to or demand or receive from an applicant for insurance any money or other consideration in return for the processing of applications or other forms or for the rendering of services associated with a contract of insurance, which money or other consideration is in addition to the premium for such contract, unless the applicant consents in writing before any services are rendered.\"</p>\n          \n          <p>This policy's premium contains fees to process premium payment via ACH, credit card or check as stated below. By signing below, you are agreeing to these charges should we issue you an insurance policy.</p>\n          \n          <div class=\"fee-table\">\n            <table>\n              <thead>\n                <tr>\n                  <th>Payment Method</th>\n                  <th>Fee</th>\n                </tr>\n              </thead>\n              <tbody>\n                <tr>\n                  <td>ACH/Direct Debit</td>\n                  <td>$0.99 per installment</td>\n                </tr>\n                <tr>\n                  <td>Credit Card</td>\n                  <td>$0.99 per installment</td>\n                </tr>\n                <tr>\n                  <td>Check</td>\n                  <td>$1.99 per installment</td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n\n        <div class=\"section\">\n          <h3>Fee Charges in Premium Disclosure Notice</h3>\n          <p class=\"form-reference\">EIP-SC-A002 (12/21)</p>\n          \n          <p>This policy's premium contains fees to process premium payment via ACH, credit card or check as follows:</p>\n          \n          <div class=\"fee-table\">\n            <table>\n              <thead>\n                <tr>\n                  <th>Payment Method</th>\n                  <th>Fee</th>\n                </tr>\n              </thead>\n              <tbody>\n                <tr>\n                  <td>ACH/Direct Debit</td>\n                  <td>$0.99 per installment</td>\n                </tr>\n                <tr>\n                  <td>Credit Card</td>\n                  <td>$0.99 per installment</td>\n                </tr>\n                <tr>\n                  <td>Check</td>\n                  <td>$1.99 per installment</td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"modal-footer\">\n      <button class=\"close-footer-btn\" on:click={closeModal}>\n        Close\n      </button>\n    </div>\n  </div>\n</div>\n\n<style lang=\"scss\">\n  @import '../styles/variables.scss';\n\n  .modal-backdrop {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.75);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 1000;\n    padding: $spacing-md;\n  }\n\n  .modal-container {\n    background: white;\n    border-radius: 12px;\n    width: 100%;\n    max-width: 900px;\n    max-height: 90vh;\n    display: flex;\n    flex-direction: column;\n    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n  }\n\n  .modal-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: $spacing-lg $spacing-xl;\n    border-bottom: 1px solid #e5e7eb;\n    background: #f8fafc;\n    border-radius: 12px 12px 0 0;\n\n    h2 {\n      margin: 0;\n      font-size: $font-size-xxl;\n      font-weight: 700;\n      color: #1f2937;\n    }\n\n    .close-btn {\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: $spacing-xs;\n      border-radius: 6px;\n      color: #6b7280;\n      transition: all 0.2s;\n\n      &:hover {\n        background: #e5e7eb;\n        color: #374151;\n      }\n\n      svg {\n        width: 20px;\n        height: 20px;\n      }\n    }\n  }\n\n  .modal-content {\n    flex: 1;\n    overflow-y: auto;\n    padding: $spacing-xl;\n  }\n\n  .terms-document {\n    font-family: 'Times New Roman', Times, serif;\n    line-height: 1.6;\n    color: #1f2937;\n\n    .section {\n      margin-bottom: $spacing-xl;\n      \n      &:last-child {\n        margin-bottom: 0;\n      }\n\n      h3 {\n        font-size: $font-size-xl;\n        font-weight: 700;\n        margin: 0 0 $spacing-md 0;\n        color: #111827;\n        text-align: center;\n        text-transform: uppercase;\n        letter-spacing: 0.5px;\n      }\n\n      h4 {\n        font-size: $font-size-lg;\n        font-weight: 700;\n        margin: $spacing-lg 0 $spacing-sm 0;\n        color: #374151;\n        text-transform: uppercase;\n      }\n\n      h5 {\n        font-size: $font-size-base;\n        font-weight: 700;\n        margin: $spacing-md 0 $spacing-xs 0;\n        color: #4b5563;\n        text-transform: uppercase;\n      }\n\n      p {\n        margin: 0 0 $spacing-sm 0;\n        text-align: justify;\n        \n        &:last-child {\n          margin-bottom: 0;\n        }\n      }\n\n      .form-reference {\n        font-style: italic;\n        color: #6b7280;\n        font-size: $font-size-sm;\n        text-align: center;\n        margin-bottom: $spacing-lg;\n      }\n\n      .signature-notice {\n        background: #fef3c7;\n        border: 1px solid #f59e0b;\n        border-radius: 6px;\n        padding: $spacing-md;\n        font-size: $font-size-sm;\n        margin-bottom: $spacing-lg;\n      }\n\n      .notice-header {\n        font-weight: 700;\n        text-transform: uppercase;\n        margin-bottom: $spacing-sm;\n        color: #dc2626;\n      }\n    }\n\n    .subsection {\n      margin-bottom: $spacing-lg;\n      padding-left: $spacing-md;\n      border-left: 3px solid #e5e7eb;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n\n    .state-notices {\n      .state-notice {\n        margin-bottom: $spacing-md;\n        padding: $spacing-sm;\n        background: #f9fafb;\n        border-radius: 4px;\n        border-left: 3px solid #6b7280;\n\n        h5 {\n          margin-top: 0;\n          color: #374151;\n          font-size: $font-size-sm;\n        }\n\n        p {\n          font-size: $font-size-sm;\n          margin: 0;\n          line-height: 1.4;\n        }\n      }\n    }\n\n    .fee-table {\n      margin: $spacing-md 0;\n      overflow-x: auto;\n\n      table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: $font-size-sm;\n\n        th, td {\n          padding: $spacing-sm $spacing-md;\n          text-align: left;\n          border: 1px solid #d1d5db;\n        }\n\n        th {\n          background: #f3f4f6;\n          font-weight: 600;\n          color: #374151;\n        }\n\n        td {\n          background: white;\n        }\n\n        tr:nth-child(even) td {\n          background: #f9fafb;\n        }\n      }\n    }\n  }\n\n  .modal-footer {\n    padding: $spacing-lg $spacing-xl;\n    border-top: 1px solid #e5e7eb;\n    background: #f8fafc;\n    border-radius: 0 0 12px 12px;\n    text-align: center;\n\n    .close-footer-btn {\n      background: #374151;\n      color: white;\n      border: none;\n      border-radius: 6px;\n      padding: $spacing-sm $spacing-lg;\n      font-size: $font-size-base;\n      font-weight: 600;\n      cursor: pointer;\n      transition: all 0.2s;\n\n      &:hover {\n        background: #1f2937;\n        transform: translateY(-1px);\n      }\n    }\n  }\n\n  // Mobile responsiveness\n  @media (max-width: 768px) {\n    .modal-backdrop {\n      padding: $spacing-sm;\n    }\n\n    .modal-container {\n      max-width: 100%;\n      max-height: 95vh;\n    }\n\n    .modal-header,\n    .modal-content,\n    .modal-footer {\n      padding-left: $spacing-md;\n      padding-right: $spacing-md;\n    }\n\n    .terms-document {\n      font-size: $font-size-sm;\n\n      .section h3 {\n        font-size: $font-size-lg;\n      }\n\n      .subsection {\n        padding-left: $spacing-sm;\n      }\n    }\n  }\n</style>\n","<script>\n  import { onMount, getContext, tick } from 'svelte';\n  import SignatureModal from './components/SignatureModal.svelte';\n  import TermsModal from './components/TermsModal.svelte';\n  import HelpBlock from './components/HelpBlock.svelte';\n  import { calculateV2Quote, calculateV2MultiQuote } from './v2/v2RateCalculator.js';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  const { pricing } = ctx;\n  \n  // Signature state\n  let signatureData = '';\n  let showSignatureModal = false;\n  let hasSignature = false;\n  let alreadySigned = false;\n  let showTermsModal = false;\n  \n  // Validation state\n  let errors = {};\n  \n  // Price - recalculated reactively whenever bikes change\n  $: totalMonthlyPremium = calculateTotalMonthlyPremium();\n  \n  function calculateTotalMonthlyPremium() {\n    const bikes = ctx.bikes.get ? ctx.bikes.get() : ctx.bikes;\n    \n    if (!bikes || bikes.length === 0) {\n      return '0.00';\n    }\n\n    if (ctx.useV2Api && ctx.v2QuoteData) {\n      return calculateV2Total(bikes);\n    }\n    \n    const total = pricing.getTotalPrice(bikes);\n    return pricing.formatPrice(total);\n  }\n\n  const CHOICE_TO_USAGE = {\n    'casual': 'casual',\n    'competitive': 'competitive', 'race': 'competitive',\n    'electric': 'ebike', 'ebike': 'ebike', 'e-bike': 'ebike',\n  };\n\n  function getBikeUsageForV2(bike, bikeIndex) {\n    const choiceId = bike['bike-usage']?.choice;\n    if (choiceId) {\n      const questions = ctx.questions || [];\n      const usageQ = questions.find(q => q.slug === 'bike-usage');\n      if (usageQ?.choices) {\n        const match = usageQ.choices.find(c => String(c.id) === String(choiceId));\n        if (match) {\n          const key = Object.keys(CHOICE_TO_USAGE).find(k => match.answer.toLowerCase().includes(k));\n          if (key) return CHOICE_TO_USAGE[key];\n        }\n      }\n    }\n    return ctx.v2QuoteData?.bikes?.[bikeIndex]?.usageType || 'casual';\n  }\n\n  function calculateV2Total(bikes) {\n    const v2 = ctx.v2QuoteData;\n    const bikeInputs = [];\n    const theftFlags = [];\n\n    for (let i = 0; i < bikes.length; i++) {\n      const bike = bikes[i];\n      const bikeValue = parseFloat(bike['bike-purchase-price']?.text_answer) || 500;\n      const usageType = getBikeUsageForV2(bike, i);\n      const theftVal = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n      const hasTheft = theftVal === 'true' || theftVal === true;\n      bikeInputs.push({ value: bikeValue, usageType });\n      theftFlags.push(hasTheft);\n    }\n\n    const result = calculateV2MultiQuote(bikeInputs, v2.hasAssociation, {\n      state: ctx.selectedState?.code,\n    });\n\n    let sum = 0;\n    for (let i = 0; i < result.perBike.length; i++) {\n      const bq = result.perBike[i];\n      sum += theftFlags[i] ? bq.pdTheft.monthly : bq.pdOnly.monthly;\n    }\n\n    return pricing.formatPrice(sum);\n  }\n  \n  // Check if policy already has a signature\n  $: {\n    if (ctx.policy && ctx.policy.signature) {\n      alreadySigned = true;\n      hasSignature = true;\n    }\n  }\n  \n  // Export validate function for parent to call\n  export function validateAgreePayStep() {\n    const newErrors = {};\n    \n    // Only require signature if not already signed\n    if (!alreadySigned && (!hasSignature || !signatureData)) {\n      newErrors.signature = 'Signature is required';\n    }\n    \n    errors = newErrors;\n    return Object.keys(newErrors).length === 0;\n  }\n  \n  function openSignatureModal() {\n    showSignatureModal = true;\n  }\n  \n  function closeSignatureModal() {\n    showSignatureModal = false;\n  }\n  \n  function openTermsModal() {\n    showTermsModal = true;\n  }\n  \n  function closeTermsModal() {\n    showTermsModal = false;\n  }\n  \n  function handleSignatureSave(event) {\n    signatureData = event.detail.signatureData;\n    hasSignature = true;\n    showSignatureModal = false;\n    \n    // Clear signature error if it exists\n    if (errors.signature) {\n      delete errors.signature;\n      errors = { ...errors };\n    }\n    \n    // Auto-save with signature data\n    saveSignatureToPolicy();\n  }\n  \n  function clearSignature() {\n    signatureData = '';\n    hasSignature = false;\n    ctx.triggerAutoSave();\n  }\n  \n  async function saveSignatureToPolicy() {\n    if (!signatureData || !ctx.policyUuid) {\n      console.log('No signature data or policy UUID to save');\n      return;\n    }\n    \n    try {\n      const response = await fetch(`${ctx.API_BASE_URL}partner-programs/${ctx.partnerSlug}/policies/${ctx.policyUuid}/`, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify({\n          signature_data: signatureData\n        })\n      });\n      \n      if (response.ok) {\n        console.log('Signature saved successfully');\n      } else {\n        console.error('Failed to save signature:', response.status, response.statusText);\n      }\n    } catch (error) {\n      console.error('Error saving signature:', error);\n    }\n  }\n  \n  async function handleSubmit() {\n    // Validate first\n    if (!validateAgreePayStep()) {\n      return;\n    }\n    \n    // Save signature before proceeding to payment (only if not already signed)\n    if (!alreadySigned && signatureData) {\n      await saveSignatureToPolicy();\n    }\n    \n    // Scroll to top before proceeding to next step\n    // This ensures the page is at the top before the new step renders\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    \n    // Wait for any pending DOM updates\n    await tick();\n    \n    // Proceed to next step\n    ctx.nextStep();\n  }\n</script>\n\n<div class=\"agree-pay-container\">  \n  \n  <!-- Policy Summary -->\n  <div class=\"policy-summary\">\n    <h2>Your Annual Policy</h2>\n    <div class=\"price-display\">\n      <span class=\"price-text\">Just </span>\n      <span class=\"price-amount\">${totalMonthlyPremium}</span>\n      <span class=\"price-period\"> Per Month</span>\n    </div>\n  </div>\n  \n  <!-- Agreement Section -->\n  <div class=\"agreement-section\">\n    <h3>Agreement*</h3>\n    <p class=\"agreement-intro\">\n      By clicking the \"I Agree, Submit\" button below, you confirm:\n    </p>\n    <ul class=\"agreement-list\">\n      <li>Bicycle(s) are without damage or loss.</li>\n      <li>The bike insurance is a one-year policy with automatic monthly payments.</li>\n      <li>Policies will renew annually unless canceled by the insured.</li>\n      <li>You have reviewed and agree to these <button class=\"terms-link\" on:click={openTermsModal}>Terms of Use & Certification</button>.</li>\n    </ul>\n    <p class=\"agreement-esignature\">\n      Please provide your eSignature below.\n    </p>\n  </div>\n  \n  <!-- Signature Section -->\n  <div class=\"signature-section\">\n    <h3>Signature*</h3>\n    <div class=\"signature-input\" class:error={errors.signature}>\n      {#if alreadySigned}\n        <div class=\"signature-signed\">\n          <div class=\"signed-status\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" class=\"check-icon\">\n              <path d=\"m9 12 2 2 4-4\"/>\n              <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n            </svg>\n            <div class=\"signed-content\">\n              <span class=\"signed-text\">Signed</span>\n              <small class=\"signed-note\">Your signature has been captured</small>\n            </div>\n          </div>\n          <div class=\"signature-actions\">\n            {#if ctx.policy?.signature}\n              <a href={ctx.policy.signature} target=\"_blank\" class=\"view-signature-btn\" title=\"View signature\">\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n                  <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n                  <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n                </svg>\n              </a>\n              <button class=\"redo-signature-btn\" on:click={openSignatureModal} title=\"Redo signature\">\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n                  <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n                  <path d=\"m18.5 2.5 a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n                </svg>\n              </button>\n            {/if}\n          </div>\n        </div>\n      {:else if hasSignature && signatureData}\n        <div class=\"signature-display\">\n          <img src={signatureData} alt=\"Your signature\" class=\"signature-image\" />\n          <button class=\"edit-signature-btn\" on:click={openSignatureModal}>\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n              <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n              <path d=\"m18.5 2.5 a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n            </svg>\n          </button>\n        </div>\n      {:else}\n        <button class=\"signature-placeholder\" on:click={openSignatureModal}>\n          <span class=\"placeholder-text\">Click to sign</span>\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n            <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n            <path d=\"m18.5 2.5 a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n          </svg>\n        </button>\n      {/if}\n      \n      {#if errors.signature}\n        <span class=\"error-message\">{errors.signature}</span>\n      {/if}\n    </div>\n  </div>\n  \n  <!-- Submit Button -->\n  <button class=\"submit-btn\" on:click={handleSubmit} type=\"button\">\n    I agree, Submit\n  </button>\n\n</div>\n\n<HelpBlock />\n\n<!-- Signature Modal -->\n{#if showSignatureModal}\n  <SignatureModal \n    on:save={handleSignatureSave}\n    on:close={closeSignatureModal}\n    existingSignature={signatureData}\n  />\n{/if}\n\n<!-- Terms Modal -->\n{#if showTermsModal}\n  <TermsModal \n    on:close={closeTermsModal}\n  />\n{/if}\n\n<style lang=\"scss\">\n  @import './styles/variables.scss';\n\n  .agree-pay-container {\n    min-height: 100vh;\n    padding: 0;\n    max-width: 500px;\n    margin: 0 auto;\n  }\n  \n  .header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: $spacing-lg $spacing-xl;\n    \n    .back-button {\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: $spacing-sm;\n      border-radius: $border-radius-sm;\n      color: #666;\n      transition: background-color 0.2s;\n      \n      &:hover {\n        background-color: #f0f0f0;\n      }\n    }\n    \n    .form-title {\n      flex: 1;\n      text-align: center;\n      \n      h1 {\n        font-size: 24px;\n        font-weight: 600;\n        color: #333;\n        margin: 0;\n      }\n    }\n  }\n  \n  .policy-summary {\n    text-align: center;\n    padding: $spacing-xl;\n    margin-bottom: $spacing-md;\n    \n    h2 {\n      font-size: $font-size-xl;\n      font-weight: 600;\n      color: #333;\n      margin: 0 0 $spacing-md 0;\n    }\n    \n    .price-display {\n      font-size: $font-size-lg;\n      color: #333;\n      \n      .price-amount {\n        font-size: 28px;\n        font-weight: 700;\n        color: $bike-red;\n      }\n    }\n  }\n  \n  .agreement-section, .signature-section {\n    padding: $spacing-lg $spacing-xl;\n    margin-bottom: $spacing-md;\n    \n    h3 {\n      font-size: $font-size-lg;\n      font-weight: 600;\n      color: #333;\n      margin: 0 0 $spacing-md 0;\n    }\n    \n    .agreement-intro {\n      font-size: $font-size-base;\n      line-height: 1.6;\n      color: #333;\n      margin: 0 0 $spacing-sm 0;\n    }\n    \n    .agreement-list {\n      font-size: $font-size-base;\n      line-height: 1.6;\n      color: #333;\n      margin: 0 0 $spacing-md 0;\n      padding-left: $spacing-lg;\n      list-style: disc;\n      \n      li {\n        margin-bottom: $spacing-xs;\n      }\n    }\n    \n    .agreement-esignature {\n      font-size: $font-size-base;\n      line-height: 1.6;\n      color: #333;\n      margin: 0;\n    }\n    \n    .terms-link {\n      background: none;\n      border: none;\n      color: $primary-color;\n      text-decoration: underline;\n      cursor: pointer;\n      font-size: inherit;\n      font-family: inherit;\n      padding: 0;\n      margin: 0;\n      display: inline;\n      \n      &:hover {\n        text-decoration: none;\n        color: darken($primary-color, 10%);\n      }\n      \n      &:focus {\n        outline: 2px solid $primary-color;\n        outline-offset: 2px;\n        border-radius: 2px;\n      }\n    }\n  }\n  \n  .signature-input {\n    position: relative;\n    \n    &.error .signature-placeholder {\n      border-color: $danger-color;\n    }\n    \n    .signature-placeholder {\n      width: 100%;\n      height: 120px;\n      border: 2px dashed #ddd;\n      border-radius: $border-radius;\n      background-color: #f9f9f9;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      gap: $spacing-sm;\n      cursor: pointer;\n      transition: all 0.2s;\n      \n      &:hover {\n        border-color: $primary-color;\n        background-color: #f0f8ff;\n      }\n      \n      .placeholder-text {\n        font-size: $font-size-lg;\n        color: #666;\n      }\n      \n      svg {\n        color: $primary-color;\n      }\n    }\n    \n    .signature-display {\n      position: relative;\n      border: 2px solid #ddd;\n      border-radius: $border-radius;\n      background-color: white;\n      padding: $spacing-md;\n      \n      .signature-image {\n        width: 100%;\n        height: 120px;\n        object-fit: contain;\n        object-position: center;\n      }\n      \n      .edit-signature-btn {\n        position: absolute;\n        top: $spacing-sm;\n        right: $spacing-sm;\n        background: white;\n        border: 1px solid #ddd;\n        border-radius: 50%;\n        width: 32px;\n        height: 32px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        transition: all 0.2s;\n        box-shadow: $shadow-sm;\n        \n        &:hover {\n          background-color: #f8f9fa;\n          border-color: $primary-color;\n        }\n        \n        svg {\n          color: $primary-color;\n        }\n      }\n    }\n    \n    .error-message {\n      color: $danger-color;\n      font-size: $font-size-sm;\n      margin-top: $spacing-xs;\n      display: block;\n      position: absolute;\n      bottom: -20px;\n      left: 0;\n    }\n    \n    .signature-signed {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: $spacing-md;\n      background: #f0f9ff;\n      border: 2px solid #0ea5e9;\n      border-radius: 8px;\n      \n      .signed-status {\n        display: flex;\n        align-items: center;\n        gap: $spacing-sm;\n        \n        .check-icon {\n          color: #059669;\n          flex-shrink: 0;\n        }\n        \n        .signed-content {\n          display: flex;\n          flex-direction: column;\n          \n          .signed-text {\n            font-weight: 600;\n            color: #059669;\n            font-size: 16px;\n          }\n          \n          .signed-note {\n            color: #6b7280;\n            font-size: 12px;\n            margin-top: 2px;\n          }\n        }\n      }\n      \n      .signature-actions {\n        display: flex;\n        gap: $spacing-sm;\n        align-items: center;\n      }\n      \n      .view-signature-btn,\n      .redo-signature-btn {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 32px;\n        height: 32px;\n        background: rgba(14, 165, 233, 0.1);\n        border: 1px solid #0ea5e9;\n        border-radius: 6px;\n        color: #0ea5e9;\n        text-decoration: none;\n        transition: all 0.2s;\n        cursor: pointer;\n        \n        &:hover {\n          background: rgba(14, 165, 233, 0.2);\n          transform: translateY(-1px);\n        }\n        \n        svg {\n          width: 14px;\n          height: 14px;\n        }\n      }\n      \n      .redo-signature-btn {\n        background: rgba(239, 68, 68, 0.1);\n        border-color: #ef4444;\n        color: #ef4444;\n        \n        &:hover {\n          background: rgba(239, 68, 68, 0.2);\n        }\n      }\n    }\n  }\n  \n  .submit-btn {\n    width: calc(100% - #{$spacing-xl * 2});\n    margin: $spacing-xl;\n    background: linear-gradient(135deg, $bike-red 0%, $bike-red-light 100%);\n    color: white;\n    border: none;\n    border-radius: 50px;\n    padding: 18px 30px;\n    font-size: $font-size-lg;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    \n    &:hover {\n      transform: translateY(-2px);\n      box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n    }\n    \n    &:active {\n      transform: translateY(0);\n    }\n  }\n  \n  @media (max-width: 768px) {\n    .header {\n      padding: $spacing-md $spacing-lg;\n      \n      .form-title h1 {\n        font-size: $font-size-xl;\n      }\n    }\n    \n    .policy-summary, .agreement-section, .signature-section {\n      padding: $spacing-md $spacing-lg;\n    }\n    \n    .submit-btn {\n      width: calc(100% - #{$spacing-lg * 2});\n      margin: $spacing-lg;\n      padding: 15px 25px;\n      font-size: $font-size-base;\n    }\n  }\n</style>\n","<script>\n  export let size = 'large'; // 'small', 'medium', 'large'\n  export let message = ''; // Optional loading message\n  \n  const sizes = {\n    small: { spinner: '60px', logo: '30px' },\n    medium: { spinner: '100px', logo: '50px' },\n    large: { spinner: '150px', logo: '75px' }\n  };\n  \n  const currentSize = sizes[size] || sizes.large;\n</script>\n\n<div class=\"loader-container\">\n  <div class=\"spinner-wrapper\" style=\"width: {currentSize.spinner}; height: {currentSize.spinner};\">\n    <div class=\"spinner\"></div>\n    <img \n      src=\"/static/Bikeinsure-Loader.png\" \n      alt=\"BikeInsure\" \n      class=\"logo\"\n      style=\"width: {currentSize.logo}; height: {currentSize.logo};\"\n    />\n  </div>\n  {#if message}\n    <p class=\"loading-message\">{message}</p>\n  {/if}\n</div>\n\n<style>\n  .loader-container {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 20px;\n  }\n  \n  .spinner-wrapper {\n    position: relative;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  \n  .spinner {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    border: 4px solid rgba(46, 92, 138, 0.1);\n    border-top: 4px solid #2E5C8A;\n    border-radius: 50%;\n    animation: spin 1s linear infinite;\n  }\n  \n  .logo {\n    position: relative;\n    z-index: 1;\n    object-fit: contain;\n    animation: pulse 2s ease-in-out infinite;\n  }\n  \n  .loading-message {\n    font-size: 16px;\n    color: #2E5C8A;\n    font-weight: 500;\n    margin: 0;\n    text-align: center;\n  }\n  \n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n  \n  @keyframes pulse {\n    0%, 100% { opacity: 1; }\n    50% { opacity: 0.7; }\n  }\n</style>\n\n","<script>\n  import { onMount, onDestroy, getContext, tick, createEventDispatcher } from 'svelte';\n  import BikeInsureLoader from './components/BikeInsureLoader.svelte';\n  import HelpBlock from './components/HelpBlock.svelte';\n  import { PD_PAYMENT_FEE } from './v2/v2RateCalculator.js';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  const dispatch = createEventDispatcher();\n\n  const PAYMENT_FEE_TOTAL_CENTS = Math.round(PD_PAYMENT_FEE * 100);\n\n  let policyQuote = null; // Single quote for entire policy (declared before fee helpers use it)\n  let quotesLoading = false;\n  let quotesError = null;\n\n  /** Per-bike monthly shown in plan summary: pure GA base amount (no fee). */\n  function getPlanSummaryBikeDisplayMonthlyPremium(bikeIndex) {\n    const quotes = policyQuote?.bike_quotes;\n    if (!quotes?.[bikeIndex]) return 0;\n    return Number(quotes[bikeIndex].monthly_premium || 0);\n  }\n  \n  // DEV MODE: Accept prop to force payment complete state\n  export let devModePaymentComplete = false;\n  \n  // Access context values\n  $: stripe = ctx.stripe;\n  $: bikes = ctx.bikes;\n  /** Policy-level flags: show on every bike row in the Stripe plan summary. */\n  $: planSummaryMembershipDiscount = !!ctx.v2QuoteData?.hasAssociation;\n  $: planSummaryMultiBikeDiscount =\n    (policyQuote?.bike_quotes?.length ?? bikes?.length ?? 0) > 1;\n  /** V2: sum of per-bike base amounts + flat $2 fee; non-V2: API policy total. */\n  $: planSummaryDisplayedTotalMonthly =\n    policyQuote?.pricing?.monthly_premium == null\n      ? null\n      : ctx.v2QuoteData && policyQuote.bike_quotes?.length\n        ? policyQuote.bike_quotes.reduce(\n            (sum, _, i) => sum + getPlanSummaryBikeDisplayMonthlyPremium(i),\n            0,\n          ) + PD_PAYMENT_FEE\n        : Number(policyQuote.pricing.monthly_premium);\n  $: userInfo = ctx.userInfo;\n  $: policyUuid = ctx.policyUuid;\n  $: partnerSlug = ctx.partnerSlug;\n  $: API_BASE_URL = ctx.API_BASE_URL;\n  \n  /** Prefer GA's message when the API still returns a raw JSON blob. */\n  function formatQuoteError(raw) {\n    const text = String(raw || '').trim();\n    if (!text) return 'Failed to get policy quote';\n    const jsonStart = text.indexOf('{');\n    if (jsonStart !== -1) {\n      try {\n        const parsed = JSON.parse(text.slice(jsonStart));\n        const gaMessage = parsed?.errors?.[0]?.message;\n        if (gaMessage) return gaMessage;\n      } catch (_) {\n        /* keep original text */\n      }\n    }\n    return text.replace(/^Failed to get quote:\\s*/i, '');\n  }\n\n  $: isQuoteError = !!(error && (\n    /program code|quote request failed|does not exist for this client|EAPI/i.test(error)\n    || error.toLowerCase().includes('failed to get')\n  ));\n\n  function trackEvent(eventName, properties = {}) {\n    if (ctx.trackSmartlookEvent) {\n      ctx.trackSmartlookEvent(eventName, { ...properties, component: 'PaymentStep' });\n    }\n  }\n  \n  // Get thank you message from INITIAL_DATA\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const thankYouMessage = INITIAL_DATA.thankYouMessage || '<p>Your one-year policy enrollment application has been received.</p><p>We have set up your automatic monthly premium payments.</p><p>Qualifying coverage is effective immediately.</p><p>Your application and receipt have been sent to your email.</p><p>We are compiling your policy and will email it in the upcoming days.</p><p>Questions | <a href=\"mailto:Help@BikeInsure.com\">Help@BikeInsure.com</a></p>';\n  \n  let elements = null;\n  let paymentElement = null;\n  let paymentProcessing = false;\n  let paymentComplete = false;\n  let paymentError = null;\n  let paymentIntent = null;\n  let finalizingPolicy = false;\n  let loading = true;\n  let isReturningFromRedirect = false; // Track redirect return state\n  let error = null;\n  let clientSecret = null;\n  \n  \n  onMount(async () => {\n    const _mountId = Math.random().toString(36).slice(2, 8);\n    console.log(`🔧 PaymentStep MOUNTED (id=${_mountId})`);\n\n    // Detect Safari for debugging\n    const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n    console.log(`🌐 Browser: ${isSafari ? 'Safari' : 'Other'}`);\n    \n    // Check if we're returning from a redirect-based payment (Amazon Pay, etc.)\n    const urlParams = new URLSearchParams(window.location.search);\n    const paymentReturn = urlParams.get('payment_return');\n    \n    if (paymentReturn === 'true') {\n      console.log('🔄 Returning from redirect payment (Amazon Pay, etc.)');\n      console.log(`   Browser: ${isSafari ? '🦁 Safari' : '🌐 Other'}`);\n      trackEvent('PaymentRedirectReturn', { browser: isSafari ? 'Safari' : 'Other' });\n      loading = true;\n      isReturningFromRedirect = true;\n      \n      try {\n        // Stripe includes payment_intent and payment_intent_client_secret in URL after redirect\n        const paymentIntentId = urlParams.get('payment_intent');\n        const paymentIntentClientSecret = urlParams.get('payment_intent_client_secret');\n        \n        console.log('📋 URL Params:', {\n          paymentIntentId,\n          paymentIntentClientSecret: paymentIntentClientSecret ? 'present' : 'missing'\n        });\n        \n        if (!paymentIntentClientSecret) {\n          throw new Error('Missing payment intent client secret from redirect');\n        }\n        \n        // Initialize Stripe if not already done\n        if (!stripe) {\n          const stripeKey = window.STRIPE_PUBLIC_KEY;\n          stripe = window.Stripe(stripeKey);\n        }\n        \n        // Retrieve the PaymentIntent to check its status\n        console.log('🔍 Retrieving PaymentIntent status...');\n        const { paymentIntent: confirmedPI } = await stripe.retrievePaymentIntent(paymentIntentClientSecret);\n        \n        console.log('📊 PaymentIntent Status:', confirmedPI.status);\n        console.log('💳 Payment Method:', confirmedPI.payment_method);\n        \n        // Clean up URL (remove all payment-related params)\n        const cleanUrl = window.location.pathname;\n        window.history.replaceState({}, '', cleanUrl);\n        \n        // Check if payment succeeded\n        if (confirmedPI.status === 'succeeded') {\n          console.log('✅ Payment confirmed! Finalizing policy...');\n          trackEvent('PaymentRedirectConfirmed', { status: 'succeeded', payment_method_type: 'redirect' });\n          \n          // Finalize the policy with the payment method and PaymentIntent ID from the redirect\n          await finalizePolicy(confirmedPI.payment_method, confirmedPI.id);\n          \n          console.log('🎉 Policy bound successfully!');\n          \n          // Show thank you page\n          paymentComplete = true;\n          loading = false;\n          \n          // Scroll to top to show success message\n          window.scrollTo({ top: 0, behavior: 'smooth' });\n        } else if (confirmedPI.status === 'processing') {\n          trackEvent('PaymentRedirectProcessing', { status: 'processing' });\n          error = 'Your payment is still processing. Please wait a moment and refresh the page.';\n          loading = false;\n        } else if (confirmedPI.status === 'requires_payment_method') {\n          console.log('⚠️ Payment failed, showing error to user');\n          trackEvent('PaymentRedirectFailed', { status: 'requires_payment_method' });\n          error = 'Your payment was not completed. Please click \"Try Again\" below to select a different payment method.';\n          loading = false;\n          isReturningFromRedirect = false;\n          return;\n        } else if (confirmedPI.status === 'canceled' || confirmedPI.status === 'cancelled') {\n          console.log('⚠️ Payment was cancelled by user');\n          trackEvent('PaymentRedirectCancelled', { status: confirmedPI.status });\n          error = 'Payment was cancelled. Please click \"Try Again\" below to retry with a different payment method.';\n          loading = false;\n          isReturningFromRedirect = false;\n          return;\n        } else {\n          // Unexpected status\n          error = `Payment status: ${confirmedPI.status}. Please contact support if you need assistance.`;\n          loading = false;\n          return;\n        }\n        \n      } catch (err) {\n        console.error('❌ Error handling payment return:', err);\n        error = `Failed to process payment return: ${err.message}`;\n        loading = false;\n        return;\n      }\n      \n      // If we got here without returning, payment succeeded\n      return;\n    }\n    \n    // DEV MODE: Force payment complete if dev flag is set\n    if (devModePaymentComplete) {\n      paymentComplete = true;\n      loading = false;\n      dispatch('paymentComplete', { complete: true });\n      console.log('🔧 DEV MODE: Payment complete forced for development');\n      // Scroll to top to show thank you message\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n      return; // Skip normal initialization\n    }\n    \n    await initializePayment();\n    console.log('DEBUG: PaymentStep mounted', $userInfo);\n  });\n  \n  // Notify parent when payment completes\n  $: if (paymentComplete) {\n    dispatch('paymentComplete', { complete: true });\n  }\n  \n  onDestroy(() => {\n    cleanupStripeElements();\n  });\n  \n  async function initializePayment() {\n    loading = true;\n    error = null;\n    trackEvent('PaymentInitStarted', { bikes_count: ctx.bikes?.length || 0 });\n    \n    try {\n      // First save the policy\n      const saved = await savePolicy();\n      if (!saved) {\n        throw new Error('Failed to save policy');\n      }\n      \n      // Fetch quotes for all bikes\n      await fetchQuotesForBikes();\n      \n      // Create subscription and get client_secret\n      await createSubscription();\n      \n      // Initialize Stripe elements with client_secret\n      await initializeStripeElements();\n      \n    } catch (err) {\n      console.error('Error initializing payment:', err);\n      trackEvent('PaymentInitFailed', { error: err.message, is_validation: !!err.isValidationError });\n      error = err.message;\n      \n      // If it's a validation error, scroll to the error location\n      if (err.isValidationError && typeof err.bikeIndex === 'number') {\n        // Scroll to the bike with the validation error\n        setTimeout(() => {\n          scrollToBikeError(err.bikeIndex);\n        }, 100);\n      }\n    } finally {\n      loading = false;\n    }\n  }\n  \n  function scrollToBikeError(bikeIndex) {\n    // Try to find the bike section or form elements\n    const bikeSection = document.querySelector(`[data-bike-index=\"${bikeIndex}\"]`) ||\n                       document.querySelector('.bike-summary') ||\n                       document.querySelector('.order-summary');\n    \n    if (bikeSection) {\n      bikeSection.scrollIntoView({ \n        behavior: 'smooth', \n        block: 'center' \n      });\n      \n      // Add a visual highlight to draw attention\n      bikeSection.style.backgroundColor = '#ffebee';\n      bikeSection.style.border = '2px solid #f44336';\n      \n      // Remove highlight after 3 seconds\n      setTimeout(() => {\n        bikeSection.style.backgroundColor = '';\n        bikeSection.style.border = '';\n      }, 3000);\n    } else {\n      // Fallback: scroll to top of page\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    }\n  }\n  \n  async function createSubscription() {\n    if (window._biBindPolicyInFlight) {\n      console.warn('⚠️ bind_policy already in flight globally, skipping duplicate call');\n      return;\n    }\n    window._biBindPolicyInFlight = true;\n    try {\n      console.log('🔍 FRONTEND PaymentStep: Creating subscription for policy:', policyUuid);\n      console.log('🔍 FRONTEND PaymentStep: Current ctx.policy.user_info.email:', ctx.policy?.user_info?.email);\n      console.log('🔍 FRONTEND PaymentStep: Current ctx.policy.user.email (if exists):', ctx.policy?.user?.email);\n      console.log('🔍 FRONTEND PaymentStep: Current $userInfo.email:', $userInfo.email);\n      \n      // Call bind_policy endpoint to create customer and subscription\n      const bindResponse = await fetch(`${API_BASE_URL}payments/payments/bind_policy/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify({\n          policy_uuid: policyUuid\n          // Payment method will be attached automatically by Payment Element\n        })\n      });\n      \n      const bindData = await bindResponse.json();\n      \n      console.log('🔍 FRONTEND PaymentStep: bind_policy response:', bindData);\n      \n      if (!bindData.success) {\n        throw new Error(bindData.error || 'Failed to create subscription');\n      }\n      \n      if (!bindData.client_secret) {\n        throw new Error('No client_secret received from server');\n      }\n      \n      clientSecret = bindData.client_secret;\n      console.log('🔍 FRONTEND PaymentStep: Subscription created successfully, client_secret received');\n      \n    } catch (err) {\n      console.error('Error creating subscription:', err);\n      throw err;\n    } finally {\n      window._biBindPolicyInFlight = false;\n    }\n  }\n  \n  async function initializeStripeElements() {\n    if (!stripe) {\n      console.error('Stripe not loaded');\n      return;\n    }\n    \n    if (!clientSecret) {\n      console.error('No client_secret available');\n      return;\n    }\n    \n    try {\n      // Wait for DOM to be ready\n      await tick();\n      \n      // Create elements with client_secret (restored original theme)\n      elements = stripe.elements({\n        clientSecret: clientSecret,\n        appearance: {\n          theme: 'flat',\n          variables: {\n            colorPrimary: '#000000',\n            colorBackground: '#EEEEEE',\n            colorText: '#000000',\n            colorDanger: '#df1b41',\n            fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n            spacingUnit: '4px',\n            borderRadius: '15px',\n          },          \n        }\n      });\n      \n      \n      // Create Payment Element with all payment methods enabled\n      paymentElement = elements.create('payment', {\n        layout: 'accordion',\n        defaultValues: {\n          billingDetails: {\n            name: `${String($userInfo.firstName || '')} ${String($userInfo.lastName || '')}`.trim(),\n            email: $userInfo.email,\n            address: {\n              line1: $userInfo.address,\n              city: $userInfo.city,\n              state: $userInfo.state,\n              postal_code: $userInfo.zipCode,\n              country: 'US'\n            }\n          }\n        },\n        fields: {\n          billingDetails: {\n            name: 'auto',\n            email: 'auto',  // This will show Stripe Link option\n            address: {\n              line1: 'auto',\n              city: 'auto',\n              state: 'auto',\n              postalCode: 'auto',\n              country: 'auto'\n            }\n          }\n        },\n        wallets: {\n          applePay: 'auto',\n          googlePay: 'auto'\n        }\n      });\n      \n      // Wait a bit more to ensure DOM is fully rendered\n      await tick();\n      \n      // Mount the payment element\n      const paymentContainer = document.getElementById('payment-element');\n      if (paymentContainer) {\n        paymentElement.mount('#payment-element');\n        console.log('Stripe payment element mounted successfully');\n        trackEvent('PaymentFormReady', { method: 'stripe_payment_element' });\n      } else {\n        console.error('Payment element container not found');\n        // Try again after a short delay\n        setTimeout(async () => {\n          await tick();\n          const retryContainer = document.getElementById('payment-element');\n          if (retryContainer) {\n            paymentElement.mount('#payment-element');\n            console.log('Stripe payment element mounted successfully on retry');\n            mountExpressCheckout();\n          } else {\n            console.error('Payment element container still not found after retry');\n          }\n        }, 100);\n      }    \n            \n    } catch (error) {\n      console.error('Error initializing Stripe elements:', error);\n    }\n  }\n\n  async function mountExpressCheckout() {\n      console.log('🚀 Initializing Express Checkout...');\n      console.log('   - Elements object:', elements ? 'EXISTS' : 'MISSING');\n      console.log('   - Client Secret:', clientSecret ? `${clientSecret.substring(0, 20)}...` : 'MISSING');\n      \n      // Build line items from bike quotes\n      const lineItems = [];\n      if (policyQuote && policyQuote.bike_quotes) {\n        policyQuote.bike_quotes.forEach((bikeQuote, index) => {\n          const bikeName = getBikeMakeModelYear(index);\n          const coverageType = bikeQuote.coverage_type === 'theft_protect' ? 'Bike Coverage + Theft' : 'Bike Coverage Only';\n          const baseCents = Math.round(Number(bikeQuote.monthly_premium || 0) * 100);\n          lineItems.push({\n            name: `${bikeName} - ${coverageType}`,\n            amount: baseCents,\n          });\n        });\n        if (ctx.v2QuoteData) {\n          lineItems.push({\n            name: 'Installment Processing',\n            amount: PAYMENT_FEE_TOTAL_CENTS,\n          });\n        }\n      }\n      \n      console.log('📋 Express Checkout Line Items:', lineItems);\n      \n      const expressCheckoutElement = elements.create('expressCheckout', {\n        buttonHeight: 48,\n        buttonTheme: {\n          applePay: 'black',\n          googlePay: 'black',\n          amazonPay: 'black',\n        },\n        layout: {\n          maxColumns: 2,\n          maxRows: 1,\n          overflow: 'auto',\n        },\n        // Add line items for Amazon Pay and other wallets\n        lineItems: lineItems,\n        // Add billing details for Apple Pay (Apple Pay requires complete info)\n        billingDetails: {\n          name: `${String($userInfo.firstName || '')} ${String($userInfo.lastName || '')}`.trim(),\n          email: $userInfo.email,\n          address: {\n            line1: $userInfo.address || '',\n            city: $userInfo.city || '',\n            state: $userInfo.state || '',\n            postal_code: $userInfo.zipCode || '',\n            country: 'US'\n          }\n        },\n      });\n      \n      // Set up onClick handler - required for express checkout to work properly\n      expressCheckoutElement.on('click', (event) => {\n        const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n        console.log('🖱️  Express checkout button clicked');\n        trackEvent('ExpressCheckoutClicked', { browser: isSafari ? 'Safari' : 'Other' });\n        event.resolve();\n      });\n        \n      console.log('✅ Express Checkout Element created');\n      \n      // Wait for DOM\n      await tick();\n      await tick();\n      await new Promise(resolve => setTimeout(resolve, 300));\n        \n      // Mount it\n      const expressContainer = document.getElementById('express-checkout-element');\n      if (expressContainer) {\n        console.log('📍 Mounting Express Checkout Element...');\n        expressCheckoutElement.mount('#express-checkout-element');\n        console.log('✅ Express Checkout mounted successfully!');\n      } else {\n        console.error('❌ Express checkout container not found');\n      }\n      \n      expressCheckoutElement.on('ready', (event) => {\n        console.log('🎯 Express Checkout ready event:', event);\n        if (event.availablePaymentMethods) {\n          const available = Object.keys(event.availablePaymentMethods).filter(k => event.availablePaymentMethods[k]);\n          trackEvent('ExpressCheckoutReady', { available_methods: available.join(','), count: available.length });\n        } else {\n          trackEvent('ExpressCheckoutNoMethods', {});\n          const container = document.querySelector('.express-checkout-container');\n          if (container) {\n            container.style.display = 'none';\n          }\n        }\n      });\n      \n      expressCheckoutElement.on('cancel', (event) => {\n        console.log('🚫 Express payment cancelled by user:', event);\n        trackEvent('ExpressCheckoutCancelled', {});\n        paymentProcessing = false;\n        finalizingPolicy = false;\n      });\n      \n      // Listen for loaderror event (if element fails to load)\n      expressCheckoutElement.on('loaderror', (event) => {\n        console.error('❌ Express checkout load error:', event);\n        paymentError = 'Failed to load payment method';\n      });\n        \n      // Handle payment - Express Checkout handles confirmation automatically\n      expressCheckoutElement.on('confirm', async (event) => {\n        if (paymentProcessing) return;\n        \n        console.log('🎯 Express payment confirm event triggered');\n        console.log('📊 Event data:', event);\n        trackEvent('ExpressCheckoutConfirmStarted', {});\n        paymentProcessing = true;\n        paymentError = null;\n        \n        try {\n          // Detect Safari\n          const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n          console.log(`🌐 Browser detected: ${isSafari ? '🦁 Safari' : '🌐 Other'}`);\n          \n          // For express checkout, we need to manually confirm the payment\n          console.log('📝 Confirming payment with Stripe...');\n          console.log('   - Client Secret:', clientSecret ? `${clientSecret.substring(0, 20)}...` : 'MISSING');\n          \n          // Build return URL with payment_return param for redirect-based payments\n          const currentUrl = new URL(window.location.href);\n          currentUrl.searchParams.set('payment_return', 'true');\n          const returnUrl = currentUrl.toString();          \n         \n          \n          const { error: confirmError, paymentIntent: confirmedPI } = await stripe.confirmPayment({\n            elements,\n            clientSecret: clientSecret,\n            confirmParams: {\n              return_url: returnUrl, // Include payment_return param for redirect detection\n            },\n            redirect: \"if_required\", // Safari uses 'always', others use 'if_required'\n          });\n          \n          console.log(`   - stripe.confirmPayment() completed ${isSafari ? '(should have redirected)' : ''}`);\n          \n          if (confirmError) {\n            console.error('❌ Payment confirmation failed:', confirmError);\n            trackEvent('ExpressPaymentFailed', { error_type: confirmError.type, error_code: confirmError.code, error: confirmError.message });\n            paymentError = confirmError.message;\n            paymentProcessing = false;\n            finalizingPolicy = false;\n            return;\n          }\n          \n          console.log('✅ Payment confirmed successfully!');\n          paymentIntent = confirmedPI;\n          \n          // Check if payment succeeded\n          if (paymentIntent.status === 'succeeded') {\n            trackEvent('ExpressPaymentSucceeded', { payment_method_type: 'express' });\n            \n            await finalizePolicy(paymentIntent.payment_method);\n            \n            console.log('🎉 Express payment complete!');\n          } else {\n            console.error('❌ Unexpected payment status:', paymentIntent.status);\n            trackEvent('ExpressPaymentUnexpectedStatus', { status: paymentIntent.status });\n            paymentError = `Payment status: ${paymentIntent.status}`;\n            paymentProcessing = false;\n            finalizingPolicy = false;\n            throw new Error(`Payment status: ${paymentIntent.status}`);\n          }\n          \n        } catch (error) {\n          console.error('❌ Express payment error:', error);\n          trackEvent('ExpressPaymentError', { error: error.message });\n          \n          if (paymentIntent && paymentIntent.status === 'succeeded') {\n            alert(\n              'Your payment was processed successfully! We are finishing setting up your policy — ' +\n              'you will receive a confirmation email shortly. Please do NOT submit another payment.'\n            );\n            paymentComplete = true;\n          } else {\n            paymentError = error.message || 'Express payment failed';\n          }\n          paymentProcessing = false;\n          finalizingPolicy = false;\n        }\n      });\n  }\n  \n  function cleanupStripeElements() {\n    if (paymentElement) {\n      paymentElement.unmount();\n      paymentElement.destroy();\n      paymentElement = null;\n    }\n    if (elements) {\n      elements = null;\n    }\n  }\n  \n  async function fetchQuotesForBikes() {\n    quotesLoading = true;\n    quotesError = null;\n    policyQuote = null;\n    \n    try {\n      // Always read directly from context to get latest bike data\n      console.log(`🔍 FRONTEND: Raw bike data from ctx.bikes (what will be sent):`, JSON.parse(JSON.stringify(ctx.bikes)));\n      \n      const bikesData = ctx.bikes.map((bike, index) => {\n        console.log(`🔍 FRONTEND: Processing bike ${index} from ctx.bikes:`, bike);\n        \n        // Determine coverage type directly from bike data (source of truth)\n        let coverageType = 'basic';\n        \n        // Check theft protection question in bike answers\n        const possibleTheftSlugs = ['bikeinsure-plan-options', 'theft-protection', 'would-you-like-to-add-theft', 'add-theft', 'theft'];\n        let theftProtection = null;\n        let foundSlug = null;\n        \n        for (const slug of possibleTheftSlugs) {\n          if (bike[slug]) {\n            theftProtection = bike[slug]?.text_answer;\n            foundSlug = slug;\n            break;\n          }\n        }\n        \n        console.log(`🔍 FRONTEND: Theft protection check for bike ${index}:`, {\n          foundSlug,\n          theftProtection,\n          value: theftProtection,\n          type: typeof theftProtection\n        });\n        \n        if (theftProtection === 'true' || theftProtection === true) {\n          coverageType = 'theft_protect';\n        }\n        \n        console.log(`🔍 FRONTEND: Final coverage type for bike ${index}:`, coverageType);\n        \n        // Get bike usage - need to look up the choice text from questions\n        let bikeUsage = '';\n        if (bike['bike-usage']?.choice) {\n          const usageQuestion = ctx.questions.find(q => q.slug === 'bike-usage');\n          if (usageQuestion && usageQuestion.choices) {\n            const selectedChoice = usageQuestion.choices.find(c => String(c.id) === String(bike['bike-usage'].choice));\n            bikeUsage = selectedChoice?.answer || '';\n          }\n        }\n        \n        const bikeData = {\n          make: String(bike['bike-manufacturer']?.text_answer || '').trim(),\n          model: String(bike['bike-model']?.text_answer || '').trim(),\n          year: parseInt(bike['bike-model-year']?.text_answer) || new Date().getFullYear(),\n          value: parseFloat(bike['bike-purchase-price']?.text_answer) || 0,\n          serial_number: String(bike['bike-serial-number']?.text_answer || '').trim(),\n          bike_type: bikeUsage // Changed from 'usage' to 'bike_type' to match backend\n        };\n        \n        // Prepare question responses for this bike\n        const questionResponses = {};\n        Object.keys(bike).forEach(questionSlug => {\n          const answer = bike[questionSlug];\n          if (answer && (answer.text_answer || answer.choice || (answer.items && answer.items.length > 0))) {\n            // For list-type questions (like accessories), convert items array to comma-separated string\n            let textAnswer = answer.text_answer;\n            if (answer.items && Array.isArray(answer.items) && answer.items.length > 0) {\n              textAnswer = answer.items.join(', ');\n            }\n            \n            questionResponses[questionSlug] = {\n              text_answer: textAnswer || '',\n              choice: answer.choice,\n              other: answer.other\n            };\n          }\n        });\n        \n        console.log(`🔍 FRONTEND: Extracted bikeData for bike ${index}:`, bikeData);\n        console.log(`🔍 FRONTEND: Question responses for bike ${index}:`, questionResponses);\n        \n        return {\n          bike_data: bikeData,\n          coverage_type: coverageType,\n          question_responses: questionResponses\n        };\n      });\n      \n      // Prepare user location\n      const userLocation = {\n        address: $userInfo.address || '',\n        city: $userInfo.city || '',\n        state: $userInfo.state || '',\n        zip_code: $userInfo.zipCode || '',\n        country: 'US'\n      };\n      \n      // Prepare customer info for QA quote\n      const customerInfo = {\n        first_name: $userInfo.firstName || '',\n        last_name: $userInfo.lastName || '',\n        email: $userInfo.email || '',\n        phone: $userInfo.phone || ''\n      };\n      \n      console.log(`🔍 FRONTEND: Fetching policy quote for ${ctx.bikes.length} bikes`);\n      console.log(`🔍 FRONTEND: Customer info for quote:`, customerInfo);\n      \n      const payload = {\n        partner_slug: partnerSlug,\n        bikes: bikesData,\n        user_location: userLocation,\n        customer_info: customerInfo,\n        policy_uuid: ctx.policyUuid,\n        has_association: ctx.v2QuoteData?.hasAssociation || false,\n      };\n      \n      console.log(`🔍 FRONTEND: Sending quote request payload:`, JSON.parse(JSON.stringify(payload)));\n      \n      // Single API call for all bikes\n      const response = await fetch(`${API_BASE_URL}partners/quote/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify(payload)\n      });\n      \n      if (!response.ok) {\n        const errorData = await response.json();\n        throw new Error(formatQuoteError(errorData.error || 'Failed to get policy quote'));\n      }\n      \n      const result = await response.json();\n      if (!result.success) {\n        throw new Error(formatQuoteError(result.error || 'Policy quote failed'));\n      }\n      \n      policyQuote = result.quote;\n      trackEvent('QuoteReceived', { monthly_premium: policyQuote?.pricing?.monthly_premium || 0, bikes_count: policyQuote?.bike_quotes?.length || 0 });\n      console.log(`🔍 FRONTEND: Policy quote received:`, policyQuote);\n      console.log(`🔍   Total monthly premium: $${policyQuote.pricing.monthly_premium} ⭐⭐⭐`);\n      \n      // Log each bike quote for debugging\n      if (policyQuote.bike_quotes) {\n        policyQuote.bike_quotes.forEach((bikeQuote, index) => {\n          console.log(`🔍   Bike ${index + 1}: ${bikeQuote.coverage_type} = $${bikeQuote.monthly_premium}/mo`);\n        });\n      }\n      \n    } catch (err) {\n      console.error('Error fetching policy quote:', err);\n      quotesError = err.message;\n      throw err; // Re-throw to be caught by initializePayment\n    } finally {\n      quotesLoading = false;\n    }\n  }\n  \n  function calculateTotalAmount() {\n    // Calculate total amount in cents from single policy quote\n    if (policyQuote && policyQuote.pricing && policyQuote.pricing.monthly_premium) {\n      return Math.round(policyQuote.pricing.monthly_premium * 100);\n    }\n    return 0;\n  }\n  \n  function getBikePriceDisplay(bikeIndex) {\n    // Use real price from Greater American API quote response\n    if (policyQuote && policyQuote.bike_quotes && policyQuote.bike_quotes[bikeIndex]) {\n      const bikeQuote = policyQuote.bike_quotes[bikeIndex];\n      console.log(`🔍 FRONTEND: Bike price for bike ${bikeIndex}:`, bikeQuote);\n      if (bikeQuote.monthly_premium) {\n        return `$${bikeQuote.monthly_premium.toFixed(2)}/mo`;\n      }\n    }\n    \n    // If quote not available yet\n    console.warn(`Price not available from API for bike ${bikeIndex}`);\n    return '$0.00/mo';\n  }\n  \n  function getBikeUsageType(bikeIndex) {\n    // Check actual bike-usage answer first — it reflects any changes the user\n    // made on the bike details page, which may differ from the initial v2QuoteData.\n    const bike = ctx.bikes[bikeIndex];\n    if (bike?.['bike-usage']?.choice) {\n      const usageQuestion = ctx.questions.find(q => q.slug === 'bike-usage');\n      if (usageQuestion?.choices) {\n        const selected = usageQuestion.choices.find(c => String(c.id) === String(bike['bike-usage'].choice));\n        const answer = (selected?.answer || '').toLowerCase();\n        if (answer.includes('competitive') || answer.includes('race')) return 'competitive';\n        if (answer.includes('electric') || answer.includes('ebike') || answer.includes('e-bike')) return 'ebike';\n        if (answer) return 'casual';\n      }\n    }\n    // Fall back to v2QuoteData only if no bike-usage answer exists yet\n    if (ctx.v2QuoteData?.bikes?.[bikeIndex]?.usageType) {\n      return ctx.v2QuoteData.bikes[bikeIndex].usageType;\n    }\n    return 'casual';\n  }\n\n  const PRODUCT_NAMES = {\n    casual: 'BikeInsure (Casual)',\n    competitive: 'Bike Race Insure (Competitive)',\n    ebike: 'Bike E-Insure (E-Bike)',\n  };\n\n  function getBikeProductName(bikeIndex) {\n    return PRODUCT_NAMES[getBikeUsageType(bikeIndex)] || 'BikeInsure';\n  }\n\n  function getBikeCoveragePlan(bikeIndex) {\n    if (policyQuote && policyQuote.bike_quotes && policyQuote.bike_quotes[bikeIndex]) {\n      const bikeQuote = policyQuote.bike_quotes[bikeIndex];\n      return bikeQuote.coverage_type === 'theft_protect' ? 'Bike Coverage + Theft' : 'Bike Coverage Only';\n    }\n    const bike = ctx.bikes[bikeIndex];\n    const theftProtection = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n    return (theftProtection === 'true' || theftProtection === true) ? 'Bike Coverage + Theft' : 'Bike Coverage Only';\n  }\n  \n  function getBikeMakeModelYear(bikeIndex) {\n    const bike = ctx.bikes[bikeIndex];\n    const make = String(bike['bike-manufacturer']?.text_answer || '');\n    const model = String(bike['bike-model']?.text_answer || '');\n    const year = String(bike['bike-model-year']?.text_answer || '');\n    \n    // Build array of non-empty parts and join with bullet separator\n    const parts = [year, make, model].filter(part => part && part.trim());\n    return \"Bike # \" + (bikeIndex + 1) + \" | \" + parts.join(' • ');\n  }\n  \n  function getBikeMonthlyPrice(bikeIndex) {\n    // Use real price from Greater American API quote response\n    if (policyQuote && policyQuote.bike_quotes && policyQuote.bike_quotes[bikeIndex]) {\n      const bikeQuote = policyQuote.bike_quotes[bikeIndex];\n      if (bikeQuote.monthly_premium) {\n        return bikeQuote.monthly_premium.toFixed(2);\n      }\n    }\n    \n    // If we don't have the quote yet, show loading or warning\n    console.warn(`Price not available from API for bike ${bikeIndex}`);\n    return '0.00';\n  }\n  \n  async function processPayment() {\n    if (paymentProcessing) return;\n    \n    if (!stripe || !paymentElement) {\n      alert('Payment system not ready. Please try again.');\n      return;\n    }\n    \n    paymentProcessing = true;\n    trackEvent('CompletePaymentClicked', { bikes_count: ctx.bikes?.length || 0 });\n    \n    try {\n      // First check if payment has already succeeded\n      const { paymentIntent: existingPaymentIntent } = await stripe.retrievePaymentIntent(clientSecret);\n      \n      if (existingPaymentIntent.status === 'succeeded') {\n        console.log('Payment has already succeeded');\n        trackEvent('PaymentAlreadySucceeded', {});\n        paymentIntent = existingPaymentIntent;\n      } else {\n        console.log('Payment not yet succeeded, confirming payment');\n        trackEvent('PaymentConfirmStarted', {});\n        \n        // Submit the payment form\n        const { error: submitError } = await elements.submit();\n        \n        if (submitError) {\n          console.error('Payment form submission error:', submitError);\n          trackEvent('PaymentFormSubmitError', { error: submitError.message, error_type: submitError.type });\n          alert(`Payment form submission failed: ${submitError.message}`);\n          return;\n        }\n        \n        console.log('Payment form submitted successfully');\n        trackEvent('PaymentFormSubmitted', {});\n        \n        // Detect Safari\n        const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n        console.log(`🌐 Browser detected: ${isSafari ? '🦁 Safari' : '🌐 Other'}`);\n        \n        // Build return URL with payment_return param for redirect-based payments\n        const currentUrl = new URL(window.location.href);\n        currentUrl.searchParams.set('payment_return', 'true');\n        const returnUrl = currentUrl.toString();        \n        \n        // Confirm the payment\n        const { error: confirmError } = await stripe.confirmPayment({\n          elements,\n          clientSecret: clientSecret,\n          confirmParams: {\n            return_url: returnUrl, // Include payment_return param for redirect detection\n          },\n          redirect: \"if_required\", // Safari uses 'always', others use 'if_required'\n        });\n        \n        if (confirmError) {\n          console.error('Payment confirmation error:', confirmError);\n          trackEvent('PaymentConfirmFailed', { error_type: confirmError.type, error: confirmError.message });\n          if (confirmError.type === 'card_error' || confirmError.type === 'validation_error') {\n            alert(`Payment failed: ${confirmError.message}`);\n          } else {\n            alert('An unexpected error occurred during payment confirmation.');\n          }\n          return;\n        }\n        \n        // Get the updated payment intent after confirmation\n        const { paymentIntent: confirmedPaymentIntent } = await stripe.retrievePaymentIntent(clientSecret);\n        paymentIntent = confirmedPaymentIntent;\n        \n        console.log('Payment confirmed successfully');\n        trackEvent('PaymentConfirmSucceeded', { payment_method_type: 'card' });\n        try {\n          klaviyo.identify({\n            '$email': $userInfo.email,\n            '$firstname': `${$userInfo.firstName} ${$userInfo.lastName}`.trim() || 'Unknown',\n            'state':'bound'\n          });\n        } catch (error) {\n          console.error('Error identifying user in Klaviyo:', error);\n        }\n        \n      }\n      \n      // At this point, payment is successful - now finalize the policy\n      if (paymentIntent.status === 'succeeded') {\n        await finalizePolicy(paymentIntent.payment_method);\n      } else {\n        throw new Error(`Unexpected payment status: ${paymentIntent.status}`);\n      }\n      \n    } catch (error) {\n      console.error('Payment processing error:', error);\n      trackEvent('PaymentProcessingError', { error: error.message });\n      if (paymentIntent && paymentIntent.status === 'succeeded') {\n        alert(\n          'Your payment was processed successfully! We are finishing setting up your policy — ' +\n          'you will receive a confirmation email shortly. Please do NOT submit another payment.'\n        );\n        paymentComplete = true;\n      } else {\n        alert('Payment processing failed. Please try again.');\n      }\n    } finally {\n      paymentProcessing = false;\n    }\n  }\n  \n  async function finalizePolicy(paymentMethodId, paymentIntentId = null) {\n    finalizingPolicy = true;\n    trackEvent('PolicyFinalizeStarted', {\n      payment_method_id: paymentMethodId,\n      payment_intent_id: paymentIntentId\n    });\n    try {\n      console.log('🔧 Finalizing policy binding after successful payment');\n      console.log('   - Payment Method ID:', paymentMethodId);\n      console.log('   - Client Secret:', clientSecret ? `${clientSecret.substring(0, 20)}...` : 'MISSING');\n      \n      // Get the PaymentIntent ID - either from parameter or from client secret\n      let piId = paymentIntentId;\n      if (!piId && clientSecret) {\n        piId = clientSecret.split('_secret_')[0];\n      }\n      \n      console.log('   - Payment Intent ID:', piId);\n      console.log('   - Policy UUID:', policyUuid);\n      \n      // Call bind_policy with finalize_only=true to complete the binding\n      console.log('📡 Calling bind_policy API...');\n      const finalizeResponse = await fetch(`${API_BASE_URL}payments/payments/bind_policy/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify({\n          policy_uuid: policyUuid,\n          payment_method_id: paymentMethodId,\n          payment_intent_id: piId,\n          finalize_only: true\n        })\n      });\n      \n      console.log('📡 API Response Status:', finalizeResponse.status);\n      \n      if (!finalizeResponse.ok) {\n        const errorText = await finalizeResponse.text();\n        console.error('❌ API Error Response:', errorText);\n        throw new Error(`HTTP ${finalizeResponse.status}: ${errorText}`);\n      }\n      \n      const finalizeData = await finalizeResponse.json();\n      console.log('📦 API Response Data:', finalizeData);\n      \n      if (!finalizeData.success) {\n        console.error('❌ API returned success=false:', finalizeData.error);\n        throw new Error(finalizeData.error || 'Failed to finalize policy binding after payment');\n      }\n      \n      console.log('✅ Policy finalized successfully');\n      console.log('   - Policy data:', finalizeData.policy);\n      \n      // Update the policy context with the returned policy data\n      if (finalizeData.policy) {\n        ctx.policy = finalizeData.policy;\n        console.log('✅ Policy context updated');\n      }\n      \n      paymentComplete = true;\n      trackEvent('PolicyFinalizeSucceeded', { policy_number: ctx.policy?.policy_number || 'pending' });\n      \n      window.scrollTo({ top: 0, behavior: 'smooth' });\n      \n    } catch (error) {\n      console.error('❌ Policy finalization error:', error);\n      trackEvent('PolicyFinalizeFailed', { error: error.message });\n      alert(\n        'Your payment was processed successfully! We are finishing setting up your policy — ' +\n        'you will receive a confirmation email shortly. Please do NOT submit another payment.'\n      );\n      paymentComplete = true;\n    } finally {\n      finalizingPolicy = false;\n    }\n  }\n  \n  async function savePolicy() {\n    try {\n      // Always read directly from context to get latest bike data AND user info\n      console.log('🔍 FRONTEND PaymentStep: Saving policy with bikes from context:', ctx.bikes.length, 'bikes');\n      console.log('🔍 FRONTEND PaymentStep: Saving policy with user info email:', $userInfo.email);\n      console.log('🔍 FRONTEND PaymentStep: Current policy.user email (if linked):', ctx.policy?.user?.email);\n      console.log('🔍 FRONTEND PaymentStep: Current policy.user_info email (JSON field):', ctx.policy?.user_info?.email);\n      \n      const response = await fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/${policyUuid}/`, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify({\n          answers: { bikes: ctx.bikes }\n        })\n      });\n      \n      if (response.ok) {\n        // Update ctx.policy with the server response to keep them in sync\n        const updatedPolicy = await response.json();\n        ctx.policy = updatedPolicy;\n        console.log('🔍 FRONTEND PaymentStep: Policy saved successfully');\n        console.log('🔍 FRONTEND PaymentStep: Updated policy.user_info.email:', updatedPolicy.user_info?.email);\n        console.log('🔍 FRONTEND PaymentStep: Updated policy.user.email (if linked):', updatedPolicy.user?.email);\n        return true;\n      }\n      \n      return false;\n    } catch (error) {\n      console.error('Error saving policy:', error);\n      return false;\n    }\n  }\n\n  // Account setup functions\n  let accountCreated = false;\n  let accountAlreadyExists = false;\n  let accountSetupLoading = false;\n  let accountPassword = '';\n  let confirmPassword = '';\n  let passwordError = '';\n  let confirmPasswordError = '';\n  let showPassword = false;\n  let showConfirmPassword = false;\n  let passwordInput;\n  let confirmPasswordInput;\n  \n  function togglePasswordVisibility() {\n    showPassword = !showPassword;\n    if (passwordInput) {\n      passwordInput.type = showPassword ? 'text' : 'password';\n    }\n  }\n  \n  function toggleConfirmPasswordVisibility() {\n    showConfirmPassword = !showConfirmPassword;\n    if (confirmPasswordInput) {\n      confirmPasswordInput.type = showConfirmPassword ? 'text' : 'password';\n    }\n  }\n\n  function validatePasswords() {\n    passwordError = '';\n    confirmPasswordError = '';\n    \n    if (accountPassword.length < 8) {\n      passwordError = 'Password must be at least 8 characters long';\n      return false;\n    }\n    \n    if (accountPassword !== confirmPassword) {\n      confirmPasswordError = 'Passwords do not match';\n      return false;\n    }\n    \n    return true;\n  }\n\n  async function createAccountDirectly() {\n    if (!validatePasswords()) {\n      return;\n    }\n    \n    // Use the updated policy data if available (after payment), otherwise fall back to userInfo store\n    const userId = (paymentComplete && ctx.policy?.user?.id) || $userInfo.id;\n    if (!userId) {\n      alert('User information not available. Please contact support.');\n      return;\n    }\n    \n    accountSetupLoading = true;\n    \n    try {\n       const response = await fetch(`${API_BASE_URL}users/create-account/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken()\n        },\n        body: JSON.stringify({\n          user_id: userId,\n          password: accountPassword,\n          confirm_password: confirmPassword\n        })\n      });\n      \n      const data = await response.json();\n      \n      if (data.success) {\n        accountCreated = true;\n        accountAlreadyExists = false;\n        // Clear password fields for security\n        accountPassword = '';\n        confirmPassword = '';\n      } else {\n        if (data.error.includes('User already has an account set up.')) {\n          accountCreated = true;\n          accountAlreadyExists = true;\n          // Clear password fields for security\n          accountPassword = '';\n          confirmPassword = '';\n        }\n        if (data.error.includes('Password must be')) {\n          passwordError = data.error;\n        } else if (data.error.includes('Passwords do not match')) {\n          confirmPasswordError = data.error;\n        } else if (!data.error.includes('User already has an account set up.')) {\n          // Only show alert if it's not the \"account already exists\" error (which we handle gracefully)\n          alert('Failed to create account: ' + (data.error || 'Unknown error'));\n        }\n      }\n    } catch (error) {\n      console.error('Error creating account:', error);\n      alert('Failed to create account. Please try again.');\n    } finally {\n      accountSetupLoading = false;\n    }\n  }\n</script>\n\n<div class=\"step-content\">\n  {#if loading}\n    <div class=\"loading-container\">\n      <BikeInsureLoader \n        size=\"large\" \n        message={isReturningFromRedirect ? \"Processing your payment...\" : \"Setting up your payment, may take a moment...\"} \n      />\n    </div>\n  {:else if error}\n    <div class=\"error-message\">\n      <h2>❌ {error.includes('required') || error.includes('Invalid') ? 'Form Validation Error' : isQuoteError ? 'Quote Error' : 'Payment Setup Error'}</h2>\n      <p>{error}</p>\n      {#if error.includes('required') || error.includes('Invalid')}\n        <p class=\"validation-help\">\n          <strong>Please go back to the previous step and complete all required bike information.</strong>\n        </p>\n        <button class=\"btn btn-secondary\" on:click={() => window.history.back()}>\n          ← Go Back to Fix\n        </button>\n      {/if}\n      <button class=\"btn btn-primary\" on:click={initializePayment}>\n        Try Again\n      </button>\n    </div>\n  {:else if paymentComplete}\n    <div class=\"success-message\">\n      <div class=\"success-content\">\n        <!-- Round Logo -->\n        <div class=\"success-logo\">\n          <img src=\"/static/Bikeinsure-Checkout-Logo.png\" alt=\"BikeInsure Logo\" />\n        </div>\n        \n        <h1 class=\"success-title\">Thank You!</h1>\n        \n        <div class=\"success-text\">\n          {@html thankYouMessage}\n        </div>\n      </div>\n      \n      <!-- Account Creation Section -->\n      {#if ctx.policy?.user_has_account}\n        <!-- User already has an account -->\n        <div class=\"account-section\">\n          <div class=\"account-card\">\n            <h4>🔐 You Already Have an Account</h4>\n            <p>Your BikeInsure account with email <strong>{ctx.policy?.user_email || $userInfo.email}</strong> is ready!</p>\n            <p>Log in to your dashboard to view your new policy and manage all your coverage in one place.</p>\n            <div class=\"account-actions\">\n              <a href=\"/account/login/\" class=\"btn btn-dashboard\">\n                Log In to Dashboard\n              </a>\n            </div>\n          </div>\n        </div>\n      {:else if !accountCreated}\n        <!-- Account creation form -->\n        <div class=\"account-section\">\n          <div class=\"account-card\">\n            <h3 class=\"account-title\">Setup Your BikeInsure Account</h3>\n            <p class=\"account-subtitle\">Access and Manage Your Bike Insurance Needs:</p>\n            <ul class=\"account-benefits\">\n              <li><span class=\"checkmark\">✓</span> View Policy</li>\n              <li><span class=\"checkmark\">✓</span> Update Address</li>\n              <li><span class=\"checkmark\">✓</span> Manage Bikes</li>\n              <li><span class=\"checkmark\">✓</span> Update Accessories</li>\n              <li><span class=\"checkmark\">✓</span> Change Credit Card</li>\n              <li><span class=\"checkmark\">✓</span> Request Cancellation</li>\n              <li><span class=\"checkmark\">✓</span> File a Claim</li>\n            </ul>\n            \n            <div class=\"email-info\">\n              <p class=\"email-label\">Your sign-up email is your Login ID:</p>\n              <p class=\"email-value\">{(paymentComplete && ctx.policy?.user?.email) || $userInfo.email}</p>\n            </div>\n            \n            <div class=\"password-setup\">\n              <div class=\"form-group\">\n                <label for=\"password\">Create Password</label>\n                <div class=\"password-input-wrapper\">\n                  <input \n                    bind:this={passwordInput}\n                    type=\"password\"\n                    id=\"password\" \n                    bind:value={accountPassword}\n                    placeholder=\"Enter a secure password\"\n                    class:error={passwordError}\n                    disabled={accountSetupLoading}\n                  />\n                  <button \n                    type=\"button\"\n                    class=\"password-toggle\"\n                    on:click={togglePasswordVisibility}\n                    tabindex=\"-1\"\n                  >\n                    <i class=\"fa {showPassword ? 'fa-eye-slash' : 'fa-eye'}\"></i>\n                  </button>\n                </div>\n\n                <div style=\"font-size:12px; color: gray; margin-top: 5px;\">(min 8 characters)</div>\n                {#if passwordError}\n                  <span class=\"error-text\">{passwordError}</span>\n                {/if}\n              </div>\n              \n              <div class=\"form-group\">\n                <label for=\"confirmPassword\">Confirm Password</label>\n                <div class=\"password-input-wrapper\">\n                  <input \n                    bind:this={confirmPasswordInput}\n                    type=\"password\"\n                    id=\"confirmPassword\" \n                    bind:value={confirmPassword}\n                    placeholder=\"Confirm your password\"\n                    class:error={confirmPasswordError}\n                    disabled={accountSetupLoading}\n                  />\n                  <button \n                    type=\"button\"\n                    class=\"password-toggle\"\n                    on:click={toggleConfirmPasswordVisibility}\n                    tabindex=\"-1\"\n                  >\n                    <i class=\"fa {showConfirmPassword ? 'fa-eye-slash' : 'fa-eye'}\"></i>\n                  </button>\n                </div>\n                {#if confirmPasswordError}\n                  <span class=\"error-text\">{confirmPasswordError}</span>\n                {/if}\n              </div>\n            </div>\n            \n            <div class=\"account-actions\">\n              <button \n                class=\"btn btn-setup\" \n                on:click={createAccountDirectly}\n                disabled={accountSetupLoading || !accountPassword || !confirmPassword}\n              >\n                {#if accountSetupLoading}\n                  <div class=\"loading-spinner\"></div>\n                  Creating Account...\n                {:else}\n                  Create My Account\n                {/if}\n              </button>\n            </div>\n          </div>\n        </div>\n      {:else}\n        <!-- Account created successfully -->\n        <div class=\"account-section\">\n          <div class=\"account-card\">\n            {#if accountAlreadyExists}\n              <h4>🔐 Account Already Exists</h4>\n              <p>You already have a BikeInsure account with email: <strong>{(paymentComplete && ctx.policy?.user?.email) || $userInfo.email}</strong></p>\n              <p>Please log in to your dashboard to view your new policy and manage all your coverage in one place.</p>\n            {:else}\n              <h4>BikeInsure Account Created</h4>\n              <p>Your sign-up email is your Login ID:</p>\n              <p class=\"email-highlight\"><strong>{(paymentComplete && ctx.policy?.user?.email) || $userInfo.email}</strong></p>\n            {/if}\n            <div class=\"account-actions\">\n              <a href=\"/account/login/\" class=\"btn btn-dashboard\">\n                Log In\n              </a>\n            </div>\n          </div>\n        </div>\n      {/if}\n    </div>\n  {:else}\n    <div class=\"payment-form\">\n      <div class=\"payment-header\">\n        <h3>Complete Your Payment</h3>\n        <p class=\"payment-description\">\n          Select your preferred payment method to make automatic monthly installment payments for the one-year policy.\n        </p>\n      </div>\n      \n      <!-- Express Checkout Element (Apple Pay, Google Pay, Link) -->\n      <div class=\"express-checkout-container\">\n        <div id=\"express-checkout-element\" class=\"express-checkout-element\">\n          <!-- Apple Pay, Google Pay, Link buttons will appear here -->\n        </div>\n        <div class=\"payment-divider\">\n          <span>Or pay with card</span>\n        </div>\n      </div>\n      \n      <div class=\"payment-element-container\">\n        <div id=\"payment-element\" class=\"payment-element\">\n          <!-- Stripe Elements will create form elements here -->\n        </div>\n      </div>\n      \n      <div class=\"payment-summary\">\n        <div class=\"summary-header\">\n          <span>BikeInsure Plan Summary</span>\n        </div>\n        \n        <!-- Line items for each bike -->\n        <div class=\"line-items\">\n          {#if policyQuote && policyQuote.bike_quotes}\n            {#each policyQuote.bike_quotes as bikeQuote, index}\n              <div class=\"line-item\">\n                <div class=\"line-item-details\">\n                  <div class=\"bike-name\">{getBikeMakeModelYear(index)}</div>\n                  <div class=\"coverage-plan\">{getBikeProductName(index)}</div>\n                  <div class=\"coverage-plan\">{bikeQuote.coverage_type === 'theft_protect' ? 'Bike Coverage + Theft' : 'Bike Coverage Only'}</div>\n                  {#if planSummaryMembershipDiscount}\n                    <div class=\"coverage-plan\">Membership discount applied</div>\n                  {/if}\n                  {#if planSummaryMultiBikeDiscount}\n                    <div class=\"coverage-plan\">Multi-bike discount applied</div>\n                  {/if}\n                </div>\n                <div class=\"line-item-price\">${getPlanSummaryBikeDisplayMonthlyPremium(index).toFixed(2)}/mo</div>\n              </div>\n            {/each}\n          {:else}\n            {#each ctx.bikes as bike, index}\n              <div class=\"line-item\">\n                <div class=\"line-item-details\">\n                  <div class=\"bike-name\">{getBikeMakeModelYear(index)}</div>\n                  <div class=\"coverage-plan\">{getBikeProductName(index)}</div>\n                  <div class=\"coverage-plan\">Loading...</div>\n                  {#if planSummaryMembershipDiscount}\n                    <div class=\"coverage-plan\">Membership discount applied</div>\n                  {/if}\n                  {#if planSummaryMultiBikeDiscount}\n                    <div class=\"coverage-plan\">Multi-bike discount applied</div>\n                  {/if}\n                </div>\n                <div class=\"line-item-price\">$0.00/mo</div>\n              </div>\n            {/each}\n          {/if}\n\n          {#if ctx.v2QuoteData}\n            <div class=\"line-item fee-line-item\">\n              <div class=\"line-item-details\">\n                <div class=\"bike-name\">Installment Processing</div>\n              </div>\n              <div class=\"line-item-price\">${PD_PAYMENT_FEE.toFixed(2)}/mo</div>\n            </div>\n          {/if}\n        </div>\n        \n        <!-- Total row -->\n        <div class=\"summary-total\">\n          <span>Total Monthly Payment</span>\n          <span class=\"amount\">\n            {#if planSummaryDisplayedTotalMonthly != null && planSummaryDisplayedTotalMonthly > 0}\n              ${planSummaryDisplayedTotalMonthly.toFixed(2)}/mo\n            {:else}\n              $0.00/mo\n            {/if}\n          </span>\n        </div>\n        \n        <div class=\"summary-note\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\n            <path d=\"m9 12 2 2 4-4\"/>\n          </svg>\n          Secured by Stripe\n        </div>\n      </div>\n      \n      <button \n        class=\"payment-submit-btn\" \n        on:click={processPayment}\n        disabled={paymentProcessing}\n      >\n        {#if paymentProcessing}\n          <div class=\"flex justify-center items-center\">\n            <div class=\"loading-spinner mr-5\"></div>\n            Processing, this may take a moment...\n          </div>\n        {:else}          \n          Complete Payment\n        {/if}\n      </button>\n      \n      <div class=\"trust-indicators\">\n        <div class=\"trust-item\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>\n            <circle cx=\"12\" cy=\"16\" r=\"1\"/>\n            <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n          </svg>\n          SSL Encrypted\n        </div>\n        <div class=\"trust-item\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\n          </svg>\n          PCI Compliant\n        </div>\n        <div class=\"trust-item\">\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n            <path d=\"M14 9V5a3 3 0 0 0-6 0v4\"/>\n            <rect x=\"2\" y=\"9\" width=\"20\" height=\"12\" rx=\"2\" ry=\"2\"/>\n          </svg>\n          Bank-Level Security\n        </div>\n      </div>\n    </div>\n  {/if}\n\n</div>\n\n{#if !loading && !finalizingPolicy}\n  <HelpBlock />\n{/if}\n\n<!-- Loading HUD Overlay for Policy Finalization -->\n{#if finalizingPolicy}\n  <div class=\"finalizing-overlay\">\n    <div class=\"finalizing-hud\">\n      <BikeInsureLoader size=\"large\" message=\"Processing, this may take a moment...\" />\n    </div>\n  </div>\n{/if}\n\n<style lang=\"scss\">\n  .step-content {\n    max-width: 600px;\n    margin: 0 auto;\n    padding: 20px;\n  }\n  \n  .loading-container {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 400px;\n    padding: 60px 20px;\n  }\n  \n  .error-message {\n    text-align: center;\n    padding: 40px;\n    background-color: #f8d7da;\n    border-radius: 8px;\n    color: #721c24;\n  }\n  \n  .error-message h2 {\n    margin-bottom: 20px;\n    color: #721c24;\n  }\n  \n  .error-message p {\n    margin-bottom: 20px;\n    font-size: 16px;\n  }\n  \n  .validation-help {\n    background-color: #fff3e0;\n    padding: 15px;\n    border-radius: 8px;\n    border-left: 4px solid #ff9800;\n    margin: 15px 0;\n  }\n  \n  .btn-secondary {\n    background-color: #6c757d;\n    color: white;\n    margin-right: 10px;\n    padding: 12px 24px;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    font-size: 16px;\n    text-decoration: none;\n    display: inline-block;\n  }\n  \n  .btn-secondary:hover {\n    background-color: #5a6268;\n  }\n  \n  .payment-summary {\n    background-color: #f8f9fa;\n    padding: 20px;\n    border-radius: 8px;\n    margin-bottom: 30px;\n  }\n  \n  .summary-item {\n    display: flex;\n    justify-content: space-between;\n    margin-bottom: 10px;\n    padding: 10px 0;\n    border-bottom: 1px solid #e9ecef;\n  }\n  \n  .summary-total {\n    margin-top: 15px;\n    padding-top: 15px;\n    border-top: 2px solid #dee2e6;\n    font-size: 18px;\n  }\n  \n  .quotes-loading, .quotes-error {\n    padding: 15px;\n    margin-bottom: 15px;\n    border-radius: 8px;\n    text-align: center;\n  }\n  \n  .quotes-loading {\n    background-color: #e3f2fd;\n    border: 1px solid #2196f3;\n    color: #1976d2;\n  }\n  \n  .quotes-error {\n    background-color: #fff3e0;\n    border: 1px solid #ff9800;\n    color: #f57c00;\n  }\n  \n  .loading-spinner {\n    width: 20px;\n    height: 20px;\n    border: 2px solid #e3f2fd;\n    border-top: 2px solid #2196f3;\n    border-radius: 50%;\n    animation: spin 1s linear infinite;\n    margin: 10px auto;\n  }\n  \n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n  \n  .loading-price {\n    color: #666;\n    font-style: italic;\n  }\n  \n  .coverage-info {\n    margin-left: 20px;\n    color: #666;\n    font-size: 12px;\n  }\n  \n  .price-display {\n    font-weight: bold;\n  }\n  \n  .payment-form {\n    background: white;\n    border-radius: 16px;\n    padding: 32px;\n    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n    border: 1px solid #f0f0f0;\n    max-width: 500px;\n    margin: 0 auto;\n  }\n  \n  .payment-header {\n    text-align: center;\n    margin-bottom: 32px;\n  }\n  \n  .payment-header h3 {\n    font-size: 24px;\n    font-weight: 600;\n    color: #1a1a1a;\n    margin: 0 0 8px 0;\n  }\n  \n  .payment-description {\n    color: #666;\n    font-size: 14px;\n    margin: 0;\n    line-height: 1.5;\n  }\n  \n  .payment-element-container {\n    margin-bottom: 24px;\n  }\n  \n  .express-checkout-container {\n    margin-bottom: 24px;\n  }\n  \n  .express-checkout-element {\n    min-height: 50px;\n    margin-bottom: 20px;\n  }\n  \n  .payment-divider {\n    display: flex;\n    align-items: center;\n    text-align: center;\n    margin: 24px 0;\n    \n    &::before,\n    &::after {\n      content: '';\n      flex: 1;\n      border-bottom: 1px solid #e2e8f0;\n    }\n    \n    span {\n      padding: 0 16px;\n      color: #718096;\n      font-size: 14px;\n      font-weight: 500;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n    }\n  }\n  \n  .payment-element {\n    min-height: 200px;\n    border-radius: 12px;\n  }\n  \n  .payment-summary {\n    background: #f8fafc;\n    border-radius: 12px;\n    padding: 20px;\n    margin-bottom: 24px;\n    border: 1px solid #e2e8f0;\n  }\n  \n  .summary-header {\n    font-size: 18px;\n    font-weight: 600;\n    color: #1a1a1a;\n    margin-bottom: 16px;\n    padding-bottom: 12px;\n    border-bottom: 2px solid #e2e8f0;\n  }\n  \n  .line-items {\n    margin-bottom: 16px;\n  }\n  \n  .line-item {\n    display: flex;\n    justify-content: space-between;\n    align-items: flex-start;\n    padding: 12px 0;\n    border-bottom: 1px solid #e2e8f0;\n  }\n  \n  .line-item:last-child {\n    border-bottom: none;\n  }\n  \n  .line-item-details {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n  }\n  \n  .bike-name {\n    font-size: 15px;\n    font-weight: 600;\n    color: #1a1a1a;\n  }\n  \n  .coverage-plan {\n    font-size: 13px;\n    color: #64748b;\n  }\n  \n  .line-item-price {\n    font-size: 15px;\n    font-weight: 600;\n    color: #1a1a1a;\n    white-space: nowrap;\n    margin-left: 12px;\n  }\n\n  .summary-total {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    font-size: 18px;\n    font-weight: 700;\n    color: #1a1a1a;\n    padding: 16px 0 12px;\n    border-top: 2px solid #1a1a1a;\n    margin-top: 8px;\n  }\n  \n  .summary-row {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    font-size: 18px;\n    font-weight: 600;\n    color: #1a1a1a;\n    margin-bottom: 12px;\n  }\n  \n  .amount {\n    color: #000000;\n    font-weight: 700;\n  }\n  \n  .summary-note {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 14px;\n    color: #64748b;\n    margin-top: 12px;\n  }\n  \n  .summary-note svg {\n    color: #10b981;\n  }\n  \n  .payment-submit-btn,.btn-setup {\n    width: 100%;\n    background: #bd181b;\n    color: white;\n    border: none;\n    border-radius: 12px;\n    padding: 16px 24px;\n    font-size: 16px;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 8px;\n    margin-bottom: 20px;\n    min-height: 56px;\n  }\n  \n  .payment-submit-btn:hover:not(:disabled) {\n    background: #aa1316;\n    transform: translateY(-1px);\n    box-shadow: 0 8px 25px rgba(222, 67, 5, 0.3);\n  }\n  \n  .payment-submit-btn:disabled {\n    opacity: 0.7;\n    cursor: not-allowed;\n    transform: none;\n  }\n  \n  .loading-spinner {\n    width: 20px;\n    height: 20px;\n    border: 2px solid transparent;\n    border-top: 2px solid currentColor;\n    border-radius: 50%;\n    animation: spin 1s linear infinite;\n  }\n  \n  @keyframes spin {\n    to {\n      transform: rotate(360deg);\n    }\n  }\n  \n  .trust-indicators {\n    display: flex;\n    justify-content: center;\n    gap: 24px;\n    padding-top: 16px;\n    border-top: 1px solid #e2e8f0;\n  }\n  \n  .trust-item {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 12px;\n    color: #64748b;\n  }\n  \n  .trust-item svg {\n    color: #10b981;\n  }\n  \n  .btn {\n    padding: 12px 30px;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 16px;\n    transition: background-color 0.3s;\n    width: 100%;\n  }\n  \n  .btn-primary {\n    background-color: #007bff;\n    color: white;\n  }\n  \n  .btn-primary:hover:not(:disabled) {\n    background-color: #0056b3;\n  }\n  \n  .btn-primary:disabled {\n    background-color: #6c757d;\n    cursor: not-allowed;\n  }\n  \n  \n  .success-message {\n    min-height: 100vh;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: flex-start;\n    overflow-y: auto;\n  }\n  \n  .success-content {\n    text-align: center;\n    max-width: 600px;\n    width: 100%;\n    margin: 0 auto 40px auto;\n    background: #2E5C8A;\n    border-radius: 12px;\n    padding: 40px 30px;\n    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n    color: white;\n  }\n  \n  .success-logo {\n    display: flex;\n    justify-content: center;\n    margin-bottom: 30px;\n    \n    img {\n      width: 220px;\n      height: auto;\n    }\n  }\n  \n  .success-title {\n    font-size: 48px;\n    font-weight: 700;\n    color: white;\n    margin: 0 0 30px 0;\n  }\n  \n  .success-text {\n    margin-bottom: 30px;\n    \n    p {\n      font-size: 16px;\n      line-height: 1.8;\n      color: white;\n      margin: 16px 0;\n      \n      strong {\n        font-weight: 600;\n      }\n    }\n  }\n  \n  .success-contact {\n    font-size: 16px;\n    color: white;\n    margin: 30px 0;\n    \n    p {\n      font-size: 16px;\n      margin: 0;\n      color: white;\n    }\n    \n    a {\n      color: white;\n      text-decoration: none;\n      \n      &:hover {\n        text-decoration: underline;\n      }\n    }\n  }\n  \n  .account-section {\n    max-width: 500px;\n    width: 100%;\n    margin: 0 auto;\n  }\n  \n  .account-card {\n    background: white;\n    border-radius: 12px;\n    padding: 35px 30px;\n    color: #333;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n    border: 3px solid #2E5C8A;\n    \n    .account-title {\n      color: #2E5C8A;\n      margin: 0 0 8px 0;\n      font-size: 22px;\n      font-weight: 600;\n    }\n    \n    .account-subtitle {\n      color: #5a5a5a;\n      font-size: 14px;\n      margin: 0 0 20px 0;\n      font-weight: 500;\n    }\n    \n    .account-benefits {\n      list-style: none;\n      padding: 0;\n      margin: 0 0 25px 0;\n      text-align: left;\n      \n      li {\n        display: flex;\n        align-items: center;\n        color: #333;\n        font-size: 14px;\n        margin: 10px 0;\n        line-height: 1.5;\n        \n        .checkmark {\n          display: inline-flex;\n          align-items: center;\n          justify-content: center;\n          width: 20px;\n          height: 20px;\n          margin-right: 12px;\n          background: transparent;\n          color: #333;\n          font-size: 16px;\n          font-weight: bold;\n          flex-shrink: 0;\n        }\n      }\n    }\n    \n    .email-info {\n      margin: 20px 0 25px 0;\n      text-align: left;\n      \n      .email-label {\n        color: #333;\n        font-size: 14px;\n        margin: 0 0 6px 0;\n        font-weight: 500;\n      }\n      \n      .email-value {\n        color: #2E5C8A;\n        font-size: 14px;\n        margin: 0;\n        font-weight: 600;\n      }\n    }\n    \n    h3, h4 {\n      color: #2E5C8A;\n      margin: 0 0 20px 0;\n      font-size: 24px;\n    }\n    \n    p {\n      color: #333;\n      font-size: 15px;\n      line-height: 1.6;\n      margin: 10px 0;\n    }\n    \n    .email-highlight {\n      color: #2E5C8A;\n      font-size: 16px;\n      font-weight: 600;\n      margin: 5px 0 20px 0;\n    }\n    \n    ul {\n      text-align: left;\n      margin: 20px 0;\n      padding-left: 20px;\n      \n      li {\n        color: #333;\n        font-size: 15px;\n        margin: 8px 0;\n      }\n    }\n  }\n  \n  .password-setup {\n    margin: 25px 0;\n    \n    .form-group {\n      margin-bottom: 18px;\n      text-align: left;\n      \n      label {\n        display: block;\n        font-weight: 400;\n        color: #718096;\n        margin-bottom: 8px;\n        font-size: 13px;\n      }\n      \n      .password-input-wrapper {\n        position: relative;\n        display: flex;\n        align-items: center;\n      }\n      \n      input {\n        width: 100%;\n        padding: 12px 45px 12px 14px;\n        border: 1px solid #cbd5e0;\n        border-radius: 6px;\n        font-size: 14px;\n        background: #f7fafc;\n        \n        &::placeholder {\n          color: #a0aec0;\n        }\n        \n        &:focus {\n          outline: none;\n          border-color: #2E5C8A;\n          background: white;\n          box-shadow: 0 0 0 3px rgba(46, 92, 138, 0.1);\n        }\n        \n        &.error {\n          border-color: #dc3545;\n          background: #fff5f5;\n        }\n        \n        &:disabled {\n          background-color: #e2e8f0;\n          cursor: not-allowed;\n          opacity: 0.6;\n        }\n      }\n      \n      .password-toggle {\n        position: absolute;\n        right: 10px;\n        background: none;\n        border: none;\n        color: #718096;\n        cursor: pointer;\n        padding: 6px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        transition: color 0.2s ease;\n        \n        &:hover {\n          color: #2E5C8A;\n        }\n        \n        i {\n          font-size: 16px;\n        }\n      }\n      \n      .error-text {\n        display: block;\n        color: #dc3545;\n        font-size: 12px;\n        margin-top: 5px;\n      }\n    }\n  }\n  \n  .account-actions {\n    margin-top: 25px;\n    \n    .btn-dashboard, .btn-setup {\n      display: block;\n      width: 100%;\n      padding: 14px 28px;\n      background: linear-gradient(135deg, #cbd5e0 0%, #a0aec0 100%);\n      color: #2d3748;\n      font-size: 16px;\n      font-weight: 600;\n      border-radius: 8px;\n      text-decoration: none;\n      transition: all 0.3s ease;\n      border: none;\n      cursor: pointer;\n      text-align: center;\n      \n      &:hover:not(:disabled) {\n        background: linear-gradient(135deg, #a0aec0 0%, #718096 100%);\n        transform: translateY(-1px);\n        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n      }\n      \n      &:disabled {\n        background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e0 100%);\n        cursor: not-allowed;\n      }\n    }\n  }\n  \n  .account-note {\n    font-size: 13px;\n    color: #666;\n    margin-top: 15px;\n    \n    strong {\n      color: #2E5C8A;\n    }\n  }\n  \n  .loading-spinner {\n    display: inline-block;\n    width: 14px;\n    height: 14px;\n    border: 2px solid rgba(255, 255, 255, 0.3);\n    border-radius: 50%;\n    border-top-color: white;\n    animation: spin 0.6s linear infinite;\n    margin-right: 8px;\n    vertical-align: middle;\n  }\n  \n  @keyframes spin {\n    to { transform: rotate(360deg); }\n  }\n  \n  @media (max-width: 768px) {\n    .success-title {\n      font-size: 36px;\n    }\n    \n    .success-text p {\n      font-size: 14px;\n    }\n    \n    .success-logo img {\n      width: 180px;\n    }\n  }\n\n  /* Account Setup Prompt Styles */\n  .account-setup-prompt {\n    margin-top: 2rem;\n    padding-top: 2rem;\n    border-top: 2px dashed #b7c4d2;\n    color:white;\n  }\n\n  .setup-card {\n    background: #70aad1;\n    border-radius: 8px;\n    padding: 1.5rem;\n    text-align: left;\n  }\n\n  .setup-card h3 {\n    color: white;\n    margin-bottom: 1rem;\n    text-align: center;\n    font-size: 26px;\n  }\n\n  .setup-card p {\n    margin-bottom: 1rem;\n  }\n\n  .setup-card ul {\n    margin: 1rem 0;\n    padding-left: 1.5rem;\n    list-style-type: none;\n  }\n\n  .setup-card li {\n    margin-bottom: 0.5rem;\n  }\n\n  .password-setup {\n    margin: 20px 0;\n  }\n  \n  .password-setup .form-group {\n    margin-bottom: 15px;\n  }\n  \n  .password-setup label {\n    display: block;\n    margin-bottom: 5px;\n    font-weight: 600;\n    color: white;\n  }\n  \n  .password-setup input[type=\"password\"] {\n    width: 100%;\n    padding: 10px 12px;\n    border: 2px solid #ddd;\n    border-radius: 6px;\n    font-size: 16px;\n    transition: border-color 0.3s;\n    box-sizing: border-box;\n  }\n  \n  .password-setup input[type=\"password\"]:focus {\n    outline: none;\n    border-color: #007bff;\n  }\n  \n  .password-setup input[type=\"password\"].error {\n    border-color: #dc3545;\n  }\n  \n  .password-setup .error-message {\n    color: #dc3545;\n    font-size: 14px;\n    margin-top: 5px;\n    display: block;\n  }\n\n  .setup-actions {\n    display: flex;\n    gap: 1rem;\n    justify-content: center;\n    margin: 1.5rem 0;\n  }\n  \n  .btn-setup {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n  }\n  \n  .login-actions {\n    margin-top: 20px;\n  }\n  \n  .login-actions .btn {\n    display: inline-block;\n    padding: 12px 24px;\n    background-color: #28a745;\n    color: white;\n    text-decoration: none;\n    border-radius: 6px;\n    font-weight: 600;\n    transition: background-color 0.3s;\n  }\n  \n  .login-actions .btn:hover {\n    background-color: #218838;\n  }\n\n  .btn-setup:hover:not(:disabled) {\n    transform: translateY(-1px);\n  }\n\n  .btn-setup:disabled {\n    opacity: 0.6;\n    cursor: not-allowed;\n  }\n\n  .setup-note {\n    text-align: center;\n    font-size: 0.875rem;\n    color: #0d1e2d !important;\n    margin: 0;\n  }\n\n  .setup-success {\n    background: #d1ecf1;\n    border: 1px solid #bee5eb;\n    border-radius: 8px;\n    padding: 1.5rem;\n    margin-top: 1.5rem;\n    text-align: center;\n  }\n\n  .setup-success h4 {\n    color: #0c5460;\n    margin-bottom: 0.5rem;\n  }\n\n  .setup-success p {\n    color: #0c5460;\n    margin: 0;\n  }\n\n  @media (max-width: 640px) {\n    .setup-actions {\n      flex-direction: column;\n    }\n    \n    .setup-actions .btn {\n      width: 100%;\n    }\n  }\n\n  /* Loading HUD Overlay */\n  .finalizing-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.6);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 9999;\n    backdrop-filter: blur(4px);\n  }\n\n  .finalizing-hud {\n    background: white;\n    border-radius: 16px;\n    padding: 40px 60px;\n    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    max-width: 90%;\n    animation: slideIn 0.3s ease-out;\n  }\n\n  @keyframes slideIn {\n    from {\n      opacity: 0;\n      transform: translateY(-20px);\n    }\n    to {\n      opacity: 1;\n      transform: translateY(0);\n    }\n  }\n\n  @media (max-width: 640px) {\n    .finalizing-hud {\n      padding: 30px 40px;\n    }\n  }\n</style> ","<script>\n  import { onMount, getContext } from 'svelte';\n  \n  // Get context from parent\n  const ctx = getContext('app');\n  \n  // Access context values\n  $: policy = ctx.policy;\n  $: partnerSlug = ctx.partnerSlug;\n  $: API_BASE_URL = ctx.API_BASE_URL;\n  \n  // For bound policies, use the structured data from the policy object\n  $: bikes = policy?.bike_details || [];\n  $: userInfo = policy?.user || {};\n  \n  // Stripe subscription data\n  let subscriptionData = null;\n  let stripeCustomer = null;\n  let loading = false;\n  let error = null;\n  \n  // Contact support modal\n  let showContactModal = false;\n  let contactForm = {\n    name: '',\n    email: '',\n    subject: '',\n    message: ''\n  };\n  let contactLoading = false;\n  let contactSuccess = false;\n  \n  // Load subscription data when component mounts\n  onMount(async () => {\n    if (policy?.uuid) {\n      await loadSubscriptionData();\n    }\n  });\n  \n  async function loadSubscriptionData() {\n    if (!policy?.uuid) return;\n    \n    loading = true;\n    error = null;\n    \n    try {\n      const response = await fetch(`${API_BASE_URL}payments/payments/get_policy_subscription/?policy_uuid=${policy.uuid}`, {\n        method: 'GET',\n        headers: {\n          'Content-Type': 'application/json',\n        }\n      });\n      \n      const data = await response.json();\n      \n      if (data.success) {\n        subscriptionData = data.subscription;\n        stripeCustomer = data.customer;\n        console.log('Loaded subscription data:', subscriptionData);\n      } else {\n        console.warn('Failed to load subscription data:', data.error);\n        error = data.error;\n      }\n    } catch (err) {\n      console.error('Error loading subscription data:', err);\n      error = 'Failed to load subscription information';\n    } finally {\n      loading = false;\n    }\n  }\n  \n  // Calculate total premium from subscription data if available\n  function calculateTotalPremium() {\n    if (subscriptionData?.formatted_total) {\n      return parseFloat(subscriptionData.formatted_total.replace('$', '')) || 0;\n    }\n    \n    if (policy?.total) {\n      return parseFloat(policy.total) || 0;\n    }\n    \n    // Fallback: calculate from bike details if total not available\n    let total = 0;\n    bikes.forEach(bike => {\n      if (bike.coverage_plan) {\n        // Try to extract price from coverage plan display\n        const priceMatch = bike.coverage_plan_display?.match(/\\$(\\d+(?:\\.\\d{2})?)/);\n        if (priceMatch) {\n          total += parseFloat(priceMatch[1]);\n        }\n      }\n    });\n    return total;\n  }\n  \n  // Get product name for a bike from subscription data\n  function getProductNameForBike(bike, bikeIndex) {\n    if (subscriptionData?.items && subscriptionData.items[bikeIndex]) {\n      const item = subscriptionData.items[bikeIndex];\n      return `${item.product_name} - ${item.formatted_amount}/mo.`;\n    }\n    \n    // Fallback to original display\n    return bike.coverage_plan_display || bike.coverage_plan || 'Standard Coverage';\n  }\n  \n  function formatDate(dateString) {\n    if (!dateString) return 'N/A';\n    \n    // Handle Unix timestamp\n    if (typeof dateString === 'number') {\n      return new Date(dateString * 1000).toLocaleDateString();\n    }\n    \n    return new Date(dateString).toLocaleDateString();\n  }\n  \n  function formatCurrency(amount) {\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: 'USD'\n    }).format(amount);\n  }\n  \n  function formatSubscriptionStatus(status) {\n    switch (status) {\n      case 'active':\n        return 'Active';\n      case 'past_due':\n        return 'Past Due';\n      case 'canceled':\n        return 'Canceled';\n      case 'unpaid':\n        return 'Unpaid';\n      default:\n        return status.charAt(0).toUpperCase() + status.slice(1);\n    }\n  }\n  \n  // Manage billing - create Stripe Customer Portal session\n  async function manageBilling() {\n    if (!policy?.uuid) return;\n    \n    loading = true;\n    try {\n      const response = await fetch(`${API_BASE_URL}payments/payments/create_billing_portal_session/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken(),\n        },\n        body: JSON.stringify({\n          policy_uuid: policy.uuid,\n          return_url: window.location.href\n        })\n      });\n      \n      const data = await response.json();\n      \n      if (data.success && data.portal_url) {\n        // Redirect to Stripe Customer Portal\n        window.location.href = data.portal_url;\n      } else {\n        alert('Unable to open billing portal: ' + (data.error || 'Unknown error'));\n      }\n    } catch (err) {\n      console.error('Error opening billing portal:', err);\n      alert('Failed to open billing portal. Please try again.');\n    } finally {\n      loading = false;\n    }\n  }\n  \n  // Open contact support modal\n  function openContactModal() {\n    // Pre-populate form with user info\n    contactForm = {\n      name: `${userInfo?.first_name || ''} ${userInfo?.last_name || ''}`.trim(),\n      email: userInfo?.email || '',\n      subject: `Support Request - Policy ${policy?.policy_number || ''}`,\n      message: ''\n    };\n    showContactModal = true;\n    contactSuccess = false;\n  }\n  \n  // Submit contact form\n  async function submitContactForm() {\n    if (!contactForm.name || !contactForm.email || !contactForm.message) {\n      alert('Please fill in all required fields.');\n      return;\n    }\n    \n    contactLoading = true;\n    try {\n      // For now, we'll create a simple API call - you can implement a contact endpoint later\n      // Or integrate with your preferred contact/support system\n      const response = await fetch(`${API_BASE_URL}support/contact/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': ctx.getCsrfToken(),\n        },\n        body: JSON.stringify({\n          ...contactForm,\n          policy_uuid: policy?.uuid,\n          policy_number: policy?.policy_number\n        })\n      });\n      \n      if (response.ok) {\n        contactSuccess = true;\n        setTimeout(() => {\n          showContactModal = false;\n        }, 2000);\n      } else {\n        // Fallback to email if API not available\n        const emailBody = encodeURIComponent(\n          `Name: ${contactForm.name}\\n` +\n          `Email: ${contactForm.email}\\n` +\n          `Policy: ${policy?.policy_number || 'N/A'}\\n\\n` +\n          `Message:\\n${contactForm.message}`\n        );\n        window.location.href = `mailto:help@bikeinsure.com?subject=${encodeURIComponent(contactForm.subject)}&body=${emailBody}`;\n        showContactModal = false;\n      }\n    } catch (err) {\n      console.error('Error submitting contact form:', err);\n      // Fallback to email\n      const emailBody = encodeURIComponent(\n        `Name: ${contactForm.name}\\n` +\n        `Email: ${contactForm.email}\\n` +\n        `Policy: ${policy?.policy_number || 'N/A'}\\n\\n` +\n        `Message:\\n${contactForm.message}`\n      );\n      window.location.href = `mailto:help@bikeinsure.com?subject=${encodeURIComponent(contactForm.subject)}&body=${emailBody}`;\n      showContactModal = false;\n    } finally {\n      contactLoading = false;\n    }\n  }\n</script>\n\n<div class=\"bound-policy-container\">\n  <div class=\"policy-header\">\n    <div class=\"status-badge bound\">\n      <span class=\"status-icon\">✓</span>\n      Policy Active\n    </div>\n    <h1>Your Bike Insurance Policy</h1>\n    <p class=\"policy-number\">Policy #{policy?.policy_number}</p>\n  </div>\n\n  <div class=\"policy-summary\">\n    <div class=\"summary-section\">\n      <h2>Policy Details</h2>\n      <div class=\"detail-grid\">\n        <div class=\"detail-item\">\n          <label>Policy Number:</label>\n          <span>{policy?.policy_number}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Policy Status:</label>\n          <span class=\"status-active\">Active</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Start Date:</label>\n          <span>{formatDate(policy?.start_date)}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>End Date:</label>\n          <span>{formatDate(policy?.end_date)}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Purchase Date:</label>\n          <span>{formatDate(policy?.purchase_date)}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Monthly Premium:</label>\n          <span class=\"premium-amount\">{formatCurrency(calculateTotalPremium())}</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Subscription Information -->\n    {#if subscriptionData}\n      <div class=\"summary-section\">\n        <h2>Subscription Details</h2>\n        <div class=\"detail-grid\">\n          <div class=\"detail-item\">\n            <label>Subscription Status:</label>\n            <span class=\"status-{subscriptionData.status}\">{formatSubscriptionStatus(subscriptionData.status)}</span>\n          </div>\n          <div class=\"detail-item\">\n            <label>Current Period:</label>\n            <span>{formatDate(subscriptionData.current_period_start)} - {formatDate(subscriptionData.current_period_end)}</span>\n          </div>\n          <div class=\"detail-item\">\n            <label>Monthly Total:</label>\n            <span class=\"premium-amount\">{subscriptionData.formatted_total}</span>\n          </div>\n          <div class=\"detail-item\">\n            <label>Next Payment:</label>\n            <span>{formatDate(subscriptionData.current_period_end)}</span>\n          </div>\n        </div>\n      </div>\n    {/if}\n\n    <div class=\"summary-section\">\n      <h2>Policyholder Information</h2>\n      <div class=\"detail-grid\">\n        <div class=\"detail-item\">\n          <label>Name:</label>\n          <span>{userInfo?.first_name || ''} {userInfo?.last_name || ''}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Email:</label>\n          <span>{userInfo?.email || 'N/A'}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Phone:</label>\n          <span>{userInfo?.phone_number || 'N/A'}</span>\n        </div>\n        <div class=\"detail-item\">\n          <label>Address:</label>\n          <span>{userInfo?.address || ''}{userInfo?.city ? ', ' + userInfo.city : ''}{userInfo?.state ? ', ' + userInfo.state : ''} {userInfo?.postal_code || ''}</span>\n        </div>\n      </div>\n      \n      <!-- Stripe Customer Information -->\n      {#if stripeCustomer}\n        <div class=\"stripe-customer-info\">\n          <h4>Billing Information</h4>\n          <div class=\"detail-grid\">            \n            <div class=\"detail-item\">\n              <label>Billing Email:</label>\n              <span>{stripeCustomer.email}</span>\n            </div>\n          </div>\n        </div>\n      {/if}\n    </div>\n\n    <div class=\"summary-section\">\n      <h2>Covered Bikes</h2>\n      <div class=\"bikes-list\">\n        {#each bikes as bike, index}\n          <div class=\"bike-card\">\n            <div class=\"bike-header\">\n              <h3>Bike: {bike.manufacturer || 'N/A'}</h3>              \n            </div>\n            <div class=\"bike-details\">\n              <div class=\"bike-info\">\n                <div class=\"info-item\">\n                  <label>Make:</label>\n                  <span>{bike.manufacturer || 'N/A'}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Model:</label>\n                  <span>{bike.model || 'N/A'}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Year:</label>\n                  <span>{bike.model_year || 'N/A'}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Serial Number:</label>\n                  <span>{bike.serial_number || 'N/A'}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Purchase Price:</label>\n                  <span>{formatCurrency(parseFloat(bike.purchase_price) || 0)}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Usage:</label>\n                  <span>{bike.usage || 'N/A'}</span>\n                </div>\n                <div class=\"info-item\">\n                  <label>Theft Protection:</label>\n                  <span>{bike.theft_protection ? 'Yes' : 'No'}</span>\n                </div>\n              </div>\n              \n              <!-- Show subscription item details if available -->\n              {#if subscriptionData?.items && subscriptionData.items[index]}\n                <div class=\"subscription-item-details\">\n                  <div class=\"info-item\">\n                    <label>Coverage Plan:</label>\n                    <span>{subscriptionData.items[index].product_name}</span>\n                  </div>\n                  <div class=\"info-item\">\n                    <label>Monthly Premium:</label>\n                    <span class=\"premium-amount\">{subscriptionData.items[index].formatted_amount}</span>\n                  </div>                  \n                </div>\n              {/if}\n            </div>\n          </div>\n        {/each}\n      </div>\n    </div>\n  </div>\n\n  <div class=\"policy-actions\">\n    <div class=\"action-buttons\">\n      <a \n        href=\"{API_BASE_URL}policy/{partnerSlug}/{policy?.uuid}/pdf/\" \n        target=\"_blank\" \n        class=\"btn btn-primary\"\n        rel=\"noopener noreferrer\"\n      >\n        📄 Download Policy\n      </a>\n      <button class=\"btn btn-secondary\" on:click={openContactModal}>\n        💬 Contact Support\n      </button>\n      {#if subscriptionData && policy?.stripe_customer_id}\n        <button class=\"btn btn-tertiary\" on:click={manageBilling} disabled={loading}>\n          {loading ? 'Loading...' : '💳 Manage Billing'}\n        </button>\n      {/if}\n    </div>\n    \n    <div class=\"help-text\">\n      <p>Need to make changes to your policy? Contact our support team at help@bikeinsure.com</p>\n      <p>For claims, call our 24/7 claims hotline at 1-888-BikeInsure</p>\n      {#if subscriptionData}\n        <p>Your subscription renews automatically on {formatDate(subscriptionData.current_period_end)}</p>\n      {/if}\n    </div>\n  </div>\n</div>\n\n<!-- Contact Support Modal -->\n{#if showContactModal}\n  <div class=\"modal-overlay\" on:click={() => showContactModal = false}>\n    <div class=\"modal-content\" on:click|stopPropagation>\n      <div class=\"modal-header\">\n        <h2>Contact Support</h2>\n        <button class=\"modal-close\" on:click={() => showContactModal = false}>&times;</button>\n      </div>\n      \n      {#if contactSuccess}\n        <div class=\"success-message\">\n          <div class=\"success-icon\">✓</div>\n          <h3>Message Sent!</h3>\n          <p>Thank you for contacting us. We'll get back to you within 24 hours.</p>\n        </div>\n      {:else}\n        <div class=\"modal-body\">\n          <form on:submit|preventDefault={submitContactForm}>\n            <div class=\"form-group\">\n              <label for=\"contact-name\">Name *</label>\n              <input \n                id=\"contact-name\"\n                type=\"text\" \n                bind:value={contactForm.name} \n                required\n                placeholder=\"Your full name\"\n              />\n            </div>\n            \n            <div class=\"form-group\">\n              <label for=\"contact-email\">Email *</label>\n              <input \n                id=\"contact-email\"\n                type=\"email\" \n                bind:value={contactForm.email} \n                required\n                placeholder=\"your.email@example.com\"\n              />\n            </div>\n            \n            <div class=\"form-group\">\n              <label for=\"contact-subject\">Subject</label>\n              <input \n                id=\"contact-subject\"\n                type=\"text\" \n                bind:value={contactForm.subject}\n                placeholder=\"Brief description of your request\"\n              />\n            </div>\n            \n            <div class=\"form-group\">\n              <label for=\"contact-message\">Message *</label>\n              <textarea \n                id=\"contact-message\"\n                bind:value={contactForm.message} \n                required\n                rows=\"5\"\n                placeholder=\"Please describe your question or concern in detail...\"\n              ></textarea>\n            </div>\n            \n            <div class=\"modal-actions\">\n              <button type=\"button\" class=\"btn btn-secondary\" on:click={() => showContactModal = false}>\n                Cancel\n              </button>\n              <button type=\"submit\" class=\"btn btn-primary\" disabled={contactLoading}>\n                {contactLoading ? 'Sending...' : 'Send Message'}\n              </button>\n            </div>\n          </form>\n        </div>\n      {/if}\n    </div>\n  </div>\n{/if}\n\n<style>\n  .bound-policy-container {\n    max-width: 800px;\n    margin: 0 auto;\n    padding: 20px;\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n  }\n\n  .policy-header {\n    text-align: center;\n    margin-bottom: 30px;\n    padding: 20px;\n    background: linear-gradient(135deg, #3294d9 0%, #055085 100%);\n    color: white;\n    border-radius: 12px;\n  }\n\n  .status-badge {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    background: rgba(255, 255, 255, 0.2);\n    padding: 8px 16px;\n    border-radius: 20px;\n    font-size: 14px;\n    font-weight: 500;\n    margin-bottom: 15px;\n  }\n\n  .status-badge.bound {\n    background: rgba(255, 255, 255, 0.2);\n  }\n\n  .status-icon {\n    font-size: 16px;\n    font-weight: bold;\n  }\n\n  .policy-header h1 {\n    margin: 0 0 10px 0;\n    font-size: 28px;\n    font-weight: 600;\n  }\n\n  .policy-number {\n    font-size: 18px;\n    opacity: 0.9;\n    margin: 0;\n  }\n\n  .policy-summary {\n    background: white;\n    border-radius: 12px;\n    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n    overflow: hidden;\n    margin-bottom: 30px;\n  }\n\n  .summary-section {\n    padding: 25px;\n    border-bottom: 1px solid #e5e7eb;\n  }\n\n  .summary-section:last-child {\n    border-bottom: none;\n  }\n\n  .summary-section h2 {\n    margin: 0 0 20px 0;\n    font-size: 20px;\n    font-weight: 600;\n    color: #374151;\n  }\n\n  .detail-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n    gap: 15px;\n  }\n\n  .detail-item {\n    display: flex;\n    flex-direction: column;\n    gap: 5px;\n  }\n\n  .detail-item label {\n    font-size: 14px;\n    font-weight: 500;\n    color: #6b7280;\n  }\n\n  .detail-item span {\n    font-size: 16px;\n    color: #374151;\n  }\n\n  .status-active {\n    color: #10b981;\n    font-weight: 600;\n  }\n\n  .status-past_due {\n    color: #f59e0b;\n    font-weight: 600;\n  }\n\n  .status-canceled {\n    color: #ef4444;\n    font-weight: 600;\n  }\n\n  .premium-amount {\n    font-size: 18px;\n    font-weight: 600;\n    color: #10b981;\n  }\n\n  .stripe-customer-info {\n    margin-top: 20px;\n    padding-top: 20px;\n    border-top: 1px solid #e5e7eb;\n  }\n\n  .stripe-customer-info h4 {\n    margin: 0 0 15px 0;\n    font-size: 16px;\n    font-weight: 600;\n    color: #374151;\n  }\n\n  .bikes-list {\n    display: flex;\n    flex-direction: column;\n    gap: 20px;\n  }\n\n  .bike-card {\n    background: #f9fafb;\n    border: 1px solid #e5e7eb;\n    border-radius: 8px;\n    padding: 20px;\n  }\n\n  .bike-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 15px;\n  }\n\n  .bike-header h3 {\n    margin: 0;\n    font-size: 18px;\n    font-weight: 600;\n    color: #374151;\n  }\n\n  .coverage-type {\n    background: #10b981;\n    color: white;\n    padding: 6px 12px;\n    border-radius: 20px;\n    font-size: 12px;\n    font-weight: 500;\n  }\n\n  .bike-details {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 20px;\n  }\n\n  .bike-info {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n    gap: 12px;\n  }\n\n  .info-item {\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n  }\n\n  .info-item label {\n    font-size: 13px;\n    font-weight: 500;\n    color: #6b7280;\n  }\n\n  .info-item span {\n    font-size: 15px;\n    color: #374151;\n  }\n\n  .subscription-item-details {\n    background: #f3f4f6;\n    padding: 15px;\n    border-radius: 6px;\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n    gap: 10px;\n  }\n\n  .stripe-id {\n    font-family: 'Courier New', monospace;\n    font-size: 12px;\n    color: #6b7280;\n  }\n\n  .policy-actions {\n    background: white;\n    border-radius: 12px;\n    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n    padding: 25px;\n    text-align: center;\n  }\n\n  .action-buttons {\n    display: flex;\n    gap: 15px;\n    justify-content: center;\n    margin-bottom: 20px;\n  }\n\n  .btn {\n    padding: 12px 24px;\n    border-radius: 8px;\n    font-weight: 500;\n    text-decoration: none;\n    transition: all 0.2s;\n    border: none;\n    cursor: pointer;\n    font-size: 16px;\n  }\n\n  .btn-primary {\n    background: #10b981;\n    color: white;\n  }\n\n  .btn-primary:hover {\n    background: #059669;\n  }\n\n  .btn-secondary {\n    background: #f3f4f6;\n    color: #374151;\n    border: 1px solid #d1d5db;\n  }\n\n  .btn-secondary:hover {\n    background: #e5e7eb;\n  }\n\n  .btn-tertiary {\n    background: #3b82f6;\n    color: white;\n  }\n\n  .btn-tertiary:hover {\n    background: #2563eb;\n  }\n\n  .help-text {\n    font-size: 14px;\n    color: #6b7280;\n    line-height: 1.5;\n  }\n\n  .help-text p {\n    margin: 5px 0;\n  }\n\n  /* Modal Styles */\n  .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.5);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 1000;\n    padding: 20px;\n  }\n\n  .modal-content {\n    background: white;\n    border-radius: 12px;\n    max-width: 500px;\n    width: 100%;\n    max-height: 90vh;\n    overflow-y: auto;\n    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n  }\n\n  .modal-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 20px 25px;\n    border-bottom: 1px solid #e5e7eb;\n  }\n\n  .modal-header h2 {\n    margin: 0;\n    font-size: 24px;\n    font-weight: 600;\n    color: #374151;\n  }\n\n  .modal-close {\n    background: none;\n    border: none;\n    font-size: 24px;\n    cursor: pointer;\n    color: #6b7280;\n    padding: 0;\n    width: 30px;\n    height: 30px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 50%;\n    transition: background-color 0.2s;\n  }\n\n  .modal-close:hover {\n    background-color: #f3f4f6;\n  }\n\n  .modal-body {\n    padding: 25px;\n  }\n\n  .form-group {\n    margin-bottom: 20px;\n  }\n\n  .form-group label {\n    display: block;\n    margin-bottom: 6px;\n    font-weight: 500;\n    color: #374151;\n    font-size: 14px;\n  }\n\n  .form-group input,\n  .form-group textarea {\n    width: 100%;\n    padding: 10px 12px;\n    border: 1px solid #d1d5db;\n    border-radius: 6px;\n    font-size: 16px;\n    transition: border-color 0.2s;\n    box-sizing: border-box;\n  }\n\n  .form-group input:focus,\n  .form-group textarea:focus {\n    outline: none;\n    border-color: #10b981;\n    box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n  }\n\n  .form-group textarea {\n    resize: vertical;\n    min-height: 100px;\n  }\n\n  .modal-actions {\n    display: flex;\n    gap: 12px;\n    justify-content: flex-end;\n    margin-top: 25px;\n  }\n\n  .success-message {\n    padding: 40px 25px;\n    text-align: center;\n  }\n\n  .success-icon {\n    width: 60px;\n    height: 60px;\n    background: #10b981;\n    color: white;\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 30px;\n    font-weight: bold;\n    margin: 0 auto 20px;\n  }\n\n  .success-message h3 {\n    margin: 0 0 10px 0;\n    font-size: 24px;\n    color: #374151;\n  }\n\n  .success-message p {\n    margin: 0;\n    color: #6b7280;\n    font-size: 16px;\n  }\n\n  @media (max-width: 640px) {\n    .bound-policy-container {\n      padding: 15px;\n    }\n    \n    .detail-grid {\n      grid-template-columns: 1fr;\n    }\n    \n    .bike-info {\n      grid-template-columns: 1fr;\n    }\n    \n    .action-buttons {\n      flex-direction: column;\n    }\n  }\n</style> ","<script>\n  export let currentStep = 2; // BikeInsure starts at step 2 (User Info)\n  export let onStepClick = null; // Callback function for step navigation\n\n  // BikeInsure application steps (excluding Welcome)\n  const steps = [\n    { number: 2, title: \"About You\", subtitle: \"Tell us about yourself\" },\n    { number: 3, title: \"Bike Details\", subtitle: \"Add your bike information\" },\n    { number: 4, title: \"Agreement\", subtitle: \"Review your coverage\" },\n    { number: 5, title: \"Payment\", subtitle: \"Complete your purchase\" },\n  ];\n\n  // Make step statuses reactive\n  $: stepStatuses = steps.map((step) => ({\n    ...step,\n    status: getStepStatus(step.number),\n    isNextStep: step.number === currentStep + 1,\n  }));\n\n  function getStepStatus(stepNumber) {\n    if (stepNumber < currentStep) return \"complete\";\n    if (stepNumber === currentStep) return \"current\";\n    return \"upcoming\";\n  }\n\n  function handleStepClick(stepNumber) {\n    const status = getStepStatus(stepNumber);\n    // Allow clicking completed steps or the next immediate step after current\n    const isNextStep = stepNumber === currentStep + 1;\n    if ((status === \"complete\" || isNextStep) && onStepClick) {\n      onStepClick(stepNumber);\n    }\n  }\n\n  function isClickable(stepNumber) {\n    const status = getStepStatus(stepNumber);\n    const isNextStep = stepNumber === currentStep + 1;\n    return status === \"complete\" || isNextStep;\n  }\n\n  // Debug log to see when currentStep changes\n  $: console.log(\"ProgressBar currentStep:\", currentStep);\n</script>\n\n<div class=\"w-full px-1 md:px-4 py-3 md:py-6\">\n  <div class=\"max-w-4xl mx-auto\" style=\"max-width: 600px;\">\n    <nav aria-label=\"Progress\" class=\"breadcrumb-nav\">\n      <ol class=\"breadcrumb-list\">\n        {#key currentStep}\n          {#each steps as step, index (step.number)}\n            {@const stepStatus = getStepStatus(step.number)}\n            {@const isClickable =\n              stepStatus === \"complete\" || step.number === currentStep + 1}\n            {@const isLast = index === steps.length - 1}\n\n            <li\n              class=\"breadcrumb-item\"\n              class:is-current={stepStatus === \"current\"}\n              class:is-complete={stepStatus === \"complete\"}\n              class:is-last={isLast}\n            >\n              {#if isClickable}\n                <button\n                  type=\"button\"\n                  on:click={() => handleStepClick(step.number)}\n                  class=\"breadcrumb-link\"\n                >\n                  <span class=\"step-title\">{step.title}</span>\n                </button>\n              {:else}\n                <span class=\"breadcrumb-link\">\n                  <span class=\"step-title\">{step.title}</span>\n                </span>\n              {/if}\n            </li>\n          {/each}\n        {/key}\n      </ol>\n    </nav>\n  </div>\n</div>\n\n<style lang=\"scss\">\n  .breadcrumb-nav {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .breadcrumb-list {\n    display: flex;\n    align-items: center;\n    list-style: none;\n    padding: 0;\n    margin: 0;\n    min-width: 100%;\n  }\n\n  .breadcrumb-item {\n    position: relative;\n    display: flex;\n    align-items: stretch;\n    margin-right: -12px; // Overlap for arrow\n    flex: 1;\n    min-height: 48px;\n\n    @media (max-width: 768px) {\n      margin-right: -10px;\n      min-height: 44px;\n    }\n\n    @media (max-width: 640px) {\n      margin-right: -8px;\n      min-height: 40px;\n    }\n\n    &:first-child .breadcrumb-link {\n      border-top-left-radius: 6px;\n      border-bottom-left-radius: 6px;\n    }\n\n    &.is-last {\n      margin-right: 0;\n\n      .breadcrumb-link {\n        border-top-right-radius: 6px;\n        border-bottom-right-radius: 6px;\n      }\n\n      &::before,\n      &::after {\n        display: none;\n      }\n    }\n\n    // CSS Arrow border (gray outline) - using #EEEEEE as separator\n    &::before {\n      content: \"\";\n      position: absolute;\n      right: -1px;\n      top: 0;\n      bottom: 0;\n      margin: auto 0;\n      width: 0;\n      height: 0;\n      border-style: solid;\n      border-width: 24px 0 24px 12px;\n      border-color: transparent transparent transparent #eeeeee;\n      z-index: 2;\n      transition: border-color 0.2s ease;\n\n      @media (max-width: 768px) {\n        border-width: 22px 0 22px 10px;\n      }\n\n      @media (max-width: 640px) {\n        border-width: 20px 0 20px 8px;\n      }\n    }\n\n    // CSS Arrow fill (default white for upcoming steps)\n    &::after {\n      content: \"\";\n      position: absolute;\n      right: 0px;\n      top: 0;\n      bottom: 0;\n      margin: auto 0;\n      width: 0;\n      height: 0;\n      border-style: solid;\n      border-width: 24px 0 24px 12px;\n      border-color: transparent transparent transparent white;\n      z-index: 3;\n      transition: border-color 0.2s ease;\n\n      @media (max-width: 768px) {\n        border-width: 22px 0 22px 10px;\n      }\n\n      @media (max-width: 640px) {\n        border-width: 20px 0 20px 8px;\n      }\n    }\n\n    // Current step arrow color (RED #BD181B)\n    &.is-current::after {\n      border-left-color: #bd181b;\n    }\n\n    // Completed step arrow color (NAVY #001535)\n    &.is-complete::after {\n      border-left-color: #001535;\n    }\n\n    // Keep arrow border as #EEEEEE between completed and active steps\n    // (arrow border stays light gray for visual sResume Applicationeparation)\n  }\n\n  .breadcrumb-link {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    padding: 12px 20px;\n    background: white;\n    border: none;\n    font-size: 14px;\n    font-weight: 500;\n    color: #6b7280;\n    transition: all 0.2s ease;\n    white-space: nowrap;\n    position: relative;\n    z-index: 1;\n    flex: 1;\n    justify-content: center;\n    min-height: 100%;\n\n    @media (max-width: 768px) {\n      padding: 12px 10px;\n      font-size: 12px;\n      gap: 6px;\n    }\n\n    @media (max-width: 640px) {\n      padding: 10px 8px;\n      font-size: 11px;\n      gap: 4px;\n    }\n  }\n\n  button.breadcrumb-link {\n    cursor: pointer;\n\n    &:hover {\n      background: #f9fafb;\n      color: #001535;\n    }\n  }\n\n  // Current step styling (RED #BD181B)\n  .breadcrumb-item.is-current .breadcrumb-link {\n    background: #bd181b;\n    color: white;\n    font-weight: 600;\n  }\n\n  // Completed step styling (NAVY #001535)\n  .breadcrumb-item.is-complete .breadcrumb-link {\n    background: #001535;\n    color: white;\n  }\n\n  .step-title {\n    @media (max-width: 768px) {\n      font-size: 13px;\n    }\n  }\n</style>\n","/**\n * marked v15.0.12 - a markdown parser\n * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n\n// src/defaults.ts\nfunction _getDefaults() {\n  return {\n    async: false,\n    breaks: false,\n    extensions: null,\n    gfm: true,\n    hooks: null,\n    pedantic: false,\n    renderer: null,\n    silent: false,\n    tokenizer: null,\n    walkTokens: null\n  };\n}\nvar _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n  _defaults = newDefaults;\n}\n\n// src/rules.ts\nvar noopTest = { exec: () => null };\nfunction edit(regex, opt = \"\") {\n  let source = typeof regex === \"string\" ? regex : regex.source;\n  const obj = {\n    replace: (name, val) => {\n      let valSource = typeof val === \"string\" ? val : val.source;\n      valSource = valSource.replace(other.caret, \"$1\");\n      source = source.replace(name, valSource);\n      return obj;\n    },\n    getRegex: () => {\n      return new RegExp(source, opt);\n    }\n  };\n  return obj;\n}\nvar other = {\n  codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n  outputLinkReplace: /\\\\([\\[\\]])/g,\n  indentCodeCompensation: /^(\\s+)(?:```)/,\n  beginningSpace: /^\\s+/,\n  endingHash: /#$/,\n  startingSpaceChar: /^ /,\n  endingSpaceChar: / $/,\n  nonSpaceChar: /[^ ]/,\n  newLineCharGlobal: /\\n/g,\n  tabCharGlobal: /\\t/g,\n  multipleSpaceGlobal: /\\s+/g,\n  blankLine: /^[ \\t]*$/,\n  doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n  blockquoteStart: /^ {0,3}>/,\n  blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n  blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n  listReplaceTabs: /^\\t+/,\n  listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n  listIsTask: /^\\[[ xX]\\] /,\n  listReplaceTask: /^\\[[ xX]\\] +/,\n  anyLine: /\\n.*\\n/,\n  hrefBrackets: /^<(.*)>$/,\n  tableDelimiter: /[:|]/,\n  tableAlignChars: /^\\||\\| *$/g,\n  tableRowBlankLine: /\\n[ \\t]*$/,\n  tableAlignRight: /^ *-+: *$/,\n  tableAlignCenter: /^ *:-+: *$/,\n  tableAlignLeft: /^ *:-+ *$/,\n  startATag: /^<a /i,\n  endATag: /^<\\/a>/i,\n  startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n  endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n  startAngleBracket: /^</,\n  endAngleBracket: />$/,\n  pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n  unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n  escapeTest: /[&<>\"']/,\n  escapeReplace: /[&<>\"']/g,\n  escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n  escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n  unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n  caret: /(^|[^\\[])\\^/g,\n  percentDecode: /%25/g,\n  findPipe: /\\|/g,\n  splitPipe: / \\|/,\n  slashPipe: /\\\\\\|/g,\n  carriageReturn: /\\r\\n|\\r/g,\n  spaceLine: /^ +$/gm,\n  notSpaceStart: /^\\S*/,\n  endingNewline: /\\n$/,\n  listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),\n  nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),\n  hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n  fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n  headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n  htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, \"i\")\n};\nvar newline = /^(?:[ \\t]*(?:\\n|$))+/;\nvar blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nvar fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nvar hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nvar heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nvar bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nvar lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nvar lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g, \"\").getRegex();\nvar lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\\n>]+>\\n/).replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex();\nvar _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nvar blockText = /^[^\\n]+/;\nvar _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nvar def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\", _blockLabel).replace(\"title\", /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex();\nvar list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g, bullet).getRegex();\nvar _tag = \"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\";\nvar _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nvar html = edit(\n  \"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\n  \"i\"\n).replace(\"comment\", _comment).replace(\"tag\", _tag).replace(\"attribute\", / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex();\nvar paragraph = edit(_paragraph).replace(\"hr\", hr).replace(\"heading\", \" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\", \"\").replace(\"|table\", \"\").replace(\"blockquote\", \" {0,3}>\").replace(\"fences\", \" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\", \" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\", \"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\", _tag).getRegex();\nvar blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\", paragraph).getRegex();\nvar blockNormal = {\n  blockquote,\n  code: blockCode,\n  def,\n  fences,\n  heading,\n  hr,\n  html,\n  lheading,\n  list,\n  newline,\n  paragraph,\n  table: noopTest,\n  text: blockText\n};\nvar gfmTable = edit(\n  \"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\"\n).replace(\"hr\", hr).replace(\"heading\", \" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\", \" {0,3}>\").replace(\"code\", \"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\", \" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\", \" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\", \"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\", _tag).getRegex();\nvar blockGfm = {\n  ...blockNormal,\n  lheading: lheadingGfm,\n  table: gfmTable,\n  paragraph: edit(_paragraph).replace(\"hr\", hr).replace(\"heading\", \" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\", \"\").replace(\"table\", gfmTable).replace(\"blockquote\", \" {0,3}>\").replace(\"fences\", \" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\", \" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\", \"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\", _tag).getRegex()\n};\nvar blockPedantic = {\n  ...blockNormal,\n  html: edit(\n    `^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`\n  ).replace(\"comment\", _comment).replace(/tag/g, \"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n  heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n  fences: noopTest,\n  // fences not supported\n  lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n  paragraph: edit(_paragraph).replace(\"hr\", hr).replace(\"heading\", \" *#{1,6} *[^\\n]\").replace(\"lheading\", lheading).replace(\"|table\", \"\").replace(\"blockquote\", \" {0,3}>\").replace(\"|fences\", \"\").replace(\"|list\", \"\").replace(\"|html\", \"\").replace(\"|tag\", \"\").getRegex()\n};\nvar escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nvar inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nvar br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nvar inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\nvar _punctuation = /[\\p{P}\\p{S}]/u;\nvar _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nvar _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nvar punctuation = edit(/^((?![*_])punctSpace)/, \"u\").replace(/punctSpace/g, _punctuationOrSpace).getRegex();\nvar _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nvar _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nvar _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\nvar blockSkip = /\\[[^[\\]]*?\\]\\((?:\\\\.|[^\\\\\\(\\)]|\\((?:\\\\.|[^\\\\\\(\\)])*\\))*\\)|`[^`]*?`|<[^<>]*?>/g;\nvar emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/;\nvar emStrongLDelim = edit(emStrongLDelimCore, \"u\").replace(/punct/g, _punctuation).getRegex();\nvar emStrongLDelimGfm = edit(emStrongLDelimCore, \"u\").replace(/punct/g, _punctuationGfmStrongEm).getRegex();\nvar emStrongRDelimAstCore = \"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\";\nvar emStrongRDelimAst = edit(emStrongRDelimAstCore, \"gu\").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();\nvar emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, \"gu\").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex();\nvar emStrongRDelimUnd = edit(\n  \"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\n  \"gu\"\n).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();\nvar anyPunctuation = edit(/\\\\(punct)/, \"gu\").replace(/punct/g, _punctuation).getRegex();\nvar autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();\nvar _inlineComment = edit(_comment).replace(\"(?:-->|$)\", \"-->\").getRegex();\nvar tag = edit(\n  \"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\"\n).replace(\"comment\", _inlineComment).replace(\"attribute\", /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex();\nvar _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nvar link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\", _inlineLabel).replace(\"href\", /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\", /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex();\nvar reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\", _inlineLabel).replace(\"ref\", _blockLabel).getRegex();\nvar nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\", _blockLabel).getRegex();\nvar reflinkSearch = edit(\"reflink|nolink(?!\\\\()\", \"g\").replace(\"reflink\", reflink).replace(\"nolink\", nolink).getRegex();\nvar inlineNormal = {\n  _backpedal: noopTest,\n  // only used for GFM url\n  anyPunctuation,\n  autolink,\n  blockSkip,\n  br,\n  code: inlineCode,\n  del: noopTest,\n  emStrongLDelim,\n  emStrongRDelimAst,\n  emStrongRDelimUnd,\n  escape,\n  link,\n  nolink,\n  punctuation,\n  reflink,\n  reflinkSearch,\n  tag,\n  text: inlineText,\n  url: noopTest\n};\nvar inlinePedantic = {\n  ...inlineNormal,\n  link: edit(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\", _inlineLabel).getRegex(),\n  reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\", _inlineLabel).getRegex()\n};\nvar inlineGfm = {\n  ...inlineNormal,\n  emStrongRDelimAst: emStrongRDelimAstGfm,\n  emStrongLDelim: emStrongLDelimGfm,\n  url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, \"i\").replace(\"email\", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),\n  _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n  del: /^(~~?)(?=[^\\s~])((?:\\\\.|[^\\\\])*?(?:\\\\.|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n  text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\nvar inlineBreaks = {\n  ...inlineGfm,\n  br: edit(br).replace(\"{2,}\", \"*\").getRegex(),\n  text: edit(inlineGfm.text).replace(\"\\\\b_\", \"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g, \"*\").getRegex()\n};\nvar block = {\n  normal: blockNormal,\n  gfm: blockGfm,\n  pedantic: blockPedantic\n};\nvar inline = {\n  normal: inlineNormal,\n  gfm: inlineGfm,\n  breaks: inlineBreaks,\n  pedantic: inlinePedantic\n};\n\n// src/helpers.ts\nvar escapeReplacements = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#39;\"\n};\nvar getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape2(html2, encode) {\n  if (encode) {\n    if (other.escapeTest.test(html2)) {\n      return html2.replace(other.escapeReplace, getEscapeReplacement);\n    }\n  } else {\n    if (other.escapeTestNoEncode.test(html2)) {\n      return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n    }\n  }\n  return html2;\n}\nfunction cleanUrl(href) {\n  try {\n    href = encodeURI(href).replace(other.percentDecode, \"%\");\n  } catch {\n    return null;\n  }\n  return href;\n}\nfunction splitCells(tableRow, count) {\n  const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n    let escaped = false;\n    let curr = offset;\n    while (--curr >= 0 && str[curr] === \"\\\\\") escaped = !escaped;\n    if (escaped) {\n      return \"|\";\n    } else {\n      return \" |\";\n    }\n  }), cells = row.split(other.splitPipe);\n  let i = 0;\n  if (!cells[0].trim()) {\n    cells.shift();\n  }\n  if (cells.length > 0 && !cells.at(-1)?.trim()) {\n    cells.pop();\n  }\n  if (count) {\n    if (cells.length > count) {\n      cells.splice(count);\n    } else {\n      while (cells.length < count) cells.push(\"\");\n    }\n  }\n  for (; i < cells.length; i++) {\n    cells[i] = cells[i].trim().replace(other.slashPipe, \"|\");\n  }\n  return cells;\n}\nfunction rtrim(str, c, invert) {\n  const l = str.length;\n  if (l === 0) {\n    return \"\";\n  }\n  let suffLen = 0;\n  while (suffLen < l) {\n    const currChar = str.charAt(l - suffLen - 1);\n    if (currChar === c && !invert) {\n      suffLen++;\n    } else if (currChar !== c && invert) {\n      suffLen++;\n    } else {\n      break;\n    }\n  }\n  return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n  if (str.indexOf(b[1]) === -1) {\n    return -1;\n  }\n  let level = 0;\n  for (let i = 0; i < str.length; i++) {\n    if (str[i] === \"\\\\\") {\n      i++;\n    } else if (str[i] === b[0]) {\n      level++;\n    } else if (str[i] === b[1]) {\n      level--;\n      if (level < 0) {\n        return i;\n      }\n    }\n  }\n  if (level > 0) {\n    return -2;\n  }\n  return -1;\n}\n\n// src/Tokenizer.ts\nfunction outputLink(cap, link2, raw, lexer2, rules) {\n  const href = link2.href;\n  const title = link2.title || null;\n  const text = cap[1].replace(rules.other.outputLinkReplace, \"$1\");\n  lexer2.state.inLink = true;\n  const token = {\n    type: cap[0].charAt(0) === \"!\" ? \"image\" : \"link\",\n    raw,\n    href,\n    title,\n    text,\n    tokens: lexer2.inlineTokens(text)\n  };\n  lexer2.state.inLink = false;\n  return token;\n}\nfunction indentCodeCompensation(raw, text, rules) {\n  const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n  if (matchIndentToCode === null) {\n    return text;\n  }\n  const indentToCode = matchIndentToCode[1];\n  return text.split(\"\\n\").map((node) => {\n    const matchIndentInNode = node.match(rules.other.beginningSpace);\n    if (matchIndentInNode === null) {\n      return node;\n    }\n    const [indentInNode] = matchIndentInNode;\n    if (indentInNode.length >= indentToCode.length) {\n      return node.slice(indentToCode.length);\n    }\n    return node;\n  }).join(\"\\n\");\n}\nvar _Tokenizer = class {\n  options;\n  rules;\n  // set by the lexer\n  lexer;\n  // set by the lexer\n  constructor(options2) {\n    this.options = options2 || _defaults;\n  }\n  space(src) {\n    const cap = this.rules.block.newline.exec(src);\n    if (cap && cap[0].length > 0) {\n      return {\n        type: \"space\",\n        raw: cap[0]\n      };\n    }\n  }\n  code(src) {\n    const cap = this.rules.block.code.exec(src);\n    if (cap) {\n      const text = cap[0].replace(this.rules.other.codeRemoveIndent, \"\");\n      return {\n        type: \"code\",\n        raw: cap[0],\n        codeBlockStyle: \"indented\",\n        text: !this.options.pedantic ? rtrim(text, \"\\n\") : text\n      };\n    }\n  }\n  fences(src) {\n    const cap = this.rules.block.fences.exec(src);\n    if (cap) {\n      const raw = cap[0];\n      const text = indentCodeCompensation(raw, cap[3] || \"\", this.rules);\n      return {\n        type: \"code\",\n        raw,\n        lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, \"$1\") : cap[2],\n        text\n      };\n    }\n  }\n  heading(src) {\n    const cap = this.rules.block.heading.exec(src);\n    if (cap) {\n      let text = cap[2].trim();\n      if (this.rules.other.endingHash.test(text)) {\n        const trimmed = rtrim(text, \"#\");\n        if (this.options.pedantic) {\n          text = trimmed.trim();\n        } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n          text = trimmed.trim();\n        }\n      }\n      return {\n        type: \"heading\",\n        raw: cap[0],\n        depth: cap[1].length,\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n  hr(src) {\n    const cap = this.rules.block.hr.exec(src);\n    if (cap) {\n      return {\n        type: \"hr\",\n        raw: rtrim(cap[0], \"\\n\")\n      };\n    }\n  }\n  blockquote(src) {\n    const cap = this.rules.block.blockquote.exec(src);\n    if (cap) {\n      let lines = rtrim(cap[0], \"\\n\").split(\"\\n\");\n      let raw = \"\";\n      let text = \"\";\n      const tokens = [];\n      while (lines.length > 0) {\n        let inBlockquote = false;\n        const currentLines = [];\n        let i;\n        for (i = 0; i < lines.length; i++) {\n          if (this.rules.other.blockquoteStart.test(lines[i])) {\n            currentLines.push(lines[i]);\n            inBlockquote = true;\n          } else if (!inBlockquote) {\n            currentLines.push(lines[i]);\n          } else {\n            break;\n          }\n        }\n        lines = lines.slice(i);\n        const currentRaw = currentLines.join(\"\\n\");\n        const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, \"\\n    $1\").replace(this.rules.other.blockquoteSetextReplace2, \"\");\n        raw = raw ? `${raw}\n${currentRaw}` : currentRaw;\n        text = text ? `${text}\n${currentText}` : currentText;\n        const top = this.lexer.state.top;\n        this.lexer.state.top = true;\n        this.lexer.blockTokens(currentText, tokens, true);\n        this.lexer.state.top = top;\n        if (lines.length === 0) {\n          break;\n        }\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === \"code\") {\n          break;\n        } else if (lastToken?.type === \"blockquote\") {\n          const oldToken = lastToken;\n          const newText = oldToken.raw + \"\\n\" + lines.join(\"\\n\");\n          const newToken = this.blockquote(newText);\n          tokens[tokens.length - 1] = newToken;\n          raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n          text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n          break;\n        } else if (lastToken?.type === \"list\") {\n          const oldToken = lastToken;\n          const newText = oldToken.raw + \"\\n\" + lines.join(\"\\n\");\n          const newToken = this.list(newText);\n          tokens[tokens.length - 1] = newToken;\n          raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n          text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n          lines = newText.substring(tokens.at(-1).raw.length).split(\"\\n\");\n          continue;\n        }\n      }\n      return {\n        type: \"blockquote\",\n        raw,\n        tokens,\n        text\n      };\n    }\n  }\n  list(src) {\n    let cap = this.rules.block.list.exec(src);\n    if (cap) {\n      let bull = cap[1].trim();\n      const isordered = bull.length > 1;\n      const list2 = {\n        type: \"list\",\n        raw: \"\",\n        ordered: isordered,\n        start: isordered ? +bull.slice(0, -1) : \"\",\n        loose: false,\n        items: []\n      };\n      bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n      if (this.options.pedantic) {\n        bull = isordered ? bull : \"[*+-]\";\n      }\n      const itemRegex = this.rules.other.listItemRegex(bull);\n      let endsWithBlankLine = false;\n      while (src) {\n        let endEarly = false;\n        let raw = \"\";\n        let itemContents = \"\";\n        if (!(cap = itemRegex.exec(src))) {\n          break;\n        }\n        if (this.rules.block.hr.test(src)) {\n          break;\n        }\n        raw = cap[0];\n        src = src.substring(raw.length);\n        let line = cap[2].split(\"\\n\", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => \" \".repeat(3 * t.length));\n        let nextLine = src.split(\"\\n\", 1)[0];\n        let blankLine = !line.trim();\n        let indent = 0;\n        if (this.options.pedantic) {\n          indent = 2;\n          itemContents = line.trimStart();\n        } else if (blankLine) {\n          indent = cap[1].length + 1;\n        } else {\n          indent = cap[2].search(this.rules.other.nonSpaceChar);\n          indent = indent > 4 ? 1 : indent;\n          itemContents = line.slice(indent);\n          indent += cap[1].length;\n        }\n        if (blankLine && this.rules.other.blankLine.test(nextLine)) {\n          raw += nextLine + \"\\n\";\n          src = src.substring(nextLine.length + 1);\n          endEarly = true;\n        }\n        if (!endEarly) {\n          const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n          const hrRegex = this.rules.other.hrRegex(indent);\n          const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n          const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n          const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n          while (src) {\n            const rawLine = src.split(\"\\n\", 1)[0];\n            let nextLineWithoutTabs;\n            nextLine = rawLine;\n            if (this.options.pedantic) {\n              nextLine = nextLine.replace(this.rules.other.listReplaceNesting, \"  \");\n              nextLineWithoutTabs = nextLine;\n            } else {\n              nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, \"    \");\n            }\n            if (fencesBeginRegex.test(nextLine)) {\n              break;\n            }\n            if (headingBeginRegex.test(nextLine)) {\n              break;\n            }\n            if (htmlBeginRegex.test(nextLine)) {\n              break;\n            }\n            if (nextBulletRegex.test(nextLine)) {\n              break;\n            }\n            if (hrRegex.test(nextLine)) {\n              break;\n            }\n            if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) {\n              itemContents += \"\\n\" + nextLineWithoutTabs.slice(indent);\n            } else {\n              if (blankLine) {\n                break;\n              }\n              if (line.replace(this.rules.other.tabCharGlobal, \"    \").search(this.rules.other.nonSpaceChar) >= 4) {\n                break;\n              }\n              if (fencesBeginRegex.test(line)) {\n                break;\n              }\n              if (headingBeginRegex.test(line)) {\n                break;\n              }\n              if (hrRegex.test(line)) {\n                break;\n              }\n              itemContents += \"\\n\" + nextLine;\n            }\n            if (!blankLine && !nextLine.trim()) {\n              blankLine = true;\n            }\n            raw += rawLine + \"\\n\";\n            src = src.substring(rawLine.length + 1);\n            line = nextLineWithoutTabs.slice(indent);\n          }\n        }\n        if (!list2.loose) {\n          if (endsWithBlankLine) {\n            list2.loose = true;\n          } else if (this.rules.other.doubleBlankLine.test(raw)) {\n            endsWithBlankLine = true;\n          }\n        }\n        let istask = null;\n        let ischecked;\n        if (this.options.gfm) {\n          istask = this.rules.other.listIsTask.exec(itemContents);\n          if (istask) {\n            ischecked = istask[0] !== \"[ ] \";\n            itemContents = itemContents.replace(this.rules.other.listReplaceTask, \"\");\n          }\n        }\n        list2.items.push({\n          type: \"list_item\",\n          raw,\n          task: !!istask,\n          checked: ischecked,\n          loose: false,\n          text: itemContents,\n          tokens: []\n        });\n        list2.raw += raw;\n      }\n      const lastItem = list2.items.at(-1);\n      if (lastItem) {\n        lastItem.raw = lastItem.raw.trimEnd();\n        lastItem.text = lastItem.text.trimEnd();\n      } else {\n        return;\n      }\n      list2.raw = list2.raw.trimEnd();\n      for (let i = 0; i < list2.items.length; i++) {\n        this.lexer.state.top = false;\n        list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []);\n        if (!list2.loose) {\n          const spacers = list2.items[i].tokens.filter((t) => t.type === \"space\");\n          const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw));\n          list2.loose = hasMultipleLineBreaks;\n        }\n      }\n      if (list2.loose) {\n        for (let i = 0; i < list2.items.length; i++) {\n          list2.items[i].loose = true;\n        }\n      }\n      return list2;\n    }\n  }\n  html(src) {\n    const cap = this.rules.block.html.exec(src);\n    if (cap) {\n      const token = {\n        type: \"html\",\n        block: true,\n        raw: cap[0],\n        pre: cap[1] === \"pre\" || cap[1] === \"script\" || cap[1] === \"style\",\n        text: cap[0]\n      };\n      return token;\n    }\n  }\n  def(src) {\n    const cap = this.rules.block.def.exec(src);\n    if (cap) {\n      const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, \" \");\n      const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, \"$1\").replace(this.rules.inline.anyPunctuation, \"$1\") : \"\";\n      const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, \"$1\") : cap[3];\n      return {\n        type: \"def\",\n        tag: tag2,\n        raw: cap[0],\n        href,\n        title\n      };\n    }\n  }\n  table(src) {\n    const cap = this.rules.block.table.exec(src);\n    if (!cap) {\n      return;\n    }\n    if (!this.rules.other.tableDelimiter.test(cap[2])) {\n      return;\n    }\n    const headers = splitCells(cap[1]);\n    const aligns = cap[2].replace(this.rules.other.tableAlignChars, \"\").split(\"|\");\n    const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, \"\").split(\"\\n\") : [];\n    const item = {\n      type: \"table\",\n      raw: cap[0],\n      header: [],\n      align: [],\n      rows: []\n    };\n    if (headers.length !== aligns.length) {\n      return;\n    }\n    for (const align of aligns) {\n      if (this.rules.other.tableAlignRight.test(align)) {\n        item.align.push(\"right\");\n      } else if (this.rules.other.tableAlignCenter.test(align)) {\n        item.align.push(\"center\");\n      } else if (this.rules.other.tableAlignLeft.test(align)) {\n        item.align.push(\"left\");\n      } else {\n        item.align.push(null);\n      }\n    }\n    for (let i = 0; i < headers.length; i++) {\n      item.header.push({\n        text: headers[i],\n        tokens: this.lexer.inline(headers[i]),\n        header: true,\n        align: item.align[i]\n      });\n    }\n    for (const row of rows) {\n      item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n        return {\n          text: cell,\n          tokens: this.lexer.inline(cell),\n          header: false,\n          align: item.align[i]\n        };\n      }));\n    }\n    return item;\n  }\n  lheading(src) {\n    const cap = this.rules.block.lheading.exec(src);\n    if (cap) {\n      return {\n        type: \"heading\",\n        raw: cap[0],\n        depth: cap[2].charAt(0) === \"=\" ? 1 : 2,\n        text: cap[1],\n        tokens: this.lexer.inline(cap[1])\n      };\n    }\n  }\n  paragraph(src) {\n    const cap = this.rules.block.paragraph.exec(src);\n    if (cap) {\n      const text = cap[1].charAt(cap[1].length - 1) === \"\\n\" ? cap[1].slice(0, -1) : cap[1];\n      return {\n        type: \"paragraph\",\n        raw: cap[0],\n        text,\n        tokens: this.lexer.inline(text)\n      };\n    }\n  }\n  text(src) {\n    const cap = this.rules.block.text.exec(src);\n    if (cap) {\n      return {\n        type: \"text\",\n        raw: cap[0],\n        text: cap[0],\n        tokens: this.lexer.inline(cap[0])\n      };\n    }\n  }\n  escape(src) {\n    const cap = this.rules.inline.escape.exec(src);\n    if (cap) {\n      return {\n        type: \"escape\",\n        raw: cap[0],\n        text: cap[1]\n      };\n    }\n  }\n  tag(src) {\n    const cap = this.rules.inline.tag.exec(src);\n    if (cap) {\n      if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n        this.lexer.state.inLink = true;\n      } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n        this.lexer.state.inLink = false;\n      }\n      if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n        this.lexer.state.inRawBlock = true;\n      } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n        this.lexer.state.inRawBlock = false;\n      }\n      return {\n        type: \"html\",\n        raw: cap[0],\n        inLink: this.lexer.state.inLink,\n        inRawBlock: this.lexer.state.inRawBlock,\n        block: false,\n        text: cap[0]\n      };\n    }\n  }\n  link(src) {\n    const cap = this.rules.inline.link.exec(src);\n    if (cap) {\n      const trimmedUrl = cap[2].trim();\n      if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n        if (!this.rules.other.endAngleBracket.test(trimmedUrl)) {\n          return;\n        }\n        const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), \"\\\\\");\n        if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n          return;\n        }\n      } else {\n        const lastParenIndex = findClosingBracket(cap[2], \"()\");\n        if (lastParenIndex === -2) {\n          return;\n        }\n        if (lastParenIndex > -1) {\n          const start = cap[0].indexOf(\"!\") === 0 ? 5 : 4;\n          const linkLen = start + cap[1].length + lastParenIndex;\n          cap[2] = cap[2].substring(0, lastParenIndex);\n          cap[0] = cap[0].substring(0, linkLen).trim();\n          cap[3] = \"\";\n        }\n      }\n      let href = cap[2];\n      let title = \"\";\n      if (this.options.pedantic) {\n        const link2 = this.rules.other.pedanticHrefTitle.exec(href);\n        if (link2) {\n          href = link2[1];\n          title = link2[3];\n        }\n      } else {\n        title = cap[3] ? cap[3].slice(1, -1) : \"\";\n      }\n      href = href.trim();\n      if (this.rules.other.startAngleBracket.test(href)) {\n        if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) {\n          href = href.slice(1);\n        } else {\n          href = href.slice(1, -1);\n        }\n      }\n      return outputLink(cap, {\n        href: href ? href.replace(this.rules.inline.anyPunctuation, \"$1\") : href,\n        title: title ? title.replace(this.rules.inline.anyPunctuation, \"$1\") : title\n      }, cap[0], this.lexer, this.rules);\n    }\n  }\n  reflink(src, links) {\n    let cap;\n    if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {\n      const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, \" \");\n      const link2 = links[linkString.toLowerCase()];\n      if (!link2) {\n        const text = cap[0].charAt(0);\n        return {\n          type: \"text\",\n          raw: text,\n          text\n        };\n      }\n      return outputLink(cap, link2, cap[0], this.lexer, this.rules);\n    }\n  }\n  emStrong(src, maskedSrc, prevChar = \"\") {\n    let match = this.rules.inline.emStrongLDelim.exec(src);\n    if (!match) return;\n    if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n    const nextChar = match[1] || match[2] || \"\";\n    if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n      const lLength = [...match[0]].length - 1;\n      let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n      const endReg = match[0][0] === \"*\" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n      endReg.lastIndex = 0;\n      maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n      while ((match = endReg.exec(maskedSrc)) != null) {\n        rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n        if (!rDelim) continue;\n        rLength = [...rDelim].length;\n        if (match[3] || match[4]) {\n          delimTotal += rLength;\n          continue;\n        } else if (match[5] || match[6]) {\n          if (lLength % 3 && !((lLength + rLength) % 3)) {\n            midDelimTotal += rLength;\n            continue;\n          }\n        }\n        delimTotal -= rLength;\n        if (delimTotal > 0) continue;\n        rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n        const lastCharLength = [...match[0]][0].length;\n        const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n        if (Math.min(lLength, rLength) % 2) {\n          const text2 = raw.slice(1, -1);\n          return {\n            type: \"em\",\n            raw,\n            text: text2,\n            tokens: this.lexer.inlineTokens(text2)\n          };\n        }\n        const text = raw.slice(2, -2);\n        return {\n          type: \"strong\",\n          raw,\n          text,\n          tokens: this.lexer.inlineTokens(text)\n        };\n      }\n    }\n  }\n  codespan(src) {\n    const cap = this.rules.inline.code.exec(src);\n    if (cap) {\n      let text = cap[2].replace(this.rules.other.newLineCharGlobal, \" \");\n      const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n      const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n      if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n        text = text.substring(1, text.length - 1);\n      }\n      return {\n        type: \"codespan\",\n        raw: cap[0],\n        text\n      };\n    }\n  }\n  br(src) {\n    const cap = this.rules.inline.br.exec(src);\n    if (cap) {\n      return {\n        type: \"br\",\n        raw: cap[0]\n      };\n    }\n  }\n  del(src) {\n    const cap = this.rules.inline.del.exec(src);\n    if (cap) {\n      return {\n        type: \"del\",\n        raw: cap[0],\n        text: cap[2],\n        tokens: this.lexer.inlineTokens(cap[2])\n      };\n    }\n  }\n  autolink(src) {\n    const cap = this.rules.inline.autolink.exec(src);\n    if (cap) {\n      let text, href;\n      if (cap[2] === \"@\") {\n        text = cap[1];\n        href = \"mailto:\" + text;\n      } else {\n        text = cap[1];\n        href = text;\n      }\n      return {\n        type: \"link\",\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: \"text\",\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n  url(src) {\n    let cap;\n    if (cap = this.rules.inline.url.exec(src)) {\n      let text, href;\n      if (cap[2] === \"@\") {\n        text = cap[0];\n        href = \"mailto:\" + text;\n      } else {\n        let prevCapZero;\n        do {\n          prevCapZero = cap[0];\n          cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? \"\";\n        } while (prevCapZero !== cap[0]);\n        text = cap[0];\n        if (cap[1] === \"www.\") {\n          href = \"http://\" + cap[0];\n        } else {\n          href = cap[0];\n        }\n      }\n      return {\n        type: \"link\",\n        raw: cap[0],\n        text,\n        href,\n        tokens: [\n          {\n            type: \"text\",\n            raw: text,\n            text\n          }\n        ]\n      };\n    }\n  }\n  inlineText(src) {\n    const cap = this.rules.inline.text.exec(src);\n    if (cap) {\n      const escaped = this.lexer.state.inRawBlock;\n      return {\n        type: \"text\",\n        raw: cap[0],\n        text: cap[0],\n        escaped\n      };\n    }\n  }\n};\n\n// src/Lexer.ts\nvar _Lexer = class __Lexer {\n  tokens;\n  options;\n  state;\n  tokenizer;\n  inlineQueue;\n  constructor(options2) {\n    this.tokens = [];\n    this.tokens.links = /* @__PURE__ */ Object.create(null);\n    this.options = options2 || _defaults;\n    this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n    this.tokenizer = this.options.tokenizer;\n    this.tokenizer.options = this.options;\n    this.tokenizer.lexer = this;\n    this.inlineQueue = [];\n    this.state = {\n      inLink: false,\n      inRawBlock: false,\n      top: true\n    };\n    const rules = {\n      other,\n      block: block.normal,\n      inline: inline.normal\n    };\n    if (this.options.pedantic) {\n      rules.block = block.pedantic;\n      rules.inline = inline.pedantic;\n    } else if (this.options.gfm) {\n      rules.block = block.gfm;\n      if (this.options.breaks) {\n        rules.inline = inline.breaks;\n      } else {\n        rules.inline = inline.gfm;\n      }\n    }\n    this.tokenizer.rules = rules;\n  }\n  /**\n   * Expose Rules\n   */\n  static get rules() {\n    return {\n      block,\n      inline\n    };\n  }\n  /**\n   * Static Lex Method\n   */\n  static lex(src, options2) {\n    const lexer2 = new __Lexer(options2);\n    return lexer2.lex(src);\n  }\n  /**\n   * Static Lex Inline Method\n   */\n  static lexInline(src, options2) {\n    const lexer2 = new __Lexer(options2);\n    return lexer2.inlineTokens(src);\n  }\n  /**\n   * Preprocessing\n   */\n  lex(src) {\n    src = src.replace(other.carriageReturn, \"\\n\");\n    this.blockTokens(src, this.tokens);\n    for (let i = 0; i < this.inlineQueue.length; i++) {\n      const next = this.inlineQueue[i];\n      this.inlineTokens(next.src, next.tokens);\n    }\n    this.inlineQueue = [];\n    return this.tokens;\n  }\n  blockTokens(src, tokens = [], lastParagraphClipped = false) {\n    if (this.options.pedantic) {\n      src = src.replace(other.tabCharGlobal, \"    \").replace(other.spaceLine, \"\");\n    }\n    while (src) {\n      let token;\n      if (this.options.extensions?.block?.some((extTokenizer) => {\n        if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n      if (token = this.tokenizer.space(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (token.raw.length === 1 && lastToken !== void 0) {\n          lastToken.raw += \"\\n\";\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (token = this.tokenizer.code(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === \"paragraph\" || lastToken?.type === \"text\") {\n          lastToken.raw += \"\\n\" + token.raw;\n          lastToken.text += \"\\n\" + token.text;\n          this.inlineQueue.at(-1).src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (token = this.tokenizer.fences(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.heading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.hr(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.blockquote(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.list(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.html(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.def(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === \"paragraph\" || lastToken?.type === \"text\") {\n          lastToken.raw += \"\\n\" + token.raw;\n          lastToken.text += \"\\n\" + token.raw;\n          this.inlineQueue.at(-1).src = lastToken.text;\n        } else if (!this.tokens.links[token.tag]) {\n          this.tokens.links[token.tag] = {\n            href: token.href,\n            title: token.title\n          };\n        }\n        continue;\n      }\n      if (token = this.tokenizer.table(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.lheading(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      let cutSrc = src;\n      if (this.options.extensions?.startBlock) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startBlock.forEach((getStartIndex) => {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === \"number\" && tempStart >= 0) {\n            startIndex = Math.min(startIndex, tempStart);\n          }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n        const lastToken = tokens.at(-1);\n        if (lastParagraphClipped && lastToken?.type === \"paragraph\") {\n          lastToken.raw += \"\\n\" + token.raw;\n          lastToken.text += \"\\n\" + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue.at(-1).src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        lastParagraphClipped = cutSrc.length !== src.length;\n        src = src.substring(token.raw.length);\n        continue;\n      }\n      if (token = this.tokenizer.text(src)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === \"text\") {\n          lastToken.raw += \"\\n\" + token.raw;\n          lastToken.text += \"\\n\" + token.text;\n          this.inlineQueue.pop();\n          this.inlineQueue.at(-1).src = lastToken.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (src) {\n        const errMsg = \"Infinite loop on byte: \" + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n    this.state.top = true;\n    return tokens;\n  }\n  inline(src, tokens = []) {\n    this.inlineQueue.push({ src, tokens });\n    return tokens;\n  }\n  /**\n   * Lexing/Compiling\n   */\n  inlineTokens(src, tokens = []) {\n    let maskedSrc = src;\n    let match = null;\n    if (this.tokens.links) {\n      const links = Object.keys(this.tokens.links);\n      if (links.length > 0) {\n        while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n          if (links.includes(match[0].slice(match[0].lastIndexOf(\"[\") + 1, -1))) {\n            maskedSrc = maskedSrc.slice(0, match.index) + \"[\" + \"a\".repeat(match[0].length - 2) + \"]\" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n          }\n        }\n      }\n    }\n    while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + \"++\" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n    }\n    while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n      maskedSrc = maskedSrc.slice(0, match.index) + \"[\" + \"a\".repeat(match[0].length - 2) + \"]\" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n    }\n    let keepPrevChar = false;\n    let prevChar = \"\";\n    while (src) {\n      if (!keepPrevChar) {\n        prevChar = \"\";\n      }\n      keepPrevChar = false;\n      let token;\n      if (this.options.extensions?.inline?.some((extTokenizer) => {\n        if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n          src = src.substring(token.raw.length);\n          tokens.push(token);\n          return true;\n        }\n        return false;\n      })) {\n        continue;\n      }\n      if (token = this.tokenizer.escape(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.tag(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.link(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n        src = src.substring(token.raw.length);\n        const lastToken = tokens.at(-1);\n        if (token.type === \"text\" && lastToken?.type === \"text\") {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.codespan(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.br(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.del(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (token = this.tokenizer.autolink(src)) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n        src = src.substring(token.raw.length);\n        tokens.push(token);\n        continue;\n      }\n      let cutSrc = src;\n      if (this.options.extensions?.startInline) {\n        let startIndex = Infinity;\n        const tempSrc = src.slice(1);\n        let tempStart;\n        this.options.extensions.startInline.forEach((getStartIndex) => {\n          tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n          if (typeof tempStart === \"number\" && tempStart >= 0) {\n            startIndex = Math.min(startIndex, tempStart);\n          }\n        });\n        if (startIndex < Infinity && startIndex >= 0) {\n          cutSrc = src.substring(0, startIndex + 1);\n        }\n      }\n      if (token = this.tokenizer.inlineText(cutSrc)) {\n        src = src.substring(token.raw.length);\n        if (token.raw.slice(-1) !== \"_\") {\n          prevChar = token.raw.slice(-1);\n        }\n        keepPrevChar = true;\n        const lastToken = tokens.at(-1);\n        if (lastToken?.type === \"text\") {\n          lastToken.raw += token.raw;\n          lastToken.text += token.text;\n        } else {\n          tokens.push(token);\n        }\n        continue;\n      }\n      if (src) {\n        const errMsg = \"Infinite loop on byte: \" + src.charCodeAt(0);\n        if (this.options.silent) {\n          console.error(errMsg);\n          break;\n        } else {\n          throw new Error(errMsg);\n        }\n      }\n    }\n    return tokens;\n  }\n};\n\n// src/Renderer.ts\nvar _Renderer = class {\n  options;\n  parser;\n  // set by the parser\n  constructor(options2) {\n    this.options = options2 || _defaults;\n  }\n  space(token) {\n    return \"\";\n  }\n  code({ text, lang, escaped }) {\n    const langString = (lang || \"\").match(other.notSpaceStart)?.[0];\n    const code = text.replace(other.endingNewline, \"\") + \"\\n\";\n    if (!langString) {\n      return \"<pre><code>\" + (escaped ? code : escape2(code, true)) + \"</code></pre>\\n\";\n    }\n    return '<pre><code class=\"language-' + escape2(langString) + '\">' + (escaped ? code : escape2(code, true)) + \"</code></pre>\\n\";\n  }\n  blockquote({ tokens }) {\n    const body = this.parser.parse(tokens);\n    return `<blockquote>\n${body}</blockquote>\n`;\n  }\n  html({ text }) {\n    return text;\n  }\n  heading({ tokens, depth }) {\n    return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\n`;\n  }\n  hr(token) {\n    return \"<hr>\\n\";\n  }\n  list(token) {\n    const ordered = token.ordered;\n    const start = token.start;\n    let body = \"\";\n    for (let j = 0; j < token.items.length; j++) {\n      const item = token.items[j];\n      body += this.listitem(item);\n    }\n    const type = ordered ? \"ol\" : \"ul\";\n    const startAttr = ordered && start !== 1 ? ' start=\"' + start + '\"' : \"\";\n    return \"<\" + type + startAttr + \">\\n\" + body + \"</\" + type + \">\\n\";\n  }\n  listitem(item) {\n    let itemBody = \"\";\n    if (item.task) {\n      const checkbox = this.checkbox({ checked: !!item.checked });\n      if (item.loose) {\n        if (item.tokens[0]?.type === \"paragraph\") {\n          item.tokens[0].text = checkbox + \" \" + item.tokens[0].text;\n          if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === \"text\") {\n            item.tokens[0].tokens[0].text = checkbox + \" \" + escape2(item.tokens[0].tokens[0].text);\n            item.tokens[0].tokens[0].escaped = true;\n          }\n        } else {\n          item.tokens.unshift({\n            type: \"text\",\n            raw: checkbox + \" \",\n            text: checkbox + \" \",\n            escaped: true\n          });\n        }\n      } else {\n        itemBody += checkbox + \" \";\n      }\n    }\n    itemBody += this.parser.parse(item.tokens, !!item.loose);\n    return `<li>${itemBody}</li>\n`;\n  }\n  checkbox({ checked }) {\n    return \"<input \" + (checked ? 'checked=\"\" ' : \"\") + 'disabled=\"\" type=\"checkbox\">';\n  }\n  paragraph({ tokens }) {\n    return `<p>${this.parser.parseInline(tokens)}</p>\n`;\n  }\n  table(token) {\n    let header = \"\";\n    let cell = \"\";\n    for (let j = 0; j < token.header.length; j++) {\n      cell += this.tablecell(token.header[j]);\n    }\n    header += this.tablerow({ text: cell });\n    let body = \"\";\n    for (let j = 0; j < token.rows.length; j++) {\n      const row = token.rows[j];\n      cell = \"\";\n      for (let k = 0; k < row.length; k++) {\n        cell += this.tablecell(row[k]);\n      }\n      body += this.tablerow({ text: cell });\n    }\n    if (body) body = `<tbody>${body}</tbody>`;\n    return \"<table>\\n<thead>\\n\" + header + \"</thead>\\n\" + body + \"</table>\\n\";\n  }\n  tablerow({ text }) {\n    return `<tr>\n${text}</tr>\n`;\n  }\n  tablecell(token) {\n    const content = this.parser.parseInline(token.tokens);\n    const type = token.header ? \"th\" : \"td\";\n    const tag2 = token.align ? `<${type} align=\"${token.align}\">` : `<${type}>`;\n    return tag2 + content + `</${type}>\n`;\n  }\n  /**\n   * span level renderer\n   */\n  strong({ tokens }) {\n    return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n  }\n  em({ tokens }) {\n    return `<em>${this.parser.parseInline(tokens)}</em>`;\n  }\n  codespan({ text }) {\n    return `<code>${escape2(text, true)}</code>`;\n  }\n  br(token) {\n    return \"<br>\";\n  }\n  del({ tokens }) {\n    return `<del>${this.parser.parseInline(tokens)}</del>`;\n  }\n  link({ href, title, tokens }) {\n    const text = this.parser.parseInline(tokens);\n    const cleanHref = cleanUrl(href);\n    if (cleanHref === null) {\n      return text;\n    }\n    href = cleanHref;\n    let out = '<a href=\"' + href + '\"';\n    if (title) {\n      out += ' title=\"' + escape2(title) + '\"';\n    }\n    out += \">\" + text + \"</a>\";\n    return out;\n  }\n  image({ href, title, text, tokens }) {\n    if (tokens) {\n      text = this.parser.parseInline(tokens, this.parser.textRenderer);\n    }\n    const cleanHref = cleanUrl(href);\n    if (cleanHref === null) {\n      return escape2(text);\n    }\n    href = cleanHref;\n    let out = `<img src=\"${href}\" alt=\"${text}\"`;\n    if (title) {\n      out += ` title=\"${escape2(title)}\"`;\n    }\n    out += \">\";\n    return out;\n  }\n  text(token) {\n    return \"tokens\" in token && token.tokens ? this.parser.parseInline(token.tokens) : \"escaped\" in token && token.escaped ? token.text : escape2(token.text);\n  }\n};\n\n// src/TextRenderer.ts\nvar _TextRenderer = class {\n  // no need for block level renderers\n  strong({ text }) {\n    return text;\n  }\n  em({ text }) {\n    return text;\n  }\n  codespan({ text }) {\n    return text;\n  }\n  del({ text }) {\n    return text;\n  }\n  html({ text }) {\n    return text;\n  }\n  text({ text }) {\n    return text;\n  }\n  link({ text }) {\n    return \"\" + text;\n  }\n  image({ text }) {\n    return \"\" + text;\n  }\n  br() {\n    return \"\";\n  }\n};\n\n// src/Parser.ts\nvar _Parser = class __Parser {\n  options;\n  renderer;\n  textRenderer;\n  constructor(options2) {\n    this.options = options2 || _defaults;\n    this.options.renderer = this.options.renderer || new _Renderer();\n    this.renderer = this.options.renderer;\n    this.renderer.options = this.options;\n    this.renderer.parser = this;\n    this.textRenderer = new _TextRenderer();\n  }\n  /**\n   * Static Parse Method\n   */\n  static parse(tokens, options2) {\n    const parser2 = new __Parser(options2);\n    return parser2.parse(tokens);\n  }\n  /**\n   * Static Parse Inline Method\n   */\n  static parseInline(tokens, options2) {\n    const parser2 = new __Parser(options2);\n    return parser2.parseInline(tokens);\n  }\n  /**\n   * Parse Loop\n   */\n  parse(tokens, top = true) {\n    let out = \"\";\n    for (let i = 0; i < tokens.length; i++) {\n      const anyToken = tokens[i];\n      if (this.options.extensions?.renderers?.[anyToken.type]) {\n        const genericToken = anyToken;\n        const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n        if (ret !== false || ![\"space\", \"hr\", \"heading\", \"code\", \"table\", \"blockquote\", \"list\", \"html\", \"paragraph\", \"text\"].includes(genericToken.type)) {\n          out += ret || \"\";\n          continue;\n        }\n      }\n      const token = anyToken;\n      switch (token.type) {\n        case \"space\": {\n          out += this.renderer.space(token);\n          continue;\n        }\n        case \"hr\": {\n          out += this.renderer.hr(token);\n          continue;\n        }\n        case \"heading\": {\n          out += this.renderer.heading(token);\n          continue;\n        }\n        case \"code\": {\n          out += this.renderer.code(token);\n          continue;\n        }\n        case \"table\": {\n          out += this.renderer.table(token);\n          continue;\n        }\n        case \"blockquote\": {\n          out += this.renderer.blockquote(token);\n          continue;\n        }\n        case \"list\": {\n          out += this.renderer.list(token);\n          continue;\n        }\n        case \"html\": {\n          out += this.renderer.html(token);\n          continue;\n        }\n        case \"paragraph\": {\n          out += this.renderer.paragraph(token);\n          continue;\n        }\n        case \"text\": {\n          let textToken = token;\n          let body = this.renderer.text(textToken);\n          while (i + 1 < tokens.length && tokens[i + 1].type === \"text\") {\n            textToken = tokens[++i];\n            body += \"\\n\" + this.renderer.text(textToken);\n          }\n          if (top) {\n            out += this.renderer.paragraph({\n              type: \"paragraph\",\n              raw: body,\n              text: body,\n              tokens: [{ type: \"text\", raw: body, text: body, escaped: true }]\n            });\n          } else {\n            out += body;\n          }\n          continue;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return \"\";\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out;\n  }\n  /**\n   * Parse Inline Tokens\n   */\n  parseInline(tokens, renderer = this.renderer) {\n    let out = \"\";\n    for (let i = 0; i < tokens.length; i++) {\n      const anyToken = tokens[i];\n      if (this.options.extensions?.renderers?.[anyToken.type]) {\n        const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n        if (ret !== false || ![\"escape\", \"html\", \"link\", \"image\", \"strong\", \"em\", \"codespan\", \"br\", \"del\", \"text\"].includes(anyToken.type)) {\n          out += ret || \"\";\n          continue;\n        }\n      }\n      const token = anyToken;\n      switch (token.type) {\n        case \"escape\": {\n          out += renderer.text(token);\n          break;\n        }\n        case \"html\": {\n          out += renderer.html(token);\n          break;\n        }\n        case \"link\": {\n          out += renderer.link(token);\n          break;\n        }\n        case \"image\": {\n          out += renderer.image(token);\n          break;\n        }\n        case \"strong\": {\n          out += renderer.strong(token);\n          break;\n        }\n        case \"em\": {\n          out += renderer.em(token);\n          break;\n        }\n        case \"codespan\": {\n          out += renderer.codespan(token);\n          break;\n        }\n        case \"br\": {\n          out += renderer.br(token);\n          break;\n        }\n        case \"del\": {\n          out += renderer.del(token);\n          break;\n        }\n        case \"text\": {\n          out += renderer.text(token);\n          break;\n        }\n        default: {\n          const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n          if (this.options.silent) {\n            console.error(errMsg);\n            return \"\";\n          } else {\n            throw new Error(errMsg);\n          }\n        }\n      }\n    }\n    return out;\n  }\n};\n\n// src/Hooks.ts\nvar _Hooks = class {\n  options;\n  block;\n  constructor(options2) {\n    this.options = options2 || _defaults;\n  }\n  static passThroughHooks = /* @__PURE__ */ new Set([\n    \"preprocess\",\n    \"postprocess\",\n    \"processAllTokens\"\n  ]);\n  /**\n   * Process markdown before marked\n   */\n  preprocess(markdown) {\n    return markdown;\n  }\n  /**\n   * Process HTML after marked is finished\n   */\n  postprocess(html2) {\n    return html2;\n  }\n  /**\n   * Process all tokens before walk tokens\n   */\n  processAllTokens(tokens) {\n    return tokens;\n  }\n  /**\n   * Provide function to tokenize markdown\n   */\n  provideLexer() {\n    return this.block ? _Lexer.lex : _Lexer.lexInline;\n  }\n  /**\n   * Provide function to parse tokens\n   */\n  provideParser() {\n    return this.block ? _Parser.parse : _Parser.parseInline;\n  }\n};\n\n// src/Instance.ts\nvar Marked = class {\n  defaults = _getDefaults();\n  options = this.setOptions;\n  parse = this.parseMarkdown(true);\n  parseInline = this.parseMarkdown(false);\n  Parser = _Parser;\n  Renderer = _Renderer;\n  TextRenderer = _TextRenderer;\n  Lexer = _Lexer;\n  Tokenizer = _Tokenizer;\n  Hooks = _Hooks;\n  constructor(...args) {\n    this.use(...args);\n  }\n  /**\n   * Run callback for every token\n   */\n  walkTokens(tokens, callback) {\n    let values = [];\n    for (const token of tokens) {\n      values = values.concat(callback.call(this, token));\n      switch (token.type) {\n        case \"table\": {\n          const tableToken = token;\n          for (const cell of tableToken.header) {\n            values = values.concat(this.walkTokens(cell.tokens, callback));\n          }\n          for (const row of tableToken.rows) {\n            for (const cell of row) {\n              values = values.concat(this.walkTokens(cell.tokens, callback));\n            }\n          }\n          break;\n        }\n        case \"list\": {\n          const listToken = token;\n          values = values.concat(this.walkTokens(listToken.items, callback));\n          break;\n        }\n        default: {\n          const genericToken = token;\n          if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n            this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n              const tokens2 = genericToken[childTokens].flat(Infinity);\n              values = values.concat(this.walkTokens(tokens2, callback));\n            });\n          } else if (genericToken.tokens) {\n            values = values.concat(this.walkTokens(genericToken.tokens, callback));\n          }\n        }\n      }\n    }\n    return values;\n  }\n  use(...args) {\n    const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n    args.forEach((pack) => {\n      const opts = { ...pack };\n      opts.async = this.defaults.async || opts.async || false;\n      if (pack.extensions) {\n        pack.extensions.forEach((ext) => {\n          if (!ext.name) {\n            throw new Error(\"extension name required\");\n          }\n          if (\"renderer\" in ext) {\n            const prevRenderer = extensions.renderers[ext.name];\n            if (prevRenderer) {\n              extensions.renderers[ext.name] = function(...args2) {\n                let ret = ext.renderer.apply(this, args2);\n                if (ret === false) {\n                  ret = prevRenderer.apply(this, args2);\n                }\n                return ret;\n              };\n            } else {\n              extensions.renderers[ext.name] = ext.renderer;\n            }\n          }\n          if (\"tokenizer\" in ext) {\n            if (!ext.level || ext.level !== \"block\" && ext.level !== \"inline\") {\n              throw new Error(\"extension level must be 'block' or 'inline'\");\n            }\n            const extLevel = extensions[ext.level];\n            if (extLevel) {\n              extLevel.unshift(ext.tokenizer);\n            } else {\n              extensions[ext.level] = [ext.tokenizer];\n            }\n            if (ext.start) {\n              if (ext.level === \"block\") {\n                if (extensions.startBlock) {\n                  extensions.startBlock.push(ext.start);\n                } else {\n                  extensions.startBlock = [ext.start];\n                }\n              } else if (ext.level === \"inline\") {\n                if (extensions.startInline) {\n                  extensions.startInline.push(ext.start);\n                } else {\n                  extensions.startInline = [ext.start];\n                }\n              }\n            }\n          }\n          if (\"childTokens\" in ext && ext.childTokens) {\n            extensions.childTokens[ext.name] = ext.childTokens;\n          }\n        });\n        opts.extensions = extensions;\n      }\n      if (pack.renderer) {\n        const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n        for (const prop in pack.renderer) {\n          if (!(prop in renderer)) {\n            throw new Error(`renderer '${prop}' does not exist`);\n          }\n          if ([\"options\", \"parser\"].includes(prop)) {\n            continue;\n          }\n          const rendererProp = prop;\n          const rendererFunc = pack.renderer[rendererProp];\n          const prevRenderer = renderer[rendererProp];\n          renderer[rendererProp] = (...args2) => {\n            let ret = rendererFunc.apply(renderer, args2);\n            if (ret === false) {\n              ret = prevRenderer.apply(renderer, args2);\n            }\n            return ret || \"\";\n          };\n        }\n        opts.renderer = renderer;\n      }\n      if (pack.tokenizer) {\n        const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n        for (const prop in pack.tokenizer) {\n          if (!(prop in tokenizer)) {\n            throw new Error(`tokenizer '${prop}' does not exist`);\n          }\n          if ([\"options\", \"rules\", \"lexer\"].includes(prop)) {\n            continue;\n          }\n          const tokenizerProp = prop;\n          const tokenizerFunc = pack.tokenizer[tokenizerProp];\n          const prevTokenizer = tokenizer[tokenizerProp];\n          tokenizer[tokenizerProp] = (...args2) => {\n            let ret = tokenizerFunc.apply(tokenizer, args2);\n            if (ret === false) {\n              ret = prevTokenizer.apply(tokenizer, args2);\n            }\n            return ret;\n          };\n        }\n        opts.tokenizer = tokenizer;\n      }\n      if (pack.hooks) {\n        const hooks = this.defaults.hooks || new _Hooks();\n        for (const prop in pack.hooks) {\n          if (!(prop in hooks)) {\n            throw new Error(`hook '${prop}' does not exist`);\n          }\n          if ([\"options\", \"block\"].includes(prop)) {\n            continue;\n          }\n          const hooksProp = prop;\n          const hooksFunc = pack.hooks[hooksProp];\n          const prevHook = hooks[hooksProp];\n          if (_Hooks.passThroughHooks.has(prop)) {\n            hooks[hooksProp] = (arg) => {\n              if (this.defaults.async) {\n                return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => {\n                  return prevHook.call(hooks, ret2);\n                });\n              }\n              const ret = hooksFunc.call(hooks, arg);\n              return prevHook.call(hooks, ret);\n            };\n          } else {\n            hooks[hooksProp] = (...args2) => {\n              let ret = hooksFunc.apply(hooks, args2);\n              if (ret === false) {\n                ret = prevHook.apply(hooks, args2);\n              }\n              return ret;\n            };\n          }\n        }\n        opts.hooks = hooks;\n      }\n      if (pack.walkTokens) {\n        const walkTokens2 = this.defaults.walkTokens;\n        const packWalktokens = pack.walkTokens;\n        opts.walkTokens = function(token) {\n          let values = [];\n          values.push(packWalktokens.call(this, token));\n          if (walkTokens2) {\n            values = values.concat(walkTokens2.call(this, token));\n          }\n          return values;\n        };\n      }\n      this.defaults = { ...this.defaults, ...opts };\n    });\n    return this;\n  }\n  setOptions(opt) {\n    this.defaults = { ...this.defaults, ...opt };\n    return this;\n  }\n  lexer(src, options2) {\n    return _Lexer.lex(src, options2 ?? this.defaults);\n  }\n  parser(tokens, options2) {\n    return _Parser.parse(tokens, options2 ?? this.defaults);\n  }\n  parseMarkdown(blockType) {\n    const parse2 = (src, options2) => {\n      const origOpt = { ...options2 };\n      const opt = { ...this.defaults, ...origOpt };\n      const throwError = this.onError(!!opt.silent, !!opt.async);\n      if (this.defaults.async === true && origOpt.async === false) {\n        return throwError(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));\n      }\n      if (typeof src === \"undefined\" || src === null) {\n        return throwError(new Error(\"marked(): input parameter is undefined or null\"));\n      }\n      if (typeof src !== \"string\") {\n        return throwError(new Error(\"marked(): input parameter is of type \" + Object.prototype.toString.call(src) + \", string expected\"));\n      }\n      if (opt.hooks) {\n        opt.hooks.options = opt;\n        opt.hooks.block = blockType;\n      }\n      const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline;\n      const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline;\n      if (opt.async) {\n        return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError);\n      }\n      try {\n        if (opt.hooks) {\n          src = opt.hooks.preprocess(src);\n        }\n        let tokens = lexer2(src, opt);\n        if (opt.hooks) {\n          tokens = opt.hooks.processAllTokens(tokens);\n        }\n        if (opt.walkTokens) {\n          this.walkTokens(tokens, opt.walkTokens);\n        }\n        let html2 = parser2(tokens, opt);\n        if (opt.hooks) {\n          html2 = opt.hooks.postprocess(html2);\n        }\n        return html2;\n      } catch (e) {\n        return throwError(e);\n      }\n    };\n    return parse2;\n  }\n  onError(silent, async) {\n    return (e) => {\n      e.message += \"\\nPlease report this to https://github.com/markedjs/marked.\";\n      if (silent) {\n        const msg = \"<p>An error occurred:</p><pre>\" + escape2(e.message + \"\", true) + \"</pre>\";\n        if (async) {\n          return Promise.resolve(msg);\n        }\n        return msg;\n      }\n      if (async) {\n        return Promise.reject(e);\n      }\n      throw e;\n    };\n  }\n};\n\n// src/marked.ts\nvar markedInstance = new Marked();\nfunction marked(src, opt) {\n  return markedInstance.parse(src, opt);\n}\nmarked.options = marked.setOptions = function(options2) {\n  markedInstance.setOptions(options2);\n  marked.defaults = markedInstance.defaults;\n  changeDefaults(marked.defaults);\n  return marked;\n};\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\nmarked.use = function(...args) {\n  markedInstance.use(...args);\n  marked.defaults = markedInstance.defaults;\n  changeDefaults(marked.defaults);\n  return marked;\n};\nmarked.walkTokens = function(tokens, callback) {\n  return markedInstance.walkTokens(tokens, callback);\n};\nmarked.parseInline = markedInstance.parseInline;\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nvar options = marked.options;\nvar setOptions = marked.setOptions;\nvar use = marked.use;\nvar walkTokens = marked.walkTokens;\nvar parseInline = marked.parseInline;\nvar parse = marked;\nvar parser = _Parser.parse;\nvar lexer = _Lexer.lex;\nexport {\n  _Hooks as Hooks,\n  _Lexer as Lexer,\n  Marked,\n  _Parser as Parser,\n  _Renderer as Renderer,\n  _TextRenderer as TextRenderer,\n  _Tokenizer as Tokenizer,\n  _defaults as defaults,\n  _getDefaults as getDefaults,\n  lexer,\n  marked,\n  options,\n  parse,\n  parseInline,\n  parser,\n  setOptions,\n  use,\n  walkTokens\n};\n//# sourceMappingURL=marked.esm.js.map\n","/*! @license DOMPurify 3.4.2 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.2/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    ARIA_ATTR: ARIA_ATTR,\n    ATTR_WHITESPACE: ATTR_WHITESPACE,\n    CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n    DATA_ATTR: DATA_ATTR,\n    DOCTYPE_NAME: DOCTYPE_NAME,\n    ERB_EXPR: ERB_EXPR,\n    IS_ALLOWED_URI: IS_ALLOWED_URI,\n    IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n    MUSTACHE_EXPR: MUSTACHE_EXPR,\n    TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  text: 3,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.2';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') && arrayIsArray(cfg.ALLOWED_TAGS) ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') && arrayIsArray(cfg.ALLOWED_ATTR) ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') && arrayIsArray(cfg.ALLOWED_NAMESPACES) ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR) ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') && arrayIsArray(cfg.ADD_DATA_URI_TAGS) ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS) ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') && arrayIsArray(cfg.FORBID_TAGS) ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') && arrayIsArray(cfg.FORBID_ATTR) ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, ['annotation-xml']); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!nameIsPermitted || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT, tagName);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        try {\n          if (namespaceURI) {\n            currentNode.setAttributeNS(namespaceURI, name, value);\n          } else {\n            /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n            currentNode.setAttribute(name, value);\n          }\n          if (_isClobbered(currentNode)) {\n            _forceRemove(currentNode);\n          } else {\n            arrayPop(DOMPurify.removed);\n          }\n        } catch (_) {\n          _removeAttribute(name, currentNode);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      const nn = dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM2(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        body.normalize();\n        let html = body.innerHTML;\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          html = stringReplace(html, expr, ' ');\n        });\n        body.innerHTML = html;\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","<script>\n  import { onMount, afterUpdate } from 'svelte';\n  import { marked } from 'marked';\n  import DOMPurify from 'dompurify';\n\n  marked.setOptions({ breaks: true, gfm: true });\n\n  function renderMarkdown(text) {\n    const raw = marked.parse(text || '');\n    return DOMPurify.sanitize(raw, { ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'ul', 'ol', 'li', 'a', 'img', 'h1', 'h2', 'h3', 'code', 'pre', 'blockquote'], ALLOWED_ATTR: ['href', 'src', 'alt', 'target', 'rel'] });\n  }\n\n  let open = false;\n  let messages = [\n    { role: 'assistant', content: \"Hi! I'm BikeInsure's support assistant. Ask me anything about our bike insurance.\" }\n  ];\n  let input = '';\n  let loading = false;\n  let messagesEnd;\n\n  function getCsrfToken() {\n    const match = document.cookie.match(/csrftoken=([^;]+)/);\n    return match ? match[1] : '';\n  }\n\n  afterUpdate(() => {\n    if (messagesEnd && open) {\n      messagesEnd.scrollIntoView({ behavior: 'smooth' });\n    }\n  });\n\n  async function send() {\n    const trimmed = input.trim();\n    if (!trimmed || loading) return;\n\n    messages = [...messages, { role: 'user', content: trimmed }];\n    input = '';\n    loading = true;\n\n    try {\n      const startTime = Date.now();\n      const payload = messages.slice(1).map(m => ({ role: m.role, content: m.content }));\n      const res = await fetch('/api/chatbot/chat/', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken(),\n        },\n        body: JSON.stringify({ messages: payload }),\n      });\n\n      if (!res.ok) {\n        throw new Error(`HTTP ${res.status}`);\n      }\n\n      const data = await res.json();\n\n      const elapsed = Date.now() - startTime;\n      const minDelay = 800;\n      if (elapsed < minDelay) {\n        await new Promise(r => setTimeout(r, minDelay - elapsed));\n      }\n\n      messages = [...messages, { role: 'assistant', content: data.reply }];\n    } catch (err) {\n      messages = [...messages, {\n        role: 'assistant',\n        content: \"Sorry, I'm having trouble right now. Please visit [BikeInsure contact](https://www.bikeinsure.com/contact)\"\n      }];\n    } finally {\n      loading = false;\n    }\n  }\n\n  function handleKeydown(e) {\n    if (e.key === 'Enter' && !e.shiftKey) {\n      e.preventDefault();\n      send();\n    }\n  }\n</script>\n\n{#if !open}\n  <button class=\"chatwidget-toggle\" on:click={() => open = true} aria-label=\"Open chat\">\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n    </svg>\n    <span>Chat</span>\n  </button>\n{:else}\n  <div class=\"chatwidget-panel\">\n    <div class=\"chatwidget-header\">\n      <div class=\"chatwidget-header-info\">\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n        </svg>\n        <span>BikeInsure Support</span>\n      </div>\n      <button class=\"chatwidget-close\" on:click={() => open = false} aria-label=\"Close chat\">&times;</button>\n    </div>\n\n    <div class=\"chatwidget-messages\">\n      {#each messages as msg}\n        <div class=\"chatwidget-msg chatwidget-msg-{msg.role}\">\n          {#if msg.role === 'assistant'}\n            <div class=\"chatwidget-markdown\">{@html renderMarkdown(msg.content)}</div>\n          {:else}\n            {msg.content}\n          {/if}\n        </div>\n      {/each}\n      {#if loading}\n        <div class=\"chatwidget-msg chatwidget-msg-assistant chatwidget-typing\">\n          <span class=\"chatwidget-dot\"></span>\n          <span class=\"chatwidget-dot\"></span>\n          <span class=\"chatwidget-dot\"></span>\n        </div>\n      {/if}\n      <div bind:this={messagesEnd}></div>\n    </div>\n\n    <div class=\"chatwidget-input-row\">\n      <input\n        type=\"text\"\n        bind:value={input}\n        on:keydown={handleKeydown}\n        placeholder=\"Ask a question...\"\n        disabled={loading}\n      />\n      <button\n        class=\"chatwidget-send\"\n        on:click={send}\n        disabled={loading || !input.trim()}\n        aria-label=\"Send message\"\n      >\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n          <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n        </svg>\n      </button>\n    </div>\n  </div>\n{/if}\n\n<style>\n  .chatwidget-toggle {\n    position: fixed;\n    bottom: 20px;\n    right: 20px;\n    background: #1a73e8;\n    color: white;\n    border: none;\n    padding: 12px 20px;\n    border-radius: 28px;\n    font-size: 15px;\n    font-weight: 500;\n    cursor: pointer;\n    box-shadow: 0 4px 16px rgba(26, 115, 232, 0.4);\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    transition: transform 0.2s, box-shadow 0.2s;\n    z-index: 9999;\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n  }\n\n  .chatwidget-toggle:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(26, 115, 232, 0.5);\n  }\n\n  .chatwidget-panel {\n    position: fixed;\n    bottom: 20px;\n    right: 20px;\n    width: 380px;\n    height: 520px;\n    background: white;\n    border-radius: 16px;\n    box-shadow: 0 8px 40px rgba(0, 0, 0, 0.2);\n    display: flex;\n    flex-direction: column;\n    z-index: 9999;\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    overflow: hidden;\n  }\n\n  .chatwidget-header {\n    background: #1a73e8;\n    color: white;\n    padding: 14px 16px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    flex-shrink: 0;\n  }\n\n  .chatwidget-header-info {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-weight: 600;\n    font-size: 15px;\n  }\n\n  .chatwidget-close {\n    background: none;\n    border: none;\n    color: white;\n    font-size: 24px;\n    cursor: pointer;\n    line-height: 1;\n    padding: 0 4px;\n    opacity: 0.8;\n    transition: opacity 0.2s;\n  }\n\n  .chatwidget-close:hover {\n    opacity: 1;\n  }\n\n  .chatwidget-messages {\n    flex: 1;\n    overflow-y: auto;\n    padding: 16px;\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n  }\n\n  .chatwidget-msg {\n    max-width: 85%;\n    padding: 10px 14px;\n    border-radius: 16px;\n    font-size: 14px;\n    line-height: 1.5;\n    word-wrap: break-word;\n  }\n\n  .chatwidget-msg-user {\n    align-self: flex-end;\n    background: #1a73e8;\n    color: white;\n    border-bottom-right-radius: 4px;\n  }\n\n  .chatwidget-msg-assistant {\n    align-self: flex-start;\n    background: #f1f3f4;\n    color: #1a1a1a;\n    border-bottom-left-radius: 4px;\n  }\n\n  .chatwidget-typing {\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    padding: 12px 16px;\n  }\n\n  .chatwidget-dot {\n    width: 8px;\n    height: 8px;\n    background: #999;\n    border-radius: 50%;\n    animation: chatwidget-bounce 1.4s infinite ease-in-out both;\n  }\n\n  .chatwidget-dot:nth-child(1) { animation-delay: -0.32s; }\n  .chatwidget-dot:nth-child(2) { animation-delay: -0.16s; }\n\n  @keyframes chatwidget-bounce {\n    0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }\n    40% { transform: scale(1); opacity: 1; }\n  }\n\n  .chatwidget-input-row {\n    display: flex;\n    gap: 8px;\n    padding: 12px;\n    border-top: 1px solid #e8eaed;\n    flex-shrink: 0;\n  }\n\n  .chatwidget-input-row input {\n    flex: 1;\n    padding: 10px 14px;\n    border: 1px solid #dadce0;\n    border-radius: 20px;\n    font-size: 14px;\n    outline: none;\n    transition: border-color 0.2s;\n    font-family: inherit;\n  }\n\n  .chatwidget-input-row input:focus {\n    border-color: #1a73e8;\n  }\n\n  .chatwidget-input-row input:disabled {\n    background: #f8f9fa;\n  }\n\n  .chatwidget-send {\n    background: #1a73e8;\n    color: white;\n    border: none;\n    width: 38px;\n    height: 38px;\n    border-radius: 50%;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: background 0.2s;\n    flex-shrink: 0;\n  }\n\n  .chatwidget-send:hover:not(:disabled) {\n    background: #1557b0;\n  }\n\n  .chatwidget-send:disabled {\n    opacity: 0.4;\n    cursor: not-allowed;\n  }\n\n  .chatwidget-markdown :global(p) {\n    margin: 0 0 8px 0;\n  }\n\n  .chatwidget-markdown :global(p:last-child) {\n    margin-bottom: 0;\n  }\n\n  .chatwidget-markdown :global(strong) {\n    font-weight: 600;\n  }\n\n  .chatwidget-markdown :global(ul),\n  .chatwidget-markdown :global(ol) {\n    margin: 4px 0 8px 0;\n    padding-left: 18px;\n  }\n\n  .chatwidget-markdown :global(li) {\n    margin-bottom: 2px;\n  }\n\n  .chatwidget-markdown :global(a) {\n    color: #1a73e8;\n    text-decoration: underline;\n  }\n\n  .chatwidget-msg-assistant .chatwidget-markdown :global(a) {\n    color: #1557b0;\n  }\n\n  .chatwidget-markdown :global(img) {\n    max-width: 100%;\n    border-radius: 8px;\n    margin: 8px 0;\n    display: block;\n  }\n\n  .chatwidget-markdown :global(code) {\n    background: rgba(0, 0, 0, 0.06);\n    padding: 1px 4px;\n    border-radius: 3px;\n    font-size: 13px;\n  }\n\n  .chatwidget-markdown :global(blockquote) {\n    border-left: 3px solid #dadce0;\n    margin: 4px 0;\n    padding-left: 10px;\n    color: #555;\n  }\n\n  @media (max-width: 440px) {\n    .chatwidget-panel {\n      width: calc(100vw - 16px);\n      height: calc(100vh - 100px);\n      bottom: 8px;\n      right: 8px;\n      border-radius: 12px;\n    }\n  }\n</style>\n","<script>\n  import { onMount, onDestroy } from 'svelte';\n\n  export let message = '';\n\n  onMount(() => {\n    document.body.style.overflow = 'hidden';\n  });\n\n  onDestroy(() => {\n    document.body.style.overflow = '';\n  });\n</script>\n\n<div class=\"maintenance-overlay\">\n  <div class=\"maintenance-card\">\n    <div class=\"maintenance-logo\">\n      <img src=\"/static/BikeInsure_simple_logo.png\" alt=\"BikeInsure\" />\n    </div>\n\n    <h2 class=\"maintenance-heading\">System Maintenance In Progress</h2>\n\n    <div class=\"maintenance-message\">\n      {@html message}\n    </div>\n  </div>\n</div>\n\n<style>\n  .maintenance-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.6);\n    backdrop-filter: blur(4px);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 20000;\n    padding: 20px;\n    animation: fadeIn 0.3s ease;\n  }\n\n  @keyframes fadeIn {\n    from { opacity: 0; }\n    to { opacity: 1; }\n  }\n\n  .maintenance-card {\n    background: #fff;\n    border-radius: 16px;\n    max-width: 520px;\n    width: 100%;\n    padding: 40px 36px 32px;\n    text-align: center;\n    box-shadow: 0 24px 64px rgba(0, 0, 0, 0.3);\n    animation: slideUp 0.3s ease;\n  }\n\n  @keyframes slideUp {\n    from { transform: translateY(16px); opacity: 0; }\n    to { transform: translateY(0); opacity: 1; }\n  }\n\n  .maintenance-logo {\n    margin-bottom: 24px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .maintenance-logo img {\n    height: 48px;\n    width: auto;\n  }\n\n  .maintenance-badge {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 56px;\n    height: 56px;\n    border-radius: 50%;\n    background: #fef3c7;\n    margin-bottom: 20px;\n  }\n\n  .maintenance-heading {\n    font-size: 1.35rem;\n    font-weight: 700;\n    color: #1f2937;\n    margin: 0 0 16px;\n  }\n\n  .maintenance-message {\n    color: #4b5563;\n    font-size: 0.95rem;\n    line-height: 1.7;\n    margin-bottom: 24px;\n  }\n\n  .maintenance-message :global(p) {\n    margin: 0 0 8px;\n  }\n\n  .maintenance-message :global(a) {\n    color: #2563eb;\n    text-decoration: underline;\n  }\n\n  .maintenance-message :global(a:hover) {\n    color: #1d4ed8;\n  }\n\n  .maintenance-footer {\n    border-top: 1px solid #e5e7eb;\n    padding-top: 20px;\n  }\n\n  .maintenance-footer p {\n    margin: 0 0 6px;\n    color: #6b7280;\n    font-size: 0.9rem;\n  }\n\n  .maintenance-footer a {\n    color: #2563eb;\n    text-decoration: none;\n    font-size: 0.9rem;\n    font-weight: 500;\n  }\n\n  .maintenance-footer a:hover {\n    text-decoration: underline;\n  }\n\n  @media (max-width: 480px) {\n    .maintenance-card {\n      padding: 28px 20px 24px;\n    }\n\n    .maintenance-heading {\n      font-size: 1.15rem;\n    }\n  }\n</style>\n","import { writable } from 'svelte/store';\n\n/**\n * Widget Mode Store\n * \n * Detects if the app is running inside the BikeInsure widget iframe.\n * \n * Usage in components:\n * \n * <script>\n *   import { widgetMode, closeWidget } from './stores/widgetMode.js';\n *   \n *   // Check if in widget mode\n *   $: if ($widgetMode) {\n *     console.log('Running in widget mode');\n *   }\n *   \n *   // Close the widget programmatically\n *   function handleComplete() {\n *     closeWidget();\n *   }\n * </script>\n */\n\n// Global store for widget mode detection\nexport const widgetMode = writable(false);\n\n// Helper function to check if running in widget mode\nexport function isWidgetMode() {\n  if (typeof window === 'undefined') return false;\n  const urlParams = new URLSearchParams(window.location.search);\n  return urlParams.get('widget') === 'true';\n}\n\n// Helper function to close the widget from within the app\nexport function closeWidget() {\n  if (typeof window !== 'undefined' && window.parent !== window) {\n    // Send close message to parent window (the widget wrapper)\n    window.parent.postMessage({ type: 'bikeinsure:close' }, '*');\n    console.log('📤 Sent close message to widget wrapper');\n  }\n}\n\n// Initialize widget mode on load\nif (typeof window !== 'undefined') {\n  widgetMode.set(isWidgetMode());\n}\n\n","<script>\n  import { onMount, tick, setContext } from 'svelte';\n  import { writable } from 'svelte/store';\n  import { loadStripe } from '@stripe/stripe-js';\n  import StateSelectStep from './StateSelectStep.svelte';\n  import V2Flow from './V2Flow.svelte';\n  import WelcomeStep from './WelcomeStep.svelte';\n  import UserInfoStep from './UserInfoStep.svelte';\n  import BikeDetailsStep from './BikeDetailsStep.svelte';\n  import AgreePayStep from './AgreePayStep.svelte';\n  import PaymentStep from './PaymentStep.svelte';\n  import BoundPolicyView from './BoundPolicyView.svelte';\n  import ProgressBar from './components/ProgressBar.svelte';\n  import BikeInsureLoader from './components/BikeInsureLoader.svelte';\n  import ChatWidget from './ChatWidget.svelte';\n  import MaintenanceModal from './components/MaintenanceModal.svelte';\n  import { widgetMode, isWidgetMode, closeWidget } from './stores/widgetMode.js';\n  \n  // Make widgetMode available to child components via context\n  setContext('widgetMode', widgetMode);\n  \n  // State management\n  let currentStep = 0;\n  let policy = null;\n  let questions = [];\n  let answers = {};\n  let bikes = [];\n  let loading = true;\n  let stripe = null;\n  let showBoundPolicy = false;  // New state for bound policy view\n  let hideHeaderOnPaymentComplete = false;  // Hide header when payment is complete\n  let policyQuote = null;  // Store bike quotes for dynamic pricing\n\n  // V2 location-based flow\n  let selectedState = null;\n  let useV2Api = false;\n  let v2QuoteData = null;\n  \n  // WIDGET MODE: Detect if running in widget iframe\n  if (typeof window !== 'undefined') {\n    const inWidgetMode = isWidgetMode();\n    widgetMode.set(inWidgetMode);\n    if (inWidgetMode) {\n      console.log('🎨 WIDGET MODE: Running in iframe widget');\n      \n      // Notify parent window that widget is ready\n      if (window.parent !== window) {\n        window.parent.postMessage({ type: 'bikeinsure:ready' }, '*');\n      }\n    }\n  }\n  \n  // DEV MODE: Check for ?dev-step=success parameter to show thank you page\n  let devModeActive = false;\n  let devModePaymentComplete = false;\n  if (typeof window !== 'undefined') {\n    const urlParams = new URLSearchParams(window.location.search);\n    const devStep = urlParams.get('dev-step');\n    if (devStep === 'success') {\n      currentStep = 5; // Show PaymentStep (where success message actually lives)\n      loading = false; // Skip loading\n      devModeActive = true; // Flag to prevent initialization from overriding\n      devModePaymentComplete = true; // Flag to force paymentComplete in PaymentStep\n      console.log('🔧 DEV MODE: Forcing payment success screen (step 5)');\n    }\n  }\n  \n  // Previous policy detection\n  let showPreviousPolicyModal = false;\n  let previousPolicyData = null;\n  let allowAutoSave = false; // Prevent auto-save during initialization\n  let isInPurchaseFlow = false; // Track if user is actively going through purchase flow\n  \n  // User information (using stores for reactivity)\n  const userInfoStore = writable({\n    firstName: '',\n    lastName: '',\n    email: '',\n    phone: '',\n    address: '',\n    addressLine2: '',\n    city: '',\n    state: '',\n    zipCode: ''\n  });\n  \n  // Local reference for easier access\n  let userInfo = {\n    firstName: '',\n    lastName: '',\n    email: '',\n    phone: '',\n    address: '',\n    addressLine2: '',\n    city: '',\n    state: '',\n    zipCode: ''\n  };\n  \n  // Subscribe to store changes to keep local userInfo in sync\n  userInfoStore.subscribe(value => {\n    userInfo = { ...value };\n  });\n  \n  // Helper function to update both local userInfo and store\n  function updateUserInfo(updates) {\n    // Update local object\n    Object.assign(userInfo, updates);\n    // Update store\n    userInfoStore.set({ ...userInfo });\n    \n    // Identify user in Smartlook if we have enough info\n    identifyUserInSmartlook();\n  }\n  \n  // Smartlook identify function\n  function identifyUserInSmartlook() {\n    // Only identify if we have user info and smartlook is available\n    if (typeof window !== 'undefined' && window.smartlook && userInfo.email) {\n      try {\n        const identifyData = {\n          name: `${userInfo.firstName} ${userInfo.lastName}`.trim() || 'Unknown',\n          email: userInfo.email\n        };\n        \n        // Add policy info if available\n        if (policy) {\n          if (policy.policy_number) {\n            identifyData.policy_number = policy.policy_number;\n          }\n          if (policy.premium) {\n            identifyData.premium = policy.premium;\n            identifyData.currency = policy.premium_currency || 'USD';\n          }\n          if (policy.status) {\n            identifyData.policy_status = policy.status;\n          }\n        }\n        \n        // Add partner info if available\n        if (INITIAL_DATA.partner) {\n          identifyData.partner = INITIAL_DATA.partner.name;\n        }\n        \n        // Use email as user ID (or policy user id if available)\n        const userId = policy?.user?.id || userInfo.email;\n        \n\n        window.smartlook('identify', userId, identifyData);\n        klaviyo.identify({\n          '$email': userInfo.email,\n          '$firstname': `${userInfo.firstName} ${userInfo.lastName}`.trim() || 'Unknown',\n          'state':'quote'\n        });\n        console.log('✅ Smartlook user identified:', userId);\n      } catch (error) {\n        console.error('❌ Error identifying user in Smartlook:', error);\n      }\n    }\n  }\n\n  // Smartlook event tracking function\n  function trackSmartlookEvent(eventName, properties = {}) {\n    if (typeof window !== 'undefined' && window.smartlook) {\n      try {\n        // Add common properties to all events\n        const eventData = {\n          ...properties,\n          partner: INITIAL_DATA.partner?.name || 'Direct',\n          policy_uuid: policyUuid,\n          timestamp: new Date().toISOString()\n        };\n        \n        window.smartlook('track', eventName, eventData);\n        console.log('📊 Smartlook event tracked:', eventName, eventData);\n      } catch (error) {\n        console.error('❌ Error tracking Smartlook event:', error);\n      }\n    }\n  }\n  \n  // // Track bike count changes\n  // let previousBikeCount = 0;\n  // $: if (bikes.length > previousBikeCount && previousBikeCount > 0) {\n  //   // Bike was added\n  //   trackSmartlookEvent('BikeAdded', {\n  //     type: 'BikeCountIncreased',\n  //     new_count: bikes.length,\n  //     step: currentStep\n  //   });\n  //   previousBikeCount = bikes.length;\n  // } else if (bikes.length < previousBikeCount && previousBikeCount > 0) {\n  //   // Bike was removed\n  //   trackSmartlookEvent('BikeRemoved', {\n  //     type: 'BikeCountDecreased',\n  //     new_count: bikes.length,\n  //     step: currentStep\n  //   });\n  //   previousBikeCount = bikes.length;\n  // } else if (bikes.length > 0 && previousBikeCount === 0) {\n  //   // Initial bike(s) loaded\n  //   previousBikeCount = bikes.length;\n  // }\n  \n  // Form validation\n  let errors = {};\n  \n  // URL and localStorage management\n  let policyUuid = null;\n  let partnerSlug = null;\n  let userId = null;\n  \n  // Prevent duplicate API calls\n  let isCreatingUser = false;\n  let isCreatingPolicy = false;\n  \n  // Configuration - Get from Django template\n  const INITIAL_DATA = window.INITIAL_DATA || {};\n  const API_BASE_URL = INITIAL_DATA.apiBaseUrl || 'http://localhost:8000';\n  const enableChatbot = INITIAL_DATA.enableChatbot === true;\n  const maintenanceMode = INITIAL_DATA.maintenanceMode === true;\n  const maintenanceMessage = INITIAL_DATA.maintenanceMessage || '';\n  \n  // Pricing configuration\n  const BASE_PRICE = parseFloat(INITIAL_DATA.partner?.price || '16.99');\n  const THEFT_ADDON = 8.00;\n  \n  // Pricing functions for use across all components\n  function getBasePrice() {\n    return BASE_PRICE;\n  }\n  \n  function getTheftAddon() {\n    return THEFT_ADDON;\n  }\n  \n  function getTheftPrice() {\n    return BASE_PRICE + THEFT_ADDON;\n  }\n  \n  function getBikePrice(bike) {\n    // Check if bike has theft protection - check both possible field names (same logic as original)\n    const theftValue = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n    const hasTheft = theftValue === 'true' || theftValue === true;\n    return hasTheft ? getTheftPrice() : BASE_PRICE;\n  }\n  \n  function getTotalPrice(bikesArray = null) {\n    // Use provided bikes array or default to context bikes\n    const bikesToCalculate = bikesArray || bikes;\n    if (!bikesToCalculate || bikesToCalculate.length === 0) return 0;\n    \n    return bikesToCalculate.reduce((total, bike) => {\n      return total + getBikePrice(bike);\n    }, 0);\n  }\n  \n  function formatPrice(price) {\n    return Number(price).toFixed(2);\n  }\n  \n  // Error states\n  let errorMessage = null;\n  let showError = false;\n  \n  // Auto-save management\n  let autoSaveTimeout = null;\n  let isAutoSaving = false;\n  let hasUserStartedForm = false;\n  \n  // Step transition loading\n  let isTransitioning = false;\n  \n  // Hash-based navigation mapping\n  const stepToHash = {\n    0: 'state',\n    1: 'welcome',\n    2: 'signup',\n    3: 'bikes',\n    4: 'signature',\n    5: 'purchase',\n    6: 'success'\n  };\n\n  const hashToStep = {\n    'state': 0,\n    'welcome': 1,\n    'signup': 2,\n    'bikes': 3,\n    'signature': 4,\n    'purchase': 5,\n    'success': 6\n  };\n  \n  // Create context for child components\n  setContext('app', {\n    get stripe() { return stripe; },\n    get bikes() { return bikes; },\n    set bikes(value) { bikes = value; },\n    get policyQuote() { return policyQuote; },\n    set policyQuote(value) { policyQuote = value; },\n    userInfo: userInfoStore, // Pass the store instead of raw variable\n    get policyUuid() { return policyUuid; },\n    get partnerSlug() { return partnerSlug; },\n    get useV2Api() { return useV2Api; },\n    get v2QuoteData() { return v2QuoteData; },\n    get selectedState() { return selectedState; },\n    get API_BASE_URL() { return API_BASE_URL; },\n    get policy() { return policy; },\n    set policy(value) { policy = value; }, // Allow updating policy from child components\n    get questions() { return questions; },\n    get errors() { return errors; },\n    set errors(value) { errors = value; },\n    getCsrfToken,\n    trackSmartlookEvent,\n    triggerAutoSave,\n    saveOnStepChange: performAutoSave, // Full save for step transitions\n    validateStep,\n    nextStep,\n    prevStep,\n    loadPolicyByUuid, // Add this function to context\n    viewBoundPolicy, // Function to transition from thank you to bound policy view\n    showBoundPolicyView: () => { \n      // Only clear localStorage and show bound view if not in purchase flow\n      if (!isInPurchaseFlow) {\n        clearLocalStorageForBoundPolicy(); // Clear localStorage when showing bound policy\n        showBoundPolicy = true; \n      }\n      // If in purchase flow, the policy status change will be handled by the normal flow\n    }, // Helper to show bound policy view\n    // Pricing functions\n    pricing: {\n      getBasePrice,\n      getTheftAddon,\n      getTheftPrice,\n      getBikePrice,\n      getTotalPrice,\n      formatPrice,\n      BASE_PRICE,\n      THEFT_ADDON\n    }\n  });\n  \n  // Simple hash navigation\n  function updateHash(step) {\n    const hash = stepToHash[step];\n    if (hash) {\n      window.location.hash = hash;\n    }\n  }\n  \n  function getStepFromHash() {\n    const hash = window.location.hash.replace('#', '');\n    const step = hashToStep[hash];\n    return step !== undefined ? step : null;\n  }\n  \n  async function handleHashChange() {\n    const targetStep = getStepFromHash();\n    \n    // If hash is empty, redirect to current step\n    if (targetStep === null || targetStep === undefined) {\n      updateHash(selectedState ? 1 : 0);\n      return;\n    }\n    \n    // Update current step if hash changed and step is valid\n    if (targetStep !== currentStep && !isTransitioning) {\n      const maxAllowedStep = getMaxAllowedStep();\n      if (targetStep <= maxAllowedStep) {\n        currentStep = targetStep;\n        \n        // Wait for DOM to update before scrolling\n        await tick();\n        \n        // Scroll to top of page on step change (mobile-friendly)\n        window.scrollTo({ top: 0, behavior: 'smooth' });\n        \n        saveToLocalStorage();\n      } else {\n        // Redirect to max allowed step\n        updateHash(maxAllowedStep);\n      }\n    }\n  }\n  \n  function getMaxAllowedStep() {\n    // Determine the maximum step the user can access based on form completion\n    if (!selectedState) return 0; // State selection if no state chosen\n    if (!policy) return 1; // Only welcome if no policy\n    if (!isUserInfoComplete()) return 2; // Only up to signup if user info incomplete\n    if (!isBikeDetailsComplete()) return 3; // Only up to bikes if bike details incomplete\n    if (!isSignatureComplete()) return 4; // Only up to signature if signature incomplete\n    return 6; // All steps available if everything is complete\n  }\n\n  // Initialize Stripe and load policy\n  onMount(async () => {\n    if (maintenanceMode) {\n      loading = false;\n      return;\n    }\n    \n    try {\n      // Load Stripe with the public key from Django settings\n      const stripePublicKey = INITIAL_DATA.stripePublicKey;\n      if (!stripePublicKey) {\n        console.error('Stripe public key not configured');\n        throw new Error('Stripe public key not configured');\n      }\n      stripe = await loadStripe(stripePublicKey);\n      \n      // Get location and policy from Django template data\n      partnerSlug = INITIAL_DATA.partnerSlug;\n      policyUuid = INITIAL_DATA.policyUuid;\n      allowAutoSave = false;\n      \n      // If dev mode is active, skip most initialization\n      if (devModeActive) {\n        console.log('🔧 DEV MODE ACTIVE: Skipping normal initialization, staying at step', currentStep);\n        loading = false;\n        return;\n      }\n\n      if(INITIAL_DATA.policyUuid){\n        loading = true;\n      }\n      \n      if (!partnerSlug) {\n        showError = true;\n        errorMessage = 'Invalid partner program. Please access this page from a valid partner URL.';\n        return;\n      }\n      \n      // Load initial data from Django template\n      console.log('DEBUG: INITIAL_DATA:', INITIAL_DATA);\n      console.log('DEBUG: INITIAL_DATA.policy:', INITIAL_DATA.policy);\n      console.log('DEBUG: typeof INITIAL_DATA.policy:', typeof INITIAL_DATA.policy);\n      console.log('DEBUG: INITIAL_DATA.policy === null:', INITIAL_DATA.policy === null);\n      console.log('DEBUG: Current policyUuid before checks:', policyUuid);\n      console.log('DEBUG: typeof policyUuid:', typeof policyUuid);\n      \n      if (INITIAL_DATA.policy && INITIAL_DATA.policy !== null && INITIAL_DATA.policy.questions) {\n        console.log('DEBUG: Loading complete policy from INITIAL_DATA');\n        policy = INITIAL_DATA.policy;\n        restoreLocationFromPolicy(policy);\n        if (policy.v2_quote_data) {\n          v2QuoteData = policy.v2_quote_data;\n        }\n        questions = policy.questions || [];\n        answers = policy.answers || {};\n        bikes = answers.bikes || [];\n        policyUuid = policy.uuid;\n        \n        // Process bikes data same as in loadPolicyByUuid\n        bikes = bikes.map(bike => {\n          const processedBike = {};\n          \n          Object.keys(bike).forEach(key => {\n            const field = bike[key];\n            processedBike[key] = {\n              ...field,\n              choice: field.choice ? String(field.choice) : null,\n              text_answer: field.text_answer !== null && field.text_answer !== undefined ? String(field.text_answer) : '',\n              other: field.other || '',\n              items: field.items || [] // Preserve items array for List questions\n            };\n          });\n          \n          return processedBike;\n        });\n        \n        // Populate user info from user account or quote contact fields\n        if (policy.user) {\n          updateUserInfo({\n            firstName: policy.user.first_name || '',\n            lastName: policy.user.last_name || '',\n            email: policy.user.email || '',\n            phone: policy.user.phone_number || '',\n            address: policy.user.address || '',\n            addressLine2: policy.user.address_line_2 || '',\n            city: policy.user.city || '',\n            state: policy.user.state || '',\n            zipCode: policy.user.postal_code || ''\n          });\n          identifyUserInSmartlook();\n        } else if (policy.quote_contact_info) {\n          updateUserInfo(policy.quote_contact_info);\n          identifyUserInSmartlook();\n        }\n      \n        // Check if policy is already bound BEFORE step detection (skip in dev mode)\n        console.log('DEBUG: Checking policy status in onMount:', policy.status);\n        if (policy.status === 'bound' && !devModeActive) {\n          console.log('DEBUG: Policy is bound, checking if in purchase flow');\n          clearLocalStorageForBoundPolicy(); // Clear localStorage for bound policies\n          \n          // Only show bound policy view if NOT in purchase flow (i.e., user is returning)\n          if (!isInPurchaseFlow) {\n            console.log('DEBUG: Not in purchase flow, showing bound policy view');\n            showBoundPolicy = true;\n            loading = false;\n            return; // Exit early, don't proceed with form flow\n          } else {\n            console.log('DEBUG: In purchase flow, continuing to thank you page');\n            // Continue with normal flow to show thank you page\n          }\n        }\n        \n        // Check if there's a hash in the URL, otherwise use smart step detection\n        if (!devModeActive) { // Skip step detection in dev mode\n          const hashStep = getStepFromHash();\n          if (hashStep) {\n            // If user has a hash (they were at a specific step), trust it\n            // This allows resuming at the purchase step without being redirected back\n            currentStep = hashStep;\n            console.log('DEBUG: Set currentStep from hash to:', currentStep);\n          } else {\n            // Use smart step detection to determine where to start\n            const detectedStep = detectStartingStep();\n            currentStep = detectedStep;\n            console.log('DEBUG: Set currentStep to:', currentStep);\n          }\n          \n          // Set initial hash\n          updateHash(currentStep);\n        }\n        \n        // Mark that user has started the form (since we loaded existing data)\n        hasUserStartedForm = true;\n        loading = false;\n      } else if (policyUuid) {\n        console.log('DEBUG: policyUuid already set, loading full policy via API:', policyUuid);\n        // Load existing policy via API\n        await loadPolicyByUuid(policyUuid);\n        // Mark that user has started the form (since we loaded existing data)\n        hasUserStartedForm = true;\n      } else {\n        console.log('DEBUG: No INITIAL_DATA.policy and no policyUuid, checking URL...');\n        // Check URL for policy UUID (both path and query parameter formats)\n        let urlUuid = null;\n        \n        // Check path format: /{partner_slug}/policy/{uuid}/\n        const pathParts = window.location.pathname.split('/');\n        console.log('DEBUG: URL path parts:', pathParts);\n        console.log('DEBUG: Checking if pathParts[2] === \"policy\":', pathParts[2] === 'policy');\n        console.log('DEBUG: pathParts[3]:', pathParts[3]);\n        \n        if (pathParts.length >= 4 && pathParts[2] === 'policy' && pathParts[3]) {\n          urlUuid = pathParts[3];\n          console.log('DEBUG: Found UUID in path:', urlUuid);\n        }\n        \n        // Fallback: check query parameter format: ?uuid=\n        if (!urlUuid) {\n          const urlParams = new URLSearchParams(window.location.search);\n          urlUuid = urlParams.get('uuid');\n        }\n        \n        if (urlUuid) {\n          console.log('DEBUG: Found UUID, setting policyUuid and loading:', urlUuid);\n          loading = true; // Show loader immediately to prevent welcome screen flash\n          policyUuid = urlUuid;\n          await loadPolicyByUuid(urlUuid);\n        } else {\n          console.log('DEBUG: No UUID found in URL, checking for previous policy data');\n        \n          // Check for previous policy data before starting fresh\n          const previousData = checkForPreviousPolicy();\n          console.log('DEBUG: Previous policy data:', previousData);\n          if (previousData) {\n            console.log('DEBUG: Found previous policy data, showing modal');\n            previousPolicyData = previousData;\n            showPreviousPolicyModal = true;\n          } else {\n            console.log('DEBUG: No previous policy data, starting fresh');\n            // No UUID provided - start fresh form\n            console.log('Starting new policy application for partner:', partnerSlug);\n            loading = false;\n            if (!devModeActive) {\n              currentStep = 0;\n              // Set initial hash\n              updateHash(currentStep);\n            }\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Error initializing:', error);\n      showError = true;\n      errorMessage = 'Failed to initialize the application. Please try again.';\n    } finally {\n      // Enable auto-save after initialization is complete\n      allowAutoSave = true;\n      console.log('DEBUG: Auto-save enabled after initialization');\n      \n      // Add hashchange listener for browser navigation\n      window.addEventListener('hashchange', handleHashChange);\n      \n      // Set initial hash if not present\n      if (!window.location.hash) {\n        updateHash(currentStep);\n      }\n    }\n    \n    // Cleanup event listener\n    return () => {\n      window.removeEventListener('hashchange', handleHashChange);\n    };\n  });\n\n  \n  // Save form data to localStorage\n  function saveToLocalStorage() {\n    // Don't save if the previous policy modal is showing (to preserve the original data)\n    if (showPreviousPolicyModal) {\n      console.log('DEBUG: Skipping saveToLocalStorage because modal is showing');\n      return;\n    }\n    \n    // Don't save if the policy is already bound (completed)\n    if (policy && policy.status === 'bound') {\n      console.log('DEBUG: Skipping saveToLocalStorage because policy is bound');\n      return;\n    }\n    \n    //console.log('DEBUG: saveToLocalStorage called');\n    const formData = {\n      currentStep,\n      selectedState,\n      useV2Api,\n      v2QuoteData,\n      userInfo,\n      bikes,\n      policyUuid,\n      policy: policy ? {\n        id: policy.id,\n        uuid: policy.uuid,\n        policy_number: policy.policy_number,\n        status: policy.status\n      } : null,\n      timestamp: new Date().toISOString()\n    };\n    \n    localStorage.setItem('bikeinsure_form_data', JSON.stringify(formData));\n    //console.log('DEBUG: Saved to localStorage:', formData);\n  }\n  \n  // Check for valid localStorage data without restoring it\n  function checkForPreviousPolicy() {\n    try {\n      const savedData = localStorage.getItem('bikeinsure_form_data');\n      if (savedData) {\n        const formData = JSON.parse(savedData);\n        console.log('DEBUG: Found previous policy data:', formData);\n        \n        // Check if data is not too old (24 hours)\n        const savedTime = new Date(formData.timestamp);\n        const now = new Date();\n        const hoursDiff = (now - savedTime) / (1000 * 60 * 60);\n        \n        if (hoursDiff < 24) {\n          // Check if there's meaningful data (user started filling the form)\n          const hasUserInfo = formData.userInfo && (\n            formData.userInfo.firstName ||\n            formData.userInfo.lastName ||\n            formData.userInfo.email ||\n            formData.userInfo.phone\n          );\n          \n          const hasBikeInfo = formData.bikes && formData.bikes.length > 0;\n          const hasPolicyUuid = formData.policyUuid;\n          \n          // Check if the saved policy is already bound (completed)\n          // If so, we should clear the localStorage and not show the modal\n          if (hasPolicyUuid && formData.policy && formData.policy.status === 'bound') {\n            console.log('DEBUG: Saved policy is already bound, clearing localStorage');\n            localStorage.removeItem('bikeinsure_form_data');\n            return null;\n          }\n          \n          if (hasUserInfo || hasBikeInfo || hasPolicyUuid) {\n            return formData; // Return the data for preview\n          }\n        } else {\n          // Clear old data\n          localStorage.removeItem('bikeinsure_form_data');\n        }\n      }\n      return null;\n    } catch (error) {\n      console.error('Error checking for previous policy:', error);\n      return null;\n    }\n  }\n\n  // Restore form data from localStorage\n  function restoreFromLocalStorage() {\n    try {\n      const savedData = localStorage.getItem('bikeinsure_form_data');\n      if (savedData) {\n        const formData = JSON.parse(savedData);\n        \n        // Check if data is not too old (24 hours)\n        const savedTime = new Date(formData.timestamp);\n        const now = new Date();\n        const hoursDiff = (now - savedTime) / (1000 * 60 * 60);\n        \n        if (hoursDiff < 24) {\n          // Restore location/v2 state\n          if (formData.selectedState) {\n            selectedState = formData.selectedState;\n            useV2Api = formData.useV2Api || false;\n          }\n          if (formData.v2QuoteData) {\n            v2QuoteData = formData.v2QuoteData;\n          }\n\n          // Update both local userInfo and store\n          updateUserInfo(formData.userInfo);\n          bikes = formData.bikes || [];\n          policyUuid = formData.policyUuid;\n          \n          if (formData.policy) {\n            policy = formData.policy;\n          }\n          \n        // Check hash first, then use smart step detection\n        if (!devModeActive) { // Skip step detection in dev mode\n          const hashStep = getStepFromHash();\n          if (hashStep) {\n            // If user has a hash (they were at a specific step), trust it\n            // This allows resuming at the purchase step without being redirected back\n            currentStep = hashStep;\n          } else {\n            // Use smart step detection instead of saved currentStep\n            const detectedStep = detectStartingStep();\n            currentStep = detectedStep;\n          }\n          updateHash(currentStep);\n          console.log('DEBUG: Restored data and set currentStep to:', currentStep);\n        }\n          \n          console.log('Restored form data from localStorage');\n        } else {\n          // Clear old data\n          localStorage.removeItem('bikeinsure_form_data');\n        }\n      }\n    } catch (error) {\n      console.error('Error restoring from localStorage:', error);\n    }\n  }\n  \n  // Update URL with policy UUID (preserving hash)\n  function updateURL() {\n    if (policyUuid && partnerSlug) {\n      const currentHash = window.location.hash;\n      const newUrl = `${window.location.origin}/${partnerSlug}/policy/${policyUuid}/${currentHash}`;\n      window.history.replaceState({}, '', newUrl);\n    }\n  }\n  \n  // Reactive statement to save data when it changes (only after initialization and not during modal)\n  $: if (allowAutoSave && !showPreviousPolicyModal && (userInfo || bikes || currentStep || selectedState)) {\n    saveToLocalStorage();\n  }\n  \n  // Create user from form data\n  async function createUser() {\n    // Prevent duplicate user creation\n    if (isCreatingUser) {\n      console.log('DEBUG: User creation already in progress, skipping...');\n      return null;\n    }\n    \n    // If user already exists, return it\n    if (userId) {\n      console.log('DEBUG: User already exists, returning existing user ID:', userId);\n      return { id: userId };\n    }\n    \n    isCreatingUser = true;\n    try {\n      console.log('DEBUG: Creating user with store data:', $userInfoStore);\n      const response = await fetch(`${API_BASE_URL}users/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken()\n        },\n        body: JSON.stringify({\n          email: $userInfoStore.email,\n          first_name: $userInfoStore.firstName,\n          last_name: $userInfoStore.lastName,\n          phone: $userInfoStore.phone,\n          address: $userInfoStore.address,\n          address_line_2: $userInfoStore.addressLine2,\n          city: $userInfoStore.city,\n          state: $userInfoStore.state,\n          zip_code: $userInfoStore.zipCode\n        })\n      });\n      \n      if (!response.ok) {\n        throw new Error(`Failed to create user: ${response.status}`);\n      }\n      \n      const user = await response.json();\n      userId = user.id;\n      console.log('Created user:', user);\n      return user;\n      \n    } catch (error) {\n      console.error('Error creating user:', error);\n      throw error;\n    } finally {\n      isCreatingUser = false;\n    }\n  }\n  \n  // Create policy without user (user created at binding time)\n  async function createPolicy() {\n    // Prevent duplicate policy creation\n    if (isCreatingPolicy) {\n      console.log('DEBUG: Policy creation already in progress, skipping...');\n      return null;\n    }\n    \n    // If policy already exists, return it\n    if (policyUuid && policy) {\n      console.log('DEBUG: Policy already exists, returning existing policy');\n      return policy;\n    }\n    \n    isCreatingPolicy = true;\n    try {\n      const policyData = {\n        // No user field - user will be created at binding time\n        start_date: new Date().toISOString().split('T')[0]\n      };\n\n      if (selectedState?.id) {\n        policyData.location = selectedState.id;\n      }\n      \n      // If in widget mode, set source type as iframe\n      if ($widgetMode) {\n        policyData.source_type = 'iframe';\n        policyData.used_widget = true; // Keep for backward compatibility\n        console.log('🖼️ IFRAME MODE: Setting policy source_type to iframe');\n      } else {\n        // Detect if mobile or desktop based on user agent\n        const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n        policyData.source_type = isMobile ? 'mobile' : 'web';\n      }\n      \n      const response = await fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken()\n        },\n        body: JSON.stringify(policyData)\n      });\n      \n      if (!response.ok) {\n        throw new Error(`Failed to create policy: ${response.status}`);\n      }\n      \n      const newPolicy = await response.json();\n      policy = newPolicy;\n      policyUuid = newPolicy.uuid;\n      updateURL();\n      \n      console.log('✅ Created policy (quote phase - no user yet):', newPolicy);\n      return newPolicy;\n      \n    } catch (error) {\n      console.error('Error creating policy:', error);\n      throw error;\n    } finally {\n      isCreatingPolicy = false;\n    }\n  }\n  \n  function restoreLocationFromPolicy(policyData) {\n    if (policyData.location_state_code) {\n      selectedState = {\n        id: policyData.location,\n        code: policyData.location_state_code,\n        name: policyData.location_state_name\n      };\n      useV2Api = policyData.location_use_v2_api || false;\n    }\n  }\n\n  async function loadPolicyByUuid(uuid) {\n    loading = true;\n    try {\n      // Try to load policy by UUID using the location-based API\n      const response = await fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/${uuid}/`);\n      \n      if (response.status === 404) {\n        showError = true;\n        errorMessage = 'Policy not found. The policy may have been deleted or the link is invalid.';\n        return;\n      }\n      \n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n      }\n      \n      policy = await response.json();\n      restoreLocationFromPolicy(policy);\n      \n      if (policy.v2_quote_data) {\n        v2QuoteData = policy.v2_quote_data;\n      }\n      \n      console.log('DEBUG: Loaded policy by UUID:', policy);\n      console.log('DEBUG: Policy answers:', policy.answers);\n      console.log('DEBUG: Policy questions:', policy.questions);\n      \n      // Check if policy is already bound\n      console.log('DEBUG: Policy status check:', policy.status);\n      console.log('DEBUG: Policy object:', policy);\n      \n      if (policy.status === 'bound') {\n        console.log('Policy is already bound, checking if in purchase flow');\n        clearLocalStorageForBoundPolicy(); // Clear localStorage for bound policies\n        \n        // Only show bound policy view if NOT in purchase flow\n        if (!isInPurchaseFlow) {\n          console.log('Not in purchase flow, showing bound policy view');\n          showBoundPolicy = true;\n          loading = false;\n          return;  // Exit early, don't proceed with form flow\n        } else {\n          console.log('In purchase flow, continuing to thank you page');\n          // Continue with normal flow\n        }\n      } else {\n        console.log('Policy is not bound, status is:', policy.status);\n      }\n      \n      // Reset bound policy view for non-bound policies\n      showBoundPolicy = false;\n      \n      // Set the policy UUID\n      policyUuid = uuid;\n      updateURL();\n      \n      // Load questions and answers\n      questions = policy.questions || [];\n      answers = policy.answers || {};\n      bikes = answers.bikes || [];\n      \n      console.log('DEBUG: After loading policy:');\n      console.log('DEBUG: questions:', questions);\n      console.log('DEBUG: answers:', answers);\n      console.log('DEBUG: bikes:', bikes);\n      \n      // Process bikes data\n      bikes = bikes.map(bike => {\n        const processedBike = {};\n        \n        Object.keys(bike).forEach(key => {\n          const field = bike[key];\n          processedBike[key] = {\n            ...field,\n            choice: field.choice ? String(field.choice) : null,\n            text_answer: field.text_answer !== null && field.text_answer !== undefined ? String(field.text_answer) : '',\n            other: field.other || '',\n            items: field.items || [] // Preserve items array for List questions\n          };\n        });\n        \n        return processedBike;\n      });\n      \n      // Populate user info from user account or quote contact fields\n      if (policy.user) {\n        console.log('DEBUG: Policy user data:', policy.user);\n        updateUserInfo({\n          firstName: policy.user.first_name || '',\n          lastName: policy.user.last_name || '',\n          email: policy.user.email || '',\n          phone: policy.user.phone_number || '',\n          address: policy.user.address || '',\n          addressLine2: policy.user.address_line_2 || '',\n          city: policy.user.city || '',\n          state: policy.user.state || '',\n          zipCode: policy.user.postal_code || ''\n        });\n        identifyUserInSmartlook();\n      } else if (policy.quote_contact_info) {\n        console.log('DEBUG: Restoring user info from quote contact fields:', policy.quote_contact_info);\n        updateUserInfo(policy.quote_contact_info);\n        identifyUserInSmartlook();\n      } else {\n        console.log('DEBUG: No user data in policy');\n      }\n      \n      console.log('Processed bikes from UUID:', bikes);\n      console.log('Populated user info:', userInfo);\n      \n      // Only use step detection if this is initial load, not during step progression\n      if (!hasUserStartedForm && !devModeActive) { // Skip step detection in dev mode\n        // Check hash first, then use smart step detection\n        const hashStep = getStepFromHash();\n        if (hashStep) {\n          // If user has a hash (they were at a specific step), trust it\n          // This allows resuming at the purchase step without being redirected back\n          currentStep = hashStep;\n        } else {\n          // Use smart step detection to determine where to start\n          const detectedStep = detectStartingStep();\n          currentStep = detectedStep;\n        }\n        updateHash(currentStep);\n        console.log('DEBUG: Initial load - set currentStep to:', currentStep);\n      } else {\n        console.log('DEBUG: Policy reload during step progression - keeping currentStep:', currentStep);\n      }\n      \n      // Mark that user has started the form (since we loaded existing data)\n      hasUserStartedForm = true;\n      allowAutoSave = true;\n      \n    } catch (error) {\n      console.error('Error loading policy by UUID:', error);\n      showError = true;\n      errorMessage = 'Failed to load policy. Please check your connection and try again.';\n    } finally {\n      loading = false;\n    }\n  }\n  \n  async function savePolicy() {\n    loading = true;\n    try {\n      // If we don't have a policy yet, create it first (no user needed during quote phase)\n      if (!policy || !policyUuid) {\n        console.log('📋 No policy exists yet, creating policy (quote phase)...');\n        \n        // Create policy without user (user created at binding)\n        const newPolicy = await createPolicy();\n        \n        if (!newPolicy) {\n          console.log('Policy creation in progress, skipping policy save for now');\n          return;\n        }\n        \n        // Initialize bikes array\n        bikes = newPolicy.answers?.bikes || [];\n      }\n      \n      // Save/update the policy answers, policy address, and user info\n      const response = await fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/${policyUuid}/`, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken()\n        },\n        body: JSON.stringify({\n          answers: { bikes },\n          ...(selectedState?.id ? { location: selectedState.id } : {}),\n          policy_address: {\n            address: $userInfoStore.address,\n            addressLine2: $userInfoStore.addressLine2,\n            city: $userInfoStore.city,\n            state: $userInfoStore.state,\n            zipCode: $userInfoStore.zipCode\n          },\n          user_info: {\n            firstName: $userInfoStore.firstName,\n            lastName: $userInfoStore.lastName,\n            email: $userInfoStore.email,\n            phone: $userInfoStore.phone,\n            address: $userInfoStore.address,\n            addressLine2: $userInfoStore.addressLine2,\n            city: $userInfoStore.city,\n            state: $userInfoStore.state,\n            zipCode: $userInfoStore.zipCode,\n          },\n          ...(v2QuoteData ? { v2_quote_data: v2QuoteData } : {})\n        })\n      });\n      \n      if (response.ok) {\n        const updatedPolicy = await response.json();\n        policy = updatedPolicy; // UPDATE: Uncommented to keep ctx.policy in sync with server\n        \n        // Update UUID if it changed\n        if (updatedPolicy.uuid) {\n          policyUuid = updatedPolicy.uuid;\n          updateURL();\n        }\n        \n        return true;\n      } else {\n        console.error('Save failed:', response.status, response.statusText);\n        return false;\n      }\n    } catch (error) {\n      console.error('Error saving policy:', error);\n      return false;\n    } finally {\n      loading = false;\n    }\n  }\n\n  // Save policy to server without updating local state (for background sync)\n  async function savePolicyToServer() {\n    try {\n      // Save/update the policy answers, policy address, and user info\n      const response = await fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/${policyUuid}/`, {\n        method: 'PUT',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRFToken': getCsrfToken()\n        },\n        body: JSON.stringify({\n          answers: { bikes },\n          ...(selectedState?.id ? { location: selectedState.id } : {}),\n          policy_address: {\n            address: $userInfoStore.address,\n            addressLine2: $userInfoStore.addressLine2,\n            city: $userInfoStore.city,\n            state: $userInfoStore.state,\n            zipCode: $userInfoStore.zipCode\n          },\n          user_info: {\n            firstName: $userInfoStore.firstName,\n            lastName: $userInfoStore.lastName,\n            email: $userInfoStore.email,\n            phone: $userInfoStore.phone,\n            address: $userInfoStore.address,\n            addressLine2: $userInfoStore.addressLine2,\n            city: $userInfoStore.city,\n            state: $userInfoStore.state,\n            zipCode: $userInfoStore.zipCode,\n          },\n          ...(v2QuoteData ? { v2_quote_data: v2QuoteData } : {})\n        })\n      });\n      \n      if (response.ok) {\n        // Update ctx.policy with the server response to keep them in sync\n        const updatedPolicy = await response.json();\n        policy = updatedPolicy;\n        console.log('Background sync successful (policy + policy address + user info) - ctx.policy updated');\n        return true;\n      } else {\n        console.error('Background sync failed:', response.status, response.statusText);\n        return false;\n      }\n    } catch (error) {\n      console.error('Background sync error:', error);\n      return false;\n    }\n  }\n  \n  \n  function getCsrfToken() {\n    return INITIAL_DATA.csrfToken || document.querySelector('[name=csrfmiddlewaretoken]')?.value || '';\n  }\n  \n  // Auto-save function with debouncing - only saves to localStorage, not server\n  function triggerAutoSave() {\n    // Save to localStorage immediately to prevent data loss\n    saveToLocalStorage();\n    \n    // DISABLED: No longer auto-sync to server - only save on explicit Continue button clicks\n    // This prevents duplicate policy creation from reactive saves\n    \n    // // Debounce server sync\n    // if (autoSaveTimeout) {\n    //   clearTimeout(autoSaveTimeout);\n    // }\n    // \n    // autoSaveTimeout = setTimeout(async () => {\n    //   await performBackgroundSync();\n    // }, 3000); // Sync with server after 3 seconds of inactivity\n  }\n  \n  // Background sync function - syncs with server without updating UI\n  async function performBackgroundSync() {\n    if (isAutoSaving) return;\n    \n    try {\n      isAutoSaving = true;\n      \n      // If user hasn't started the form yet, but we have user info, create user and policy\n      if (!hasUserStartedForm && hasValidUserInfo()) {\n        await createPolicyIfNeeded();\n        hasUserStartedForm = true;\n        return; // createPolicyIfNeeded already updates the policy\n      }\n      \n      // If we have a policy, sync current state to server (without updating local policy)\n      if (policy && policyUuid) {\n        await savePolicyToServer();\n      }\n      \n    } catch (error) {\n      console.error('Background sync failed:', error);\n    } finally {\n      isAutoSaving = false;\n    }\n  }\n\n  // Perform full auto-save (used for step transitions)\n  async function performAutoSave() {\n    if (isAutoSaving) return;\n    \n    try {\n      isAutoSaving = true;\n      \n      // If user hasn't started the form yet, but we have user info, create user and policy\n      if (!hasUserStartedForm && hasValidUserInfo()) {\n        await createPolicyIfNeeded();\n        hasUserStartedForm = true;\n      }\n      \n      // If we have a policy, save the current state (includes user info)\n      if (policy && policyUuid) {\n        await savePolicy();\n      }\n      \n      // Save to localStorage\n      saveToLocalStorage();\n      \n    } catch (error) {\n      console.error('Auto-save failed:', error);\n    } finally {\n      isAutoSaving = false;\n    }\n  }\n  \n  // Check if user has filled out enough info to create a user\n  function hasValidUserInfo() {\n    return $userInfoStore.firstName?.trim() && \n           $userInfoStore.lastName?.trim() && \n           $userInfoStore.email?.trim() && \n           $userInfoStore.phone?.trim();\n  }\n  \n  // Ensure questions are loaded before showing bike details step\n  async function ensureQuestionsLoaded() {\n    if (questions.length > 0) {\n      return true; // Questions already loaded\n    }\n    \n    // If no policy exists yet, create user and policy first\n    if (!policy || !policyUuid) {\n      if (hasValidUserInfo()) {\n        console.log('No policy exists, creating user and policy first...');\n        await createPolicyIfNeeded();\n        hasUserStartedForm = true;\n      } else {\n        console.log('User info not complete, cannot proceed to bike details');\n        // Don't throw error - let the step validation handle it\n        return false;\n      }\n    }\n    \n    // Reload the policy to get questions\n    try {\n      console.log('Loading questions for policy:', policyUuid);\n      await loadPolicyByUuid(policyUuid);\n      \n      if (questions.length === 0) {\n        console.warn('No questions loaded for policy. This might indicate a backend issue.');\n        // Don't throw error, allow user to proceed but log the issue\n      }\n      \n      return true; // Success\n    } catch (error) {\n      console.error('Failed to load questions:', error);\n      throw new Error('Failed to load bike questions. Please try again.');\n    }\n  }\n  \n  // Create policy when user starts filling form (no user needed during quote phase)\n  async function createPolicyIfNeeded() {\n    try {\n      // If policy already exists, don't create another one\n      if (policyUuid && policy) {\n        console.log('DEBUG: Policy already exists, skipping createPolicyIfNeeded');\n        return policy;\n      }\n      \n      // Create policy without user (user created at binding)\n      const newPolicy = await createPolicy();\n      \n      // If policy creation is already in progress, return null\n      if (!newPolicy) {\n        console.log('Policy creation in progress, will retry later');\n        return null;\n      }\n      \n      // Update URL immediately\n      updateURL();\n      \n      console.log('✅ Auto-created policy (quote phase - no user yet):', { policy: newPolicy });\n      return newPolicy;\n      \n    } catch (error) {\n      console.error('Error creating policy:', error);\n      throw error;\n    }\n  }\n  \n  // Component references\n  let userInfoStepComponent;\n  let bikeDetailsStepComponent;\n  let agreePayStepComponent;\n  \n  function handleStateSelected(event) {\n    const { locationId, stateCode, stateName, useV2Api: v2 } = event.detail;\n    selectedState = { id: locationId, code: stateCode, name: stateName };\n    useV2Api = v2;\n    v2QuoteData = null;\n\n    if (policyUuid) {\n      fetch(`${API_BASE_URL}partner-programs/${partnerSlug}/policies/${policyUuid}/`, {\n        method: 'PUT',\n        headers: { 'Content-Type': 'application/json', 'X-CSRFToken': getCsrfToken() },\n        body: JSON.stringify({ location: locationId, v2_quote_data: null })\n      }).then(res => {\n        if (res.ok) return res.json();\n      }).then(updated => {\n        if (updated) policy = updated;\n      }).catch(err => console.error('Failed to update policy location:', err));\n    }\n\n    currentStep = 1;\n    updateHash(currentStep);\n  }\n\n  function handleV2ContinueToEnrollment(event) {\n    const { bikes: bikeObjects, hasAssociation, selectedPlans, membership } = event.detail;\n    v2QuoteData = { bikes: bikeObjects, hasAssociation, selectedPlans, membership };\n    currentStep = 2;\n    updateHash(currentStep);\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n  }\n\n  // Step navigation\n  async function nextStep() {\n    if (isTransitioning) return; // Prevent double-clicks\n    console.log('DEBUG: nextStep called, currentStep:', currentStep);\n    if (currentStep === 2) {\n      console.log('DEBUG: Validating user info step');\n      const isValid = userInfoStepComponent?.validateUserInfo();\n      console.log('DEBUG: User info validation result:', isValid);\n      if (!isValid) {\n        console.log('DEBUG: User info validation failed, stopping');\n        return;\n      }\n    } else if (currentStep === 3) {\n      console.log('DEBUG: Validating bike details step');\n      if (!bikeDetailsStepComponent?.validateBikes()) return;\n    } else if (currentStep === 4) {\n      console.log('DEBUG: Validating agree & pay step');\n      if (!agreePayStepComponent?.validateAgreePayStep()) return;\n    }\n    \n    isTransitioning = true;\n    \n    try {\n      // Save to server before proceeding to next step\n      await performAutoSave();\n      \n      // If transitioning to step 3 (bike details), ensure we have questions loaded\n      if (currentStep === 2) {\n        const questionsReady = await ensureQuestionsLoaded();\n        if (questionsReady === false) {\n          // User info not complete, stay on current step\n          console.log('Cannot proceed: user info incomplete');\n          return;\n        }\n      }\n      \n      currentStep++;\n      updateHash(currentStep);\n      \n      if (currentStep === 2) {\n        identifyUserInSmartlook();\n      }\n\n      const stepName = stepToHash[currentStep] || `step${currentStep}`;\n      trackSmartlookEvent('StepProgression', {\n        type: 'StepEntered',\n        step_number: currentStep,\n        step_name: stepName,\n        bikes_count: bikes.length,\n        has_user_info: !!(userInfo.email && userInfo.firstName && userInfo.lastName)\n      });\n      \n      // Wait for DOM to update before scrolling\n      await tick();\n      \n      // Scroll to top of page on step change (mobile-friendly)\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n      \n      // Mark as in purchase flow when reaching payment step\n      if (currentStep === 5) {\n        console.log('DEBUG: User reached payment step, marking as in purchase flow');\n        isInPurchaseFlow = true;\n        \n        // Track entering payment/checkout\n        trackSmartlookEvent('CheckoutStarted', {\n          type: 'PaymentStepReached',\n          bikes_count: bikes.length,\n          estimated_premium: policy?.premium || 0\n        });\n      }\n      \n      // Also save to localStorage\n      saveToLocalStorage();\n      \n    } catch (error) {\n      console.error('Error during step transition:', error);\n      // Show error to user\n      errorMessage = 'Failed to proceed to next step. Please try again.';\n      showError = true;\n    } finally {\n      isTransitioning = false;\n    }\n  }\n\n  async function prevStep() {\n    // Decrement step BEFORE saving so the loading toggle in savePolicy()\n    // doesn't briefly remount the component we're leaving (e.g. PaymentStep).\n    currentStep--;\n    updateHash(currentStep);\n\n    // Save in the background after step change\n    await performAutoSave();\n    \n    // Wait for DOM to update before scrolling\n    await tick();\n    \n    // Scroll to top of page on step change (mobile-friendly)\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    \n    saveToLocalStorage();\n  }\n  \n  async function navigateToStep(targetStep) {\n    // Don't allow navigation forward without validation\n    if (targetStep > currentStep) {\n      const isValid = validateStep();\n      if (!isValid) {\n        alert('Please complete all required fields before completing.');\n        return;\n      }\n    }\n    \n    // Change step BEFORE saving so the loading toggle in savePolicy()\n    // doesn't briefly remount the component we're leaving.\n    currentStep = targetStep;\n    updateHash(currentStep);\n\n    await performAutoSave();\n    \n    // Wait for DOM to update before scrolling\n    await tick();\n    \n    // Scroll to top of page on step change (mobile-friendly)\n    window.scrollTo({ top: 0, behavior: 'smooth' });\n    \n    saveToLocalStorage();\n  }\n  \n  function handlePaymentComplete(event) {\n    hideHeaderOnPaymentComplete = true;\n    clearLocalStorageForBoundPolicy();\n\n    // Track successful payment completion\n    trackSmartlookEvent('PurchaseCompleted', {\n      type: 'PaymentSuccess',\n      policy_number: policy?.policy_number || 'pending',\n      bikes_count: bikes.length,\n      premium: policy?.premium || 0,\n      currency: policy?.premium_currency || 'USD'\n    });\n  }\n  \n  function validateStep() {\n    if (currentStep === 2) {\n      return userInfoStepComponent?.validateUserInfo();\n    } else if (currentStep === 3) {\n      return bikeDetailsStepComponent?.validateBikes();\n    } else if (currentStep === 4) {\n      return agreePayStepComponent?.validateAgreePayStep();\n    } else if (currentStep === 5) {\n      // Payment step validation if needed\n      return true;\n    }\n    return true;\n  }\n  \n  // Smart step detection based on existing policy data\n  function detectStartingStep() {\n    console.log('DEBUG: Detecting starting step for policy:', policy);\n\n    // Start at state selection if no state chosen yet\n    if (!selectedState) {\n      console.log('DEBUG: No state selected, starting at step 0 (State Select)');\n      return 0;\n    }\n\n    // Always start at step 1 (Welcome) if no policy exists\n    if (!policy) {\n      console.log('DEBUG: No policy found, starting at step 1 (Welcome)');\n      return 1;\n    }\n    \n    // Check signature completion FIRST - if user has signed, they must have completed all previous steps\n    // This prevents getting stuck at bike details step when signature is complete\n    const signatureComplete = isSignatureComplete();\n    console.log('DEBUG: Signature complete:', signatureComplete);\n    \n    if (signatureComplete) {\n      // If signature is complete, skip to payment step regardless of bike details validation\n      console.log('DEBUG: Signature complete, going directly to step 5 (Payment)');\n      return 5;\n    }\n    \n    // Check user info completion\n    const userInfoComplete = isUserInfoComplete();\n    console.log('DEBUG: User info complete:', userInfoComplete);\n    \n    if (!userInfoComplete) {\n      console.log('DEBUG: User info incomplete, starting at step 2 (User Info)');\n      return 2;\n    }\n    \n    // Check bike details completion\n    const bikeDetailsComplete = isBikeDetailsComplete();\n    console.log('DEBUG: Bike details complete:', bikeDetailsComplete);\n    \n    if (!bikeDetailsComplete) {\n      console.log('DEBUG: Bike details incomplete, starting at step 3 (Bike Details)');\n      return 3;\n    }\n    \n    // If bike details are complete but no signature, go to signature step\n    console.log('DEBUG: Bike details complete but no signature, starting at step 4 (Agree & Pay)');\n    return 4;\n  }\n  \n  function isUserInfoComplete() {\n    // Check user info from policy.user (from API)\n    if (policy?.user) {\n      const user = policy.user;\n      const policyUserComplete = !!(\n        user.first_name?.trim() &&\n        user.last_name?.trim() &&\n        user.email?.trim() &&\n        user.phone_number?.trim() &&\n        user.address?.trim() &&\n        user.city?.trim() &&\n        user.state?.trim() &&\n        user.postal_code?.trim()\n      );\n      if (policyUserComplete) return true;\n    }\n    \n    // Check user info from local userInfo (from form or localStorage)\n    return !!(\n      userInfo.firstName?.trim() &&\n      userInfo.lastName?.trim() &&\n      userInfo.email?.trim() &&\n      userInfo.phone?.trim() &&\n      userInfo.address?.trim() &&\n      userInfo.city?.trim() &&\n      userInfo.state?.trim() &&\n      userInfo.zipCode?.trim()\n    );\n  }\n  \n  function isBikeDetailsComplete() {\n    // Check bikes from policy.bike_details (from API)\n    if (policy?.bike_details && policy.bike_details.length > 0) {\n      return policy.bike_details.some(bike => {\n        return !!(\n          bike.manufacturer?.trim() &&\n          bike.model?.trim() &&\n          bike.model_year &&\n          bike.purchase_price &&\n          (bike.theft_protection === true || bike.theft_protection === false) // Must be explicitly set\n        );\n      });\n    }\n    \n    // Check bikes from local bikes array (from localStorage or form data)\n    if (bikes && bikes.length > 0) {\n      return bikes.some(bike => {\n        const manufacturer = bike['bike-manufacturer']?.text_answer;\n        const model = bike['bike-model']?.text_answer;\n        const year = bike['bike-model-year']?.text_answer;\n        const price = bike['bike-purchase-price']?.text_answer;\n        const theftProtection = bike['theft-protection']?.text_answer || bike['bikeinsure-plan-options']?.text_answer;\n        \n        return !!(\n          manufacturer?.trim() &&\n          model?.trim() &&\n          year?.trim() &&\n          price?.trim() &&\n          theftProtection?.trim() // Must have theft protection selection\n        );\n      });\n    }\n    \n    return false;\n  }\n  \n  function isSignatureComplete() {\n    return !!(policy?.signature);\n  }\n  \n  // Handle user choice to continue with previous policy\n  async function continuePreviousPolicy() {\n    console.log('User chose to continue previous policy');\n    showPreviousPolicyModal = false;\n    \n    // Restore the data\n    restoreFromLocalStorage();\n    \n    // If we have a saved policy UUID, try to load it\n    if (policyUuid) {\n      await loadPolicyByUuid(policyUuid);\n    } else {\n      // No UUID yet - user is starting fresh but with saved local data\n      // Make sure we're not stuck in loading state\n      loading = false;\n    }\n    \n    // Mark that user has started the form\n    hasUserStartedForm = true;\n    \n    // Enable auto-save now that we've restored data\n    allowAutoSave = true;\n  }\n  \n  // Handle user choice to start fresh\n  function startFreshPolicy() {\n    console.log('User chose to start fresh policy');\n    showPreviousPolicyModal = false;\n    \n    // Clear all data\n    localStorage.removeItem('bikeinsure_form_data');\n    \n    // Reset form to initial state\n    selectedState = null;\n    useV2Api = false;\n    currentStep = 0;\n    policy = null;\n    bikes = [];\n    isInPurchaseFlow = false; // Reset purchase flow flag\n    loading = false; // Ensure loading is false\n    showError = false; // Clear any errors\n    errorMessage = null;\n    \n    // Reset both local userInfo and store\n    updateUserInfo({\n      firstName: '',\n      lastName: '',\n      email: '',\n      phone: '',\n      address: '',\n      addressLine2: '',\n      city: '',\n      state: '',\n      zipCode: ''\n    });\n    errors = {};\n    policyUuid = null;\n    previousPolicyData = null;\n    hasUserStartedForm = false; // Reset this flag\n    \n    // Set hash for fresh start\n    updateHash(currentStep);\n    \n    // Enable auto-save for the fresh start\n    allowAutoSave = true;\n    \n    console.log('Starting fresh policy application for partner:', partnerSlug);\n    console.log('Current state after reset:', { currentStep, loading, showError, policy, bikes });\n  }\n  \n  // Clear localStorage when policy becomes bound\n  function clearLocalStorageForBoundPolicy() {\n    console.log('DEBUG: Clearing localStorage for bound policy');\n    localStorage.removeItem('bikeinsure_form_data');\n  }\n  \n  // Function to transition from thank you page to bound policy view\n  function viewBoundPolicy() {\n    console.log('DEBUG: Transitioning from thank you to bound policy view');\n    isInPurchaseFlow = false; // Reset purchase flow flag\n    clearLocalStorageForBoundPolicy(); // Clear localStorage\n    showBoundPolicy = true; // Show bound policy view\n  }\n\n  function startNewApplication() {\n    // Clear all data\n    localStorage.removeItem('bikeinsure_form_data');\n    \n    // Reset form\n    selectedState = null;\n    useV2Api = false;\n    currentStep = 0;\n    policy = null;\n    bikes = [];\n    isInPurchaseFlow = false; // Reset purchase flow flag\n    loading = false; // Ensure loading is false\n    showError = false; // Clear any errors\n    errorMessage = null;\n    showBoundPolicy = false; // Make sure bound policy view is hidden\n    \n    // Reset both local userInfo and store\n    updateUserInfo({\n      firstName: '',\n      lastName: '',\n      email: '',\n      phone: '',\n      address: '',\n      addressLine2: '',\n      city: '',\n      state: '',\n      zipCode: ''\n    });\n    errors = {};\n    policyUuid = null;\n    hasUserStartedForm = false; // Reset this flag\n    \n    // Set hash for new application\n    updateHash(currentStep);\n    \n    console.log('Started new application for partner:', partnerSlug);\n    console.log('Current state after reset:', { currentStep, loading, showError, showBoundPolicy, policy, bikes });\n  }\n</script>\n\n<div class=\"app-container\" class:maintenance-disabled={maintenanceMode} aria-hidden={maintenanceMode || undefined}>\n  <!-- Show bound policy view if policy is already bound -->\n  {#if showBoundPolicy}\n    <BoundPolicyView />\n  {:else}    \n    <div class=\"form-container\"> \n      <!-- Logo Section - Hide on payment complete -->\n      {#if !hideHeaderOnPaymentComplete}\n        <div class=\"logo-section\">\n          <img src=\"/static/BikeInsure_simple_logo.png\" alt=\"BikeInsure Logo\" class=\"main-logo\" />\n        </div>\n      {/if}\n      \n      {#if showError}\n        <div class=\"error-container\">\n          <div class=\"error-icon\">⚠️</div>\n          <h2>Error</h2>\n          <p>{errorMessage}</p>\n          <div class=\"error-actions\">\n            <button class=\"btn btn-primary\" on:click={() => window.location.reload()}>\n              Reload Page\n            </button>\n            <button class=\"btn btn-secondary\" on:click={() => window.history.back()}>\n              Go Back\n            </button>\n          </div>\n        </div>\n      {:else if loading}        \n        <BikeInsureLoader size=\"large\" message=\"Fetching details...\" />\n      {:else}\n          <!-- Only show form if no error and not loading -->\n          {#if !showError && !loading}\n              <!-- Step 0: State Selection -->\n              {#if currentStep === 0}\n                <StateSelectStep on:stateSelected={handleStateSelected} />\n              {/if}\n\n              <!-- V2 Flow: only step 1 is the V2 quick-quote -->\n              {#if useV2Api && currentStep === 1}\n                <V2Flow\n                  stateCode={selectedState?.code ?? ''}\n                  on:continueToEnrollment={handleV2ContinueToEnrollment}\n                />\n              {:else}\n                <!-- Progress Bar - Show only for steps 2, 3, 4, 5 and hide on payment complete -->\n                {#if currentStep >= 2 && currentStep <= 5 && !hideHeaderOnPaymentComplete}\n                  <ProgressBar {currentStep} onStepClick={navigateToStep} />\n                {/if}\n                \n                <!-- Step 1: Welcome (V1 only) -->\n                {#if currentStep === 1}\n                  <WelcomeStep />\n                {/if}\n                \n                <!-- Step 2: Personal Information (shared V1/V2) -->\n                {#if currentStep === 2}\n                  <UserInfoStep \n                    bind:this={userInfoStepComponent}\n                  />\n                {/if}\n                \n                <!-- Step 3: Bike Details (shared V1/V2, V2 pre-fills) -->\n                {#if currentStep === 3}\n                  <BikeDetailsStep \n                    bind:this={bikeDetailsStepComponent}\n                  />\n                {/if}\n                \n                <!-- Step 4: Agree & Pay (shared) -->\n                {#if currentStep === 4}\n                  <AgreePayStep \n                    bind:this={agreePayStepComponent}\n                  />\n                {/if}\n                \n                <!-- Step 5: Payment (shared, backend handles V2 via _v2_context) -->\n                {#if currentStep === 5}\n                  <PaymentStep \n                    devModePaymentComplete={devModePaymentComplete} \n                    on:paymentComplete={handlePaymentComplete}\n                  />\n                {/if}\n              {/if}\n          {/if}\n\n        {/if}\n    </div>\n  {/if}\n</div>\n\n<!-- Previous Policy Detection Modal -->\n{#if showPreviousPolicyModal && previousPolicyData}\n  <div class=\"modal-overlay\">\n    <div class=\"modal-content previous-policy-modal\">\n      <div class=\"modal-header\">\n        <h2>Resume Application?</h2>\n      </div>\n      \n      <div class=\"modal-body\">\n        <p class=\"modal-subtitle\">\n          BikeInsure Saved Your Application:\n        </p>\n        <p class=\"modal-timestamp\">\n          {new Date(previousPolicyData.timestamp).toLocaleString('en-US', { \n            timeZone: 'America/New_York',\n            month: 'numeric',\n            day: 'numeric', \n            year: 'numeric',\n            hour: 'numeric',\n            minute: '2-digit',\n            hour12: true\n          })} EST\n        </p>\n        \n      \n      </div>\n      \n      <div class=\"modal-actions\">\n        <button class=\"btn btn-continue\" on:click={continuePreviousPolicy}>\n          Continue\n        </button>\n        <button class=\"btn btn-start-new\" on:click={startFreshPolicy}>\n          Start New\n        </button>\n      </div>\n    </div>\n  </div>\n{/if}\n\n{#if enableChatbot && !maintenanceMode}\n  <ChatWidget />\n{/if}\n\n{#if maintenanceMode}\n  <MaintenanceModal message={maintenanceMessage} />\n{/if}\n\n<style lang=\"scss\">\n  .app-container {\n    margin: 0 auto;\n  }\n\n  .app-container.maintenance-disabled {\n    pointer-events: none;\n    user-select: none;\n    filter: blur(2px);\n    opacity: 0.5;\n  }\n  \n  .url-info {\n    text-align: center;\n    margin-bottom: 20px;\n    padding: 10px;\n    background: #f8f9fa;\n    border-radius: 4px;\n    color: #666;\n  }\n  \n  .url-info a {\n    color: #007bff;\n    text-decoration: none;\n  }\n  \n  .main-logo {\n    max-height: 80px;\n    width: auto;\n    margin-bottom: 10px;\n  }\n  \n  .url-info a:hover {\n    text-decoration: underline;\n  }\n  \n  .progress-bar {\n    display: flex;\n    justify-content: space-between;\n    margin-bottom: 40px;\n    padding: 0 20px;\n  }\n  \n  .progress-step {\n    display: flex;\n    flex-direction: column;\n    align-items: center;  \n    flex: 1;\n    position: relative;\n  }\n\n  :global(.form-content .header){\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    width: 100%;\n  }\n  :global(.form-content .header .back-button){\n    background: none;\n    border: none;\n    cursor: pointer;\n    padding: 8px;\n    border-radius: 6px;\n    color: #666;\n    transition: background-color 0.2s;\n    font-size: 21px;\n  }\n  :global(.form-content .header .back-button:hover){\n    background-color: #f0f0f0;\n  }\n  :global(.form-content .header .step-count){\n    font-size: 16px;\n    color: #666;\n    font-weight: 500;\n  }\n\n  :global(.form-content .header .form-title){\n    text-align: center;\n    padding: 20px 0;\n  }\n  :global(.form-content .header .form-title h1){\n    font-size: 24px;\n    font-weight: 600;\n    color: #333;\n    margin: 0;\n  } \n\n  :global(.submit-btn){\n    width: 100%;\n    background: linear-gradient(135deg, #c53030 0%, #e53e3e 100%);\n    color: white;\n    border: none;\n    border-radius: 50px;\n    padding: 18px 30px;\n    font-size: 16px;\n    font-weight: 600;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    box-shadow: 0 4px 15px rgba(197, 48, 48, 0.3);\n    margin: 30px 0 20px 0;\n  }\n\n  :global(.submit-btn:hover){\n    transform: translateY(-2px);\n    box-shadow: 0 6px 20px rgba(197, 48, 48, 0.4);\n  }\n  :global(.submit-btn:disabled){\n    opacity: 0.6;\n    cursor: not-allowed;\n  }\n  \n  :global(.submit-btn:active){\n    transform: translateY(0);\n  }\n  \n \n  .progress-step:not(:last-child)::after {\n    content: '';\n    position: absolute;\n    top: 20px;\n    left: 60%;\n    width: 80%;\n    height: 2px;\n    background: #e0e0e0;\n    z-index: 1;\n  }\n  \n  .progress-step.completed:not(:last-child)::after {\n    background: #28a745;\n  }\n  \n  .step-number {\n    width: 40px;\n    height: 40px;\n    border-radius: 50%;\n    background: #e0e0e0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-weight: bold;\n    color: #666;\n    margin-bottom: 8px;\n    position: relative;\n    z-index: 2;\n  }\n  \n  .progress-step.active .step-number {\n    background: #007bff;\n    color: white;\n  }\n  \n  .progress-step.completed .step-number {\n    background: #28a745;\n    color: white;\n  }\n  \n  .step-label {\n    font-size: 14px;\n    color: #666;\n    text-align: center;\n  }\n  \n  .progress-step.active .step-label {\n    color: #007bff;\n    font-weight: bold;\n  }\n  \n  .form-container {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    min-height: 100vh;\n    background: #eee;\n    padding:20px;\n  }\n  \n  .step-content {\n    margin-bottom: 30px;\n  }\n  \n  :global(.form-row) {\n    margin-bottom: 30px;\n  }\n  \n  .form-group {\n    flex: 1;\n  }\n  \n  .form-group label {\n    display: block;\n    margin-bottom: 8px;\n    font-weight: bold;\n    color: #333;\n  }\n  \n  .form-group input,\n  .form-group select,\n  .form-group textarea {\n    width: 100%;\n    padding: 12px;\n    border: 2px solid #e0e0e0;\n    border-radius: 6px;\n    font-size: 16px;\n    transition: border-color 0.3s;\n  }\n  \n  .form-group input:focus,\n  .form-group select:focus,\n  .form-group textarea:focus {\n    outline: none;\n    border-color: #007bff;\n  }\n  \n  .form-group input.error,\n  .form-group select.error,\n  .form-group textarea.error {\n    border-color: #dc3545;\n  }\n  \n  .form-group textarea {\n    height: 100px;\n    resize: vertical;\n  }\n  \n  .error-message {\n    color: #dc3545;\n    font-size: 14px;\n    margin-top: 5px;\n    display: block;\n  }\n  \n  .bikes-section h3 {\n    margin-bottom: 20px;\n    color: #333;\n  }\n  \n  .bike-card {\n    border: 2px solid #e0e0e0;\n    border-radius: 8px;\n    padding: 25px;\n    margin-bottom: 25px;\n    background: #f8f9fa;\n  }\n  \n  .bike-card-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 20px;\n  }\n  \n  .bike-card-header h4 {\n    margin: 0;\n    color: #333;\n  }\n  \n  .payment-summary {\n    background: #f8f9fa;\n    padding: 20px;\n    border-radius: 8px;\n    margin-bottom: 30px;\n  }\n  \n  .summary-item {\n    display: flex;\n    justify-content: space-between;\n    margin-bottom: 10px;\n    padding-bottom: 10px;\n    border-bottom: 1px solid #e0e0e0;\n  }\n  \n  .summary-total {\n    margin-top: 15px;\n    padding-top: 15px;\n    border-top: 2px solid #007bff;\n    text-align: right;\n    font-size: 18px;\n  }\n  \n  .card-element {\n    padding: 12px;\n    border: 2px solid #e0e0e0;\n    border-radius: 6px;\n    background: white;\n  }\n  \n  .billing-info {\n    margin-top: 20px;\n    padding: 20px;\n    background: #f8f9fa;\n    border-radius: 8px;\n  }\n  \n  .billing-info h4 {\n    margin-top: 0;\n    margin-bottom: 15px;\n    color: #333;\n  }\n  \n  .success-step {\n    text-align: center;\n    padding: 60px 20px;\n    max-width: 800px;\n    margin: 0 auto;\n  }\n  \n  .success-logo {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin-bottom: 40px;\n    \n    img {\n      width: 200px;\n      height: auto;\n      margin-bottom: 20px;\n    }\n  }\n  \n  .badge-text {\n    text-align: center;\n    font-weight: 600;\n    \n    .badge-top {\n      font-size: 14px;\n      color: #1a2332;\n      letter-spacing: 1px;\n      margin-bottom: 4px;\n    }\n    \n    .badge-bottom {\n      font-size: 18px;\n      color: #1a2332;\n      letter-spacing: 2px;\n    }\n  }\n  \n  .success-title {\n    font-size: 56px;\n    font-weight: 700;\n    color: #1a2332;\n    margin: 0 0 40px 0;\n  }\n  \n  .success-messages {\n    margin-bottom: 40px;\n    \n    .success-message {\n      font-size: 18px;\n      line-height: 1.6;\n      color: #333;\n      margin: 16px 0;\n      \n      &.highlight {\n        font-weight: 600;\n        color: #1a2332;\n      }\n    }\n  }\n  \n  .success-contact {\n    margin-bottom: 40px;\n    \n    p {\n      font-size: 18px;\n      color: #333;\n      margin: 0;\n    }\n    \n    a {\n      color: #4a7ba7;\n      text-decoration: none;\n      \n      &:hover {\n        text-decoration: underline;\n      }\n    }\n  }\n  \n  .success-actions {\n    display: flex;\n    gap: 16px;\n    justify-content: center;\n    margin-top: 40px;\n    flex-wrap: wrap;\n  }\n  \n  .btn {\n    padding: 12px 24px;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    font-size: 16px;\n    font-weight: bold;\n    transition: background-color 0.3s;\n    margin-right: 10px;\n  }\n  \n  .btn-primary {\n    background-color: #007bff;\n    color: white;\n  }\n  \n  .btn-primary:hover {\n    background-color: #0056b3;\n  }\n  \n  .btn-secondary {\n    background-color: #6c757d;\n    color: white;\n  }\n  \n  .btn-secondary:hover {\n    background-color: #545b62;\n  }\n  \n  .btn:disabled {\n    opacity: 0.6;\n    cursor: not-allowed;\n  }  \n  \n  .btn-danger {\n    background-color: #dc3545;\n    color: white;\n  }\n  \n  .btn-danger:hover {\n    background-color: #c82333;\n  }\n  \n  .btn-sm {\n    padding: 6px 12px;\n    font-size: 14px;\n  }\n  \n  .btn:disabled {\n    opacity: 0.6;\n    cursor: not-allowed;\n  }\n  \n  .loading {\n    text-align: center;\n    padding: 40px;\n    color: #666;\n    font-size: 18px;\n  }\n  \n  .error-container {\n    text-align: center;\n    padding: 40px 20px;\n    background: #fff3cd;\n    border: 1px solid #ffeaa7;\n    border-radius: 8px;\n    margin: 20px 0;\n  }\n  \n  .error-icon {\n    font-size: 72px;\n    margin-bottom: 20px;\n  }\n  \n  .error-container h2 {\n    color: #856404;\n    margin-bottom: 15px;\n    font-size: 24px;\n  }\n  \n  .error-container p {\n    color: #856404;\n    font-size: 16px;\n    margin-bottom: 30px;\n  }\n  \n  .error-actions {\n    display: flex;\n    gap: 15px;\n    justify-content: center;\n  }\n  \n  .form-actions {\n    margin-top: 40px;\n    text-align: center;\n    padding-top: 20px;\n    border-top: 1px solid #e0e0e0;\n  }\n  \n  h1 {\n    text-align: center;\n    color: #333;\n    margin-bottom: 30px;\n    font-size: 28px;\n  }\n  \n  h2 {\n    color: #333;\n    margin-bottom: 25px;\n    font-size: 24px;\n  }\n  \n  h3 {\n    color: #333;\n    margin-bottom: 20px;\n    font-size: 20px;\n  }\n  \n  @media (max-width: 768px) {\n    .form-row {\n      flex-direction: column;\n      gap: 0;\n    }\n    \n    .progress-bar {\n      padding: 0 10px;\n    }\n    \n    .progress-step {\n      font-size: 12px;\n    }\n    \n    .step-number {\n      width: 30px;\n      height: 30px;\n    }\n    \n    .form-container {\n      padding: 20px;\n    }\n  }\n\n  /* Previous Policy Detection Modal Styles */\n  .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0, 0, 0, 0.6);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 1000;\n    padding: 20px;\n    animation: fadeIn 0.3s ease-out;\n  }\n\n  @keyframes fadeIn {\n    from { opacity: 0; }\n    to { opacity: 1; }\n  }\n\n  .previous-policy-modal {\n    background: white;\n    border-radius: 16px;\n    max-width: 500px;\n    width: 100%;\n    max-height: 90vh;\n    overflow-y: auto;\n    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);\n    animation: slideIn 0.3s ease-out;\n  }\n\n  @keyframes slideIn {\n    from { transform: translateY(-20px) scale(0.95); opacity: 0; }\n    to { transform: translateY(0) scale(1); opacity: 1; }\n  }\n\n  .modal-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    text-align: center;\n    padding: 25px 30px 20px;\n    border-bottom: 1px solid #e5e7eb;\n    background: #002B5C;\n    color: white;\n    border-radius: 16px 16px 0 0;\n  }\n\n  .modal-header h2 {\n    margin: 0;\n    font-size: 24px;\n    font-weight: 600;\n    color:white;\n    width: 100%;\n  }\n\n  .detection-icon {\n    font-size: 28px;\n    opacity: 0.9;\n  }\n\n  .modal-body {\n    padding: 30px 10px 20px;\n  }\n\n  .modal-subtitle {\n    font-size: 18px;\n    line-height: 1.6;\n    color: #1f2937;\n    margin: 0 0 8px 0;\n    font-weight: 600;\n    text-align: center;\n  }\n\n  .modal-timestamp {\n    font-size: 16px;\n    line-height: 1.6;\n    color: #374151;\n    text-align: center;\n  }\n\n  .modal-description {\n    font-size: 16px;\n    line-height: 1.6;\n    color: #374151;\n    margin: 0 0 25px 0;\n  }\n\n  .previous-data-preview {\n    background: #f8fafc;\n    border: 1px solid #e2e8f0;\n    border-radius: 12px;\n    padding: 20px;\n    margin-bottom: 20px;\n  }\n\n  .previous-data-preview h3 {\n    margin: 0 0 15px 0;\n    font-size: 18px;\n    font-weight: 600;\n    color: #1f2937;\n  }\n\n  .progress-summary {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  .progress-item {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    font-size: 14px;\n    color: #374151;\n  }\n\n  .check-icon {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 20px;\n    height: 20px;\n    background: #10b981;\n    color: white;\n    border-radius: 50%;\n    font-size: 12px;\n    font-weight: bold;\n    flex-shrink: 0;\n  }\n\n  .timestamp {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 13px;\n    color: #6b7280;\n    margin-top: 8px;\n    padding-top: 12px;\n    border-top: 1px solid #e5e7eb;\n  }\n\n  .clock-icon {\n    font-size: 14px;\n  }\n\n  .modal-actions {\n    display: flex;\n    gap: 12px;\n    justify-content: center;\n    padding: 20px 30px 30px;\n  }\n\n  .btn {\n    padding: 12px 24px;\n    border-radius: 8px;\n    font-weight: 500;\n    text-decoration: none;\n    transition: all 0.2s;\n    border: none;\n    cursor: pointer;\n    font-size: 16px;\n    min-width: 140px;\n  }\n\n  .btn-primary {\n    background: #10b981;\n    color: white;\n  }\n\n  .btn-primary:hover {\n    background: #059669;\n    transform: translateY(-1px);\n  }\n\n  .btn-continue {\n    background: #BD181B;\n    color: white;\n  }\n\n  .btn-continue:hover {\n    background: #9E1317;\n    transform: translateY(-1px);\n  }\n\n  .btn-start-new {\n    background: #1A5F92;\n    color: white;\n  }\n\n  .btn-start-new:hover {\n    background: #144D78;\n    transform: translateY(-1px);\n  }\n\n  .btn-secondary {\n    background: #f3f4f6;\n    color: #374151;\n    border: 1px solid #d1d5db;\n  }\n\n  .btn-secondary:hover {\n    background: #e5e7eb;\n    transform: translateY(-1px);\n  }\n\n  @media (max-width: 640px) {\n    .modal-overlay {\n      padding: 10px;\n    }\n    \n    .previous-policy-modal {\n      max-width: 100%;\n      margin: 0;\n    }\n    \n    .modal-header,\n    .modal-body,\n    .modal-actions {\n      padding-left: 20px;\n      padding-right: 20px;\n    }\n    \n    .modal-actions {\n      flex-direction: column;\n    }\n    \n    .btn {\n      width: 100%;\n    }\n  }\n\n</style> ","import App from './App.svelte';\nimport './tailwind.css';\n\nconst app = new App({\n\ttarget: document.getElementById('app')\n});\n\nexport default app; \n\nconst attachShadow = Element.prototype.attachShadow;\n\n    Element.prototype.attachShadow = function (init) {\n    // Check if we are the new Google places autocomplete element...\n    if (this.localName === \"gmp-place-autocomplete\") {\n    // If we are, we need to override the default behaviour of attachShadow() to\n    // set the mode to open to allow us to crowbar a style element into the shadow DOM.\n    const shadow = attachShadow.call(this, {\n      ...init,\n      mode: \"open\"\n    });\n\n    const style = document.createElement(\"style\");\n\n    // Apply our own styles to the shadow DOM.\n    style.textContent = `\n      .focus-ring {\n        display: none !important;\n      }\n      .dropdown {\n        --tw-bg-opacity: 1 !important;\n        background-color: #fff !important;\n        color: #000 !important;\n      }\n      .place-autocomplete-element-place-icon {\n        margin: 4px;\n      }\n      .place-autocomplete-element-text-div {\n        --tw-bg-opacity: 1 !important;\n        color: rgb(185 193 203 / var(--tw-text-opacity)) !important;\n        text-align: left !important;\n        gap: 4px;\n      }\n      .place-autocomplete-element-place-name {\n        --tw-bg-opacity: 1 !important;\n        color: rgb(185 193 203 / var(--tw-text-opacity)) !important;\n      }\n      .place-autocomplete-element-place-details {\n        --tw-bg-opacity: 1 !important;\n        color: rgb(185 193 203 / var(--tw-text-opacity)) !important;\n      }\n      .place-autocomplete-element-place-result--matched {\n        --tw-bg-opacity: 1 !important;\n        color: rgb(255 178 135 / var(--tw-text-opacity)) !important;\n      }\n      ul {\n        border: none !important;\n      }\n      li {\n        padding: 0px !important;\n        margin: 5px !important;\n        border-color: #d7d9dd !important;\n        height: auto !important;\n      }\n      ul li:last-child {\n        border: none !important;\n      }\n      li:hover {\n        --tw-bg-opacity: 0.05 !important;\n        cursor: pointer !important;\n        padding: 0px !important;\n        margin: 5px !important;\n        background-color: rgb(0 0 0 / var(--tw-bg-opacity)) !important;\n      }\n      .dropdown>ul>li[aria-selected=true] {\n        --tw-bg-opacity: 0.05 !important;\n        background-color: rgb(0 0 0 / var(--tw-bg-opacity)) !important;\n      }\n      input {\n        --tw-text-opacity: 1;\n        background-color: transparent;\n        color: #000000;\n\t\t    font-size:15px\n      }\n      \n      input::placeholder {\n        color: #6b7280 !important;\n        opacity: 1 !important;\n      }\n      button.clear-button, .autocomplete-icon {\n        height: 40px !important;\n        width: 40px !important;\n      }\n      .attributions {\n        background: #979494;\n        padding-left: 10px;\n        border-top-left-radius: 6px;\n      }\n      .widget-container::backdrop {\n        background-color: transparent !important;\n      }\n      .full-window-autocomplete-dialog[open] {\n        background-color: white !important;\n      }\n      .input-container button.clear-button svg path {\n          fill: white;\n          height: 100%;\n          width: 100%;\n      }\n      .input-container button.clear-button:hover {\n        background-color: white !important;\n      }\n    `;\n\n    shadow.appendChild(style);\n\n    // Set placeholder text and disable browser autocomplete after styles are applied\n    setTimeout(() => {\n      const input = shadow.querySelector('input');\n      if (input) {\n        input.placeholder = 'Enter Shipping Address';\n        input.setAttribute('autocomplete', 'none');\n      }\n    }, 0);\n\n    // Set the shadowRoot property to the new shadow root that has our styles in it.\n    return shadow;\n    }\n\n    // Check if we are the gmp-internal-attribution element...\n    if (this.localName === \"gmp-internal-attribution\") {\n    // Override the default behaviour of attachShadow() for attribution\n    const shadow = attachShadow.call(this, {\n      ...init,\n      mode: \"open\"\n    });\n\n    const style = document.createElement(\"style\");\n\n    // Apply styles specifically for the attribution shadow DOM\n    style.textContent = `\n      .container.full-button .info-button {\n        padding: 5px !important;\n      }\n    `;\n\n    shadow.appendChild(style);\n\n    return shadow;\n    }\n\n    // ...for other elements, proceed with the original behaviour of attachShadow().\n    return attachShadow.call(this, init);\n    };"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","document","createElement","href","subscribe","store","callbacks","unsub","unsubscribe","component_subscribe","component","callback","$$","on_destroy","push","exclude_internal_props","props","result","set_store_value","ret","value","set","is_client","window","now","performance","Date","raf","cb","requestAnimationFrame","tasks","Set","run_tasks","task","c","delete","f","size","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","i","length","d","element","name","svg_element","createElementNS","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","prevent_default","preventDefault","call","this","stop_propagation","stopPropagation","attr","attribute","removeAttribute","getAttribute","setAttribute","init_binding_group","group","_inputs","p","inputs","input","r","splice","indexOf","set_data","set_input_value","set_style","key","important","style","removeProperty","setProperty","select_option","select","mounting","option","__value","selected","undefined","selectedIndex","select_value","selected_option","querySelector","toggle_class","toggle","classList","HtmlTag","constructor","is_svg","e","n","html","h","m","nodeName","nodeType","t","tagName","content","innerHTML","Array","from","childNodes","current_component","set_current_component","get_current_component","Error","onMount","on_mount","onDestroy","createEventDispatcher","type","detail","cancelable","bubbles","createEvent","initCustomEvent","custom_event","slice","defaultPrevented","setContext","context","getContext","get","bubble","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","schedule_update","then","flush","tick","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","pop","has","add","clear","fragment","before_update","dirty","ctx","after_update","outroing","outros","group_outros","check_outros","transition_in","block","local","transition_out","o","destroy_block","lookup","bind","index","bound","create_component","mount_component","customElement","new_on_destroy","map","filter","destroy_component","filtered","targets","flush_render_callbacks","init","instance","create_fragment","not_equal","append_styles","parent_component","on_disconnect","Map","skip_bound","root","ready","rest","fill","make_dirty","hydrate","nodes","children","l","intro","SvelteComponent","$destroy","$on","$set","$$props","obj","$$set","keys","subscriber_queue","writable","start","stop","subscribers","new_value","run_queue","subscriber","invalidate","stripePromise","RELEASE_TRAIN","ORIGIN","STRIPE_JS_URL","concat","V3_URL_REGEX","STRIPE_JS_URL_REGEX","EXISTING_SCRIPT_MESSAGE","isStripeJSURL","test","injectScript","params","queryString","advancedFraudSignals","script","headOrBody","head","body","stripePromise$1","onErrorListener","onLoadListener","loadScript","reject","Stripe","console","warn","scripts","querySelectorAll","findScript","_script$parentNode","onLoad","cause","onError","error","loadCalled","getStripePromise","loadStripe","_len","arguments","args","_key","startTime","maybeStripe","isTestKey","match","version","runtimeVersionToUrlVersion","expectedVersion","stripe","apply","_registerWrapper","registerWrapper","initStripe","t_value","state_name","state_code","if_block","div","create_if_block","div7","div6","h1","p0","p1","div0","p2","button","div4","div5","dispatch","INITIAL_DATA","locations","quoteNoticeEnabled","quoteNoticeMessage","selectedStateCode","selectedState","code","location","find","locationId","id","stateCode","stateName","useV2Api","use_v2_api","is_date","prototype","toString","tick_spring","last_value","current_value","target_value","delta","velocity","dt","opts","stiffness","damping","inv_mass","Math","abs","precision","settled","getTime","isArray","_","next_value","spring","last_time","current_token","inv_mass_recovery_rate","cancel_task","token","hard","soft","rate","promise","fulfill","abort","loop","min","fulfil","create_if_block_10","span","raw_value","create_if_block_12","create_if_block_11","html_tag","create_if_block_6","span_style_value","create_if_block_8","create_if_block_7","create_if_block_1","create_if_block_3","create_if_block_2","if_block0","create_if_block_9","if_block1","create_if_block_4","if_block2","clientStart","range","max","step","values","vertical","reversed","hoverable","disabled","pipstep","all","first","last","prefix","suffix","formatter","v","focus","orientationStart","percentOf","moveHandle","fixFloat","normalisedClient","labelDown","x","clientX","y","clientY","labelUp","val","distanceMoved","sqrt","pow","$$invalidate","pipStep","pipCount","parseInt","pipVal","isSelected","some","inRange","span1","span1_aria_label_value","span1_aria_valuemin_value","span1_aria_valuemax_value","span1_aria_valuetext_value","pureText","span0","el","previousElementSibling","includes","touches","changedTouches","possibleHtml","replace","slider","pushy","float","pips","handleFormatter","ariaLabels","springValues","startValue","previousValue","springPositions","valueLength","handleActivated","handlePressed","keyboardActive","activeHandle","parseFloat","toFixed","getSliderDimensions","getBoundingClientRect","handleInteract","clientPos","dims","handlePos","handlePercent","handleVal","top","height","left","width","alignValueToStep","eStop","clampValue","remainder","aligned","perc","isNaN","trimmedAlignedValues","trimRange","every","orientationEnd","handle","jump","ctrlKey","metaKey","shiftKey","prevent","closest","sort","getClosestHandle","matches","contains","handles","isHandle","isChild","targetIsHandle","$$value","img","t1_value","label","t3_value","description","t5_value","territory","t7_value","territoryExtra","usageType","img_src_value","image","color","borderColor","div1","div2","div3","Intl","NumberFormat","currency","format","rangeslider_props","coverageTouched","create_if_block_5","label0","label1","rangeslider_changes","String","h3","button0","button1","button2","svg","circle","path","each_blocks","toLocaleString","memberships","ebikeRejectionDisclaimer","disclaimers","ebikeRejection","showEbikeModal","pendingEbikeBikeIndex","ebikeVerificationAnswer","showCasualModal","pendingCasualBikeIndex","initialState","bikes","selectedMembership","markCoverageTouched","removeBike","handleUsageTypeSelect","bikeIndex","handleCasualVerification","answer","closeCasualModal","handleEbikeVerification","closeEbikeModal","isValid","membership","$$self","bike","STATE_PRICING_CONFIGS","DEFAULT","pdTier1Rates","casual","competitive","ebike","thTier1Rates","pdRates","thRates","dedFactors","pd","th","paymentFee","factors","multiBikePd","multiBikeTh","intlPd","intlTh","assocPd","assocTh","TN","TX","HI","FL","PA","renewalFactors","resolvePricingConfig","state","trim","toUpperCase","PD_PAYMENT_FEE","calcTierMonthly","tierAmount","tierRate","factorProduct","round","calculateCoverageMonthly","bikeValue","tier1Rate","tier2Rate","tier2Amount","rateForUsage","rates","calculateV2Quote","hasAssociation","stateKey","cfg","renewalPeriod","deductible","multiBike","isInternational","international","includePaymentFee","pdDed","thDed","pdIntlF","thIntlF","pdMultiF","thMultiF","pdAssocF","thAssocF","pdRenF","thRenF","rp","renCfg","pdTier1","pdTier2","thTier1","thTier2","thFactor","pdMonthly","thMonthly","fee","pdOnly","monthly","annual","pdTheft","calculateV2MultiQuote","perBike","pdSum","thSum","pdAnnualSum","thAnnualSum","q","bikeCount","constants_0","child_ctx","constants_1","fmtValue","t6_value","headline","t10_value","fmtPrice","t16_value","img_alt_value","h2","span3","span2","span4","span7","span6","span5","t3","t6","t10","t16","t0_value","t0","div10","div9","div8","img5","img6","minimumFractionDigits","selectedPlans","territoryInclusionLabel","multiResult","perBikeQuotes","anyTheft","allTheft","v2quoteresult_changes","legalDisclaimer","welcome","v2Step","quoteInputs","formState","handlePopState","history","pushState","scrollTo","behavior","div18","div17","div15","img0","h20","div14","h21","div13","div16","dispose","nextStep","validateWelcome","pricing","basePrice","formatPrice","BASE_PRICE","getTheftPrice","theftAddon","THEFT_ADDON","welcomeDisclaimer","partnerSlug","API_BASE_URL","join","t1","show_if","class","gmpx_place_autocomplete","onInput","log","inputElement","mapElement","marker","autocomplete","apiKey","placeholder","country","ColumnAddressDisplay","hideMap","address","countries","isUserSelecting","lastSetAddress","setAutocompleteValue","shadowRoot","dispatchEvent","Event","blur","initMap","position","lat","lng","google","maps","center","zoom","mapId","pinElement","PinElement","scale","AdvancedMarkerElement","initAutocomplete","existingAutocomplete","remove","places","PlaceAutocompleteElement","includedRegionCodes","toLowerCase","handlePlaceChanged","delay","setTimeout","handleClearButtonClick","rect","right","setCenter","setZoom","handleInputCleared","async","placePrediction","place","toPlace","fetchFields","fields","parseAddress","line1","components","addressComponents","types","street_number","longText","route","city","shortText","postal_code","subpremise","onload","getPlace","label_1","required","containerBg","Autocomplete","componentRestrictions","addListener","address_components","addressData","locality","sublocality","administrative_area_level_3","administrative_area_level_1","addressType","short_name","long_name","street","zip","extractAddressComponents","handleBrowserAutofill","isBrowserAutofill","onerror","formatPhoneNumber","limited","substring","displayValue","rawDigits","formatted","small","helpText","inputClass","phone","placeautocomplete_props","placeautocomplete_changes","placeautocompletelegacy_changes","firstName","inputfield0_props","lastName","inputfield1_props","email","inputfield2_props","phoneinput_props","addressLine2","inputfield3_props","inputfield4_props","inputfield5_props","zipCode","inputfield6_props","inputfield0_changes","inputfield1_changes","inputfield2_changes","phoneinput_changes","inputfield3_changes","inputfield4_changes","inputfield5_changes","inputfield6_changes","userInfo","userDetailsPrivacyDisclaimer","userDetailsPrivacy","errors","coverageState","addressStateMismatch","$userInfo","addr","cov","covName","triggerAutoSave","newErrors","hash","slug","electric","constants_3","ul","li","text_answer","choice","other","question","question_slug","collection_index","create_if_block_25","create_if_block_19","create_if_block_17","each_value_3","items","create_if_block_16","placeholder_text","input_1","create_if_block_14","textarea","inputfield_props","inputfield_changes","create_if_block_28","each_value_5","choices","select_change_handler","t4","t4_value","create_if_block_27","each_value_4","indexes","_group","get_binding_group","u","new_indexes","new_group","input0","checked","input1","t13_value","create_if_block_23","create_if_block_22","create_if_block_21","create_if_block_20","t13","Number","getSliderValue","current","t5","create_if_block_29","t2_value","getBikeHeaderInfo","polyline","create_if_block_30","PROHIBITED_MSG","extreme","textAnswer","manufacturer","model","theftProtection","bikeInfo","basePriceFormatted","theftPriceFormatted","PROHIBITED_ACCESSORY_PATTERNS","isProhibitedAccessory","re","accessoryWarnings","CHOICE_TO_USAGE","race","getBikeUsageType","choiceId","bikeUsageQ","questions","v2","v2QuoteData","validationErrors","expandedBikes","currentEbikeBikeIndex","currentEbikeQuestionSlug","pendingEbikeChoiceId","pendingCasualQuestionSlug","pendingCasualChoiceId","casualConfirmedBikes","casualGateContinuing","setSliderValue","handleInput","toggleBike","addBike","newBike","newIndex","defaultValue","casualChoice","newExpanded","expandedIndex","handleBikeUsageSelect","questionSlug","choiceAnswer","wasGateContinuing","openCasualGate","bikeUsageQuestion","findUsageChoice","V2_USAGE_SEARCH","v2UsageType","terms","theftSlug","v2Bike","theftValue","prefillV2Bikes","idx","withTheft","bikeNumber","make","yearValue","year","getFullYear","priceValue","price","errorElement","scrollIntoView","trimmedValue","each_value_1","item","itemIndex","pastedText","clipboardData","getData","split","blocked","allowed","canvas_1","preventScroll","canvas","existingSignature","isDrawing","hasDrawn","lastX","lastY","getCoordinates","scaleX","scaleY","touch","offsetWidth","offsetHeight","strokeStyle","lineWidth","lineCap","lineJoin","fillStyle","fillRect","Image","drawImage","loadExistingSignature","coords","beginPath","moveTo","lineTo","stroke","alert","signatureData","toDataURL","p8","textContent","div32","div31","div29","div28","h31","h45","div23","div25","div27","div30","closeModal","currentTarget","policy","signature","svg0","path0","h30","li0","li1","li2","li3","showSignatureModal","hasSignature","alreadySigned","showTermsModal","getBikeUsageForV2","usageQ","validateAgreePayStep","saveSignatureToPolicy","policyUuid","response","fetch","method","headers","getCsrfToken","JSON","stringify","signature_data","ok","status","statusText","totalMonthlyPremium","bikeInputs","theftFlags","theftVal","hasTheft","sum","bq","calculateV2Total","total","getTotalPrice","calculateTotalMonthlyPremium","logo","spinner","message","sizes","medium","large","currentSize","bike_quotes","create_if_block_15","create_if_block_13","user_has_account","each_value","create_if_block_18","coverage_type","t9_value","user","i0","i1","t27","t27_value","user_email","h4","strong","formatQuoteError","raw","jsonStart","parsed","parse","gaMessage","PAYMENT_FEE_TOTAL_CENTS","policyQuote","getPlanSummaryBikeDisplayMonthlyPremium","quotes","monthly_premium","devModePaymentComplete","trackEvent","eventName","properties","trackSmartlookEvent","thankYouMessage","elements","paymentElement","paymentProcessing","paymentComplete","paymentError","paymentIntent","finalizingPolicy","loading","isReturningFromRedirect","clientSecret","initializePayment","bikes_count","saved","user_info","answers","updatedPolicy","json","savePolicy","bikesData","coverageType","possibleTheftSlugs","foundSlug","bikeUsage","usageQuestion","selectedChoice","bikeData","serial_number","bike_type","questionResponses","bike_data","question_responses","userLocation","zip_code","customerInfo","first_name","last_name","payload","partner_slug","user_location","customer_info","policy_uuid","has_association","errorData","success","quote","bikeQuote","err","fetchQuotesForBikes","_biBindPolicyInFlight","bindResponse","bindData","client_secret","createSubscription","appearance","theme","variables","colorPrimary","colorBackground","colorText","colorDanger","fontFamily","spacingUnit","borderRadius","layout","defaultValues","billingDetails","postalCode","wallets","applePay","googlePay","getElementById","mount","lineItems","bikeName","getBikeMakeModelYear","baseCents","amount","expressCheckoutElement","buttonHeight","buttonTheme","amazonPay","maxColumns","maxRows","overflow","on","isSafari","navigator","userAgent","browser","availablePaymentMethods","available","available_methods","count","container","display","currentUrl","URL","searchParams","returnUrl","confirmError","confirmedPI","confirmPayment","confirmParams","return_url","redirect","error_type","error_code","payment_method_type","finalizePolicy","payment_method","mountExpressCheckout","initializeStripeElements","is_validation","isValidationError","bikeSection","backgroundColor","border","scrollToBikeError","_mountId","random","urlParams","URLSearchParams","search","complete","paymentIntentId","paymentIntentClientSecret","stripeKey","STRIPE_PUBLIC_KEY","retrievePaymentIntent","cleanUrl","pathname","replaceState","unmount","destroy","cleanupStripeElements","PRODUCT_NAMES","part","paymentMethodId","payment_method_id","payment_intent_id","piId","finalizeResponse","finalize_only","errorText","finalizeData","policy_number","passwordInput","confirmPasswordInput","accountCreated","accountAlreadyExists","accountSetupLoading","accountPassword","confirmPassword","passwordError","confirmPasswordError","showPassword","showConfirmPassword","planSummaryMembershipDiscount","planSummaryMultiBikeDiscount","planSummaryDisplayedTotalMonthly","reduce","isQuoteError","existingPaymentIntent","submitError","submit","confirmedPaymentIntent","klaviyo","identify","$email","$firstname","userId","user_id","password","confirm_password","back","formatSubscriptionStatus","formatDate","current_period_start","current_period_end","t14_value","formatted_total","span0_class_value","label2","label3","t8","t8_value","t14","t18","t18_value","product_name","formatted_amount","t2","model_year","t21_value","formatCurrency","purchase_price","usage","t29_value","theft_protection","label4","label5","label6","t9","t17","t17_value","t21","t25","t25_value","t29","form","input2","subject","t12_value","start_date","end_date","purchase_date","phone_number","t54_value","t55_value","stripe_customer_id","a_href_value","uuid","div22","div11","label7","span8","div12","label8","span9","label9","span10","h22","div21","div19","div20","t12","t20","t20_value","t24","t24_value","t28","t28_value","t39","t39_value","t41","t41_value","t45","t45_value","t49","t49_value","t53","t53_value","t54","t55","t57","t57_value","dateString","toLocaleDateString","charAt","subscriptionData","stripeCustomer","showContactModal","contactForm","contactLoading","contactSuccess","subscription","customer","loadSubscriptionData","bike_details","coverage_plan","priceMatch","coverage_plan_display","portal_url","emailBody","encodeURIComponent","number","constants_2","title","get_key","old_blocks","dynamic","list","create_each_block","next","get_context","old_indexes","new_blocks","new_lookup","deltas","updates","will_move","did_move","new_block","old_block","new_key","old_key","nav","ol","currentStep","onStepClick","steps","subtitle","getStepStatus","stepNumber","handleStepClick","isNextStep","_getDefaults","breaks","extensions","gfm","hooks","pedantic","renderer","silent","tokenizer","walkTokens","_defaults","changeDefaults","newDefaults","noopTest","exec","edit","regex","opt","source","valSource","caret","getRegex","RegExp","codeRemoveIndent","outputLinkReplace","indentCodeCompensation","beginningSpace","endingHash","startingSpaceChar","endingSpaceChar","nonSpaceChar","newLineCharGlobal","tabCharGlobal","multipleSpaceGlobal","blankLine","doubleBlankLine","blockquoteStart","blockquoteSetextReplace","blockquoteSetextReplace2","listReplaceTabs","listReplaceNesting","listIsTask","listReplaceTask","anyLine","hrefBrackets","tableDelimiter","tableAlignChars","tableRowBlankLine","tableAlignRight","tableAlignCenter","tableAlignLeft","startATag","endATag","startPreScriptTag","endPreScriptTag","startAngleBracket","endAngleBracket","pedanticHrefTitle","unicodeAlphaNumeric","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","unescapeTest","percentDecode","findPipe","splitPipe","slashPipe","carriageReturn","spaceLine","notSpaceStart","endingNewline","listItemRegex","bull","nextBulletRegex","indent","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","hr","bullet","lheadingCore","lheading","lheadingGfm","_paragraph","_blockLabel","def","_tag","_comment","paragraph","blockNormal","blockquote","fences","heading","newline","table","gfmTable","blockGfm","blockPedantic","br","_punctuation","_punctuationOrSpace","_notPunctuationOrSpace","punctuation","_punctuationGfmStrongEm","emStrongLDelimCore","emStrongLDelim","emStrongLDelimGfm","emStrongRDelimAstCore","emStrongRDelimAst","emStrongRDelimAstGfm","emStrongRDelimUnd","anyPunctuation","autolink","_inlineComment","tag","_inlineLabel","link","reflink","nolink","inlineNormal","_backpedal","blockSkip","del","escape","reflinkSearch","inlinePedantic","inlineGfm","inlineBreaks","normal","inline","escapeReplacements","getEscapeReplacement","ch","escape2","html2","encode","encodeURI","splitCells","tableRow","cells","offset","str","escaped","curr","shift","at","rtrim","invert","suffLen","currChar","outputLink","cap","link2","lexer2","rules","inLink","tokens","inlineTokens","_Tokenizer","lexer","options2","codeBlockStyle","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","lang","trimmed","depth","lines","inBlockquote","currentLines","currentRaw","currentText","blockTokens","lastToken","oldToken","newText","newToken","isordered","list2","ordered","loose","itemRegex","endsWithBlankLine","endEarly","itemContents","line","repeat","nextLine","trimStart","rawLine","nextLineWithoutTabs","ischecked","istask","lastItem","trimEnd","spacers","hasMultipleLineBreaks","pre","tag2","aligns","rows","header","align","row","cell","inRawBlock","trimmedUrl","rtrimSlash","lastParenIndex","level","findClosingBracket","linkLen","links","emStrong","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastIndex","lastCharLength","text2","codespan","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","inlineText","_Lexer","__Lexer","inlineQueue","lex","lexInline","lastParagraphClipped","extTokenizer","cutSrc","startBlock","startIndex","Infinity","tempSrc","tempStart","getStartIndex","errMsg","charCodeAt","lastIndexOf","keepPrevChar","startInline","_Renderer","parser","langString","parseInline","j","listitem","itemBody","checkbox","unshift","tablecell","tablerow","em","cleanHref","out","textRenderer","_TextRenderer","_Parser","__Parser","anyToken","renderers","genericToken","textToken","_Hooks","static","preprocess","markdown","postprocess","processAllTokens","provideLexer","provideParser","markedInstance","defaults","setOptions","parseMarkdown","Parser","Renderer","TextRenderer","Lexer","Tokenizer","Hooks","use","tableToken","listToken","childTokens","tokens2","flat","pack","ext","prevRenderer","args2","extLevel","prop","rendererProp","rendererFunc","tokenizerProp","tokenizerFunc","prevTokenizer","hooksProp","hooksFunc","prevHook","passThroughHooks","arg","ret2","walkTokens2","packWalktokens","blockType","origOpt","throwError","parser2","src2","catch","msg","marked","getDefaults","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","construct","Reflect","func","thisArg","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","Boolean","bigintToString","BigInt","symbolToString","Symbol","objectHasOwnProperty","hasOwnProperty","objectToString","regExpTest","typeErrorCreate","TypeError","_len4","_key4","_len3","_key3","addToSet","array","transformCaseFunc","lcElement","cleanArray","clone","object","newObject","property","lookupGetter","desc","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","__proto__","NODE_TYPE","getGlobal","purify","createDOMPurify","DOMPurify","removed","Element","isSupported","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","NodeFilter","NamedNodeMap","MozNamedAttrMap","HTMLFormElement","DOMParser","trustedTypes","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","template","ownerDocument","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","afterSanitizeAttributes","afterSanitizeElements","afterSanitizeShadowDOM","beforeSanitizeAttributes","beforeSanitizeElements","beforeSanitizeShadowDOM","uponSanitizeAttribute","uponSanitizeElement","uponSanitizeShadowNode","createHTMLDocument","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","tagNameCheck","configurable","enumerable","attributeNameCheck","allowCustomizedBuiltInElements","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","tagCheck","attributeCheck","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","Function","_parseConfig","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","_unused","isRegex","ALLOWED_URI_REGEXP","customElementHandling","ADD_TAGS","ADD_ATTR","ADD_FORBID_CONTENTS","tbody","TRUSTED_TYPES_POLICY","createHTML","createScriptURL","purifyHostElement","createPolicy","ATTR_NAME","hasAttribute","policyName","scriptUrl","_createTrustedTypesPolicy","ALL_SVG_TAGS","ALL_MATHML_TAGS","_forceRemove","_removeAttribute","getAttributeNode","_initDocument","doc","leadingWhitespace","dirtyPayload","parseFromString","documentElement","createDocument","_createNodeIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","SHOW_PROCESSING_INSTRUCTION","SHOW_CDATA_SECTION","_isClobbered","attributes","namespaceURI","hasChildNodes","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","allowedTags","firstElementChild","_isBasicCustomElement","childClone","parent","parentTagName","_checkValidNamespace","expr","_isValidAttribute","lcTag","lcName","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_sanitizeAttributes","hookEvent","attrName","attrValue","keepAttr","allowedAttributes","forceKeepAttr","initValue","getAttributeType","setAttributeNS","_sanitizeShadowDOM2","shadowNode","shadowIterator","nextNode","sanitize","importedNode","returnNode","valueAsRecord","valueToString","stringified","stringifyValue","nn","firstChild","nodeIterator","normalize","shadowroot","shadowrootmode","serializedHTML","outerHTML","doctype","setConfig","clearConfig","isValidAttribute","addHook","entryPoint","hookFunction","removeHook","removeHooks","removeAllHooks","svg1","polygon","role","div_class_value","cookie","messagesEnd","open","messages","send","res","elapsed","minDelay","reply","widgetMode","isWidgetMode","if_block3","if_block4","if_block5","timestamp","timeZone","month","day","hour","minute","hour12","getTheftAddon","clearLocalStorageForBoundPolicy","localStorage","removeItem","showBoundPolicy","hideHeaderOnPaymentComplete","inWidgetMode","postMessage","devModeActive","showPreviousPolicyModal","previousPolicyData","allowAutoSave","isInPurchaseFlow","userInfoStore","updateUserInfo","identifyUserInSmartlook","smartlook","identifyData","premium","premium_currency","policy_status","partner","eventData","toISOString","isCreatingPolicy","apiBaseUrl","enableChatbot","maintenanceMode","maintenanceMessage","getBikePrice","errorMessage","showError","isAutoSaving","hasUserStartedForm","isTransitioning","stepToHash","hashToStep","signup","purchase","updateHash","getStepFromHash","handleHashChange","targetStep","maxAllowedStep","isUserInfoComplete","isBikeDetailsComplete","isSignatureComplete","saveToLocalStorage","formData","setItem","updateURL","currentHash","newUrl","origin","policyData","$widgetMode","source_type","used_widget","isMobile","newPolicy","restoreLocationFromPolicy","location_state_code","location_state_name","location_use_v2_api","loadPolicyByUuid","v2_quote_data","processedBike","field","address_line_2","quote_contact_info","hashStep","detectedStep","detectStartingStep","csrfToken","performAutoSave","hasValidUserInfo","createPolicyIfNeeded","policy_address","$userInfoStore","userInfoStepComponent","bikeDetailsStepComponent","agreePayStepComponent","validateStep","validateUserInfo","validateBikes","signatureComplete","userInfoComplete","bikeDetailsComplete","saveOnStepChange","ensureQuestionsLoaded","step_number","step_name","has_user_info","estimated_premium","prevStep","viewBoundPolicy","showBoundPolicyView","getBasePrice","bikesArray","bikesToCalculate","stripePublicKey","urlUuid","pathParts","previousData","savedData","getItem","savedTime","hasUserInfo","hasBikeInfo","hasPolicyUuid","checkForPreviousPolicy","updated","bikeObjects","restoreFromLocalStorage","reload","app","attachShadow","localName","shadow","mode"],"mappings":"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"}