{
  "version": 3,
  "sources": ["/cdn/shop/t/42/assets/dut-kit-builder.js?kit=product-role-2"],
  "sourcesContent": ["/* Development kit builder. Prices are integer minor units; cart remains Shopify-owned. */\n(() => {\n  const host = document.querySelector('[data-kit-builder]');\n  if (!host) return;\n  const root = host.dataset.root || '/';\n  const currency = host.dataset.currency || 'AUD';\n  const money = cents => new Intl.NumberFormat('en-AU', { style: 'currency', currency }).format(cents / 100);\n  const esc = value => String(value ?? '').replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n  const content = host.querySelector('[data-content]');\n  const status = host.querySelector('[data-status]');\n  const categories = JSON.parse(host.querySelector('[data-kit-categories]').textContent).map(item => [item.handle, item.title]);\n  const styles = {\n    custom: { label: 'Build Your Own', category: 'all', next: 'all', note: 'Choose any 3 or 4 items. Categories can repeat. Batteries are excluded.' },\n    essentials: { label: 'Toy + Cleaner', category: 'vibrators', next: 'personal-hygiene', note: 'Start with a toy. Add lube, cleaner or storage. Swap any item.' },\n    kinky: { label: 'Kinky Kit', category: 'bondage', next: 'vibrators', note: 'Start with bondage gear. Add toys, lube, lingerie or anything else.' },\n    lingerie: { label: 'Lingerie Kit', category: 'lingerie', next: 'lubes', note: 'Start with lingerie. Add a toy, lube or your choice of extras.' },\n    machines: { label: 'Sex Machine Kit', category: 'sex-machines', next: 'bondage', note: 'Start with a sex machine. Add restraints, lube or accessories. Check fit and compatibility.' },\n    couples: { label: 'Date Night Kit', category: 'games', next: 'candles', note: 'Start with a game. Add massage candles, toys or anything you like.' }\n  };\n  const excludedIds = new Set([9062875234615,9062876545335,9062916423991,9062916555063,9062916653367,9062916751671,9062916849975,9062916915511,9062939853111,9062939918647,9063022887223,9063136657719,9063401980215]);\n  const allowed = product => !excludedIds.has(Number(product.id)) && !/^batter(?:y|ies)$/i.test(product.type.trim());\n  const state = { step: 0, category: 'all', size: 3, style: 'custom', main: null, extras: new Map(), products: [], variants: new Map(), page: 1, visible: 12, more: false, query: '', busy: false, loading: false, added: false, nextProduct: null, reviewWithoutOffer: false };\n  let entryVariant = Number(new URLSearchParams(location.search).get('cart_variant'));\n  let requestId = 0;\n  const cache = new Map();\n  const items = () => [state.main, ...state.extras.values()].filter(Boolean);\n  const total = () => items().reduce((sum, item) => sum + item.variant.price, 0);\n  async function json(url, options = {}) {\n    const response = await fetch(url, { ...options, headers: { Accept: 'application/json', ...options.headers }, signal: AbortSignal.timeout(20000) });\n    const data = await response.json();\n    if (!response.ok) throw new Error(data.description || data.message || 'We couldn\u2019t load this. Please try again.');\n    return data;\n  }\n  function normalize(product, minor = false) {\n    return { id: product.id, handle: product.handle, title: product.title, type: product.product_type || product.type || '', description: product.body_html || product.description || '', image: product.images?.[0]?.src || product.images?.[0] || product.featured_image || '', variants: product.variants.map(v => ({ id: Number(v.id), title: v.title, available: v.available, price: minor ? Number(v.price) : Math.round(Number(v.price) * 100) })).filter(v => Number.isFinite(v.price) && v.price >= 0) };\n  }\n  function variant(product) { return product.variants.find(v => v.id === state.variants.get(product.id) && v.available) || product.variants.find(v => v.available); }\n  function picked(id) { return items().some(item => item.variant.id === id); }\n  function notify(message = '') { status.textContent = message; }\n  function options(product, selected) { return product.variants.map(v => `<option value=\"${v.id}\" ${v.id === selected.id ? 'selected' : ''} ${v.available ? '' : 'disabled'}>${esc(v.title === 'Default Title' ? 'Standard' : v.title)} - ${money(v.price)}${v.available ? '' : ' \u00B7 Sold out'}</option>`).join(''); }\n  function card(product) {\n    const selected = variant(product);\n    if (!selected) return '';\n    const chosen = picked(selected.id);\n    return `<article class=\"kit-card ${chosen ? 'is-selected' : ''}\" data-card=\"${product.id}\"><a href=\"${root}products/${encodeURIComponent(product.handle)}\" target=\"_blank\" rel=\"noopener\"><img src=\"${esc(product.image)}\" alt=\"${esc(product.title)}\" loading=\"lazy\"><h3 title=\"${esc(product.title)}\">${esc(product.title)}</h3></a><select data-variant=\"${product.id}\" aria-label=\"Option for ${esc(product.title)}\">${options(product, selected)}</select><strong>${money(selected.price)}</strong><button type=\"button\" data-pick=\"${product.id}\" aria-pressed=\"${chosen}\">${chosen ? '\u2713 Selected' : state.step === 0 ? 'Choose product' : 'Add to kit'}</button></article>`;\n  }\n  function line(item, review = false) {\n    return `<div class=\"kit-line\"><img src=\"${esc(item.product.image)}\" alt=\"\"><div><h3>${esc(item.product.title)}</h3>${review ? `<select data-edit=\"${item.variant.id}\" aria-label=\"Option for ${esc(item.product.title)}\">${options(item.product, item.variant)}</select>` : `<small>${esc(item.variant.title === 'Default Title' ? 'Standard' : item.variant.title)}</small>`}<strong>${money(item.variant.price)}</strong><button type=\"button\" class=\"kit-remove\" data-remove=\"${item.variant.id}\">Remove</button></div></div>`;\n  }\n  const needsExtra = () => state.step === 2 && !offerState().eligible && !state.reviewWithoutOffer;\n  const nextLabel = () => state.step === 0 ? 'Step 2: Add items' : state.step === 1 ? 'Step 3: Review kit' : needsExtra() ? 'Complete your kit' : 'Add all items to cart';\n  const scrollBehavior = () => matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth';\n  function revealNext() {\n    const next = content.querySelector('[data-next-panel]');\n    if (!next) return;\n    next.focus({ preventScroll: true });\n    next.scrollIntoView({ behavior: scrollBehavior(), block: 'center' });\n  }\n  function offerState() {\n    const count = items().filter(item => allowed(item.product)).length;\n    const percent = state.size === 4 ? 15 : 10;\n    return { count, percent, eligible: count === state.size, saving: items().reduce((sum, item) => sum + Math.round(item.variant.price * percent / 100), 0) };\n  }\n  function remainingLabel() { const left = state.size - offerState().count; return `${left} more item${left === 1 ? '' : 's'}`; }\n  function renderOffer() {\n    const offer = offerState();\n    host.querySelector('[data-kit-offer]').innerHTML = `<div class=\"kit-offer-heading\"><div><span class=\"kit-eyebrow\">${state.size}-ITEM KIT</span><h2>${offer.eligible ? 'Your kit is complete' : `Choose ${state.size} items. Save ${offer.percent}%.`}</h2></div><strong class=\"kit-offer-badge\">${offer.percent}% OFF</strong></div><p>${offer.eligible ? `Estimated saving: ${money(offer.saving)}.` : `Add ${remainingLabel()}. Pick from any category except batteries.`}</p><progress max=\"${state.size}\" value=\"${offer.count}\" aria-label=\"${offer.count} of ${state.size} items selected\"></progress><div class=\"kit-offer-checks\" style=\"--kit-slots:${state.size}\">${Array.from({ length: state.size }, (_, i) => `<span class=\"${i < offer.count ? 'complete' : ''}\"><b aria-hidden=\"true\">${i < offer.count ? '\u2713' : '\u25CB'}</b>Item ${i + 1}</span>`).join('')}</div>${!offer.eligible ? '<button type=\"button\" class=\"kit-offer-link\" data-complete-kit>Choose next item</button>' : ''}<p class=\"kit-offer-preview\">${host.dataset.offersActive === 'true' ? 'The discount is applied automatically to eligible items. Discounts do not stack.' : 'Preview only. These new kit offers are not active at checkout.'}</p>`;\n    host.querySelectorAll('[data-kit-size]').forEach(button => { button.setAttribute('aria-pressed', Number(button.dataset.kitSize) === state.size); button.disabled = state.busy || state.added; });\n    host.querySelector('[data-kit-styles]').innerHTML = Object.entries(styles).map(([key, style]) => `<button type=\"button\" data-kit-style=\"${key}\" aria-pressed=\"${key === state.style}\" ${state.busy || state.added ? 'disabled' : ''}>${style.label}</button>`).join('');\n    host.querySelector('[data-style-note]').textContent = styles[state.style].note;\n  }\n  function offerPrice() {\n    const offer = offerState();\n    return offer.eligible ? `<div class=\"kit-offer-saving\"><span>Estimated ${offer.percent}% saving</span><strong>\u2212${money(offer.saving)}</strong><span>Estimated kit total</span><strong>${money(total() - offer.saving)}</strong></div>` : '';\n  }\n  function summary() {\n    renderOffer();\n    host.querySelector('[data-summary]').innerHTML = `<p class=\"kit-eyebrow\">SELECTED PRODUCTS</p><h2>Your kit <small>(${items().length})</small></h2>${items().length ? items().map(item => line(item)).join('') : '<p class=\"kit-empty\">Choose your first product to get started. Your selections will appear here.</p>'}<div class=\"kit-total\"><span>Subtotal</span><strong>${money(total())}</strong></div>${offerPrice()}<p class=\"kit-fine\">${esc(currency)} \u00B7 One of each item. Shipping calculated at checkout. Batteries are excluded. Final discounts are confirmed at checkout.</p><button type=\"button\" class=\"kit-primary\" data-continue ${!state.main || state.busy || state.added ? 'disabled' : ''}>${state.busy ? 'Checking your kit\u2026' : state.added ? 'Added to cart' : nextLabel()}</button>`;\n    host.querySelector('[data-total]').textContent = money(total());\n    const bottom = host.querySelector('.kit-bottom [data-continue]');\n    bottom.textContent = state.busy ? 'Checking\u2026' : state.added ? 'Added to cart' : nextLabel();\n    bottom.disabled = !state.main || state.busy || state.added;\n    content.querySelectorAll('[data-continue]').forEach(button => { button.disabled = !state.main || state.busy || state.added; button.textContent = state.busy ? 'Adding items\u2026' : nextLabel(); });\n    host.querySelectorAll('[data-step]').forEach(button => { button.toggleAttribute('aria-current', Number(button.dataset.step) === state.step); if (Number(button.dataset.step) === state.step) button.setAttribute('aria-current', 'step'); button.disabled = state.busy || (!state.main && Number(button.dataset.step) > 0); });\n  }\n  function renderProducts() {\n    const grid = content.querySelector('[data-grid]');\n    if (!grid) return;\n    const products = state.products.filter(p => p.title.toLowerCase().includes(state.query.toLowerCase()));\n    grid.innerHTML = products.slice(0, state.visible).map(card).join('');\n    const selectedCard = grid.querySelector(`[data-card=\"${state.nextProduct}\"]`);\n    if (selectedCard && state.main) {\n      const cards = [...grid.children];\n      const columns = getComputedStyle(grid).gridTemplateColumns.split(' ').length;\n      const rowEnd = Math.min(Math.ceil((cards.indexOf(selectedCard) + 1) / columns) * columns, cards.length) - 1;\n      cards[rowEnd].insertAdjacentHTML('afterend', `<div class=\"kit-next\" data-next-panel tabindex=\"-1\" role=\"region\" aria-label=\"Selection added. Next step\"><div><strong>${state.step === 0 ? 'First item selected.' : 'Item added to your kit.'}</strong><p>${offerState().eligible ? 'Your kit is complete. Review your items.' : `Choose ${remainingLabel()} from any category.`}</p></div><div class=\"kit-next-actions\"><button type=\"button\" class=\"kit-primary\" data-continue>${nextLabel()}</button><button type=\"button\" class=\"kit-keep\" data-keep>Keep browsing</button></div></div>`);\n    }\n    const empty = content.querySelector('[data-empty]');\n    empty.textContent = products.length ? '' : state.loading ? 'Loading available products\u2026' : 'No available products found here. Try another category or search.';\n    empty.hidden = !!products.length;\n    content.querySelector('[data-more]').hidden = (!state.more && products.length <= state.visible) || state.loading;\n  }\n  function render() {\n    host.dataset.step = state.step;\n    summary();\n    if (state.added) {\n      content.innerHTML = '<div class=\"kit-success\"><h2>Your kit is in the cart.</h2><p>Your items have been added individually, ready to review.</p><a href=\"' + root + 'cart\">Open cart</a><br><button type=\"button\" class=\"kit-back\" data-restart>Build another kit</button></div>';\n      return;\n    }\n    if (state.step === 2) {\n      const missing = remainingLabel();\n      content.innerHTML = `<h2>Step 3: Review and add to cart</h2><p class=\"kit-intro\">Check your products below, then select \u201CAdd all items to cart\u201D. You can change options or remove products first.</p>${needsExtra() ? `<div class=\"kit-complete-prompt\"><h3>Add ${missing} to complete your kit</h3><p>Complete the selected kit size, or add your current items without this kit offer.</p><button type=\"button\" class=\"kit-primary\" data-complete-kit>Add ${missing}</button><button type=\"button\" class=\"kit-keep\" data-skip-offer>Continue with these products</button></div>` : ''}<div class=\"kit-review-start\" ${needsExtra() ? 'hidden' : ''}><strong>${items().length} products \u00B7 ${money(total())}</strong>${offerPrice()}<button type=\"button\" class=\"kit-primary kit-cart-button\" ${needsExtra() ? 'hidden' : ''} data-continue ${state.busy ? 'disabled' : ''}>Add all items to cart</button></div><div class=\"kit-review\">${items().map(item => line(item, true)).join('')}<div class=\"kit-total\"><span>Your kit total</span><strong>${money(total())}</strong></div><button type=\"button\" class=\"kit-primary kit-cart-button\" ${needsExtra() ? 'hidden' : ''} data-continue ${state.busy ? 'disabled' : ''}>Add all items to cart</button><p class=\"kit-fine\">Adds one of each selected product to your cart. You can review shipping and pay at checkout. Check product instructions and compatibility before use.</p></div><button class=\"kit-back\" type=\"button\" data-step=\"1\">Back to products</button>`;\n      return;\n    }\n    content.innerHTML = `<h2>${state.step === 0 ? 'Step 1: Choose your first item' : 'Step 2: Choose your other items'}</h2><p class=\"kit-intro\">${state.step === 0 ? 'Start with any product. Choose the option or size you want.' : `Pick ${state.size - 1} more items. Mix categories or stay in one. Check product instructions and compatibility.`}</p><div class=\"kit-controls\"><label>Browse category<select data-category>${categories.map(([key, label]) => `<option value=\"${esc(key)}\" ${key === state.category ? 'selected' : ''}>${esc(label)}</option>`).join('')}</select></label><label>Search loaded products<input type=\"search\" data-search placeholder=\"Product name\" value=\"${esc(state.query)}\"></label></div>`;\n    content.insertAdjacentHTML('beforeend', '<div class=\"kit-grid\" data-grid></div><p class=\"kit-loading\" data-empty></p><button class=\"kit-more\" type=\"button\" data-more hidden>Show more products</button>');\n    renderProducts();\n  }\n  async function load(append = false) {\n    const current = ++requestId;\n    state.loading = true; state.nextProduct = null;\n    if (!append) { state.page = 1; state.visible = 12; state.products = []; }\n    render();\n    const collection = state.category;\n    try {\n      const url = `${root}collections/${encodeURIComponent(collection)}?view=kit-products&page=${state.page}`;\n      let data = cache.get(url);\n      if (!data) { data = await json(url, { headers: { Accept: 'text/html' } }); cache.set(url, data); }\n      if (current !== requestId) return;\n      const products = data.products.map(p => normalize(p, true)).filter(p => variant(p) && allowed(p));\n      state.products = [...new Map([...state.products, ...products].map(p => [p.id, p])).values()];\n      state.more = Boolean(data.next);\n    } catch (error) {\n      if (current !== requestId) return;\n      notify(error.message + ' Use \u201CTry again\u201D below.');\n      content.insertAdjacentHTML('beforeend', '<button type=\"button\" class=\"kit-more\" data-retry>Try again</button>');\n    } finally { if (current === requestId) { state.loading = false; renderProducts(); } }\n  }\n  let changingStep = false;\n  function go(step) {\n    if (state.busy || changingStep || (step > 0 && !state.main)) return;\n    changingStep = true;\n    // Scroll the existing content first. Replacing a long grid before this scroll\n    // leaves the viewport looking at empty space on mobile.\n    const target = host.querySelector('[data-kit-offer]');\n    let fallback;\n    const openStep = () => {\n      clearTimeout(fallback);\n      document.removeEventListener('dut:scroll-end', openStep);\n      changingStep = false;\n      state.step = step; state.query = ''; state.reviewWithoutOffer = false; notify();\n      if (step < 2) void load(); else { ++requestId; render(); }\n      target.tabIndex = -1;\n      target.focus({ preventScroll: true });\n    };\n    document.addEventListener('dut:scroll-end', openStep, { once: true });\n    fallback = setTimeout(openStep, 2800);\n    if (window.dutScrollTo) window.dutScrollTo(target);\n    else { target.scrollIntoView({ behavior: 'instant', block: 'start' }); openStep(); }\n  }\n  function completeKit() { go(state.main ? 1 : 0); }\n  async function add(button) {\n    if (state.busy || !state.main || state.added) return;\n    state.busy = true; notify(); summary();\n    let submitted = false;\n    try {\n      const selected = items();\n      const refreshed = await Promise.all(selected.map(async item => {\n        const product = normalize(await json(`${root}products/${encodeURIComponent(item.product.handle)}.js`), true);\n        return { ...item, product, variant: product.variants.find(v => v.id === item.variant.id) };\n      }));\n      if (refreshed.some(item => !allowed(item.product))) throw new Error('Batteries cannot be included in a kit. Remove the item before continuing.');\n      if (refreshed.some(item => !item.variant?.available)) throw new Error('An item is no longer available. Remove it or choose another option before trying again.');\n      const changed = refreshed.some((item, i) => item.variant.price !== selected[i].variant.price);\n      state.main = refreshed[0]; state.extras = new Map(refreshed.slice(1).map(item => [item.variant.id, item]));\n      if (changed) { render(); throw new Error('A price has changed. We\u2019ve updated your total. Review it, then add your kit again.'); }\n      const cart = entryVariant ? await json(`${root}cart.js`) : null;\n      const pending = refreshed.filter(item => item.variant.id !== entryVariant || !cart?.items.some(line => Number(line.variant_id) === entryVariant && line.quantity > 0));\n      if (!pending.length) { state.added = true; render(); notify('Your selected product is already in the cart.'); return; }\n      submitted = true;\n      const result = await json(`${root}cart/add.js`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: pending.map(item => ({ id: item.variant.id, quantity: 1 })), sections: ['cart-drawer', 'cart-icon-bubble'], sections_url: root }) });\n      state.added = true; render();\n      const drawer = document.querySelector('cart-drawer');\n      if (drawer) { drawer.classList.remove('is-empty'); drawer.renderContents(result, false); drawer.open(button); }\n      else if (!window.DUTCartPanel?.open(button)) notify('Your kit has been added. Use \u201COpen cart\u201D to review it.');\n    } catch (error) { notify(submitted ? `${error.message} Check your cart before retrying in case any items were added.` : error.message); }\n    finally { state.busy = false; summary(); }\n  }\n  host.addEventListener('click', event => {\n    const button = event.target.closest('button');\n    if (!button || state.busy || changingStep) return;\n    if (button.hasAttribute('data-kit-size')) {\n      const size = Number(button.dataset.kitSize);\n      if (items().length > size) { notify('Remove one item before switching to a 3-item kit.'); return; }\n      state.size = size; state.reviewWithoutOffer = false; notify(); render();\n    }\n    else if (button.hasAttribute('data-kit-style')) {\n      state.style = button.dataset.kitStyle;\n      state.category = state.main ? styles[state.style].next : styles[state.style].category;\n      state.query = ''; notify(); go(state.main ? 1 : 0);\n    }\n    else if (button.hasAttribute('data-step')) {\n      if (Number(button.dataset.step) === 1 && state.step === 0) state.category = styles[state.style].next;\n      go(Number(button.dataset.step));\n    }\n    else if (button.hasAttribute('data-complete-kit')) completeKit();\n    else if (button.hasAttribute('data-skip-offer')) { state.reviewWithoutOffer = true; render(); }\n    else if (button.hasAttribute('data-continue')) { if (state.step === 0) state.category = styles[state.style].next; state.step === 2 ? needsExtra() ? completeKit() : add(button) : go(state.step + 1); }\n    else if (button.hasAttribute('data-keep')) { const card = content.querySelector(`[data-card=\"${state.nextProduct}\"]`); card?.querySelector('[data-pick]')?.focus({ preventScroll: true }); card?.scrollIntoView({ behavior: scrollBehavior(), block: 'center' }); }\n    else if (button.hasAttribute('data-more')) { if (state.visible < state.products.length) { state.visible += 12; renderProducts(); } else { state.page++; state.visible += 48; load(true); } }\n    else if (button.hasAttribute('data-retry')) { notify(); load(); }\n    else if (button.hasAttribute('data-restart')) { entryVariant = 0; const url = new URL(location.href); ['cart_variant','product','variant','kit_items'].forEach(key=>url.searchParams.delete(key)); history.replaceState(null,'',url); state.main = null; state.extras.clear(); state.added = false; go(0); }\n    else if (button.hasAttribute('data-pick')) {\n      const product = state.products.find(p => p.id === Number(button.dataset.pick));\n      const chosen = variant(product);\n      if (!chosen || !allowed(product)) return;\n      const item = { product, variant: chosen };\n      if (state.step === 0) {\n        if (!state.main && items().length >= state.size && !state.extras.has(chosen.id)) { notify('Your kit is full. Remove an item before choosing another.'); return; }\n        state.main = item; state.extras.delete(chosen.id);\n      }\n      else if (state.main?.variant.id === chosen.id) { notify('This option is already your first item.'); return; }\n      else if (state.extras.has(chosen.id)) state.extras.delete(chosen.id);\n      else if (items().length >= state.size) { notify(`Your ${state.size}-item kit is full. Remove an item${state.size === 3 ? ' or choose the 4-item kit' : ''} to add another.`); return; }\n      else state.extras.set(chosen.id, item);\n      state.nextProduct = picked(chosen.id) ? product.id : null;\n      notify(); renderProducts(); summary();\n      if (state.nextProduct) revealNext();\n    } else if (button.hasAttribute('data-remove')) {\n      const id = Number(button.dataset.remove);\n      if (state.main?.variant.id === id) { state.main = null; state.step = 0; load(); } else { state.extras.delete(id); render(); }\n    }\n  });\n  host.addEventListener('change', event => {\n    const el = event.target;\n    if (state.busy) return;\n    if (el.hasAttribute('data-category')) { state.category = el.value; state.query = ''; notify(); load(); }\n    if (el.hasAttribute('data-variant')) { state.variants.set(Number(el.dataset.variant), Number(el.value)); renderProducts(); }\n    if (el.hasAttribute('data-edit')) {\n      const id = Number(el.dataset.edit); const item = items().find(i => i.variant.id === id); const chosen = item.product.variants.find(v => v.id === Number(el.value));\n      if (chosen.id !== id && picked(chosen.id)) { notify('That option is already in your kit.'); render(); return; }\n      const replacement = { ...item, variant: chosen };\n      if (state.main?.variant.id === id) state.main = replacement; else { state.extras.delete(id); state.extras.set(chosen.id, replacement); }\n      notify(); render();\n    }\n  });\n  host.addEventListener('input', event => { if (event.target.hasAttribute('data-search')) { state.query = event.target.value; renderProducts(); } });\n  (async () => {\n    render();\n    const params = new URLSearchParams(location.search); const handle = params.get('product');\n    const kitItems = params.get('kit_items');\n    if (kitItems) {\n      try {\n        const entries = kitItems.split(',');\n        if (entries.length > 4 || !entries.every(value => /^[a-z0-9-]{1,255}:[0-9]{1,20}$/.test(value))) throw new Error('That kit link is invalid. Please choose your products below.');\n        const imported = await Promise.all(entries.map(async value => {\n          const [handle, variantId] = value.split(':');\n          const product = normalize(await json(`${root}products/${encodeURIComponent(handle)}.js`), true);\n          const chosen = product.variants.find(v => v.id === Number(variantId) && v.available);\n          if (!chosen) throw new Error('A selected kit option is no longer available. Please ask Thunder for an updated kit.');\n          if (!allowed(product)) throw new Error('Batteries cannot be included in a kit. Choose your products below.');\n          return { product, variant: chosen };\n        }));\n        if (new Set(imported.map(item => item.product.id)).size !== imported.length) throw new Error('This kit contains duplicate products. Please choose your products below.');\n        state.main = imported[0];\n        state.size = imported.length > 3 ? 4 : 3;\n        imported.filter(item => item !== state.main).forEach(item => state.extras.set(item.variant.id, item));\n        entryVariant = 0;\n        state.step = 2;\n        render();\n        notify('Your proposed kit is ready to review at current prices. Nothing has been added to your cart.');\n        return;\n      } catch (error) { notify(error.message); }\n    }\n    if (handle && /^[a-z0-9-]+$/i.test(handle)) {\n      try {\n        const product = normalize(await json(`${root}products/${encodeURIComponent(handle)}.js`), true);\n        const chosen = product.variants.find(v => v.id === Number(params.get('variant')) && v.available) || product.variants.find(v => v.available);\n        if (!chosen) throw new Error('This product is sold out. Choose another product to start your kit.');\n        if (!allowed(product)) throw new Error('Batteries cannot be included in a kit. Choose another item.');\n        state.main = { product, variant: chosen }; state.step = 1;\n      } catch (error) { notify(error.message); }\n    }\n    await load();\n  })();\n})();\n"],
  "mappings": "CACC,IAAM,CACL,MAAM,KAAO,SAAS,cAAc,oBAAoB,EACxD,GAAI,CAAC,KAAM,OACX,MAAM,KAAO,KAAK,QAAQ,MAAQ,IAC5B,SAAW,KAAK,QAAQ,UAAY,MACpC,MAAQ,OAAS,IAAI,KAAK,aAAa,QAAS,CAAE,MAAO,WAAY,QAAS,CAAC,EAAE,OAAO,MAAQ,GAAG,EACnG,IAAM,OAAS,OAAO,OAAS,EAAE,EAAE,QAAQ,WAAY,IAAM,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,SAAU,IAAK,OAAQ,GAAE,CAAC,CAAE,EACxI,QAAU,KAAK,cAAc,gBAAgB,EAC7C,OAAS,KAAK,cAAc,eAAe,EAC3C,WAAa,KAAK,MAAM,KAAK,cAAc,uBAAuB,EAAE,WAAW,EAAE,IAAI,MAAQ,CAAC,KAAK,OAAQ,KAAK,KAAK,CAAC,EACtH,OAAS,CACb,OAAQ,CAAE,MAAO,iBAAkB,SAAU,MAAO,KAAM,MAAO,KAAM,yEAA0E,EACjJ,WAAY,CAAE,MAAO,gBAAiB,SAAU,YAAa,KAAM,mBAAoB,KAAM,gEAAiE,EAC9J,MAAO,CAAE,MAAO,YAAa,SAAU,UAAW,KAAM,YAAa,KAAM,qEAAsE,EACjJ,SAAU,CAAE,MAAO,eAAgB,SAAU,WAAY,KAAM,QAAS,KAAM,gEAAiE,EAC/I,SAAU,CAAE,MAAO,kBAAmB,SAAU,eAAgB,KAAM,UAAW,KAAM,6FAA8F,EACrL,QAAS,CAAE,MAAO,iBAAkB,SAAU,QAAS,KAAM,UAAW,KAAM,oEAAqE,CACrJ,EACM,YAAc,IAAI,IAAI,CAAC,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,aAAa,CAAC,EAC7M,QAAU,SAAW,CAAC,YAAY,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAK,CAAC,qBAAqB,KAAK,QAAQ,KAAK,KAAK,CAAC,EAC3G,MAAQ,CAAE,KAAM,EAAG,SAAU,MAAO,KAAM,EAAG,MAAO,SAAU,KAAM,KAAM,OAAQ,IAAI,IAAO,SAAU,CAAC,EAAG,SAAU,IAAI,IAAO,KAAM,EAAG,QAAS,GAAI,KAAM,GAAO,MAAO,GAAI,KAAM,GAAO,QAAS,GAAO,MAAO,GAAO,YAAa,KAAM,mBAAoB,EAAM,EAC5Q,IAAI,aAAe,OAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,cAAc,CAAC,EAC9E,UAAY,EAChB,MAAM,MAAQ,IAAI,IACZ,MAAQ,IAAM,CAAC,MAAM,KAAM,GAAG,MAAM,OAAO,OAAO,CAAC,EAAE,OAAO,OAAO,EACnE,MAAQ,IAAM,MAAM,EAAE,OAAO,CAAC,IAAK,OAAS,IAAM,KAAK,QAAQ,MAAO,CAAC,EAC7E,eAAe,KAAK,IAAKA,SAAU,CAAC,EAAG,CACrC,MAAM,SAAW,MAAM,MAAM,IAAK,CAAE,GAAGA,SAAS,QAAS,CAAE,OAAQ,mBAAoB,GAAGA,SAAQ,OAAQ,EAAG,OAAQ,YAAY,QAAQ,GAAK,CAAE,CAAC,EAC3I,KAAO,MAAM,SAAS,KAAK,EACjC,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,KAAK,aAAe,KAAK,SAAW,+CAA0C,EAChH,OAAO,IACT,CACA,SAAS,UAAU,QAAS,MAAQ,GAAO,CACzC,MAAO,CAAE,GAAI,QAAQ,GAAI,OAAQ,QAAQ,OAAQ,MAAO,QAAQ,MAAO,KAAM,QAAQ,cAAgB,QAAQ,MAAQ,GAAI,YAAa,QAAQ,WAAa,QAAQ,aAAe,GAAI,MAAO,QAAQ,SAAS,CAAC,GAAG,KAAO,QAAQ,SAAS,CAAC,GAAK,QAAQ,gBAAkB,GAAI,SAAU,QAAQ,SAAS,IAAI,IAAM,CAAE,GAAI,OAAO,EAAE,EAAE,EAAG,MAAO,EAAE,MAAO,UAAW,EAAE,UAAW,MAAO,MAAQ,OAAO,EAAE,KAAK,EAAI,KAAK,MAAM,OAAO,EAAE,KAAK,EAAI,GAAG,CAAE,EAAE,EAAE,OAAO,GAAK,OAAO,SAAS,EAAE,KAAK,GAAK,EAAE,OAAS,CAAC,CAAE,CAC9e,CACA,SAAS,QAAQ,QAAS,CAAE,OAAO,QAAQ,SAAS,KAAK,GAAK,EAAE,KAAO,MAAM,SAAS,IAAI,QAAQ,EAAE,GAAK,EAAE,SAAS,GAAK,QAAQ,SAAS,KAAK,GAAK,EAAE,SAAS,CAAG,CAClK,SAAS,OAAO,GAAI,CAAE,OAAO,MAAM,EAAE,KAAK,MAAQ,KAAK,QAAQ,KAAO,EAAE,CAAG,CAC3E,SAAS,OAAO,QAAU,GAAI,CAAE,OAAO,YAAc,OAAS,CAC9D,SAAS,QAAQ,QAAS,SAAU,CAAE,OAAO,QAAQ,SAAS,IAAI,GAAK,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAO,SAAS,GAAK,WAAa,EAAE,IAAI,EAAE,UAAY,GAAK,UAAU,IAAI,IAAI,EAAE,QAAU,gBAAkB,WAAa,EAAE,KAAK,CAAC,MAAM,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,UAAY,GAAK,gBAAa,WAAW,EAAE,KAAK,EAAE,CAAG,CAClT,SAAS,KAAK,QAAS,CACrB,MAAM,SAAW,QAAQ,OAAO,EAChC,GAAI,CAAC,SAAU,MAAO,GACtB,MAAM,OAAS,OAAO,SAAS,EAAE,EACjC,MAAO,4BAA4B,OAAS,cAAgB,EAAE,gBAAgB,QAAQ,EAAE,cAAc,IAAI,YAAY,mBAAmB,QAAQ,MAAM,CAAC,8CAA8C,IAAI,QAAQ,KAAK,CAAC,UAAU,IAAI,QAAQ,KAAK,CAAC,+BAA+B,IAAI,QAAQ,KAAK,CAAC,KAAK,IAAI,QAAQ,KAAK,CAAC,kCAAkC,QAAQ,EAAE,4BAA4B,IAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,QAAS,QAAQ,CAAC,oBAAoB,MAAM,SAAS,KAAK,CAAC,6CAA6C,QAAQ,EAAE,mBAAmB,MAAM,KAAK,OAAS,kBAAe,MAAM,OAAS,EAAI,iBAAmB,YAAY,qBAC/nB,CACA,SAAS,KAAK,KAAM,OAAS,GAAO,CAClC,MAAO,mCAAmC,IAAI,KAAK,QAAQ,KAAK,CAAC,qBAAqB,IAAI,KAAK,QAAQ,KAAK,CAAC,QAAQ,OAAS,sBAAsB,KAAK,QAAQ,EAAE,4BAA4B,IAAI,KAAK,QAAQ,KAAK,CAAC,KAAK,QAAQ,KAAK,QAAS,KAAK,OAAO,CAAC,YAAc,UAAU,IAAI,KAAK,QAAQ,QAAU,gBAAkB,WAAa,KAAK,QAAQ,KAAK,CAAC,UAAU,WAAW,MAAM,KAAK,QAAQ,KAAK,CAAC,kEAAkE,KAAK,QAAQ,EAAE,+BACpe,CACA,MAAM,WAAa,IAAM,MAAM,OAAS,GAAK,CAAC,WAAW,EAAE,UAAY,CAAC,MAAM,mBACxE,UAAY,IAAM,MAAM,OAAS,EAAI,oBAAsB,MAAM,OAAS,EAAI,qBAAuB,WAAW,EAAI,oBAAsB,wBAC1I,eAAiB,IAAM,WAAW,kCAAkC,EAAE,QAAU,UAAY,SAClG,SAAS,YAAa,CACpB,MAAM,KAAO,QAAQ,cAAc,mBAAmB,EACjD,OACL,KAAK,MAAM,CAAE,cAAe,EAAK,CAAC,EAClC,KAAK,eAAe,CAAE,SAAU,eAAe,EAAG,MAAO,QAAS,CAAC,EACrE,CACA,SAAS,YAAa,CACpB,MAAM,MAAQ,MAAM,EAAE,OAAO,MAAQ,QAAQ,KAAK,OAAO,CAAC,EAAE,OACtD,QAAU,MAAM,OAAS,EAAI,GAAK,GACxC,MAAO,CAAE,MAAO,QAAS,SAAU,QAAU,MAAM,KAAM,OAAQ,MAAM,EAAE,OAAO,CAAC,IAAK,OAAS,IAAM,KAAK,MAAM,KAAK,QAAQ,MAAQ,QAAU,GAAG,EAAG,CAAC,CAAE,CAC1J,CACA,SAAS,gBAAiB,CAAE,MAAM,KAAO,MAAM,KAAO,WAAW,EAAE,MAAO,MAAO,GAAG,IAAI,aAAa,OAAS,EAAI,GAAK,GAAG,EAAI,CAC9H,SAAS,aAAc,CACrB,MAAM,MAAQ,WAAW,EACzB,KAAK,cAAc,kBAAkB,EAAE,UAAY,iEAAiE,MAAM,IAAI,uBAAuB,MAAM,SAAW,uBAAyB,UAAU,MAAM,IAAI,gBAAgB,MAAM,OAAO,IAAI,8CAA8C,MAAM,OAAO,0BAA0B,MAAM,SAAW,qBAAqB,MAAM,MAAM,MAAM,CAAC,IAAM,OAAO,eAAe,CAAC,4CAA4C,sBAAsB,MAAM,IAAI,YAAY,MAAM,KAAK,iBAAiB,MAAM,KAAK,OAAO,MAAM,IAAI,gFAAgF,MAAM,IAAI,KAAK,MAAM,KAAK,CAAE,OAAQ,MAAM,IAAK,EAAG,CAAC,EAAG,IAAM,gBAAgB,EAAI,MAAM,MAAQ,WAAa,EAAE,2BAA2B,EAAI,MAAM,MAAQ,SAAM,QAAG,YAAY,EAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,SAAU,MAAM,SAAwG,GAA7F,0FAA+F,gCAAgC,KAAK,QAAQ,eAAiB,OAAS,mFAAqF,gEAAgE,OAC5pC,KAAK,iBAAiB,iBAAiB,EAAE,QAAQ,QAAU,CAAE,OAAO,aAAa,eAAgB,OAAO,OAAO,QAAQ,OAAO,IAAM,MAAM,IAAI,EAAG,OAAO,SAAW,MAAM,MAAQ,MAAM,KAAO,CAAC,EAC/L,KAAK,cAAc,mBAAmB,EAAE,UAAY,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,IAAK,KAAK,IAAM,yCAAyC,GAAG,mBAAmB,MAAQ,MAAM,KAAK,KAAK,MAAM,MAAQ,MAAM,MAAQ,WAAa,EAAE,IAAI,MAAM,KAAK,WAAW,EAAE,KAAK,EAAE,EACtQ,KAAK,cAAc,mBAAmB,EAAE,YAAc,OAAO,MAAM,KAAK,EAAE,IAC5E,CACA,SAAS,YAAa,CACpB,MAAM,MAAQ,WAAW,EACzB,OAAO,MAAM,SAAW,iDAAiD,MAAM,OAAO,gCAA2B,MAAM,MAAM,MAAM,CAAC,oDAAoD,MAAM,MAAM,EAAI,MAAM,MAAM,CAAC,kBAAoB,EAC3O,CACA,SAAS,SAAU,CACjB,YAAY,EACZ,KAAK,cAAc,gBAAgB,EAAE,UAAY,oEAAoE,MAAM,EAAE,MAAM,iBAAiB,MAAM,EAAE,OAAS,MAAM,EAAE,IAAI,MAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAI,sGAAsG,uDAAuD,MAAM,MAAM,CAAC,CAAC,kBAAkB,WAAW,CAAC,uBAAuB,IAAI,QAAQ,CAAC,0LAAuL,CAAC,MAAM,MAAQ,MAAM,MAAQ,MAAM,MAAQ,WAAa,EAAE,IAAI,MAAM,KAAO,0BAAuB,MAAM,MAAQ,gBAAkB,UAAU,CAAC,YACjwB,KAAK,cAAc,cAAc,EAAE,YAAc,MAAM,MAAM,CAAC,EAC9D,MAAM,OAAS,KAAK,cAAc,6BAA6B,EAC/D,OAAO,YAAc,MAAM,KAAO,iBAAc,MAAM,MAAQ,gBAAkB,UAAU,EAC1F,OAAO,SAAW,CAAC,MAAM,MAAQ,MAAM,MAAQ,MAAM,MACrD,QAAQ,iBAAiB,iBAAiB,EAAE,QAAQ,QAAU,CAAE,OAAO,SAAW,CAAC,MAAM,MAAQ,MAAM,MAAQ,MAAM,MAAO,OAAO,YAAc,MAAM,KAAO,qBAAkB,UAAU,CAAG,CAAC,EAC9L,KAAK,iBAAiB,aAAa,EAAE,QAAQ,QAAU,CAAE,OAAO,gBAAgB,eAAgB,OAAO,OAAO,QAAQ,IAAI,IAAM,MAAM,IAAI,EAAO,OAAO,OAAO,QAAQ,IAAI,IAAM,MAAM,MAAM,OAAO,aAAa,eAAgB,MAAM,EAAG,OAAO,SAAW,MAAM,MAAS,CAAC,MAAM,MAAQ,OAAO,OAAO,QAAQ,IAAI,EAAI,CAAI,CAAC,CAC/T,CACA,SAAS,gBAAiB,CACxB,MAAM,KAAO,QAAQ,cAAc,aAAa,EAChD,GAAI,CAAC,KAAM,OACX,MAAM,SAAW,MAAM,SAAS,OAAO,GAAK,EAAE,MAAM,YAAY,EAAE,SAAS,MAAM,MAAM,YAAY,CAAC,CAAC,EACrG,KAAK,UAAY,SAAS,MAAM,EAAG,MAAM,OAAO,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EACnE,MAAM,aAAe,KAAK,cAAc,eAAe,MAAM,WAAW,IAAI,EAC5E,GAAI,cAAgB,MAAM,KAAM,CAC9B,MAAM,MAAQ,CAAC,GAAG,KAAK,QAAQ,EACzB,QAAU,iBAAiB,IAAI,EAAE,oBAAoB,MAAM,GAAG,EAAE,OAChE,OAAS,KAAK,IAAI,KAAK,MAAM,MAAM,QAAQ,YAAY,EAAI,GAAK,OAAO,EAAI,QAAS,MAAM,MAAM,EAAI,EAC1G,MAAM,MAAM,EAAE,mBAAmB,WAAY,0HAA0H,MAAM,OAAS,EAAI,uBAAyB,yBAAyB,eAAe,WAAW,EAAE,SAAW,2CAA6C,UAAU,eAAe,CAAC,qBAAqB,mGAAmG,UAAU,CAAC,8FAA8F,CAC7jB,CACA,MAAM,MAAQ,QAAQ,cAAc,cAAc,EAClD,MAAM,YAAc,SAAS,OAAS,GAAK,MAAM,QAAU,mCAAgC,oEAC3F,MAAM,OAAS,CAAC,CAAC,SAAS,OAC1B,QAAQ,cAAc,aAAa,EAAE,OAAU,CAAC,MAAM,MAAQ,SAAS,QAAU,MAAM,SAAY,MAAM,OAC3G,CACA,SAAS,QAAS,CAGhB,GAFA,KAAK,QAAQ,KAAO,MAAM,KAC1B,QAAQ,EACJ,MAAM,MAAO,CACf,QAAQ,UAAY,sIAAwI,KAAO,8GACnK,MACF,CACA,GAAI,MAAM,OAAS,EAAG,CACpB,MAAM,QAAU,eAAe,EAC/B,QAAQ,UAAY,6LAAmL,WAAW,EAAI,4CAA4C,OAAO,qLAAqL,OAAO,8GAAgH,EAAE,iCAAiC,WAAW,EAAI,SAAW,EAAE,YAAY,MAAM,EAAE,MAAM,kBAAe,MAAM,MAAM,CAAC,CAAC,YAAY,WAAW,CAAC,6DAA6D,WAAW,EAAI,SAAW,EAAE,kBAAkB,MAAM,KAAO,WAAa,EAAE,gEAAgE,MAAM,EAAE,IAAI,MAAQ,KAAK,KAAM,EAAI,CAAC,EAAE,KAAK,EAAE,CAAC,6DAA6D,MAAM,MAAM,CAAC,CAAC,4EAA4E,WAAW,EAAI,SAAW,EAAE,kBAAkB,MAAM,KAAO,WAAa,EAAE,mSACzpC,MACF,CACA,QAAQ,UAAY,OAAO,MAAM,OAAS,EAAI,iCAAmC,iCAAiC,6BAA6B,MAAM,OAAS,EAAI,8DAAgE,QAAQ,MAAM,KAAO,CAAC,2FAA2F,6EAA6E,WAAW,IAAI,CAAC,CAAC,IAAK,KAAK,IAAM,kBAAkB,IAAI,GAAG,CAAC,KAAK,MAAQ,MAAM,SAAW,WAAa,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,oHAAoH,IAAI,MAAM,KAAK,CAAC,mBAC/qB,QAAQ,mBAAmB,YAAa,iKAAiK,EACzM,eAAe,CACjB,CACA,eAAe,KAAK,OAAS,GAAO,CAClC,MAAM,QAAU,EAAE,UAClB,MAAM,QAAU,GAAM,MAAM,YAAc,KACrC,SAAU,MAAM,KAAO,EAAG,MAAM,QAAU,GAAI,MAAM,SAAW,CAAC,GACrE,OAAO,EACP,MAAM,WAAa,MAAM,SACzB,GAAI,CACF,MAAM,IAAM,GAAG,IAAI,eAAe,mBAAmB,UAAU,CAAC,2BAA2B,MAAM,IAAI,GACrG,IAAI,KAAO,MAAM,IAAI,GAAG,EAExB,GADK,OAAQ,KAAO,MAAM,KAAK,IAAK,CAAE,QAAS,CAAE,OAAQ,WAAY,CAAE,CAAC,EAAG,MAAM,IAAI,IAAK,IAAI,GAC1F,UAAY,UAAW,OAC3B,MAAM,SAAW,KAAK,SAAS,IAAI,GAAK,UAAU,EAAG,EAAI,CAAC,EAAE,OAAO,GAAK,QAAQ,CAAC,GAAK,QAAQ,CAAC,CAAC,EAChG,MAAM,SAAW,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,SAAU,GAAG,QAAQ,EAAE,IAAI,GAAK,CAAC,EAAE,GAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAC3F,MAAM,KAAO,EAAQ,KAAK,IAC5B,OAAS,MAAO,CACd,GAAI,UAAY,UAAW,OAC3B,OAAO,MAAM,QAAU,mCAAyB,EAChD,QAAQ,mBAAmB,YAAa,sEAAsE,CAChH,QAAE,CAAc,UAAY,YAAa,MAAM,QAAU,GAAO,eAAe,EAAK,CACtF,CACA,IAAI,aAAe,GACnB,SAAS,GAAG,KAAM,CAChB,GAAI,MAAM,MAAQ,cAAiB,KAAO,GAAK,CAAC,MAAM,KAAO,OAC7D,aAAe,GAGf,MAAM,OAAS,KAAK,cAAc,kBAAkB,EACpD,IAAI,SACJ,MAAM,SAAW,IAAM,CACrB,aAAa,QAAQ,EACrB,SAAS,oBAAoB,iBAAkB,QAAQ,EACvD,aAAe,GACf,MAAM,KAAO,KAAM,MAAM,MAAQ,GAAI,MAAM,mBAAqB,GAAO,OAAO,EAC1E,KAAO,EAAQ,KAAK,GAAU,EAAE,UAAW,OAAO,GACtD,OAAO,SAAW,GAClB,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,CACtC,EACA,SAAS,iBAAiB,iBAAkB,SAAU,CAAE,KAAM,EAAK,CAAC,EACpE,SAAW,WAAW,SAAU,IAAI,EAChC,OAAO,YAAa,OAAO,YAAY,MAAM,GAC1C,OAAO,eAAe,CAAE,SAAU,UAAW,MAAO,OAAQ,CAAC,EAAG,SAAS,EAClF,CACA,SAAS,aAAc,CAAE,GAAG,MAAM,KAAO,EAAI,CAAC,CAAG,CACjD,eAAe,IAAI,OAAQ,CACzB,GAAI,MAAM,MAAQ,CAAC,MAAM,MAAQ,MAAM,MAAO,OAC9C,MAAM,KAAO,GAAM,OAAO,EAAG,QAAQ,EACrC,IAAI,UAAY,GAChB,GAAI,CACF,MAAM,SAAW,MAAM,EACjB,UAAY,MAAM,QAAQ,IAAI,SAAS,IAAI,MAAM,MAAQ,CAC7D,MAAM,QAAU,UAAU,MAAM,KAAK,GAAG,IAAI,YAAY,mBAAmB,KAAK,QAAQ,MAAM,CAAC,KAAK,EAAG,EAAI,EAC3G,MAAO,CAAE,GAAG,KAAM,QAAS,QAAS,QAAQ,SAAS,KAAK,GAAK,EAAE,KAAO,KAAK,QAAQ,EAAE,CAAE,CAC3F,CAAC,CAAC,EACF,GAAI,UAAU,KAAK,MAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAG,MAAM,IAAI,MAAM,2EAA2E,EAC/I,GAAI,UAAU,KAAK,MAAQ,CAAC,KAAK,SAAS,SAAS,EAAG,MAAM,IAAI,MAAM,yFAAyF,EAC/J,MAAM,QAAU,UAAU,KAAK,CAAC,KAAM,IAAM,KAAK,QAAQ,QAAU,SAAS,CAAC,EAAE,QAAQ,KAAK,EAE5F,GADA,MAAM,KAAO,UAAU,CAAC,EAAG,MAAM,OAAS,IAAI,IAAI,UAAU,MAAM,CAAC,EAAE,IAAI,MAAQ,CAAC,KAAK,QAAQ,GAAI,IAAI,CAAC,CAAC,EACrG,QAAW,aAAO,EAAS,IAAI,MAAM,yFAAoF,EAC7H,MAAM,KAAO,aAAe,MAAM,KAAK,GAAG,IAAI,SAAS,EAAI,KACrD,QAAU,UAAU,OAAO,MAAQ,KAAK,QAAQ,KAAO,cAAgB,CAAC,MAAM,MAAM,KAAKC,OAAQ,OAAOA,MAAK,UAAU,IAAM,cAAgBA,MAAK,SAAW,CAAC,CAAC,EACrK,GAAI,CAAC,QAAQ,OAAQ,CAAE,MAAM,MAAQ,GAAM,OAAO,EAAG,OAAO,+CAA+C,EAAG,MAAQ,CACtH,UAAY,GACZ,MAAM,OAAS,MAAM,KAAK,GAAG,IAAI,cAAe,CAAE,OAAQ,OAAQ,QAAS,CAAE,eAAgB,kBAAmB,EAAG,KAAM,KAAK,UAAU,CAAE,MAAO,QAAQ,IAAI,OAAS,CAAE,GAAI,KAAK,QAAQ,GAAI,SAAU,CAAE,EAAE,EAAG,SAAU,CAAC,cAAe,kBAAkB,EAAG,aAAc,IAAK,CAAC,CAAE,CAAC,EACpR,MAAM,MAAQ,GAAM,OAAO,EAC3B,MAAM,OAAS,SAAS,cAAc,aAAa,EAC/C,QAAU,OAAO,UAAU,OAAO,UAAU,EAAG,OAAO,eAAe,OAAQ,EAAK,EAAG,OAAO,KAAK,MAAM,GACjG,OAAO,cAAc,KAAK,MAAM,GAAG,OAAO,kEAAwD,CAC9G,OAAS,MAAO,CAAE,OAAO,UAAY,GAAG,MAAM,OAAO,iEAAmE,MAAM,OAAO,CAAG,QACxI,CAAU,MAAM,KAAO,GAAO,QAAQ,CAAG,CAC3C,CACA,KAAK,iBAAiB,QAAS,OAAS,CACtC,MAAM,OAAS,MAAM,OAAO,QAAQ,QAAQ,EAC5C,GAAI,GAAC,QAAU,MAAM,MAAQ,eAC7B,GAAI,OAAO,aAAa,eAAe,EAAG,CACxC,MAAM,KAAO,OAAO,OAAO,QAAQ,OAAO,EAC1C,GAAI,MAAM,EAAE,OAAS,KAAM,CAAE,OAAO,mDAAmD,EAAG,MAAQ,CAClG,MAAM,KAAO,KAAM,MAAM,mBAAqB,GAAO,OAAO,EAAG,OAAO,CACxE,SACS,OAAO,aAAa,gBAAgB,EAC3C,MAAM,MAAQ,OAAO,QAAQ,SAC7B,MAAM,SAAW,MAAM,KAAO,OAAO,MAAM,KAAK,EAAE,KAAO,OAAO,MAAM,KAAK,EAAE,SAC7E,MAAM,MAAQ,GAAI,OAAO,EAAG,GAAG,MAAM,KAAO,EAAI,CAAC,UAE1C,OAAO,aAAa,WAAW,EAClC,OAAO,OAAO,QAAQ,IAAI,IAAM,GAAK,MAAM,OAAS,IAAG,MAAM,SAAW,OAAO,MAAM,KAAK,EAAE,MAChG,GAAG,OAAO,OAAO,QAAQ,IAAI,CAAC,UAEvB,OAAO,aAAa,mBAAmB,EAAG,YAAY,UACtD,OAAO,aAAa,iBAAiB,EAAK,MAAM,mBAAqB,GAAM,OAAO,UAClF,OAAO,aAAa,eAAe,EAAS,MAAM,OAAS,IAAG,MAAM,SAAW,OAAO,MAAM,KAAK,EAAE,MAAM,MAAM,OAAS,EAAI,WAAW,EAAI,YAAY,EAAI,IAAI,MAAM,EAAI,GAAG,MAAM,KAAO,CAAC,UAC1L,OAAO,aAAa,WAAW,EAAG,CAAE,MAAMC,MAAO,QAAQ,cAAc,eAAe,MAAM,WAAW,IAAI,EAAGA,OAAM,cAAc,aAAa,GAAG,MAAM,CAAE,cAAe,EAAK,CAAC,EAAGA,OAAM,eAAe,CAAE,SAAU,eAAe,EAAG,MAAO,QAAS,CAAC,CAAG,SACzP,OAAO,aAAa,WAAW,EAAS,MAAM,QAAU,MAAM,SAAS,QAAU,MAAM,SAAW,GAAI,eAAe,IAAY,MAAM,OAAQ,MAAM,SAAW,GAAI,KAAK,EAAI,WAC7K,OAAO,aAAa,YAAY,EAAK,OAAO,EAAG,KAAK,UACpD,OAAO,aAAa,cAAc,EAAG,CAAE,aAAe,EAAG,MAAM,IAAM,IAAI,IAAI,SAAS,IAAI,EAAG,CAAC,eAAe,UAAU,UAAU,WAAW,EAAE,QAAQ,KAAK,IAAI,aAAa,OAAO,GAAG,CAAC,EAAG,QAAQ,aAAa,KAAK,GAAG,GAAG,EAAG,MAAM,KAAO,KAAM,MAAM,OAAO,MAAM,EAAG,MAAM,MAAQ,GAAO,GAAG,CAAC,CAAG,SAClS,OAAO,aAAa,WAAW,EAAG,CACzC,MAAM,QAAU,MAAM,SAAS,KAAK,GAAK,EAAE,KAAO,OAAO,OAAO,QAAQ,IAAI,CAAC,EACvE,OAAS,QAAQ,OAAO,EAC9B,GAAI,CAAC,QAAU,CAAC,QAAQ,OAAO,EAAG,OAClC,MAAM,KAAO,CAAE,QAAS,QAAS,MAAO,EACxC,GAAI,MAAM,OAAS,EAAG,CACpB,GAAI,CAAC,MAAM,MAAQ,MAAM,EAAE,QAAU,MAAM,MAAQ,CAAC,MAAM,OAAO,IAAI,OAAO,EAAE,EAAG,CAAE,OAAO,2DAA2D,EAAG,MAAQ,CAChK,MAAM,KAAO,KAAM,MAAM,OAAO,OAAO,OAAO,EAAE,CAClD,SACS,MAAM,MAAM,QAAQ,KAAO,OAAO,GAAI,CAAE,OAAO,yCAAyC,EAAG,MAAQ,SACnG,MAAM,OAAO,IAAI,OAAO,EAAE,EAAG,MAAM,OAAO,OAAO,OAAO,EAAE,UAC1D,MAAM,EAAE,QAAU,MAAM,KAAM,CAAE,OAAO,QAAQ,MAAM,IAAI,oCAAoC,MAAM,OAAS,EAAI,4BAA8B,EAAE,kBAAkB,EAAG,MAAQ,MACjL,MAAM,OAAO,IAAI,OAAO,GAAI,IAAI,EACrC,MAAM,YAAc,OAAO,OAAO,EAAE,EAAI,QAAQ,GAAK,KACrD,OAAO,EAAG,eAAe,EAAG,QAAQ,EAChC,MAAM,aAAa,WAAW,CACpC,SAAW,OAAO,aAAa,aAAa,EAAG,CAC7C,MAAM,GAAK,OAAO,OAAO,QAAQ,MAAM,EACnC,MAAM,MAAM,QAAQ,KAAO,IAAM,MAAM,KAAO,KAAM,MAAM,KAAO,EAAG,KAAK,IAAY,MAAM,OAAO,OAAO,EAAE,EAAG,OAAO,EAC3H,EACF,CAAC,EACD,KAAK,iBAAiB,SAAU,OAAS,CACvC,MAAM,GAAK,MAAM,OACjB,GAAI,OAAM,OACN,GAAG,aAAa,eAAe,IAAK,MAAM,SAAW,GAAG,MAAO,MAAM,MAAQ,GAAI,OAAO,EAAG,KAAK,GAChG,GAAG,aAAa,cAAc,IAAK,MAAM,SAAS,IAAI,OAAO,GAAG,QAAQ,OAAO,EAAG,OAAO,GAAG,KAAK,CAAC,EAAG,eAAe,GACpH,GAAG,aAAa,WAAW,GAAG,CAChC,MAAM,GAAK,OAAO,GAAG,QAAQ,IAAI,EAAS,KAAO,MAAM,EAAE,KAAK,GAAK,EAAE,QAAQ,KAAO,EAAE,EAAS,OAAS,KAAK,QAAQ,SAAS,KAAK,GAAK,EAAE,KAAO,OAAO,GAAG,KAAK,CAAC,EACjK,GAAI,OAAO,KAAO,IAAM,OAAO,OAAO,EAAE,EAAG,CAAE,OAAO,qCAAqC,EAAG,OAAO,EAAG,MAAQ,CAC9G,MAAM,YAAc,CAAE,GAAG,KAAM,QAAS,MAAO,EAC3C,MAAM,MAAM,QAAQ,KAAO,GAAI,MAAM,KAAO,aAAoB,MAAM,OAAO,OAAO,EAAE,EAAG,MAAM,OAAO,IAAI,OAAO,GAAI,WAAW,GACpI,OAAO,EAAG,OAAO,CACnB,CACF,CAAC,EACD,KAAK,iBAAiB,QAAS,OAAS,CAAM,MAAM,OAAO,aAAa,aAAa,IAAK,MAAM,MAAQ,MAAM,OAAO,MAAO,eAAe,EAAK,CAAC,GAChJ,SAAY,CACX,OAAO,EACP,MAAM,OAAS,IAAI,gBAAgB,SAAS,MAAM,EAAS,OAAS,OAAO,IAAI,SAAS,EAClF,SAAW,OAAO,IAAI,WAAW,EACvC,GAAI,SACF,GAAI,CACF,MAAM,QAAU,SAAS,MAAM,GAAG,EAClC,GAAI,QAAQ,OAAS,GAAK,CAAC,QAAQ,MAAM,OAAS,iCAAiC,KAAK,KAAK,CAAC,EAAG,MAAM,IAAI,MAAM,8DAA8D,EAC/K,MAAM,SAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,MAAM,OAAS,CAC5D,KAAM,CAACC,QAAQ,SAAS,EAAI,MAAM,MAAM,GAAG,EACrC,QAAU,UAAU,MAAM,KAAK,GAAG,IAAI,YAAY,mBAAmBA,OAAM,CAAC,KAAK,EAAG,EAAI,EACxF,OAAS,QAAQ,SAAS,KAAK,GAAK,EAAE,KAAO,OAAO,SAAS,GAAK,EAAE,SAAS,EACnF,GAAI,CAAC,OAAQ,MAAM,IAAI,MAAM,sFAAsF,EACnH,GAAI,CAAC,QAAQ,OAAO,EAAG,MAAM,IAAI,MAAM,oEAAoE,EAC3G,MAAO,CAAE,QAAS,QAAS,MAAO,CACpC,CAAC,CAAC,EACF,GAAI,IAAI,IAAI,SAAS,IAAI,MAAQ,KAAK,QAAQ,EAAE,CAAC,EAAE,OAAS,SAAS,OAAQ,MAAM,IAAI,MAAM,0EAA0E,EACvK,MAAM,KAAO,SAAS,CAAC,EACvB,MAAM,KAAO,SAAS,OAAS,EAAI,EAAI,EACvC,SAAS,OAAO,MAAQ,OAAS,MAAM,IAAI,EAAE,QAAQ,MAAQ,MAAM,OAAO,IAAI,KAAK,QAAQ,GAAI,IAAI,CAAC,EACpG,aAAe,EACf,MAAM,KAAO,EACb,OAAO,EACP,OAAO,8FAA8F,EACrG,MACF,OAAS,MAAO,CAAE,OAAO,MAAM,OAAO,CAAG,CAE3C,GAAI,QAAU,gBAAgB,KAAK,MAAM,EACvC,GAAI,CACF,MAAM,QAAU,UAAU,MAAM,KAAK,GAAG,IAAI,YAAY,mBAAmB,MAAM,CAAC,KAAK,EAAG,EAAI,EACxF,OAAS,QAAQ,SAAS,KAAK,GAAK,EAAE,KAAO,OAAO,OAAO,IAAI,SAAS,CAAC,GAAK,EAAE,SAAS,GAAK,QAAQ,SAAS,KAAK,GAAK,EAAE,SAAS,EAC1I,GAAI,CAAC,OAAQ,MAAM,IAAI,MAAM,qEAAqE,EAClG,GAAI,CAAC,QAAQ,OAAO,EAAG,MAAM,IAAI,MAAM,6DAA6D,EACpG,MAAM,KAAO,CAAE,QAAS,QAAS,MAAO,EAAG,MAAM,KAAO,CAC1D,OAAS,MAAO,CAAE,OAAO,MAAM,OAAO,CAAG,CAE3C,MAAM,KAAK,CACb,GAAG,CACL,GAAG",
  "names": ["options", "line", "card", "handle"]
}
