<!-- 2026-06-03T13:47:13.4764974Z -->
<style>.shoplift-hide { opacity: 0 !important; }</style>
<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-11-10T09:45:02.6560238Z */(function(){"use strict";var oe=document.createElement("style");oe.textContent=`#shoplift-preview-control{position:fixed;max-width:332px;height:56px;background-color:#141414;z-index:9999;bottom:20px;display:flex;border-radius:8px;box-shadow:13px 22px 7px #0000,9px 14px 7px #00000003,5px 8px 6px #0000000d,2px 4px 4px #00000017,1px 1px 2px #0000001a,0 0 #0000001a;align-items:center;margin:0 auto;left:16px;right:16px;opacity:0;transform:translateY(20px);visibility:hidden;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s .4s}#shoplift-preview-control.visible{opacity:1;transform:translateY(0);visibility:visible;transition:opacity .4s ease-in-out,transform .4s ease-in-out,visibility 0s 0s}#shoplift-preview-control *{font-family:Inter,sans-serif;color:#fff;box-sizing:border-box;font-size:16px}#shoplift-preview-variant-title{font-weight:400;line-height:140%;font-size:16px;text-align:start;letter-spacing:-.16px;flex-grow:1;text-wrap:nowrap;overflow:hidden;text-overflow:ellipsis}#shoplift-preview-variant-selector{position:relative;display:block;padding:6px 0;height:100%;min-width:0;flex:1 1 auto}#shoplift-preview-variant-menu-trigger{border:none;cursor:pointer;width:100%;background-color:transparent;padding:0 16px;border-left:1px solid #333;border-right:1px solid #333;height:100%;display:flex;align-items:center;justify-content:start;gap:8px}#shoplift-preview-variant-selector .menu-variant-label{width:24px;height:24px;border-radius:50%;padding:6px;display:flex;justify-content:center;align-items:center;font-size:12px;font-style:normal;font-weight:600;line-height:100%;letter-spacing:-.12px;flex-shrink:0}#shoplift-preview-variant-selector .preview-variant-menu{position:absolute;bottom:110%;transform:translate3d(0,20px,0);visibility:hidden;pointer-events:none;opacity:0;cursor:pointer;background-color:#141414;border:1px solid #141414;border-radius:6px;width:100%;max-height:156px;overflow-y:auto;box-shadow:0 8px 16px #0003;z-index:1;transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s .3s}#shoplift-preview-variant-selector .preview-variant-menu.preview-variant-menu__visible{visibility:visible;pointer-events:auto;opacity:100;transform:translateZ(0);transition:opacity .3s ease-in-out,transform .3s ease-in-out,visibility 0s 0s}@media screen and (max-width:400px){#shoplift-preview-variant-selector .preview-variant-menu{position:fixed;left:0;right:0;width:auto;bottom:110%}}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item{padding:12px 16px;display:flex;overflow:hidden}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item .menu-variant-label{margin-right:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item span{overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;color:#f6f6f6;font-size:14px;font-style:normal;font-weight:500}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:hover{background-color:#545454}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:last-of-type{border-bottom-left-radius:6px;border-bottom-right-radius:6px}#shoplift-preview-variant-selector .preview-variant-menu .preview-variant-menu--item:first-of-type{border-top-left-radius:6px;border-top-right-radius:6px}#shoplift-preview-control div:has(#shoplift-exit-preview-button){padding:0 16px}#shoplift-exit-preview-button{padding:6px 8px;font-weight:500;line-height:75%;border-radius:4px;background-color:transparent;border:none;text-decoration:none}#shoplift-exit-preview-button:hover{cursor:pointer;background-color:#333}#shoplift-preview-subscription-warning{position:relative;display:flex;align-items:center;gap:6px;padding:6px 10px;margin:0 4px;border-left:1px solid #333;cursor:help;outline:none}#shoplift-preview-subscription-warning__icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background-color:#f59e0b;color:#141414!important;font-weight:700;font-size:12px!important;line-height:1;flex-shrink:0}#shoplift-preview-subscription-warning__label{font-size:13px!important;font-weight:500;color:#fbbf24!important;text-wrap:nowrap;white-space:nowrap}#shoplift-preview-subscription-warning__tooltip{position:absolute;bottom:calc(100% + 8px);right:0;max-width:320px;width:max-content;padding:10px 12px;border-radius:6px;background-color:#1f1f1f;color:#fff!important;font-size:12px!important;line-height:1.4!important;box-shadow:0 8px 16px #0000004d;z-index:10000;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s .2s;pointer-events:none}#shoplift-preview-subscription-warning__tooltip.shoplift-preview-subscription-warning__tooltip--visible{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .2s ease-in-out,transform .2s ease-in-out,visibility 0s 0s}#shoplift-preview-subscription-warning:focus-visible{box-shadow:inset 0 0 0 2px #f59e0b;border-radius:4px}#shoplift-preview-control:has(#shoplift-preview-subscription-warning){max-width:480px}/*$vite$:1*/`,document.head.appendChild(oe);var Ce=" daum[ /]| deusu/|(?:^|[^g])news(?!sapphire)|(?<! channel/|google/)google(?!(?:wv|app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!cam)scan|(?<!lib)http|24x7|;\\s\\w+;$|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\b\\w+/1\\.0;|\\bbw/|\\bdlc\\b|\\bort/|\\bperl\\b|\\btime/|\\||^[<\\(;]|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[\\w\\-]+/[\\w]+$|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^\\w+/\\d\\.\\d\\s\\([\\w@]+\\)$|^active|^ad muncher|^amaya|^apache/|^avsdevicesdk/|^azure|^biglotron|^blackbox exporter|^bot|^clamav[ /]|^claude-code/|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^exodusmovement|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\((?:compatible;)?(?:\\s?[\\w\\d-.]+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^ps_daily/|^python|^rank|^read|^reed|^remove\\.bg/|^rest|^rss|^snapchat|^sora |^space bison|^stape/|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|abuse|advisor|agent\\b|analyzer|archive|ask jeeves/teoma|attracta|audit|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|collapsify\\b|convertify|cookiehubverify/|crawl|cursor/|cypress/|dareboost|datanyze|dejaclick|detect|discovery|dmbrowser|download|exaleadcloudview|feed|firephp|foregenix|functionize|grab|hardenize\\b|headless|hotjar|httrack|hubspot marketing grader|ibisbrowser|infrawatch|insight|inspect|iplabel|java(?!;)|library|linkcheck|linktiger|mail\\.ru/|manager|manus-user/|marketgoo/|measure|monitor\\b|neustar wpm|node\\b|nutch|offbyone|openvas|optimize|pageburst|pagespeed|parser|phantomjs|pingdom|playwright|powermarks|preview|productfinder|prospectingstudio|proxy|ptst[ /]\\d|radar|readable/|retriever|rexx;|rigor|rss\\b|scrape|securityheaders|selenium|server|silktide|sindup/|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|testlocally|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|watchtowr|webglance|webkit2png|whatcms/|xtate/",Te=/bot|crawl|http|lighthouse|scan|search|spider/i,W;function Ie(){if(W instanceof RegExp)return W;try{W=new RegExp(Ce,"i")}catch{W=Te}return W}var Pe=a=>typeof a=="string"&&a!=="";function Ae(a){return Pe(a)&&Ie().test(a)}var Ee=Ae;class te{timestamp;constructor(){this.timestamp=new Date}}class ke extends te{type;testId;hypothesisId;constructor(e,t,i){super(),this.type=3,this.testId=e,this.hypothesisId=t,this.timestamp=i}}class _e extends te{type;path;constructor(e){super(),this.type=4,this.path=e}}class xe extends te{type;cart;constructor(e){super(),this.type=5,this.cart=e}}class j extends Error{isBot;constructor(){super(),this.isBot=!0}}function Re(a,e,t){for(const i of e.selectors){const s=a.querySelectorAll(i.cssSelector);for(let n=0;n<s.length;n++)t(e.testId,e.hypothesisId)}ce(a,e,(i,s,n,r,o)=>o(s,n),t)}function N(a,e,t){for(const i of e.selectors)le(a,e.testId,e.hypothesisId,i,t??(()=>{}));ce(a,e,le,t??(()=>{}))}function ae(a){return a.urlPatterns.reduce((e,t)=>{switch(t.operator){case"contains":return e+`.*${t}.*`;case"endsWith":return e+`.*${t}`;case"startsWith":return e+`${t}.*`}},"")}function ce(a,e,t,i){new MutationObserver(()=>{for(const n of e.selectors)t(a,e.testId,e.hypothesisId,n,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function le(a,e,t,i,s){const n=a.querySelectorAll(i.cssSelector);for(let r=0;r<n.length;r++){let o=n.item(r);if(o instanceof HTMLElement&&o.dataset.shoplift!==""){o.dataset.shoplift="";for(const c of i.actions.sort(qe))o=De(a,i.cssSelector,o,c)}}return n.length>0&&s?(s(e,t),!0):!1}function De(a,e,t,i){switch(i.type){case"innerHtml":t.innerHTML=i.value;break;case"attribute":Le(t,i.scope,i.value);break;case"css":Ve(a,e,i.value);break;case"js":Oe(a,t,i);break;case"copy":return $e(t);case"remove":Me(t);break;case"move":He(t,parseInt(i.value));break}return t}function Le(a,e,t){a.setAttribute(e,t)}function Ve(a,e,t){const i=a.createElement("style");i.textContent=`${e} { ${t} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function Oe(a,e,t){Function("document","element",`"use strict"; ${t.value}`)(a,e)}function $e(a){const e=a.cloneNode(!0);if(!a.parentNode)throw"Can't copy node outside of DOM";return a.parentNode.insertBefore(e,a.nextSibling),e}function Me(a){a.remove()}function He(a,e){if(e===0)return;const t=Array.prototype.slice.call(a.parentElement.children).indexOf(a),i=Math.min(Math.max(t+e,0),a.parentElement.children.length-1);a.parentElement.children.item(i).insertAdjacentElement(e>0?"afterend":"beforebegin",a)}function qe(a,e){return de(a)-de(e)}function de(a){return a.type==="copy"||a.type==="remove"?0:1}const M={Template:0,UrlRedirect:2,Script:3,Price:5},Ue="data:image/svg+xml,%3csvg%20width='12'%20height='12'%20viewBox='0%200%2012%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M9.96001%207.90004C9.86501%207.90004%209.77001%207.86504%209.69501%207.79004L6.43501%204.53004C6.19501%204.29004%205.80501%204.29004%205.56501%204.53004L2.30501%207.79004C2.16001%207.93504%201.92001%207.93504%201.77501%207.79004C1.63001%207.64504%201.63001%207.40504%201.77501%207.26004L5.03501%204.00004C5.56501%203.47004%206.43001%203.47004%206.96501%204.00004L10.225%207.26004C10.37%207.40504%2010.37%207.64504%2010.225%207.79004C10.15%207.86004%2010.055%207.90004%209.96001%207.90004Z'%20fill='white'/%3e%3c/svg%3e",Ne="data:image/svg+xml,%3csvg%20width='14'%20height='24'%20viewBox='0%200%2014%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M12.3976%2014.5255C12.2833%2013.8788%2012.0498%2013.3024%2011.6952%2012.7961C11.3416%2012.2898%2010.9209%2011.8353%2010.4353%2011.4317C9.94868%2011.0291%209.43546%2010.6488%208.89565%2010.292C8.48487%2010.049%208.09577%209.78565%207.72637%209.50402C7.35697%209.2224%207.08016%208.89503%206.89694%208.51987C6.71273%208.14471%206.67826%207.69533%206.79055%207.1697C6.86345%206.83216%206.97476%206.54647%207.12351%206.31162C7.27324%206.07778%207.47124%205.89986%207.7175%205.77684C7.96377%205.65483%208.21989%205.59383%208.48389%205.59383C8.88087%205.59383%209.17639%205.7016%209.3734%205.91714C9.56943%206.13268%209.68271%206.42345%209.71424%206.78946C9.74576%207.15547%209.72015%207.55401%209.63839%207.98509C9.55663%208.41617%209.43645%208.84724%209.27687%209.27934L13.5127%208.80149C13.9638%207.52656%2014.1017%206.42447%2013.9264%205.49725C13.751%204.56901%2013.2664%203.85122%2012.4724%203.34491C12.239%203.19648%2011.9779%203.07041%2011.6893%202.96569L12.0026%201.50979L9.86397%200L7.3875%201.50979L7.11169%202.78878C6.65166%202.8874%206.21724%203.01957%205.8114%203.19038C4.85292%203.594%204.06684%204.15115%203.45117%204.86385C2.83452%205.57655%202.42571%206.40108%202.22378%207.33847C2.06616%208.06947%202.04942%208.70796%202.17551%209.25087C2.30061%209.7948%202.52028%2010.2828%202.8355%2010.7139C3.14974%2011.145%203.51816%2011.5344%203.93977%2011.881C4.36039%2012.2288%204.782%2012.5521%205.20164%2012.851C5.68334%2013.1702%206.13844%2013.5169%206.56497%2013.8921C6.99052%2014.2672%207.31954%2014.7125%207.55004%2015.228C7.78055%2015.7445%207.81502%2016.3769%207.65347%2017.1262C7.56482%2017.5389%207.43676%2017.8765%207.27028%2018.1388C7.10381%2018.4011%206.89596%2018.5983%206.64772%2018.7295C6.3985%2018.8606%206.12071%2018.9267%205.8114%2018.9267C5.21641%2018.9267%204.79776%2018.6034%204.62833%2018.1632C4.4589%2017.7229%204.47367%2017.2583%204.60075%2016.5639C4.72782%2015.8705%205.05092%2015.1395%205.37107%2014.3699H1.17665C1.17665%2014.3699%200.207341%2016.1115%200.0310135%2017.6762C-0.0655232%2018.5302%200.0635208%2019.2653%200.41519%2019.8844C0.76686%2020.5036%201.33032%2020.9814%202.10655%2021.319C2.39222%2021.443%202.7104%2021.5447%203.05813%2021.623L2.54589%2024H7.17473L7.7047%2021.5386C8.08493%2021.442%208.43857%2021.3231%208.76562%2021.1787C9.73985%2020.7476%2010.52%2020.1427%2011.1071%2019.3649C11.6932%2018.5871%2012.0873%2017.7291%2012.2892%2016.7917C12.4744%2015.9295%2012.5099%2015.1741%2012.3966%2014.5275L12.3976%2014.5255Z'%20fill='white'/%3e%3c/svg%3e";async function Fe(a){let e=a.replace(/-/g,"+").replace(/_/g,"/");for(;e.length%4;)e+="=";const t=atob(e),i=Uint8Array.from(t,r=>r.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),n=await new Response(s).text();return JSON.parse(n)}function F(a,e){return typeof e=="string"&&/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+(?:Z|[+-]\d+)/.test(e)?new Date(e):e}function Be(a,e){return e}function H(a,e=!1,t=!1,i=","){const s=a/100;if(t){const r=Math.round(s).toLocaleString("en-US");return i!==","?r.replace(/,/g,i):r}else{const n=e?",":".",r=s.toFixed(2).split("."),o=parseInt(r[0],10),c=r[1]??"00",l=o.toLocaleString("en-US");return i!==","?`${l.replace(/,/g,i)}${n}${c}`:e?`${l.replace(/,/g,".")}${n}${c}`:`${l}${n}${c}`}}function q(a,e,t,i){const s=e.replace("{{amount}}",H(a,!1,!1)).replace("{{amount_no_decimals}}",H(a,!1,!0)).replace("{{amount_with_comma_separator}}",H(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",H(a,!0,!0)).replace("{{amount_with_space_separator}}",H(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",H(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",H(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",H(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",H(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",H(a,!1,!0,". "));return i?`${s} ${t}`:s}function pe(a){return a.replace(/[^\d.,\s-]/g,"").trim()}function J(a){const e=new Map;for(const[t,i,s]of a.variants)e.set(t,{priceInCents:i,compareAtPriceInCents:s});return e}function ze(a,e,t,i){const{priceInCents:s,compareAtPriceInCents:n}=t,{moneyFormat:r,currency:o,currencyCodeEnabled:c}=i;if(a.getAttribute("data-sl-attribute-p")===e)a.innerHTML=q(s,r,o,c);else if(a.getAttribute("data-sl-attribute-cap")===e)n<=0||n<=s?a.remove():a.innerHTML=q(n,r,o,c);else if(a.getAttribute("data-sl-attribute-discount")===e&&!(n<=0||n<=s)){const d=Math.round((n-s)/n*100),p=pe(q(n-s,r,o,!1)),u=a.getAttribute("data-sl-format")||"percent";u==="percent"?a.textContent=`-${d}%`:u==="amount"?a.textContent=`-${p}`:u==="both"&&(a.textContent=`-${d}% (-${p})`)}}function We(a){const e=[],t={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,n]of a.variants){e.push({id:`p-${i}`,cssSelector:`[data-sl-attribute-p="${i}"]`,urlPatterns:[t],actions:[{id:`p-action-${i}`,type:"innerHtml",scope:"price",value:q(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const r=n<=0||n<=s;if(e.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[t],actions:[{id:`cap-action-${i}`,type:r?"remove":"innerHtml",scope:"compare-at-price",value:r?"":q(n,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!r&&n>s){const o=Math.round((n-s)/n*100),c=pe(q(n-s,a.moneyFormat,a.currency,!1));e.push({id:`d-${i}`,cssSelector:`[data-sl-attribute-discount="${i}"]`,urlPatterns:[t],actions:[{id:`d-action-${i}`,type:"js",scope:null,value:`var format = element.getAttribute('data-sl-format') || 'percent'; if (format === 'percent') { element.textContent = '-${o}%'; } else if (format === 'amount') { element.textContent = '-${c}'; } else if (format === 'both') { element.textContent = '-${o}% (-${c})'; }`}]})}}return e}const Ge=a=>{let e=5381;for(let t=0;t<a.length;t++)e=(e*33^a.charCodeAt(t))>>>0;return e.toString(36)},he=()=>Math.random().toString(36).slice(2,10)+Date.now().toString(36).slice(-4),Ke=a=>btoa(JSON.stringify(a)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""),B=a=>a.replace(/#slr-[a-z0-9]+$/,""),je=/^[A-Za-z0-9._=~+/-]{1,256}$/,ie=a=>typeof a=="string"&&je.test(a)?a:null,Je=a=>{if(!a)return null;try{const t=JSON.parse(atob(decodeURIComponent(a)))?.$exchange_id;return typeof t=="string"&&t.length>0?t:null}catch{return null}},gt="modulepreload",mt=function(a){return"/"+a},yt={},Ye=function(e,t,i){let s=Promise.resolve();function n(r){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=r,window.dispatchEvent(o),!o.defaultPrevented)throw r}return s.then(r=>{for(const o of r||[])o.status==="rejected"&&n(o.reason);return e().catch(n)})};function ue(a,e,t){const i=t?a.plans.filter(l=>!l.variantId||l.variantId===t):a.plans,s=[],n=[];for(const l of i)l.direction==="decrease"?(s.push(l.existingShopifyPlanId),n.push(l.createdShopifyPlanId)):(s.push(l.createdShopifyPlanId),n.push(l.existingShopifyPlanId));const r=e?s:n,o=e?n:s;if(t)for(const l of a.plans)for(const d of[l.existingShopifyPlanId,l.createdShopifyPlanId])d&&!r.includes(d)&&!o.includes(d)&&o.push(d);const c={};for(let l=0;l<o.length;l++){const d=o[l],p=r[l];d&&p&&(c[d]=p)}return{showPlanIds:r,hidePlanIds:o,swapMap:c}}function fe(a,e,t){const i=e?a.plans.find(n=>n.variantId===e):void 0;if(i)return i.direction;if(t){const n=a.plans.find(r=>r.productId===t);if(n)return n.direction}return a.plans.find(n=>!n.variantId)?.direction??null}function Y(a,e){const t=e?a.plans.filter(n=>!n.productId||n.productId===e):a.plans,i={};for(const n of t)i[n.existingShopifyPlanId]=n.existingDiscountAmount,i[n.createdShopifyPlanId]=n.existingDiscountAmount;const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function G(a){const e=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(e)return e;if(a){for(const n of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const r=n.getAttribute("data-sl-attribute-p");if(!r)continue;const o=a.variants.find(c=>c[0]===r);if(o?.[3])return o[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const n=a.variants.find(r=>r[0]===s);if(n?.[3])return n[3]}}const t=window,i=t.ShopifyAnalytics?.meta?.product?.id??t.meta?.product?.id;return i!=null?String(i):null}function D(a,e){return a.widget.selectors[e]??[]}function U(a,e){return a.replace(/[\d.]+%/,`${e}%`)}function $(a,e){const t=document.createTreeWalker(a,NodeFilter.SHOW_TEXT);let i=t.nextNode();for(;i;){if(i.nodeValue!==null){const s=e(i.nodeValue);if(s!==i.nodeValue){i.nodeValue=s;return}}i=t.nextNode()}}function ge(a,e){return a===null?!1:a==="decrease"?!e:e}async function Ze(a){if(a.subscriptionSwapDone)return;const e=a.getActiveAssignment();if(!e)return;const t=a.getHypothesis(e.hypothesisId);if(!t?.subscriptionData)return;a.subscriptionSwapDone=!0;const i=t.subscriptionData,s=t.isControl,n=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${n}`);const r=i.plans.some(d=>d.variantId);let o=!1,c=!1;function l(){if(!c){c=!0;try{const d=r?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:p,hidePlanIds:u,swapMap:h}=ue(i,s,d);a.swapMap=h;const b=D(i,"widgetParent"),k=D(i,"subscriptionPlans"),C=D(i,"subscriptionInput");if(!b.length||!k.length||!C.length)return;const P=document.querySelector(b[0].selector);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(k[0].selector);if(!_?.shadowRoot)return;const S=C[0].selector;let f=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(S));if(!y.length)return;for(const v of y){const m=v.closest("label");m&&(p.includes(v.value)?m.style.display="":u.includes(v.value)&&(m.style.display="none"))}const w=y.some(v=>p.includes(v.value)&&v.checked),T=y.some(v=>u.includes(v.value)&&v.checked);if((w||T)&&(o=!1),!w&&!o){o=!0;for(const v of y)if(p.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const g=y.find(v=>v.checked);f=g&&p.includes(g.value)?g.value:p[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))u.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(u.includes(y.value)){const w=Array.from(y.options).find(T=>p.includes(T.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}f=p.includes(y.value)?y.value:p[0]??null}if(f){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==f&&(w.value=f)}}finally{c=!1}}}if(a.subscriptionHideWrongPlans=l,a.swapMap=ue(i,s).swapMap,l(),r){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",l)}}function z(a){const e=D(a,"widgetParent");return e.length?document.querySelector(e[0].selector)?.shadowRoot??null:null}function Z(a,e){const t=D(a,"subscriptionPlans");return t.length?e.querySelector(t[0].selector)?.shadowRoot??null:null}function X(a,e){const t=new URLSearchParams(window.location.search).get("variant");if(t)return t;{const i=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(i)return i}return a.size>0?[...a.keys()][0]:void 0}function K(a,e){return q(a,e.moneyFormat,e.currency,e.currencyCodeEnabled)}function Xe({originalFetch:a,swapMap:e,slptValue:t,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function n(o){if(i){const c=i();if(c)return e[c]??c}return e[o]??o}const r=function(o,c){if((typeof o=="string"?o:o instanceof URL?o.href:o.url).includes("/cart/add")&&c?.body)try{if(c.body instanceof FormData){const d=c.body.get("selling_plan");d?c.body.set("selling_plan",n(String(d))):(!d||d==="")&&t&&c.body.set("properties[_slpt]",t)}else if(typeof c.body=="string"){const d=JSON.parse(c.body);if(d.items)for(const p of d.items){const u=String(p.selling_plan??"");u?p.selling_plan=n(u):!p.selling_plan&&t&&(p.properties||(p.properties={}),p.properties._slpt=t)}else if(d.id){const p=String(d.selling_plan??"");p?d.selling_plan=n(p):!d.selling_plan&&t&&(d.properties||(d.properties={}),d.properties._slpt=t)}c.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,o,c)};return r.__shoplift_intercepted=!0,window.fetch=r,function(){window.fetch===r&&(window.fetch=a)}}function Qe({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const e=window.fetch,t=function(i,s){const n=typeof i=="string"?i:i instanceof URL?i.href:i.url;return n.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:n}),Promise.resolve(new Response(JSON.stringify({id:0,properties:{},quantity:0,variant_id:0,key:"preview",title:"Preview — cart-add blocked",price:0,original_price:0,line_price:0,original_line_price:0,total_discount:0,discounts:[],preview:!0}),{status:200,headers:{"Content-Type":"application/json"}}))):e.call(window,i,s)};return t.__shoplift_intercepted=!0,window.fetch=t,function(){window.fetch===t&&(window.fetch=e)}}function me({data:a,runUpdates:e,debounceMs:t=150}){let i=null;function s(){i&&clearTimeout(i),e(),i=setTimeout(e,t)}let n=null;const r=[],o={childList:!0,subtree:!0,characterData:!0,attributes:!0};function c(u){for(const h of r)h.disconnect();r.length=0;for(const h of Array.from(u.querySelectorAll("*")))if(h.shadowRoot){const b=new MutationObserver(s);b.observe(h.shadowRoot,o),r.push(b)}}function l(){const u=z(a);return u?(n&&n.disconnect(),c(u),n=new MutationObserver(h=>{h.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&c(u),s()}),n.observe(u,o),!0):!1}const d=document.body||document.documentElement,p=new MutationObserver(()=>{l()&&s()});return p.observe(d,{childList:!0,subtree:!0}),l()&&s(),e(),function(){i&&(clearTimeout(i),i=null),p.disconnect(),n&&(n.disconnect(),n=null);for(const h of r)h.disconnect();r.length=0}}async function et(a){if(a.subscriptionPriceDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=t?.subscriptionData?null:a.findActiveSubscriptionTestControl(),s=t?.subscriptionData?t:i?.hypothesis;if(!s?.subscriptionData)return;const n=t?.subscriptionData?e.testId:i.testId;a.subscriptionPriceDone=!0;const r=s.subscriptionData,o=s.isControl,c=s.priceData,l=r.widget.widgetType;let d=G(c),p=Y(r,d),u=p.discountMap,h=p.maxDiscount;function b(){const m=G(c);m!==d&&(d=m,p=Y(r,d),u=p.discountMap,h=p.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${h}`))}a.log(`[SUB-PRICE] side=${o?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${h}`),a.updatePriceTestHiddenInputs(n,o?"control":"variant",!1);function k(){if(!c)return null;const m=J(c),I=X(m),A=fe(r,I,d);if(!ge(A,o))return null;const E=I?m.get(I):void 0;return E?{formattedVariantPrice:K(E.priceInCents,c),formattedDiscounted:K(E.priceInCents*(1-h/100),c)}:null}Xe({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const m=z(r);if(!m)return null;const I=Z(r,m);if(!I)return null;const A=D(r,"subscriptionInput"),E=A.length?A[0].selector:'input[name="rc_plan"]';return I.querySelector(`${E}:checked`)?.value??null}});function C(m){const I=D(r,"subscriptionDiscount");for(const A of I)if(A.selector.includes("badge")||A.selector.includes("__badge")){const E=m.querySelector(A.selector);E?.textContent&&!E.textContent.includes(`${h}%`)&&$(E,x=>U(x,h))}}function P(m){const I=k();if(!I)return;const A=D(r,"subscriptionCompareAt");for(const E of A){const x=m.querySelector(E.selector)||m.querySelector(`[part~="${E.selector}"]`);x?.textContent&&!x.textContent.includes(I.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?I.formattedVariantPrice:R)}}function _(m,I){const A=D(r,"subscriptionCompareAt"),E=I===0?"none":"";for(const x of A){const R=m.querySelector(x.selector)||m.querySelector(`[part~="${x.selector}"]`);R&&(E==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function S(m){const I=D(r,"subscriptionInput"),A=I.length?I[0].selector:'input[name="rc_plan"]',E=D(r,"subscriptionPlanDiscount"),x=E.length?E[0].selector:".rc-plans-button__discount";for(const R of Array.from(m.querySelectorAll("label"))){const V=R.querySelector(A),L=R.querySelector(x);if(V&&L){const O=u[V.value];if(O!==void 0){if(O===0)L.style.display!=="none"&&(L.style.display="none");else if(L.style.display==="none"&&(L.style.display=""),L.textContent){const ee=L.textContent.match(/[\d.]+%/)?.[0];ee&&ee!==`${O}%`&&$(L,ft=>U(ft,O))}}}}}function f(m){const I=m.querySelector("select");if(I)for(const A of Array.from(I.options)){const E=u[A.value];if(E!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${E}%`&&(A.textContent=U(A.textContent,E))}}}function y(m,I){const E=D(r,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of E){const R=m.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const L=V;if(I===0)L.style.display!=="none"&&(L.style.display="none");else{L.style.display==="none"&&(L.style.display="");const O=V.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${I}%`&&$(V,ee=>U(ee,I))}}}}}let w=!1;function T(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(u).length===0)return;const m=z(r);if(!m)return;C(m),c&&P(m);const I=Z(r,m);let A=h;if(I){const E=D(r,"subscriptionInput"),x=E.length?E[0].selector:'input[name="rc_plan"]',R=I.querySelector(`${x}:checked`);if(R){const V=u[R.value];V!==void 0&&(A=V)}l==="buttons"||l==="radio"?S(I):f(I)}_(m,A),y(m,A)}finally{w=!1}}}function g(){const m=k();if(!m)return;const I=z(r);if(!I)return;const A=D(r,"onetimeToggle"),E=A.length?A[0].selector:'input[value="onetime"]';if(!I.querySelector(E)?.checked)return;const R=D(r,"subscriptionPrice");for(const V of R){const L=I.querySelector(V.selector)||I.querySelector(`[part~="${V.selector}"]`);L?.textContent&&!L.textContent.includes(m.formattedDiscounted)&&$(L,O=>/\d/.test(O)?m.formattedDiscounted:O)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),T(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),g()}me({data:r,runUpdates:v})}async function tt(a){if(a.subscriptionOneTimeDone)return;const e=a.getActiveAssignment(),t=e?a.getHypothesis(e.hypothesisId):void 0,i=!!(t?.subscriptionData&&t.priceData),s=i?null:a.findActiveSubscriptionTestControl(),n=i?t:s?.hypothesis;if(!n?.subscriptionData||!n.priceData)return;const r=i?e.testId:s.testId;a.subscriptionOneTimeDone=!0;const o=n.subscriptionData,c=n.priceData,l=J(c),d=n.isControl,p=d?"control":"variant";a.slptValue=`${r}:${p}:f`,a.updatePriceTestHiddenInputs(r,p,!1);function u(){const h=z(o);if(!h)return;const b=X(l);if(!b)return;const k=G(c),C=fe(o,b,k);if(!ge(C,d))return;const P=l.get(b);if(!P)return;const _=q(P.priceInCents,c.moneyFormat,c.currency,c.currencyCodeEnabled),S=D(o,"onetimePrice");if(!S.length)return;const f=D(o,"onetimeContainer"),y=f.length?f[0].selector:'[part~="rc-purchase-option__onetime"]',T=h.querySelector(y)??h;for(const g of S){let v=null;try{v=T.querySelector(g.selector)}catch{v=null}v??=T.querySelector(`[part~="${g.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,m=>/\d/.test(m)?_:m)}}a.subscriptionUpdateOneTime=u,u()}async function it(a,e){const{subscriptionPreviewRender:t}=await Ye(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>ut);return{subscriptionPreviewRender:i}},void 0);return t(a.subscriptionData,a.priceData,a.isControl,e)}function st(a,e){const t=a.widget.selectors.widgetParent??[],i=a.widget.selectors.subscriptionPlans??[],s=a.widget.selectors.subscriptionInput??[];if(!t.length||!i.length||!s.length){e("[SUB-GLOBAL-HIDE] Missing required selectors — skipping");return}const n=t[0].selector,r=i[0].selector,o=s[0].selector;let c=!1,l=null,d=!1;function p(){if(!d){d=!0;try{u()}finally{d=!1}}}function u(){const P=document.querySelector(n);if(!P?.shadowRoot)return;const _=P.shadowRoot.querySelector(r);if(!_?.shadowRoot)return;_.shadowRoot!==l&&(l=_.shadowRoot,c=!1);let S=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const f=Array.from(_.shadowRoot.querySelectorAll(o));for(const g of f)if(a.planIds.includes(g.value)){g.disabled||(g.disabled=!0);const v=g.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",S++)}const y=f.filter(g=>!a.planIds.includes(g.value));if(!y.some(g=>g.checked)&&!c&&y.length>0){c=!0;const g=y[0];g.closest("label")?.click(),g.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${g.value}`)}const T=y.find(g=>g.checked)??y[0];if(T){const g=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of g)v.value!==T.value&&(v.value=T.value,e(`[SUB-GLOBAL-HIDE] Mirrored plan id ${T.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const f=_.shadowRoot.querySelector("select");if(!f)return;for(const T of Array.from(f.options))a.planIds.includes(T.value)&&(T.style.display!=="none"&&(T.style.display="none"),T.disabled||(T.disabled=!0),S++);const y=Array.from(f.options).filter(T=>!a.planIds.includes(T.value)),w=y.some(T=>T.value===f.value);y.length>0&&!w&&!c&&(c=!0,f.value=y[0].value,f.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}S>0&&e(`[SUB-GLOBAL-HIDE] Hidden ${S} B-side plan buttons`)}const h={childList:!0,subtree:!0,characterData:!0};let b=null;function k(P){b?.disconnect(),b=new MutationObserver(()=>p()),b.observe(P,h)}function C(){const P=document.querySelector(n);if(!P?.shadowRoot)return!1;p(),new MutationObserver(()=>{p();const f=P.shadowRoot.querySelector(r);f?.shadowRoot&&k(f.shadowRoot)}).observe(P.shadowRoot,h);const S=P.shadowRoot.querySelector(r);return S?.shadowRoot&&k(S.shadowRoot),!0}if(!C()){e("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const P=new MutationObserver(()=>{C()&&P.disconnect()});P.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ye="Limited preview",nt="Add-to-cart and checkout prices won't reflect this test until it launches — test selling plans are not created in your subscription app until after a test is launched.",rt=5e3;function ot(){const a=document.createElement("div");a.id="shoplift-preview-subscription-warning";const e=document.createElement("span");e.id="shoplift-preview-subscription-warning__icon",e.setAttribute("aria-hidden","true"),e.textContent="!";const t=document.createElement("span");t.id="shoplift-preview-subscription-warning__label",t.textContent=ye;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=nt,a.appendChild(e),a.appendChild(t),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ye);let s=null;function n(){s!==null&&(clearTimeout(s),s=null)}function r(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function o(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function c(){r(),n(),s=setTimeout(()=>{o(),s=null},rt)}function l(){n(),r()}function d(){s===null&&o()}a.addEventListener("mouseenter",l),a.addEventListener("mouseleave",d),a.addEventListener("focus",l),a.addEventListener("blur",d);function p(h){try{const b=h.target;if(!(b instanceof Element))return;(b.closest('form[action*="/cart/add"] button[type="submit"], form[action*="/cart/add"] input[type="submit"]')!==null||b.closest('[name="add"], button[name="add"], [data-add-to-cart], button[data-add-to-cart]')!==null)&&c()}catch{}}document.addEventListener("click",p,!0);function u(){n(),document.removeEventListener("click",p,!0),a.removeEventListener("mouseenter",l),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",l),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:u}}let ve=!1;const se=new Set(["index","collection","product","landing","cart","search","collectionList","blog","article","theme","urlRedirect"]),we=3e4,at=30*6e4,ct=3,be=()=>`exit:${themeId}`,ne=()=>rootPath.replace(/\/+$/,""),lt=/^\/[a-z]{2}(?:-[a-z0-9]+)?(?=\/|$)/i,Se=(a,e)=>a.endsWith(e)||e==="/"&&ne()!==""&&a===ne(),Q="cache=0",re=a=>{const e=a.search.replace(/&$/,"");e.slice(1).split("&").includes(Q)||(a.search=e?`${e}&${Q}`:`?${Q}`)},dt=()=>{const a=window.location.search.slice(1).split("&"),e=a.filter(i=>i!==Q);if(e.length===a.length)return;const t=new URL(window.location.href);t.search=e.length?`?${e.join("&")}`:"";try{history.replaceState(history.state,"",t.href)}catch{}};class pt{DATA_SL_ATTRIBUTE_P="data-sl-attribute-p";DATA_SL_TEST_ID="data-sl-test-id";VIEWPORT_TRACK_THRESHOLD=.5;temporarySessionKey="Shoplift_Session";essentialSessionKey="Shoplift_Essential";analyticsSessionKey="Shoplift_Analytics";priceSelectorsSessionKey="Shoplift_PriceSelectors_v2";shop;host;eventHost;disableReferrerOverride;legacySessionKey;cssHideClass;testConfigs;inactiveTestConfigs;hiddenSubscriptionPlans;testsFilteredByAudience;sendPageView;shopliftDebug;gaConfig;telemetryEnabled;redirectCountersEnabled;anonymousVisitorIdEnabled;aSideHopEnabled;redirectLoopGuardEnabled;getCountryTimeout;klaviyoGateTimeout=1e3;geoViaShopify;resolvedRegion=null;klaviyoMembership=null;state;subscriptionPreviewWarningCleanup=null;shopifyAnalyticsId;cookie=document.cookie;isSyncing=!1;isSyncingGA=!1;fetch;localStorageSet;localStorageGet;sessionStorageSet=window.sessionStorage.setItem.bind(window.sessionStorage);sessionStorageGet=window.sessionStorage.getItem.bind(window.sessionStorage);urlParams=new URLSearchParams(window.location.search);device;logHistory;activeViewportObservers=new Map;clientIdRetryCount=0;consentDeclined=!1;consentAnswered=!1;constructor(e,t,i,s,n,r,o,c,l,d,p,u,h,b=!1,k=!1,C=!1,P=!1,_=!1){this.shop=e,this.host=t,this.eventHost=i,this.disableReferrerOverride=c,dt(),this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=p.map(f=>({...f,startAt:new Date(f.startAt),statusHistory:f.statusHistory.map(y=>({...y,createdAt:new Date(y.createdAt)}))})),this.inactiveTestConfigs=u,this.hiddenSubscriptionPlans=h,this.sendPageView=!!n,this.shopliftDebug=r===!0,this.telemetryEnabled=l===!0,this.geoViaShopify=b===!0,this.redirectCountersEnabled=k===!0,this.anonymousVisitorIdEnabled=C===!0,this.aSideHopEnabled=P===!0,this.redirectLoopGuardEnabled=_===!0||this.aSideHopEnabled,this.gaConfig=o!=={"sendEvents":false,"mode":"gtag"}?o:{sendEvents:!1},this.fetch=window.fetch.bind(window),this.localStorageSet=window.localStorage.setItem.bind(window.localStorage),this.localStorageGet=window.localStorage.getItem.bind(window.localStorage);const S=this.getDeviceType();this.device=S!=="tablet"?S:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=p.filter(f=>f.status=="active"),this.getCountryTimeout=d===1000?1e3:d,window.__slReadCookie=f=>{const y=this.getCookie(f);if(y===null)return null;try{return decodeURIComponent(y)}catch{return y}},this.log("State Loaded",JSON.stringify(this.state))}deriveCategoryFromExistingTests(){if(!this.state.temporary.testCategory&&this.state.essential.visitorTests.length>0){const e=this.state.essential.visitorTests.some(t=>{if(!t.hypothesisId)return!1;const i=this.getHypothesis(t.hypothesisId);return i&&["theme","basicScript","price"].includes(i.type)});this.state.temporary.testCategory=e?"global":"conditional",this.persistTemporaryState(),this.log("Derived test category from existing visitorTests: %s",this.state.temporary.testCategory)}}async init(){try{if(this.log("Shoplift script initializing"),window.Shopify&&window.Shopify.designMode){this.log("Skipping script for design mode");return}if(window.location.href.includes("slScreenshot=true")){this.log("Skipping script for screenshot");return}if(window.location.hostname.endsWith(".edgemesh.com")){this.log("Skipping script for preview");return}if(window.location.href.includes("isShopliftMerchant")){const r=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",r),this.state.temporary.isMerchant=r,this.persistTemporaryState()}if(this.state.temporary.isMerchant){this.log("Setting up preview for merchant"),typeof window.shoplift!="object"&&this.setShopliftStub(),this.state.temporary.previewConfig||this.hidePage(),await this.initPreview(),document.querySelector("#sl-preview-bar-hide")?.remove();return}if(this.state.temporary.previewConfig=void 0,Ee(navigator.userAgent))return;const e=Date.now(),t=!this.state.temporary.lastSeen||e-this.state.temporary.lastSeen>1800*1e3;(!this.state.temporary.entryPage||t)&&(this.state.temporary.entryPage=B(window.location.href)),this.state.temporary.lastSeen=e,this.persistTemporaryState(),window.__slEntryPage=this.state.temporary.entryPage??"";const i=this.state.essential.visitorTests.filter(r=>r.hypothesisId&&+r.createdAt>Date.now()-6e4);if(i.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const r of i)this.sendDiagnosticTelemetry("page-landed",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});if(this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.monitorConsentChange(),this.checkForThemePreview())return;if(!this.disableReferrerOverride&&this.state.temporary.originalReferrer!=null){this.log(`Overriding referrer from '${document.referrer}' to '${this.state.temporary.originalReferrer}'`);const r=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>r,enumerable:!0,configurable:!0})}if(this.needsKlaviyo(this.testConfigs,this.state.essential.visitorTests,this.state.analytics.visitor??this.buildBaseVisitor())&&this.ensureKlaviyoMembership(),await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.countRedirectLandings(),this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const n=this.state.essential.visitorTests.some(r=>(r.hypothesisId?this.getHypothesis(r.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(r=>this.getHypothesis(r.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!n&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),st(this.hiddenSubscriptionPlans,r=>this.log(r))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(e){if(e instanceof j)return;throw e}finally{typeof window.shoplift!="object"&&this.setShopliftStub()}}getVariantColor(e){switch(e){case"a":return{text:"#141414",bg:"#E2E2E2"};case"b":return{text:"rgba(255, 255, 255, 1)",bg:"rgba(37, 99, 235, 1)"}}}getDefaultVariantTitle(e){return e.title?e.title:e.type==="price"?e.isControl?"Original prices":"Variant prices":e.isControl?"Original":"Untitled variant "+e.label.toUpperCase()}async initPreview(){const e=this.urlParams.get("previewConfig");if(e){this.state.temporary.previewConfig=void 0,this.log("Setting up the preview"),this.log("Found preview config, writing to temporary state");const t=await Fe(e);if(this.state.temporary.previewConfig=t,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let n=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(n+=`?productId=${s.shopifyProductId}`);const r=await this.makeJsonRequest({method:"get",url:n}).catch(o=>(this.log("Error getting domSelectors",o),null));if(s.variants.forEach(o=>o.domSelectors=r[o.id]?.domSelectors),s.isDraft){const o=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,c=await this.makeJsonRequest({method:"get",url:o}).catch(l=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",l),null));c?.subscriptionData&&s.variants.forEach(l=>{l.subscriptionData=c.subscriptionData,l.priceData=c.priceData})}}this.persistTemporaryState();const i=new URL(window.location.toString());i.searchParams.delete("previewConfig"),this.queueRedirect(i)}else if(this.state.temporary.previewConfig){this.showPage();const t=this.state.temporary.previewConfig;if(t.testTypeCategory===M.Template&&this.handleTemplatePreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.UrlRedirect&&this.handleUrlPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Script&&this.handleScriptPreview(t)&&this.initPreviewControls(t),t.testTypeCategory===M.Price){const i=await this.handlePricePreview(t);t.isDraft?await this.handleSubscriptionPricePreview(t):await this.handleSubscriptionLivePreview(t),i&&this.initPreviewControls(t)}}}initPreviewControls(e){document.addEventListener("DOMContentLoaded",()=>{const t=e.variants.find(b=>b.id===e.currentVariant),i=t?.label||"a",s=e.variants,n=document.createElement("div");n.id="shoplift-preview-control";const r=document.createElement("div"),o=document.createElement("img");o.src=Ne,o.height=24,o.width=14,r.style.padding="0 16px",r.style.lineHeight="100%",r.appendChild(o),n.appendChild(r);const c=document.createElement("div");c.id="shoplift-preview-variant-selector";const l=document.createElement("button");l.id="shoplift-preview-variant-menu-trigger";const d=document.createElement("div");d.className="menu-variant-label",d.style.backgroundColor=this.getVariantColor(i).bg,d.style.color=this.getVariantColor(i).text,d.innerText=i.toUpperCase(),l.appendChild(d);const p=document.createElement("span");if(p.id="shoplift-preview-variant-title",p.innerText=t?this.getDefaultVariantTitle(t):"Untitled variant "+i.toUpperCase(),l.appendChild(p),s.length>1){const b=document.createElement("img");b.src=Ue,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",l.appendChild(b);const k=document.createElement("div");k.className="preview-variant-menu";for(const C of e.variants.filter(P=>P.id!==e.currentVariant)){const P=document.createElement("div");P.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(C.label).bg,_.style.color=this.getVariantColor(C.label).text,_.style.flexShrink="0",_.innerText=C.label.toUpperCase(),P.appendChild(_);const S=document.createElement("span");S.innerText=this.getDefaultVariantTitle(C),P.appendChild(S),P.addEventListener("click",()=>{this.pickVariant(C.id)}),k.appendChild(P)}c.appendChild(k),l.addEventListener("click",()=>{k.className!=="preview-variant-menu preview-variant-menu__visible"?k.classList.add("preview-variant-menu__visible"):k.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",C=>{C.target instanceof Element&&!l.contains(C.target)&&k.className==="preview-variant-menu preview-variant-menu__visible"&&k.classList.remove("preview-variant-menu__visible")})}else l.style.pointerEvents="none",d.style.margin="0";if(c.appendChild(l),n.appendChild(c),e.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=ot();n.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const u=document.createElement("div"),h=document.createElement("button");h.id="shoplift-exit-preview-button",h.innerText="Exit",u.appendChild(h),h.addEventListener("click",()=>{this.exitPreview()}),n.appendChild(u),document.body.appendChild(n),requestAnimationFrame(()=>{n.classList.add("visible")})}),this.ensureCartAttributesForExistingPriceTests(!0)}pickVariant(e){if(this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig,i=new URL(window.location.toString());if(t.testTypeCategory===M.UrlRedirect){const s=t.variants.find(n=>n.id===t.currentVariant)?.redirectUrl;if(i.pathname===s){const n=t.variants.find(r=>r.id===e)?.redirectUrl;n&&(i.pathname=n)}}if(t.testTypeCategory===M.Template){const s=t.variants.find(n=>n.id===t.currentVariant)?.pathName;if(s&&i.pathname===s){const n=t.variants.find(r=>r.id===e)?.pathName;n&&n!==s&&(i.pathname=n)}}t.currentVariant=e,this.persistTemporaryState(),this.queueRedirect(i)}}exitPreview(){const e=new URL(window.location.toString());if(this.state.temporary.previewConfig?.testTypeCategory===M.Template&&e.searchParams.delete("view"),this.state.temporary.previewConfig?.testTypeCategory===M.Script&&e.searchParams.delete("slVariant"),this.state.temporary.previewConfig?.testTypeCategory===M.UrlRedirect){const i=this.state.temporary.previewConfig.variants.filter(n=>!n.isControl&&n.redirectUrl!==null).map(n=>n.redirectUrl),s=this.state.temporary.previewConfig.variants.find(n=>n.label==="a")?.redirectUrl;i.includes(e.pathname)&&s&&(e.pathname=s)}this.state.temporary.isMerchant=!1,e.searchParams.delete("isShopliftMerchant"),this.state.temporary.previewConfig=void 0,this.persistTemporaryState(),this.subscriptionPreviewWarningCleanup?.(),this.subscriptionPreviewWarningCleanup=null,this.hidePage(),this.queueRedirect(e)}handleTemplatePreview(e){const t=e.currentVariant,i=e.variants.find(c=>c.id===t);if(!i)return!1;const s=e.variants.find(c=>c.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);const n=new URL(window.location.toString()),r=n.searchParams.get("view"),o=i.type===s.type;return!o&&!i.isControl&&template.suffix===s.affix&&this.typeFromTemplate()===s.type&&i.pathName!==null?(this.log("Hit control template type, redirecting to the variant url"),this.hidePage(),n.pathname=i.pathName,this.queueRedirect(n),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&o&&r!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),n.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),n.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(n)),r!==null&&r!==(i.affix||"__DEFAULT__")&&(n.searchParams.delete("view"),this.hidePage(),this.queueRedirect(n)),!0)}handleUrlPreview(e){const t=e.currentVariant,i=e.variants.find(r=>r.id===t),s=e.variants.find(r=>r.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const n=new URL(window.location.toString());return n.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),n.pathname=i.redirectUrl,this.queueRedirect(n)),!0}handleScriptPreview(e){const t=e.currentVariant,i=e.variants.find(r=>r.id===t);if(!i)return!1;this.log("Setting up script preview");const s=new URL(window.location.toString());return s.searchParams.get("slVariant")!==i.id&&(this.log("current id doesn't match the variant, redirecting"),s.searchParams.delete("slVariant"),this.log("Setting the new slVariantParam"),this.hidePage(),s.searchParams.set("slVariant",i.id),this.queueRedirect(s)),!0}async handlePricePreview(e){const t=e.currentVariant,i=e.variants.find(s=>s.id===t);return i?(this.log("Setting up price preview"),i.domSelectors&&i.domSelectors.length>0&&(N(document,{testId:e.testId,hypothesisId:i.id,selectors:i.domSelectors}),this.ensureCartAttributesForExistingPriceTests(!0)),!0):!1}async handleSubscriptionPricePreview(e){const t=e.variants.find(i=>i.id===e.currentVariant);t?.subscriptionData&&(this.log("Setting up subscription price preview"),await it({id:t.id,isControl:t.isControl,subscriptionData:t.subscriptionData,priceData:t.priceData},(i,...s)=>this.log(i,...s)))}async handleSubscriptionLivePreview(e){this.testConfigs.find(s=>s.id===e.testId)?.hypotheses.find(s=>s.id===e.currentVariant)?.subscriptionData&&(this.log("Setting up subscription live preview"),this.subscriptionSwapDone=!1,this.subscriptionOneTimeDone=!1,this.subscriptionPriceDone=!1,await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange())}async finalize(){const e=await this.getCartState();e!==null&&this.queueCartUpdate(e),this.pruneStateAndSave(),await this.syncAllEvents()}setShoplift(){this.log("Setting up public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:async s=>{if(this.log("Script checking variant for hypothesis '%s'",s),t)return this.log("Forcing variant for hypothesis '%s'",s),!0;if(i!==null)return this.log("Forcing hypothesis '%s'",i),s===i;const n=this.testConfigs.find(o=>o.hypotheses.some(c=>c.id===s));if(!n)return this.log("No test found for hypothesis '%s'",s),!1;const r=this.state.essential.visitorTests.find(o=>o.testId===n.id);return r?(this.log("Active visitor test found",s),r.hypothesisId===s):(await this.manuallySplitVisitor(n),this.testConfigs.some(o=>o.hypotheses.some(c=>c.id===s&&this.state.essential.visitorTests.some(l=>l.hypothesisId===c.id))))},setAnalyticsConsent:async s=>{await this.onConsentChange(s,!0)},getVisitorData:()=>({visitor:this.state.analytics.visitor,visitorTests:this.state.essential.visitorTests.filter(s=>!s.isInvalid).map(s=>{const{shouldSendToGa:n,savedAt:r,redirectCount:o,anonAssigned:c,hop:l,hopNonce:d,hopThemeId:p,...u}=s;return u})})}}setShopliftStub(){this.log("Setting up stubbed public API");const t=this.urlParams.get("slVariant")==="true",i=t?null:this.urlParams.get("slVariant");window.shoplift={isHypothesisActive:s=>Promise.resolve(t||s===i),setAnalyticsConsent:()=>Promise.resolve(),getVisitorData:()=>({visitor:null,visitorTests:[]})}}async manuallySplitVisitor(e){this.log("Starting manual split for test '%s'",e.id),await this.handleVisitorTest([e])||this.showPage();const i=this.getReservationForTest(e.id);i&&!i.isRealized&&i.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",e.id),this.realizeReservationForCriteria(i.entryCriteriaKey)),this.saveState(),this.syncAllEvents()}async handleVisitorTest(e){await this.filterTestsByAudience(this.testConfigs,this.state.analytics.visitor??this.buildBaseVisitor(),this.state.essential.visitorTests),this.pruneStaleVisitorTests(),this.deriveCategoryFromExistingTests(),this.clearStaleReservations();let t=e?e.filter(i=>this.testsFilteredByAudience.some(s=>s.id===i.id)):[...this.testsForUrl(this.testsFilteredByAudience),...this.domTestsForUrl(this.testsFilteredByAudience)];try{if(t.length===0)return this.log("No tests found"),!1;this.log("Checking for existing visitor test on page");const i=this.getCurrentVisitorHypothesis(t);if(i){this.log("Found current visitor test");const c=this.considerRedirect(i);return c&&(this.log("Redirecting for current visitor test"),this.redirect(i)),c}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const c=this.getHypothesis(s.hypothesisId);if(c){c.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const l=this.considerRedirect(c);return l&&this.redirect(c),l}}this.log("No active test relation for test page");const n=this.testsForUrl(this.inactiveTestConfigs.filter(c=>this.testIsPaused(c)&&c.hypotheses.some(l=>this.state.essential.visitorTests.some(d=>d.hypothesisId===l.id)))).map(c=>c.id);if(n.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",n),!1;if(!this.state.temporary.testCategory){const c=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),l=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),c.length>0&&l.length>0){const d=c.length,p=l.length,u=d+p,h=Math.random()*u;this.state.temporary.testCategory=h<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",h,u,d,p,this.state.temporary.testCategory)}else c.length>0?(this.state.temporary.testCategory="global",this.log("Only global tests available, setting category to global")):(this.state.temporary.testCategory="conditional",this.log("Only conditional tests available, setting category to conditional"));this.persistTemporaryState()}const r=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",r),r==="global"){const c=this.testsFilteredByAudience.filter(l=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(l)));for(const l of c)this.markTestAsBlocked(l,"category:global");t=t.filter(l=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(l)))}else{const c=this.testsFilteredByAudience.filter(l=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(l)));for(const l of c)this.markTestAsBlocked(l,"category:conditional");t=t.filter(l=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(l)))}if(t.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(t);const o=this.getReservationForCurrentPage();if(o&&!o.isRealized){const c=this.getHypothesis(o.hypothesisId);if(c){c.type!=="price"&&this.realizeReservationForCriteria(o.entryCriteriaKey);const l=this.considerRedirect(c);return l&&(this.log("Redirecting for new test"),this.redirect(c)),l}}return!1}finally{this.includeInDomTests(),this.saveState()}}includeInDomTests(){this.applyControlForAudienceFilteredPriceTests();const e=this.getDomTestsForCurrentUrl(),t=this.getVisitorDomHypothesis(e);for(const i of e){this.log("Evaluating dom test '%s'",i.id);const s=i.hypotheses.some(h=>h.type==="price");if(this.state.essential.visitorTests.find(h=>h.testId===i.id&&h.isInvalid&&!h.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const h=i.hypotheses.find(b=>b.isControl);h?.priceData&&(this.applyPriceTestWithMapLookup(i.id,h,[h],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const r=this.getReservationForTest(i.id);let o=null,c=!1;const l=t.find(h=>i.hypotheses.some(b=>h.id===b.id));if(r)o=this.getHypothesis(r.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",r.hypothesisId,i.id);else if(l)o=l,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const h=this.visitorActiveTestTypeWithReservations();h?(c=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",h,i.id)):o=this.pickHypothesis(i)}else o=this.pickHypothesis(i);if(c&&s){const h=i.hypotheses.find(b=>b.isControl);h?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,h,[h],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!o){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const d=i.bayesianRevision??4,p=o.type==="price",u=d>=5;if(p&&u){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!o.priceData){this.log("No price data for hypothesis '%s', skipping",o.id);continue}const h=o.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${h} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,o,i.hypotheses,b=>{const k=this.getReservationForTest(b);k&&!k.isRealized&&k.entryCriteriaKey?this.realizeReservationForCriteria(k.entryCriteriaKey):this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(p&&!u){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const h=this.getDomSelectorsForHypothesis(o);if(h.length===0)continue;N(document,{testId:i.id,hypothesisId:o.id,selectors:h},b=>{this.queueAddVisitorToTest(b,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!o.domSelectors||o.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}N(document,{testId:i.id,hypothesisId:o.id,selectors:o.domSelectors},h=>{this.queueAddVisitorToTest(h,o),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()})}}considerRedirect(e){if(this.log("Considering redirect for hypothesis '%s'",e.id),e.isControl)return this.considerControlHop(e);if(e.type==="basicScript"||e.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const t=this.state.essential.visitorTests.find(r=>r.hypothesisId===e.id),i=new URL(window.location.toString()),n=new URLSearchParams(window.location.search).get("view");if(e.type==="theme"){if(!(e.themeId===themeId)){if(this.log("Theme id '%s' is not hypothesis theme ID '%s'",e.themeId,themeId),this.isAppProxyPath())return this.log("On App Proxy path, skipping theme redirect to avoid infinite loop"),!1;const o=t&&t.themeId!==e.themeId&&(t.themeId===themeId||!this.isThemePreview());return!o&&this.isThemePreview()?(this.log("On non-test theme, skipping redirect"),!1):this.allowRedirect(e.id)?(o&&(this.log("On old theme, redirecting and updating local visitor"),t.themeId=e.themeId),this.log("Hiding page to redirect for theme test"),this.hidePage(),!0):!1}return!1}else if(e.type!=="dom"&&e.type!=="price"&&e.affix!==template.suffix&&e.affix!==n||e.redirectPath&&!Se(i.pathname,e.redirectPath))return this.allowRedirect(e.id)?(this.log("Hiding page to redirect for template test"),this.hidePage(),!0):!1;return this.log("Not redirecting"),!1}allowRedirect(e){if(!this.redirectLoopGuardEnabled)return!0;const t=Date.now(),i=this.liveRedirectRecords(t),s=i.find(c=>c.key===e),n=this.arrivedVia(i,t),r=s?.stoppedUntil!==void 0?"stopped":this.redirectLoop(e,n);if(!r)return!0;const o=s??{key:e,nonce:"",at:t};return o.stoppedUntil??=t+at,r==="chain"&&n&&(n.stoppedUntil??=o.stoppedUntil),this.state.essential.redirectGuard=s?i:[...i,o],this.log("Redirect for '%s' loops (%s), not redirecting until %s",e,r,new Date(o.stoppedUntil)),r!=="stopped"&&this.sendRedirectStop(e,r),this.persistEssentialState(),!1}redirectLoop(e,t){if(t?.key===e)return"bounce";if(t&&(t.hops??0)+1>=ct)return"chain"}sendRedirectStop(e,t){const i=e.startsWith("exit:")?"preview-exit":this.state.essential.visitorTests.find(s=>s.hypothesisId===e)?.testId;i&&this.sendRedirectCount("stopped",i,e,t)}arrivedVia(e,t){return e.find(i=>i.nonce&&t-i.at<we&&window.location.hash===`#slr-${i.nonce}`)}recordRedirect(e,t){if(!this.redirectLoopGuardEnabled)return;const i=Date.now(),s=this.liveRedirectRecords(i),n=this.arrivedVia(s,i),r=n?(n.hops??0)+1:0;this.state.essential.redirectGuard=[...s.filter(o=>o.key!==e),{key:e,nonce:t,at:i,...r?{hops:r}:{}}]}liveRedirectRecords(e){return(this.state.essential.redirectGuard??[]).filter(t=>(t.stoppedUntil??t.at+we)>e)}redirect(e){if(this.log("Redirecting to hypothesis '%s'",e.id),e.isControl){this.hopControl(e);return}const t=new URL(window.location.toString());if(t.searchParams.delete("view"),e.redirectPath){const o=lt.test(e.redirectPath)?"":ne();t.pathname=`${o}${e.redirectPath}`}else e.type==="theme"?this.previewTheme(t,e.themeId):e.type!=="urlRedirect"&&t.searchParams.set("view",e.affix);const i=this.state.essential.visitorTests.find(o=>o.hypothesisId===e.id)?.testId,s=t.pathname+t.search,n=window.location.pathname+window.location.search,r=B(t.hash);if(i&&s!==n&&!r){const o=this.markRedirectLanding(t,i);this.recordRedirect(e.id,o)}s!==n&&re(t),s===n&&this.showPage(),this.queueRedirect(t)}considerControlHop(e){if(!this.aSideHopEnabled)return!1;const t=this.state.essential.visitorTests.find(i=>i.hypothesisId===e.id);return!t?.hop||(this.settleControlHop(t),t.hop!=="pending"&&t.hop!=="hopping")||B(window.location.hash)||e.type==="theme"&&(e.themeId!==themeId||this.isThemePreview()||this.isAppProxyPath())||(this.saveState(),!this.assignmentPersists(e.id))||!this.allowRedirect(e.id)?!1:(this.hidePage(),!0)}hopControl(e){const t=this.state.essential.visitorTests.find(n=>n.hypothesisId===e.id);if(t?.hop!=="pending"&&t?.hop!=="hopping")return;const i=new URL(window.location.toString());e.type==="theme"&&(this.previewTheme(i,e.themeId),t.hopThemeId=e.themeId);const s=i.pathname+i.search===window.location.pathname+window.location.search;if(s){const n=i.href.split("#")[0];i.href=/[?&]$/.test(n)?n.slice(0,-1):n+(n.includes("?")?"&":"?")}t.hopNonce=this.markRedirectLanding(i,t.testId,s),this.recordRedirect(e.id,t.hopNonce),re(i),t.hop=t.hop==="pending"?"hopping":"retried",this.queueRedirect(i,s)}assignmentPersists(e){return[this.localStorageGet(this.essentialSessionKey),this.getCookie(this.essentialSessionKey,document.cookie)].some(t=>t?.includes(e)===!0)}settleControlHop(e){(e.hop==="hopping"||e.hop==="retried")&&e.hopNonce&&window.location.hash.endsWith(`slr-${e.hopNonce}`)&&(e.hop="hopped")}previewTheme(e,t){e.searchParams.set("_ab","0"),e.searchParams.set("_fd","0"),e.searchParams.set("_sc","1"),e.searchParams.set("preview_theme_id",t.toString())}markRedirectLanding(e,t,i=!1){const s=he(),n=Ke({v:2,t,n:s,fh:Ge(window.location.pathname+window.location.search),...i?{s:1}:{}});e.hash=`slr-${s}`;const r=new Date(Date.now()+3e4).toUTCString();return document.cookie=`shoplift_redirect=${n};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${r}`,s}async refreshVisitor(e){if(e===null||!this.state.essential.isFirstLoad||!this.testConfigs.some(i=>i.visitorOption!=="all"))return;this.log("Refreshing visitor"),this.hidePage();const t=await this.getVisitor(e);t&&t.id&&this.updateLocalVisitor(t)}buildBaseVisitor(){return{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.device,country:null,...this.state.essential.initialState}}getInitialState(){const e=this.getUTMValue("utm_source")??"",t=this.getUTMValue("utm_medium")??"",i=this.getUTMValue("utm_campaign")??"",s=this.getUTMValue("utm_content")??"",n=window.document.referrer,r=this.device;return{createdAt:new Date,utmSource:e,utmMedium:t,utmCampaign:i,utmContent:s,referrer:n,device:r}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(e=>e.hopThemeId===themeId&&e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)?.themeId!==themeId)&&!this.state.essential.visitorTests.some(e=>e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)?.themeId===themeId)?(this.log("In control's hop preview of a theme the test has moved off, redirecting to main theme"),this.leavePreview()):this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("On active theme test, removing theme bar"),this.clearThemeBar(),!1):this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&!this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("Visitor is on an inactive theme test, redirecting to main theme"),this.leavePreview()):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.leavePreview()):this.inactiveTestConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Current theme is an inactive theme test, redirecting to main theme"),this.leavePreview()):this.testConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(),!1):(this.log("No tests on current theme, skipping script"),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),!1)}leavePreview(){return this.allowRedirect(be())?this.redirectToMainTheme():this.clearThemeBar(),!0}redirectToMainTheme(){this.hidePage();const e=new URL(window.location.toString());e.searchParams.set("preview_theme_id","");const t=e.pathname+e.search!==window.location.pathname+window.location.search;if(this.redirectLoopGuardEnabled&&t&&!B(e.hash)){const i=he();e.hash=`slr-${i}`,this.recordRedirect(be(),i)}t&&re(e),this.queueRedirect(e)}testsForUrl(e){const t=new URL(window.location.href),i=this.typeFromTemplate();return e.filter(s=>s.hypotheses.some(n=>n.type!=="dom"&&n.type!=="price"&&(n.isControl&&n.type===i&&n.affix===template.suffix||n.type==="theme"||n.isControl&&n.type==="urlRedirect"&&n.redirectPath&&t.pathname.endsWith(n.redirectPath)||n.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!t.searchParams.has("view")||s.hypotheses.map(n=>n.affix).includes(t.searchParams.get("view")??"")))}domTestsForUrl(e){const t=new URL(window.location.href);return e.filter(i=>i.hypotheses.some(s=>s.type!=="dom"&&s.type!=="price"?!1:s.type==="price"&&s.priceData&&s.priceData.variants.length>0?!0:s.domSelectors&&s.domSelectors.some(n=>new RegExp(ae(n)).test(B(t.toString())))))}needsKlaviyo(e,t,i){return e.some(s=>s.requiresKlaviyo&&!t.some(n=>n.testId===s.id)&&this.matchesTestSettings(s,i,this.visitorCreatedDuringTestActive(s.statusHistory)))}getKlaviyoIdentity(){const e=ie(Je(this.getCookie("__kla_id",document.cookie)));return{kx:ie(this.urlParams.get("_kx"))??(e?null:ie(new URL(this.state.temporary.entryPage??"",window.location.href).searchParams.get("_kx"))),exchangeId:e}}ensureKlaviyoMembership(){return this.klaviyoMembership??=this.resolveKlaviyoMembership().catch(e=>(this.log("Error resolving Klaviyo membership",e),{groups:[],known:!1})),this.klaviyoMembership}async resolveKlaviyoMembership(){const{kx:e,exchangeId:t}=this.getKlaviyoIdentity();if(!(e??t))return{groups:[],known:!1};this.log("Hiding page to resolve Klaviyo membership"),this.hidePage();const s=new URLSearchParams;e&&s.append("kx",e),t&&s.append("exchangeId",t);let n={groups:[],known:!1};try{const r=await this.makeJsonRequest({method:"get",url:`${this.host}/api/v1/storefront/klaviyo-groups/${encodeURIComponent(this.shop)}?${s}`,signal:AbortSignal.timeout(this.klaviyoGateTimeout)});n={groups:r?.groups??[],known:r?.known===!0}}catch(r){if(r instanceof j)return r;this.log("Error getting Klaviyo groups",r)}return n}async filterTestsByAudience(e,t,i){const s=[],n=e.some(c=>(c.requiresRegion||this.geoViaShopify&&c.requiresCountry)&&!i.some(l=>l.testId===c.id));this.resolvedRegion===null&&n&&(this.log("Hiding page to wait for Shopify region resolution"),this.hidePage(),await this.waitForResolvedRegion()),window.__slRegion=this.resolvedRegion??"";let r=t.country;this.geoViaShopify?r=this.resolvedRegion?this.resolvedRegion.slice(0,2):null:!r&&e.some(c=>c.requiresCountry&&!i.some(l=>l.testId===c.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),r=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(c=>(this.log("Error getting country",c),null)));let o={groups:[],known:!1};if(this.needsKlaviyo(e,i,t)){const c=await this.ensureKlaviyoMembership();if(c instanceof j)throw c;o=c}window.__slKlaviyoGroups=o.groups,window.__slKlaviyoKnown=o.known;for(const c of e){if(this.log("Checking audience for test '%s'",c.id),this.state.essential.visitorTests.some(p=>p.testId===c.id&&p.hypothesisId==null)){console.log(`Skipping blocked test '${c.id}'`);continue}const l=this.visitorCreatedDuringTestActive(c.statusHistory);(i.some(p=>p.testId===c.id&&(c.device==="all"||c.device===t.device&&c.device===this.device))||this.isTargetAudience(c,t,l,r))&&(this.log("Visitor is in audience for test '%s'",c.id),s.push(c))}this.testsFilteredByAudience=s}async waitForResolvedRegion(e=1500,t=50){const i=Date.now();for(;this.resolvedRegion===null&&Date.now()-i<e;)await new Promise(s=>window.setTimeout(s,t))}isTargetAudience(e,t,i,s){const n=this.getChannel(t);return this.matchesTestSettings(e,t,i)&&(e.targetAudiences.length===0||e.targetAudiences.reduce((r,o)=>r||o.reduce((c,l)=>c&&l(t,i,n,s),!0),!1))}matchesTestSettings(e,t,i){return(e.device==="all"||e.device===t.device&&e.device===this.device)&&(e.visitorOption==="all"||e.visitorOption==="new"&&i||e.visitorOption==="returning"&&!i)}visitorCreatedDuringTestActive(e){let t="";for(const i of e){if(this.state.analytics.visitor!==null&&this.state.analytics.visitor.createdAt<i.createdAt||this.state.essential.initialState.createdAt<i.createdAt)break;t=i.status}return t==="active"}getDomTestsForCurrentUrl(){return this.domTestsForUrl(this.testsFilteredByAudience)}getCurrentVisitorHypothesis(e){return e.flatMap(t=>t.hypotheses).find(t=>t.type!=="dom"&&t.type!=="price"&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getVisitorDomHypothesis(e){return e.flatMap(t=>t.hypotheses).filter(t=>(t.type==="dom"||t.type==="price")&&this.state.essential.visitorTests.some(i=>i.hypothesisId===t.id))}getHypothesis(e){return this.testConfigs.filter(t=>t.hypotheses.some(i=>i.id===e)).map(t=>t.hypotheses.find(i=>i.id===e))[0]}getActiveAssignment(){if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;return t.currentVariant&&t.testId?{testId:t.testId,hypothesisId:t.currentVariant}:null}const e=this.state.essential.visitorTests.find(t=>t.hypothesisId);return e?.hypothesisId?{testId:e.testId,hypothesisId:e.hypothesisId}:null}findActiveSubscriptionTestControl(){for(const e of this.testConfigs){const t=e.hypotheses.find(i=>i.isControl);if(t?.subscriptionData)return{testId:e.id,hypothesis:t}}return null}getDomSelectorsForHypothesis(e){if(!e)return[];if(e.domSelectors&&e.domSelectors.length>0)return e.domSelectors;if(e.priceData){const t=`${this.priceSelectorsSessionKey}_${e.id}`;try{const s=sessionStorage.getItem(t);if(s){const n=JSON.parse(s);return e.domSelectors=n,this.log("Loaded %d price selectors from cache for hypothesis '%s'",n.length,e.id),n}}catch{}const i=We(e.priceData);e.domSelectors=i;try{sessionStorage.setItem(t,JSON.stringify(i)),this.log("Generated and cached %d price selectors for hypothesis '%s'",i.length,e.id)}catch{this.log("Generated %d price selectors for hypothesis '%s' (cache unavailable)",i.length,e.id)}return i}return[]}hasThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type==="theme"))}hasTestThatIsNotThemeTest(e){return e.some(t=>t.hypotheses.some(i=>i.type!=="theme"&&i.type!=="dom"&&i.type!=="price"))}hasThemeAndOtherTestTypes(e){return this.hasThemeTest(e)&&this.hasTestThatIsNotThemeTest(e)}testIsPaused(e){return e.status==="paused"||e.status==="incompatible"||e.status==="suspended"}visitorActiveTestType(){const e=this.state.essential.visitorTests.filter(t=>this.testConfigs.some(i=>i.hypotheses.some(s=>s.id==t.hypothesisId)));return e.length===0?null:e.some(t=>t.isThemeTest)?"theme":"templateOrUrlRedirect"}getReservationType(e){return e==="price"||this.isTemplateTestType(e)?"deferred":"immediate"}isTemplateTestType(e){return["product","collection","landing","index","cart","search","blog","article","collectionList"].includes(e)}getEntryCriteriaKey(e){const t=e.hypotheses.find(i=>i.isControl);if(!t)return`unknown:${e.id}`;switch(t.type){case"theme":return"global:theme";case"basicScript":return"global:autoApi";case"price":return"global:price";case"manualScript":return`conditional:manualApi:${e.id}`;case"urlRedirect":return`conditional:url:${t.redirectPath||"unknown"}`;default:return`conditional:template:${t.type}`}}isGlobalEntryCriteria(e){return e.startsWith("global:")}groupTestsByEntryCriteria(e){const t=new Map;for(const i of e){const s=this.getEntryCriteriaKey(i),n=t.get(s)||[];n.push(i),t.set(s,n)}return t}doesCurrentPageMatchEntryCriteria(e){if(this.isGlobalEntryCriteria(e))return!0;if(e==="conditional:manualApi")return!1;if(e.startsWith("conditional:url:")){const t=e.replace("conditional:url:","");return window.location.pathname.endsWith(t)}if(e.startsWith("conditional:template:")){const t=e.replace("conditional:template:","");return this.typeFromTemplate()===t}return!1}hasActiveReservation(){const e=this.getActiveReservations();return Object.values(e).some(t=>!t.isRealized)}getActiveReservation(){const e=this.getActiveReservations();return Object.values(e).find(t=>!t.isRealized)??null}clearStaleReservations(){const e=this.state.temporary.testReservations;if(!e)return;let t=!1;for(const[i,s]of Object.entries(e)){const n=this.testConfigs.find(o=>o.id===s.testId);if(!n){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0;continue}if(n.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,n.status,i),delete e[i],t=!0;continue}this.testsFilteredByAudience.some(o=>o.id===s.testId)||(this.log("Visitor no longer passes audience for test '%s', clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0)}t&&this.persistTemporaryState()}createReservations(e){if(this.state.temporary.testReservations||(this.state.temporary.testReservations={}),this.state.temporary.rolledEntryCriteria||(this.state.temporary.rolledEntryCriteria=[]),this.state.temporary.testCategory==="global"){this.createSingleReservation(e,"global");return}const i=e.filter(o=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o))),s=e.filter(o=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(o)));this.log("Conditional tests split - matching current page: %d, not matching: %d",i.length,s.length),i.length>0&&this.log("Tests matching current page (same pool): %o",i.map(o=>({id:o.id,title:o.title,criteria:this.getEntryCriteriaKey(o)})));const n=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(n)){this.createSingleReservation(i,n);for(const o of i){const c=this.getEntryCriteriaKey(o);this.state.temporary.rolledEntryCriteria.includes(c)||this.state.temporary.rolledEntryCriteria.push(c)}}const r=this.groupTestsByEntryCriteria(s);for(const[o,c]of r){if(this.state.temporary.rolledEntryCriteria.includes(o)){this.log("Already rolled for criteria '%s', skipping",o);continue}if(c.some(C=>this.state.essential.visitorTests.some(P=>P.testId===C.id))){this.log("Visitor already has VT for criteria '%s', skipping",o),this.state.temporary.rolledEntryCriteria.push(o);continue}const d=[...c].sort((C,P)=>C.id.localeCompare(P.id));this.log("Test dice roll for criteria '%s' - available tests: %o",o,d.map(C=>({id:C.id,title:C.title})));const p=Math.floor(Math.random()*d.length),u=d[p];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",p+1,c.length,u.id,u.title);const h=this.pickHypothesis(u);if(!h){this.log("No hypothesis picked for test '%s'",u.id);continue}this.sendDiagnosticTelemetry("assignment",u.id,{hypothesisId:h.id,isControl:h.isControl,testType:h.type});const b=this.getReservationType(h.type),k={testId:u.id,hypothesisId:h.id,testType:h.type,reservationType:b,isThemeTest:h.type==="theme",themeId:h.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:o};this.state.temporary.testReservations[o]=k,this.state.temporary.rolledEntryCriteria.push(o),this.log("Created %s reservation for test '%s' (criteria: %s)",b,u.id,o);for(const C of c)C.id!==u.id&&this.markTestAsBlocked(C,o)}this.persistTemporaryState()}createSingleReservation(e,t){if(this.state.temporary.rolledEntryCriteria.includes(t)){this.log("Already rolled for pool '%s', skipping",t);return}if(e.some(p=>this.state.essential.visitorTests.some(u=>u.testId===p.id&&!u.isInvalid))){this.log("Visitor already has VT for pool '%s', skipping",t),this.state.temporary.rolledEntryCriteria.push(t);return}if(e.length===0){this.log("No tests in pool '%s'",t);return}const s=[...e].sort((p,u)=>p.id.localeCompare(u.id));this.log("Test dice roll for pool '%s' - available tests: %o",t,s.map(p=>({id:p.id,title:p.title,criteria:this.getEntryCriteriaKey(p)})));const n=Math.floor(Math.random()*s.length),r=s[n];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",n,e.length,r.id,r.title);const o=this.pickHypothesis(r);if(!o){this.log("No hypothesis picked for test '%s'",r.id);return}this.sendDiagnosticTelemetry("assignment",r.id,{hypothesisId:o.id,isControl:o.isControl,testType:o.type});const c=this.getReservationType(o.type),l=this.getEntryCriteriaKey(r),d={testId:r.id,hypothesisId:o.id,testType:o.type,reservationType:c,isThemeTest:o.type==="theme",themeId:o.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:l};this.state.temporary.testReservations[l]=d,this.state.temporary.rolledEntryCriteria.push(t),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",c,r.id,t,l);for(const p of e)p.id!==r.id&&this.markTestAsBlocked(p,`pool:${t}`);this.persistTemporaryState()}markTestAsBlocked(e,t){this.state.essential.visitorTests.some(i=>i.testId===e.id)||(this.log("Blocking visitor from test '%s' (reason: %s)",e.id,t),this.state.essential.visitorTests.push({createdAt:new Date,testId:e.id,hypothesisId:null,isThemeTest:e.hypotheses.some(i=>i.type==="theme"),shouldSendToGa:!1,isSaved:!0,isInvalid:!0,themeId:void 0}))}realizeReservationForCriteria(e){const t=this.state.temporary.testReservations?.[e];if(!t)return this.log("No reservation found for criteria '%s'",e),!1;if(t.isRealized)return this.log("Reservation already realized for criteria '%s'",e),!1;if(this.state.essential.visitorTests.some(s=>s.testId===t.testId&&!s.isInvalid))return this.log("Visitor already assigned to test '%s'",t.testId),!1;const i=this.getHypothesis(t.hypothesisId);return i?(t.isRealized=!0,this.persistTemporaryState(),this.queueAddVisitorToTest(t.testId,i),this.saveState(),this.log("Realized reservation for test '%s' (criteria: %s)",t.testId,e),!0):(this.log("Hypothesis '%s' not found",t.hypothesisId),!1)}getActiveReservations(){return this.state.temporary.testReservations??{}}getReservationForCurrentPage(){const e=this.getActiveReservations();for(const[t,i]of Object.entries(e)){if(i.isRealized)continue;const s=this.testConfigs.find(n=>n.id===i.testId);if(!(!s||s.status!=="active")&&this.doesCurrentPageMatchEntryCriteria(t))return i}return null}getReservationForTest(e){const t=this.getActiveReservations();return Object.values(t).find(i=>i.testId===e)??null}getReservationTestType(){const e=this.getActiveReservations(),t=Object.values(e);if(t.length===0)return null;for(const i of t)if(i.isThemeTest)return"theme";for(const i of t)if(i.testType==="price")return"price";return t.some(i=>!i.isRealized)?"templateOrUrlRedirect":null}hasPriceTests(e){return e.some(t=>t.hypotheses.some(i=>i.type==="price"))}_priceTestProductIds=null;getPriceTestProductIds(){if(this._priceTestProductIds)return this._priceTestProductIds;const e=new Set;for(const t of this.testConfigs)for(const i of t.hypotheses)if(i.type==="price"){for(const s of i.domSelectors||[]){const n=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);n?.[1]&&e.add(n[1])}if(i.priceData?.variants)for(const[s]of i.priceData.variants)e.add(s)}return this._priceTestProductIds=e,this.log("Built price test product ID cache with %d products",e.size),e}isProductInAnyPriceTest(e){return this.getPriceTestProductIds().has(e)}visitorActiveTestTypeWithReservations(){const e=this.getActiveReservations();for(const n of Object.values(e)){if(n.isThemeTest)return"theme";if(n.testType==="price")return"price"}if(Object.values(e).some(n=>!n.isRealized)){if(this.state.temporary.testCategory==="global")for(const r of Object.values(e)){if(r.testType==="theme")return"theme";if(r.testType==="price")return"price";if(r.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(n=>!n.isInvalid&&this.testConfigs.some(r=>r.hypotheses.some(o=>o.id===n.hypothesisId)));return i.length===0?null:i.some(n=>this.getHypothesis(n.hypothesisId)?.type==="price")?"price":i.some(n=>n.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const e=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(n=>n.type==="price"));if(e.length===0)return;const t=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(n=>n.type==="price")),i=e.filter(s=>!t.some(n=>n.id===s.id));if(i.length!==0){this.log("Found %d price tests filtered by audience, applying control selectors",i.length);for(const s of i){const n=s.hypotheses.find(l=>l.isControl),r=this.getDomSelectorsForHypothesis(n);if(r.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const o=new URL(window.location.href);r.some(l=>{try{return new RegExp(ae(l)).test(B(o.toString()))}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),N(document,{testId:s.id,hypothesisId:n.id,selectors:r},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(e){let t=Math.random();const i=e.hypotheses.reduce((n,r)=>n+r.visitorCount,0);return e.hypotheses.sort((n,r)=>n.isControl?r.isControl?0:-1:r.isControl?1:0).reduce((n,r)=>{if(n!==null)return n;const c=e.hypotheses.reduce((l,d)=>l&&d.visitorCount>20,!0)?r.visitorCount/i-r.trafficPercentage:0;return t<=r.trafficPercentage-c?r:(t-=r.trafficPercentage-c,null)},null)}typeFromTemplate(){switch(template.type){case"list-collections":return"collectionList";case"page":return"landing";case"article":case"blog":case"cart":case"collection":case"index":case"product":case"search":return template.type;default:return null}}queueRedirect(e,t=!1){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>{t?window.location.replace(e):window.location.assign(e)},0),window.setTimeout(()=>{this.syncAllEvents()},2e3)}scheduleRetrySync(){this.clientIdRetryCount>=5||(this.clientIdRetryCount++,window.setTimeout(()=>{this.syncAllEvents()},500))}async syncAllEvents(){const e=async()=>{if(this.isSyncing){window.setTimeout(()=>{(async()=>await e())()},500);return}try{if(this.isSyncing=!0,this.syncGAEvents(),this.shopifyAnalyticsId||(this.shopifyAnalyticsId=this.getShopifyAnalyticsId()),!this.shopifyAnalyticsId){this.scheduleRetrySync();return}this.syncAnonConsent(),await this.syncEvents()}finally{this.isSyncing=!1}};await e()}async syncEvents(){if(!this.state.essential.consentApproved||!this.shopifyAnalyticsId||this.state.analytics.queue.length===0)return;const e=this.state.analytics.queue.length,t=this.state.analytics.queue.splice(0,e);this.log("Syncing %s events",e);try{const i={shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},s={shop:this.shop,visitorDetails:{...i,visitorId:this.savedVisitorIdFor(i.shopifyAnalyticsId)},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new ke(r.testId,r.hypothesisId,r.createdAt)).concat(t)};await this.sendEvents(s);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved&&o.hypothesisId!=null))this.sendDiagnosticTelemetry("event-delivered",r.testId,{hypothesisId:r.hypothesisId,isControl:r.assignedTo==="control",testType:r.testType??"unknown"});const n=await this.getVisitor(this.shopifyAnalyticsId);n!==null&&this.updateLocalVisitor(n);for(const r of this.state.essential.visitorTests.filter(o=>!o.isInvalid&&!o.isSaved))r.isSaved=!0,r.savedAt=Date.now()}catch{this.state.analytics.queue.splice(0,0,...t)}finally{this.saveState()}}syncGAEvents(){if(!this.gaConfig.sendEvents){if(ve)return;ve=!0,this.log("UseGtag is false — skipping GA Events");return}if(this.isSyncingGA){this.log("Already syncing GA - skipping GA events");return}const e=this.state.essential.visitorTests.filter(t=>t.shouldSendToGa);e.length!==0&&(this.isSyncingGA=!0,this.log("Syncing %s GA Events",e.length),Promise.allSettled(e.map(t=>this.sendGAEvent(t))).then(()=>this.log("All gtag events sent")).finally(()=>this.isSyncingGA=!1))}sendGAEvent(e){return new Promise(t=>{this.log("Sending GA Event for test %s, hypothesis %s",e.testId,e.hypothesisId);const i=()=>{this.log("GA acknowledged event for hypothesis %s",e.hypothesisId),e.shouldSendToGa=!1,this.persistEssentialState(),t()},s={exp_variant_string:`SL-${e.testId}-${e.hypothesisId}`};this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function n(r,o,c){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?n("event","experience_impression",{...s,event_callback:i}):(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"experience_impression",...s,eventCallback:i}))})}updateLocalVisitor(e){let t;({visitorTests:t,...this.state.analytics.visitor}=e),this.log("updateLocalVisitor - server returned %d tests: %o",t.length,t.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isInvalid:s.isInvalid}))),this.log("updateLocalVisitor - local has %d tests: %o",this.state.essential.visitorTests.length,this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid})));const i=300*1e3;for(const s of this.state.essential.visitorTests.filter(n=>n.isSaved&&(!n.savedAt||Date.now()-n.savedAt>i)&&!t.some(r=>r.testId===n.testId)))this.log("updateLocalVisitor - marking LOCAL test as INVALID (isSaved && not in server): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),s.isInvalid=!0;for(const s of t){const n=this.state.essential.visitorTests.findIndex(o=>o.testId===s.testId);if(!(n!==-1))this.log("updateLocalVisitor - ADDING server test (not found locally): testId=%s, hypothesisId=%s",s.testId,s.hypothesisId),this.state.essential.visitorTests.push(s);else{const o=this.state.essential.visitorTests.at(n);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,o?.hypothesisId,s.hypothesisId,o?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=o?.shouldSendToGa??!1,s.testType=o?.testType,s.assignedTo=o?.assignedTo,s.testTitle=o?.testTitle,s.redirectCount=o?.hypothesisId===s.hypothesisId?o.redirectCount:void 0,s.anonAssigned=o?.anonAssigned,s.hop=o?.hypothesisId===s.hypothesisId?o.hop:void 0,s.hopNonce=o?.hypothesisId===s.hypothesisId?o.hopNonce:void 0,s.hopThemeId=o?.hopThemeId,this.state.essential.visitorTests.splice(n,1,s)}}this.log("updateLocalVisitor - FINAL local tests: %o",this.state.essential.visitorTests.map(s=>({testId:s.testId,hypothesisId:s.hypothesisId,isSaved:s.isSaved,isInvalid:s.isInvalid}))),this.state.analytics.visitor.storedAt=new Date}savedVisitorIdFor(e){const t=this.state.analytics.visitor;return t?.id&&t.shopifyAnalyticsId===this.shopifyAnalyticsId&&e===this.shopifyAnalyticsId?t.id:null}async getVisitor(e){try{return await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/by-key/${this.shop}/${e}`})}catch{return null}}async sendEvents(e){await this.makeRequest({method:"post",url:`${this.eventHost}/api/v0/events`,data:JSON.stringify(e)})}sendDiagnosticTelemetry(e,t,i){if(!this.telemetryEnabled||!navigator.sendBeacon)return;const s=this.state.essential.consentApproved,n=JSON.stringify({shop:this.shop,testId:t,checkpoint:e,device:this.device,...s?{visitorId:this.shopifyAnalyticsId??"unknown"}:{},clientTimestamp:Date.now(),consentApproved:s,hasConsentInteraction:this.state.essential.hasConsentInteraction,...i});navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry`,new Blob([n],{type:"text/plain"}))}countRedirectLandings(){if(!this.redirectCountersEnabled)return;let e=!1;for(const t of this.state.essential.visitorTests){if(t.redirectCount!=="assigned"||!t.hypothesisId)continue;const i=this.getHypothesis(t.hypothesisId);!i||(t.assignedTo!=="variant"&&this.settleControlHop(t),!(t.assignedTo==="variant"?this.isOnRedirectTarget(i):t.hop==="hopped"))||this.sendRedirectCount("landed",t.testId,i.id)&&(t.redirectCount="landed",e=!0)}e&&this.persistEssentialState()}isOnRedirectTarget(e){if(e.type==="theme")return e.themeId===themeId;const t=new URL(window.location.toString());return e.redirectPath?Se(t.pathname,e.redirectPath):this.typeFromTemplate()===e.type&&e.affix===template.suffix&&e.affix===t.searchParams.get("view")}sendRedirectCount(e,t,i,s){if(!navigator.sendBeacon)return!1;const n=JSON.stringify({shop:this.shop,testId:t,hypothesisId:i,stage:e,reason:s,consent:this.consentStatus()});return navigator.sendBeacon(`${this.eventHost}/api/v0/telemetry/redirect`,new Blob([n],{type:"text/plain"}))}sendAnonAssignment(e,t){const{anonId:i}=this.state.essential;if(!i||!navigator.sendBeacon)return!1;const s=JSON.stringify({shop:this.shop,anonId:i,testId:e,hypothesisId:t.id,consent:this.consentStatus()});return navigator.sendBeacon(`${this.eventHost}/api/v0/events/anon/assigned`,new Blob([s],{type:"text/plain"}))}syncAnonConsent(){if(!this.anonymousVisitorIdEnabled||!navigator.sendBeacon)return;const{anonId:e,consentApproved:t,anonConsent:i,visitorTests:s}=this.state.essential;if(!e||!s.some(l=>l.anonAssigned))return;const n=t&&this.consentAnswered?"approved":this.consentDeclined?"declined":null,r=this.shopifyAnalyticsId??void 0;if(n===null||n==="approved"&&!r)return;const o=n==="approved"?{consent:n,analyticsId:r}:{consent:n};if(i?.consent===o.consent&&i.analyticsId===o.analyticsId)return;const c=JSON.stringify({shop:this.shop,anonId:e,consent:n,analyticsId:r});navigator.sendBeacon(`${this.eventHost}/api/v0/events/anon/consent`,new Blob([c],{type:"text/plain"}))&&(this.state.essential.anonConsent=o,this.persistEssentialState())}consentStatus(){const{consentApproved:e,hasConsentInteraction:t}=this.state.essential;return e?"approved":t?"declined":"unknown"}getUTMValue(e){return new URLSearchParams(window.location.search).get(e)||null}hidePage(e){this.log("Hiding page"),this.cssHideClass&&!window.document.documentElement.classList.contains(this.cssHideClass)&&(window.document.documentElement.classList.add(this.cssHideClass),e||setTimeout(this.removeAsyncHide(this.cssHideClass),2e3))}showPage(){this.cssHideClass&&this.removeAsyncHide(this.cssHideClass)()}getDeviceType(){function e(){let i=!1;return(function(s){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}function t(){let i=!1;return(function(s){(/android|ipad|playbook|silk/i.test(s)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(s.substr(0,4)))&&(i=!0)})(navigator.userAgent||navigator.vendor),i}return e()?"mobile":t()?"tablet":"desktop"}removeAsyncHide(e){return()=>{e&&window.document.documentElement.classList.remove(e)}}async getCartState(){try{let e=await this.makeJsonRequest({method:"get",url:`${window.location.origin}/cart.js`});return e===null||(e.note===null&&(e=await this.makeJsonRequest({method:"post",url:`${window.location.origin}/cart/update.js`,data:JSON.stringify({note:""})})),e==null)?null:{token:e.token,total_price:e.total_price,total_discount:e.total_discount,currency:e.currency,items_subtotal_price:e.items_subtotal_price,items:e.items.map(t=>({quantity:t.quantity,variant_id:t.variant_id,key:t.key,price:t.price,final_line_price:t.final_line_price,sku:t.sku,product_id:t.product_id}))}}catch(e){return this.log("Error sending cart info",e),null}}ensureCartAttributesForExistingPriceTests(e){try{if(this.log("Checking visitor assignments for active price tests"),e&&this.state.temporary.previewConfig){const t=this.state.temporary.previewConfig;this.log("Using preview config for merchant:",t.testId);let i="variant";if(t.variants&&t.variants.length>0){const s=t.variants.find(n=>n.id===t.currentVariant);s&&s.isControl&&(i="control")}this.log("Merchant preview - updating hidden inputs:",t.testId,i),this.updatePriceTestHiddenInputs(t.testId,i,!0);return}for(const t of this.state.essential.visitorTests){const i=this.testConfigs.find(r=>r.id===t.testId);if(!i){this.log("Test config not found:",t.testId);continue}const s=i.hypotheses.find(r=>r.id===t.hypothesisId);if(!s||s.type!=="price")continue;const n=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",t.testId,n),this.updatePriceTestHiddenInputs(t.testId,n,e)}}catch(t){this.log("Error ensuring cart attributes for existing price tests:",t)}}subscriptionSwapDone=!1;subscriptionHideWrongPlans=null;subscriptionPriceDone=!1;subscriptionUpdateOneTime=null;subscriptionOneTimeDone=!1;swapMap=null;slptValue=null;async subscriptionSwap(){await Ze(this)}async subscriptionPriceChange(){await et(this)}async subscriptionOneTimePrice(){await tt(this)}updatePriceTestHiddenInputs(e,t,i){try{this.cleanupPriceTestObservers();const s=`${e}:${t}:${i?"t":"f"}`,n=S=>{const f=S.getAttribute("data-sl-pid");if(!f)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,T=t==="control"?"a":"b",g=w.variants.find(v=>v.label===T);if(!g)return!1;for(const v of g.domSelectors||[]){const m=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(m){const I=m[1];if(this.log(`Extracted ID from selector: ${I}, comparing to: ${f}`),I===f)return this.log("Product ID match found in preview config:",f,"variant:",g.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",f,"variant:",T),!1}const y=this.testConfigs.find(w=>w.id===e);if(!y)return this.log("Test config not found for testId:",e),!1;for(const w of y.hypotheses||[]){for(const T of w.domSelectors||[]){const g=T.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g&&g[1]===f)return this.log("Product ID match found in domSelectors:",f,"for test:",e),!0}if(w.priceData?.variants){for(const T of w.priceData.variants)if(T[0]===f)return this.log("Product ID match found in priceData:",f,"for test:",e),!0}}return this.log("No product ID match for:",f,"in test:",e),!1},r=new Set;let o=!1,c=null;const l=(S,f)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{S.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(T){this.log(`Failed to observe element (${f}):`,T)}}),document.body&&document.body.isConnected)try{S.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${f}):`,w)}},d=(S,f,y,w)=>{const T=S.filter(g=>{const v=g.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${S.length}, filtered: ${T.length}`),T.length>0&&N(document,{testId:e,hypothesisId:f,selectors:T})},p=(S,f)=>{this.log(`Applying DOM selector changes for product ID: ${S}`),f.disconnect(),o=!0;try{if(i&&this.state.temporary.previewConfig){const y=t==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(T=>T.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",S)}else{const y=this.testConfigs.find(T=>T.id===e);if(!y){this.log(`No test config found for testId: ${e}`);return}const w=y.hypotheses.find(T=>t==="control"?T.isControl:!T.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${t}`);return}d(w.domSelectors,w.id,"live config",S)}}finally{c!==null&&clearTimeout(c),c=window.setTimeout(()=>{o=!1,c=null,l(f,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")},50)}},u=new MutationObserver(S=>{if(!o)for(const f of S){if(f.type!=="childList"&&f.type!=="characterData")continue;let y=f.target;f.type==="characterData"&&(y=f.target.parentElement||f.target.parentNode);let w=y,T=w.getAttribute("data-sl-attribute-p");for(;!T&&w.parentElement;)w=w.parentElement,T=w.getAttribute("data-sl-attribute-p");if(!T)continue;const g=w.innerHTML||w.textContent||"";let v="";f.type==="characterData"&&f.oldValue!==null&&(v=f.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${T}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${g}"`),p(T,u)}});l(u,"initial setup"),r.add(u);const h=new MutationObserver(S=>{S.forEach(f=>{f.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;k(w);const T=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');T.length>0&&this.log(`MutationObserver found ${T.length} new hidden input(s)`),T.forEach(g=>{const v=g.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),n(g))g.value!==s&&(g.value=s,this.log("Updated newly added hidden input:",s)),C(g);else{const m=g.getAttribute("data-sl-pid");m&&this.isProductInAnyPriceTest(m)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",m):(g.remove(),this.log("Removed newly added non-matching hidden input for product ID:",m))}})}})})});r.add(h);const b=new MutationObserver(S=>{S.forEach(f=>{if(f.type==="attributes"&&f.attributeName==="data-sl-pid"){const y=f.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,T=f.oldValue,g=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${T}" to "${g}" - triggering payment placement updates`),n(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),g&&p(g,u),this.log("Re-running payment placement updates after variant change"),k(document.body)):g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",g))}}})});r.add(b);const k=S=>{S.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(e,t));const f=S.querySelectorAll("shopify-payment-terms");f.length>0&&(this.log(`MutationObserver found ${f.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(e,t)),S.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(e,t,"afterpay"));const y=S.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(e,t,"afterpay")),S.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(e,t,"square"));const w=S.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(e,t,"square")),S.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(e,t));const T=S.querySelectorAll("klarna-placement");T.length>0&&(this.log(`MutationObserver found ${T.length} klarna-placement in added node`),this.updateKlarnaPlacements(e,t))},C=S=>{b.observe(S,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const f=S.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${f}"`)},P=()=>{const S=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${S.length} existing hidden inputs to check`),S.forEach(f=>{const y=f.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),n(f)?(f.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),p(y,u)),C(f)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",y):(f.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(h.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),P(),k(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(h.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),P(),k(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=r,window.__shopliftPriceTestValue=s,this.log("Set up DOM observer for price test hidden inputs")}catch(s){this.log("Error updating price test hidden inputs:",s)}}updateKlarnaPlacements(e,t){this.updatePlacementElements(e,t,"klarna-placement",(i,s)=>{i.setAttribute("data-purchase-amount",s.toString())})}cleanupPriceTestObservers(){const e=window.__shopliftPriceTestObservers;e&&(e.forEach(t=>{t.disconnect()}),e.clear(),this.log("Cleaned up existing price test observers")),delete window.__shopliftPriceTestObservers,delete window.__shopliftPriceTestValue}updateAfterpayPlacements(e,t,i="afterpay"){const s=i==="square"?"square-placement":"afterpay-placement";if(document.querySelectorAll(s).length===0){this.log(`No ${s} elements found on page - early return`);return}this.updatePlacementElements(e,t,s,(r,o)=>{if(i==="afterpay"){const c=(o/100).toFixed(2);r.setAttribute("data-amount",c)}else r.setAttribute("data-amount",o.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(e,t,i,s){const n=document.querySelectorAll(i);if(n.length===0){this.log(`No ${i} elements found - early return`);return}let r;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const c=t==="control"?"a":"b",l=this.state.temporary.previewConfig.variants.find(d=>d.label===c);if(!l?.domSelectors){this.log(`No variant found for label ${c} in preview config for ${i}`);return}r=l.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${c}`)}else{const c=this.testConfigs.find(d=>d.id===e);if(!c){this.log(`No testConfig found for id: ${e} - early return`);return}const l=c.hypotheses.find(d=>t==="control"?d.isControl:!d.isControl);if(!l?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${t} - early return`);return}r=l.domSelectors}const o=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);n.forEach(c=>{let l=null;const d=c.parentElement;if(d&&(l=d.querySelector('input[name="properties[_slpt]"]')),l||(l=c.querySelector('input[name="properties[_slpt]"]')),!l){this.log(`No hidden input found for ${i} element`);return}const p=l.getAttribute("data-sl-pid");if(!p){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const u=r.find(C=>{const P=C.cssSelector.match(o);return P&&P[1]===p});if(!u){this.log(`No matching selector found for productId: ${p} - skipping element`);return}const h=u.actions.find(C=>C.scope==="price");if(!h?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(h.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${h.value}" for product ${p} - skipping`);return}const k=Math.round(b*100);s(c,k)}),this.log(`updatePlacementElements completed for ${i}`)}updateShopifyPaymentTerms(e,t){const i=document.querySelectorAll("shopify-payment-terms");if(i.length===0)return;this.log("Store using shopify payments");let s;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const r=t==="control"?"a":"b",o=this.state.temporary.previewConfig.variants.find(c=>c.label===r);if(!o||!o.domSelectors){this.log(`No variant found for label ${r} in preview config`);return}s=o.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${r}`)}else{const r=this.testConfigs.find(c=>c.id===e);if(!r)return;const o=r.hypotheses.find(c=>t==="control"?c.isControl===!0:c.isControl===!1);if(!o||!o.domSelectors)return;s=o.domSelectors}const n=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(r=>{const o=r.getAttribute("variant-id");if(!o)return;const c=s.find(l=>{const d=l.cssSelector.match(n);return d&&d[1]===o});if(c){const l=c.actions.find(d=>d.scope==="price");if(l&&l.value){const d=r.getAttribute("shopify-meta");if(d)try{const p=JSON.parse(d);if(p.variants&&Array.isArray(p.variants)){const u=p.variants.find(h=>h.id?.toString()===o);if(u){u.full_price=l.value;const h=parseFloat(l.value.replace(/[^0-9.]/g,""));if(u.number_of_payment_terms&&u.number_of_payment_terms>1){const b=h/u.number_of_payment_terms;u.price_per_term=`$${b.toFixed(2)}`}r.setAttribute("shopify-meta",JSON.stringify(p))}}}catch(p){this.log("Error parsing/updating shoplift-meta:",p)}}}})}async makeJsonRequest(e){const t=await this.makeRequest(e);return t===null?null:JSON.parse(await t.text(),F)}async makeRequest(e){const{url:t,method:i,headers:s,data:n,signal:r}=e,o=new Headers;if(s)for(const l in s)o.append(l,s[l]);(!s||!s.Accept)&&o.append("Accept","application/json"),n!==void 0&&(!s||!s["Content-Type"])&&o.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&o.append("ngrok-skip-browser-warning","1234");const c=await this.fetch(t,{method:i,headers:o,body:n,signal:r});if(!c.ok){if(c.status===204)return null;if(c.status===422){const l=await c.json();if(typeof l<"u"&&l.isBot)throw new j}throw new Error(`Error sending shoplift request ${c.status}`)}return c}queueAddVisitorToTest(e,t){if(this.state.essential.visitorTests.some(n=>n.testId===e))return;const i=this.testConfigs.find(n=>n.id===e),s={createdAt:new Date,testId:e,hypothesisId:t.id,isThemeTest:t.type==="theme",themeId:t.themeId,isSaved:!1,isInvalid:!1,shouldSendToGa:!0,testType:t.type,assignedTo:t.isControl?"control":"variant",testTitle:i?.title};if(this.aSideHopEnabled&&t.isControl&&se.has(t.type)&&(s.hop="pending"),this.state.essential.visitorTests.push(s),this.redirectCountersEnabled&&se.has(t.type)&&this.sendRedirectCount("assigned",e,t.id)&&(s.redirectCount="assigned"),this.anonymousVisitorIdEnabled&&se.has(t.type)&&this.sendAnonAssignment(e,t)&&(s.anonAssigned=!0,this.syncAnonConsent()),t.type==="price"){const n=t.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",e,n),this.updatePriceTestHiddenInputs(e,n,!1)}}queueCartUpdate(e){this.queueEvent(new xe(e))}queuePageView(e){this.queueEvent(new _e(e))}queueEvent(e){!this.state.essential.consentApproved&&this.state.essential.hasConsentInteraction||this.state.analytics.queue.length>10||this.state.analytics.queue.push(e)}legacyGetLocalStorageVisitor(){const e=this.localStorageGet(this.legacySessionKey);if(e)try{return JSON.parse(e,F)}catch{}return null}pruneStaleVisitorTests(){this.state.essential.visitorTests=this.state.essential.visitorTests.filter(e=>this.testConfigs.some(t=>t.id==e.testId)||this.inactiveTestConfigs.filter(t=>this.testIsPaused(t)).some(t=>t.id===e.testId))}pruneStateAndSave(){this.pruneStaleVisitorTests(),this.saveState()}saveState(){this.persistEssentialState(),this.persistAnalyticsState()}loadState(){const e=this.loadAnalyticsState(),t={analytics:e,essential:this.loadEssentialState(e),temporary:this.loadTemporaryState()},i=this.legacyGetLocalStorageVisitor(),s=this.legacyGetCookieVisitor(),n=[i,s].filter(r=>r!==null).sort((r,o)=>+o.storedAt-+r.storedAt)[0];return t.analytics.visitor===null&&n&&({visitorTests:t.essential.visitorTests,...t.analytics.visitor}=n,t.essential.isFirstLoad=!1,t.essential.initialState={createdAt:n.createdAt,referrer:n.referrer,utmCampaign:n.utmCampaign,utmContent:n.utmContent,utmMedium:n.utmMedium,utmSource:n.utmSource,device:n.device},this.deleteCookie("SHOPLIFT"),this.deleteLocalStorage(this.legacySessionKey)),!t.essential.consentApproved&&t.essential.hasConsentInteraction&&this.deleteLocalStorage(this.analyticsSessionKey),t}loadEssentialState(e){const t=this.loadLocalStorage(this.essentialSessionKey),i=this.loadCookie(this.essentialSessionKey),s=this.getInitialState();e.visitor?.device&&(s.device=e.visitor.device);const n={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},r=[t,i].filter(o=>o!==null).sort((o,c)=>+c.timestamp-+o.timestamp)[0]??n;if(r.initialState||(e.visitor!==null?r.initialState=e.visitor:(r.initialState=s,r.initialState.createdAt=r.timestamp)),this.anonymousVisitorIdEnabled)r.anonId||(r.anonId=this.mintAnonId());else{delete r.anonId,delete r.anonConsent;for(const o of r.visitorTests)delete o.anonAssigned}if(!this.aSideHopEnabled)for(const o of r.visitorTests)delete o.hop,delete o.hopNonce;return r}mintAnonId(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():void 0}loadAnalyticsState(){const e=this.loadLocalStorage(this.analyticsSessionKey),t=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[e,t].filter(n=>n!==null).sort((n,r)=>+r.timestamp-+n.timestamp)[0]??i;return s.queue.length===0&&e&&e.queue.length>1&&(s.queue=e.queue),s}loadTemporaryState(){const e=this.sessionStorageGet(this.temporarySessionKey),t=e?JSON.parse(e,F):null,i=this.loadCookie(this.temporarySessionKey);return t??i??{isMerchant:!1,timestamp:new Date}}persistEssentialState(){this.log("Persisting essential state"),this.state.essential.isFirstLoad=!1,this.state.essential.timestamp=new Date,this.persistLocalStorageState(this.essentialSessionKey,this.state.essential),this.persistCookieState(this.essentialSessionKey,this.state.essential)}persistAnalyticsState(){this.log("Persisting analytics state"),this.state.essential.consentApproved&&(this.state.analytics.timestamp=new Date,this.persistLocalStorageState(this.analyticsSessionKey,this.state.analytics),this.persistCookieState(this.analyticsSessionKey,{...this.state.analytics,queue:[]}))}persistTemporaryState(){this.log("Setting temporary session state"),this.state.temporary.timestamp=new Date,this.sessionStorageSet(this.temporarySessionKey,JSON.stringify(this.state.temporary)),this.persistCookieState(this.temporarySessionKey,this.state.temporary,!0)}loadLocalStorage(e){const t=this.localStorageGet(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}loadCookie(e){const t=this.getCookie(e);if(t===null)return null;try{return JSON.parse(t,F)}catch{return null}}persistLocalStorageState(e,t){this.localStorageSet(e,JSON.stringify(t))}persistCookieState(e,t,i=!1){const s=JSON.stringify(t),n=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${e}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${n}`}deleteCookie(e){const t=new Date(0).toUTCString();document.cookie=`${e}=;domain=.${window.location.hostname};path=/;expires=${t};`}deleteLocalStorage(e){window.localStorage.removeItem(e)}getChannel(e){return[{"name":"cross-network","test":(v) => new RegExp(".*cross-network.*", "i").test(v.utmCampaign)},{"name":"direct","test":(v) => v.utmSource === "" && v.utmMedium === ""},{"name":"paid-shopping","test":(v) => (new RegExp("^(?:Google|IGShopping|aax-us-east\.amazon-adsystem\.com|aax\.amazon-adsystem\.com|alibaba|alibaba\.com|amazon|amazon\.co\.uk|amazon\.com|apps\.shopify\.com|checkout\.shopify\.com|checkout\.stripe\.com|cr\.shopping\.naver\.com|cr2\.shopping\.naver\.com|ebay|ebay\.co\.uk|ebay\.com|ebay\.com\.au|ebay\.de|etsy|etsy\.com|m\.alibaba\.com|m\.shopping\.naver\.com|mercadolibre|mercadolibre\.com|mercadolibre\.com\.ar|mercadolibre\.com\.mx|message\.alibaba\.com|msearch\.shopping\.naver\.com|nl\.shopping\.net|no\.shopping\.net|offer\.alibaba\.com|one\.walmart\.com|order\.shopping\.yahoo\.co\.jp|partners\.shopify\.com|s3\.amazonaws\.com|se\.shopping\.net|shop\.app|shopify|shopify\.com|shopping\.naver\.com|shopping\.yahoo\.co\.jp|shopping\.yahoo\.com|shopzilla|shopzilla\.com|simplycodes\.com|store\.shopping\.yahoo\.co\.jp|stripe|stripe\.com|uk\.shopping\.net|walmart|walmart\.com)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"paid-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) && new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"display","test":(v) => new RegExp("^(?:display|banner|expandable|interstitial|cpm)$", "i").test(v.utmMedium)},{"name":"paid-other","test":(v) => new RegExp("^(.*cp.*|ppc|retargeting|paid.*)$", "i").test(v.utmMedium)},{"name":"organic-shopping","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || new RegExp("^(.*(([^a-df-z]|^)shop|shopping).*)$", "i").test(v.utmCampaign)},{"name":"organic-social","test":(v) => new RegExp("^(?:43things|43things\.com|51\.com|5ch\.net|Hatena|ImageShack|academia\.edu|activerain|activerain\.com|activeworlds|activeworlds\.com|addthis|addthis\.com|airg\.ca|allnurses\.com|allrecipes\.com|alumniclass|alumniclass\.com|ameba\.jp|ameblo\.jp|americantowns|americantowns\.com|amp\.reddit\.com|ancestry\.com|anobii|anobii\.com|answerbag|answerbag\.com|answers\.yahoo\.com|aolanswers|aolanswers\.com|apps\.facebook\.com|ar\.pinterest\.com|artstation\.com|askubuntu|askubuntu\.com|asmallworld\.com|athlinks|athlinks\.com|away\.vk\.com|awe\.sm|b\.hatena\.ne\.jp|baby-gaga|baby-gaga\.com|babyblog\.ru|badoo|badoo\.com|bebo|bebo\.com|beforeitsnews|beforeitsnews\.com|bharatstudent|bharatstudent\.com|biip\.no|biswap\.org|bit\.ly|blackcareernetwork\.com|blackplanet|blackplanet\.com|blip\.fm|blog\.com|blog\.feedspot\.com|blog\.goo\.ne\.jp|blog\.naver\.com|blog\.yahoo\.co\.jp|blogg\.no|bloggang\.com|blogger|blogger\.com|blogher|blogher\.com|bloglines|bloglines\.com|blogs\.com|blogsome|blogsome\.com|blogspot|blogspot\.com|blogster|blogster\.com|blurtit|blurtit\.com|bookmarks\.yahoo\.co\.jp|bookmarks\.yahoo\.com|br\.pinterest\.com|brightkite|brightkite\.com|brizzly|brizzly\.com|business\.facebook\.com|buzzfeed|buzzfeed\.com|buzznet|buzznet\.com|cafe\.naver\.com|cafemom|cafemom\.com|camospace|camospace\.com|canalblog\.com|care\.com|care2|care2\.com|caringbridge\.org|catster|catster\.com|cbnt\.io|cellufun|cellufun\.com|centerblog\.net|chat\.zalo\.me|chegg\.com|chicagonow|chicagonow\.com|chiebukuro\.yahoo\.co\.jp|classmates|classmates\.com|classquest|classquest\.com|co\.pinterest\.com|cocolog-nifty|cocolog-nifty\.com|copainsdavant\.linternaute\.com|couchsurfing\.org|cozycot|cozycot\.com|cross\.tv|crunchyroll|crunchyroll\.com|cyworld|cyworld\.com|cz\.pinterest\.com|d\.hatena\.ne\.jp|dailystrength\.org|deluxe\.com|deviantart|deviantart\.com|dianping|dianping\.com|digg|digg\.com|diigo|diigo\.com|discover\.hubpages\.com|disqus|disqus\.com|dogster|dogster\.com|dol2day|dol2day\.com|doostang|doostang\.com|dopplr|dopplr\.com|douban|douban\.com|draft\.blogger\.com|draugiem\.lv|drugs-forum|drugs-forum\.com|dzone|dzone\.com|edublogs\.org|elftown|elftown\.com|epicurious\.com|everforo\.com|exblog\.jp|extole|extole\.com|facebook|facebook\.com|faceparty|faceparty\.com|fandom\.com|fanpop|fanpop\.com|fark|fark\.com|fb|fb\.me|fc2|fc2\.com|feedspot|feministing|feministing\.com|filmaffinity|filmaffinity\.com|flickr|flickr\.com|flipboard|flipboard\.com|folkdirect|folkdirect\.com|foodservice|foodservice\.com|forums\.androidcentral\.com|forums\.crackberry\.com|forums\.imore\.com|forums\.nexopia\.com|forums\.webosnation\.com|forums\.wpcentral\.com|fotki|fotki\.com|fotolog|fotolog\.com|foursquare|foursquare\.com|free\.facebook\.com|friendfeed|friendfeed\.com|fruehstueckstreff\.org|fubar|fubar\.com|gaiaonline|gaiaonline\.com|gamerdna|gamerdna\.com|gather\.com|geni\.com|getpocket\.com|glassboard|glassboard\.com|glassdoor|glassdoor\.com|godtube|godtube\.com|goldenline\.pl|goldstar|goldstar\.com|goo\.gl|gooblog|goodreads|goodreads\.com|google\+|googlegroups\.com|googleplus|govloop|govloop\.com|gowalla|gowalla\.com|gree\.jp|groups\.google\.com|gulli\.com|gutefrage\.net|habbo|habbo\.com|hi5|hi5\.com|hootsuite|hootsuite\.com|houzz|houzz\.com|hoverspot|hoverspot\.com|hr\.com|hu\.pinterest\.com|hubculture|hubculture\.com|hubpages\.com|hyves\.net|hyves\.nl|ibibo|ibibo\.com|id\.pinterest\.com|identi\.ca|ig|imageshack\.com|imageshack\.us|imvu|imvu\.com|in\.pinterest\.com|insanejournal|insanejournal\.com|instagram|instagram\.com|instapaper|instapaper\.com|internations\.org|interpals\.net|intherooms|intherooms\.com|irc-galleria\.net|is\.gd|italki|italki\.com|jammerdirect|jammerdirect\.com|jappy\.com|jappy\.de|kaboodle\.com|kakao|kakao\.com|kakaocorp\.com|kaneva|kaneva\.com|kin\.naver\.com|l\.facebook\.com|l\.instagram\.com|l\.messenger\.com|last\.fm|librarything|librarything\.com|lifestream\.aol\.com|line|line\.me|linkedin|linkedin\.com|listal|listal\.com|listography|listography\.com|livedoor\.com|livedoorblog|livejournal|livejournal\.com|lm\.facebook\.com|lnkd\.in|m\.blog\.naver\.com|m\.cafe\.naver\.com|m\.facebook\.com|m\.kin\.naver\.com|m\.vk\.com|m\.yelp\.com|mbga\.jp|medium\.com|meetin\.org|meetup|meetup\.com|meinvz\.net|meneame\.net|menuism\.com|messages\.google\.com|messages\.yahoo\.co\.jp|messenger|messenger\.com|mix\.com|mixi\.jp|mobile\.facebook\.com|mocospace|mocospace\.com|mouthshut|mouthshut\.com|movabletype|movabletype\.com|mubi|mubi\.com|my\.opera\.com|myanimelist\.net|myheritage|myheritage\.com|mylife|mylife\.com|mymodernmet|mymodernmet\.com|myspace|myspace\.com|netvibes|netvibes\.com|news\.ycombinator\.com|newsshowcase|nexopia|ngopost\.org|niconico|nicovideo\.jp|nightlifelink|nightlifelink\.com|ning|ning\.com|nl\.pinterest\.com|odnoklassniki\.ru|odnoklassniki\.ua|okwave\.jp|old\.reddit\.com|oneworldgroup\.org|onstartups|onstartups\.com|opendiary|opendiary\.com|oshiete\.goo\.ne\.jp|out\.reddit\.com|over-blog\.com|overblog\.com|paper\.li|partyflock\.nl|photobucket|photobucket\.com|pinboard|pinboard\.in|pingsta|pingsta\.com|pinterest|pinterest\.at|pinterest\.ca|pinterest\.ch|pinterest\.cl|pinterest\.co\.kr|pinterest\.co\.uk|pinterest\.com|pinterest\.com\.au|pinterest\.com\.mx|pinterest\.de|pinterest\.es|pinterest\.fr|pinterest\.it|pinterest\.jp|pinterest\.nz|pinterest\.ph|pinterest\.pt|pinterest\.ru|pinterest\.se|pixiv\.net|pl\.pinterest\.com|playahead\.se|plurk|plurk\.com|plus\.google\.com|plus\.url\.google\.com|pocket\.co|posterous|posterous\.com|pro\.homeadvisor\.com|pulse\.yahoo\.com|qapacity|qapacity\.com|quechup|quechup\.com|quora|quora\.com|qzone\.qq\.com|ravelry|ravelry\.com|reddit|reddit\.com|redux|redux\.com|renren|renren\.com|researchgate\.net|reunion|reunion\.com|reverbnation|reverbnation\.com|rtl\.de|ryze|ryze\.com|salespider|salespider\.com|scoop\.it|screenrant|screenrant\.com|scribd|scribd\.com|scvngr|scvngr\.com|secondlife|secondlife\.com|serverfault|serverfault\.com|shareit|sharethis|sharethis\.com|shvoong\.com|sites\.google\.com|skype|skyrock|skyrock\.com|slashdot\.org|slideshare\.net|smartnews\.com|snapchat|snapchat\.com|social|sociallife\.com\.br|socialvibe|socialvibe\.com|spaces\.live\.com|spoke|spoke\.com|spruz|spruz\.com|ssense\.com|stackapps|stackapps\.com|stackexchange|stackexchange\.com|stackoverflow|stackoverflow\.com|stardoll\.com|stickam|stickam\.com|studivz\.net|suomi24\.fi|superuser|superuser\.com|sweeva|sweeva\.com|t\.co|t\.me|tagged|tagged\.com|taggedmail|taggedmail\.com|talkbiznow|talkbiznow\.com|taringa\.net|techmeme|techmeme\.com|tencent|tencent\.com|tiktok|tiktok\.com|tinyurl|tinyurl\.com|toolbox|toolbox\.com|touch\.facebook\.com|tr\.pinterest\.com|travellerspoint|travellerspoint\.com|tripadvisor|tripadvisor\.com|trombi|trombi\.com|trustpilot|tudou|tudou\.com|tuenti|tuenti\.com|tumblr|tumblr\.com|tweetdeck|tweetdeck\.com|twitter|twitter\.com|twoo\.com|typepad|typepad\.com|unblog\.fr|urbanspoon\.com|ushareit\.com|ushi\.cn|vampirefreaks|vampirefreaks\.com|vampirerave|vampirerave\.com|vg\.no|video\.ibm\.com|vk\.com|vkontakte\.ru|wakoopa|wakoopa\.com|wattpad|wattpad\.com|web\.facebook\.com|web\.skype\.com|webshots|webshots\.com|wechat|wechat\.com|weebly|weebly\.com|weibo|weibo\.com|wer-weiss-was\.de|weread|weread\.com|whatsapp|whatsapp\.com|wiki\.answers\.com|wikihow\.com|wikitravel\.org|woot\.com|wordpress|wordpress\.com|wordpress\.org|xanga|xanga\.com|xing|xing\.com|yahoo-mbga\.jp|yammer|yammer\.com|yelp|yelp\.co\.uk|yelp\.com|youroom\.in|za\.pinterest\.com|zalo|zoo\.gr|zooppa|zooppa\.com)$", "i").test(v.utmSource) || new RegExp("^(?:social|social-network|social-media|sm|social network|social media)$", "i").test(v.utmMedium)},{"name":"organic-video","test":(v) => new RegExp("^(?:blog\.twitch\.tv|crackle|crackle\.com|curiositystream|curiositystream\.com|d\.tube|dailymotion|dailymotion\.com|dashboard\.twitch\.tv|disneyplus|disneyplus\.com|fast\.wistia\.net|help\.hulu\.com|help\.netflix\.com|hulu|hulu\.com|id\.twitch\.tv|iq\.com|iqiyi|iqiyi\.com|jobs\.netflix\.com|justin\.tv|m\.twitch\.tv|m\.youtube\.com|music\.youtube\.com|netflix|netflix\.com|player\.twitch\.tv|player\.vimeo\.com|ted|ted\.com|twitch|twitch\.tv|utreon|utreon\.com|veoh|veoh\.com|viadeo\.journaldunet\.com|vimeo|vimeo\.com|wistia|wistia\.com|youku|youku\.com|youtube|youtube\.com)$", "i").test(v.utmSource) || new RegExp("^(.*video.*)$", "i").test(v.utmMedium)},{"name":"organic-search","test":(v) => new RegExp("^(?:360\.cn|alice|aol|ar\.search\.yahoo\.com|ask|at\.search\.yahoo\.com|au\.search\.yahoo\.com|auone|avg|babylon|baidu|biglobe|biglobe\.co\.jp|biglobe\.ne\.jp|bing|br\.search\.yahoo\.com|ca\.search\.yahoo\.com|centrum\.cz|ch\.search\.yahoo\.com|cl\.search\.yahoo\.com|cn\.bing\.com|cnn|co\.search\.yahoo\.com|comcast|conduit|daum|daum\.net|de\.search\.yahoo\.com|dk\.search\.yahoo\.com|dogpile|dogpile\.com|duckduckgo|ecosia\.org|email\.seznam\.cz|eniro|es\.search\.yahoo\.com|espanol\.search\.yahoo\.com|exalead\.com|excite\.com|fi\.search\.yahoo\.com|firmy\.cz|fr\.search\.yahoo\.com|globo|go\.mail\.ru|google|google-play|hk\.search\.yahoo\.com|id\.search\.yahoo\.com|in\.search\.yahoo\.com|incredimail|it\.search\.yahoo\.com|kvasir|lens\.google\.com|lite\.qwant\.com|lycos|m\.baidu\.com|m\.naver\.com|m\.search\.naver\.com|m\.sogou\.com|mail\.rambler\.ru|mail\.yandex\.ru|malaysia\.search\.yahoo\.com|msn|msn\.com|mx\.search\.yahoo\.com|najdi|naver|naver\.com|news\.google\.com|nl\.search\.yahoo\.com|no\.search\.yahoo\.com|ntp\.msn\.com|nz\.search\.yahoo\.com|onet|onet\.pl|pe\.search\.yahoo\.com|ph\.search\.yahoo\.com|pl\.search\.yahoo\.com|play\.google\.com|qwant|qwant\.com|rakuten|rakuten\.co\.jp|rambler|rambler\.ru|se\.search\.yahoo\.com|search-results|search\.aol\.co\.uk|search\.aol\.com|search\.google\.com|search\.smt\.docomo\.ne\.jp|search\.ukr\.net|secureurl\.ukr\.net|seznam|seznam\.cz|sg\.search\.yahoo\.com|so\.com|sogou|sogou\.com|sp-web\.search\.auone\.jp|startsiden|startsiden\.no|suche\.aol\.de|terra|th\.search\.yahoo\.com|tr\.search\.yahoo\.com|tut\.by|tw\.search\.yahoo\.com|uk\.search\.yahoo\.com|ukr|us\.search\.yahoo\.com|virgilio|vn\.search\.yahoo\.com|wap\.sogou\.com|webmaster\.yandex\.ru|websearch\.rakuten\.co\.jp|yahoo|yahoo\.co\.jp|yahoo\.com|yandex|yandex\.by|yandex\.com|yandex\.com\.tr|yandex\.fr|yandex\.kz|yandex\.ru|yandex\.ua|yandex\.uz|zen\.yandex\.ru)$", "i").test(v.utmSource) || v.utmMedium.toLowerCase() === "organic"},{"name":"referral","test":(v) => new RegExp("^(?:referral|app|link)$", "i").test(v.utmMedium)},{"name":"email","test":(v) => new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmMedium) || new RegExp("^(?:email|e-mail|e_mail|e mail)$", "i").test(v.utmSource)},{"name":"affiliate","test":(v) => v.utmMedium.toLowerCase() === "affiliate"},{"name":"audio","test":(v) => v.utmMedium.toLowerCase() === "audio"},{"name":"sms","test":(v) => v.utmSource.toLowerCase() === "sms" || v.utmMedium.toLowerCase() === "sms"},{"name":"mobile-push-notification","test":(v) => v.utmSource.toLowerCase() === "firebase" || new RegExp("(?:.*mobile.*|.*notification.*|push$)", "i").test(v.utmMedium)}].find(i=>i.test(e))?.name??"other"}getShopifyAnalyticsId(){const e=this.getCookie("_shopify_y");if(e)return e;try{const t=this.localStorageGet("Shoplift_ClientId");if(t)return t}catch{}return null}legacyGetCookieVisitor(){const e=this.getCookie("SHOPLIFT");return e===null?null:JSON.parse(e,F)}getCookie(e,t=this.cookie){const i=t.split("; ").filter(s=>s.split("=").at(0)===e).at(0);return i===void 0?null:i.split("=").slice(1).join("=")}monitorConsentChange(){document.addEventListener("visitorConsentCollected",e=>{(async()=>await this.onConsentChange(e.detail.analyticsAllowed,!0))()}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.loadShopifyConsentApiWithRetry()):this.loadShopifyConsentApiWithRetry()}loadShopifyConsentApiWithRetry(){let e=0;const t=()=>{this.loadShopifyConsentApi()||e++<10&&window.setTimeout(t,100)};t()}loadShopifyConsentApi(){if(window.Shopify){this.log("Loading Shopify features");const e=async()=>{if(!window.Shopify){this.log("Shopify object missing... suddenly?");return}if(window.Shopify.customerPrivacy===void 0){this.log("Shopify CustomerPrivacy api still missing, trying again in 1000ms"),t=window.setTimeout(()=>{(async()=>await e())()},1e3);return}if(this.geoViaShopify){const n=window.Shopify.customerPrivacy.getRegion?.();this.resolvedRegion=typeof n=="string"?n.replace(/-/g,""):""}const i=window.Shopify.customerPrivacy.getTrackingConsent(),s=window.Shopify.customerPrivacy.analyticsProcessingAllowed();await this.onConsentChange(s,i==="yes",!s&&i!=="no_interaction")};let t=window.setTimeout(()=>{(async()=>await e())()},5e3);return window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i=>{(async()=>{if(window.clearTimeout(t),i){this.log("Error loading consent tracking",i);return}await e()})()}),!0}return!1}async onConsentChange(e,t,i=!e&&t){try{if(this.log("Consent change detected",e,t),this.consentAnswered=!0,this.state.essential.consentApproved=e,this.state.essential.hasConsentInteraction=t,this.consentDeclined=!e&&i,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.syncAnonConsent(),this.state.essential.anonConsent?.consent==="approved"&&delete this.state.essential.anonConsent,this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.anonymousVisitorIdEnabled&&!this.shopifyAnalyticsId&&(this.clientIdRetryCount=0),this.saveState(),await this.syncAllEvents()}catch(s){this.log("Error syncing on consent change",s)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const e=["/apps/","/tools/","/a/"],t=window.location.pathname;return e.some(i=>t.startsWith(i))}clearThemeBar(){this.log("Looking for theme bar"),this.waitForElement(null,"body").then(e=>this.waitForElement(e,"#preview-bar-iframe, #PBarNextFrameWrapper").then(t=>{this.log("Removing theme bar"),t.remove()})).catch(e=>console.error(e))}waitForElement(e,t){return new Promise(i=>{const s=document.querySelector(t);if(s){i(s);return}const n=new MutationObserver(r=>{const o=document.querySelector(t);if(o){n.disconnect(),i(o);return}});n.observe(e??document.documentElement,{childList:!0})})}setDebug(e){this.state.essential.debugMode=e,this.saveState()}log(e,...t){let i=0;const s=e.replace(/%[sdoOfF]/g,n=>{if(i>=t.length)return n;const r=t[i++];return n==="%o"||n==="%O"?JSON.stringify(r):String(r)});this.logHistory.push(`[${new Date().toISOString()}][SL] ${s}`),!(!this.state.essential.debugMode&&!this.shopliftDebug)&&console.debug(`[SL] ${e}`,...t)}debugState(){return{state:this.state,storage:{essential:this.loadLocalStorage(this.essentialSessionKey),analytics:this.loadLocalStorage(this.analyticsSessionKey)},params:{shop:this.shop,host:this.host,eventHost:this.eventHost,cssHideClass:this.cssHideClass,testConfigs:this.testConfigs,inactiveTestConfigs:this.inactiveTestConfigs,sendPageView:this.sendPageView,isShopifyMerchantCookie:this.getCookie("is_shopify_merchant"),themeId,url:window.location.href,isThemePreview,themeRole,gaConfig:this.gaConfig},logHistory:this.logHistory}}createViewportObserver(e,t={}){const{threshold:i=this.VIEWPORT_TRACK_THRESHOLD,triggerOnce:s=!0}=t,n=new Set;return new IntersectionObserver(r=>{r.forEach(o=>{if(o.isIntersecting&&!n.has(o.target)){const c=o.target,l=c.getAttribute(this.DATA_SL_TEST_ID);l&&(e(l,c),s&&n.add(c))}})},{threshold:i})}applyChangesWithViewport(e,t,i,s){const n=t.selectorsForViewportTracking??t.selectors,r=o=>{if(this.state.essential.visitorTests.some(u=>u.testId===o)||this.activeViewportObservers.has(o))return;const c=[];if(n.forEach(u=>{e.querySelectorAll(u.cssSelector).forEach(b=>c.push(b))}),c.length===0)return;let l=!1;const d=()=>{l||(l=!0,i(o),p.disconnect(),this.activeViewportObservers.delete(o))},p=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(o,p),this.log(`Created viewport observer for test ${o}, observing ${c.length} elements`),c.forEach(u=>{u.setAttribute(this.DATA_SL_TEST_ID,String(o)),p.observe(u)}),setTimeout(()=>{l||c.forEach(u=>{const h=u.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,k=Math.min(h.bottom,window.innerHeight)-Math.max(h.top,0),C=Math.min(h.right,window.innerWidth)-Math.max(h.left,0);h.top<window.innerHeight&&h.bottom>0&&h.left<window.innerWidth&&h.right>0&&k>0&&C>0&&k>=h.height*b&&(this.log(`Price element already visible in viewport for test ${o}:`,u),d())})},100)};t.selectors.length>0&&N(e,t,()=>{}),Re(e,{testId:t.testId,hypothesisId:t.hypothesisId,selectors:n},o=>{r(o)})}applyPriceTestWithMapLookup(e,t,i,s){if(!t.priceData){this.log("No price data for hypothesis '%s'",t.id);return}this.log("Hypothesis '%s' isControl=%s, priceData has %d variants",t.id,t.isControl,t.priceData.variants.length);const n=t.priceData.variants.slice(0,3);for(const[C,P,_]of n)this.log(" Sample priceData: variant=%s, price=%d, compareAt=%d",C,P,_);const r=J(t.priceData),o=new Set;for(const C of i)if(C.priceData)for(const[P]of C.priceData.variants)o.add(P);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",r.size,o.size);const c=t.priceData,l=new WeakSet;let d=!1;const p="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",u=C=>{if(l.has(C))return;const P=C.getAttribute("data-sl-attribute-p"),_=C.getAttribute("data-sl-attribute-cap"),S=C.getAttribute("data-sl-attribute-discount"),f=P||_||S;if(!f||!o.has(f))return;l.add(C);const y=r.get(f);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",f,y.priceInCents,y.compareAtPriceInCents),ze(C,f,y,c),this.log("Applied price to element for product %s",f)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===e)&&(C.setAttribute(this.DATA_SL_TEST_ID,String(e)),this.setupElementViewportTracking(C,e,()=>{d||(d=!0,s(e))}))},h=()=>{const C=document.querySelectorAll(p);this.log("Scanning for price elements, found: %d",C.length),C.forEach(u)},b=new MutationObserver(C=>{for(const P of C)P.type==="childList"&&P.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const S=_;(S.hasAttribute("data-sl-attribute-p")||S.hasAttribute("data-sl-attribute-cap")||S.hasAttribute("data-sl-attribute-discount"))&&u(S),S.querySelectorAll(p).forEach(u)}}),P.type==="attributes"&&P.target instanceof Element&&u(P.target)}),k=document.body||document.documentElement;b.observe(k,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sl-attribute-p","data-sl-attribute-cap","data-sl-attribute-discount"]}),this.log("MutationObserver started for price elements"),h(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),h()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),h()},100),setTimeout(()=>{this.log("Final rescan for price elements"),h()},500)}setupElementViewportTracking(e,t,i){const s=this.VIEWPORT_TRACK_THRESHOLD,n=e.getBoundingClientRect(),r=Math.min(n.bottom,window.innerHeight)-Math.max(n.top,0),o=Math.min(n.right,window.innerWidth)-Math.max(n.left,0);if(n.top<window.innerHeight&&n.bottom>0&&n.left<window.innerWidth&&n.right>0&&r>0&&o>0&&r>=n.height*s){this.log("Price element already visible for test %s",t),i();return}const l=new IntersectionObserver(d=>{for(const p of d)if(p.isIntersecting&&p.intersectionRatio>=s){this.log("Price element entered viewport for test %s",t),l.disconnect(),i();break}},{threshold:s});l.observe(e)}debug(){const e=this.debugState();console.log(JSON.stringify(e,Be,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new pt("homeceuconnection.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",false,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[],[],null,true,true,false,false,false),await window.shopliftInstance.init())})();async function ht(a,e,t,i){const s=Qe({log:i});if(t)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const n=a.widget.widgetType,r=e?J(e):null;let o=G(e),c=Y(a,o),l=c.discountMap,d=c.maxDiscount;function p(){const g=G(e);g!==o&&(o=g,c=Y(a,o),l=c.discountMap,d=c.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${o??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${o??"n/a"}, maxDiscount=${d}`);function u(g){if(!e||!r)return null;const v=X(r),m=v?r.get(v):void 0;return m?{formattedVariantPrice:K(m.priceInCents,e),formattedDiscounted:K(m.priceInCents*(1-g/100),e)}:null}function h(g){const v=Z(a,g);if(!v)return d;const m=D(a,"subscriptionInput"),I=m.length?m[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${I}:checked`);if(A){const E=l[A.value];if(E!==void 0)return E}return d}function b(g){const v=D(a,"subscriptionDiscount");for(const m of v)if(m.selector.includes("badge")||m.selector.includes("__badge")){const I=g.querySelector(m.selector);I?.textContent&&!I.textContent.includes(`${d}%`)&&$(I,A=>U(A,d))}}function k(g,v){const m=u(v);if(!m)return;const I=D(a,"subscriptionCompareAt");for(const A of I){const E=g.querySelector(A.selector)||g.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(m.formattedVariantPrice)&&$(E,x=>/\d/.test(x)?m.formattedVariantPrice:x)}}function C(g,v){const m=u(v);if(!m)return;const I=D(a,"subscriptionPrice");for(const A of I){const E=g.querySelector(A.selector)||g.querySelector(`[part~="${A.selector}"]`);E?.textContent&&!E.textContent.includes(m.formattedDiscounted)&&$(E,x=>/\d/.test(x)?m.formattedDiscounted:x)}}function P(g){const v=D(a,"subscriptionInput"),m=v.length?v[0].selector:'input[name="rc_plan"]',I=D(a,"subscriptionPlanDiscount"),A=I.length?I[0].selector:".rc-plans-button__discount";for(const E of Array.from(g.querySelectorAll("label"))){const x=E.querySelector(m),R=E.querySelector(A);if(x&&R?.textContent){const V=l[x.value];if(V!==void 0){const L=R.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${V}%`&&$(R,O=>U(O,V))}}}}function _(g){const v=g.querySelector("select");if(v)for(const m of Array.from(v.options)){const I=l[m.value];if(I!==void 0&&m.textContent){const A=m.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${I}%`&&(m.textContent=U(m.textContent,I))}}}function S(g){const v=D(a,"onetimePrice");if(!v.length||!e||!r)return;const m=X(r),I=m?r.get(m):void 0;if(!I)return;const A=K(I.priceInCents,e),E=D(a,"onetimeContainer"),x=E.length?E[0].selector:'[part~="rc-purchase-option__onetime"]',R=g.querySelector(x);if(R)for(const V of v){const L=R.querySelector(`[part~="${V.selector}"]`);L?.textContent&&!L.textContent.includes(A)&&$(L,O=>/\d/.test(O)?A:O)}}function f(g,v){const I=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of I){const E=g.querySelector(A.selector);if(E?.shadowRoot){for(const x of Array.from(E.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>U(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{p();const g=z(a);if(!g)return;const v=h(g);b(g),k(g,v),C(g,v),S(g);const m=Z(a,g);m&&(n==="buttons"||n==="radio"?P(m):_(m)),f(g,v)}finally{y=!1}}}const T=me({data:a,runUpdates:w});return function(){T(),s()}}const ut=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:ht},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "", type: "product" }, "main", 188791652640, false)</script>
Whether you're looking to fulfill your CE for licensure renewal, expand your skill set, or stay updated with the latest advancements in the field, HomeCEU provides convenient access to high-quality continuing education. Join thousands of satisfied occupational therapy professionals who have chosen HomeCEU as their trusted partner in professional development.
Unlimited CE Membership for Occupational Therapy
1-Year Unlimited Access to All Courses
$247
Unit price /
Unavailable
Add to Cart
Quick View
$247
Unit price /
Unavailable
Add to Cart
Quick View
Diverse learning experiences through online text, video, and live webinar formats.
Provides practical and actionable insights through case studies, demonstrative patient videos, and scenario-based learning.
Courses cover a spectrum of topics across various practice areas, including sensory integration, hand therapy, behavioral techniques, assistive technology, and more!
Test without stress with unlimited pass attempts on continuing education exams.