PageSourceSearch

https://oxfordhealthspan.com/blogs/aging-well

html oxfordhealthspan.com collected 2026-10-03 19:42:27 UTC 317,882 bytes, 1,762 lines download raw bytes

1<!doctype html>
2
3<html class="no-js" lang="en" data-country="US" dir="ltr">
4  <head>
5
6    
7    
8    
9    
10    
11      
12      
13    
14  
15<!-- Start of Shoplift scripts -->
16<!-- 2026-05-07T22:04:35.9816302Z -->
17<style>.shoplift-hide { opacity: 0 !important; }</style>
18<style id="sl-preview-bar-hide">#preview-bar-iframe, #PBarNextFrameWrapper { display: none !important; }</style>
19<script type="text/javascript">(function(rootPath, template, themeRole, themeId, isThemePreview){ /* Generated on 2026-10-03T19:30:01.1304987Z */(function(){"use strict";var te=document.createElement("style");te.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(te);var fe=" daum[ /]| deusu/|(?:^|[^g])news(?!sapphire)|(?<! channel/|google/)google(?!(?:wv|app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!cam)scan|(?<!lib)http|24x
197|;\\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/",ge=/bot|crawl|http|lighthouse|scan|search|spider/i,z;function me(){if(z instanceof RegExp)return z;try{z=new RegExp(fe,"i")}catch{z=ge}return z}var ye=a=>typeof a=="string"&&a!=="";function ve(a){return ye(a)&&me().test(a)}var we=ve;class X{timestamp;constructor(){this.timestamp=new Date}}class be extends X{type;testId;hypothesisId;constructor(e,t,i){super(),this.type=3,this.testId=e,this.hypothesisId=t,this.timestamp=i}}class Se extends X{type;path;constructor(e){super(),this.type=4,this.path=e}}class Ce extends X{type;cart;constructor(e){super(),this.type=5,this.cart=e}}class ie extends Error{isBot;constructor(){super(),this.isBot=!0}}function Te(a,e,t){for(const i of e.selectors){const s=a.querySelectorAll(i.cssSelector);for(let r=0;r<s.length;r++)t(e.testId,e.hypothesisId)}re(a,e,(i,s,r,o,n)=>n(s,r),t)}function U(a,e,t){for(const i of e.selectors)ne(a,e.testId,e.hypothesisId,i,t??(()=>{}));re(a,e,ne,t??(()=>{}))}function se(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 re(a,e,t,i){new MutationObserver(()=>{for(const r of e.selectors)t(a,e.testId,e.hypothesisId,r,i)}).observe(a.documentElement,{childList:!0,subtree:!0})}function ne(a,e,t,i,s){const r=a.querySelectorAll(i.cssSelector);for(let o=0;o<r.length;o++){let n=r.item(o);if(n instanceof HTMLElement&&n.dataset.shoplift!==""){n.dataset.shoplift="";for(const l of i.actions.sort(Re))n=Ie(a,i.cssSelector,n,l)}}return r.length>0&&s?(s(e,t),!0):!1}function Ie(a,e,t,i){switch(i.type){case"innerHtml":t.innerHTML=i.value;break;case"attribute":Pe(t,i.scope,i.value);break;case"css":Ae(a,e,i.value);break;case"js":ke(a,t,i);break;case"copy":return Ee(t);case"remove":xe(t);break;case"move":_e(t,parseInt(i.value));break}return t}function Pe(a,e,t){a.setAttribute(e,t)}function Ae(a,e,t){const i=a.createElement("style");i.innerHTML=`${e} { ${t} }`,a.getElementsByTagName("head")[0]?.appendChild(i)}function ke(a,e,t){Function("document","element",`"use strict"; ${t.value}`)(a,e)}function Ee(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 xe(a){a.remove()}function _e(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 Re(a,e){return oe(a)-oe(e)}function oe(a){return a.type==="copy"||a.type==="remove"?0:1}
19const M={Template:0,UrlRedirect:2,Script:3,Price:5},De="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",Oe="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 Ve(a){let e=a.replace(/-/g,"+").replace(/_/g,"/");for(;e.length%4;)e+="=";const t=atob(e),i=Uint8Array.from(t,o=>
19o.charCodeAt(0)),s=new Blob([i]).stream().pipeThrough(new DecompressionStream("gzip")),r=await new Response(s).text();return JSON.parse(r)}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 ee(a,e){return e}function q(a,e=!1,t=!1,i=","){const s=a/100;if(t){const o=Math.round(s).toLocaleString("en-US");return i!==","?o.replace(/,/g,i):o}else{const r=e?",":".",o=s.toFixed(2).split("."),n=parseInt(o[0],10),l=o[1]??"00",c=n.toLocaleString("en-US");return i!==","?`${c.replace(/,/g,i)}${r}${l}`:e?`${c.replace(/,/g,".")}${r}${l}`:`${c}${r}${l}`}}function H(a,e,t,i){const s=e.replace("{{amount}}",q(a,!1,!1)).replace("{{amount_no_decimals}}",q(a,!1,!0)).replace("{{amount_with_comma_separator}}",q(a,!0,!1)).replace("{{amount_no_decimals_with_comma_separator}}",q(a,!0,!0)).replace("{{amount_with_space_separator}}",q(a,!1,!1," ")).replace("{{amount_no_decimals_with_space_separator}}",q(a,!1,!0," ")).replace("{{amount_with_apostrophe_separator}}",q(a,!1,!1,"'")).replace("{{amount_no_decimals_with_apostrophe_separator}}",q(a,!1,!0,"'")).replace("{{amount_with_period_and_space_separator}}",q(a,!1,!1,". ")).replace("{{amount_no_decimals_with_period_and_space_separator}}",q(a,!1,!0,". "));return i?`${s} ${t}`:s}function ae(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 Le(a,e,t,i){const{priceInCents:s,compareAtPriceInCents:r}=t,{moneyFormat:o,currency:n,currencyCodeEnabled:l}=i;if(a.getAttribute("data-sl-attribute-p")===e)a.innerHTML=H(s,o,n,l);else if(a.getAttribute("data-sl-attribute-cap")===e)r<=0||r<=s?a.remove():a.innerHTML=H(r,o,n,l);else if(a.getAttribute("data-sl-attribute-discount")===e&&!(r<=0||r<=s)){const d=Math.round((r-s)/r*100),u=ae(H(r-s,o,n,!1)),h=a.getAttribute("data-sl-format")||"percent";h==="percent"?a.textContent=`-${d}%`:h==="amount"?a.textContent=`-${u}`:h==="both"&&(a.textContent=`-${d}% (-${u})`)}}function $e(a){const e=[],t={id:"url-pattern",operator:"contains",value:"/"};for(const[i,s,r]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:H(s,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]});const o=r<=0||r<=s;if(e.push({id:`cap-${i}`,cssSelector:`[data-sl-attribute-cap="${i}"]`,urlPatterns:[t],actions:[{id:`cap-action-${i}`,type:o?"remove":"innerHtml",scope:"compare-at-price",value:o?"":H(r,a.moneyFormat,a.currency,a.currencyCodeEnabled)}]}),!o&&r>s){const n=Math.round((r-s)/r*100),l=ae(H(r-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 = '-${n}%';                    } else if (format === 'amount') {                      element.textContent = '-${l}';                    } else if (format === 'both') {                      element.textContent = '-${n}% (-${l})';                    }`}]})}}return e}const Me=a=>{let e=5381;for(let t=0;t<a.length;t++)e=(e*33^a.charCodeAt(t))>>>0;return e.toString(36)},qe=()=>Math.random().toString(36).slice(2,10)+Date.now().toString(36).slice(-4),He=a=>btoa(JSON.stringify(a)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""),K=a=>a.replace(/#slr-[a-z0-9]+$/,""),tt="modulepreload",it=function(a){return"/"+a},st={},Ne=function(e,t,i){let s=Promise.resolve();function r(o){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=o,window.dispatchEvent(n),!n.defaultPrevented)throw o}return s.then(o=>{for(const n of o||[])n.status==="rejected"&&r(n.reason);return e().catch(r)})};function le(a,e,t){const i=t?a.plans.filter(c=>!c.variantId||c.variantId===t):a.plans,s=[],r=[];for(const c of i)c.direction==="decrease"?(s.push(c.existingShopifyPlanId),r.push(c.createdShopifyPlanId)):(s.push(c.createdShopifyPlanId),r.push(c.existingShopifyPlanId));const o=e?s:r,n=e?r:s;if(t)for(const c of a.plans)for(const d of[c.existingShopifyPlanId,c.createdShopifyPlanId])d&&!o.includes(d)&&!n.includes(d)&&n.push(d);const l={};for(let c=0;c<n.length;c++){const d=n[c],u=o[c];d&&u&&(l[d]=u)}return{showPlanIds:o,hidePlanIds:n,swapMap:l}}function ce(a,e,t){const i=e?a.plans.find(r=>r.variantId===e):void 0;if(i)return i.direction;if(t){const r=a.plans.find(o=>o.productId===t);if(r)return r.direction}return a.plans.find(r=>!r.variantId)?.direction??null}function J(a,e){const t=e?a.plans.filter(r=>!r.productId||r.productId===e):a.plans,i={};for(const r of t)i[r.existingShopifyPlanId]=r.existingDiscountAmount,i[r.createdShopifyPlanId]=r.existingDiscountAmount;
19const s=Math.max(...Object.values(i),0);return{discountMap:i,maxDiscount:s}}function W(a){const e=document.querySelector('form[action*="/cart/add"] input[name="product-id"]')?.value;if(e)return e;if(a){for(const r of Array.from(document.querySelectorAll("[data-sl-attribute-p]"))){const o=r.getAttribute("data-sl-attribute-p");if(!o)continue;const n=a.variants.find(l=>l[0]===o);if(n?.[3])return n[3]}const s=document.querySelector('form[action*="/cart/add"] input[name="id"]')?.value;if(s){const r=a.variants.find(o=>o[0]===s);if(r?.[3])return r[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 N(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 de(a,e){return a===null?!1:a==="decrease"?!e:e}async function Ue(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,r=[...new Set(i.plans.map(d=>d.direction))].join(",");a.log(`[SUB-SWAP] ${s?"A":"B"} side, directions=${r}`);const o=i.plans.some(d=>d.variantId);let n=!1,l=!1;function c(){if(!l){l=!0;try{const d=o?document.querySelector("select[name='id'], input[name='id']")?.value:void 0,{showPlanIds:u,hidePlanIds:h,swapMap:p}=le(i,s,d);a.swapMap=p;const b=D(i,"widgetParent"),E=D(i,"subscriptionPlans"),S=D(i,"subscriptionInput");if(!b.length||!E.length||!S.length)return;const C=document.querySelector(b[0].selector);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(E[0].selector);if(!_?.shadowRoot)return;const T=S[0].selector;let m=null;if(i.widget.widgetType==="buttons"||i.widget.widgetType==="radio"){const y=Array.from(_.shadowRoot.querySelectorAll(T));if(!y.length)return;for(const v of y){const g=v.closest("label");g&&(u.includes(v.value)?g.style.display="":h.includes(v.value)&&(g.style.display="none"))}const w=y.some(v=>u.includes(v.value)&&v.checked),I=y.some(v=>h.includes(v.value)&&v.checked);if((w||I)&&(n=!1),!w&&!n){n=!0;for(const v of y)if(u.includes(v.value)){v.closest("label")?.click(),v.dispatchEvent(new Event("change",{bubbles:!0}));break}}const f=y.find(v=>v.checked);m=f&&u.includes(f.value)?f.value:u[0]??null}else if(i.widget.widgetType==="dropdown"){const y=_.shadowRoot.querySelector("select");if(!y)return;for(const w of Array.from(y.options))h.includes(w.value)&&(w.style.display="none",w.disabled=!0);if(h.includes(y.value)){const w=Array.from(y.options).find(I=>u.includes(I.value));w&&(y.value=w.value,y.dispatchEvent(new Event("change",{bubbles:!0})))}m=u.includes(y.value)?y.value:u[0]??null}if(m){const y=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const w of y)w.value!==m&&(w.value=m)}}finally{l=!1}}}if(a.subscriptionHideWrongPlans=c,a.swapMap=le(i,s).swapMap,c(),o){const d=document.querySelector("select[name='id'], input[name='id']");d&&d.addEventListener("change",c)}}function B(a){const e=D(a,"widgetParent");return e.length?document.querySelector(e[0].selector)?.shadowRoot??null:null}function Y(a,e){const t=D(a,"subscriptionPlans");return t.length?e.querySelector(t[0].selector)?.shadowRoot??null:null}function Z(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 G(a,e){return H(a,e.moneyFormat,e.currency,e.currencyCodeEnabled)}function Fe({originalFetch:a,swapMap:e,slptValue:t,getSelectedPlanId:i,log:s}){if(window.fetch.__shoplift_intercepted)return s("[SUB-INTERCEPT] already installed — skipping"),()=>{};function r(n){if(i){const l=i();if(l)return e[l]??l}return e[n]??n}const o=function(n,l){if((typeof n=="string"?n:n instanceof URL?n.href:n.url).includes("/cart/add")&&l?.body)try{if(l.body instanceof FormData){const d=l.body.get("selling_plan");d?l.body.set("selling_plan",r(String(d))):(!d||d==="")&&t&&l.body.set("properties[_slpt]",t)}
19else if(typeof l.body=="string"){const d=JSON.parse(l.body);if(d.items)for(const u of d.items){const h=String(u.selling_plan??"");h?u.selling_plan=r(h):!u.selling_plan&&t&&(u.properties||(u.properties={}),u.properties._slpt=t)}else if(d.id){const u=String(d.selling_plan??"");u?d.selling_plan=r(u):!d.selling_plan&&t&&(d.properties||(d.properties={}),d.properties._slpt=t)}l.body=JSON.stringify(d)}}catch(d){s("[SUB-INTERCEPT] body parse failed; cart-add proceeds with un-swapped plan",d)}return a.call(window,n,l)};return o.__shoplift_intercepted=!0,window.fetch=o,function(){window.fetch===o&&(window.fetch=a)}}function Be({log:a}){if(window.fetch.__shoplift_intercepted)return a("[SUB-PREVIEW-BLOCK] already installed — skipping"),()=>{};const e=window.fetch,t=function(i,s){const r=typeof i=="string"?i:i instanceof URL?i.href:i.url;return r.includes("/cart/add")?(a("[SUB-PREVIEW-BLOCK] cart-add blocked in preview mode",{url:r}),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 pe({data:a,runUpdates:e,debounceMs:t=150}){let i=null;function s(){i&&clearTimeout(i),e(),i=setTimeout(e,t)}let r=null;const o=[],n={childList:!0,subtree:!0,characterData:!0,attributes:!0};function l(h){for(const p of o)p.disconnect();o.length=0;for(const p of Array.from(h.querySelectorAll("*")))if(p.shadowRoot){const b=new MutationObserver(s);b.observe(p.shadowRoot,n),o.push(b)}}function c(){const h=B(a);return h?(r&&r.disconnect(),l(h),r=new MutationObserver(p=>{p.some(b=>b.type==="childList"&&b.addedNodes.length>0)&&l(h),s()}),r.observe(h,n),!0):!1}const d=document.body||document.documentElement,u=new MutationObserver(()=>{c()&&s()});return u.observe(d,{childList:!0,subtree:!0}),c()&&s(),e(),function(){i&&(clearTimeout(i),i=null),u.disconnect(),r&&(r.disconnect(),r=null);for(const p of o)p.disconnect();o.length=0}}async function ze(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 r=t?.subscriptionData?e.testId:i.testId;a.subscriptionPriceDone=!0;const o=s.subscriptionData,n=s.isControl,l=s.priceData,c=o.widget.widgetType;let d=W(l),u=J(o,d),h=u.discountMap,p=u.maxDiscount;function b(){const g=W(l);g!==d&&(d=g,u=J(o,d),h=u.discountMap,p=u.maxDiscount,a.log(`[SUB-PRICE] scope refreshed side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`))}a.log(`[SUB-PRICE] side=${n?"A":"B"}, currentProductId=${d??"n/a"}, maxDiscount=${p}`),a.updatePriceTestHiddenInputs(r,n?"control":"variant",!1);function E(){if(!l)return null;const g=j(l),P=Z(g),A=ce(o,P,d);if(!de(A,n))return null;const k=P?g.get(P):void 0;return k?{formattedVariantPrice:G(k.priceInCents,l),formattedDiscounted:G(k.priceInCents*(1-p/100),l)}:null}Fe({originalFetch:a.fetch,swapMap:a.swapMap??{},slptValue:a.slptValue??void 0,log:a.log,getSelectedPlanId:()=>{const g=B(o);if(!g)return null;const P=Y(o,g);if(!P)return null;const A=D(o,"subscriptionInput"),k=A.length?A[0].selector:'input[name="rc_plan"]';return P.querySelector(`${k}:checked`)?.value??null}});function S(g){const P=D(o,"subscriptionDiscount");for(const A of P)if(A.selector.includes("badge")||A.selector.includes("__badge")){const k=g.querySelector(A.selector);k?.textContent&&!k.textContent.includes(`${p}%`)&&$(k,x=>N(x,p))}}function C(g){const P=E();if(!P)return;const A=D(o,"subscriptionCompareAt");for(const k of A){const x=g.querySelector(k.selector)||g.querySelector(`[part~="${k.selector}"]`);x?.textContent&&!x.textContent.includes(P.formattedVariantPrice)&&$(x,R=>/\d/.test(R)?P.formattedVariantPrice:R)}}function _(g,P){const A=D(o,"subscriptionCompareAt"),k=P===0?"none":"";for(const x of A){const R=g.querySelector(x.selector)||g.querySelector(`[part~="${x.selector}"]`);R&&(k==="none"?R.style.display!=="none"&&(R.style.display="none"):R.style.display==="none"&&(R.style.display=""))}}function T(g){const P=D(o,"subscriptionInput"),A=P.length?P[0].selector:'input[name="rc_plan"]',k=D(o,"subscriptionPlanDiscount"),x=k.length?k[0].selector:".rc-plans-button__discount";for(const R of Array.from(g.querySelectorAll("label"))){const V=R.querySelector(A),O=R.querySelector(x);if(V&&O){const L=h[V.value];if(L!==void 0){if(L===0)O.style.display!=="none"&&(O.style.display="none");else if(O.style.display==="none"&&(O.style.display=""),O.textContent){const Q=O.textContent.match(/[\d.]+%/)?.[0];Q&&Q!==`${L}%`&&$(O,et=>N(et,L))}}}}}function m(g){const P=g.querySelector("select");if(P)for(const A of Array.from(P.options)){const k=h[A.value];if(k!==void 0&&A.textContent){const x=A.textContent.match(/[\d.]+%/)?.[0];x&&x!==`${k}%`&&(A.textContent=N(A.textContent,k))}}}function y(g,P){const k=D(o,"subscriptionDiscount").filter(x=>x.selector.includes("benefit")||x.selector==="rc-benefits");for(const x of k){const R=g.querySelector(x.selector);if(R?.shadowRoot){for(const V of Array.from(R.shadowRoot.querySelectorAll("li")))if(V.textContent?.includes("Save")){const O=V;if(P===0)O.style.display!=="none"&&(O.style.display="none");else{O.style.display==="none"&&(O.style.display="");const L=V.textContent.match(/[\d.]+%/)?.[0];L&&L!==`${P}%`&&$(V,Q=>N(Q,P))}}}}}let w=!1;function I(){if(!w){w=!0;try{if(b(),d!==null&&Object.keys(h).length===0)return;const g=B(o);if(!g)return;S(g),l&&C(g);const P=Y(o,g);let A=p;if(P){const k=D(o,"subscriptionInput"),x=k.length?k[0].selector:'input[name="rc_plan"]',R=P.querySelector(`${x}:checked`);if(R){const V=h[R.value];V!==void 0&&(A=V)}c==="buttons"||c==="radio"?T(P):m(P)}_(g,A),y(g,A)}finally{w=!1}}}function f(){const g=E();if(!g)return;const P=B(o);if(!P)return;const A=D(o,"onetimeToggle"),k=A.length?A[0].selector:'input[value="onetime"]';if(!P.querySelector(k)?.checked)return;const R=D(o,"subscriptionPrice");for(const V of R){const O=P.querySelector(V.selector)||P.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(g.formattedDiscounted)&&$(O,L=>/\d/.test(L)?g.formattedDiscounted:L)}}function v(){a.subscriptionHideWrongPlans&&a.subscriptionHideWrongPlans(),I(),a.subscriptionUpdateOneTime&&a.subscriptionUpdateOneTime(),f()}pe({data:o,runUpdates:v})}async function We(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(),r=i?t:s?.hy
19pothesis;if(!r?.subscriptionData||!r.priceData)return;const o=i?e.testId:s.testId;a.subscriptionOneTimeDone=!0;const n=r.subscriptionData,l=r.priceData,c=j(l),d=r.isControl,u=d?"control":"variant";a.slptValue=`${o}:${u}:f`,a.updatePriceTestHiddenInputs(o,u,!1);function h(){const p=B(n);if(!p)return;const b=Z(c);if(!b)return;const E=W(l),S=ce(n,b,E);if(!de(S,d))return;const C=c.get(b);if(!C)return;const _=H(C.priceInCents,l.moneyFormat,l.currency,l.currencyCodeEnabled),T=D(n,"onetimePrice");if(!T.length)return;const m=D(n,"onetimeContainer"),y=m.length?m[0].selector:'[part~="rc-purchase-option__onetime"]',I=p.querySelector(y)??p;for(const f of T){let v=null;try{v=I.querySelector(f.selector)}catch{v=null}v??=I.querySelector(`[part~="${f.selector}"]`),v&&v.textContent&&!v.textContent.includes(_)&&$(v,g=>/\d/.test(g)?_:g)}}a.subscriptionUpdateOneTime=h,h()}async function Ge(a,e){const{subscriptionPreviewRender:t}=await Ne(async()=>{const{subscriptionPreviewRender:i}=await Promise.resolve().then(()=>Xe);return{subscriptionPreviewRender:i}},void 0);return t(a.subscriptionData,a.priceData,a.isControl,e)}function je(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 r=t[0].selector,o=i[0].selector,n=s[0].selector;let l=!1,c=null,d=!1;function u(){if(!d){d=!0;try{h()}finally{d=!1}}}function h(){const C=document.querySelector(r);if(!C?.shadowRoot)return;const _=C.shadowRoot.querySelector(o);if(!_?.shadowRoot)return;_.shadowRoot!==c&&(c=_.shadowRoot,l=!1);let T=0;if(a.widget.widgetType==="buttons"||a.widget.widgetType==="radio"){const m=Array.from(_.shadowRoot.querySelectorAll(n));for(const f of m)if(a.planIds.includes(f.value)){f.disabled||(f.disabled=!0);const v=f.closest("label");v&&v.style.display!=="none"&&(v.style.display="none",T++)}const y=m.filter(f=>!a.planIds.includes(f.value));if(!y.some(f=>f.checked)&&!l&&y.length>0){l=!0;const f=y[0];f.closest("label")?.click(),f.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible plan input=${f.value}`)}const I=y.find(f=>f.checked)??y[0];if(I){const f=Array.from(document.querySelectorAll('input[name="selling_plan"]'));for(const v of f)v.value!==I.value&&(v.value=I.value,e(`[SUB-GLOBAL-HIDE] Mirrored plan id ${I.value} to form selling_plan input`))}}else if(a.widget.widgetType==="dropdown"){const m=_.shadowRoot.querySelector("select");if(!m)return;for(const I of Array.from(m.options))a.planIds.includes(I.value)&&(I.style.display!=="none"&&(I.style.display="none"),I.disabled||(I.disabled=!0),T++);const y=Array.from(m.options).filter(I=>!a.planIds.includes(I.value)),w=y.some(I=>I.value===m.value);y.length>0&&!w&&!l&&(l=!0,m.value=y[0].value,m.dispatchEvent(new Event("change",{bubbles:!0})),e(`[SUB-GLOBAL-HIDE] Preselected first visible option=${y[0].value}`))}T>0&&e(`[SUB-GLOBAL-HIDE] Hidden ${T} B-side plan buttons`)}const p={childList:!0,subtree:!0,characterData:!0};let b=null;function E(C){b?.disconnect(),b=new MutationObserver(()=>u()),b.observe(C,p)}function S(){const C=document.querySelector(r);if(!C?.shadowRoot)return!1;u(),new MutationObserver(()=>{u();const m=C.shadowRoot.querySelector(o);m?.shadowRoot&&E(m.shadowRoot)}).observe(C.shadowRoot,p);const T=C.shadowRoot.querySelector(o);return T?.shadowRoot&&E(T.shadowRoot),!0}if(!S()){e("[SUB-GLOBAL-HIDE] Widget not in DOM yet — waiting via MutationObserver");const C=new MutationObserver(()=>{S()&&C.disconnect()});C.observe(document.body??document.documentElement,{childList:!0,subtree:!0})}}const ue="Limited preview",Ke="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.",Je=5e3;function Ye(){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=ue;const i=document.createElement("div");i.id="shoplift-preview-subscription-warning__tooltip",i.setAttribute("role","tooltip"),i.textContent=Ke,a.appendChild(e),a.appendChild(t),a.appendChild(i),a.setAttribute("tabindex","0"),a.setAttribute("aria-describedby",i.id),a.setAttribute("aria-label",ue);let s=null;function r(){s!==null&&(clearTimeout(s),s=null)}function o(){i.classList.add("shoplift-preview-subscription-warning__tooltip--visible")}function n(){i.classList.remove("shoplift-preview-subscription-warning__tooltip--visible")}function l(){o(),r(),s=setTimeout(()=>{n(),s=null},Je)}function c(){r(),o()}function d(){s===null&&n()}a.addEventListener("mouseenter",c),a.addEventListener("mouseleave",d),a.addEventListener("focus",c),a.addEventListener("blur",d);function u(p){try{const b=p.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)&&l()}catch{}}
19document.addEventListener("click",u,!0);function h(){r(),document.removeEventListener("click",u,!0),a.removeEventListener("mouseenter",c),a.removeEventListener("mouseleave",d),a.removeEventListener("focus",c),a.removeEventListener("blur",d),a.remove()}return{root:a,tooltip:i,cleanup:h}}let he=!1;class Ze{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;getCountryTimeout;geoViaShopify;resolvedRegion=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;constructor(e,t,i,s,r,o,n,l,c,d,u,h,p,b=!1){this.shop=e,this.host=t,this.eventHost=i,this.disableReferrerOverride=l,this.logHistory=[],this.legacySessionKey=`SHOPLIFT_SESSION_${this.shop}`,this.cssHideClass=s?"shoplift-hide":"",this.testConfigs=u.map(S=>({...S,startAt:new Date(S.startAt),statusHistory:S.statusHistory.map(C=>({...C,createdAt:new Date(C.createdAt)}))})),this.inactiveTestConfigs=h,this.hiddenSubscriptionPlans=p,this.sendPageView=!!r,this.shopliftDebug=o===!0,this.telemetryEnabled=c===!0,this.geoViaShopify=b===!0,this.gaConfig=n!=={"sendEvents":false,"mode":"gtag"}?n:{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 E=this.getDeviceType();this.device=E!=="tablet"?E:"mobile",this.state=this.loadState(),this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.testsFilteredByAudience=u.filter(S=>
19S.status=="active"),this.getCountryTimeout=d===1000?1e3:d,window.__slReadCookie=S=>{const C=this.getCookie(S);if(C===null)return null;try{return decodeURIComponent(C)}catch{return C}},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 o=this.urlParams.get("isShopliftMerchant")==="true";this.log("Setting merchant session to %s",o),this.state.temporary.isMerchant=o,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,we(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=K(window.location.href)),this.state.temporary.lastSeen=e,this.persistTemporaryState(),window.__slEntryPage=this.state.temporary.entryPage??"";const i=this.state.essential.visitorTests.filter(o=>o.hypothesisId&&+o.createdAt>Date.now()-6e4);if(i.length===0)this.sendDiagnosticTelemetry("page-landed",null);else for(const o of i)this.sendDiagnosticTelemetry("page-landed",o.testId,{hypothesisId:o.hypothesisId,isControl:o.assignedTo==="control",testType:o.testType??"unknown"});if(navigator.userAgent.includes("Chrome/118")){this.log("Random: %o",[Math.random(),Math.random(),Math.random()]);const o=await this.makeRequest({url:`${this.eventHost}/api/v0/events/ip`,method:"get"}).then(n=>n?.json());this.log(`IP: ${o}`),this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify(this.debugState(),ee)}).catch()}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 o=this.state.temporary.originalReferrer;delete this.state.temporary.originalReferrer,this.persistTemporaryState(),Object.defineProperty(document,"referrer",{get:()=>o,enumerable:!0,configurable:!0})}if(await this.refreshVisitor(this.shopifyAnalyticsId),await this.handleVisitorTest()){this.log("Redirecting for visitor test");return}this.setShoplift(),this.showPage(),this.ensureCartAttributesForExistingPriceTests(!1);const r=this.state.essential.visitorTests.some(o=>(o.hypothesisId?this.getHypothesis(o.hypothesisId):void 0)?.subscriptionData!=null)||Object.values(this.state.temporary.testReservations??{}).some(o=>this.getHypothesis(o.hypothesisId)?.subscriptionData!=null);this.hiddenSubscriptionPlans&&!r&&(this.log(`[SUB-GLOBAL] Visitor not in subscription test — hiding ${this.hiddenSubscriptionPlans.planIds.length} B-side plans`),je(this.hiddenSubscriptionPlans,o=>this.log(o))),await this.subscriptionSwap(),await this.subscriptionOneTimePrice(),await this.subscriptionPriceChange(),await this.finalize(),console.log("SHOPLIFT SCRIPT INITIALIZED!")}catch(e){if(e instanceof ie)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()}
19async 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 Ve(e);if(this.state.temporary.previewConfig=t,this.state.temporary.previewConfig.testTypeCategory===M.Price){this.hidePage(!0);const s=this.state.temporary.previewConfig;let r=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/${s.isDraft||!1}`;s.shopifyProductId&&(r+=`?productId=${s.shopifyProductId}`);const o=await this.makeJsonRequest({method:"get",url:r}).catch(n=>(this.log("Error getting domSelectors",n),null));if(s.variants.forEach(n=>n.domSelectors=o[n.id]?.domSelectors),s.isDraft){const n=`${this.host}/api/dom-selectors/${s.storeId}/${s.testId}/subscription-preview`,l=await this.makeJsonRequest({method:"get",url:n}).catch(c=>(this.log("No subscription preview data for draft (test may not have a subscription widget)",c),null));l?.subscriptionData&&s.variants.forEach(c=>{c.subscriptionData=l.subscriptionData,c.priceData=l.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,r=document.createElement("div");r.id="shoplift-preview-control";const o=document.createElement("div"),n=document.createElement("img");n.src=Oe,n.height=24,n.width=14,o.style.padding="0 16px",o.style.lineHeight="100%",o.appendChild(n),r.appendChild(o);const l=document.createElement("div");l.id="shoplift-preview-variant-selector";const c=document.createElement("button");c.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(),c.appendChild(d);const u=document.createElement("span");if(u.id="shoplift-preview-variant-title",u.innerText=t?this.getDefaultVariantTitle(t):"Untitled variant "+i.toUpperCase(),c.appendChild(u),s.length>1){const b=document.createElement("img");b.src=De,b.width=12,b.height=12,b.style.height="12px",b.style.width="12px",c.appendChild(b);const E=document.createElement("div");E.className="preview-variant-menu";for(const S of e.variants.filter(C=>C.id!==e.currentVariant)){const C=document.createElement("div");C.className="preview-variant-menu--item";const _=document.createElement("div");_.className="menu-variant-label",_.style.backgroundColor=this.getVariantColor(S.label).bg,_.style.color=this.getVariantColor(S.label).text,_.style.flexShrink="0",_.innerText=S.label.toUpperCase(),C.appendChild(_);const T=document.createElement("span");T.innerText=this.getDefaultVariantTitle(S),C.appendChild(T),C.addEventListener("click",()=>{this.pickVariant(S.id)}),E.appendChild(C)}l.appendChild(E),c.addEventListener("click",()=>{E.className!=="preview-variant-menu preview-variant-menu__visible"?E.classList.add("preview-variant-menu__visible"):E.classList.remove("preview-variant-menu__visible")}),document.addEventListener("click",S=>{S.target instanceof Element&&!c.contains(S.target)&&E.className==="preview-variant-menu preview-variant-menu__visible"&&E.classList.remove("preview-variant-menu__visible")})}else c.style.pointerEvents="none",d.style.margin="0";if(l.appendChild(c),r.appendChild(l),e.hasSubscription){this.subscriptionPreviewWarningCleanup?.();const b=Ye();r.appendChild(b.root),this.subscriptionPreviewWarningCleanup=b.cleanup}const h=document.createElement("div"),p=document.createElement("button");p.id="shoplift-exit-preview-button",p.innerText="Exit",h.appendChild(p),p.addEventListener("click",()=>{this.exitPreview()}),r.appendChild(h),document.body.appendChild(r),requestAnimationFrame(()=>{r.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(r=>r.id===t.currentVariant)?.redirectUrl;if(i.pathname===s){const r=t.variants.find(o=>o.id===e)?.redirectUrl;r&&(i.pathname=r)}}if(t.testTypeCategory===M.Template){const s=t.variants.find(r=>r.id===t.currentVariant)?.pathName;if(s&&i.pathname===s){const r=t.variants.find(o=>o.id===e)?.pathName;r&&r!==s&&(i.pathname=r)}}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(r=>!r.isControl&&r.redirectUrl!==null).map(r=>r.redirectUrl),s=this.state.temporary.previewConfig.variants.find(r=>r.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(l=>l.id===t);if(!i)return!1;const s=e.variants.find(l=>l.isControl);if(!s)return!1;this.log("Setting up template preview for type",s.type);
19const r=new URL(window.location.toString()),o=r.searchParams.get("view"),n=i.type===s.type;return!n&&!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(),r.pathname=i.pathName,this.queueRedirect(r),!0):(!i.isControl&&this.typeFromTemplate()==i.type&&template.suffix===s.affix&&n&&o!==(i.affix||"__DEFAULT__")&&(this.log("Template type and affix match control, updating the view param"),r.searchParams.delete("view"),this.log("Setting the new viewParam to",i.affix||"__DEFAULT__"),this.hidePage(),r.searchParams.set("view",i.affix||"__DEFAULT__"),this.queueRedirect(r)),o!==null&&o!==(i.affix||"__DEFAULT__")&&(r.searchParams.delete("view"),this.hidePage(),this.queueRedirect(r)),!0)}handleUrlPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.id===t),s=e.variants.find(o=>o.isControl)?.redirectUrl;if(!i)return!1;this.log("Setting up URL redirect preview");const r=new URL(window.location.toString());return r.pathname===s&&!i.isControl&&i.redirectUrl!==null&&(this.log("Url matches control, redirecting"),this.hidePage(),r.pathname=i.redirectUrl,this.queueRedirect(r)),!0}handleScriptPreview(e){const t=e.currentVariant,i=e.variants.find(o=>o.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&&(U(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 Ge({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 r=this.testConfigs.find(n=>n.hypotheses.some(l=>l.id===s));if(!r)return this.log("No test found for hypothesis '%s'",s),!1;const o=this.state.essential.visitorTests.find(n=>n.testId===r.id);return o?(this.log("Active visitor test found",s),o.hypothesisId===s):(await this.manuallySplitVisitor(r),this.testConfigs.some(n=>n.hypotheses.some(l=>l.id===s&&this.state.essential.visitorTests.some(c=>c.hypothesisId===l.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:r,savedAt:o,...n}=s;return n})})}}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]);const t=this.getReservationForTest(e.id);t&&!t.isRealized&&t.entryCriteriaKey&&(this.log("Realizing manual API reservation for test '%s'",e.id),this.realizeReservationForCriteria(t.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.deriveC
19ategoryFromExistingTests(),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 l=this.considerRedirect(i);return l&&(this.log("Redirecting for current visitor test"),this.redirect(i)),l}const s=this.getReservationForCurrentPage();if(s){this.log("Found matching reservation for current page: %s",s.testId);const l=this.getHypothesis(s.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(s.entryCriteriaKey);const c=this.considerRedirect(l);return c&&this.redirect(l),c}}this.log("No active test relation for test page");const r=this.testsForUrl(this.inactiveTestConfigs.filter(l=>this.testIsPaused(l)&&l.hypotheses.some(c=>this.state.essential.visitorTests.some(d=>d.hypothesisId===c.id)))).map(l=>l.id);if(r.length>0)return this.log("Visitor has paused tests for test page, skipping test assignment: %o",r),!1;if(!this.state.temporary.testCategory){const l=this.testsFilteredByAudience.filter(d=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d))),c=this.testsFilteredByAudience.filter(d=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(d)));if(this.log("Category dice roll - global tests: %o, conditional tests: %o",l.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)})),c.map(d=>({id:d.id,title:d.title,criteria:this.getEntryCriteriaKey(d)}))),l.length>0&&c.length>0){const d=l.length,u=c.length,h=d+u,p=Math.random()*h;this.state.temporary.testCategory=p<d?"global":"conditional",this.log("Category dice roll: rolled %.2f of %d (global weight: %d, conditional weight: %d), selected '%s'",p,h,d,u,this.state.temporary.testCategory)}else l.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 o=this.state.temporary.testCategory;if(this.log("Visitor test category: %s",o),o==="global"){const l=this.testsFilteredByAudience.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:global");t=t.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}else{const l=this.testsFilteredByAudience.filter(c=>this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)));for(const c of l)this.markTestAsBlocked(c,"category:conditional");t=t.filter(c=>!this.isGlobalEntryCriteria(this.getEntryCriteriaKey(c)))}if(t.length===0)return this.log("No tests remaining after category filter"),!1;this.createReservations(t);const n=this.getReservationForCurrentPage();if(n&&!n.isRealized){const l=this.getHypothesis(n.hypothesisId);if(l){l.type!=="price"&&this.realizeReservationForCriteria(n.entryCriteriaKey);const c=this.considerRedirect(l);return c&&(this.log("Redirecting for new test"),this.redirect(l)),c}}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(p=>p.type==="price");if(this.state.essential.visitorTests.find(p=>p.testId===i.id&&p.isInvalid&&!p.hypothesisId)){if(this.log("Visitor is blocked from test '%s', applying control prices if price test",i.id),s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for blocked visitor, no metrics tracked")}),this.updatePriceTestHiddenInputs(i.id,"control",!1))}continue}const o=this.getReservationForTest(i.id);let n=null,l=!1;const c=t.find(p=>i.hypotheses.some(b=>p.id===b.id));if(o)n=this.getHypothesis(o.hypothesisId)??null,this.log("Using reserved hypothesis '%s' for test '%s'",o.hypothesisId,i.id);else if(c)n=c,this.log("Using existing hypothesis assignment for test '%s'",i.id);else if(s){const p=this.visitorActiveTestTypeWithReservations();p?(l=!0,this.log("Visitor already in test type '%s', treating as non-test for price test '%s'",p,i.id)):n=this.pickHypothesis(i)}else n=this.pickHypothesis(i);if(l&&s){const p=i.hypotheses.find(b=>b.isControl);p?.priceData&&(this.log("Applying control prices for non-test visitor on price test '%s' (Map-based)",i.id),this.applyPriceTestWithMapLookup(i.id,p,[p],()=>{this.log("Control prices applied for non-test visitor, no metrics tracked")}
19),this.updatePriceTestHiddenInputs(i.id,"control",!1));continue}if(!n){this.log("Failed to pick hypothesis for test");continue}this.sendDiagnosticTelemetry("assignment",i.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const d=i.bayesianRevision??4,u=n.type==="price",h=d>=5;if(u&&h){if(this.log(`Price test with Map-based lookup (v${d}): ${i.id}`),!n.priceData){this.log("No price data for hypothesis '%s', skipping",n.id);continue}const p=n.isControl?"control":"variant";this.log(`Setting up Map-based price test for ${p} (test: ${i.id})`),this.applyPriceTestWithMapLookup(i.id,n,i.hypotheses,b=>{const E=this.getReservationForTest(b);E&&!E.isRealized&&E.entryCriteriaKey?this.realizeReservationForCriteria(E.entryCriteriaKey):this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(u&&!h){this.log(`Price test without viewport tracking (v${d}): ${i.id}`);const p=this.getDomSelectorsForHypothesis(n);if(p.length===0)continue;U(document,{testId:i.id,hypothesisId:n.id,selectors:p},b=>{this.queueAddVisitorToTest(b,n),this.saveState(),this.queuePageView(window.location.pathname),this.syncAllEvents()});continue}if(!n.domSelectors||n.domSelectors.length===0){this.log("No selectors found, skipping hypothesis");continue}U(document,{testId:i.id,hypothesisId:n.id,selectors:n.domSelectors},p=>{this.queueAddVisitorToTest(p,n),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.log("Skipping redirect for control"),!1;if(e.type==="basicScript"||e.type==="manualScript")return this.log("Skipping redirect for script test"),!1;const t=this.state.essential.visitorTests.find(o=>o.hypothesisId===e.id),i=new URL(window.location.toString()),r=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;if(t&&t.themeId!==e.themeId&&(t.themeId===themeId||!this.isThemePreview()))this.log("On old theme, redirecting and updating local visitor"),t.themeId=e.themeId;else if(this.isThemePreview())return this.log("On non-test theme, skipping redirect"),!1;return this.log("Hiding page to redirect for theme test"),this.hidePage(),!0}return!1}else if(e.type!=="dom"&&e.type!=="price"&&e.affix!==template.suffix&&e.affix!==r||e.redirectPath&&!i.pathname.endsWith(e.redirectPath))return this.log("Hiding page to redirect for template test"),this.hidePage(),!0;return this.log("Not redirecting"),!1}redirect(e){if(this.log("Redirecting to hypothesis '%s'",e.id),e.isControl)return;const t=new URL(window.location.toString());if(t.searchParams.delete("view"),e.redirectPath){const n=RegExp("^(/w{2}-w{2})/").exec(t.pathname);if(n&&n.length>1){const l=n[1];t.pathname=`${l}${e.redirectPath}`}else t.pathname=e.redirectPath}else e.type==="theme"?(t.searchParams.set("_ab","0"),t.searchParams.set("_fd","0"),t.searchParams.set("_sc","1"),t.searchParams.set("preview_theme_id",e.themeId.toString())):e.type!=="urlRedirect"&&t.searchParams.set("view",e.affix);const i=this.state.essential.visitorTests.find(n=>n.hypothesisId===e.id)?.testId,s=t.pathname+t.search,r=window.location.pathname+window.location.search,o=K(t.hash);if(i&&s!==r&&!o){const n=qe(),l=He({v:2,t:i,n,fh:Me(window.location.pathname+window.location.search)});t.hash=`slr-${n}`;const c=new Date(Date.now()+3e4).toUTCString();document.cookie=`shoplift_redirect=${l};domain=.${window.location.hostname};path=/;SameSite=Strict;expires=${c}`}s===r&&this.showPage(),this.queueRedirect(t)}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")??"",r=window.document.referrer,o=this.device;return{createdAt:new Date,utmSource:e,utmMedium:t,utmCampaign:i,utmContent:s,referrer:r,device:o}}checkForThemePreview(){return this.log("Checking for theme preview"),window.location.hostname.endsWith(".shopifypreview.com")?(this.log("on shopify preview domain"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!1):this.isThemePreview()?this.state.essential.visitorTests.some(e=>e.isThemeTest&&e.hypothesisId!=null&&this.getHypothesis(e.hypothesisId)&&e.themeId===themeId)?(this.log("On active theme test, remov
19ing theme bar"),this.clearThemeBar(!1,!0,this.state),!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.redirectToMainTheme(),!0):this.state.essential.isFirstLoad?(this.log("No visitor found on theme preview, redirecting to main theme"),this.redirectToMainTheme(),!0):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.redirectToMainTheme(),!0):this.testConfigs.some(e=>e.hypotheses.some(t=>t.themeId===themeId))?(this.log("Falling back to clearing theme bar"),this.clearThemeBar(!1,!0,this.state),!1):(this.log("No tests on current theme, skipping script"),this.clearThemeBar(!0,!1,this.state),document.querySelector("#sl-preview-bar-hide")?.remove(),!0):(this.log("Not on theme preview"),this.clearThemeBar(!0,!1,this.state),!1)}redirectToMainTheme(){this.hidePage();const e=new URL(window.location.toString());e.searchParams.set("preview_theme_id",""),this.queueRedirect(e)}testsForUrl(e){const t=new URL(window.location.href),i=this.typeFromTemplate();return e.filter(s=>s.hypotheses.some(r=>r.type!=="dom"&&r.type!=="price"&&(r.isControl&&r.type===i&&r.affix===template.suffix||r.type==="theme"||r.isControl&&r.type==="urlRedirect"&&r.redirectPath&&t.pathname.endsWith(r.redirectPath)||r.type==="basicScript"))&&(s.ignoreTestViewParameterEnforcement||!t.searchParams.has("view")||s.hypotheses.map(r=>r.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(r=>new RegExp(se(r)).test(K(t.toString())))))}async filterTestsByAudience(e,t,i){const s=[],r=e.some(n=>(n.requiresRegion||this.geoViaShopify&&n.requiresCountry)&&!i.some(l=>l.testId===n.id));this.resolvedRegion===null&&r&&(this.log("Hiding page to wait for Shopify region resolution"),this.hidePage(),await this.waitForResolvedRegion()),window.__slRegion=this.resolvedRegion??"";let o=t.country;this.geoViaShopify?o=this.resolvedRegion?this.resolvedRegion.slice(0,2):o:!o&&e.some(n=>n.requiresCountry&&!i.some(l=>l.testId===n.id))&&(this.log("Hiding page to check geoip"),this.hidePage(),o=await this.makeJsonRequest({method:"get",url:`${this.eventHost}/api/v0/visitors/get-country`,signal:AbortSignal.timeout(this.getCountryTimeout)}).catch(n=>(this.log("Error getting country",n),null)));for(const n of e){if(this.log("Checking audience for test '%s'",n.id),this.state.essential.visitorTests.some(d=>d.testId===n.id&&d.hypothesisId==null)){console.log(`Skipping blocked test '${n.id}'`);continue}const l=this.visitorCreatedDuringTestActive(n.statusHistory);(i.some(d=>d.testId===n.id&&(n.device==="all"||n.device===t.device&&n.device===this.device))||this.isTargetAudience(n,t,l,o))&&(this.log("Visitor is in audience for test '%s'",n.id),s.push(n))}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 r=this.getChannel(t);return(e.device==="all"||e.device===t.device&&e.device===this.device)&&(e.visitorOption==="all"||e.visitorOption==="new"&&i||e.visitorOption==="returning"&&!i)&&(e.targetAudiences.length===0||e.targetAudiences.reduce((o,n)=>o||n.reduce((l,c)=>l&&c(t,i,r,s),!0),!1))}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 r=JSON.parse(s);return e.domSelectors=r,this.log("Loaded %d price selectors from cache for hypothesis '%s'",r.length,e.id),r}}catch{}const i=$e(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),r=t.get(s)||[];r.push(i),t.set(s,r)}return t}doesCurrentPageMatchEntryCriteria(e){if(this.isGlobalEntryCriteria(e))return!0;
19if(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 r=this.testConfigs.find(n=>n.id===s.testId);if(!r){this.log("Test '%s' no longer in config, clearing reservation for criteria '%s'",s.testId,i),delete e[i],t=!0;continue}if(r.status!=="active"){this.log("Test '%s' status is '%s', clearing reservation for criteria '%s'",s.testId,r.status,i),delete e[i],t=!0;continue}this.testsFilteredByAudience.some(n=>n.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(n=>this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n))),s=e.filter(n=>!this.doesCurrentPageMatchEntryCriteria(this.getEntryCriteriaKey(n)));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(n=>({id:n.id,title:n.title,criteria:this.getEntryCriteriaKey(n)})));const r=`conditional:current-page:${this.typeFromTemplate()}`;if(i.length>0&&!this.state.temporary.rolledEntryCriteria.includes(r)){this.createSingleReservation(i,r);for(const n of i){const l=this.getEntryCriteriaKey(n);this.state.temporary.rolledEntryCriteria.includes(l)||this.state.temporary.rolledEntryCriteria.push(l)}}const o=this.groupTestsByEntryCriteria(s);for(const[n,l]of o){if(this.state.temporary.rolledEntryCriteria.includes(n)){this.log("Already rolled for criteria '%s', skipping",n);continue}if(l.some(S=>this.state.essential.visitorTests.some(C=>C.testId===S.id))){this.log("Visitor already has VT for criteria '%s', skipping",n),this.state.temporary.rolledEntryCriteria.push(n);continue}const d=[...l].sort((S,C)=>S.id.localeCompare(C.id));this.log("Test dice roll for criteria '%s' - available tests: %o",n,d.map(S=>({id:S.id,title:S.title})));const u=Math.floor(Math.random()*d.length),h=d[u];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",u+1,l.length,h.id,h.title);const p=this.pickHypothesis(h);if(!p){this.log("No hypothesis picked for test '%s'",h.id);continue}this.sendDiagnosticTelemetry("assignment",h.id,{hypothesisId:p.id,isControl:p.isControl,testType:p.type});const b=this.getReservationType(p.type),E={testId:h.id,hypothesisId:p.id,testType:p.type,reservationType:b,isThemeTest:p.type==="theme",themeId:p.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:n};this.state.temporary.testReservations[n]=E,this.state.temporary.rolledEntryCriteria.push(n),this.log("Created %s reservation for test '%s' (criteria: %s)",b,h.id,n);for(const S of l)S.id!==h.id&&this.markTestAsBlocked(S,n)}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(u=>this.state.essential.visitorTests.some(h=>h.testId===u.id&&!h.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((u,h)=>u.id.localeCompare(h.id));this.log("Test dice roll for pool '%s' - available tests: %o",t,s.map(u=>({id:u.id,title:u.title,criteria:this.getEntryCriteriaKey(u)})));const r=Math.floor(Math.random()*s.length),o=s[r];this.log("Test dice roll: picked index %d of %d, selected test '%s' (%s)",r,e.length,o.id,o.title);const n=this.pickHypothesis(o);if(!n){this.log("No hypothesis picked for test '%s'",o.id);return}this.sendDiagnosticTelemetry("assignment",o.id,{hypothesisId:n.id,isControl:n.isControl,testType:n.type});const l=this.getReservationType(n.type),c=this.getEntryCriteriaKey(o),d={testId:o.id,hypothesisId:n.id,testType:n.type,reservationType:l,isThemeTest:n.type==="theme",themeId:n.themeId,createdAt:new Date,isRealized:!1,entryCriteriaKey:c};this.state.temporary.testReservations[c]=d,this.state.temporary.rolledEntryCriteria.push(t),this.log("Created %s reservation for test '%s' from pool '%s' (criteria: %s)",l,o.id,t,c);for(const u of e)u.id!==o.id&&this.markTestAsBlocked(u,`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=>
19i.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(r=>r.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 r=s.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);r?.[1]&&e.add(r[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 r of Object.values(e)){if(r.isThemeTest)return"theme";if(r.testType==="price")return"price"}if(Object.values(e).some(r=>!r.isRealized)){if(this.state.temporary.testCategory==="global")for(const o of Object.values(e)){if(o.testType==="theme")return"theme";if(o.testType==="price")return"price";if(o.testType==="basicScript")return"theme"}return"templateOrUrlRedirect"}const i=this.state.essential.visitorTests.filter(r=>!r.isInvalid&&this.testConfigs.some(o=>o.hypotheses.some(n=>n.id===r.hypothesisId)));return i.length===0?null:i.some(r=>this.getHypothesis(r.hypothesisId)?.type==="price")?"price":i.some(r=>r.isThemeTest)?"theme":"templateOrUrlRedirect"}applyControlForAudienceFilteredPriceTests(){const e=this.testConfigs.filter(s=>s.status==="active"&&s.hypotheses.some(r=>r.type==="price"));if(e.length===0)return;const t=this.testsFilteredByAudience.filter(s=>s.hypotheses.some(r=>r.type==="price")),i=e.filter(s=>!t.some(r=>r.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 r=s.hypotheses.find(c=>c.isControl),o=this.getDomSelectorsForHypothesis(r);if(o.length===0){this.log("No control selectors for audience-filtered price test '%s'",s.id);continue}const n=new URL(window.location.href);o.some(c=>{try{return new RegExp(se(c)).test(K(n.toString()))}catch{return!1}})&&(this.log("Applying control selectors for audience-filtered price test '%s'",s.id),U(document,{testId:s.id,hypothesisId:r.id,selectors:o},()=>{}),this.updatePriceTestHiddenInputs(s.id,"control",!1))}}}pickHypothesis(e){let t=Math.random();const i=e.hypotheses.reduce((r,o)=>r+o.visitorCount,0);return e.hypotheses.sort((r,o)=>r.isControl?o.isControl?0:-1:o.isControl?1:0).reduce((r,o)=>{if(r!==null)return r;const l=e.hypotheses.reduce((c,d)=>c&&d.visitorCount>20,!0)?o.visitorCount/i-o.trafficPercentage:0;return t<=o.trafficPercentage-l?o:(t-=o.trafficPercentage-l,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){this.saveState(),this.disableReferrerOverride||(this.log(`Saving temporary referrer override '${document.referrer}'`),this.state.temporary.originalReferrer=document.referrer,this.persistTemporaryState()),window.setTimeout(()=>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()=>
19{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}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={shop:this.shop,visitorDetails:{shopifyAnalyticsId:this.shopifyAnalyticsId,device:this.state.analytics.visitor?.device??this.device,country:this.state.analytics.visitor?.country??null,...this.state.essential.initialState},events:this.state.essential.visitorTests.filter(r=>!r.isInvalid&&!r.isSaved&&r.hypothesisId!=null).map(r=>new be(r.testId,r.hypothesisId,r.createdAt)).concat(t)};await this.sendEvents(i);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 s=await this.getVisitor(this.shopifyAnalyticsId);s!==null&&this.updateLocalVisitor(s);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(he)return;he=!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}`};
19this.shopliftDebug&&Object.assign(s,{debug_mode:!0});function r(o,n,l){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}this.gaConfig.mode==="gtag"?r("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(r=>r.isSaved&&(!r.savedAt||Date.now()-r.savedAt>i)&&!t.some(o=>o.testId===r.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 r=this.state.essential.visitorTests.findIndex(n=>n.testId===s.testId);if(!(r!==-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 n=this.state.essential.visitorTests.at(r);this.log("updateLocalVisitor - REPLACING local test with server test: testId=%s, local hypothesisId=%s -> server hypothesisId=%s, local isInvalid=%s -> false",s.testId,n?.hypothesisId,s.hypothesisId,n?.isInvalid),s.isInvalid=!1,s.shouldSendToGa=n?.shouldSe
19ndToGa??!1,s.testType=n?.testType,s.assignedTo=n?.assignedTo,s.testTitle=n?.testTitle,this.state.essential.visitorTests.splice(r,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}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,r=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([r],{type:"text/plain"}))}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 )|
19sy(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(r=>r.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(o=>o.id===t.testId);if(!i){this.log("Test config not found:",t.testId);continue}const s=i.hypotheses.find(o=>o.id===t.hypothesisId);if(!s||s.type!=="price")continue;const r=s.isControl?"control":"variant";this.log("Updating hidden inputs for price test:",t.testId,r),this.updatePriceTestHiddenInputs(t.testId,r,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 Ue(this)}async subscriptionPriceChange(){await ze(this)}async subscriptionOneTimePrice(){await We(this)}updatePriceTestHiddenInputs(e,t,i){try{this.cleanupPriceTestObservers();const s=`${e}:${t}:${i?"t":"f"}`,r=T=>{const m=T.getAttribute("data-sl-pid");if(!m)return!0;if(i&&this.state.temporary.previewConfig){const w=this.state.temporary.previewConfig,I=t==="control"?"a":"b",f=w.variants.find(v=>v.label===I);if(!f)return!1;for(const v of f.domSelectors||[]){const g=v.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(g){const P=g[1];if(this.log(`Extracted ID from selector: ${P}, comparing to: ${m}`),P===m)return this.log("Product ID match found in preview config:",m,"variant:",f.label),!0}else this.log(`Could not extract ID from selector: ${v.cssSelector}`)}return this.log("No product ID match in preview config for:",m,"variant:",I),!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 I of w.domSelectors||[]){const f=I.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);if(f&&f[1]===m)return this.log("Product ID match found in domSelectors:",m,"for test:",e),!0}if(w.priceData?.variants){for(const I of w.priceData.variants)if(I[0]===m)return this.log("Product ID match found in priceData:",m,"for test:",e),!0}}return this.log("No product ID match for:",m,"in test:",e),!1},o=new Set;let n=!1,l=null;const c=(T,m)=>{if(document.querySelectorAll("[data-sl-attribute-p]").forEach(w=>{if(w instanceof Element&&w.nodeType===Node.ELEMENT_NODE&&w.isConnected&&document.contains(w))try{T.observe(w,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(I){this.log(`Failed to observe element (${m}):`,I)}}),document.body&&document.body.isConnected)try{T.observe(document.body,{childList:!0,subtree:!0,characterData:!0,characterDataOldValue:!0,attributes:!1})}catch(w){this.log(`Failed to observe document.body (${m}):`,w)}},d=(T,m,y,w)=>{const I=T.filter(f=>{const v=f.cssSelector.match(/data-sl-attribute-(?:p|cap)="(\d+)"/);return v&&v[1]===w});this.log(`Applying ${y} DOM selectors, total: ${T.length}, filtered: ${I.length}`),I.length>0&&U(document,{testId:e,hypothesisId:m,selectors:I})},u=(T,m)=>{this.log(`Applying DOM selector changes for product ID: ${T}`),m.disconnect(),n=!0;try{if(i&&this.state.temporary.previewConfig){const y=t==="control"?"a":"b",w=this.state.temporary.previewConfig.variants.find(I=>I.label===y);if(!w?.domSelectors){this.log(`No DOM selectors found for preview variant: ${y}`);return}d(w.domSelectors,w.id,"preview config",T)}else{const y=this.testConfigs.find(I=>I.id===e);if(!y){this.log(`No test config found for testId: ${e}`);return}const w=y.hypotheses.find(I=>t==="control"?I.isControl:!I.isControl);if(!w?.domSelectors){this.log(`No DOM selectors found for assignment: ${t}`);return}d(w.domSelectors,w.id,"live config",T)}}finally{l!==null&&clearTimeout(l),l=window.setTimeout(()=>{n=!1,l=null,c(m,"reconnection"),this.log("Re-established innerHTML observer after DOM changes")}
19,50)}},h=new MutationObserver(T=>{if(!n)for(const m of T){if(m.type!=="childList"&&m.type!=="characterData")continue;let y=m.target;m.type==="characterData"&&(y=m.target.parentElement||m.target.parentNode);let w=y,I=w.getAttribute("data-sl-attribute-p");for(;!I&&w.parentElement;)w=w.parentElement,I=w.getAttribute("data-sl-attribute-p");if(!I)continue;const f=w.innerHTML||w.textContent||"";let v="";m.type==="characterData"&&m.oldValue!==null&&(v=m.oldValue),this.log(`innerHTML changed on element with data-sl-attribute-p="${I}"`),v&&this.log(`Previous content: "${v}"`),this.log(`Current content: "${f}"`),u(I,h)}});c(h,"initial setup"),o.add(h);const p=new MutationObserver(T=>{T.forEach(m=>{m.addedNodes.forEach(y=>{if(y.nodeType===Node.ELEMENT_NODE){const w=y;E(w);const I=w.matches('input[name="properties[_slpt]"]')?[w]:w.querySelectorAll('input[name="properties[_slpt]"]');I.length>0&&this.log(`MutationObserver found ${I.length} new hidden input(s)`),I.forEach(f=>{const v=f.getAttribute("data-sl-pid");if(this.log(`MutationObserver checking new input with data-sl-pid="${v}"`),r(f))f.value!==s&&(f.value=s,this.log("Updated newly added hidden input:",s)),S(f);else{const g=f.getAttribute("data-sl-pid");g&&this.isProductInAnyPriceTest(g)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",g):(f.remove(),this.log("Removed newly added non-matching hidden input for product ID:",g))}})}})})});o.add(p);const b=new MutationObserver(T=>{T.forEach(m=>{if(m.type==="attributes"&&m.attributeName==="data-sl-pid"){const y=m.target;if(this.log("AttributeObserver detected data-sl-pid attribute change on:",y.tagName),y.matches('input[name="properties[_slpt]"]')){const w=y,I=m.oldValue,f=w.getAttribute("data-sl-pid");this.log(`data-sl-pid changed from "${I}" to "${f}" - triggering payment placement updates`),r(w)?(w.value!==s&&(w.value=s,this.log("Updated hidden input after data-sl-pid change:",s)),f&&u(f,h),this.log("Re-running payment placement updates after variant change"),E(document.body)):f&&this.isProductInAnyPriceTest(f)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",f):(w.remove(),this.log("Removed non-matching hidden input after data-sl-pid change:",f))}}})});o.add(b);const E=T=>{T.tagName==="SHOPIFY-PAYMENT-TERMS"&&(this.log("MutationObserver found new shopify-payment-terms element"),this.updateShopifyPaymentTerms(e,t));const m=T.querySelectorAll("shopify-payment-terms");m.length>0&&(this.log(`MutationObserver found ${m.length} shopify-payment-terms in added node`),this.updateShopifyPaymentTerms(e,t)),T.tagName==="AFTERPAY-PLACEMENT"&&(this.log("MutationObserver found new afterpay-placement element"),this.updateAfterpayPlacements(e,t,"afterpay"));const y=T.querySelectorAll("afterpay-placement");y.length>0&&(this.log(`MutationObserver found ${y.length} afterpay-placement in added node`),this.updateAfterpayPlacements(e,t,"afterpay")),T.tagName==="SQUARE-PLACEMENT"&&(this.log("MutationObserver found new square-placement element"),this.updateAfterpayPlacements(e,t,"square"));const w=T.querySelectorAll("square-placement");w.length>0&&(this.log(`MutationObserver found ${w.length} square-placement in added node`),this.updateAfterpayPlacements(e,t,"square")),T.tagName==="KLARNA-PLACEMENT"&&(this.log("MutationObserver found new klarna-placement element"),this.updateKlarnaPlacements(e,t));const I=T.querySelectorAll("klarna-placement");I.length>0&&(this.log(`MutationObserver found ${I.length} klarna-placement in added node`),this.updateKlarnaPlacements(e,t))},S=T=>{b.observe(T,{attributes:!0,attributeFilter:["data-sl-pid"],attributeOldValue:!0,subtree:!1});const m=T.getAttribute("data-sl-pid");this.log(`Started AttributeObserver on specific input with data-sl-pid="${m}"`)},C=()=>{const T=document.querySelectorAll('input[name="properties[_slpt]"]');this.log(`Found ${T.length} existing hidden inputs to check`),T.forEach(m=>{const y=m.getAttribute("data-sl-pid");this.log(`Checking existing input with data-sl-pid="${y}"`),r(m)?(m.value=s,this.log("Updated existing hidden input:",s),y&&(this.log("Applying initial DOM selector changes for existing product"),u(y,h)),S(m)):y&&this.isProductInAnyPriceTest(y)?this.log("Preserving hidden input for product ID '%s' - belongs to a different price test",
19y):(m.remove(),this.log("Removed non-matching hidden input for product ID:",y))})},_=()=>{document.body?(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver on document.body"),C(),E(document.body)):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{document.body&&(p.observe(document.body,{childList:!0,subtree:!0}),this.log("Started MutationObserver after DOMContentLoaded"),C(),E(document.body))}):(this.log("Set timeout on observer"),setTimeout(_,10))};_(),window.__shopliftPriceTestObservers=o,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,(o,n)=>{if(i==="afterpay"){const l=(n/100).toFixed(2);o.setAttribute("data-amount",l)}else o.setAttribute("data-amount",n.toString())}),this.log("updateAfterpayPlacements completed")}updatePlacementElements(e,t,i,s){const r=document.querySelectorAll(i);if(r.length===0){this.log(`No ${i} elements found - early return`);return}let o;if(this.state.temporary.isMerchant&&this.state.temporary.previewConfig){const l=t==="control"?"a":"b",c=this.state.temporary.previewConfig.variants.find(d=>d.label===l);if(!c?.domSelectors){this.log(`No variant found for label ${l} in preview config for ${i}`);return}o=c.domSelectors,this.log(`Using preview config for ${i} in merchant mode, variant: ${l}`)}else{const l=this.testConfigs.find(d=>d.id===e);if(!l){this.log(`No testConfig found for id: ${e} - early return`);return}
19const c=l.hypotheses.find(d=>t==="control"?d.isControl:!d.isControl);if(!c?.domSelectors){this.log(`No hypothesis or domSelectors found for assignment: ${t} - early return`);return}o=c.domSelectors}const n=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);r.forEach(l=>{let c=null;const d=l.parentElement;if(d&&(c=d.querySelector('input[name="properties[_slpt]"]')),c||(c=l.querySelector('input[name="properties[_slpt]"]')),!c){this.log(`No hidden input found for ${i} element`);return}const u=c.getAttribute("data-sl-pid");if(!u){this.log("Hidden input has no data-sl-pid attribute - skipping");return}const h=o.find(S=>{const C=S.cssSelector.match(n);return C&&C[1]===u});if(!h){this.log(`No matching selector found for productId: ${u} - skipping element`);return}const p=h.actions.find(S=>S.scope==="price");if(!p?.value){this.log("No price action or value found - skipping element");return}const b=parseFloat(p.value.replace(/[^0-9.]/g,""));if(Number.isNaN(b)){this.log(`Invalid price "${p.value}" for product ${u} - skipping`);return}const E=Math.round(b*100);s(l,E)}),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 o=t==="control"?"a":"b",n=this.state.temporary.previewConfig.variants.find(l=>l.label===o);if(!n||!n.domSelectors){this.log(`No variant found for label ${o} in preview config`);return}s=n.domSelectors,this.log(`Using preview config for shopify-payment-terms in merchant mode, variant: ${o}`)}else{const o=this.testConfigs.find(l=>l.id===e);if(!o)return;const n=o.hypotheses.find(l=>t==="control"?l.isControl===!0:l.isControl===!1);if(!n||!n.domSelectors)return;s=n.domSelectors}const r=new RegExp(`${this.DATA_SL_ATTRIBUTE_P}=["'](\\d+)["']`);i.forEach(o=>{const n=o.getAttribute("variant-id");if(!n)return;const l=s.find(c=>{const d=c.cssSelector.match(r);return d&&d[1]===n});if(l){const c=l.actions.find(d=>d.scope==="price");if(c&&c.value){const d=o.getAttribute("shopify-meta");if(d)try{const u=JSON.parse(d);if(u.variants&&Array.isArray(u.variants)){const h=u.variants.find(p=>p.id?.toString()===n);if(h){h.full_price=c.value;const p=parseFloat(c.value.replace(/[^0-9.]/g,""));if(h.number_of_payment_terms&&h.number_of_payment_terms>1){const b=p/h.number_of_payment_terms;h.price_per_term=`$${b.toFixed(2)}`}o.setAttribute("shopify-meta",JSON.stringify(u))}}}catch(u){this.log("Error parsing/updating shoplift-meta:",u)}}}})}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:r,signal:o}=e,n=new Headers;if(s)for(const c in s)n.append(c,s[c]);(!s||!s.Accept)&&n.append("Accept","application/json"),(!s||!s["Content-Type"])&&n.append("Content-Type","application/json"),(this.eventHost.includes("ngrok.io")||this.eventHost.includes("ngrok-free.app"))&&n.append("ngrok-skip-browser-warning","1234");const l=await this.fetch(t,{method:i,headers:n,body:r,signal:o});if(!l.ok){if(l.status===204)return null;if(l.status===422){const c=await l.json();if(typeof c<"u"&&c.isBot)throw new ie}throw new Error(`Error sending shoplift request ${l.status}`)}return l}queueAddVisitorToTest(e,t){if(this.state.essential.visitorTests.some(s=>s.testId===e))return;const i=this.testConfigs.find(s=>s.id===e);if(this.state.essential.visitorTests.push({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}),t.type==="price"){const s=t.isControl?"control":"variant";this.log("Price test assignment detected, updating cart attributes:",e,s),this.updatePriceTestHiddenInputs(e,s,!1)}}queueCartUpdate(e){this.queueEvent(new Ce(e))}queuePageView(e){this.queueEvent(new Se(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(),r=[i,s].filter(o=>o!==null).sort((o,n)=>+n.storedAt-+o.storedAt)[0];return t.analytics.visitor===null&&r&&({visitorTests:t.essential.visitorTests,...t.analytics.visitor}=r,t.essential.isFirstLoad=!1,t.essential.initialState={createdAt:r.createdAt,referrer:r.referrer,utmCampaign:r.utmCampaign,utmContent:r.utmContent,utmMedium:r.utmMedium,utmSource:r.utmSource,device:r.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 r={timestamp:new Date,consentApproved:!1,hasConsentInteraction:!1,debugMode:!1,initialState:s,visitorTests:[],isFirstLoad:!0},o=[t,i].filter(n=>n!==null).sort((n,l)=>+l.timestamp-+n.timestamp)[0]??r;return o.initialState||(e.visitor!==null?o.initialState=e.visitor:(o.initialState=s,o.initialState.createdAt=o.timestamp)),o}loadAnalyticsState(){const e=this.loadLocalStorage(this.analyticsSessionKey),t=this.loadCookie(this.analyticsSessionKey),i={timestamp:new Date,visitor:null,queue:[]},s=[e,t].filter(r=>r!==null).sort((r,o)=>+o.timestamp-+r.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.persist
19CookieState(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),r=i?"":`expires=${new Date(new Date().getTime()+864e5*365).toUTCString()};`;document.cookie=`${e}=${s};domain=.${window.location.hostname};path=/;SameSite=Strict;${r}`}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|y
19andex\.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\.o
19pera\.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)}
19,{"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|k
19akao|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|y
19andex\.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){const t=this.cookie.split("; ").filter(i=>i.split("=").at(0)===e).at(0);return t===void 0?null:t.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 s=window.Shopify.customerPrivacy.getRegion?.();this.resolvedRegion=typeof s=="string"?s.replace(/-/g,""):""}const i=window.Shopify.customerPrivacy.getTrackingConsent();await this.onConsentChange(window.Shopify.customerPrivacy.analyticsProcessingAllowed(),i==="yes")};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){try{if(this.log("Consent change detected",e,t),this.state.essential.consentApproved=e,this.state.essential.hasConsentInteraction=t,!this.state.essential.consentApproved){this.state.essential.hasConsentInteraction&&(this.state.analytics.queue.length=0),this.saveState();return}this.cookie=document.cookie,this.shopifyAnalyticsId=this.getShopifyAnalyticsId(),this.saveState(),await this.syncAllEvents()}catch(i){this.log("Error syncing on consent change",i)}}isThemePreview(){return isThemePreview||themeRole!=="main"}isAppProxyPath(){const e=["/apps/","/tools/","/a/"],t=window.location.pathname;return e.some(i=>t.startsWith(i))}clearThemeBar(e,t,i){const s=structuredClone(i);this.log("Looking for theme bar"),this.waitForElement(null,"body").then(r=>this.waitForElement(r,"#preview-bar-iframe, #PBarNextFrameWrapper").then(o=>(this.log("Found theme bar"),t&&(this.log("Removing theme bar"),o.remove()),e?this.makeRequest({url:`${this.eventHost}/api/v0/logs`,method:"post",data:JSON.stringify({...this.debugState(),stateAtEvaluation:s},ee)}):Promise.resolve(null)))).catch(r=>console.error(r))}waitForElement(e,t){return new Promise(i=>{const s=document.querySelector(t);if(s){i(s);return}const r=new MutationObserver(o=>{const n=document.querySelector(t);if(n){r.disconnect(),i(n);return}});r.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,r=>{if(i>=t.length)return r;const o=t[i++];return r==="%o"||r==="%O"?JSON.stringify(o):String(o)});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
19: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,r=new Set;return new IntersectionObserver(o=>{o.forEach(n=>{if(n.isIntersecting&&!r.has(n.target)){const l=n.target,c=l.getAttribute(this.DATA_SL_TEST_ID);c&&(e(c,l),s&&r.add(l))}})},{threshold:i})}applyChangesWithViewport(e,t,i,s){const r=t.selectorsForViewportTracking??t.selectors,o=n=>{if(this.state.essential.visitorTests.some(h=>h.testId===n)||this.activeViewportObservers.has(n))return;const l=[];if(r.forEach(h=>{e.querySelectorAll(h.cssSelector).forEach(b=>l.push(b))}),l.length===0)return;let c=!1;const d=()=>{c||(c=!0,i(n),u.disconnect(),this.activeViewportObservers.delete(n))},u=this.createViewportObserver(()=>{d()},{triggerOnce:!0,...s});this.activeViewportObservers.set(n,u),this.log(`Created viewport observer for test ${n}, observing ${l.length} elements`),l.forEach(h=>{h.setAttribute(this.DATA_SL_TEST_ID,String(n)),u.observe(h)}),setTimeout(()=>{c||l.forEach(h=>{const p=h.getBoundingClientRect(),b=s?.threshold??this.VIEWPORT_TRACK_THRESHOLD,E=Math.min(p.bottom,window.innerHeight)-Math.max(p.top,0),S=Math.min(p.right,window.innerWidth)-Math.max(p.left,0);p.top<window.innerHeight&&p.bottom>0&&p.left<window.innerWidth&&p.right>0&&E>0&&S>0&&E>=p.height*b&&(this.log(`Price element already visible in viewport for test ${n}:`,h),d())})},100)};t.selectors.length>0&&U(e,t,()=>{}),Te(e,{testId:t.testId,hypothesisId:t.hypothesisId,selectors:r},n=>{o(n)})}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 r=t.priceData.variants.slice(0,3);for(const[S,C,_]of r)this.log("  Sample priceData: variant=%s, price=%d, compareAt=%d",S,C,_);const o=j(t.priceData),n=new Set;for(const S of i)if(S.priceData)for(const[C]of S.priceData.variants)n.add(C);this.log("Price test Map lookup: %d products in hypothesis, %d total products to track",o.size,n.size);const l=t.priceData,c=new WeakSet;let d=!1;const u="[data-sl-attribute-p], [data-sl-attribute-cap], [data-sl-attribute-discount]",h=S=>{if(c.has(S))return;const C=S.getAttribute("data-sl-attribute-p"),_=S.getAttribute("data-sl-attribute-cap"),T=S.getAttribute("data-sl-attribute-discount"),m=C||_||T;if(!m||!n.has(m))return;c.add(S);const y=o.get(m);y&&(this.log("Applying price for product %s: %d cents (compare at: %d cents)",m,y.priceInCents,y.compareAtPriceInCents),Le(S,m,y,l),this.log("Applied price to element for product %s",m)),!d&&!this.state.essential.visitorTests.some(w=>w.testId===e)&&(S.setAttribute(this.DATA_SL_TEST_ID,String(e)),this.setupElementViewportTracking(S,e,()=>{d||(d=!0,s(e))}))},p=()=>{const S=document.querySelectorAll(u);this.log("Scanning for price elements, found: %d",S.length),S.forEach(h)},b=new MutationObserver(S=>{for(const C of S)C.type==="childList"&&C.addedNodes.forEach(_=>{if(_.nodeType===Node.ELEMENT_NODE){const T=_;(T.hasAttribute("data-sl-attribute-p")||T.hasAttribute("data-sl-attribute-cap")||T.hasAttribute("data-sl-attribute-discount"))&&h(T),T.querySelectorAll(u).forEach(h)}}),C.type==="attributes"&&C.target instanceof Element&&h(C.target)}),E=document.body||document.documentElement;b.observe(E,{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"),p(),document.readyState==="loading"&&document.addEventListener("DOMContentLoaded",()=>{this.log("DOMContentLoaded - rescanning for price elements"),p()}),setTimeout(()=>{this.log("Delayed rescan for price elements"),p()},100),setTimeout(()=>{this.log("Final rescan for price elements"),p()},500)}setupElementViewportTracking(e,t,i){const s=this.VIEWPORT_TRACK_THRESHOLD,r=e.getBoundingClientRect(),o=Math.min(r.bottom,window.innerHeight)-Math.max(r.top,0),n=Math.min(r.right,window.innerWidth)-Math.max(r.left,0);if(r.top<window.innerHeight&&r.bottom>0&&r.left<window.innerWidth&&r.right>0&&o>0&&n>0&&o>=r.height*s){this.log("Price element already visible for test %s",t),i();return}const c=new IntersectionObserver(d=>{for(const u of d)if(u.isIntersecting&&u.intersectionRatio>=s){this.log("Price element entered viewport for test %s",t),c.disconnect(),i();break}},{threshold:s});c.observe(e)}debug(){const e=this.debugState();console.log(JSON.stringify(e,ee,2))}}(async function(){window.shopliftInstance||(window.shopliftInstance=new Ze("oxford-healthspan.myshopify.com","https://app.shoplift.ai","https://events.shoplift.ai",false,false,false,{"sendEvents":false,"mode":"gtag"},false,false,1000,[],[{"id":"019d534e-a113-7d7c-abec-752724333326","bayesianRevision":5,"status":"completed","hypotheses":[{"id":"019d4e2b-505d-7b1a-b9c0-55118daad7d8","type":"theme","themeId":158472962297,"affix":"","isControl":true,"redirectPath":null},{"id":"019d5348-95a9-70e3-ab5c-e220eb453ef2","type":"theme","themeId":158472962297,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false},{"id":"019de3d2-0749-72ff-ae2e-b70fc9717213","bayesianRevision":5,"status":"cancelled","hypotheses":[{"id":"019de3d0-88c0-748d-a0f2-1960facfe7f9","type":"theme","themeId":158472962297,"affix":"","isControl":true,"redirectPath":null},{"id":"019de3d0-a6f0-7254-a720-de9f52ccb6ca","type":"theme","themeId":159222300921,"affix":"","isControl":false,"redirectPath":null}],"ignoreTestViewParameterEnforcement":false}
19],null,false),await window.shopliftInstance.init())})();async function Qe(a,e,t,i){const s=Be({log:i});if(t)return i("[SUB-PREVIEW] A side — no overlay applied; widget renders naturally"),s;const r=a.widget.widgetType,o=e?j(e):null;let n=W(e),l=J(a,n),c=l.discountMap,d=l.maxDiscount;function u(){const f=W(e);f!==n&&(n=f,l=J(a,n),c=l.discountMap,d=l.maxDiscount,i(`[SUB-PREVIEW] scope refreshed currentProductId=${n??"n/a"}, maxDiscount=${d}`))}i(`[SUB-PREVIEW] side=B, currentProductId=${n??"n/a"}, maxDiscount=${d}`);function h(f){if(!e||!o)return null;const v=Z(o),g=v?o.get(v):void 0;return g?{formattedVariantPrice:G(g.priceInCents,e),formattedDiscounted:G(g.priceInCents*(1-f/100),e)}:null}function p(f){const v=Y(a,f);if(!v)return d;const g=D(a,"subscriptionInput"),P=g.length?g[0].selector:'input[name="rc_plan"]',A=v.querySelector(`${P}:checked`);if(A){const k=c[A.value];if(k!==void 0)return k}return d}function b(f){const v=D(a,"subscriptionDiscount");for(const g of v)if(g.selector.includes("badge")||g.selector.includes("__badge")){const P=f.querySelector(g.selector);P?.textContent&&!P.textContent.includes(`${d}%`)&&$(P,A=>N(A,d))}}function E(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionCompareAt");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedVariantPrice)&&$(k,x=>/\d/.test(x)?g.formattedVariantPrice:x)}}function S(f,v){const g=h(v);if(!g)return;const P=D(a,"subscriptionPrice");for(const A of P){const k=f.querySelector(A.selector)||f.querySelector(`[part~="${A.selector}"]`);k?.textContent&&!k.textContent.includes(g.formattedDiscounted)&&$(k,x=>/\d/.test(x)?g.formattedDiscounted:x)}}function C(f){const v=D(a,"subscriptionInput"),g=v.length?v[0].selector:'input[name="rc_plan"]',P=D(a,"subscriptionPlanDiscount"),A=P.length?P[0].selector:".rc-plans-button__discount";for(const k of Array.from(f.querySelectorAll("label"))){const x=k.querySelector(g),R=k.querySelector(A);if(x&&R?.textContent){const V=c[x.value];if(V!==void 0){const O=R.textContent.match(/[\d.]+%/)?.[0];O&&O!==`${V}%`&&$(R,L=>N(L,V))}}}}function _(f){const v=f.querySelector("select");if(v)for(const g of Array.from(v.options)){const P=c[g.value];if(P!==void 0&&g.textContent){const A=g.textContent.match(/[\d.]+%/)?.[0];A&&A!==`${P}%`&&(g.textContent=N(g.textContent,P))}}}function T(f){const v=D(a,"onetimePrice");if(!v.length||!e||!o)return;const g=Z(o),P=g?o.get(g):void 0;if(!P)return;const A=G(P.priceInCents,e),k=D(a,"onetimeContainer"),x=k.length?k[0].selector:'[part~="rc-purchase-option__onetime"]',R=f.querySelector(x);if(R)for(const V of v){const O=R.querySelector(`[part~="${V.selector}"]`);O?.textContent&&!O.textContent.includes(A)&&$(O,L=>/\d/.test(L)?A:L)}}function m(f,v){const P=D(a,"subscriptionDiscount").filter(A=>A.selector.includes("benefit")||A.selector==="rc-benefits");for(const A of P){const k=f.querySelector(A.selector);if(k?.shadowRoot){for(const x of Array.from(k.shadowRoot.querySelectorAll("li")))if(x.textContent?.includes("Save")){const R=x.textContent.match(/[\d.]+%/)?.[0];R&&R!==`${v}%`&&$(x,V=>N(V,v))}}}}let y=!1;function w(){if(!y){y=!0;try{u();const f=B(a);if(!f)return;const v=p(f);b(f),E(f,v),S(f,v),T(f);const g=Y(a,f);g&&(r==="buttons"||r==="radio"?C(g):_(g)),m(f,v)}finally{y=!1}}}const I=pe({data:a,runUpdates:w});return function(){I(),s()}}const Xe=Object.freeze(Object.defineProperty({__proto__:null,subscriptionPreviewRender:Qe},Symbol.toStringTag,{value:"Module"}))})(); })("/", { suffix: "", type: "blog" }, "main", 158472962297, false)</script>
19
20<!-- End of Shoplift scripts -->
21
22    <!-- Start VWO Async SmartCode -->
23    <link rel="preconnect" href="https://dev.visualwebsiteoptimizer.com" />
24    
24<script type='text/javascript' id='vwoCode'>
25    window._vwo_code || (function() {
26    var account_id=898619,
27    version=2.1,
28    settings_tolerance=2000,
29    hide_element='body',
30    hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important',
31    /* DO NOT EDIT BELOW THIS LINE */
32    f=false,w=window,d=document,v=d.querySelector('#vwoCode'),cK='_vwo_'+account_id+'_settings',cc={};try{var c=JSON.parse(localStorage.getItem('_vwo_'+account_id+'_config'));cc=c&&typeof c==='object'?c:{}}catch(e){}var stT=cc.stT==='session'?w.sessionStorage:w.localStorage;code={use_existing_jquery:function(){return typeof use_existing_jquery!=='undefined'?use_existing_jquery:undefined},library_tolerance:function(){return typeof library_tolerance!=='undefined'?library_tolerance:undefined},settings_tolerance:function(){return cc.sT||settings_tolerance},hide_element_style:function(){return'{'+(cc.hES||hide_element_style)+'}'},hide_element:function(){if(performance.getEntriesByName('first-contentful-paint')[0]){return''}return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(e){if(!f){f=true;var t=d.getElementById('_vis_opt_path_hides');if(t)t.parentNode.removeChild(t);if(e)(new Image).src='https://dev.visualwebsiteoptimizer.com/ee.gif?a='+account_id+e}},finished:function(){return f},addScript:function(e){var t=d.createElement('script');t.type='text/javascript';if(e.src){t.src=e.src}else{t.text=e.text}d.getElementsByTagName('head')[0].appendChild(t)},load:function(e,t){var i=this.getSettings(),n=d.createElement('script'),r=this;t=t||{};if(i){n.textContent=i;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);r.load(e)}}else{var o=new XMLHttpRequest;o.open('GET',e,true);o.withCredentials=!t.dSC;o.responseType=t.responseType||'text';o.onload=function(){if(t.onloadCb){return t.onloadCb(o,e)}if(o.status===200){_vwo_code.addScript({text:o.responseText})}else{_vwo_code.finish('&e=loading_failure:'+e)}};o.onerror=function(){if(t.onerrorCb){return t.onerrorCb(e)}_vwo_code.finish('&e=loading_failure:'+e)};o.send()}},getSettings:function(){try{var e=stT.getItem(cK);if(!e){return}e=JSON.parse(e);if(Date.now()>e.e){stT.removeItem(cK);return}return e.s}catch(e){return}},init:function(){if(d.URL.indexOf('__vwo_disable__')>-1)return;var e=this.settings_tolerance();w._vwo_settings_timer=setTimeout(function(){_vwo_code.finish();stT.removeItem(cK)},e);var t;if(this.hide_element()!=='body'){t=d.createElement('style');var i=this.hide_element(),n=i?i+this.hide_element_style():'',r=d.getElementsByTagName('head')[0];t.setAttribute('id','_vis_opt_path_hides');v&&t.setAttribute('nonce',v.nonce);t.setAttribute('type','text/css');if(t.styleSheet)t.styleSheet.cssText=n;else t.appendChild(d.createTextNode(n));r.appendChild(t)}else{t=d.getElementsByTagName('head')[0];var n=d.createElement('div');n.style.cssText='z-index: 2147483647 !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 100% !important;height: 100% !important;background: white !important;';n.setAttribute('id','_vis_opt_path_hides');n.classList.add('_vis_hide_layer');t.parentNode.insertBefore(n,t.nextSibling)}var o='https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version;if(w.location.search.indexOf('_vwo_xhr')!==-1){this.addScript({src:o})}else{this.load(o+'&x=true')}}};w._vwo_code=code;code.init();})();
33    </script>
33
34    <!-- End VWO Async SmartCode -->
35    
35<script>
36    	window.VWO = window.VWO || [];
37    	VWO.event = VWO.event || function () {VWO.push(['event'].concat([].slice.call(arguments)))};
38    	VWO.event('shopify.purchase', {
39    		'currencyCode':'<text_value>',
40    		'orderId':'<text_value>',
41    		'productCurrency':'<text_value>',
42    		'productId':'<text_value>',
43    		'productPrice':'<text_value>',
44    		'productQuantity':'<text_value>',
45    		'productVariant':'<text_value>',
46    		'shippingPrice':'<number_value>',
47    		'totalDiscount':'<number_value>',
48    		'totalPrice':'<number_value>'
49    	})
50    </script>
50
51    <meta name="seodity-site-verification" content="seodity-site-verification-7d82321811e245a8bd2a6bbe9f3b10ef" />
52    <meta charset="utf-8">
53    <meta name="viewport" content="width=device-width, initial-scale=1.0, height=device-height, minimum-scale=1.0, maximum-scale=1.0">
54    <meta name="theme-color" content="#f7f5f3"><meta name="description" content="Increase your longevity with food-derived spermidine and whole-food recipes designed to reduce inflammation and boost your health span."><link rel="preload" href="https://cdn.shopify.com/s/files/1/0574/0809/4268/t/1/assets/preload_image.js" as="script">
55<script src="//cdn.shopify.com/s/files/1/0574/0809/4268/t/1/assets/preload_image.js" type="text/javascript"></script>
vendor: 1 bytes, line 55
55
56<script src="//cdn.shopify.com/s/files/1/0574/0809/4268/t/1/assets/bootstrap-26.0.3.js" type="text/javascript"></script>
vendor: 1 bytes, line 56
56
57<script src="//cdn.shopify.com/s/files/1/0574/0809/4268/t/1/assets/observer.js" type="text/javascript"></script>
57
58<meta property="og:type" content="website">
59  <meta property="og:title" content="The Science &amp; Art of Aging Well"><meta property="og:description" content="Increase your longevity with food-derived spermidine and whole-food recipes designed to reduce inflammation and boost your health span."><meta property="og:url" content="https://oxfordhealthspan.com/blogs/aging-well">
60<meta property="og:site_name" content="Oxford Healthspan® ">
60<script src="//cdn.shopify.com/s/files/1/0574/0809/4268/t/1/assets/bootstrap-26.0.70.js" type="text/javascript"></script>
60
61
62<meta name="twitter:card" content="summary"><meta name="twitter:title" content="The Science &amp; Art of Aging Well">
63  <meta name="twitter:description" content="Increase your longevity with food-derived spermidine and whole-food recipes designed to reduce inflammation and boost your health span."><title>The Science &amp; Art of Aging Well</title>
64
65    
66      <link rel="canonical" href="https://oxfordhealthspan.com/blogs/aging-well">
67    
68<link rel="shortcut icon" href="//oxfordhealthspan.com/cdn/shop/files/OXFORD_HEALTHSPAN_Logo_Circle_Gold_Bkgd_Black_Text_Black_Orchid_R_RGB.png?v=1708602272&width=96">
69      <link rel="apple-touch-icon" href="//oxfordhealthspan.com/cdn/shop/files/OXFORD_HEALTHSPAN_Logo_Circle_Gold_Bkgd_Black_Text_Black_Orchid_R_RGB.png?v=1708602272&width=180"><link rel="preconnect" href="https://cdn.shopify.com">
70    <link rel="preconnect" href="https://fonts.shopifycdn.com" crossorigin>
71    <link rel="dns-prefetch" href="https://productreviews.shopifycdn.com">
72
73    <link rel="stylesheet" href="https://use.typekit.net/ghg1viw.css"><link rel="preload" href="//oxfordhealthspan.com/cdn/fonts/cormorant/cormorant_n4.bd66e8e0031690b46374315bd1c15a17a8dcd450.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="//oxfordhealthspan.com/cdn/fonts/lato/lato_n3.a7080ececf6191f1dd5b0cb021691ca9b855c876.woff2" as="font" type="font/woff2" crossorigin>
74
75
76  
76<script type="application/ld+json">
77  {
78    "@context": "https://schema.org",
79    "@type": "BreadcrumbList",
80  "itemListElement": [{
81      "@type": "ListItem",
82      "position": 1,
83      "name": "Home",
84      "item": "https://oxfordhealthspan.com"
85    },{
86          "@type": "ListItem",
87          "position": 2,
88          "name": "The Science \u0026 Art of Aging Well",
89          "item": "https://oxfordhealthspan.com/blogs/aging-well"
90        }]
91  }
92  </script>
92
93
94<style>/* Typography (heading) */
95  @font-face {
96  font-family: Cormorant;
97  font-weight: 400;
98  font-style: normal;
99  font-display: fallback;
100  src: url("//oxfordhealthspan.com/cdn/fonts/cormorant/cormorant_n4.bd66e8e0031690b46374315bd1c15a17a8dcd450.woff2") format("woff2"),
101       url("//oxfordhealthspan.com/cdn/fonts/cormorant/cormorant_n4.e5604516683cb4cc166c001f2ff5f387255e3b45.woff") format("woff");
102}
103
104@font-face {
105  font-family: Cormorant;
106  font-weight: 400;
107  font-style: italic;
108  font-display: fallback;
109  src: url("//oxfordhealthspan.com/cdn/fonts/cormorant/cormorant_i4.0b95f138bb9694e184a2ebaf079dd59cf448e2d3.woff2") format("woff2"),
110       url("//oxfordhealthspan.com/cdn/fonts/cormorant/cormorant_i4.75684eb0a368d69688996f5f8e72c62747e6c249.woff") format("woff");
111}
112
113/* Typography (body) */
114  @font-face {
115  font-family: Lato;
116  font-weight: 300;
117  font-style: normal;
118  font-display: fallback;
119  src: url("//oxfordhealthspan.com/cdn/fonts/lato/lato_n3.a7080ececf6191f1dd5b0cb021691ca9b855c876.woff2") format("woff2"),
120       url("//oxfordhealthspan.com/cdn/fonts/lato/lato_n3.61e34b2ff7341f66543eb08e8c47eef9e1cde558.woff") format("woff");
121}
122
123@font-face {
124  font-family: Lato;
125  font-weight: 300;
126  font-style: italic;
127  font-display: fallback;
128  src: url("//oxfordhealthspan.com/cdn/fonts/lato/lato_i3.d6f478a3beb94baebd09d08550010692d0969f6e.woff2") format("woff2"),
129       url("//oxfordhealthspan.com/cdn/fonts/lato/lato_i3.881ba892942c15b0c0c25c0b311d6481b5311015.woff") format("woff");
130}
131
132@font-face {
133  font-family: Lato;
134  font-weight: 400;
135  font-style: normal;
136  font-display: fallback;
137  src: url("//oxfordhealthspan.com/cdn/fonts/lato/lato_n4.c3b93d431f0091c8be23185e15c9d1fee1e971c5.woff2") format("woff2"),
138       url("//oxfordhealthspan.com/cdn/fonts/lato/lato_n4.d5c00c781efb195594fd2fd4ad04f7882949e327.woff") format("woff");
139}
140
141@font-face {
142  font-family: Lato;
143  font-weight: 400;
144  font-style: italic;
145  font-display: fallback;
146  src: url("//oxfordhealthspan.com/cdn/fonts/lato/lato_i4.09c847adc47c2fefc3368f2e241a3712168bc4b6.woff2") format("woff2"),
147       url("//oxfordhealthspan.com/cdn/fonts/lato/lato_i4.3c7d9eb6c1b0a2bf62d892c3ee4582b016d0f30c.woff") format("woff");
148}
149
150:root {
151    /**
152     * ---------------------------------------------------------------------
153     * SPACING VARIABLES
154     *
155     * We are using a spacing inspired from frameworks like Tailwind CSS.
156     * ---------------------------------------------------------------------
157     */
158    --spacing-0-5: 0.125rem; /* 2px */
159    --spacing-1: 0.25rem; /* 4px */
160    --spacing-1-5: 0.375rem; /* 6px */
161    --spacing-2: 0.5rem; /* 8px */
162    --spacing-2-5: 0.625rem; /* 10px */
163    --spacing-3: 0.75rem; /* 12px */
164    --spacing-3-5: 0.875rem; /* 14px */
165    --spacing-4: 1rem; /* 16px */
166    --spacing-4-5: 1.125rem; /* 18px */
167    --spacing-5: 1.25rem; /* 20px */
168    --spacing-5-5: 1.375rem; /* 22px */
169    --spacing-6: 1.5rem; /* 24px */
170    --spacing-6-5: 1.625rem; /* 26px */
171    --spacing-7: 1.75rem; /* 28px */
172    --spacing-7-5: 1.875rem; /* 30px */
173    --spacing-8: 2rem; /* 32px */
174    --spacing-8-5: 2.125rem; /* 34px */
175    --spacing-9: 2.25rem; /* 36px */
176    --spacing-9-5: 2.375rem; /* 38px */
177    --spacing-10: 2.5rem; /* 40px */
178    --spacing-11: 2.75rem; /* 44px */
179    --spacing-12: 3rem; /* 48px */
180    --spacing-14: 3.5rem; /* 56px */
181    --spacing-16: 4rem; /* 64px */
182    --spacing-18: 4.5rem; /* 72px */
183    --spacing-20: 5rem; /* 80px */
184    --spacing-24: 6rem; /* 96px */
185    --spacing-28: 7rem; /* 112px */
186    --spacing-32: 8rem; /* 128px */
187    --spacing-36: 9rem; /* 144px */
188    --spacing-40: 10rem; /* 160px */
189    --spacing-44: 11rem; /* 176px */
190    --spacing-48: 12rem; /* 192px */
191    --spacing-52: 13rem; /* 208px */
192    --spacing-56: 14rem; /* 224px */
193    --spacing-60: 15rem; /* 240px */
194    --spacing-64: 16rem; /* 256px */
195    --spacing-72: 18rem; /* 288px */
196    --spacing-80: 20rem; /* 320px */
197    --spacing-96: 24rem; /* 384px */
198
199    /* Container */
200    --container-max-width: 1300px;
201    --container-narrow-max-width: 1050px;
202    --container-gutter: var(--spacing-5);
203    --section-outer-spacing-block: var(--spacing-12);
204    --section-inner-max-spacing-block: var(--spacing-10);
205    --section-inner-spacing-inline: var(--container-gutter);
206    --section-stack-spacing-block: var(--spacing-8);
207
208    /* Grid gutter */
209    --grid-gutter: var(--spacing-5);
210
211    /* Product list settings */
212    --product-list-row-gap: var(--spacing-8);
213    --product-list-column-gap: var(--grid-gutter);
214
215    /* Form settings */
216    --input-gap: var(--spacing-2);
217    --input-height: 2.625rem;
218    --input-padding-inline: var(--spacing-4);
219
220    /* Other sizes */
221    --sticky-area-height: calc(var(--sticky-announcement-bar-enabled, 0) * var(--announcement-bar-height, 0px) + var(--sticky-header-enabled, 0) * var(--header-height, 0px));
222
223    /* RTL support */
224    --transform-logical-flip: 1;
225    --transform-origin-start: left;
226    --transform-origin-end: right;
227
228    /**
229     * ---------------------------------------------------------------------
230     * TYPOGRAPHY
231     * ---------------------------------------------------------------------
232     */
233
234    /* Font properties */
235    --heading-font-family: Cormorant, serif;
236    --heading-font-weight: 400;
237    --heading-font-style: normal;
238    --heading-text-transform: normal;
239    --heading-letter-spacing: -0.02em;
240    --text-font-family: Lato, sans-serif;
241    --text-font-weight: 300;
242    --text-font-style: normal;
243    --text-letter-spacing: 0.0em;
244
245    /* Font sizes */
246    --text-h0: 3rem;
247    --text-h1: 2.5rem;
248    --text-h2: 2rem;
249    --text-h3: 1.5rem;
250    --text-h4: 1.375rem;
251    --text-h5: 1.125rem;
252    --text-h6: 1rem;
253    --text-xs: 0.9375rem;
254    --text-sm: 1.0rem;
255    --text-base: 1.125rem;
256    --text-lg: 1.375rem;
257
258    /**
259     * ---------------------------------------------------------------------
260     * COLORS
261     * ---------------------------------------------------------------------
262     */
263
264    /* Color settings */--accent: 74 26 72;
265    --text-primary: 28 28 28;
266    --background-primary: 247 245 243;
267    --dialog-background: 255 255 255;
268    --border-color: var(--text-color, var(--text-primary)) / 0.12;
269
270    /* Button colors */
271    --button-background-primary: 74 26 72;
272    --button-text-primary: 255 255 255;
273    --button-background-secondary: 74 26 72;
274    --button-text-secondary: 255 255 255;
275
276    /* Status colors */
277    --success-background: 250 245 238;
278    --success-text: 215 171 113;
279    --warning-background: 255 246 233;
280    --warning-text: 255 183 74;
281    --error-background: 254 231 231;
282    --error-text: 248 58 58;
283
284    /* Product colors */
285    --on-sale-text: 196 154 74;
286    --on-sale-badge-background: 196 154 74;
287    --on-sale-badge-text: 0 0 0;
288    --sold-out-badge-background: 0 0 0;
289    --sold-out-badge-text: 255 255 255;
290    --primary-badge-background: 196 154 74;
291    --primary-badge-text: 0 0 0;
292    --star-color: 196 154 74;
293    --product-card-background: 247 245 243;
294    --product-card-text: 28 28 28;
295
296    /* Header colors */
297    --header-background: 247 245 243;
298    --header-text: 28 28 28;
299
300    /* Footer colors */
301    --footer-background: 74 26 72;
302    --footer-text: 255 255 255;
303
304    /* Rounded variables (used for border radius) */
305    --rounded-xs: 0.0rem;
306    --rounded-sm: 0.0rem;
307    --rounded: 0.0rem;
308    --rounded-lg: 0.0rem;
309    --rounded-full: 9999px;
310
311    --rounded-button: 0.0rem;
312    --rounded-input: 0.25rem;
313
314    /* Box shadow */
315    --shadow-sm: 0 2px 8px rgb(var(--text-primary) / 0.1);
316    --shadow: 0 5px 15px rgb(var(--text-primary) / 0.1);
317    --shadow-md: 0 5px 30px rgb(var(--text-primary) / 0.1);
318    --shadow-block: 0px 18px 50px rgb(var(--text-primary) / 0.1);
319
320    /**
321     * ---------------------------------------------------------------------
322     * OTHER
323     * ---------------------------------------------------------------------
324     */
325
326    --cursor-close-svg-url: url(//oxfordhealthspan.com/cdn/shop/t/111/assets/cursor-close.svg?v=147174565022153725511775201951);
327    --cursor-zoom-in-svg-url: url(//oxfordhealthspan.com/cdn/shop/t/111/assets/cursor-zoom-in.svg?v=154953035094101115921775201951);
328    --cursor-zoom-out-svg-url: url(//oxfordhealthspan.com/cdn/shop/t/111/assets/cursor-zoom-out.svg?v=16155520337305705181775201951);
329    --checkmark-svg-url: url(//oxfordhealthspan.com/cdn/shop/t/111/assets/checkmark.svg?v=77552481021870063511775201951);
330  }
331
332  [dir="rtl"]:root {
333    /* RTL support */
334    --transform-logical-flip: -1;
335    --transform-origin-start: right;
336    --transform-origin-end: left;
337  }
338
339  @media screen and (min-width: 700px) {
340    :root {
341      /* Typography (font size) */
342      --text-h0: 4rem;
343      --text-h1: 3rem;
344      --text-h2: 2.5rem;
345      --text-h3: 2rem;
346      --text-h4: 1.625rem;
347      --text-h5: 1.25rem;
348      --text-h6: 1.125rem;
349
350      --text-xs: 0.875rem;
351      --text-sm: 1.0rem;
352      --text-base: 1.125rem;
353      --text-lg: 1.375rem;
354
355      /* Spacing */
356      --container-gutter: 2rem;
357      --section-outer-spacing-block: var(--spacing-16);
358      --section-inner-max-spacing-block: var(--spacing-12);
359      --section-inner-spacing-inline: var(--spacing-10);
360      --section-stack-spacing-block: var(--spacing-12);
361
362      /* Grid gutter */
363      --grid-gutter: var(--spacing-6);
364
365      /* Product list settings */
366      --product-list-row-gap: var(--spacing-12);
367
368      /* Form settings */
369      --input-gap: 1rem;
370      --input-height: 3.125rem;
371      --input-padding-inline: var(--spacing-5);
372    }
373  }
374
375  @media screen and (min-width: 1000px) {
376    :root {
377      /* Spacing settings */
378      --container-gutter: var(--spacing-12);
379      --section-outer-spacing-block: var(--spacing-18);
380      --section-inner-max-spacing-block: var(--spacing-16);
381      --section-inner-spacing-inline: var(--spacing-12);
382      --section-stack-spacing-block: var(--spacing-12);
383    }
384  }
385
386  @media screen and (min-width: 1150px) {
387    :root {
388      /* Spacing settings */
389      --container-gutter: var(--spacing-12);
390      --section-outer-spacing-block: var(--spacing-20);
391      --section-inner-max-spacing-block: var(--spacing-16);
392      --section-inner-spacing-inline: var(--spacing-12);
393      --section-stack-spacing-block: var(--spacing-12);
394    }
395  }
396
397  @media screen and (min-width: 1400px) {
398    :root {
399      /* Typography (font size) */
400      --text-h0: 5rem;
401      --text-h1: 3.75rem;
402      --text-h2: 3rem;
403      --text-h3: 2.25rem;
404      --text-h4: 2rem;
405      --text-h5: 1.5rem;
406      --text-h6: 1.25rem;
407
408      --section-outer-spacing-block: var(--spacing-24);
409      --section-inner-max-spacing-block: var(--spacing-18);
410      --section-inner-spacing-inline: var(--spacing-14);
411    }
412  }
413
414  @media screen and (min-width: 1600px) {
415    :root {
416      --section-outer-spacing-block: var(--spacing-24);
417      --section-inner-max-spacing-block: var(--spacing-20);
418      --section-inner-spacing-inline: var(--spacing-16);
419    }
420  }
421
422  /**
423   * ---------------------------------------------------------------------
424   * LIQUID DEPENDANT CSS
425   *
426   * Our main CSS is Liquid free, but some very specific features depend on
427   * theme settings, so we have them here
428   * ---------------------------------------------------------------------
429   */</style>
429<script>
430  document.documentElement.classList.replace('no-js', 'js');
431
432  // This allows to expose several variables to the global scope, to be used in scripts
433  window.themeVariables = {
434    settings: {
435      showPageTransition: false,
436      headingApparition: "split_fade",
437      pageType: "blog",
438      moneyFormat: "${{ amount }}",
439      moneyWithCurrencyFormat: "${{ amount }} USD",
440      currencyCodeEnabled: false,
441      cartType: "page",
442      showDiscount: false,
443      discountMode: "percentage"
444    },
445
446    strings: {
447      accessibilityClose: "Close",
448      accessibilityNext: "Next",
449      accessibilityPrevious: "Previous",
450      addToCartButton: "Add to cart",
451      soldOutButton: "Sold out",
452      preOrderButton: "Pre-order",
453      unavailableButton: "Unavailable",
454      closeGallery: "Close gallery",
455      zoomGallery: "Zoom",
456      errorGallery: "Image cannot be loaded",
457      soldOutBadge: "Sold out",
458      discountBadge: "Save @@",
459      sku: "SKU:",
460      searchNoResults: "No results could be found.",
461      addOrderNote: "Add order note",
462      editOrderNote: "Edit order note",
463      shippingEstimatorNoResults: "Sorry, we do not ship to your address.",
464      shippingEstimatorOneResult: "There is one shipping rate for your address:",
465      shippingEstimatorMultipleResults: "There are several shipping rates for your address:",
466      shippingEstimatorError: "One or more error occurred while retrieving shipping rates:"
467    },
468
469    breakpoints: {
470      'sm': 'screen and (min-width: 700px)',
471      'md': 'screen and (min-width: 1000px)',
472      'lg': 'screen and (min-width: 1150px)',
473      'xl': 'screen and (min-width: 1400px)',
474
475      'sm-max': 'screen and (max-width: 699px)',
476      'md-max': 'screen and (max-width: 999px)',
477      'lg-max': 'screen and (max-width: 1149px)',
478      'xl-max': 'screen and (max-width: 1399px)'
479    }
480  };// For detecting native share
481  document.documentElement.classList.add(`native-share--${navigator.share ? 'enabled' : 'disabled'}`);</script>
481<script type="module" src="//oxfordhealthspan.com/cdn/shop/t/111/assets/vendor.min.js?v=103153229489106415681778364292"></script>
481
482    
482<script type="module" src="//oxfordhealthspan.com/cdn/shop/t/111/assets/theme.js?v=40591305100080791921779189279"></script>
482
483    
483<script type="module" src="//oxfordhealthspan.com/cdn/shop/t/111/assets/sections.js?v=179932734514206698201779202564"></script>
483
484    
484<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
484
485    
485<script type="module" src="//oxfordhealthspan.com/cdn/shop/t/111/assets/custom.js?v=121487881761104649041775201878"></script>
485
486 
487    
487<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
487<meta name="google-site-verification" content="2UQIJZbhjvPrpTdbOGa85w18CEsIfmvmDLiKqKZq_Fk">
488<meta name="google-site-verification" content="2UQIJZbhjvPrpTdbOGa85w18CEsIfmvmDLiKqKZq_Fk">
489<meta name="facebook-domain-verification" content="xqrct0vv100kkvjdtzrhj8xegne0w0">
490<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/55109845160/digital_wallets/dialog">
491<meta id="in-context-paypal-metadata" data-shop-id="55109845160" data-venmo-supported="false" data-environment="production" data-locale="en_US" data-paypal-v4="true" data-currency="USD">
492<link rel="ucp" href="/.well-known/ucp" version="2026-08-25"><link rel="alternate" type="application/atom+xml" title="Feed" href="/blogs/aging-well.atom" />
493<link rel="alternate" hreflang="x-default" href="https://oxfordhealthspan.com/blogs/aging-well">
494<link rel="alternate" hreflang="en" href="https://oxfordhealthspan.com/blogs/aging-well">
495<link rel="alternate" hreflang="en-CA" href="https://oxfordhealthspan.com/en-ca/blogs/aging-well">
496<script async="async" src="/checkouts/internal/preloads.js?locale=en-US&configuration_id=3873734905&edited_at=1786385944"></script>
496
497<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
498<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&configuration_id=3873734905&edited_at=1786385944&shop_id=55109845160" crossorigin="anonymous"></script>
vendor: 1 bytes, line 498
498
499<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":55109845160,"countryCode":"US","currencyCode":"USD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/55109845160","merchantName":"Oxford Healthspan® ","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","elo","jcb"],"total":{"type":"pending","label":"Oxford Healthspan® ","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 499
499
500<script id="shopify-features" type="application/json">{"accessToken":"1b63733dbaad33fcc3227ecc79567576","betas":["rich-media-storefront-analytics"],"domain":"oxfordhealthspan.com","predictiveSearch":true,"shopId":55109845160,"locale":"en"}</script>
vendor: 1 bytes, line 500
500
501<script>var Shopify = Shopify || {};
502Shopify.shop = "oxford-healthspan.myshopify.com";
503Shopify.locale = "en";
504Shopify.currency = {"active":"USD","rate":"1.0"};
505Shopify.country = "US";
506Shopify.theme = {"name":"Copy of Stay.AI Duplicate Theme-12.03.25[A\/B test]","id":158472962297,"schema_name":"Impact","schema_version":"4.3.2","theme_store_id":null,"role":"main"};
507Shopify.theme.handle = "null";
508Shopify.theme.style = {"id":null,"handle":null};
509Shopify.cdnHost = "oxfordhealthspan.com/cdn";
510Shopify.routes = Shopify.routes || {};
511Shopify.routes.root = "/";
512Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js";
513Shopify.SignInWithShop = Shopify.SignInWithShop || {};
514Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {};
515Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 515
515
516<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 516
516
517<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 517
517
518<script>
519  window.ShopifyPay = window.ShopifyPay || {};
520  window.ShopifyPay.apiHost = "shop.app\/pay";
521  window.ShopifyPay.redirectState = null;
522</script>
vendor: 1 bytes, line 522
522
523<script>
524  window.Shopify = window.Shopify || {};
525  window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {};
526  window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 };
527  window.Shopify.SignInWithShop.eligible = true;
528</script>
vendor: 1 bytes, line 528
528
529<script id="shop-js-analytics" type="application/json">{"pageType":"blog"}</script>
vendor: 1 bytes, line 529
529
530<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 530
530
531<script type="module">
532  await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js");
533
534  window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true});
535
536</script>
vendor: 1 bytes, line 536
536
537<script>
538  window.Shopify = window.Shopify || {};
539  if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {};
540  window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]};
541</script>
vendor: 1 bytes, line 541
541
542<script>(function() {
543  var isLoaded = false;
544  function asyncLoad() {
545    if (isLoaded) return;
546    isLoaded = true;
547    var urls = ["https:\/\/scripttags.jst.ai\/shopify_justuno_55109845160_90aeb980-b9f5-11ee-86ce-197322c2ec9b.js?shop=oxford-healthspan.myshopify.com","https:\/\/api.socialsnowball.io\/js\/referral.js?shop=oxford-healthspan.myshopify.com"];
548    for (var i = 0; i < urls.length; i++) {
549      var s = document.createElement('script');
550      s.type = 'text/javascript';
551      s.async = true;
552      s.src = urls[i];
553      var x = document.getElementsByTagName('script')[0];
554      x.parentNode.insertBefore(s, x);
555    }
556  };
557  if(window.attachEvent) {
558    window.attachEvent('onload', asyncLoad);
559  } else {
560    window.addEventListener('load', asyncLoad, false);
561  }
562})();</script>
vendor: 1 bytes, line 562
562
563<script id="__st">var __st={"a":55109845160,"offset":-14400,"reqid":"99b217d8-80b9-4b43-aedf-3c58c2a033db-1791056545","pageurl":"oxfordhealthspan.com\/blogs\/aging-well","s":"blogs-77418266792","u":"034aef5c3ce3","p":"blog","rtyp":"blog","rid":77418266792};</script>
vendor: 1 bytes, line 563
563
564<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 564
564
565<script id="form-persister">!function(){'use strict';const t='contact',e='new_comment',n=[[t,t],['blogs',e],['comments',e],[t,'customer']],o='password',r='form_key',c=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',o],s=()=>{try{return window.sessionStorage}catch{return}},i='__shopify_v',u=t=>t.elements[r],a=function(){const t=[...n].map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(',');var e;return e=t,()=>e?[...document.querySelectorAll(e)].map((t=>t.form)):[]}();function m(t){const e=u(t);a().includes(t)&&(!e||!e.value)&&function(t){try{if(!s())return;!function(t){const e=s();if(!e)return;const n=u(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){u(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:r})),t.elements[r].value=e}(t,e),function(t,e){const n=s();if(!n)return;const r=[...t.querySelectorAll(`input[type='${o}']`)].map((({name:t})=>t)),u=[...c,...r],a={};for(const[o,c]of new FormData(t).entries())u.includes(o)||(a[o]=c);n.setItem(e,JSON.stringify({[i]:1,action:t.action,data:a}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(t)}const f=t=>{if('true'===t.dataset.persistBound)return;const e=function(t,e){const n=function(t){return'function'==typeof t.submit?t.submit:HTMLFormElement.prototype.submit}(t).bind(t);return function(){let t;return()=>{t||(t=!0,(()=>{try{e(),n()}catch(t){(t=>{console.error('form submit failed',t)})(t)}})(),setTimeout((()=>t=!1),250))}}()}(t,(()=>{m(t)}));!function(t,e){if('function'==typeof t.submit&&'function'==typeof e)try{t.submit=e}catch{}}(t,e),t.addEventListener('submit',(t=>{t.preventDefault(),e()})),t.dataset.persistBound='true'};!function(){function t(t){const e=(t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form})(t);e&&m(e)}document.addEventListener('submit',t),document.addEventListener('DOMContentLoaded',(()=>{const e=a();for(const t of e)f(t);var n;n=document.body,new window.MutationObserver((t=>{for(const e of t)if('childList'===e.type&&e.addedNodes.length)for(const t of e.addedNodes)1===t.nodeType&&'FORM'===t.tagName&&a().includes(t)&&f(t)})).observe(n,{childList:!0,subtree:!0,attributes:!1}),document.removeEventListener('submit',t)}))}()}();</script>
vendor: 1 bytes, line 565
565
566<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//oxfordhealthspan.com/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 566
566
567<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//oxfordhealthspan.com/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
567<script crossorigin="anonymous" defer="defer" src="//oxfordhealthspan.com/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 567
567
568<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 568
568
569<script>
570  window.Shopify = window.Shopify || {};
571  window.Shopify.MCP = window.Shopify.MCP || {};
572  window.Shopify.MCP.enabled = true;
573  window.Shopify.MCP.shop = "oxford-healthspan.myshopify.com";
574  window.Shopify.MCP.mcpEndpoint = "https:\/\/oxfordhealthspan.com\/api\/mcp";
575  window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n  - What is your return policy?\n  - What is your shipping policy?\n  - What is your phone number?\n  - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}];
576</script>
vendor: 1 bytes, line 576
576
577<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/oxfordhealthspan.com\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})();
578</script>
vendor: 1 bytes, line 578
578
579<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://oxfordhealthspan.com/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}};
580</script>
vendor: 1 bytes, line 580
580
581<script data-source-attribution="shopify.dynamic_checkout.buyer_consent">
582  function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent);
583</script>
vendor: 1 bytes, line 583
583
584<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}}));
585</script>
585
586<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://oxfordhealthspan.com/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous">
587<style id="shopify-accelerated-checkout-cart">
588        #shopify-buyer-consent {
589  margin-top: 1em;
590  display: inline-block;
591  width: 100%;
592}
593
594#shopify-buyer-consent.hidden {
595  display: none;
596}
597
598#shopify-subscription-policy-button {
599  background: none;
600  border: none;
601  padding: 0;
602  text-decoration: underline;
603  font-size: inherit;
604  cursor: pointer;
605}
606
607#shopify-subscription-policy-button::before {
608  box-shadow: none;
609}
610
611      </style>
612
613<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
613
614<link href="//oxfordhealthspan.com/cdn/shop/t/111/assets/custom-styles.css?v=167313737911045023021778364291" rel="stylesheet" type="text/css" media="all" /><link href="//oxfordhealthspan.com/cdn/shop/t/111/assets/theme.css?v=127937888374111096481775201901" rel="stylesheet" type="text/css" media="all" /><link href="//oxfordhealthspan.com/cdn/shop/t/111/assets/custom.css?v=165841571629204109341779275165" rel="stylesheet" type="text/css" media="all" /><!-- <link rel="stylesheet" href="https://use.typekit.net/ghg1viw.css"> -->
615    
616    
617    <!-- Meta Pixel Code -->
618    
618<script>
619      !function(f,b,e,v,n,t,s)
620      {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
621      n.callMethod.apply(n,arguments):n.queue.push(arguments)};
622      if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
623      n.queue=[];t=b.createElement(e);t.async=!0;
624      t.src=v;s=b.getElementsByTagName(e)[0];
625      s.parentNode.insertBefore(t,s)}(window, document,'script',
626      'https://connect.facebook.net/en_US/fbevents.js');; "‌")
627      fbq('init', '2452568668461647');
628      fbq('track', 'PageView');
629    </script>
629
630    <noscript>
631      <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=2452568668461647&ev=PageView&noscript=1"/>
632    </noscript>
633    <!-- End Meta Pixel Code -->
634    
635    <head>
636  <link rel="stylesheet" href="https://use.typekit.net/ghg1viw.css">
637  <!-- BEGIN app block: shopify://apps/easy-tag-gtm-data-layer/blocks/datalayer-embed-block/be308f3f-c82d-4290-b187-8561d4a8782a -->
637<script>(function(w, d) {var f = d.getElementsByTagName('script')[0];var s = d.createElement('script');s.async = true;s.src = "https:\/\/cdn.shopify.com\/extensions\/9d4b20e8-14f7-4a65-86dc-eaa196dcf826\/2.1.0\/assets\/tidl-2.1.0.min.js";s.onload = function() {window.TAGinstall.init({"data_layer": {"model": "legacy","item_id_selector": "sku|variant_id"},"events":{"device_data":true,"user_data":true,"cart_data":true,"collections":true,"product_click":true,"product":true,"add_to_cart":true,"remove_from_cart":true,"login":true,"register":true,"search":true},"currency":"USD","gtm_container_id":"GTM-TVM9HNQ",}, {
638   "_internal": {},"contextData": {"page": {"type":"blog"}
639   },"cartData" : {"pageType":"blog","items": [],"total":0.0,"currency":"USD"}});
640
641
642    };
643    f.parentNode.insertBefore(s, f);
644})(window, document);
645</script>
645
646<!-- Google Tag Manager -->
647<script>
vendor: 327 bytes, lines 647-651
647(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
648new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
649j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
650'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
651})(window,document,'script','dataLayer','
651GTM-TVM9HNQ
vendor: 3 bytes, line 651
651');
651</script>
651
652<!-- End Google Tag Manager -->
653
654<!-- END app block --><!-- BEGIN app block: shopify://apps/okendo/blocks/theme-settings/bb689e69-ea70-4661-8fb7-ad24a2e23c29 --><!-- BEGIN app snippet: header-metafields -->
655
656
657
658
659
660
661
662
663
664
665
666
667    
668        <style data-oke-reviews-version="0.94.3" type="text/css" data-href="https://cdn-static.okendo.io/reviews-widget-plus/css/okendo-reviews-styles.6dbb2446.css"></style><style data-oke-reviews-version="0.94.3" type="text/css" data-href="https://cdn-static.okendo.io/reviews-widget-plus/css/modules/okendo-star-rating.4cb378a8.css"></style><style data-oke-reviews-version="0.94.3" type="text/css" data-href="https://cdn-static.okendo.io/reviews-widget-plus/css/modules/okendo-reviews-keywords.0942444f.css"></style><style data-oke-reviews-version="0.94.3" type="text/css" data-href="https://cdn-static.okendo.io/reviews-widget-plus/css/modules/okendo-reviews-summary.a0c9d7d6.css"></style><style type="text/css">.okeReviews[data-oke-container],div.okeReviews{font-size:14px;font-size:var(--oke-text-regular);font-weight:400;font-family:var(--oke-text-fontFamily);line-height:1.6}.okeReviews[data-oke-container] *,.okeReviews[data-oke-container] :after,.okeReviews[data-oke-container] :before,div.okeReviews *,div.okeReviews :after,div.okeReviews :before{box-sizing:border-box}.okeReviews[data-oke-container] h1,.okeReviews[data-oke-container] h2,.okeReviews[data-oke-container] h3,.okeReviews[data-oke-container] h4,.okeReviews[data-oke-container] h5,.okeReviews[data-oke-container] h6,div.okeReviews h1,div.okeReviews h2,div.okeReviews h3,div.okeReviews h4,div.okeReviews h5,div.okeReviews h6{font-size:1em;font-weight:400;line-height:1.4;margin:0}.okeReviews[data-oke-container] ul,div.okeReviews ul{padding:0;margin:0}.okeReviews[data-oke-container] li,div.okeReviews li{list-style-type:none;padding:0}.okeReviews[data-oke-container] p,div.okeReviews p{line-height:1.8;margin:0 0 4px}.okeReviews[data-oke-container] p:last-child,div.okeReviews p:last-child{margin-bottom:0}.okeReviews[data-oke-container] a,div.okeReviews a{text-decoration:none;color:inherit}.okeReviews[data-oke-container] button,div.okeReviews button{border-radius:0;border:0;box-shadow:none;margin:0;width:auto;min-width:auto;padding:0;background-color:transparent;min-height:auto}.okeReviews[data-oke-container] button,.okeReviews[data-oke-container] input,.okeReviews[data-oke-container] select,.okeReviews[data-oke-container] textarea,div.okeReviews button,div.okeReviews input,div.okeReviews select,div.okeReviews textarea{font-family:inherit;font-size:1em}.okeReviews[data-oke-container] label,.okeReviews[data-oke-container] select,div.okeReviews label,div.okeReviews select{display:inline}.okeReviews[data-oke-container] select,div.okeReviews select{width:auto}.okeReviews[data-oke-container] article,.okeReviews[data-oke-container] aside,div.okeReviews article,div.okeReviews aside{margin:0}.okeReviews[data-oke-container] table,div.okeReviews table{background:transparent;border:0;border-collapse:collapse;border-spacing:0;font-family:inherit;font-size:1em;table-layout:auto}.okeReviews[data-oke-container] table td,.okeReviews[data-oke-container] table th,.okeReviews[data-oke-container] table tr,div.okeReviews table td,div.okeReviews table th,div.okeReviews table tr{border:0;font-family:inherit;font-size:1em}.okeReviews[data-oke-container] table td,.okeReviews[data-oke-container] table th,div.okeReviews table td,div.okeReviews table th{background:transparent;font-weight:400;letter-spacing:normal;padding:0;text-align:left;text-transform:none;vertical-align:middle}.okeReviews[data-oke-container] table tr:hover td,.okeReviews[data-oke-container] table tr:hover th,div.okeReviews table tr:hover td,div.okeReviews table tr:hover th{background:transparent}.okeReviews[data-oke-container] fieldset,div.okeReviews fieldset{border:0;padding:0;margin:0;min-width:0}.okeReviews[data-oke-container] img,.okeReviews[data-oke-container] svg,div.okeReviews img,div.okeReviews svg{max-width:none}.okeReviews[data-oke-container] div:empty,div.okeReviews div:empty{display:block}.okeReviews[data-oke-container] .oke-icon:before,div.okeReviews .oke-icon:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:inherit}.okeReviews[data-oke-container] .oke-icon--select-arrow:before,div.okeReviews .oke-icon--select-arrow:before{content:""}.okeReviews[data-oke-container] .oke-icon--loading:before,div.okeReviews .oke-icon--loading:before{content:""}
668.okeReviews[data-oke-container] .oke-icon--pencil:before,div.okeReviews .oke-icon--pencil:before{content:""}.okeReviews[data-oke-container] .oke-icon--filter:before,div.okeReviews .oke-icon--filter:before{content:""}.okeReviews[data-oke-container] .oke-icon--play:before,div.okeReviews .oke-icon--play:before{content:""}.okeReviews[data-oke-container] .oke-icon--tick-circle:before,div.okeReviews .oke-icon--tick-circle:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-left:before,div.okeReviews .oke-icon--chevron-left:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-right:before,div.okeReviews .oke-icon--chevron-right:before{content:""}.okeReviews[data-oke-container] .oke-icon--thumbs-down:before,div.okeReviews .oke-icon--thumbs-down:before{content:""}.okeReviews[data-oke-container] .oke-icon--thumbs-up:before,div.okeReviews .oke-icon--thumbs-up:before{content:""}.okeReviews[data-oke-container] .oke-icon--close:before,div.okeReviews .oke-icon--close:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-up:before,div.okeReviews .oke-icon--chevron-up:before{content:""}.okeReviews[data-oke-container] .oke-icon--chevron-down:before,div.okeReviews .oke-icon--chevron-down:before{content:""}.okeReviews[data-oke-container] .oke-icon--star:before,div.okeReviews .oke-icon--star:before{content:""}.okeReviews[data-oke-container] .oke-icon--magnifying-glass:before,div.okeReviews .oke-icon--magnifying-glass:before{content:""}@font-face{font-family:oke-widget-icons;src:url(https://cdn-static.okendo.io/reviews-widget-plus/fonts/oke-widget-icons.ttf) format("truetype"),url(https://cdn-static.okendo.io/reviews-widget-plus/fonts/oke-widget-icons.woff) format("woff"),url(https://cdn-static.okendo.io/reviews-widget-plus/img/oke-widget-icons.bc0d6b0a.svg) format("svg");font-weight:400;font-style:normal;font-display:swap}.okeReviews[data-oke-container] .oke-button,div.okeReviews .oke-button{display:inline-block;border-style:solid;border-color:var(--oke-button-borderColor);border-width:var(--oke-button-borderWidth);background-color:var(--oke-button-backgroundColor);line-height:1;padding:12px 24px;margin:0;border-radius:var(--oke-button-borderRadius);color:var(--oke-button-textColor);text-align:center;position:relative;font-weight:var(--oke-button-fontWeight);font-size:var(--oke-button-fontSize);font-family:var(--oke-button-fontFamily);outline:0}.okeReviews[data-oke-container] .oke-button-text,.okeReviews[data-oke-container] .oke-button .oke-icon,div.okeReviews .oke-button-text,div.okeReviews .oke-button .oke-icon{line-height:1}.okeReviews[data-oke-container] .oke-button.oke-is-loading,div.okeReviews .oke-button.oke-is-loading{position:relative}.okeReviews[data-oke-container] .oke-button.oke-is-loading:before,div.okeReviews .oke-button.oke-is-loading:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:undefined;font-size:12px;display:inline-block;animation:oke-spin 1s linear infinite;position:absolute;width:12px;height:12px;top:0;left:0;bottom:0;right:0;margin:auto}.okeReviews[data-oke-container] .oke-button.oke-is-loading>*,div.okeReviews .oke-button.oke-is-loading>*{opacity:0}.okeReviews[data-oke-container] .oke-button.oke-is-active,div.okeReviews .oke-button.oke-is-active{background-color:var(--oke-button-backgroundColorActive);color:var(--oke-button-textColorActive);border-color:var(--oke-button-borderColorActive)}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading),div.okeReviews .oke-button:not(.oke-is-loading){cursor:pointer}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):hover,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):hover{background-color:var(--oke-button-backgroundColorHover);color:var(--oke-button-textColorHover);border-color:var(--oke-button-borderColorHover);box-shadow:0 0 0 2px var(--oke-button-backgroundColorHover)}.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):active,.okeReviews[data-oke-container] .oke-button:not(.oke-is-loading):not(.oke-is-active):hover:active,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):active,div.okeReviews .oke-button:not(.oke-is-loading):not(.oke-is-active):hover:active{background-color:var(--oke-button-backgroundColorActive);color:var(--oke-button-textColorActive);border-color:var(--oke-button-borderColorActive)}.okeReviews[data-oke-container] .oke-title,div.okeReviews .oke-title{font-weight:var(--oke-title-fontWeight);font-size:var(--oke-title-fontSize);font-family:var(--oke-title-fontFamily)}.okeReviews[data-oke-container] .oke-bodyText,div.okeReviews .oke-bodyText{font-weight:var(--oke-bodyText-fontWeight);font-size:var(--oke-bodyText-fontSize);font-family:var(--oke-bodyText-fontFamily)}.okeReviews[data-oke-container] .oke-linkButton,div.okeReviews .oke-linkButton{curs
668or:pointer;font-weight:700;pointer-events:auto;text-decoration:underline}.okeReviews[data-oke-container] .oke-linkButton:hover,div.okeReviews .oke-linkButton:hover{text-decoration:none}.okeReviews[data-oke-container] .oke-readMore,div.okeReviews .oke-readMore{cursor:pointer;color:inherit;text-decoration:underline}.okeReviews[data-oke-container] .oke-select,div.okeReviews .oke-select{cursor:pointer;background-repeat:no-repeat;background-position-x:100%;background-position-y:50%;border:none;padding:0 24px 0 12px;-moz-appearance:none;appearance:none;color:inherit;-webkit-appearance:none;background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='currentColor' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E");outline-offset:4px}.okeReviews[data-oke-container] .oke-select:disabled,div.okeReviews .oke-select:disabled{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg fill='%239a9db1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E")}.okeReviews[data-oke-container] .oke-loader,div.okeReviews .oke-loader{position:relative}.okeReviews[data-oke-container] .oke-loader:before,div.okeReviews .oke-loader:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:var(--oke-text-secondaryColor);font-size:12px;display:inline-block;animation:oke-spin 1s linear infinite;position:absolute;width:12px;height:12px;top:0;left:0;bottom:0;right:0;margin:auto}.okeReviews[data-oke-container] .oke-a11yText,div.okeReviews .oke-a11yText{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.okeReviews[data-oke-container] .oke-hidden,div.okeReviews .oke-hidden{display:none}.okeReviews[data-oke-container] .oke-modal,div.okeReviews .oke-modal{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2147483647;max-height:100%;background-color:rgba(0,0,0,.5);padding:40px 0 12px}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal,div.okeReviews .oke-modal{display:flex;align-items:center;padding:48px 0}}.okeReviews[data-oke-container] .oke-modal ::-moz-selection,div.okeReviews .oke-modal ::-moz-selection{background-color:rgba(39,45,69,.2)}.okeReviews[data-oke-container] .oke-modal ::selection,div.okeReviews .oke-modal ::selection{background-color:rgba(39,45,69,.2)}.okeReviews[data-oke-container] .oke-modal,.okeReviews[data-oke-container] .oke-modal p,div.okeReviews .oke-modal,div.okeReviews .oke-modal p{color:#272d45}.okeReviews[data-oke-container] .oke-modal-content,div.okeReviews .oke-modal-content{background-color:#fff;margin:auto;position:relative;will-change:transform,opacity;width:calc(100% - 24px)}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal-content,div.okeReviews .oke-modal-content{max-width:1000px}}.okeReviews[data-oke-container] .oke-modal-close,div.okeReviews .oke-modal-close{cursor:pointer;position:absolute;width:32px;height:32px;top:-32px;padding:4px;right:-4px;line-height:1}.okeReviews[data-oke-container] .oke-modal-close:before,div.okeReviews .oke-modal-close:before{font-family:oke-widget-icons!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";color:#fff;font-size:24px;display:inline-block;width:24px;height:24px}.okeReviews[data-oke-container] .oke-modal-overlay,div.okeReviews .oke-modal-overlay{background-color:rgba(43,46,56,.9)}@media only screen and (min-width:1024px){.okeReviews[data-oke-container] .oke-modal--large .oke-modal-content,div.okeReviews .oke-modal--large .oke-modal-content{max-width:1200px}}.okeReviews[data-oke-container] .oke-modal .oke-helpful,.okeReviews[data-oke-container] .oke-modal .oke-helpful-vote-button,.okeReviews[data-oke-container] .oke-modal .oke-reviewContent-date,div.okeReviews .oke-modal .oke-helpful,div.okeReviews .oke-modal .oke-helpful-vote-button,div.okeReviews .oke-modal .oke-reviewContent-date{color:#676986}.oke-modal .okeReviews[data-oke-container].oke-w,.oke-modal div.okeReviews.oke-w{color:#272d45}.okeReviews[data-oke-container] .oke-tag,div.okeReviews .oke-tag{align-items:center;color:#272d45;display:flex;font-size:var(--oke-text-small);font-weight:600;text-align:left;position:relative;z-index:2;background-color:#f4f4f6;padding:4px 6px;border:none;border-radius:4px;gap:6px;line-height:1}.okeReviews[data-oke-container] .oke-tag svg,div.okeReviews .oke-tag svg{fill:currentColor;height:1rem}.okeReviews[data-oke-container] .hooper,div.okeReviews .hooper{height:auto}.okeReviews--left{text-align:left}.okeReviews--right{text-align:right}.okeReviews--center{text-align:center}.okeReviews :not([tabindex="-1"]):focus-visible{outline:5px auto highlight;outline:5px auto -webkit-focus-ring-color}.is-oke-modalOpen{overflow:hidden!important}img.oke-is-error{background-color:var(--oke-shadingColor);background-size:cover;background-position:50% 50%;box-shadow:inset 0 0 0 1px var(--oke-border-color)}@keyframes oke-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes oke-fade-in{0%{opacity:0}
668to{opacity:1}}.layout-panel-flex>div:has([data-oke-container]){width:100%}
669.oke-stars{line-height:1;position:relative;display:inline-block}.oke-stars-background svg{overflow:visible}.oke-stars-foreground{overflow:hidden;position:absolute;top:0;left:0}.oke-sr{display:inline-block;padding-top:var(--oke-starRating-spaceAbove);padding-bottom:var(--oke-starRating-spaceBelow)}.oke-sr .oke-is-clickable{cursor:pointer}.oke-sr--hidden{display:none}.oke-sr-count,.oke-sr-rating,.oke-sr-stars{display:inline-block;vertical-align:middle}.oke-sr-stars{line-height:1;margin-right:8px}.oke-sr-rating{display:none}.oke-sr-count--brackets:before{content:"("}.oke-sr-count--brackets:after{content:")"}
670.oke-rk{display:block}.okeReviews[data-oke-container] .oke-reviewsKeywords-heading,div.okeReviews .oke-reviewsKeywords-heading{font-weight:700;margin-bottom:8px}.okeReviews[data-oke-container] .oke-reviewsKeywords-heading-skeleton,div.okeReviews .oke-reviewsKeywords-heading-skeleton{height:calc(var(--oke-button-fontSize) + 4px);width:150px}.okeReviews[data-oke-container] .oke-reviewsKeywords-list,div.okeReviews .oke-reviewsKeywords-list{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category,div.okeReviews .oke-reviewsKeywords-list-category{background-color:var(--oke-filter-backgroundColor);color:var(--oke-filter-textColor);border:1px solid var(--oke-filter-borderColor);border-radius:var(--oke-filter-borderRadius);padding:6px 16px;transition:background-color .1s ease-out,border-color .1s ease-out;white-space:nowrap}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category.oke-is-clickable,div.okeReviews .oke-reviewsKeywords-list-category.oke-is-clickable{cursor:pointer}.okeReviews[data-oke-container] .oke-reviewsKeywords-list-category.oke-is-active,div.okeReviews .oke-reviewsKeywords-list-category.oke-is-active{background-color:var(--oke-filter-backgroundColorActive);color:var(--oke-filter-textColorActive);border-color:var(--oke-filter-borderColorActive)}.okeReviews[data-oke-container] .oke-reviewsKeywords .oke-translateButton,div.okeReviews .oke-reviewsKeywords .oke-translateButton{margin-top:12px}
671.oke-rs{display:block}.oke-rs .oke-reviewsSummary.oke-is-preRender .oke-reviewsSummary-summary{-webkit-mask:linear-gradient(180deg,#000 0,#000 40%,transparent 95%,transparent 0) 100% 50%/100% 100% repeat-x;mask:linear-gradient(180deg,#000 0,#000 40%,transparent 95%,transparent 0) 100% 50%/100% 100% repeat-x;max-height:150px}.okeReviews[data-oke-container] .oke-reviewsSummary .oke-tooltip,div.okeReviews .oke-reviewsSummary .oke-tooltip{display:inline-block;font-weight:400}.okeReviews[data-oke-container] .oke-reviewsSummary .oke-tooltip-trigger,div.okeReviews .oke-reviewsSummary .oke-tooltip-trigger{height:15px;width:15px;overflow:hidden;transform:translateY(-10%)}.okeReviews[data-oke-container] .oke-reviewsSummary-heading,div.okeReviews .oke-reviewsSummary-heading{align-items:center;-moz-column-gap:4px;column-gap:4px;display:inline-flex;font-weight:700;margin-bottom:8px}.okeReviews[data-oke-container] .oke-reviewsSummary-heading-skeleton,div.okeReviews .oke-reviewsSummary-heading-skeleton{height:calc(var(--oke-button-fontSize) + 4px);width:150px}.okeReviews[data-oke-container] .oke-reviewsSummary-icon,div.okeReviews .oke-reviewsSummary-icon{fill:currentColor;font-size:14px}.okeReviews[data-oke-container] .oke-reviewsSummary-icon svg,div.okeReviews .oke-reviewsSummary-icon svg{vertical-align:baseline}.okeReviews[data-oke-container] .oke-reviewsSummary-summary.oke-is-truncated,div.okeReviews .oke-reviewsSummary-summary.oke-is-truncated{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}</style>
672    
673    
673<script type="application/json" id="oke-reviews-settings">{"subscriberId":"d2921db8-4de9-4f2f-8601-43178d38d1c4","analyticsSettings":{"isWidgetOnScreenTrackingEnabled":true,"provider":"gtag"},"locale":"en","localeAndVariant":{"code":"en"},"matchCustomerLocale":false,"widgetSettings":{"global":{"dateSettings":{"format":{"type":"relative"}},"hideOkendoBranding":true,"reviewTranslationsMode":"off","showIncentiveIndicator":false,"searchEnginePaginationEnabled":false,"stars":{"backgroundColor":"#E5E5E5","foregroundColor":"#C49A4A","interspace":2,"shape":{"type":"default"},"showBorder":false},"font":{"fontType":"custom","fontFamily":"lato"}},"homepageCarousel":{"slidesPerPage":{"large":3,"medium":2},"totalSlides":12,"scrollBehaviour":"slide","sortOptionOrder":["date desc","has_media desc","helpful desc","rating desc","date asc","rating asc","unhelpful desc"],"style":{"showDates":true,"border":{"color":"#FAF6FA","width":{"value":1,"unit":"px"}},"bodyFont":{"fontSize":{"value":14,"unit":"px"},"fontType":"use-global","fontWeight":400,"hasCustomFontSettings":true},"headingFont":{"fontSize":{"value":14,"unit":"px"},"fontType":"custom","fontFamily":"cormorant","fontWeight":100,"hasCustomFontSettings":true},"arrows":{"color":"#000000","size":{"value":24,"unit":"px"},"enabled":true},"avatar":{"backgroundColor":"#F9F3EB","placeholderTextColor":"#570C54","size":{"value":48,"unit":"px"},"enabled":false},"media":{"size":{"value":80,"unit":"px"},"imageGap":{"value":4,"unit":"px"},"enabled":false},"stars":{"height":{"value":18,"unit":"px"},"globalOverrideSettings":{"showBorder":false,"backgroundColor":"#E5E5E5","foregroundColor":"#C49A4A"}},"productImageSize":{"value":48,"unit":"px"},"layout":{"name":"minimal-centered","reviewDetailsPosition":"below","showProductName":false,"showAttributeBars":false,"showProductDetails":"only-when-grouped"},"highlightColor":"#4A1A48","spaceAbove":{"value":0,"unit":"px"},"text":{"primaryColor":"#1C1C1C","fontSizeRegular":{"value":16,"unit":"px"},"fontSizeSmall":{"value":14,"unit":"px"},"secondaryColor":"#1C1C1C"},"spaceBelow":{"value":20,"unit":"px"}},"defaultSort":"date desc","autoPlay":false,"truncation":{"bodyMaxLines":4,"truncateAll":true,"enabled":true}},"mediaCarousel":{"minimumImages":1,"linkText":"Read More","autoPlay":false,"slideSize":"medium","arrowPosition":"outside"},"mediaGrid":{"gridStyleDesktop":{"layout":"default-desktop"},"gridStyleMobile":{"layout":"default-mobile"},"showMoreArrow":{"arrowColor":"#676986","enabled":true,"backgroundColor":"#f4f4f6"},"linkText":"Read More","infiniteScroll":false,"gapSize":{"value":10,"unit":"px"}},"questions":{"initialPageSize":6,"loadMorePageSize":6},"reviewsBadge":{"layout":"large","colorScheme":"dark","stars":{}},"reviewsTab":{"enabled":false},"reviewsWidget":{"tabs":{"reviews":true,"questions":true},"header":{"columnDistribution":"left","verticalAlignment":"top","blocks":[{"columnWidth":"one-third","modules":[{"name":"rating-average","layout":"one-line"},{"name":"rating-breakdown","backgroundColor":"#E5E5E5","shadingColor":"#D7AB71","stretchMode":"contain"}],"textAlignment":"left"},{"columnWidth":"one-third","modules":[{"name":"recommended"},{"name":"media-grid","imageGap":{"value":0,"unit":"px"},"scaleToFill":true,"rows":3,"columns":4}],"textAlignment":"left"},{"columnWidth":"one-third","modules":[{"name":"attributes","layout":"stacked","stretchMode":"stretch"}],"textAlignment":"center"}]},"style":{"showDates":true,"border":{"color":"#F7F5F3","width":{"value":1,"unit":"px"}},"bodyFont":{"hasCustomFontSettings":false},"headingFont":{"fontSize":{"value":14,"unit":"px"},"fontType":"custom","fontFamily":"cormorant","fontWeight":600,"hasCustomFontSettings":true},"filters":{"backgroundColorActive":"#C49A4A","backgroundColor":"#F7F5F3","borderColor":"#C49A4A","borderRadius":{"value":100,"unit":"px"},"borderColorActive":"#C49A4A","textColorActive":"#FFFFFF","textColor":"#C49A4A","searchHighlightColor":"#B2F9E9"},"avatar":{"enabled":false},"stars":{"height":{"value":18,"unit":"px"},"globalOverrideSettings":{"backgroundColor":"#E5E5E5","foregroundColor":"#C49A4A","interspace":2,"showBorder":false}},"shadingColor":"#F7F7F8","productImageSize":{"value":48,"unit":"px"},"button":{"backgroundColorActive":"#F7F5F3","borderColorHover":"#570C54","backgroundColor":"#FFFFFF","borderColor":"#F7F5F3","backgroundColorHover":"#570C54","textColorHover":"#FFFFFF","borderRadius":{"value":0,"unit":"px"},"borderWidth":{"value":1,"unit":"px"},"borderColorActive":"#F7F5F3","textColorActive":"#1C1C1C","textColor":"#1C1C1C","font":{"hasCustomFontSettings":false}},"highlightColor":"#C49A4A","spaceAbove":{"value":0,"unit":"px"},"text":{"primaryColor":"#000000","fontSizeRegular":{"value":17,"unit":"px"},"fontSizeLarge":{"value":20,"unit":"px"},"fontSizeSmall":{"value":14,"unit":"px"},"secondaryColor":"#000000"},"spaceBelow":{"value":0,"unit":"px"},"attributeBar":{"style":"default","backgroundColor":"#D3D4DD","shadingColor":"#C49A4A","markerColor":"#C49A4A"}},"showWhenEmpty":true,"reviews":{"list":{"layout":{"name":"minimal","showAttributeBars":false,"showProductVariantName":false,"columnAmount":4,"showProductDetails":"only-when-grouped"},"loyalty":{"maxInitialAchievements":3},"initialPageSize":5,"replyTruncation":{"bodyMaxLines":4,"enabled":true},"media":{"layout":"thumbnail","size":{"value":200,"unit":"px"},"imageGap":{"value":4,"unit":"px"}},"truncation":{"bodyMaxLines":4,"truncateAll":true,"enabled":true},"loadMorePageSize":5},"controls":{"filterMode":"closed","freeTextSearchEnabled":false,"writeReviewButtonEnabled":true,"defaultSort":"date desc","sortOptionOrder":["date desc","has_media desc","helpful desc","rating desc","date asc","rating asc","unhelpful desc"]}}},"starRatings":{"showWhenEmpty":false,"style":{"globalOverrideSettings":{"backgroundColor":"#E5E5E5","foregroundColor":"#D7AB71","interspace":2,"showBorder":false},"spaceAbove":{"value":12,"unit":"px"},"text":{"content":"average-and-count","style":"number-and-text","brackets":false},"singleStar":false,"height":{"value":18,"unit":"px"},"spaceBelow":{"value":12,"unit":"px"}},"clickBehavior":"scroll-to-widget"}},"features":{"attributeFiltersEnabled":true,"recorderPlusEnabled":true,"recorderQandaPlusEnabled":true,"reviewsKeywordsEnabled":true,"reviewsSummariesEnabled":true}}</script>
673
674            <style id="oke-css-vars">:root{--oke-widget-spaceAbove:0;--oke-widget-spaceBelow:0;--oke-starRating-spaceAbove:12px;--oke-starRating-spaceBelow:12px;--oke-button-backgroundColor:#fff;--oke-button-backgroundColorHover:#570c54;--oke-button-backgroundColorActive:#f7f5f3;--oke-button-textColor:#1c1c1c;--oke-button-textColorHover:#fff;--oke-button-textColorActive:#1c1c1c;--oke-button-borderColor:#f7f5f3;--oke-button-borderColorHover:#570c54;--oke-button-borderColorActive:#f7f5f3;--oke-button-borderRadius:0;--oke-button-borderWidth:1px;--oke-button-fontWeight:700;--oke-button-fontSize:var(--oke-text-regular,14px);--oke-button-fontFamily:inherit;--oke-border-color:#f7f5f3;--oke-border-width:1px;--oke-text-primaryColor:#000;--oke-text-secondaryColor:#000;--oke-text-small:14px;--oke-text-regular:17px;--oke-text-large:20px;--oke-text-fontFamily:lato,sans-serif;--oke-avatar-size:undefined;--oke-avatar-backgroundColor:undefined;--oke-avatar-placeholderTextColor:undefined;--oke-highlightColor:#c49a4a;--oke-shadingColor:#f7f7f8;--oke-productImageSize:48px;--oke-attributeBar-shadingColor:#c49a4a;--oke-attributeBar-borderColor:undefined;--oke-attributeBar-backgroundColor:#d3d4dd;--oke-attributeBar-markerColor:#c49a4a;--oke-filter-backgroundColor:#f7f5f3;--oke-filter-backgroundColorActive:#c49a4a;--oke-filter-borderColor:#c49a4a;--oke-filter-borderColorActive:#c49a4a;--oke-filter-textColor:#c49a4a;--oke-filter-textColorActive:#fff;--oke-filter-borderRadius:100px;--oke-filter-searchHighlightColor:#b2f9e9;--oke-mediaGrid-chevronColor:#676986;--oke-stars-foregroundColor:#c49a4a;--oke-stars-backgroundColor:#e5e5e5;--oke-stars-borderWidth:0}.oke-reviewCarousel{--oke-stars-foregroundColor:#c49a4a;--oke-stars-backgroundColor:#e5e5e5;--oke-stars-borderWidth:0}.oke-w,.oke-modal{--oke-stars-foregroundColor:#c49a4a;--oke-stars-backgroundColor:#e5e5e5;--oke-stars-borderWidth:0}.oke-sr{--oke-stars-foregroundColor:#d7ab71;--oke-stars-backgroundColor:#e5e5e5;--oke-stars-borderWidth:0}.oke-w,.oke-modal{--oke-title-fontWeight:600;--oke-title-fontSize:14px;--oke-title-fontFamily:cormorant,sans-serif;--oke-bodyText-fontWeight:400;--oke-bodyText-fontSize:var(--oke-text-regular,14px);--oke-bodyText-fontFamily:inherit}</style>
675            <style id="oke-reviews-custom-css">.okeReviews.oke-w .oke-w-reviewer-flag{display:none}.okeReviews.oke-w .oke-w-reviews-main--nav-divider{border-top:0}.okeReviews.oke-w .oke-reviewContent-title,.okeReviews .oke-modal .oke-reviewContent-title{font-family:lato,sans-serif;font-size:1.25em;font-weight:400;letter-spacing:normal}.okeReviews .oke-modal,.okeReviews .oke-modal p,.okeReviews .oke-modal .oke-helpful,.okeReviews .oke-modal .oke-helpful-vote-button,.okeReviews .oke-modal .oke-reviewContent-date,.okeReviews .oke-modal .oke-reviewContent-title{color:#000}.okeReviews.oke-w .oke-reviewContent-body p,.okeReviews .oke-modal .oke-reviewContent-body p{line-height:1.5;font-weight:400;letter-spacing:normal}.okeReviews.oke-w .oke-button{font-weight:400;font-size:17px;letter-spacing:normal}.okeReviews.oke-w .oke-button:not(.oke-is-loading):not(.oke-is-active):hover{box-shadow:0 0}.okeReviews.oke-w a.oke-w-writeReview.oke-button{height:100%}.okeReviews.oke-w .oke-is-small .oke-w-reviews-writeReview{width:100%;padding-top:10px}.okeReviews.oke-w .oke-is-small .oke-button{width:100%;height:43px}.okeReviews.oke-w .oke-w-header,.okeReviews.oke-w li.oke-w-reviews-list-item{border:1px solid #eaeaea;padding:1.5em;margin-bottom:25px}.okeReviews.oke-w span.oke-w-ratingAverageModule-rating-average,.okeReviews.oke-w span.oke-w-recommendsModule-value{background:#d7ab71;color:#fff;padding:3px 7px;font-size:18px}.okeReviews.oke-w .oke-w-breakdownModule-distribution-bar{border-radius:0;height:1.4em}.okeReviews.oke-w .oke-w-breakdownModule-distribution-bar-fill{border-radius:0}.okeReviews.oke-w label.oke-sortSelect-label{display:none}.okeReviews.oke-w .oke-w-reviews-controls{justify-content:flex-end;padding-bottom:20px}.okeReviews.oke-w .oke-sortSelect{border:1px solid #eaeaea;margin-left:10px;padding:10px}.okeReviews.oke-w .oke-w-reviews-count{padding:10px}.okeReviews.oke-w .oke-w-selectAttr-item{flex-flow:column wrap}.okeReviews.oke-w .oke-is-small .oke-w-recommendsModule{display:flex;align-items:center;flex-flow:row wrap;justify-content:center}.okeReviews.oke-w .oke-is-small .oke-w-recommendsModule-text{font-size:14px;margin-left:10px}
675.okeReviews .oke-reviewCarousel .oke-reviewContent-title{font-family:lato,sans-serif;font-size:1.25em;font-weight:400;letter-spacing:normal}.okeReviews .oke-reviewCarousel.oke-is-small button.oke-reviewContent-readMore{padding-bottom:15px}@media only screen and (max-width:480px){.oke-carousel-mobile{max-width:350px}}@media only screen and (min-width:481px){.oke-carousel-mobile{max-width:700px}}@media only screen and (min-width:1280px){.oke-carousel-mobile{max-width:1200px}}</style>
676            <template id="oke-reviews-body-template"><svg id="oke-star-symbols" style="display:none!important" data-oke-id="oke-star-symbols"><symbol id="oke-star-empty" style="overflow:visible;"><path id="star-default--empty" fill="var(--oke-stars-backgroundColor)" stroke="var(--oke-stars-borderColor)" stroke-width="var(--oke-stars-borderWidth)" d="M3.34 13.86c-.48.3-.76.1-.63-.44l1.08-4.56L.26 5.82c-.42-.36-.32-.7.24-.74l4.63-.37L6.92.39c.2-.52.55-.52.76 0l1.8 4.32 4.62.37c.56.05.67.37.24.74l-3.53 3.04 1.08 4.56c.13.54-.14.74-.63.44L7.3 11.43l-3.96 2.43z"/></symbol><symbol id="oke-star-filled" style="overflow:visible;"><path id="star-default--filled" fill="var(--oke-stars-foregroundColor)" stroke="var(--oke-stars-borderColor)" stroke-width="var(--oke-stars-borderWidth)" d="M3.34 13.86c-.48.3-.76.1-.63-.44l1.08-4.56L.26 5.82c-.42-.36-.32-.7.24-.74l4.63-.37L6.92.39c.2-.52.55-.52.76 0l1.8 4.32 4.62.37c.56.05.67.37.24.74l-3.53 3.04 1.08 4.56c.13.54-.14.74-.63.44L7.3 11.43l-3.96 2.43z"/></symbol></svg></template>
676<script>document.addEventListener('readystatechange',() =>{Array.from(document.getElementById('oke-reviews-body-template')?.content.children)?.forEach(function(child){if(!Array.from(document.body.querySelectorAll('[data-oke-id='.concat(child.getAttribute('data-oke-id'),']'))).length){document.body.prepend(child)}})},{once:true});</script>
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690<!-- END app snippet -->
691
692<!-- BEGIN app snippet: widget-plus-initialisation-script -->
693
694
695
696
697    
697<script async id="okendo-reviews-script" src="https://cdn-static.okendo.io/reviews-widget-plus/js/okendo-reviews.js"></script>
697
698
699<!-- END app snippet -->
700
701
702<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/brandAgents_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
703
704
705
706<script type="text/javascript">
707  (function(d){
708      var s = d.createElement('script');
709      s.async = true;
710      s.src = "https://adsagentclientafd-b7hqhjdrf3fpeqh2.b01.azurefd.net/frontendInjection.js";
711      var firstScript = d.getElementsByTagName('script')[0];
712      firstScript.parentNode.insertBefore(s, firstScript);
713  })(document);
714</script>
714
715
716
717
718<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
719<script type="text/javascript">
720  (function (c, l, a, r, i, t, y) {
721    c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); };
722    t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify";
723    y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y);
724
725    c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => {
726      if (error) {
727        console.error("Error loading Shopify features:", error);
728        return;
729      }
730
731      c[a]('consentv2', {
732        ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied",
733        analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied",
734        source: 101,
735      });
736    });
737
738    l.addEventListener("visitorConsentCollected", function (e) {
739      c[a]('consentv2', {
740        ad_Storage: e.detail.marketingAllowed ? "granted" : "denied",
741        analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied",
742        source: 101,
743      });
744    });
745  })(window, document, "clarity", "script", "v8l6x64x21");
746</script>
746
747
748
749
750<!-- END app block --><!-- BEGIN app block: shopify://apps/instafeed/blocks/head-block/c447db20-095d-4a10-9725-b5977662c9d5 --><!-- BEGIN app snippet: storefront-script -->
751
752
753  
754    
754<script src="https://cdn.nfcube.com/instafeed-996ec4a1dfdad5036df8647679dd668b.js" defer></script>
754
755  
756
757<!-- END app snippet -->
758
759
760
761
762<!-- END app block --><!-- BEGIN app block: shopify://apps/klaviyo-email-marketing-sms/blocks/klaviyo-onsite-embed/2632fe16-c075-4321-a88b-50b567f42507 -->
763
764
765
766
767
768
769
770
771
772
773
774
775  
775<script async src="https://static.klaviyo.com/onsite/js/Sjbqq9/klaviyo.js?company_id=Sjbqq9"></script>
775
776  
776<script>!function(){if(!window.klaviyo){window._klOnsite=window._klOnsite||[];try{window.klaviyo=new Proxy({},{get:function(n,i){return"push"===i?function(){var n;(n=window._klOnsite).push.apply(n,arguments)}:function(){for(var n=arguments.length,o=new Array(n),w=0;w<n;w++)o[w]=arguments[w];var t="function"==typeof o[o.length-1]?o.pop():void 0,e=new Promise((function(n){window._klOnsite.push([i].concat(o,[function(i){t&&t(i),n(i)}]))}));return e}}})}catch(n){window.klaviyo=window.klaviyo||[],window.klaviyo.push=function(){var n;(n=window._klOnsite).push.apply(n,arguments)}}}}();</script>
776
777
778  
779
780
781
782
783  
783<script>
784    window.klaviyoReviewsProductDesignMode = false
785  </script>
785
786
787
788
789
790
791
792
793
794
795<!-- END app block --><!-- BEGIN app block: shopify://apps/geolocation-glc/blocks/selector/e347b539-0714-46e4-9e69-23a73992ae3a -->
795<script>
796    (function(){
797        let logChangesGLCTimer = null;
798        const observerGLC = new MutationObserver(function(mutations, observer) {
799            clearTimeout(logChangesGLCTimer);
800            logChangesGLCTimer = setTimeout(function() {
801                logChangesGLC();
802            }, 100);
803        });
804
805        function logChangesGLC() {
806            let evaluateGLC = document.evaluate('//*[text()[contains(.,"glc-money")]]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
807            for (let iGLC = 0; iGLC < evaluateGLC.snapshotLength; iGLC++) {
808                let elGLC = evaluateGLC.snapshotItem(iGLC);
809                let innerHtmlGLC = elGLC?.innerHTML ? elGLC.innerHTML : "";
810                if (innerHtmlGLC && ["SCRIPT", "LINK", "STYLE", "NOSCRIPT"].includes(elGLC.nodeName)) {
811                    continue;
812                }
813                let decodedGLC = innerHtmlGLC.replaceAll("&lt;", "<").replaceAll("&gt;", ">");
814                if(decodedGLC !== innerHtmlGLC){
815                    elGLC.innerHTML = decodedGLC;
816                }
817            }
818        }
819        observerGLC.observe(document.documentElement, { subtree : true, childList: true });
820    })();
821
822    window._gelacyStore = {
823        ...(window._gelacyStore || {}),
824        pageType: "blog",
825        currenciesEnabled: [],
826        currency: {
827          code: "USD",
828          symbol: "$",
829          name: "United States Dollar",
830          active: "USD",
831          rate: ''
832        },
833        product: {
834          id: null,
835        },
836        moneyWithCurrencyFormat: "${{ amount }} USD",
837        moneyFormat: "${{ amount }}",
838        currencyCodeEnabled: false,
839        shop: "oxfordhealthspan.com",
840        permanentDomainShop: "oxford-healthspan.myshopify.com",
841        locale: "en",
842        country: "US",
843        designMode: false,
844        theme: {
845          id: null,
846          name: null
847        },
848        cdnHost: "",
849        routes: { "root": "\/" },
850        market: {
851            id: 61341945,
852            handle: "us"
853        },
854        enabledLocales: [{"shop_locale":{"locale":"en","enabled":true,"primary":true,"published":true}}],
855    };
856    
857        _gelacyStore.currenciesEnabled.push("CAD");
858    
859        _gelacyStore.currenciesEnabled.push("CHF");
860    
861        _gelacyStore.currenciesEnabled.push("DKK");
862    
863        _gelacyStore.currenciesEnabled.push("EUR");
864    
865        _gelacyStore.currenciesEnabled.push("GBP");
866    
867        _gelacyStore.currenciesEnabled.push("SEK");
868    
869        _gelacyStore.currenciesEnabled.push("USD");
870    
871</script>
871
872
873
874<!-- END app block -->
874<script src="https://cdn.shopify.com/extensions/01a0f178-5eb6-7207-b809-8bf3a7754ba9/geolocation-glc-181/assets/gelacy.js" type="text/javascript" defer="defer"></script>
874
875<link href="https://cdn.shopify.com/extensions/01a0f178-5eb6-7207-b809-8bf3a7754ba9/geolocation-glc-181/assets/gelacy.css" rel="stylesheet" type="text/css" media="all">
876<meta name="shopify-y" content="00000000-0000-0000-5000-000000000000" data-expiration="1822614145000"><meta name="shopify-s" content="00000000-0000-0000-5000-000000000000" data-expiration="1791058345000"><meta name="new-cookie-storage-activated" content="t">
877</head>
878
879  <body class="  zoom-image--enabled"><!-- DRAWER -->
880<template id="drawer-default-template">
881  <style>
882    [hidden] {
883      display: none !important;
884    }
885  </style>
886
887  <button part="outside-close-button" is="close-button" aria-label="Close"><svg role="presentation" stroke-width="2" focusable="false" width="24" height="24" class="icon icon-close" viewBox="0 0 24 24">
888        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
889      </svg></button>
890
891  <div part="overlay"></div>
892
893  <div part="content">
894    <header part="header">
895      <slot name="header"></slot>
896
897      <button part="close-button" is="close-button" aria-label="Close"><svg role="presentation" stroke-width="2" focusable="false" width="24" height="24" class="icon icon-close" viewBox="0 0 24 24">
898        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
899      </svg></button>
900    </header>
901
902    <div part="body">
903      <slot></slot>
904    </div>
905
906    <footer part="footer">
907      <slot name="footer"></slot>
908    </footer>
909  </div>
910</template>
911
912<!-- POPOVER -->
913<template id="popover-default-template">
914  <button part="outside-close-button" is="close-button" aria-label="Close"><svg role="presentation" stroke-width="2" focusable="false" width="24" height="24" class="icon icon-close" viewBox="0 0 24 24">
915        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
916      </svg></button>
917
918  <div part="overlay"></div>
919
920  <div part="content">
921    <header part="title">
922      <slot name="title"></slot>
923    </header>
924
925    <div part="body">
926      <slot></slot>
927    </div>
928  </div>
929</template><a href="#main" class="skip-to-content sr-only">Skip to content</a><!-- BEGIN sections: header-group -->
930<aside id="shopify-section-sections--21578423140601__announcement-bar" class="shopify-section shopify-section-group-header-group shopify-section--announcement-bar"><style>
931    :root {
932      --sticky-announcement-bar-enabled:0;
933    }</style><height-observer variable="announcement-bar">
934    <div class="announcement-bar bg-custom text-custom"style="--background: 74 26 72; --text-color: 255 255 255;"><div class="container">
935          <div class="announcement-bar__wrapper justify-between"><button class="tap-area" is="prev-button" aria-controls="announcement-bar" aria-label="Previous"><svg role="presentation" focusable="false" width="7" height="10" class="icon icon-chevron-left reverse-icon" viewBox="0 0 7 10">
936        <path d="M6 1 2 5l4 4" fill="none" stroke="currentColor" stroke-width="2"></path>
937      </svg></button><announcement-bar swipeable id="announcement-bar" class="announcement-bar__static-list"><p class="bold text-base " ><a href="/pages/truemed-hsa-fsa-funds">Now Accepting HSA/FSA on Eligible Orders</a></p><p class="bold text-base reveal-invisible" ><a href="/pages/why-primeadine">Whole-food spermidine, no synthetics</a></p><p class="bold text-base reveal-invisible" ><a href="/collections/all">Free shipping over $100 or when you subscribe</a></p></announcement-bar><button class="tap-area" is="next-button" aria-controls="announcement-bar" aria-label="Next"><svg role="presentation" focusable="false" width="7" height="10" class="icon icon-chevron-right reverse-icon" viewBox="0 0 7 10">
938        <path d="m1 9 4-4-4-4" fill="none" stroke="currentColor" stroke-width="2"></path>
939      </svg></button></div>
940        </div></div>
941  </height-observer>
942
943  
943<script>
944    document.documentElement.style.setProperty('--announcement-bar-height', Math.round(document.getElementById('shopify-section-sections--21578423140601__announcement-bar').clientHeight) + 'px');
945  </script>
945</aside><header id="shopify-section-sections--21578423140601__header" class="shopify-section shopify-section-group-header-group shopify-section--header"><style>
946  :root {
947    --sticky-header-enabled:1;
948  }
949
950  #shopify-section-sections--21578423140601__header {
951    --header-grid-template: "main-nav logo secondary-nav" / minmax(0, 1fr) auto minmax(0, 1fr);
952    --header-padding-block: var(--spacing-3);
953    --header-background-opacity: 1.0;
954    --header-background-blur-radius: 0px;
955    --header-transparent-text-color: 28 28 28;--header-logo-width: 100px;
956      --header-logo-height: 42px;position: sticky;
957    top: 0;
958    z-index: 10;
959  }.shopify-section--announcement-bar ~ #shopify-section-sections--21578423140601__header {
960      top: calc(var(--sticky-announcement-bar-enabled, 0) * var(--announcement-bar-height, 0px));
961    }@media screen and (max-width: 699px) {
962      .navigation-drawer {
963        --drawer-content-max-height: calc(100vh - (var(--spacing-2) * 2));
964      }
965    }@media screen and (min-width: 700px) {
966    #shopify-section-sections--21578423140601__header {--header-logo-width: 120px;
967        --header-logo-height: 50px;--header-padding-block: var(--spacing-6);
968    }
969  }@media screen and (min-width: 1150px) {#shopify-section-sections--21578423140601__header {
970        --header-grid-template: "logo main-nav secondary-nav" / minmax(0, 1fr) fit-content(70%) minmax(0, 1fr);
971      }
972    }@media screen and (min-width: 700px) {
973    height-observer .sm\:block {
974      display: block;
975    }
976  }
977</style>
978
979<height-observer variable="header">
980  <store-header class="header"  sticky>
981    <div class="header__wrapper"><div class="header__main-nav">
982        <div class="header__icon-list">
983          <button type="button" class="tap-area lg:hidden" aria-controls="header-sidebar-menu">
984            <span class="sr-only">Open navigation menu</span><svg role="presentation" stroke-width="1.5" focusable="false" width="22" height="22" class="icon icon-hamburger" viewBox="0 0 22 22">
985        <path d="M1 5h20M1 11h20M1 17h20" stroke="currentColor" stroke-linecap="round"></path>
986      </svg></button><a href="/account" class="tap-area sm:hidden header__cart-account_without-icon">
987              <span class="sr-only">Open account page</span>
988              
989                <span class="header__cart-account-text">Account</span>
990              
991            </a>
992            <a href="/search" class="tap-area sm:hidden" aria-controls="search-drawer">
993              <span class="sr-only">Open search</span><svg role="presentation" stroke-width="1.5" focusable="false" width="22" height="22" class="icon icon-search" viewBox="0 0 22 22">
994        <circle cx="11" cy="10" r="7" fill="none" stroke="currentColor"></circle>
995        <path d="m16 15 3 3" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path>
996      </svg></a>
997          
998<nav class="header__link-list justify-center wrap" role="navigation">
999              <ul class="contents" role="list">
1000
1001                  <li><a href="/collections/all-products" class="bold link-faded-reverse" >Shop Primeadine®</a></li>
1002
1003                  <li><details class="relative" is="dropdown-disclosure" trigger="hover">
1004                          <summary class="text-with-icon gap-2.5 bold link-faded-reverse" data-url="/blogs/aging-well">Learn<svg role="presentation" focusable="false" width="10" height="7" class="icon icon-chevron-bottom" viewBox="0 0 10 7">
1005        <path d="m1 1 4 4 4-4" fill="none" stroke="currentColor" stroke-width="2"></path>
1006      </svg></summary>
1007
1008                          <div class="dropdown-menu dropdown-menu--restrictable">
1009                            <ul class="contents" role="list"><li><a href="/pages/our-story" class="dropdown-menu__item group" >
1010                                      <span><span class="reversed-link">About</span></span>
1011                                    </a></li><li><a href="/pages/science" class="dropdown-menu__item group" >
1012                                      <span><span class="reversed-link">Science</span></span>
1013                                    </a></li><li><a href="/pages/what-is-spermidine" class="dropdown-menu__item group" >
1014                                      <span><span class="reversed-link">What is spermidine?</span></span>
1015                                    </a></li><li><a href="/pages/the-hallmarks-of-aging" class="dropdown-menu__item group" >
1016                                      <span><span class="reversed-link">The hallmarks of aging</span></span>
1017                                    </a></li><li><a href="/pages/certificates-of-analysis" class="dropdown-menu__item group" >
1018                                      <span><span class="reversed-link">Certificates of Analysis</span></span>
1019                                    </a></li><li><a href="/pages/frequently-asked-questions" class="dropdown-menu__item group" >
1020                                      <span><span class="reversed-link">FAQs</span></span>
1021                                    </a></li><li><a href="/blogs/aging-well" class="dropdown-menu__item group" aria-current="page">
1022                                      <span><span class="reversed-link">Blog</span></span>
1023                                    </a></li><li><a href="/blogs/recipes" class="dropdown-menu__item group" >
1024                                      <span><span class="reversed-link">Recipes</span></span>
1025                                    </a></li><li><a href="/pages/podcasts" class="dropdown-menu__item group" >
1026                                      <span><span class="reversed-link">Podcasts</span></span>
1027                                    </a></li></ul>
1028                          </div>
1029                        </details></li>
1030
1031                  <li><a href="/pages/why-primeadine" class="bold link-faded-reverse" >Why Primeadine?</a></li>
1032
1033                  <li><a href="/pages/reviews-new" class="bold link-faded-reverse" >Reviews</a></li>
1034
1035                  <li><details class="relative" is="dropdown-disclosure" trigger="hover">
1036                          <summary class="text-with-icon gap-2.5 bold link-faded-reverse" data-url="/blogs/aging-well">Benefits Hub<svg role="presentation" focusable="false" width="10" height="7" class="icon icon-chevron-bottom" viewBox="0 0 10 7">
1037        <path d="m1 1 4 4 4-4" fill="none" stroke="currentColor" stroke-width="2"></path>
1038      </svg></summary>
1039
1040                          <div class="dropdown-menu dropdown-menu--restrictable">
1041                            <ul class="contents" role="list"><li><a href="/pages/spermidine-womens-health" class="dropdown-menu__item group" >
1042                                      <span><span class="reversed-link">Spermidine and Women's Health</span></span>
1043                                    </a></li><li><a href="/pages/spermidine-and-mens-health" class="dropdown-menu__item group" >
1044                                      <span><span class="reversed-link">Spermidine and Men's Health </span></span>
1045                                    </a></li><li><a href="/pages/spermidine-and-immune-health" class="dropdown-menu__item group" >
1046                                      <span><span class="reversed-link">Spermidine and Immune Health</span></span>
1047                                    </a></li><li><a href="/pages/does-spermidine-improve-sleep-the-science-explained" class="dropdown-menu__item group" >
1048                                      <span><span class="reversed-link">Spermidine and Sleep</span></span>
1049                                    </a></li><li><a href="/pages/spermidine-beauty-benefits" class="dropdown-menu__item group" >
1050                                      <span><span class="reversed-link">Spermidine Beauty Benefits</span></span>
1051                                    </a></li></ul>
1052                          </div>
1053                        </details></li></ul>
1054            </nav></div>
1055      </div>
1056        <a href="/" class="header__logo"><span class="sr-only">Oxford Healthspan® </span><img src="//oxfordhealthspan.com/cdn/shop/files/OXFORD_HEALTHSPAN_Logo_Rectangle_Text_Only_Transparent_Bkgd_Black_Text_R_RGB.png?v=1722529686&amp;width=3449" alt="" srcset="//oxfordhealthspan.com/cdn/shop/files/OXFORD_HEALTHSPAN_Logo_Rectangle_Text_Only_Transparent_Bkgd_Black_Text_R_RGB.png?v=1722529686&amp;width=240 240w, //oxfordhealthspan.com/cdn/shop/files/OXFORD_HEALTHSPAN_Logo_Rectangle_Text_Only_Transparent_Bkgd_Black_Text_R_RGB.png?v=1722529686&amp;width=360 360w" width="3449" height="1437" sizes="120px" class="header__logo-image"></a>
1057      
1058<div class="header__secondary-nav"><div class="header__icon-list">
1059            <a href="/search" class="hidden tap-area sm:block" aria-controls="search-drawer">
1060              <span class="sr-only">Open search</span><svg role="presentation" stroke-width="1.5" focusable="false" width="22" height="22" class="icon icon-search" viewBox="0 0 22 22">
1061        <circle cx="11" cy="10" r="7" fill="none" stroke="currentColor"></circle>
1062        <path d="m16 15 3 3" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path>
1063      </svg></a>
1064          
1065<a href="/account" class="hidden tap-area sm:block header__cart-account_without-icon mobile-hide">
1066              <span class="sr-only">Open account page</span>
1067              
1068                <span class="header__cart-account-text">Account</span>
1069              
1070            </a>
1071          
1072          <a href="/cart" data-no-instant class="relative tap-area header__cart-account_without-icon" >
1073            <!-- <span>MY CART</span> -->
1074            
1075              <span class="header__cart-account-text">Cart</span>
1076            
1077
1078            <div class="header__cart-count" style="--bg-color: #1c1c1c; --text-color: #f7f5f3;" >
1079              <cart-count class="count-bubble opacity-0" aria-hidden="true">0</cart-count>
1080            </div>
1081          </a>
1082        </div>
1083      </div>
1084    </div>
1085  </store-header>
1086</height-observer><navigation-drawer mobile-opening="left" open-from="left" id="header-sidebar-menu" class="navigation-drawer drawer lg:hidden" >
1087    <button is="close-button" aria-label="Close"><svg role="presentation" stroke-width="2" focusable="false" width="19" height="19" class="icon icon-close" viewBox="0 0 24 24">
1088        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
1089      </svg></button><div class="panel-list__wrapper">
1090  <div class="panel">
1091    <div class="panel__wrapper" >
1092      <div class="panel__scroller v-stack gap-8"><ul class="v-stack gap-4">
1093<li class="h3 sm:h4"><a href="/collections/all-products" class="group block w-full">
1094                  <span><span class="reversed-link">Shop Primeadine</span></span>
1095                </a></li>
1096<li class="h3 sm:h4"><a href="/pages/reviews-new" class="group block w-full">
1097                  <span><span class="reversed-link">Reviews</span></span>
1098                </a></li>
1099<li class="h3 sm:h4"><a href="/pages/our-story" class="group block w-full">
1100                  <span><span class="reversed-link">About</span></span>
1101                </a></li>
1102<li class="h3 sm:h4"><a href="/pages/science" class="group block w-full">
1103                  <span><span class="reversed-link">Science</span></span>
1104                </a></li>
1105<li class="h3 sm:h4"><a href="/pages/what-is-spermidine" class="group block w-full">
1106                  <span><span class="reversed-link">What is spermidine?</span></span>
1107                </a></li>
1108<li class="h3 sm:h4"><a href="/pages/the-hallmarks-of-aging" class="group block w-full">
1109                  <span><span class="reversed-link">The hallmarks of aging</span></span>
1110                </a></li>
1111<li class="h3 sm:h4"><a href="/pages/why-primeadine" class="group block w-full">
1112                  <span><span class="reversed-link">Why Primeadine?</span></span>
1113                </a></li>
1114<li class="h3 sm:h4"><a href="/blogs/aging-well" class="group block w-full">
1115                  <span><span class="reversed-link">Blog</span></span>
1116                </a></li>
1117<li class="h3 sm:h4"><a href="/pages/frequently-asked-questions" class="group block w-full">
1118                  <span><span class="reversed-link">FAQs</span></span>
1119                </a></li>
1120<li class="h3 sm:h4"><a href="/pages/contact-us" class="group block w-full">
1121                  <span><span class="reversed-link">Contact</span></span>
1122                </a></li></ul></div><div class="panel-footer v-stack gap-5"><ul class="social-media " role="list"><li>
1123      <a href="https://instagram.com/oxfordhealthspan" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on Instagram"><svg role="presentation" focusable="false" width="27" height="27" class="icon icon-instagram" viewBox="0 0 24 24">
1124        <path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.4c-2.607 0-2.934.011-3.958.058-1.022.046-1.72.209-2.33.446a4.705 4.705 0 0 0-1.7 1.107 4.706 4.706 0 0 0-1.108 1.7c-.237.611-.4 1.31-.446 2.331C2.41 9.066 2.4 9.392 2.4 12c0 2.607.011 2.934.058 3.958.046 1.022.209 1.72.446 2.33a4.706 4.706 0 0 0 1.107 1.7c.534.535 1.07.863 1.7 1.108.611.237 1.309.4 2.33.446 1.025.
1124047 1.352.058 3.959.058s2.934-.011 3.958-.058c1.022-.046 1.72-.209 2.33-.446a4.706 4.706 0 0 0 1.7-1.107 4.706 4.706 0 0 0 1.108-1.7c.237-.611.4-1.31.446-2.33.047-1.025.058-1.352.058-3.959s-.011-2.934-.058-3.958c-.047-1.022-.209-1.72-.446-2.33a4.706 4.706 0 0 0-1.107-1.7 4.705 4.705 0 0 0-1.7-1.108c-.611-.237-1.31-.4-2.331-.446C14.934 2.41 14.608 2.4 12 2.4Zm0 1.73c2.563 0 2.867.01 3.88.056.935.042 1.443.199 1.782.33.448.174.768.382 1.104.718.336.336.544.656.718 1.104.131.338.287.847.33 1.783.046 1.012.056 1.316.056 3.879 0 2.563-.01 2.867-.056 3.88-.043.935-.199 1.444-.33 1.782a2.974 2.974 0 0 1-.719 1.104 2.974 2.974 0 0 1-1.103.718c-.339.131-.847.288-1.783.33-1.012.046-1.316.056-3.88.056-2.563 0-2.866-.01-3.878-.056-.936-.042-1.445-.199-1.783-.33a2.974 2.974 0 0 1-1.104-.718 2.974 2.974 0 0 1-.718-1.104c-.131-.338-.288-.847-.33-1.783-.047-1.012-.056-1.316-.056-3.879 0-2.563.01-2.867.056-3.88.042-.935.199-1.443.33-1.782.174-.448.382-.768.718-1.104a2.974 2.974 0 0 1 1.104-.718c.338-.131.847-.288 1.783-.33C9.133 4.14 9.437 4.13 12 4.13Zm0 11.07a3.2 3.2 0 1 1 0-6.4 3.2 3.2 0 0 1 0 6.4Zm0-8.13a4.93 4.93 0 1 0 0 9.86 4.93 4.93 0 0 0 0-9.86Zm6.276-.194a1.152 1.152 0 1 1-2.304 0 1.152 1.152 0 0 1 2.304 0Z" fill="currentColor"/>
1125      </svg></a>
1126    </li></ul><div class="panel-footer__localization-wrapper h-stack gap-6 border-t md:hidden"><a href="/account" class="panel-footer__account-link bold text-sm">Account</a></div></div></div>
1127  </div></div></navigation-drawer>
1127<script>
1128  document.documentElement.style.setProperty('--header-height', Math.round(document.getElementById('shopify-section-sections--21578423140601__header').clientHeight) + 'px');
1129</script>
1129
1130
1131</header>
1132<!-- END sections: header-group --><!-- BEGIN sections: overlay-group -->
1133<div id="shopify-section-sections--21578423173369__privacy-banner" class="shopify-section shopify-section-group-overlay-group shopify-section--privacy-banner"><privacy-bar class="privacy-bar" hidden>
1134  <div class="privacy-bar__inner">
1135    <button type="button" class="privacy-bar__close" data-action="close">
1136      <span class="sr-only">Close</span><svg role="presentation" stroke-width="2" focusable="false" width="10" height="10" class="icon icon-delete" viewBox="0 0 10 10">
1137        <path d="m.757.757 8.486 8.486m-8.486 0L9.243.757" stroke="currentColor"></path>
1138      </svg></button>
1139
1140    <div class="v-stack gap-4">
1141      <div class="v-stack gap-2"><p class="bold">Cookie policy</p><div class="prose text-xs"><p>We use cookies and similar technologies to provide the best experience on our website. Refer to our Privacy Policy for more information.</p></div></div>
1142
1143      <div class="h-stack gap-2">
1144        <button type="button" class="button button--sm" data-action="accept">Accept</button>
1145        <button type="button" class="button button--sm button--subdued" data-action="decline">Decline</button>
1146      </div>
1147    </div>
1148  </div>
1149</privacy-bar>
1150
1151</div><div id="shopify-section-sections--21578423173369__cart-drawer" class="shopify-section shopify-section-group-overlay-group"><cart-drawer  class="cart-drawer drawer drawer--lg" id="cart-drawer"><button is="close-button" aria-label="Close"><svg role="presentation" stroke-width="2" focusable="false" width="24" height="24" class="icon icon-close" viewBox="0 0 24 24">
1152        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
1153      </svg></button>
1154
1155    <div class="empty-state align-self-center">
1156      <div class="empty-state__icon-wrapper"><svg role="presentation" stroke-width="2" focusable="false" width="22" height="22" class="icon icon-cart" viewBox="0 0 22 22">
1157            <path d="M11 7H3.577A2 2 0 0 0 1.64 9.497l2.051 8A2 2 0 0 0 5.63 19H16.37a2 2 0 0 0 1.937-1.503l2.052-8A2 2 0 0 0 18.422 7H11Zm0 0V1" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path>
1158          </svg><span class="count-bubble count-bubble--lg">0</span>
1159      </div>
1160
1161      <div class="prose">
1162        <p class="h5">Your cart is empty</p>
1163
1164<a class="button button--xl"
1165  
1166  
1167  
1168  
1169  
1170  href="/collections/all-products"
1171  
1172  
1173 >Continue shopping</a></div>
1174    </div></cart-drawer>
1175
1176</div><div id="shopify-section-sections--21578423173369__search-drawer" class="shopify-section shopify-section-group-overlay-group"><search-drawer  class="search-drawer  drawer drawer--lg" id="search-drawer">
1177  <form action="/search" method="get" class="v-stack gap-5 sm:gap-8" role="search">
1178    <div class="search-input">
1179      <input type="search" name="q" placeholder="Search for..." autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" aria-label="Search">
1180      <button type="reset" class="text-subdued">Clear</button>
1181      <button type="button" is="close-button">
1182        <span class="sr-only">Close</span><svg role="presentation" stroke-width="2" focusable="false" width="24" height="24" class="icon icon-close" viewBox="0 0 24 24">
1183        <path d="M17.658 6.343 6.344 17.657M17.658 17.657 6.344 6.343" stroke="currentColor"></path>
1184      </svg></button>
1185    </div>
1186
1187    <style>
1188      #shopify-section-sections--21578423173369__search-drawer {
1189        --predictive-search-column-count: 3;
1190      }
1191    </style>
1192
1193    <input type="hidden" name="type" value="product">
1194
1195    <predictive-search class="predictive-search" section-id="sections--21578423173369__search-drawer"><div slot="results"></div>
1196
1197      <div slot="loading">
1198        <div class="v-stack gap-5 sm:gap-6 ">
1199          <div class="h-stack gap-4 sm:gap-5"><span class="skeleton skeleton--tab"></span><span class="skeleton skeleton--tab"></span><span class="skeleton skeleton--tab"></span></div>
1200
1201          <div class="v-stack gap-4 sm:gap-6"><div class="h-stack align-center gap-5 sm:gap-6">
1202                <span class="skeleton skeleton--thumbnail"></span>
1203
1204                <div class="v-stack gap-3 w-full">
1205                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 20%"></span>
1206                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 80%"></span>
1207                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 40%"></span>
1208                </div>
1209              </div><div class="h-stack align-center gap-5 sm:gap-6">
1210                <span class="skeleton skeleton--thumbnail"></span>
1211
1212                <div class="v-stack gap-3 w-full">
1213                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 20%"></span>
1214                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 80%"></span>
1215                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 40%"></span>
1216                </div>
1217              </div><div class="h-stack align-center gap-5 sm:gap-6">
1218                <span class="skeleton skeleton--thumbnail"></span>
1219
1220                <div class="v-stack gap-3 w-full">
1221                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 20%"></span>
1222                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 80%"></span>
1223                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 40%"></span>
1224                </div>
1225              </div><div class="h-stack align-center gap-5 sm:gap-6">
1226                <span class="skeleton skeleton--thumbnail"></span>
1227
1228                <div class="v-stack gap-3 w-full">
1229                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 20%"></span>
1230                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 80%"></span>
1231                  <span class="skeleton skeleton--text" style="--skeleton-text-width: 40%"></span>
1232                </div>
1233              </div></div>
1234        </div></div>
1235    </predictive-search>
1236  </form>
1237</search-drawer>
1238
1239</div>
1240<!-- END sections: overlay-group --><main role="main" id="main" class="anchor">
1241      <section id="shopify-section-template--21578420551929__main" class="shopify-section shopify-section--main-blog"><style>
1242  #shopify-section-template--21578420551929__main {
1243    --section-background-hash: 0;
1244  }
1245
1246  #shopify-section-template--21578420551929__main + * {
1247    --previous-section-background-hash: 0;
1248  }</style><style>
1249  #shopify-section-template--21578420551929__main {--banner-content-padding-block-start:var(--spacing-16);
1250  }
1251
1252  @media screen and (min-width: 700px) {
1253    #shopify-section-template--21578420551929__main {
1254      --banner-content-padding-block-start:var(--spacing-28);
1255    }
1256  }
1257</style>
1258
1259<div class="blog" ><header class="blog-banner bg-custom"style="--background: 247 245 243;">
1260      <div class="container">
1261        <div class="blog-banner-content v-stack gap-10 text-center justify-items-center">
1262          <div class="v-stack gap-5 sm:gap-8">
1263            <h1 class="h0">The Science & Art of Aging Well</h1></div></div><div class="scroll-area bleed sm:unbleed justify-items-center">
1264            <div class="blog-filter-list">
1265              <ul class="h-stack bold text-base" role="tablist">
1266                <li role="tab" aria-selected="true">
1267                  <a href="/blogs/aging-well" class="selected">All posts</a>
1268                </li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/autophagy" title="Show articles tagged Autophagy">Autophagy</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/beauty" title="Show articles tagged Beauty">Beauty</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/brain-health" title="Show articles tagged Brain Health">Brain Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/dose" title="Show articles tagged Dose">Dose</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/energy" title="Show articles tagged Energy">Energy</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/events" title="Show articles tagged Events">Events</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/exercise" title="Show articles tagged Exercise">Exercise</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/expert-guide" title="Show articles tagged Expert Guide">Expert Guide</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/fasting" title="Show articles tagged Fasting">Fasting</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/fertility" title="Show articles tagged Fertility">Fertility</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/food-derived-supplements" title="Show articles tagged Food-Derived Supplements">Food-Derived Supplements</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/gray-hair" title="Show articles tagged Gray Hair">Gray Hair</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/gut-health" title="Show articles tagged Gut Health">Gut Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/hair-health" title="Show articles tagged Hair Health">Hair Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/hallmarks-of-aging" title="Show articles tagged Hallmarks Of Aging">Hallmarks Of Aging</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/hashimotos-thyroiditis" title="Show articles tagged Hashimoto&#39;s Thyroiditis">Hashimoto's Thyroiditis</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/heart-health" title="Show articles tagged Heart Health">Heart Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/hormones" title="Show articles tagged Hormones">Hormones</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/how-to-use" title="Show articles tagged How To Use">How To Use</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/immunity" title="Show articles tagged Immunity">Immunity</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/inflammation" title="Show articles tagged Inflammation">Inflammation</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/ingredients" title="Show articles tagged Ingredients">Ingredients</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/leslie-kenny" title="Show articles tagged Leslie Kenny">
1268Leslie Kenny</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/longevity-lifestyle" title="Show articles tagged Longevity Lifestyle">Longevity Lifestyle</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/mens-health" title="Show articles tagged Men&#39;s Health">Men's Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/menopause" title="Show articles tagged Menopause">Menopause</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/mood" title="Show articles tagged Mood">Mood</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/news" title="Show articles tagged News">News</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/nutrition" title="Show articles tagged Nutrition">Nutrition</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/polyamines" title="Show articles tagged Polyamines">Polyamines</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/quality-testing" title="Show articles tagged Quality &amp; Testing">Quality & Testing</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/recipes" title="Show articles tagged Recipes">Recipes</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/seasonal-eating" title="Show articles tagged Seasonal Eating">Seasonal Eating</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/skin-health" title="Show articles tagged Skin Health">Skin Health</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/sleep" title="Show articles tagged Sleep">Sleep</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/spermidine" title="Show articles tagged Spermidine">Spermidine</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/spermidine-benefits" title="Show articles tagged Spermidine Benefits">Spermidine Benefits</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/studies" title="Show articles tagged Studies">Studies</a></li><li role="tab" aria-selected="false"><a href="/blogs/aging-well/tagged/womens-health" title="Show articles tagged Women&#39;s Health">Women's Health</a></li></ul>
1269            </div>
1270          </div></div>
1271    </header>
1272
1273    <div class="blog-posts__container container"><div class="blog-posts"><blog-post-card class="blog-post-card blog-post-card--featured snap-center group rounded bg-secondary"><a href="/blogs/aging-well/what-is-the-best-spermidine-supplement-a-2026-comparison-guide" class="blog-post-card__figure "><img src="//oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=2640" alt="What Is the Best Spermidine Supplement? A 2026 Comparison Guide" srcset="//oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=1200 1200w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=1400 1400w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=1600 1600w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=1800 1800w, //oxfordhealthspan.com/cdn/shop/articles/Frame_2147225241.png?v=1783440285&amp;width=2000 2000w" width="2640" height="981" loading="lazy" sizes="(max-width: 999px) 100vw, calc(min(100vw, 1300px) * 0.65)" class="w-full h-full object-cover zoom-image"></a><div class="blog-post-card__info">
1274    <div class="v-stack gap-5 sm:gap-6">
1275      <div class="v-stack gap-3 sm:gap-5"><span class="badge badge--current badge--lg">Spermidine</span><p class="blog-post__title h2"><a href="/blogs/aging-well/what-is-the-best-spermidine-supplement-a-2026-comparison-guide">What Is the Best Spermidine Supplement? A 2026 Comparison Guide</
1275a></p><p class="text-lg">The best spermidine supplement is one that pairs a clean, whole-food source with transparent testing and a formulation your body recognizes. On those measures, Primeadine by Oxford Healthspan ranks...</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1276        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1277        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1278        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1279      </svg><span class="text-sm">Jul 7, 2026</span>
1280            </div></div></div>
1281  </div></blog-post-card><blog-post-card class="blog-post-card snap-center group"><a href="/blogs/aging-well/how-much-spermidine-do-you-actually-need" class="blog-post-card__figure rounded"><span class="badge badge--primary">Dose</span><img src="//oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=2240" alt="How Much Spermidine Do You Actually Need?" srcset="//oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=1200 1200w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=1400 1400w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=1600 1600w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=1800 1800w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Banner_Template-2.png?v=1784131222&amp;width=2000 2000w" width="2240" height="1260" loading="lazy" sizes="(max-width: 699px) 100vw, (max-width: 1149px) calc(100vw / 2 - 40px), (max-width: 1399px) calc(min(100vw, 1300px) / 3 - 40px) , calc(min(100vw, 1300px) / 3 - 80px)" class="w-full h-full object-cover zoom-image"></a><div class="blog-post-card__info">
1282    <div class="v-stack gap-4 sm:gap-5">
1283      <div class="v-stack gap-3 sm:gap-4"><p class="blog-post__title h3"><a href="/blogs/aging-well/how-much-spermidine-do-you-actually-need">How Much Spermidine Do You Actually Need?</a></p><p >If you've been researching spermidine for more than ten minutes, you've probably hit a wall of contradictory numbers. One brand claims 10mg per serving. Another leads with 800mg. A third talks abou...</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1284        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1285        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1286        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1287      </svg><span class="text-sm">Jul 2, 2026</span>
1288            </div></div></div>
1289  </div></blog-post-card><blog-post-card class="blog-post-card snap-center group"><a href="/blogs/aging-well/primeadine-gf-chlorella-vs-standard-chlorella-supplements-whats-the-difference" class="blog-post-card__figure roun
1289ded"><span class="badge badge--primary">Ingredients</span><img src="//oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=2240" alt="Primeadine GF chlorella vs. standard chlorella supplements: What&#39;s the difference?" srcset="//oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=1200 1200w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=1400 1400w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=1600 1600w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=1800 1800w, //oxfordhealthspan.com/cdn/shop/articles/OH_Blog_Images_5ae1d4fd-9732-4df4-ad74-f00210adb22c.png?v=1783001089&amp;width=2000 2000w" width="2240" height="1260" loading="lazy" sizes="(max-width: 699px) 100vw, (max-width: 1149px) calc(100vw / 2 - 40px), (max-width: 1399px) calc(min(100vw, 1300px) / 3 - 40px) , calc(min(100vw, 1300px) / 3 - 80px)" class="w-full h-full object-cover zoom-image"></a><div class="blog-post-card__info">
1290    <div class="v-stack gap-4 sm:gap-5">
1291      <div class="v-stack gap-3 sm:gap-4"><p class="blog-post__title h3"><a href="/blogs/aging-well/primeadine-gf-chlorella-vs-standard-chlorella-supplements-whats-the-difference">Primeadine GF chlorella vs. standard chlorella supplements: What's the difference?</a></p><p >Not all chlorella is created equal, and the differences between what we use in Primeadine GF and a standard chlorella supplement are significant.</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1292        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1293        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1294        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1295      </svg><span class="text-sm">Jul 2, 2026</span>
1296            </div></div></div>
1297  </div></blog-post-card><blog-post-card class="blog-post-card snap-center group"><a href="/blogs/aging-well/new-research-from-oxford-evidence-for-spermidine-and-immune-cell-renewal" class="blog-post-card__figure rounded"><span class="badge badge--primary">Autophagy</span><img src="//oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=1200" alt="New Research from Oxford: Evidence for Spermidine and Immune Cell Renewal | Oxford Healthspan" srcset="//oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/Immune_Health_3b379305-1f35-4783-bd9f-1aa337072f4f.jpg?v=1783001077&amp;width=1200 1200w" width="1200" height="628" loading="lazy" sizes="(max-width: 699px) 100vw, (max-width: 1149px) calc(100vw / 2 - 40px), (max-width: 1399px) calc(min(100vw, 1300px) / 3 - 40px) , calc(min(100vw, 1300px) / 3 - 80px)" class="w-full h-full object-cover zoom
1297-image"></a><div class="blog-post-card__info">
1298    <div class="v-stack gap-4 sm:gap-5">
1299      <div class="v-stack gap-3 sm:gap-4"><p class="blog-post__title h3"><a href="/blogs/aging-well/new-research-from-oxford-evidence-for-spermidine-and-immune-cell-renewal">New research from Oxford University: Evidence for spermidine and immune cell renewal</a></p><p >For the first time, researchers have new human data on something long observed in the lab: spermidine's ability to support renewal in aging immune cells. A pilot study from the University of Oxford...</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1300        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1301        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1302        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1303      </svg><span class="text-sm">Jul 2, 2026</span>
1304            </div></div></div>
1305  </div></blog-post-card><blog-post-card class="blog-post-card snap-center group"><a href="/blogs/aging-well/eat-the-season-summer-fruits-that-nourish-your-cells" class="blog-post-card__figure rounded"><span class="badge badge--primary">Recipes</span><img src="//oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=1200" alt="Eat the season: summer fruits that nourish your cells" srcset="//oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/Blog_Image_Options-2_46407609-b1a5-43b0-b0c1-992977065897.png?v=1782734227&amp;width=1200 1200w" width="1200" height="628" loading="lazy" sizes="(max-width: 699px) 100vw, (max-width: 1149px) calc(100vw / 2 - 40px), (max-width: 1399px) calc(min(100vw, 1300px) / 3 - 40px) , calc(min(100vw, 1300px) / 3 - 80px)" class="w-full h-full object-cover zoom-image"></a><div class="blog-post-card__info">
1306    <div class="v-stack gap-4 sm:gap-5">
1307      <div class="v-stack gap-3 sm:gap-4"><p class="blog-post__title h3"><a href="/blogs/aging-well/eat-the-season-summer-fruits-that-nourish-your-cells">Eat the season: Summer fruits that nourish your cells</a></p><p >The seasons have a way of working with your biology, bringing an abundance of whole foods that naturally support your cellular health. Right now, in the Summer months,  nature is offering colorful ...</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1308        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1309        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1310        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1311      </svg><span class="text-sm">Jun 29, 2026</span>
1312            </div></div></div>
1313  </div></blog-post-card><blog-post-card class="blog-post-card snap-center group"><a href="/blogs/aging-well/what-an-8-day-cycling-trip-taught-me-about-healthy-aging" class="blog-post-card__figure roun
1313ded"><span class="badge badge--primary">Longevity Lifestyle</span><img src="//oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=1286" alt="What an 8-day cycling trip around Italy taught me about healthy aging" srcset="//oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=300 300w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=400 400w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=500 500w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=600 600w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=800 800w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=1000 1000w, //oxfordhealthspan.com/cdn/shop/articles/Screenshot_2026-06-06_at_13.00.17_81e42659-b7e5-4906-90c5-f7dd77bf412b.png?v=1781099697&amp;width=1200 1200w" width="1286" height="684" loading="lazy" sizes="(max-width: 699px) 100vw, (max-width: 1149px) calc(100vw / 2 - 40px), (max-width: 1399px) calc(min(100vw, 1300px) / 3 - 40px) , calc(min(100vw, 1300px) / 3 - 80px)" class="w-full h-full object-cover zoom-image"></a><div class="blog-post-card__info">
1314    <div class="v-stack gap-4 sm:gap-5">
1315      <div class="v-stack gap-3 sm:gap-4"><p class="blog-post__title h3"><a href="/blogs/aging-well/what-an-8-day-cycling-trip-taught-me-about-healthy-aging">What an 8-day cycling trip around Italy taught me about healthy aging</a></p><p >I recently returned from an eight-day cycling trip through Tuscany with a group of eight friends. We were a mixed group of men and women, and while half of us chose electric bikes, the other half b...</p></div><div class="blog-post-card__meta"><div class="text-with-icon link-faded"><svg role="presentation" fill="none" focusable="false" stroke-width="1.5" width="16" height="16" class="icon icon-blog-date" viewBox="0 0 16 16">
1316        <path d="M5.372 1v2.877M10.455 1v2.877" stroke="currentColor" stroke-linecap="round"/>
1317        <path d="M14.338 7.632H1.497l.179-4.57 6.164-.448 6.497.448v4.57Z" fill="currentColor" fill-opacity=".12"/>
1318        <path d="M1.224 12.073c.183 1.631 1.508 2.925 3.147 3.004a73.18 73.18 0 0 0 3.546.083c1.256 0 2.413-.028 3.546-.083 1.639-.079 2.964-1.374 3.146-3.004.124-1.099.225-2.224.225-3.37 0-1.147-.102-2.273-.225-3.371-.182-1.631-1.507-2.925-3.146-3.004a73.22 73.22 0 0 0-3.546-.083 73.22 73.22 0 0 0-3.546.083c-1.639.079-2.964 1.374-3.147 3.004C1.101 6.43 1 7.556 1 8.703c0 1.146.102 2.272.224 3.37ZM1.331 7.202h13.24" stroke="currentColor" />
1319      </svg><span class="text-sm">Jun 6, 2026</span>
1320            </div></div></div>
1321  </div></blog-post-card></div><nav class=" pagination" role="navigation" aria-label="Pagination navigation"><span class="pagination__item pagination__item--disabled">
1322        <span class="animated-arrow animated-arrow--reverse"></span>
1323      </span><span class="pagination__current">1&nbsp;&nbsp;/&nbsp;&nbsp;14</span><a class="pagination__item group"  rel="next" aria-label="Go to page 2" href="/blogs/aging-well?page=2">
1324        <span class="animated-arrow"></span>
1325      </a></nav></div></div>
1326
1327</section>
1328<!-- BEGIN sections: footer-group -->
1329<section id="shopify-section-sections--21578423107833__rich_text_BENkjL" class="shopify-section shopify-section-group-footer-group shopify-section--rich-text"><style>
1330  #shopify-section-sections--21578423107833__rich_text_BENkjL {
1331    --section-background-hash: 0;
1332  }
1333
1334  #shopify-section-sections--21578423107833__rich_text_BENkjL + * {
1335    --previous-section-background-hash: 0;
1336  }</style><style>
1337    #shopify-section-sections--21578423107833__rich_text_BENkjL {
1338      --rich-text-max-width: 650px
1339    }
1340  </style>
1341
1342  <div class="section   section-blends section-full"><div class="rich-text justify-center ">
1343      <div class="rich-text__wrapper">
1344        <div class="prose justify-items-center text-center"><p class="h2 hyphenate" ><span class="text-custom " style="--text-color: 26 26 26;">Follow us at @oxfordhealthspan</span></p><div ><p><a href="https://instagram.com/oxfordhealthspan" target="_blank" title="https://instagram.com/oxfordhealthspan">Join us on Instagram</a> to learn more</p></div></div>
1345      </div>
1346    </div>
1347  </div></section><section id="shopify-section-sections--21578423107833__1690746217fbac305b" class="shopify-section shopify-section-group-footer-group shopify-section--apps"><style>
1348  #shopify-section-sections--21578423107833__1690746217fbac305b {
1349    --section-background-hash: 0;
1350  }
1351
1352  #shopify-section-sections--21578423107833__1690746217fbac305b + * {
1353    --previous-section-background-hash: 0;
1354  }</style><style>
1355    #shopify-section-sections--21578423107833__1690746217fbac305b {
1356      
1357      
1358    }
1359  </style>
1360
1361  <div class="section   section-blends section-full"><div id="shopify-block-AdEwwQThteHVpRGVhZ__instafeed_app_block_QcncmQ" class="shopify-block shopify-app-block">
1362
1363
1364
1365  
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377<style>
1378      div[id*="instafeed_app_block"] {
1379        width: 100%;
1380      }
1381      div.shopify-section:has(>
1381 [id*="instafeed_app_block"]) {
1382      width: 100%;
1383      }
1384      
1385      body #insta-feed {
1386      
1387          
1388
1389          
1390          margin-bottom: 0px!important;
1391          
1392
1393          
1394
1395          
1396
1397          
1398      }
1399      
1400      body #insta-feed h2 {
1401      
1402        
1403        
1404         text-align: center;
1405      }
1406
1407      
1408      
1409</style>
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421  <div id="insta-feed"></div>
1422  
1422<script>
1423    if (typeof instafeedLocalTitle === 'undefined') var instafeedLocalTitle = "";
1424    
1425  </script>
1425
1426
1427
1428<!-- BEGIN app snippet: storefront-script -->
1429
1430
1431  
1432    
1432<script>
1433      var instafeedScriptSrc = "https:\/\/cdn.nfcube.com\/instafeed-996ec4a1dfdad5036df8647679dd668b.js";
1434      var instafeedScriptMode = "defer";
1435      !function(e,n){if(!window.instafeedStorefrontScheduled&&(window.instafeedStorefrontScheduled=!0,e))if("defer"!==n){if("consent"===n){var t=!1;function o(){t||(t=!0,a())}function i(){window.Shopify&&window.Shopify.customerPrivacy&&window.Shopify.customerPrivacy.marketingAllowed()&&o()}function d(){document.addEventListener("visitorConsentCollected",function(e){e.detail&&e.detail.marketingAllowed&&o()}),window.Shopify&&window.Shopify.loadFeatures?window.Shopify.loadFeatures([{name:"consent-tracking-api",version:"0.1"}],i):i()}return void("loading"===document.readyState?document.addEventListener("DOMContentLoaded",d):d())}"complete"===document.readyState?a():window.addEventListener("load",function(){a()})}else"loading"===document.readyState?document.addEventListener("DOMContentLoaded",a):a();function r(e){return String(e).split("?")[0]}function a(){if(!function(){for(var n=document.getElementsByTagName("script"),t=r(e),o=0;o!==n.length;o++)if(r(n[o].src)===t)return!0;return!1}()){var n=document.createElement("script");n.async=!0,n.src=e,document.body.appendChild(n)}}}(instafeedScriptSrc,instafeedScriptMode);
1436    </script>
1436
1437  
1438
1439<!-- END app snippet -->
1440
1441
1442
1443
1444
1445
1446</div></div>
1447</section><footer id="shopify-section-sections--21578423107833__footer" class="shopify-section shopify-section-group-footer-group shopify-section--footer"><style>
1448  @media screen and (min-width: 1000px) {
1449    #shopify-section-sections--21578423107833__footer {--footer-block-list-justify-content: space-between;
1450    }
1451  }
1452</style>
1453
1454<div class="footer">
1455  <div class="container">
1456    <div class="footer__wrapper"><div class="footer__block-list empty:hidden"><div class="footer__block footer__block--menu" ><p class="bold">Shop</p><ul class="v-stack gap-3" role="list"><li>
1457                          <a href="/collections/all-products" class="inline-block link-faded break-all">Shop All</a>
1458                        </li><li>
1459                          <a href="/pages/why-primeadine" class="inline-block link-faded break-all">Why Primeadine?</a>
1460                        </li><li>
1461                          <a href="/products/whole-food-spermidine-supplement-primeadine-original-1-bottle-30-day-supply" class="inline-block link-faded break-all">Primeadine Original</a>
1462                        </li><li>
1463                          <a href="/products/gluten-free-whole-food-spermidine-supplement-primeadine-gf-1-bottle-30-day-supply" class="inline-block link-faded break-all">Primeadine GF</a>
1464                        </li><li>
1465                          <a href="/blogs/aging-well/the-difference-between-primeadine-original-and-primeadine-gf" class="inline-block link-faded break-all">Primeadine Original vs. GF</a>
1466                        </li><li>
1467                          <a href="/pages/reviews-new" class="inline-block link-faded break-all">Reviews</a>
1468                        </li></ul>
1469                  </div><div class="footer__block footer__block--menu" ><p class="bold">About</p><ul class="v-stack gap-3" role="list"><li>
1470                          <a href="/pages/our-story" class="inline-block link-faded break-all">About Oxford Healthspan</a>
1471                        </li><li>
1472                          <a href="/pages/what-is-spermidine" class="inline-block link-faded break-all">What is spermidine?</a>
1473                        </li><li>
1474                          <a href="/pages/the-hallmarks-of-aging" class="inline-block link-faded break-all">The hallmarks of aging</a>
1475                        </li><li>
1476                          <a href="/pages/certificates-of-analysis" class="inline-block link-faded break-all">Certificates of Analysis</a>
1477                        </li><li>
1478                          <a href="/pages/press-1" class="inline-block link-faded break-all">Press</a>
1479                        </li><li>
1480                          <a href="/pages/awards" class="inline-block link-faded break-all">Awards</a>
1481                        </li><li>
1482                          <a href="/pages/podcasts" class="inline-block link-faded break-all">Podcasts</a>
1483                        </li></ul>
1484                  </div><div class="footer__block footer__block--menu" ><p class="bold">Partners</p><ul class="v-stack gap-3" role="list"><li>
1485                          <a href="/pages/stockists" class="inline-block link-faded break-all">Stockists</a>
1486                        </li><li>
1487                          <a href="/pages/refer-a-friend" class="inline-block link-faded break-all">Refer A Friend</a>
1488                        </li><li>
1489                          <a href="/pages/register-affiliate-account" class="inline-block link-faded break-all">Affiliate program</a>
1490                        </li><li>
1491                          <a href="/pages/practitioner-program" class="inline-block link-faded break-all">Practitioner Program</a>
1492                        </li><li>
1493                          <a href="/pages/wholesale" class="inline-block link-faded break-all">Wholesale</a>
1494                        </li><li>
1495                          <a href="/pages/truemed-hsa-fsa-funds" class="inline-block link-faded break-all">Truemed – HSA/FSA Funds</a>
1496                        </li></ul>
1497                  </div><div class="footer__block footer__block--menu" ><p class="bold">Support</p><ul class="v-stack gap-3" role="list"><li>
1498                          <a href="/pages/frequently-asked-questions" class="inline-block link-faded break-all">FAQs</a>
1499                        </li><li>
1500                          <a href="/pages/contact-us" class="inline-block link-faded break-all">Contact</a>
1501                        </li><li>
1502                          <a href="/policies/shipping-policy" class="inline-block link-faded break-all">Shipping & returns</a>
1503                        </li><li>
1504                          <a href="/pages/cancellation-policy" class="inline-block link-faded break-all">Cancellation policy</a>
1505                        </li></ul>
1506                  </div></div><div class="footer__aside empty:hidden"><div class="footer__aside-top"><ul class="social-media " role="list"><li>
1507      <a href="https://instagram.com/oxfordhealthspan" class="tap-area" target="_blank" rel="noopener" aria-label="Follow on Instagram"><svg role="presentation" focusable="false" width="27" height="27" class="icon icon-instagram" viewBox="0 0 24 24">
1508        <path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.4c-2.607 0-2.934.011-3.958.058-1.022.046-1.72.209-2.33.446a4.705 4.705 0 0 0-1.7 1.107 4.706 4.706 0 0 0-1.108 1.7c-.237.611-.4 1.31-.446 2.331C2.41 9.066 2.4 9.392 2.4 12c0 2.607.011 2.934.058 3.958.046 1.022.209 1.72.446 2.33a4.706 4.706 0 0 0 1.107 1.7c.534.535 1.07.863 1.7 1.108.611.237 1.309.4 2.33.446 1.025.
1508047 1.352.058 3.959.058s2.934-.011 3.958-.058c1.022-.046 1.72-.209 2.33-.446a4.706 4.706 0 0 0 1.7-1.107 4.706 4.706 0 0 0 1.108-1.7c.237-.611.4-1.31.446-2.33.047-1.025.058-1.352.058-3.959s-.011-2.934-.058-3.958c-.047-1.022-.209-1.72-.446-2.33a4.706 4.706 0 0 0-1.107-1.7 4.705 4.705 0 0 0-1.7-1.108c-.611-.237-1.31-.4-2.331-.446C14.934 2.41 14.608 2.4 12 2.4Zm0 1.73c2.563 0 2.867.01 3.88.056.935.042 1.443.199 1.782.33.448.174.768.382 1.104.718.336.336.544.656.718 1.104.131.338.287.847.33 1.783.046 1.012.056 1.316.056 3.879 0 2.563-.01 2.867-.056 3.88-.043.935-.199 1.444-.33 1.782a2.974 2.974 0 0 1-.719 1.104 2.974 2.974 0 0 1-1.103.718c-.339.131-.847.288-1.783.33-1.012.046-1.316.056-3.88.056-2.563 0-2.866-.01-3.878-.056-.936-.042-1.445-.199-1.783-.33a2.974 2.974 0 0 1-1.104-.718 2.974 2.974 0 0 1-.718-1.104c-.131-.338-.288-.847-.33-1.783-.047-1.012-.056-1.316-.056-3.879 0-2.563.01-2.867.056-3.88.042-.935.199-1.443.33-1.782.174-.448.382-.768.718-1.104a2.974 2.974 0 0 1 1.104-.718c.338-.131.847-.288 1.783-.33C9.133 4.14 9.437 4.13 12 4.13Zm0 11.07a3.2 3.2 0 1 1 0-6.4 3.2 3.2 0 0 1 0 6.4Zm0-8.13a4.93 4.93 0 1 0 0 9.86 4.93 4.93 0 0 0 0-9.86Zm6.276-.194a1.152 1.152 0 1 1-2.304 0 1.152 1.152 0 0 1 2.304 0Z" fill="currentColor"/>
1509      </svg></a>
1510    </li></ul></div><div class="footer__aside-bottom"><p class="footer__copyright text-sm text-subdued">© 2026, Oxford Healthspan® . <a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&amp;utm_medium=shopify&amp;utm_source=onlinestore"> </a></p>
1511        </div>
1512      </div>
1513    </div>
1514  </div>
1515</div>
1516
1517</footer>
1518<!-- END sections: footer-group --></main>
1519    
1519<script src="//oxfordhealthspan.com/cdn/shop/t/111/assets/splide.js?v=92528615445365085501775201900" type="text/javascript"></script>
1519
1520   <!-- "snippets/smile-initializer.liquid" was not rendered, the associated app was uninstalled -->
1521<script async type="text/javascript" src="https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=Wcua7E"></script>
1521
1522
1523 <!-- 
1523<script asynch src="https://cdn.orderprotection.com/cart-widget/oxford-healthspan/widget.js"></script>
1523  -->
1524<style> div#rc_login {display: none;} </style>
1525<div id="shopify-block-AWmEzeTZkVm5ockJYd__15350224971397959980" class="shopify-block shopify-app-block">
1526
1527
1528
1529
1530</div>
1530<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
1530
1531</body>
1532<link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
1533<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 55109845160,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "blog"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 1533
1533
1534<script>
1535  window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || [];
1536</script>
vendor: 1 bytes, line 1536
1536
1537<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
1537).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 55109845160,storefrontBaseUrl: "https://oxfordhealthspan.com",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://oxfordhealthspan.com/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"2255126777","configuration":"{\"accountID\":\"1220658\",\"workspaceId\":\"db254b38-af6f-47eb-bcfc-0daf5f35a37f\",\"projectId\":\"8767e4d0-07b2-4f5f-8368-15eaeb205a74\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d98eb033f1e81320021a411362de3a55","type":"APP","apiClientId":5461967,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":[],"dataSharingControls":["share_all_events"]}
1537,"dataSharingState":"unrestricted"},{"id":"2085454073","configuration":"{\"shopId\":\"oxford-healthspan.myshopify.com\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"7093dff47f098f6de2afb75b62011ebe","type":"APP","apiClientId":2753413,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2015592697","configuration":"{\"shop\":\"oxford-healthspan.myshopify.com\", \"shopliftUrl\":\"https:\/\/events.shoplift.ai\/api\/events\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"dabcda9558be25394b12ce3ce899568b","type":"APP","apiClientId":7521861633,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1997209849","configuration":"{\"trackingKey\":\"oxford-healthspan-stayai-web-pixel\",\"enabled\":\"true\",\"collectorUrl\":\"https:\\\/\\\/pixel.retextion.com\",\"version\":\"1\",\"debug\":\"false\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"94457fdfcf80b0033e88e322893e2b49","type":"APP","apiClientId":5859381,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1931215097","configuration":"{\"campaignID\":\"49065\",\"externalExecutionURL\":\"https:\/\/engine.saasler.com\/api\/v1\/webhook_executions\/08d1487c67ffd338585e7d7e8e24789e\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"4d2ae310e7f99f154f33560b5c81cfa9","type":"APP","apiClientId":3546795,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1844871417","configuration":"{\"projectId\":\"v8l6x64x21\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"1729265913","configuration":"{\"accountID\":\"Sjbqq9\",\"webPixelConfig\":\"eyJlbmFibGVBZGRlZFRvQ2FydEV2ZW50cyI6IHRydWV9\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"c63c5b72c8d77be5f2d27d14c081da38","type":"APP","apiClientId":123074,"privacyPurposes":["ANALYTICS","MARKETING"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"1571062009","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"ef9b37cee6fb2f93ffcc681cf1cfdc4e","type":"APP","apiClientId":3624803,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"503349497","configuration":"{\"config\":\"{\\\"pixel_id\\\":\\\"G-872HBDWBE2\\\",\\\"target_country\\\":\\\"US\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":\\\"G-872HBDWBE2\\\"},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":\\\"G-872HBDWBE2\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":[\\\"G-872HBDWBE2\\\",\\\"MC-D26Q4GH6LW\\\"]},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":[\\\"G-872HBDWBE2\\\",\\\"MC-D26Q4GH6LW\\\"]},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":[\\\"G-872HBDWBE2\\\",\\\"MC-D26Q4GH6LW\\\"]},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":\\\"G-872HBDWBE2\\\"},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":\\\"G-872HBDWBE2\\\"}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]}
1537,{"id":"137298169","configuration":"{\"pixel_id\":\"2452568668461647\",\"pixel_type\":\"facebook_pixel\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"96420dbe9ea96c426a1b7f364f977719","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"23265529","eventPayloadVersion":"1","runtimeContext":"LAX","scriptVersion":"1","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"name":"Easy Tag - GTM"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Oxford Healthspan® ","paymentSettings":{"currencyCode":"USD"},"myshopifyDomain":"oxford-healthspan.myshopify.com","countryCode":"US","storefrontUrl":"https:\/\/oxfordhealthspan.com"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://oxfordhealthspan.com/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"158472962297","themePublished":"true","eventMetadataId":"a97d3bc8-744e-4790-b8f0-c4564d54a642","pageType":"blog","resourceId":"77418266792","shopId":"55109845160","storefrontBaseUrl":"https:\/\/oxfordhealthspan.com","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
1537<script>
1538  window.ShopifyAnalytics = window.ShopifyAnalytics || {};
1539  window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {};
1540  window.ShopifyAnalytics.meta.currency = 'USD';
1541  var meta = {"page":{"pageType":"blog","resourceType":"blog","resourceId":77418266792,"requestId":"99b217d8-80b9-4b43-aedf-3c58c2a033db-1791056545"}};
1542  for (var attr in meta) {
1543    window.ShopifyAnalytics.meta[attr] = meta[attr];
1544  }
1545</script>
vendor: 1 bytes, line 1545
1545
1546<script class="analytics">
1547  (function () {
1548    var customDocumentWrite = function(content) {
1549      var jquery = null;
1550
1551      if (window.jQuery) {
1552        jquery = window.jQuery;
1553      } else if (window.Checkout && window.Checkout.$) {
1554        jquery = window.Checkout.$;
1555      }
1556
1557      if (jquery) {
1558        jquery('body').append(content);
1559      }
1560    };
1561
1562    var hasLoggedConversion = function(token) {
1563      if (token) {
1564        return document.cookie.indexOf('loggedConversion=' + token) !== -1;
1565      }
1566      return false;
1567    }
1568
1569    var setCookieIfConversion = function(token) {
1570      if (token) {
1571        var twoMonthsFromNow = new Date(Date.now());
1572        twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2);
1573
1574        document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow;
1575      }
1576    }
1577
1578    var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || [];
1579    window.ShopifyAnalytics.lib.trekkie = window.trekkie;
1580    if (trekkie.integrations) {
1581      return;
1582    }
1583    trekkie.methods = [
1584      'identify',
1585      'page',
1586      'ready',
1587      'track',
1588      'trackForm',
1589      'trackLink'
1590    ];
1591    trekkie.factory = function(method) {
1592      return function() {
1593        var args = Array.prototype.slice.call(arguments);
1594        args.unshift(method);
1595        trekkie.push(args);
1596        if (method == 'track' || method == 'page') {
1597          var pageUrl;
1598          try {
1599            pageUrl = window.location.href;
1600          } catch (e) {}
1601          var pageReferrer;
1602          try {
1603            pageReferrer = document.referrer;
1604          } catch (e) {}
1605          try {
1606            if (window.__TREKKIE_SHIM_QUEUE == null) {
1607              window.__TREKKIE_SHIM_QUEUE = [];
1608            }
1609            window.__TREKKIE_SHIM_QUEUE.push({
1610              from: 'trekkie-stub',
1611              method: method,
1612              args: args.slice(1),
1613              pageContext: {
1614                url: pageUrl,
1615                referrer: pageReferrer
1616              }
1617            });
1618          } catch (e) {
1619            // no-op
1620          }
1621        }
1622        return trekkie;
1623      };
1624    };
1625    for (var i = 0; i < trekkie.methods.length; i++) {
1626      var key = trekkie.methods[i];
1627      trekkie[key] = trekkie.factory(key);
1628    }
1629    trekkie.load = function(config) {
1630      trekkie.config = config || {};
1631      trekkie.config.initialDocumentCookie = document.cookie;
1632      var first = document.getElementsByTagName('script')[0];
1633var script = document.createElement('script');
1634script.type = 'text/javascript';
1635script.onerror = function(e) {
1636  var scriptFallback = document.createElement('script');
1637  scriptFallback.type = 'text/javascript';
1638  scriptFallback.onerror = function(error) {
1639          var Monorail = {
1640      produce: function produce(monorailDomain, schemaId, payload) {
1641        var currentMs = new Date().getTime();
1642        var event = {
1643          schema_id: schemaId,
1644          payload: payload,
1645          metadata: {
1646            event_created_at_ms: currentMs,
1647            event_sent_at_ms: currentMs
1648          }
1649        };
1650        return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event));
1651      },
1652      sendRequest: function sendRequest(endpointUrl, payload) {
1653        // Try the sendBeacon API
1654        if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) {
1655          var blobData = new window.Blob([payload], {
1656            type: 'text/plain'
1657          });
1658
1659          if (window.navigator.sendBeacon(endpointUrl, blobData)) {
1660            return true;
1661          } // sendBeacon was not successful
1662
1663        } // XHR beacon
1664
1665        var xhr = new XMLHttpRequest();
1666
1667        try {
1668          xhr.open('POST', endpointUrl);
1669          xhr.setRequestHeader('Content-Type', 'text/plain');
1670          xhr.send(payload);
1671        } catch (e) {
1672          console.log(e);
1673        }
1674
1675        return false;
1676      },
1677      isIos12: function isIos12() {
1678        return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1;
1679      }
1680    };
1681    Monorail.produce('monorail-edge.shopifysvc.com',
1682      'trekkie_storefront_load_errors/1.1',
1683      {shop_id: 55109845160,
1684      theme_id: 158472962297,
1685      app_name: "storefront",
1686      context_url: window.location.href,
1687      source_url: "//oxfordhealthspan.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"});
1688
1689  };
1690  scriptFallback.async = true;
1691  scriptFallback.src = '//oxfordhealthspan.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
1692  first.parentNode.insertBefore(scriptFallback, first);
1693};
1694script.async = true;
1695script.src = '//oxfordhealthspan.com/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js';
1696first.parentNode.insertBefore(script, first);
1697
1698    };
1699    trekkie.load(
1700      {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":55109845160,"isMerchantRequest":null,"themeId":158472962297,"themeCityHash":"13970817561557851108","contentLanguage":"en","currency":"USD","eventMetadataId":"a97d3bc8-744e-4790-b8f0-c4564d54a642"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}}
1701    );
1702
1703    var loaded = false;
1704    trekkie.ready(function() {
1705      if (loaded) return;
1706      loaded = true;
1707
1708      window.ShopifyAnalytics.lib = window.trekkie;
1709
1710      var originalDocumentWrite = document.write;
1711      document.write = customDocumentWrite;
1712      try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {};
1713      document.write = originalDocumentWrite;
1714
1715      var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/)
1716      var token = match? match[1]: undefined;
1717      if (!hasLoggedConversion(token)) {
1718        setCookieIfConversion(token);
1719        
1720      }
1721    });
1722
1723    window.ShopifyAnalytics.lib.page(null,{"pageType":"blog","resourceType":"blog","resourceId":77418266792,"requestId":"99b217d8-80b9-4b43-aedf-3c58c2a033db-1791056545","shopifyEmitted":true});
1724
1725    var eventsListenerScript = document.createElement('script');
1726    eventsListenerScript.async = true;
1727    eventsListenerScript.src = "//oxfordhealthspan.com/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js";
1728    document.getElementsByTagName('head')[0].appendChild(eventsListenerScript);
1729})();</script>
1729
1730  
1730<script>
1731  if (!window.ga || (window.ga && typeof window.ga !== 'function')) {
1732    window.ga = function ga() {
1733      (window.ga.q = window.ga.q || []).push(arguments);
1734      if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1735        window.Shopify.analytics.publish("ga_stub_called", {}, {sendTo: "google_osp_migration"});
1736      }
1737      console.error("Shopify's Google Analytics stub called with:", Array.from(arguments), "\nSee https://help.shopify.com/manual/promoting-marketing/pixels/pixel-migration#google for more information.");
1738    };
1739    if (window.Shopify && window.Shopify.analytics && typeof window.Shopify.analytics.publish === 'function') {
1740      window.Shopify.analytics.publish("ga_stub_initialized", {}, {sendTo: "google_osp_migration"});
1741    }
1742  }
1743</script>
vendor: 1 bytes, line 1743
1743
1744<script
1745  defer
1746  src="https://oxfordhealthspan.com/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js"
1747  data-application="storefront-renderer"
1748  data-shop-id="55109845160"
1749  data-render-region="gcp-us-central1"
1750  data-page-type="blog"
1751  data-theme-instance-id="158472962297"
1752  data-theme-name="Impact"
1753  data-theme-version="4.3.2"
1754  data-monorail-region="shop_domain"
1755  data-resource-timing-sampling-rate="10"
1756  data-shs="true"
1757  data-shs-beacon="true"
1758  data-shs-export-with-fetch="true"
1759  data-shs-logs-sample-rate="1"
1760  data-shs-beacon-endpoint="https://oxfordhealthspan.com/api/collect"
1761></script>
1761
1762</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.