{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/cfp-camp.js?auto=format%2Ccompress"],
  "sourcesContent": ["(function () {\n  if (window.__cfpCampInit) return;\n  window.__cfpCampInit = true;\n  var root = document.querySelector('.cfp26');\n  if (!root) return;\n  var CAMP = root.getAttribute('data-cfp-camp') || 'cfp26';\n  var KEY  = 'cfp_' + CAMP;\n\n  /* ---------- 1. read the inbound touch once, remember it ---------- */\n  function readState() {\n    try { return JSON.parse(sessionStorage.getItem(KEY)) || {}; } catch (e) { return {}; }\n  }\n  function writeState(s) {\n    try { sessionStorage.setItem(KEY, JSON.stringify(s)); } catch (e) {}\n  }\n\n  var qs = new URLSearchParams(window.location.search);\n  var state = readState();\n\n  /* _cfp_via = where they came from BEFORE the camp page. utm_* is only ever read here,\n     on the inbound hop \u2014 we never write utm_* onto our own internal links. */\n  if (!state.via) {\n    var via = qs.get('utm_source') || '';\n    var med = qs.get('utm_medium') || '';\n    if (qs.get('sca_ref')) via = 'angie_referral';\n    if (!via && document.referrer && document.referrer.indexOf(window.location.host) === -1) {\n      try { via = new URL(document.referrer).hostname.replace(/^www\\./, ''); } catch (e) {}\n    }\n    state.via = via ? (med ? via + '_' + med : via) : 'direct';\n  }\n  if (!state.first) state.first = new Date().toISOString();\n  if (!state.link && qs.get('cl')) state.link = qs.get('cl');\n  writeState(state);\n\n  var hv = document.getElementById('cfp-hidden-via');\n  if (hv) hv.value = state.via;\n\n  /* ---------- 2. hard-wire: stamp the cart so it rides into the order ---------- */\n  function stampCart(slug, zone) {\n    /* TWO attributions ride into the order, not one, because they answer different questions and\n       neither is \"the\" right answer:\n\n         _cfp_link / _cfp_zone       FIRST touch \u2014 what got her into this at all\n         _cfp_last / _cfp_last_zone  LAST touch  \u2014 what she clicked immediately before this\n                                     cart write, i.e. what actually caused the add to cart\n\n       Storing only first-touch was the gap: an order could say \"she came in on the tool\" but\n       never \"she added to cart straight off the kit card\". Every event is also logged with a\n       timestamp in cfp_event, so any other model \u2014 full path, tool-then-cart, whatever \u2014 is a\n       query later rather than a decision frozen here. */\n    var body = {\n      attributes: {\n        _cfp_camp:      CAMP,\n        _cfp_link:      state.link || slug,   /* first tracked link wins, never overwritten */\n        _cfp_zone:      state.zone || zone || '',\n        _cfp_last:      slug || state.link || '',\n        _cfp_last_zone: zone || state.zone || '',\n        _cfp_first:     state.first,\n        _cfp_via:       state.via\n      }\n    };\n    return fetch('/cart/update.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(body),\n      keepalive: true\n    }).catch(function () {});\n  }\n\n  /* ---------- 2b. tell the collector, so a click is COUNTED and not only stamped ----------\n     The cart stamp only survives if she buys something. Every click by everyone who does not\n     buy \u2014 which last camp was 798 of 934 people \u2014 leaves no trace at all without this. That is\n     the hole this whole project exists to close, so the beacon is not optional decoration.\n\n     The endpoint is section.settings.give_action, the SAME single value the giveaway form posts\n     to. Deliberately not a second setting: two fields holding one URL is two fields that drift.\n     Blank means inert, exactly as the form is inert until it has somewhere to post. */\n  var COLLECT = window.CFP_COLLECT || '';\n\n  /* A per-visitor id in her own browser. It is what lets a click made before anyone knows who\n     she is be joined to the giveaway entry she fills in ten minutes later, and it is what\n     Customer.io merges an anonymous history onto a real profile with. localStorage so it\n     survives closing the tab; sessionStorage then memory as fallbacks, because Safari private\n     mode throws on localStorage and a thrown error here would kill every beacon on the page. */\n  var anonId = (function () {\n    var k = 'cfp_anon_id';\n    var mk = function () {\n      try {\n        if (window.crypto && crypto.randomUUID) return 'a_' + crypto.randomUUID();\n      } catch (e) {}\n      return 'a_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 10);\n    };\n    try { var v = localStorage.getItem(k); if (v) return v; var n = mk(); localStorage.setItem(k, n); return n; } catch (e) {}\n    try { var w = sessionStorage.getItem(k); if (w) return w; var m = mk(); sessionStorage.setItem(k, m); return m; } catch (e) {}\n    return mk();\n  })();\n\n  function newEventId() {\n    try { if (window.crypto && crypto.randomUUID) return 'e_' + crypto.randomUUID(); } catch (e) {}\n    return 'e_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 10);\n  }\n\n  function collect(kind, slug, zone, detail, extra) {\n    if (!COLLECT || COLLECT === '#') return;\n    var p = new URLSearchParams();\n    p.set('type', kind);\n    p.set('cfp_camp', CAMP);\n    if (slug)   p.set('cfp_link', slug);\n    if (zone)   p.set('cfp_zone', zone);\n    p.set('cfp_via', state.via || 'direct');\n    p.set('cfp_anon_id', anonId);\n    p.set('cfp_event_id', newEventId());\n    p.set('cfp_occurred_at', new Date().toISOString());\n    if (detail) p.set('cfp_detail', String(detail).slice(0, 500));\n    /* Volunteered intent \u2014 the zip she typed, what she makes, the kind of shop she filtered to.\n       Aidan's ask verbatim: \"can we capture their zip too.. if its different than the one on file\n       then we have learned about them, also i want all the submission forms kept for segmenting\".\n       Sent through this one function rather than a second fetch of its own, so it inherits the\n       event id, the dedupe and the anon id instead of arriving as an untracked parallel event. */\n    if (extra) {\n      for (var k in extra) {\n        if (Object.prototype.hasOwnProperty.call(extra, k) && extra[k]) {\n          p.set(k, String(extra[k]).slice(0, 240));\n        }\n      }\n    }\n    /* If she has already entered the giveaway we know who she is, so everything after that lands\n       on HER profile instead of an anonymous event. Only a profile attribute segments easily. */\n    if (state.email) p.set('email', state.email);\n\n    /* sendBeacon FIRST, and this is the whole reason it exists: a click NAVIGATES AWAY, and a\n       normal fetch is cancelled when the page unloads, so the most important events would be\n       exactly the ones lost. A urlencoded Blob is a \"simple\" request, so it needs no CORS\n       preflight \u2014 a preflight on unload would not complete either. */\n    try {\n      if (navigator.sendBeacon) {\n        var blob = new Blob([p.toString()], { type: 'application/x-www-form-urlencoded' });\n        if (navigator.sendBeacon(COLLECT, blob)) return;\n      }\n    } catch (e) {}\n\n    /* Fallback for browsers without sendBeacon. keepalive asks the browser to finish the\n       request after unload; it is weaker than sendBeacon but far better than nothing. */\n    try {\n      fetch(COLLECT, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },\n        body: p.toString(),\n        keepalive: true,\n        mode: 'cors'\n      }).catch(function () {});\n    } catch (e) {}\n  }\n\n  /* ---------- 3. every tracked link stamps on click ---------- */\n  document.addEventListener('click', function (e) {\n    var a = e.target.closest ? e.target.closest('[data-cfp-slug]') : null;\n    if (!a) return;\n    var slug = a.getAttribute('data-cfp-slug');\n    if (!slug) return;\n    var zone = a.getAttribute('data-cfp-zone') || '';\n    /* first tracked link wins, and its zone is frozen with it \u2014 otherwise the cart says the\n       kit band earned the order when the hero is what she actually clicked first */\n    if (!state.link) { state.link = slug; state.zone = zone; writeState(state); }\n    var hl = document.getElementById('cfp-hidden-link');\n    if (hl) hl.value = state.link;\n    state.clicks = (state.clicks || 0) + 1;\n    writeState(state);\n    stampCart(slug, zone);\n    /* the beacon carries the slug and zone OF THIS CLICK, not the frozen first-touch pair.\n       cfp_event is a log of what happened; freezing belongs to the cart, not to history. */\n    collect('link_click', slug, zone);\n    if (window.dataLayer) {\n      window.dataLayer.push({\n        event: 'cfp_link_click', cfp_camp: CAMP, cfp_link: slug,\n        cfp_zone: zone, cfp_via: state.via\n      });\n    }\n  }, true);\n\n  /* stamp on arrival too, so a landing with ?cl= is captured even with no click */\n  if (state.link) stampCart(state.link, state.zone);\n\n  /* One page_view per session. This is the DENOMINATOR: without it a visit that clicked\n     nothing is invisible, and \"arrived and did nothing\" is the single biggest number on this\n     page \u2014 235 of last camp's 934 people stopped at exactly that point. Once per session, not\n     once per pageload, so a back-button does not inflate it. */\n  if (!state.viewed) {\n    state.viewed = 1;\n    writeState(state);\n    collect('page_view', qs.get('cl') || '', qs.get('cz') || '');\n  }\n\n  /* ---------- 3b. embedded tools talk to us; we do the writing ----------\n     An embedded tool is on a different origin (every Shopify response on this store sends\n     frame-ancestors 'none', so a tool cannot live on the store and be framed by this page).\n     A cross-origin iframe cannot touch our cart, so it cannot write the _cfp_* attributes\n     itself. It tells the parent what happened and the parent stamps the cart, reusing the\n     same verified wire as a click. That is the whole reason the message contract exists.\n\n     Contract (see TOOL-CONTRACT.md):\n       { source:'nt-tool', tool:'<slug>', event:'loaded|used|completed|cta_click|resize', detail:{} }\n     'resize' carries detail.height so the embed does not end up as a scrollbar inside a\n     scrollbar, which on a phone is unusable.\n\n     We do NOT filter on a fixed origin list here: the tool host is deliberately a single\n     editable value in link-map.json, so hard-coding an origin in JS would put the host in a\n     second place and the two would drift. Instead we accept only messages whose slug matches\n     an embed we actually rendered, which is a tighter check than an origin string anyway. */\n  var embedSlugs = {};\n  document.querySelectorAll('[data-cfp-embed-slug]').forEach(function (el) {\n    var s = el.getAttribute('data-cfp-embed-slug');\n    if (s) embedSlugs[s] = el;\n  });\n\n  var TOOL_EVENTS = { loaded: 1, used: 1, completed: 1, cta_click: 1, resize: 1 };\n  /* The tallest an embed is allowed to make itself.\n\n     12,000px was set for the TOWN SWEEP, which returned a long list of results and genuinely\n     needed to grow. That tool is abandoned (ADR-0014, reconfirmed 2026-09-15) and is on no page,\n     so the only embed left is the camp calendar, which is a month grid and has no business being\n     twelve thousand pixels tall. It was asking for 3,026px on a phone and getting all of it:\n     19.7% of the entire page in one band, and it grew again every time a day was opened.\n\n     So the ceiling is now RELATIVE TO HER SCREEN, not an absolute number tuned for a dead tool.\n     An embed may be at most TOOL_MAX_VH screens tall and then it scrolls inside itself. The\n     absolute number stays as a second backstop. A tool that genuinely needs to be longer says so\n     for itself with data-cfp-embed-max-vh on its host, rather than everything on the page\n     inheriting one tool's worst case. */\n  var TOOL_MAX_H = 12000;\n  var TOOL_MAX_VH = 1.6;\n\n  /* Resolve the ceiling for one embed host, in pixels, at the CURRENT viewport. Recomputed on\n     resize, because a phone that rotates would otherwise keep a height measured in portrait. */\n  function frameCeiling(host) {\n    var vh = parseFloat(host.getAttribute('data-cfp-embed-max-vh')) || TOOL_MAX_VH;\n    var byScreen = Math.round((window.innerHeight || 800) * vh);\n    return Math.min(TOOL_MAX_H, byScreen);\n  }\n\n  /* What the tool last asked for, per slug, so a re-clamp on resize does not have to wait for\n     the tool to send another message. */\n  var frameWant = {};\n\n  function applyFrameHeight(slug) {\n    var host = embedSlugs[slug];\n    if (!host) return;\n    var fr = host.querySelector('.cfp-tool-frame iframe');\n    var want = frameWant[slug];\n    if (!fr || !want) return;\n    fr.style.height = Math.min(want, frameCeiling(host)) + 'px';\n  }\n\n  var reclampTimer = null;\n  window.addEventListener('resize', function () {\n    clearTimeout(reclampTimer);\n    reclampTimer = setTimeout(function () {\n      Object.keys(frameWant).forEach(applyFrameHeight);\n    }, 150);\n  });\n\n  window.addEventListener('message', function (e) {\n    var d = e.data;\n    if (!d || typeof d !== 'object') return;\n    if (d.source !== 'nt-tool') return;\n    var slug = d.tool;\n    var host = embedSlugs[slug];\n    if (!host) return;                      /* not a tool we put on this page */\n    if (!TOOL_EVENTS[d.event]) return;      /* unknown verb: ignore, do not invent history */\n\n    if (d.event === 'resize') {\n      var h = parseInt((d.detail && d.detail.height) || 0, 10);\n      /* CLAMP, do not discard. This used to read `h > 200 && h < 6000`, which IGNORED any\n         height at or above the ceiling instead of capping it \u2014 so a tool that grew past 6000\n         left the frame frozen at whatever height it happened to send on the way up, and the\n         rest of her results sat behind a scrollbar inside this page's own scrollbar.\n         Measured on the real page 2026-09-11: after one zip search the town sweep asked for\n         13,880px on a phone and the frame stayed at 2,366px, hiding 11,514px of her list.\n         The ceiling itself is now per-screen, see frameCeiling above. */\n      if (h > 200) { frameWant[slug] = h; applyFrameHeight(slug); }\n      return;\n    }\n\n    /* A real interaction inside the tool counts exactly like a click on a tracked link. */\n    if (!state.link) { state.link = slug; state.zone = 'find'; writeState(state); }\n    var hl2 = document.getElementById('cfp-hidden-link');\n    if (hl2) hl2.value = state.link;\n    state.clicks = (state.clicks || 0) + 1;\n    writeState(state);\n    stampCart(slug, 'find');\n    /* The three fields the tool actually has, named rather than buried in the detail blob, so\n       the collector can put them on her profile where a Customer.io segment can filter on them.\n       The typed zip is STORED, never compared here: whether it differs from the zip on file is a\n       query the dashboard runs against order history, not a second API call at write time. */\n    var det = d.detail || {};\n    collect('tool_' + d.event, slug, 'find',\n            d.detail ? JSON.stringify(d.detail) : '',\n            { zip: det.zip, what_you_make: det.what_you_make, shop_type: det.shop_type });\n\n    if (window.dataLayer) {\n      window.dataLayer.push({\n        event: 'cfp_tool_' + d.event, cfp_camp: CAMP, cfp_link: slug,\n        cfp_zone: 'find', cfp_via: state.via,\n        cfp_detail: (d.detail && JSON.stringify(d.detail).slice(0, 500)) || ''\n      });\n    }\n  }, false);\n\n  /* ---------- 3b. the pricing calculator ----------\n     RESTORED TO THE TOOLKIT ARTIFACT'S \"So, what do you net?\" MATH, 2026-09-15 (ADR-0014).\n\n     It used to lead with a MULTIPLIER \u2014 price = cost x 2 \u2014 taken from cheat sheet 05. Aidan\n     overruled that restructure: \"just use the fucking pricing tool, its there alreayd.\" So the\n     control is a TARGET MARGIN again and the formula is the artifact's:\n\n         price = cost / (1 - margin/100)\n\n     Those two are not the same thing said differently. A 45% margin is 1.82x cost; a 2x\n     multiplier is a 50% margin. Do not swap one back in for the other.\n\n     It is tracked like a tool, not like a link: the first real edit fires tool_used once, and\n     that is what tells us whether the pricing band earned its place on the page. */\n  var calc = document.getElementById('cfp-calc');\n  if (calc) {\n    var CALC_SLUG = calc.getAttribute('data-cfp-slug') || 'tool_pricing';\n    var DTF_COST  = parseFloat(calc.getAttribute('data-cfp-dtf-cost')) || 3.80;\n    var UV_COST   = parseFloat(calc.getAttribute('data-cfp-uv-cost'))  || 0.72;\n    var $ = function (id) { return document.getElementById(id); };\n    var num = function (id) {\n      var v = parseFloat(($(id) || {}).value);\n      return isFinite(v) && v > 0 ? v : 0;\n    };\n    var money = function (n) {\n      return '$' + n.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n    };\n    var whole = function (n) {\n      return '$' + Math.round(n).toLocaleString('en-US');\n    };\n    var text = function (id, v) { var el = $(id); if (el) el.textContent = v; };\n\n    var calcFired = false;\n    function recalc() {\n      var blank = num('cfp-c-blank'), transfer = num('cfp-c-transfer'), other = num('cfp-c-other');\n      /* Her own time is minutes x rate / 60. It is a real cost even though it never leaves her\n         bank account, which is the entire point of cheat sheet rule two. */\n      var labor = (num('cfp-c-mins') / 60) * num('cfp-c-rate');\n      var cost  = blank + transfer + other + labor;\n\n      /* The artifact's formula. Clamped at 95 so a slider that somebody widens later can never\n         divide by zero and paint Infinity on a customer's screen. */\n      var mg = parseFloat(($('cfp-c-margin') || {}).value);\n      if (!isFinite(mg)) mg = 45;\n      mg = Math.max(1, Math.min(95, mg));\n      var price  = cost / (1 - mg / 100);\n      var profit = price - cost;\n\n      text('cfp-c-marginlab', Math.round(mg) + '%');\n      text('cfp-c-cost',  money(cost));\n      text('cfp-c-cost2', money(cost));\n      text('cfp-c-price', money(price));\n      text('cfp-c-profit', money(profit));\n      text('cfp-c-paid',  money(labor));\n      text('cfp-c-markup', (cost > 0 ? (price / cost).toFixed(1) : '0') + '\u00D7');\n\n      /* The bar is a share of PRICE, not of cost, so the profit slice is visible at all. */\n      var total = price > 0 ? price : 1;\n      var seg = function (id, val) { var el = $(id); if (el) el.style.width = ((val / total) * 100) + '%'; };\n      seg('cfp-c-seg-blank', blank); seg('cfp-c-seg-transfer', transfer);\n      seg('cfp-c-seg-other', other); seg('cfp-c-seg-labor', labor);\n      seg('cfp-c-seg-profit', profit > 0 ? profit : 0);\n\n      /* 12, not the artifact's 10. Twelve is the order in the insider note directly above this\n         band, and it is the number she is actually scared of. */\n      text('cfp-c-r12',  whole(profit * 12));\n      text('cfp-c-r50',  whole(profit * 50));\n      text('cfp-c-r100', whole(profit * 100));\n\n      if (!calcFired) {\n        calcFired = true;\n        collect('tool_used', CALC_SLUG, 'pricing');\n      }\n    }\n\n    /* ----- the blank picker -----\n       Picking a blank fills in its starting cost AND the right decoration cost, because the two\n       are not independent: a mug is UV DTF and a tee is DTF, and quoting a $3.80 DTF transfer\n       against a tumbler would be teaching her the one thing this page must never teach.\n       She can still type over both numbers straight afterwards. */\n    var sel = $('cfp-c-blanksel');\n    function applyBlank(userDriven) {\n      if (!sel) return;\n      var opt = sel.options[sel.selectedIndex];\n      if (!opt) return;\n      var cost   = parseFloat(opt.getAttribute('data-cost'));\n      var method = (opt.getAttribute('data-method') || 'dtf').toLowerCase();\n      var hint   = opt.getAttribute('data-hint') || '';\n      /* On the first paint we only write the HINTS. The two cost boxes already carry the\n         starting numbers Aidan set in the theme editor, and overwriting them from the first\n         option would make those two settings silently do nothing. */\n      if (userDriven) {\n        if (isFinite(cost) && $('cfp-c-blank')) $('cfp-c-blank').value = cost.toFixed(2);\n        if ($('cfp-c-transfer')) $('cfp-c-transfer').value = (method === 'uv' ? UV_COST : DTF_COST).toFixed(2);\n      }\n      text('cfp-c-blankhint', hint);\n      text('cfp-c-printhint', method === 'uv'\n        ? 'A UV DTF sticker. It peels off the sheet and goes on by hand, no press at all.'\n        : 'A DTF transfer at the gang sheet rate. It goes on with a heat press.');\n      if (userDriven) recalc();\n    }\n    if (sel) sel.addEventListener('change', function () { applyBlank(true); });\n\n    calc.addEventListener('input', recalc);\n    calc.addEventListener('change', recalc);\n    applyBlank(false);\n    recalc();\n    calcFired = false;   /* the first paint is ours, not hers \u2014 do not report it as a use */\n  }\n\n  /* ---------- 3c. the calculator modal ----------\n     Added 2026-09-15 with the pricing calculator's move into the free tools band as a tile.\n     Aidan: \"put the pricing cal in the tools as a tile in the tools thing, it can open as a modal.\"\n\n     The opener deliberately carries data-cfp-modal-slug and NOT data-cfp-slug. The global click\n     handler in section 3 fires link_click on anything with data-cfp-slug, and opening a calculator\n     that never leaves the page is not a link click. It fires tool_loaded instead, which is on the\n     collector's whitelist, and the calculator itself still fires tool_used on her first real edit.\n     Two different questions: did she open it, and did she actually use it.\n\n     Native <dialog> does the backdrop, the focus trap and Escape. The only thing it does not do\n     reliably across browsers is stop the page behind it from scrolling, so that is the one piece\n     handled here. */\n  function cfpModalOpen(dlg) {\n    if (dlg.showModal) { try { dlg.showModal(); } catch (e) { dlg.setAttribute('open', ''); } }\n    else dlg.setAttribute('open', '');\n    document.documentElement.style.overflow = 'hidden';\n  }\n  function cfpModalClose(dlg) {\n    if (dlg.close) { try { dlg.close(); } catch (e) { dlg.removeAttribute('open'); } }\n    else dlg.removeAttribute('open');\n    document.documentElement.style.overflow = '';\n  }\n\n  document.querySelectorAll('[data-cfp-modal]').forEach(function (btn) {\n    var dlg = document.getElementById(btn.getAttribute('data-cfp-modal'));\n    if (!dlg) return;\n    btn.addEventListener('click', function () {\n      cfpModalOpen(dlg);\n      var slug = btn.getAttribute('data-cfp-modal-slug');\n      if (slug) collect('tool_loaded', slug, btn.getAttribute('data-cfp-modal-zone') || 'tools');\n    });\n\n    /* Escape and the browser's own close both fire 'close', so the scroll lock is released there\n       rather than only in the X button's handler. */\n    dlg.addEventListener('close', function () { document.documentElement.style.overflow = ''; });\n\n    dlg.querySelectorAll('[data-cfp-modal-close]').forEach(function (x) {\n      x.addEventListener('click', function () { cfpModalClose(dlg); });\n    });\n\n    /* Click on the backdrop. The dialog element itself fills the whole viewport as far as the\n       event is concerned, so \"outside\" means outside the inner panel's box, not a different\n       target. Comparing against getBoundingClientRect is the only reading that is correct when\n       the dialog is scrolled internally. */\n    dlg.addEventListener('click', function (e) {\n      var panel = dlg.querySelector('.cfp-modal-in');\n      if (!panel) return;\n      var r = panel.getBoundingClientRect();\n      var inside = e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom;\n      if (!inside) cfpModalClose(dlg);\n    });\n  });\n\n  /* ---------- 4. the giveaway form ----------\n     THE ENTRY COUNTER AND THE \"ADD ANOTHER\" HANDLE ROWS WERE DELETED 2026-09-15 (ADR-0014).\n     Aidan: \"theres only one entry.\" Both existed solely to service bonus entries: the counter\n     added one per handle typed, and \"Add another\" appended numbered inputs so three Instagram\n     accounts could earn three entries. With the handle rows gone from the form, the counter can\n     only ever read 1 and the button has nothing to append to.\n\n     DO NOT PUT THEM BACK when you see .cfp-social / .cfp-addmore rules still sitting in\n     assets/cfp-camp.css. The CSS is harmless and was left alone deliberately; the markup those\n     rules style is what Aidan removed. */\n  var form = document.getElementById('cfp-give-form');\n  if (form) {\n    /* THE AFFILIATE TOOLTIP HANDLER CAME OUT 2026-09-15 with the question itself. Aidan: \"we\n       gotta remove the affiliate program thing.\" It toggled #cfp-affil-tip and reported the open\n       as an `affiliate_tooltip_open` link_click. Both are gone from sections/cfp-giveaway.liquid,\n       so this was code guarding for markup that can no longer exist.\n\n       The `affiliate_tooltip_open` slug stays in link-map.json on purpose. A slug is never\n       re-minted and never renamed; it is simply no longer sent. */\n\n    form.addEventListener('submit', function (e) {\n      var action = form.getAttribute('action') || '';\n      if (!action || action === '#') return;      /* not wired yet \u2014 let it no-op */\n      e.preventDefault();\n      var btn  = form.querySelector('button[type=\"submit\"]');\n      var ok   = form.querySelector('.cfp-form-ok');\n      var err  = form.querySelector('.cfp-form-err');\n      var idle = form.querySelector('.cfp-form-idle');\n      if (btn) { btn.disabled = true; btn.textContent = 'Entering\u2026'; }\n      if (err) err.hidden = true;\n      var hl2 = document.getElementById('cfp-hidden-link');\n      if (hl2) hl2.value = state.link || '';\n      /* urlencoded, NOT FormData. FormData sends multipart, and the collector cannot read\n         multipart reliably (Vercel mangles the raw body before the handler sees it), so an\n         entry would be accepted-looking and lost. Also NOT mode:'no-cors' \u2014 an opaque\n         response makes every failure look like a success, which would tell a crafter she is\n         entered when she is not. The collector sends proper CORS headers for this origin. */\n      var params = new URLSearchParams(new FormData(form));\n      /* The same anon id her earlier clicks were sent under. This is what makes Customer.io\n         attach that history to this profile, and what joins her clicks to her entry in the\n         truth store. Without it the entry looks like it arrived from nowhere. */\n      params.set('cfp_anon_id', anonId);\n      params.set('cfp_event_id', newEventId());\n      params.set('cfp_occurred_at', new Date().toISOString());\n      if (state.zone) params.set('cfp_zone', state.zone);\n\n      fetch(action, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },\n        body: params.toString()\n      })\n        .then(function (r) {\n          if (!r.ok) throw new Error('collector returned ' + r.status);\n          return r;\n        })\n        .then(function () {\n          /* Remember who she is for the rest of the session. This is the join: anything the tool\n             tells us AFTERWARDS lands on her profile instead of an anonymous event, and only a\n             profile attribute is easy to segment on. An anonymous tool use can be counted but it\n             cannot be segmented, because a segment needs a person \u2014 which is the real reason the\n             tool and the form live on the same page. */\n          var em = form.querySelector('[name=\"email\"]');\n          if (em && em.value) { state.email = em.value.trim().toLowerCase(); writeState(state); }\n          /* .cfp-affil stays in this selector even though the affiliate box was removed on\n             2026-09-15. It costs one comparison, and it is the difference between a clean thank\n             you and a stranded box if that markup ever comes back. */\n          form.querySelectorAll('label, input, select, button, .cfp-affil')\n              .forEach(function (el) { el.style.display = 'none'; });\n          if (idle) idle.hidden = true;\n          if (ok) ok.hidden = false;\n          stampCart('giveaway_entry');\n        })\n        .catch(function () {\n          if (btn) { btn.disabled = false; btn.textContent = 'Enter the giveaway \u2192'; }\n          if (err) err.hidden = false;\n        });\n    });\n  }\n})();\n"],
  "mappings": "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",
  "names": ["recalc", "applyBlank"]
}
