@thg-agentic/hyper-personalisation-web 3.30.0 → 3.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -582,6 +582,22 @@ audiences still hold. Asked for twice while it opens, it opens once. With the pr
582
582
  shows until that long after the last one this session (1440 is once per session); bars, teasers and
583
583
  inline forms are never held back. A form with `audiences` needs personalisation consent.
584
584
 
585
+ **Answers (3.31).** Under personalisation consent the client keeps what the shopper answered this
586
+ property's forms, `thg_hp_answers:<property>` in localStorage: the latest answer to each choice
587
+ question (its key and the option values chosen; never a date, a number, typed text or contact
588
+ data), each for 90 days from when it was given, written from a quiz's `Preferences Stated` (so only with analytics consent too) and a
589
+ sign-up form's answers once the gateway took them. A form limited to
590
+ an early audience, one whose every rule is an answer or about the visit, is then decided from those
591
+ answers with the visit, so it shows on the next page view without waiting for the warehouse. The
592
+ datafile ships it as a MIXED audience (`rules` its visit rules) with `early: true` and its
593
+ `answer_rules`: `answer.<question>` with `in` (is one of), `not_in` (is none of; holds with no
594
+ answer kept) or `all` (includes all of) and a list of answers. The runtime sends the early audiences
595
+ that hold on the kept answers as `answered_audiences`. The answers go when personalisation is
596
+ refused or withdrawn, at a sign-out and when another user signs in. Anywhere else (the page's own
597
+ `./session`, which carries no answers, an answer given on another device, an earlier SDK) an early
598
+ audience is MIXED: met where the warehouse qualified the shopper on its answers and its visit rules
599
+ hold, from the next profile update.
600
+
585
601
  **Arrived from.** A form with `arrived_from` shows only to a visit that landed from a matching
586
602
  campaign: `[{ field, match, values }]`, `field` one of `source`, `medium`, `campaign`, `content`,
587
603
  `term` (the link's `utm_*` tags), `match` `is` or `contains`, compared trimmed and in any case.
@@ -698,7 +714,7 @@ each form did or did not show, and a preview link (`?hp_preview=`) counts nothin
698
714
  (about 15.7 KiB), so a page that shows a form loads about 22.3 KiB of onsite code and one whose
699
715
  forms never fire about 6.6 KiB; `onsite-wheel.min.js` under 8 KiB (about 1.8 KiB),
700
716
  `onsite-answers.min.js` under 2 KiB (about 1.5 KiB), `onsite-products.min.js` under 2.6 KiB (about
701
- 2.5 KiB), `onsite-audiences.min.js` under 1.44 KiB (about 1.4 KiB). The core carries only the loader.
717
+ 2.5 KiB), `onsite-audiences.min.js` under 1.63 KiB (about 1.61 KiB). The core carries only the loader.
702
718
 
703
719
  **Products in a form.** A creative's `products` block (ADR 0064 as amended 2026-11-02) is filled by
704
720
  the public API in the decision that serves the form, as the block's `served`. For a form whose
@@ -1117,6 +1133,7 @@ SDK per page.
1117
1133
  | `debug` | `thg_hp_debug` | sessionStorage | a developer's debug token from `?hp_debug=` (3.18), checked against the settings on every page |
1118
1134
  | `onsite` | `thg_hp_onsite:<property>` | localStorage, sessionStorage | onsite forms' opaque counters per slot and a subscribed flag; never contact data (see [Onsite forms](#onsite-forms)) |
1119
1135
  | `visitCampaign` | `thg_hp_visit_campaign:<property>` | localStorage | the campaign tags the visit landed with, when it was last active and its session id once kept; ended with the session (see [Onsite forms](#onsite-forms)) |
1136
+ | `answers` | `thg_hp_answers:<property>` | localStorage | the latest answer to each question of the property's onsite forms, 90 days each; only while personalisation is granted, gone at a sign-out (3.31, see [Onsite forms](#onsite-forms)) |
1120
1137
  | — | `thg_hp_conformance_page_type` | sessionStorage | the previous page's type, only while the development-only conformance checker runs |
1121
1138
 
1122
1139
  Keys are scoped by property because one origin can serve several tenants. The names the SDK used
package/dist/hp.min.js CHANGED
@@ -1,3 +1,3 @@
1
- (()=>{var Sn=e=>{throw TypeError(e)};var lo=(e,t,n)=>t.has(e)||Sn("Cannot "+n);var _n=(e,t,n)=>t.has(e)?Sn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var L=(e,t,n)=>(lo(e,t,"access private method"),n);var Ee=[];for(let e=2;Ee.length<64;e++)Ee.every(t=>e%t!==0)&&Ee.push(e);var bn=e=>(e-Math.floor(e))*2**32>>>0,fo=Ee.slice(0,8).map(e=>bn(Math.sqrt(e))),po=Ee.map(e=>bn(Math.cbrt(e))),Q=(e,t)=>e>>>t|e<<32-t;function In(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(fo),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[s+w];continue}let k=o[w-15],b=o[w-2],x=Q(k,7)^Q(k,18)^k>>>3,h=Q(b,17)^Q(b,19)^b>>>10;o[w]=o[w-16]+x+o[w-7]+h}let[i,u,c,l,f,p,m,A]=r;for(let w=0;w<64;w++){let k=Q(f,6)^Q(f,11)^Q(f,25),b=A+k+(f&p^~f&m)+po[w]+o[w]|0,h=(Q(i,2)^Q(i,13)^Q(i,22))+(i&u^i&c^u&c)|0;[A,m,p,f,l,c,u,i]=[m,p,f,l+b|0,c,u,i,b+h|0]}[i,u,c,l,f,p,m,A].forEach((w,k)=>{r[k]+=w})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var It=(e,t)=>e<<t|e>>>32-t;function kn(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:It(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,u,c,l,f]=n;for(let p=0;p<80;p++){let m,A;p<20?(m=u&c|~u&l,A=1518500249):p<40?(m=u^c^l,A=1859775393):p<60?(m=u&c|u&l|c&l,A=2400959708):(m=u^c^l,A=3395469782);let w=It(i,5)+m+f+A+r[p]|0;[f,l,c,u,i]=[l,c,It(u,30),i,w]}[i,u,c,l,f].forEach((p,m)=>{n[m]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var mo="e28e8ada-5b76-4209-bba9-79b823a0af75",ho=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function xn(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),u=>Number.parseInt(u,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=kn(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=ho(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var ue=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function Fe(e,t){return ue(e,64)??ue(t,256)}function An({sessionId:e,slot:t,arm:n}={}){let r=ue(e,256);return!r||!ue(t,256)||!ue(n,256)?null:xn(mo,`${r}:${t}:${n}`)}var go="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function vn({sessionId:e,surface:t}={}){let n=ue(e,256);return!n||!ue(t,64)?null:xn(go,`${n}:${t}`)}var yo=Array.from({length:11},(e,t)=>t/10);function wo(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,u=o?Math.min(i,o.width*o.height):i;return u>0&&s/u>=t}function re(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,u=new WeakSet,c=new Set,l=h=>{i.has(h)||i.set(h,setTimeout(()=>{i.delete(h),n(h)&&(p?.unobserve(h),c.delete(h))},o))},f=h=>{clearTimeout(i.get(h)),i.delete(h)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(h=>{for(let E of h){let S=E.target;if(!wo(E,r)){c.delete(S),f(S);continue}c.add(S),m()&&l(S)}},{threshold:yo}),m=()=>typeof document>"u"||document.visibilityState!=="hidden",A=()=>{if(m())for(let h of c)l(h);else for(let h of c)f(h)};document.addEventListener("visibilitychange",A);let w=()=>{for(let h of s.querySelectorAll(t))u.has(h)||(u.add(h),p?.observe(h))},k=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),b=()=>{w(),k?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},x=s===document&&!document.body;return x?document.addEventListener("DOMContentLoaded",b,{once:!0}):b(),()=>{x&&document.removeEventListener("DOMContentLoaded",b),document.removeEventListener("visibilitychange",A),p?.disconnect(),k?.disconnect();for(let h of i.values())clearTimeout(h);i.clear(),c.clear()}}function kt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return re({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let u=i.dataset?.hpExposure?.trim();return u&&e.surfaceViewed({surface:u}),!0}})}var En=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function xt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,u=new Set,c=w=>w.closest?.(n)??null,l=w=>{let k=w.dataset.hpList?.trim();return k?{list_id:k,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(k=>c(k)===w),p=(w,k)=>{try{let b=JSON.parse(w.dataset.hpProduct??"");return!b||typeof b!="object"||!b.product_id?null:{...b,position:b.position??k+1,...b.url?{url:En(b.url)}:{},...b.image_url?{image_url:En(b.image_url)}:{}}}catch{return null}},m=re({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(w){let k=c(w);if(!k||k.dataset.hpListView==="manual")return!0;let b=l(k);if(!b||u.has(b.list_id))return!0;let x=new Set,h=f(k).map(p).filter(E=>!E||x.has(E.product_id)?!1:(x.add(E.product_id),!0));return h.length===0||(u.add(b.list_id),e.productListViewed({...b,products:h})),!0}}),A=w=>{let b=w.target?.closest?.("a[href]")?.closest(r);if(!b)return;let x=c(b),h=p(b,x?f(x).indexOf(b):0);h&&e.productClicked({list_id:x?l(x)?.list_id??null:null,products:[h]})};return document.addEventListener("click",A,!0),()=>{document.removeEventListener("click",A,!0),m()}}function D(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function qe(e,...t){let n=D(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function So(e,t){let n=D(e,"hpPromotion");return n?{promotion_id:n,name:D(e,"hpPromotionName"),creative:D(e,"hpPromotionCreative"),position:D(e,"hpPromotionSlot")??String(t+1)}:null}function At(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=So,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,u=new Set,c=p=>{let m=Array.from(i.querySelectorAll(n)),A=m.indexOf(p);try{return r(p,A<0?m.length:A)}catch{return null}},l=re({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let m=c(p);return!m||u.has(m.promotion_id)?!1:(u.add(m.promotion_id),e.promotionViewed(m),!0)}}),f=p=>{let m=p.target;if(!m||typeof m.closest!="function")return;let A=m.closest(n),w=m.closest("a[href]");if(!A||!w||!A.contains(w)&&!w.contains(A))return;let k=c(A);k&&e.promotionClicked({...k,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),l()}}function _o(e){let t=D(e,"hpRecoRequest"),n=D(e,"hpRecoPlacement"),r=D(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=D(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:D(e,"hpRecoRecipe"),algorithm_version:D(e,"hpRecoAlgorithmVersion"),experiment:D(e,"hpRecoExperiment"),variant:D(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:qe(e,"hpRecoBucket"),assignment_unit_kind:D(e,"hpRecoUnitKind"),candidate_set_fingerprint:D(e,"hpRecoFingerprint"),candidate_set_size:qe(e,"hpRecoCandidates"),ranked_by:D(e,"hpRecoRankedBy"),served_at:D(e,"hpRecoServedAt")}}function bo(e,t){let n=D(e,"hpRecoProduct");if(!n)return null;let r=D(e,"hpRecoPrice");return{product_id:n,sku:D(e,"hpRecoSku"),name:D(e,"hpRecoName"),brand:D(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:qe(e,"hpRecoPosition")??t+1}}function vt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=_o,resolveTile:s=bo,visibleRatio:i=.5,dwellMs:u=1e3,root:c=document}=t,l=new Set,f=new Map,p=new Map,m=(h,...E)=>{try{return h(...E)}catch{return null}},A=h=>typeof h.closest=="function"?h.closest(n):null,w=h=>Array.from(h.querySelectorAll(r)),k=(h,E)=>{if(p.delete(E.recommendation_request_id),l.has(E.recommendation_request_id))return;let S=w(h).map((y,O)=>m(s,y,O)).filter(y=>y?.product_id);if(S.length===0)return;l.add(E.recommendation_request_id);let g=[...f.get(E.recommendation_request_id)?.values()??[]].sort((y,O)=>y.position-O.position);e.recommendationsViewed({...E,products:S,viewable:g})},b=re({selector:`${n} ${r}`,root:c,visibleRatio:i,dwellMs:u,onViewable(h){let E=A(h);if(!E)return!0;let S=m(o,E);if(!S)return!0;let g=S.recommendation_request_id,y=m(s,h,w(E).indexOf(h));if(y?.product_id){f.has(g)||f.set(g,new Map);let O=f.get(g);O.has(y.position)||O.set(y.position,{position:y.position,product_id:y.product_id,viewable_at:new Date().toISOString()})}return!l.has(g)&&!p.has(g)&&p.set(g,setTimeout(()=>k(E,S),0)),!0}}),x=h=>{let E=h.target;if(!E||typeof E.closest!="function")return;let S=E.closest(r);if(!S)return;let g=E.closest("[data-hp-reco-interaction]"),y=E.closest("a[href]"),O=y&&(S.contains(y)||y.contains(S));if(!(g&&S.contains(g))&&!O)return;let N=A(S);if(!N)return;let U=m(o,N);if(!U)return;let G=m(s,S,w(N).indexOf(S));if(!G?.product_id)return;let q=U.recommendation_request_id;l.has(q)||(clearTimeout(p.get(q)),k(N,U)),e.productClicked({recommendation_request_id:U.recommendation_request_id,interaction:D(g??S,"hpRecoInteraction")??"navigate",products:[G]})};return document.addEventListener("click",x,!0),()=>{document.removeEventListener("click",x,!0);for(let h of p.values())clearTimeout(h);p.clear(),b()}}var _e=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),Io=new Set(["products"]),Cn=e=>e==null;function Et(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>Et(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!Cn(r)).map(([r,o])=>[r,Et(o,t)]));return t.delete(e),n}function Ct(e){if(!e)return e;let t=Et(e);for(let n of Io)n in e&&Cn(e[n])&&(t[n]=e[n]);return t}function Pn(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var ko=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function F(e){if(e==null)return null;let t=String(e).trim();return ko.has(t.toLowerCase())?null:t}var Ce=e=>typeof e=="string"&&e!==""?e:null;function oe(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var On="1.22";function j(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var xo={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},Ao=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,vo=/\d(?:[ -]?\d){12,}/,Eo=new Set(["gclid","fbclid","ttclid","msclkid"]);function Tn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!Eo.has(String(t).toLowerCase());return n.some(o=>Ao.test(o)||r&&vo.test(o))}function Ot(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(xo)]){let i=t.get(o);i&&!Tn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var Co=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Po=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],Oo=["tel","uid","dob"],Lo=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],To=new Set(Co.map(e=>e.toLowerCase()));function No(e){let t=String(e).toLowerCase();if(To.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Po.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>Oo.includes(o))}function Pt(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function Nn(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?Pt([...t.queryParamAllowlist,...Lo]):null,o=Pt(t.queryParamBlocklist),s=Pt(t.sensitiveParamAllowlist);for(let u of new Set(n.keys()))(No(u)&&!s.some(l=>l.test(u))||n.getAll(u).some(l=>Tn(l,u))||(r?!r.some(l=>l.test(u)):o.some(l=>l.test(u))))&&n.delete(u);let i=n.toString();return i?`?${i}`:""}catch{return""}}function Rn(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+(Nn(r.search,n)??""):r.origin+r.pathname}catch{return null}}function Lt(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:Rn(n.href,location.origin,t)}catch{return null}}function Tt(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function Ln(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Nt(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function M(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function Ro(e){return{...e.propertyId==null?{}:{property_id:String(e.propertyId)},channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function Mo(e){let t=typeof window<"u"?window.location:null,n=t?Nn(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?Rn(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}var Pe;function Do(){if(Pe!==void 0)return Pe;try{Pe=globalThis.Temporal?.Now?.timeZoneId?.()||Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{Pe=null}return Pe}function Mn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:On},source:Ro(e),session_id:M(e.getSessionId,null),identity_trust:F(M(e.getAnonymousId,null))?"device":"none",page:Mo(e),campaign:n?Ot(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:Tt(M(e.getCurrency,e.currency)),locale:Nt(M(e.getLocale,e.locale)),timezone:Do(),country:Ln(e.country),ship_to_country:Ln(M(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:M(e.getExperiments,null),audiences:M(e.getAudiences,null),decisions:M(e.getDecisions,null),recommendations:M(e.getRecommendations,null),extensions:M(e.getExtensions,null)};return Dn(r,t)}function Dn(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=Dn(e[r],o):o!==void 0&&(n[r]=o);return n}var fe=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug",onsite:"thg_hp_onsite",visitCampaign:"thg_hp_visit_campaign"}),Uo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},Rt={...fe},Un=!1;function Ke(e){let t={...fe};for(let[n,r]of Object.entries(e??{})){if(!(n in fe))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}Rt=t}function P(e){return Rt[e]}var Vo="_",Vn=e=>e==null||e===""?Vo:String(e);function $(e,t,n){let r=`${e}:${Vn(t)}`;return n==null||n===""?r:`${r}:${n}`}function $n(e,t){return`${e}:${Vn(t)}:`}function Ge(){if(!Un){Un=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(Uo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=Rt[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var Dt=1800*1e3,ze=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},Mt=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function Bn(e,t=()=>Date.now()){return{read(){try{let n=ze()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>Dt?(r&&ze()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?ze()?.removeItem(e):ze()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var $o=400*24*60*60;function se(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function Bo({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let u=null;try{u=Mt()?.getItem(n)||null}catch{u=null}let c=r(e)??u??i,l=!1,f=()=>{if(!(l||c===null||!s())&&(l=se(e,c,$o,t),!(!l||u===null)))try{Mt()?.removeItem(n),u=null}catch{}};return{get(){return c??(c=o()),f(),c},peek:()=>c,persist:f,forget(){se(e,"",0,t),c=null,l=!1;try{Mt()?.removeItem(n)}catch{}u=null}}}function jn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>Bo({name:P("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:$(P("anonymousId"),e.propertyId),read:j,mint:oe,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let c=s();return e.getAnonymousId=()=>c.get(),c}if(o?.source==="site_cookie"&&o.cookie){let c=o.cookie;e.getAnonymousId=()=>j(c)}if(!r)return null;let i=e.getAnonymousId,u=s();return e.getAnonymousId=()=>F(M(i,null))??u.get(),u}var jo=200;function Hn(e,t,n=()=>Date.now()){let r=()=>$(P("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=Dt)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-jo)})),!0)}catch{return!1}},close(){o=!0}}}var ma=fe.consent,We=Object.freeze({visitor:"visitor",host:"host"}),qn=()=>({basis:We.host}),Ho="hp-consent",pe=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],Kn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},ne=()=>typeof window<"u",Gn=()=>ne()&&typeof window.cookieStore?.addEventListener=="function",Fo=e=>e===!0?!0:e===!1?!1:null;function be(e){if(!e||typeof e!="object")return null;let t={};for(let n of pe)t[n]=Fo(e[n]);return t}function Ut(e,t){return!e||!t?e===t:pe.every(n=>e[n]===t[n])}function Vt(e){if(!e)return"";let t=[];for(let n of pe){let r=e[n];(r===!0||r===!1)&&t.push(`${Kn[n]}=${r?1:0}`)}return t.join("&")}function $t(e){return{[Ho]:Vt(be(e))}}function Oe(e){let t=be({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(Kn).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let u=r[s.slice(0,i).trim()],c={1:!0,0:!1}[s.slice(i+1).trim()]??null;!u||c===null||o.has(u)||(t[u]===null?t[u]=c:t[u]!==c&&(t[u]=null,o.add(u)))}return t}function Bt(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of pe)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function jt(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Je(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var qo={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function Ko(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(u=>{let c=String(u).toLowerCase();return s===c||s.startsWith(`${c}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function zn(e={}){let t={...qo,...e.purposes};function n(){let r=ne()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>Ko(o,t[i]);return jt({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!ne())return()=>{};let o=Je(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function Fn(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function Wn(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=Fn(j("OptanonConsent"));if(i.groups){let l={};for(let f of i.groups.split(",")){let[p,m]=f.split(":");p?.trim()&&(l[p.trim()]=m==="1"?!0:m==="0"?!1:null)}return f=>l[f]??!1}let u=ne()?window.OnetrustActiveGroups:void 0;if(typeof u!="string"||!u.length)return null;let c=new Set(u.split(",").map(l=>l.trim()).filter(Boolean));return l=>c.has(l)}function o(){if(j("OptanonAlertBoxClosed"))return!0;try{if(ne()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return n&&ne()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let u=p=>t[p]?i(t[p]):null,c=jt({analytics:u("analytics"),marketing:u("marketing"),personalisation:u("personalisation")},{ad_user_data:u("ad_user_data"),ad_personalization:u("ad_personalization")}),l=Fn(j("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||l.isGpcEnabled==="1")&&(c.marketing=!1,c.ad_user_data=!1,c.ad_personalization=!1),c}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!ne())return()=>{};let u=Je(s,i),c=!1,l=()=>{c||!window.OneTrust?.OnConsentChanged||(c=!0,window.OneTrust.OnConsentChanged(u.notify))};window.addEventListener("OneTrustGroupsUpdated",u.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...m){try{typeof f=="function"&&f.apply(this,m)}finally{l(),u.notify()}},l(),()=>{u.stop(),window.removeEventListener("OneTrustGroupsUpdated",u.notify)}}}}function Go(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function Jn(e){let{name:t,categories:n,parse:r=Go,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function u(){let c=j(t);if(c==null)return null;let l;if(o!==void 0&&c===o)l=new Set;else try{l=r(c)}catch{l=null}if(!(l instanceof Set))return null;let f=p=>n[p]?l.has(n[p]):null;return jt({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:u,get observesChanges(){return Gn()},subscribe(c){if(!ne())return()=>{};let l=Je(u,c),f=p=>{[...p.changed??[],...p.deleted??[]].some(A=>A?.name===t)&&l.notify()};return window.addEventListener(i,l.notify),window.cookieStore?.addEventListener?.("change",f),()=>{l.stop(),window.removeEventListener(i,l.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function Yn(e={}){let t=e.name??P("consent"),n=()=>{let r=j(t);if(r==null)return null;let o=Oe(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return Gn()},subscribe(r){if(!ne())return()=>{};let o=Je(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(c=>c?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function Xn(e){let t=be(e);return{name:"static",basis:We.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function Zn(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function zo(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return Zn(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return Zn(n.join("/"))}var Wo=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function Jo(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var Ye=e=>Jo(e.item_group_id,e.item_id);function Yo(e,t=Ye){if(!e)return null;let n=u=>u==null||u===""||Number.isNaN(Number(u))?null:Number(u),r=u=>{let c=n(u);return c==null?null:Math.round(c*1e6)/1e6},o=u=>{let c=r(u);return c!=null&&c>=0?c:null},s=u=>{let c=n(u);return Number.isInteger(c)&&c>=0?c:null},i=Wo;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:zo(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function Ht(e,t=Ye){return(e??[]).map(n=>Yo(n,t)).filter(n=>n?.product_id)}var Xo=1e3,Zo={shipping:2,payment:3},Qo=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),H=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},es=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Xe=e=>e!==null&&typeof e=="object";function ts(e){return Array.isArray(e.items)?e.items.filter(Xe):null}function Qn(e){let t=H(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?Qo.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function ns({ecommerce:e,items:t}){let n=s=>({promotion_id:H(s.promotion_id),name:H(s.promotion_name),creative:H(s.creative_name),position:H(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var er=({ecommerce:e,items:t})=>H(e.item_list_id)??H(e.item_list_name)??H(t[0]?.item_list_id)??H(t[0]?.item_list_name),me=(e,t)=>t.products?.length?{event:e,properties:t}:null,rs=new Set(["product","products","item","items"]);function os({ecommerce:e}){let t=H(e.item_id),n=H(e.content_type)?.toLowerCase();return!t||n&&!rs.has(n)?null:{event:"Product Shared",properties:{share_via:H(e.method),products:[{product_id:t}]}}}function ss(e){let t=o=>me("Product List Viewed",{list_id:er(o),products:o.products}),n=o=>{let s=H(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>me("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>me("Product Clicked",{list_id:er(o),products:o.products.slice(0,1)}),add_to_cart:o=>me("Product Added",{cart_id:H(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>me("Product Removed",{cart_id:H(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:H(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:H(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>me("Checkout Started",{value:o.value,currency:o.currency,coupon:H(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:H(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:H(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>me("Product Added to Wishlist",{products:o.products}),share:os,login:o=>({event:"Signed In",properties:{method:Qn(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:Qn(o.ecommerce.method)}})}}var is=e=>e.event;function as(e,t){if(!Xe(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Xe(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=H(t(e));return n?{name:n,entry:e,ecommerce:Xe(e.ecommerce)?e.ecommerce:e}:null}function Ft(e){return Array.isArray(e)?`[${e.map(Ft).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ft(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function tr(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=ss({...Zo,...t.steps}),o=t.map??{},s=t.eventName??is,i=t.productId??Ye,u=new Set(["purchase","refund",...t.ignore??[]]),c=t.dedupeMs??Xo,l=new Map,f=!0;function p(S,g,y){if(c<=0)return!1;let O=`${S}|${y??""}|${Ft(g)}`,N=Date.now();for(let[U,G]of l)N-G>c&&l.delete(U);return l.has(O)?!0:(l.set(O,N),!1)}let m=null,A=new Set;function w(S,g){if(S!=="Product Viewed")return!1;let y=typeof location>"u"?"":location.pathname;y!==m&&(m=y,A.clear());let O=g.products?.[0]?.product_id;return O?A.has(O)?!0:(A.add(O),!1):!1}function k({event:S,properties:g={}},y){if(!S||p(S,g,y)||w(S,g))return;let O=y?{context:{currency:y}}:void 0;if(S==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(O);return}e.track(S,g,O)}function b(S){let g=t.transform?t.transform(S):S,y=as(g,s);if(!y||u.has(y.name))return;let O=Object.hasOwn(o,y.name),N=O?o[y.name]:r[y.name];if(typeof N!="function")return;let U=ts(y.ecommerce),G=U??[],q={...y,items:G,itemsListed:U!==null,products:Ht(G,i),currency:Tt(y.ecommerce.currency),value:es(y.ecommerce.value)};q.promotions=ns(q);let ee=O?N(g,{...q,toProducts:J=>Ht(J,i)}):N(q);for(let J of[ee].flat())J&&k(J,q.currency)}function x(S){if(f)try{b(S)}catch(g){try{t.onError?.(g,S)}catch{}}}for(let S of n.slice())x(S);let h=n.push;function E(...S){let g=h.apply(this,S);for(let y of S)x(y);return g}return n.push=E,()=>{f=!1,n.push===E&&(n.push=h)}}var cs="hp_debug",us=256;function ls(){try{return new URLSearchParams(location.search).get(cs)}catch{return null}}function nr(e,t){if(typeof location>"u")return!1;try{let n=ls();if(n!==null){let o=n.trim();o===""||o.length>us?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&In(r)===e)}catch{return!1}}var Ie=class extends Error{},ds={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function qt(e,t){let n=ds[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof Ie)throw i;return r(i)}}}function rr(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=qt(t,n))}return e}var Le=Symbol("hp.identityOption");var fs=4320*60*60,ps=100,ms=1e3,hs=2e3,or=500,Ze=e=>(e?.unref?.(),e);function gs(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=pe.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function ys(e,t,n=P("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${Vt(e)}; Path=/; Max-Age=${fs}; SameSite=Lax`+o+r}catch{}}function ws(e){let t=Oe(j(e));return pe.some(n=>t[n]!==null)?t:null}function sr(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=P("consent"),release:s,announce:i}=e,u=e.discard??(()=>{}),c="pending",l=null,f=null,p=null,m=null,A=!1,w=null,k=[],b=R=>{c=R,e.onStatus?.(R)};function x(){try{return be(t.read())}catch{return null}}function h(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let E=()=>typeof window<"u"&&typeof document<"u",S=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function g(){m&&clearInterval(m),m=null}function y(){A||m||l===null||S()||E()&&document.visibilityState==="hidden"||(m=Ze(setInterval(()=>q(x()),hs)))}let O=()=>c==="pending"||c==="unknown",N=e.store??null,U=()=>{let R=k.splice(0);N?.write([]);for(let K of R)s(K)},G=()=>{let R=k.splice(0);N?.write([]);for(let K of R)u(K)};function q(R){let K=be(R);if(!K||K.analytics===null)return;let Z=l===null,Y=Z?ws(o):l;if(!Z&&Ut(Y,K))return;h(),l=K,y(),ys(K,r,o);let ve=!Ut(Y,K);if(K.analytics){b("granted"),U(),ve&&i({action:gs(K,Y),state:K,previous:Y,withdrawal:!1});return}G(),Y?.analytics===!0&&i({action:"withdrawn",state:K,previous:Y,withdrawal:!0}),b("denied")}function ee(){p=null,c==="pending"&&(b("unknown"),f&&clearInterval(f),f=Ze(setInterval(()=>q(x()),ms)))}function J(R){if(O()){if(N){N.write(k);return}R?.type!=="visibilitychange"&&!R?.persisted&&G()}}let Se=R=>{document.visibilityState==="hidden"?(g(),J(R)):y()},je=R=>{g(),J(R)},ce=R=>{R?.persisted&&l!==null&&q(x()),y()};return{get status(){return c},get state(){return l?{...l}:null},stamp(){return l?{...l,source:t.name??null,basis:t.basis??We.visitor}:null},admits(){return c==="granted"},hold(R){return!O()||k.length>=or?(u(R),!1):(k.push(R),!0)},onHidden:J,start(){A=!1;try{w=t.subscribe?.(R=>q(R))??null}catch(R){e.debug&&console.warn("[hp] consent adapter subscribe failed",R)}E()&&(window.addEventListener("pagehide",je),window.addEventListener("pageshow",ce),document.addEventListener("visibilitychange",Se)),N&&k.length===0&&k.push(...N.read().slice(-or)),q(x()),!l&&(f=Ze(setInterval(()=>q(x()),ps)),p=Ze(setTimeout(ee,n)))},stop(){A=!0,h(),g(),typeof w=="function"&&w(),E()&&(window.removeEventListener("pagehide",je),window.removeEventListener("pageshow",ce),document.removeEventListener("visibilitychange",Se))}}}var Ss=["recommendation","search_rank","banner","offer","layout","copy","price","other"],Qe=e=>typeof e=="string"&&e!=="";function ir(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>Qe(t?.slot)&&Qe(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...Qe(r)&&{arm:r},...Ss.includes(o)&&{kind:o}}))}function ar({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>Qe(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(u=>u.slot));n=[...r().filter(u=>!i.has(u.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function _s(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function et(e,t,n=1e4){return _s(`${t}\0${e}`)%n}function Kt(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function Gt(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=Kt(e),s=et(t,e.salt),i=c=>Math.round(c*1e4),u=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:u==="holdout",bucket:s,group:u}}function cr(e,t){return typeof e!="string"||e===""||t==null||t===""?null:et(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var bs="hp_preview",Is=256;function ur(e,t=null){if(typeof location>"u")return j(e);let n=null;try{n=new URLSearchParams(location.search).get(bs)}catch{n=null}if(n===null)return j(e);let r=n.trim();return r===""||r.length>Is?(se(e,"",0,t),null):(se(e,r,null,t),r)}var ks=40,xs=128,As=5,vs=60,dr=e=>typeof e=="string"&&e!==""&&e.length<=xs&&!e.includes(","),lr=e=>Array.isArray(e)?e.filter(dr).slice(0,ks):[],Es=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,As):[],Cs=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>dr(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,vs).map(([t,n])=>`${t}:${Math.floor(n)}`);function zt(e){let t={},n={viewed:lr(e?.recentProducts),basket:lr(e?.basketProducts),q:Es(e?.recentSearches),impressed:Cs(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var Ps=1800*1e3;function fr(e,t=Date.now()){try{localStorage.setItem(P("recommendationContext"),JSON.stringify({context:e,until:t+Ps}))}catch{}}function pr(){try{localStorage.removeItem(P("recommendationContext"))}catch{}}var Os="hp_sample",mr=1e4;function hr(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:et(e,Os,mr)<Math.round(t*mr)}function ke(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Ls=2,Ts=12;function Te(e,t=Ls){return e.split("/").slice(0,t).join("/")}function Wt(e,t){if(typeof t!="string"||!t.trim())return null;let n=Te(ke(t));return n?(e.unshift(n),e.length=Math.min(e.length,Ts),n):null}var he=()=>P("sessionSignals"),xe=null,Jt=()=>xe??he();function gr(){try{return xe?localStorage:sessionStorage}catch{return}}function yr(e,t){let n=t==null?null:String(t),r=e?$(he(),n,e):null;if(r===xe)return;let o=xe===null?Ns():null;if(xe=r,!!xe)try{let s=Jt(),i=$n(he(),n);for(let u of Object.keys(localStorage))u.startsWith(i)&&u!==s&&localStorage.removeItem(u);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(he()))}catch{}}function Ns(){try{let e=sessionStorage.getItem(he());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length||t.campaign)?t:null}catch{return null}}function tt(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},campaign:null,startedAt:0}}function Yt(){let e=gr();if(!e)return tt();try{let t=e.getItem(Jt());return t?{...tt(),...JSON.parse(t)}:{...tt(),startedAt:Date.now()}}catch{return{...tt(),startedAt:Date.now()}}}function Ne(e){let t=gr();if(t)try{t.setItem(Jt(),JSON.stringify(e))}catch{}}function Re(){return Yt()}function wr(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(he());for(let n of Object.keys(t))n.startsWith(`${he()}:`)&&t.removeItem(n)}catch{}}var Xt=20,Sr=200,Rs=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Ms=new Set(["Product Viewed","Product Added"]),_r=50;function nt(e,t){let n=Wt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function Ds(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>_r){let o={};for(let s of r.sort((i,u)=>n[u]-n[i]).slice(0,_r))o[s]=n[s];e.listViewsByCategory=o}}var br=e=>[...new Set(e.map(t=>t?.product_id).filter(t=>typeof t=="string"&&t))].slice(0,Xt);function Ir(e,t,n){let r=Yt();r.startedAt||(r.startedAt=Date.now());let o=n!==void 0&&JSON.stringify(n??null)!==JSON.stringify(r.campaign??null);o&&(r.campaign=n??null);let s=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":r.productViews+=1,nt(r,r.browsingCategory);break;case"Product List Viewed":{let c=t?.list_id,l=t?.category;if(!(typeof c=="string"&&c.includes("/")&&!c.startsWith("cdp-")))break;let p=typeof l=="string"&&Te(ke(l))||null,m=p?Te(ke(c)):"";if(!m){r.browsingCategory=null,r.browsingListing=null;break}r.browsingListing={key:m,category:p},nt(r,m),r.browsingCategory=m,Ds(r,p),r.listViews+=1}break;case"Product List Filtered":{let c=t?.change,l=typeof t?.list_id=="string"?t.list_id:"",f=typeof c?.value=="string"?c.value:"",p=r.browsingListing;if(f&&c?.action!=="removed"&&p&&Te(ke(l))===p.key){let m=nt(r,`${l}/${f}`);m&&(r.browsingCategory=m)}break}case"Product Added":{r.cartAdds+=1,nt(r,r.browsingCategory);for(let c of s){let l=c.product_id;typeof l!="string"||!l||(r.basketProducts=[l,...r.basketProducts.filter(f=>f!==l)].slice(0,Xt))}break}case"Product Removed":{for(let c of s){let l=c.product_id;typeof l=="string"&&l&&(r.basketProducts=r.basketProducts.filter(f=>f!==l))}break}case"Products Searched":{r.searches+=1;let c=t?.query;if(typeof c=="string"&&c.trim()){let l=c.trim().toLowerCase().slice(0,64);r.recentSearches=[l,...r.recentSearches.filter(f=>f!==l)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Viewed":return s.length>0&&(r.basketProducts=br(s)),Ne(r),r;case"Cart Updated":{Array.isArray(t?.products)&&(r.basketProducts=br(s));let c=t?.value;return r.basketValue=typeof c=="number"&&Number.isFinite(c)&&c>=0?c:null,Ne(r),r}default:return o&&Ne(r),r}let i=Rs.has(e);if(i)for(let c of s)typeof c.product_id=="string"&&c.product_id&&delete r.impressions[c.product_id];else{for(let l of s){let f=l.product_id;typeof f!="string"||!f||(r.impressions[f]=(r.impressions[f]??0)+1)}let c=Object.keys(r.impressions);if(c.length>Sr){let l={};for(let f of c.sort((p,m)=>r.impressions[m]-r.impressions[p]).slice(0,Sr))l[f]=r.impressions[f];r.impressions=l}}let u=new Set;for(let c of s){let l=c.product_id;if(i&&typeof l=="string"&&l&&(r.recentProducts=[l,...r.recentProducts.filter(f=>f!==l)].slice(0,Xt)),Ms.has(e)&&typeof c.category=="string"&&c.category){let f=ke(c.category);f&&!u.has(f)&&(u.add(f),Wt(r.recentCategories,f))}}return Ne(r),r}var rt=1800*1e3;function kr({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=oe}){let s=null,i=0,u=()=>{s!==null&&n()&&se(e,s,rt/1e3,t)};return{get(){let c=r(),l=j(e);return l?s=l:(s===null||c-i>=rt)&&(s=o()),i=c,u(),s},persist:u,forget(){se(e,"",0,t),s=null}}}var W=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),xr=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Ar=Object.freeze({enabled:!1}),Qt=Object.freeze({enabled:!0,queryParamAllowlist:Object.freeze([])});function vr(e,t){let n=e?.track;return W(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function Us(e,t){return`${ie(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var Vs="https://hp.thgingenuity.com";function ie(e){return e==null||e===""?Vs:Cr(e)}function Er(e,t){return e!=null&&e!==""?ie(e):t?.startsWith("https://")?t:ie(void 0)}function Cr(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function $s(e){if(!W(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var Zt=e=>typeof e=="number"&&e>=0&&e<=1,Bs=/^[0-9a-f]{64}$/;function js(e){return W(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&Bs.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function Hs(e){if(!W(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>W(n)&&Zt(n.share)&&(n.ramp==null||Zt(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...xr(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var Fs=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function qs(e){return W(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&Fs.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function Ks(e){let t=Array.isArray(e?.forms)?e.forms.filter(W):[];return t.length===0?null:{forms:t,capture:W(e.capture)?e.capture:null,...Number.isInteger(e.overlay_gap_minutes)?{overlay_gap_minutes:e.overlay_gap_minutes}:{}}}function Gs(e){let t=W(e)?e.hp:null;return W(t)&&typeof t.enabled=="boolean"}function en(e){let t=W(e)?e.hp:null;if(!W(t)||t.enabled!==!0)return Ar;let n=Ks(t.onsite);return{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:$s(t.consent?.purposes),queryParamAllowlist:xr(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:qs(t.anonymousId),apiHost:Cr(t.apiHost),holdouts:Hs(t.holdouts),sampleRate:Zt(t.sampleRate)?t.sampleRate:1,debug:js(t.debug),...n&&{onsite:n},plan:W(e.plan)&&W(e.plan.track)?{track:e.plan.track}:null}}var zs=3e3;async function Pr(e,t,n=globalThis.fetch,r=zs){try{let o=await n(Us(e,t),{credentials:"omit",headers:{accept:"application/json"},signal:AbortSignal.timeout?.(r)});if(o.status>=400&&o.status<500&&o.status!==408&&o.status!==429)return Ar;if(!o.ok)return null;let s=await o.json();return Gs(s)?en(s):null}catch{return null}}var ot=e=>$(P("settings"),e);function Or(e){try{let t=localStorage.getItem(ot(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function Lr(e,t){try{t?.enabled===!0?localStorage.setItem(ot(e),JSON.stringify(t)):localStorage.removeItem(ot(e))}catch{}}function tn(e){try{localStorage.removeItem(ot(e))}catch{}}var Ws={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:fe.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},st=()=>Date.now(),Tr=3e4,cn=55*1024;function Js(e,t=st()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ae=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),nn=()=>typeof window<"u"&&typeof document<"u";function Ys(){try{return!nn()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var I,rn,on,it,sn,an,Nr,Me,De,Ue,Rr,at,Mr,ct,ut=class{constructor(t){_n(this,I);this.o={...Ws,...t},this.queue=[],this.timer=null,this.storage=Ys(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,this.failing=!1,this.answered=!1,nn()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),L(this,I,ct).call(this))}markFailing(){this.answered||(this.failing=!0)}replayPersisted(){return this.replayAllowed=!0,L(this,I,ct).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=L(this,I,Ue).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),L(this,I,on).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():L(this,I,rn).call(this)}flush(t={}){if(L(this,I,on).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&nn()&&typeof navigator<"u"&&navigator.sendBeacon)return L(this,I,Nr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=L(this,I,an).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=L(this,I,at).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){L(this,I,De).call(this,s);continue}await L(this,I,Me).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&L(this,I,rn).call(this)}),this.inflight}};I=new WeakSet,rn=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},on=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},it=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},sn=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},an=function(t,n,r){let o=ae(L(this,I,it).call(this,[])),s=[],i=[],u=o;for(let c of t){let l=ae(JSON.stringify(c))+1;i.length&&(i.length>=n||u+l>r)&&(s.push(i),i=[],u=o),i.push(c),u+=l}return i.length&&s.push(i),s},Nr=function(){let t=this.queue;this.queue=[];let n=L(this,I,sn).call(this);for(let r of L(this,I,an).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=L(this,I,it).call(this,r);if(ae(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s){let i=this.failing?L(this,I,at).call(this,r):null;i&&this.sending.add(i);continue}}L(this,I,Me).call(this,r,0,L(this,I,at).call(this,r))}},Me=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=L(this,I,it).call(this,t),i=0;try{let u=await fetch(L(this,I,sn).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ae(s)<=this.o.beaconSafeBytes});if(u.ok)return this.failing=!1,this.answered=!0,L(this,I,De).call(this,r),L(this,I,ct).call(this),!0;let c=u.status===408||u.status===429||u.status>=500;if(c&&(i=Js(u.headers?.get?.("retry-after"))),!c)return L(this,I,De).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${u.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${u.status}`)}catch(u){if(this.failing=!0,n>=this.o.maxRetries){r&&this.sending.delete(r);let l=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${l}: ${t.length} events`,u),!1}let c=Math.max(Math.min(1e3*2**n,Tr)*(.5+Math.random()),Math.min(i,Tr));return o===this.epoch&&await new Promise(l=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),l()},p=setTimeout(f,c);this.wakers.add(f)}),o!==this.epoch?(L(this,I,De).call(this,r),!1):L(this,I,Me).call(this,t,n+1,r,o)}},De=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),L(this,I,Mr).call(this,t))},Ue=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},Rr=function(t,n){let r=i=>ae(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,u)=>i+r(u),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},at=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:st(),id:`${st()}-${Math.random().toString(36).slice(2)}`,batch:t};return ae(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:L(this,I,Rr).call(this,L(this,I,Ue).call(this),n)?n.id:null}catch{return null}},Mr=function(t){if(!(!t||!this.storage))try{let n=L(this,I,Ue).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},ct=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=L(this,I,Ue).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&st()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await L(this,I,Me).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var un="3.30.0",ln="@thg-agentic/hyper-personalisation-web";var Xs=100,Zs=["source","medium","campaign","content","term"];function Ur(e){if(!e||typeof e!="object")return null;let t={};for(let n of Zs){let r=e[n==="campaign"?"name":n];typeof r=="string"&&r&&(t[n]=r.slice(0,Xs))}return Object.keys(t).length?t:null}var Vr=e=>$(P("visitCampaign"),e==null?null:String(e)),Ae=new Map;function $r(e){if(Ae.has(e))return Ae.get(e);try{let t=JSON.parse(localStorage.getItem(e));return t&&typeof t=="object"?t:null}catch{return null}}function Dr(e,t){try{t?localStorage.setItem(e,JSON.stringify(t)):localStorage.removeItem(e),Ae.delete(e)}catch{t?Ae.set(e,t):Ae.delete(e)}}function Br(e,t,n){return typeof e?.tags=="object"&&e.tags!==null&&Number.isFinite(e.at)&&n-e.at<rt&&!(t&&e.sid&&e.sid!==t)?e:null}function lt(e,{sessionId:t=null,now:n=Date.now()}={}){return Br($r(Vr(e)),t,n)?.tags??null}function jr(e,t,{sessionId:n=null,keepSession:r=!1,now:o=Date.now()}={}){let s=Vr(e),i=$r(s),u=Br(i,n,o),c=u?.tags??t??null;return c?Dr(s,{tags:c,at:o,sid:(r?n:null)??u?.sid??null}):i&&Dr(s,null),c}function dn(){Ae.clear();try{let e=`${P("visitCampaign")}:`;for(let t of Object.keys(localStorage))t.startsWith(e)&&localStorage.removeItem(t)}catch{}}var Qs=new Set(["audiences","decisions","recommendations"]);var ei=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),ti=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),ni=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access");function ri(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var oi="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function si(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function ft(e){if(typeof e!="string")return null;let t=si(e.trim());return t===oi?null:t}var Hr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),ii=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function ai(e){if(typeof e!="string"||!ii.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function ci(e,t){return t===null?null:e==="sha256"?ft(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():ai(t)?t:void 0:typeof t===e?t:void 0}function ui(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(Hr,o)?Hr[o]:null,u=i?ci(i,s):void 0;u===void 0?r.push(o):n[o]=u}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var Fr=!1,qr=!1;function li(){qr||(qr=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function di(e){!e||Fr||(Fr=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function fi(e){try{return ae(JSON.stringify(e))}catch{return 0}}function dt(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function pi(e,t){if(e==null||String(e)===t)return;let n=[["localStorage","retry",(r,o)=>[...Array.isArray(r)?r:[],...Array.isArray(o)?o:[]]],["sessionStorage","held",(r,o)=>o?{...o,items:[...r.items??[],...o.items??[]]}:r]];for(let[r,o,s]of n)try{let i=globalThis[r],u=$(P(o),e),c=i?.getItem(u);if(!c)continue;let l=$(P(o),t),f=i.getItem(l);i.setItem(l,JSON.stringify(s(JSON.parse(c),f?JSON.parse(f):null))),i.removeItem(u)}catch{}}function Kr(e){let t=ie(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(e?.propertyId!==null&&!e?.propertyId)throw new Error("createAnalytics: propertyId is required (null: the ingest stamps the key\u2019s)");let n={libraryName:ln,libraryVersion:un,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Ke(n.storageNames),Ge();let r=!!n.consent;r||li();let o=null;n.getConsent=()=>o?o.stamp():qn();let s=()=>!r||o?.status==="granted";pi(n.propertyId,n.writeKey);let i=r&&n.holdAcrossPages?Bn($(P("held"),n.writeKey)):null,u=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&di(n.debug);let c=jn(n,{carried:u.anonymousId,mayStore:s,orOwn:!0}),l=kr({name:P("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>F(M(f,null))??l.get();let p=ur(P("preview"),n.consentCookieDomain??null),m=()=>F(M(f,null))??j(P("session")),A=Ur(typeof location>"u"?null:Ot(location.search)),w=(a=null)=>{p||jr(n.propertyId,a,{sessionId:m(),keepSession:s()})},k=(a,d)=>n.debug&&console.warn("[hp]",a,d??""),b=n.transport??new ut({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:$(P("retry"),n.writeKey),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:k}),x=$(P("previousPage"),n.propertyId),h=null,E=()=>{if(h)return h;try{return sessionStorage.getItem(x)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",a=>{a.persisted&&(h=null)});let S=a=>{if(h=a||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(x,a)}catch{}},g=ar({key:$(P("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=g.current);let y=F(M(n.getUserId,null)),O=null,N=null,U=y?Ce(n.identityToken):null,G=null,q=null,ee=null,J=new Set,Se=new Set;function je(a){if(a.type==="page"&&(ee=null),a.type==="track"&&a.event==="Product Viewed"){let _=a.properties?.products?.[0]?.product_id;ee=typeof _=="string"&&_?_:ee}if(a.type!=="track"||a.event!=="Cart Updated")return;let d=a.properties?.value;q=typeof d=="number"&&Number.isFinite(d)&&d>=0?d:null;for(let _ of J)try{_()}catch(C){console.warn("[hp] a basket listener failed",C)}}function ce(a,d,_=!1){je(a),w();try{return R(a,d,_)}catch(C){if(C instanceof Ie)throw C;return console.warn("[hp] the event was not sent",C),null}}function R(a,d,_){let C=G;G=null;let V=a.type==="track"?a.event:a.type;if(!_&&!vr(n.plan,V))return null;let T={messageId:C?.messageId??oe(),timestamp:C?.timestamp??new Date().toISOString(),anonymousId:F(M(n.getAnonymousId,null)),userId:y??null,...a,context:Mn(n,dt(d))};if(T.properties&&(T.properties=Ct(T.properties)),typeof T.properties?.href=="string"&&(T.properties.href=Lt(T.properties.href,n)),!_&&!hr(T.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",T),null;if(n.beforeSend){let te;try{te=n.beforeSend(T)}catch(uo){return console.warn("[hp] beforeSend failed; the event was not sent",uo),null}if(!te)return null;let{type:z,event:wn,messageId:ao,timestamp:co}=T;T={...te,type:z,messageId:ao,timestamp:co,...wn?{event:wn}:{}}}if(n.validate){let te=n.validate(T,{producer:"web"});if(!te.valid){let z=`[hp] invalid ${T.event??T.type}:
1
+ (()=>{var In=e=>{throw TypeError(e)};var Ao=(e,t,n)=>t.has(e)||In("Cannot "+n);var vn=(e,t,n)=>t.has(e)?In("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);var L=(e,t,n)=>(Ao(e,t,"access private method"),n);var Ee=[];for(let e=2;Ee.length<64;e++)Ee.every(t=>e%t!==0)&&Ee.push(e);var En=e=>(e-Math.floor(e))*2**32>>>0,ko=Ee.slice(0,8).map(e=>En(Math.sqrt(e))),xo=Ee.map(e=>En(Math.cbrt(e))),Q=(e,t)=>e>>>t|e<<32-t;function Cn(e){let t=new TextEncoder().encode(String(e)),n=new Uint32Array((t.length+8>>6)*16+16);t.forEach((s,i)=>{n[i>>2]|=s<<24-i%4*8}),n[t.length>>2]|=128<<24-t.length%4*8,n[n.length-2]=Math.floor(t.length/2**29),n[n.length-1]=t.length*8;let r=Uint32Array.from(ko),o=new Uint32Array(64);for(let s=0;s<n.length;s+=16){for(let w=0;w<64;w++){if(w<16){o[w]=n[s+w];continue}let k=o[w-15],b=o[w-2],x=Q(k,7)^Q(k,18)^k>>>3,h=Q(b,17)^Q(b,19)^b>>>10;o[w]=o[w-16]+x+o[w-7]+h}let[i,c,u,d,f,p,m,I]=r;for(let w=0;w<64;w++){let k=Q(f,6)^Q(f,11)^Q(f,25),b=I+k+(f&p^~f&m)+xo[w]+o[w]|0,h=(Q(i,2)^Q(i,13)^Q(i,22))+(i&c^i&u^c&u)|0;[I,m,p,f,d,u,c,i]=[m,p,f,d+b|0,u,c,i,b+h|0]}[i,c,u,d,f,p,m,I].forEach((w,k)=>{r[k]+=w})}return Array.from(r,s=>s.toString(16).padStart(8,"0")).join("")}var vt=(e,t)=>e<<t|e>>>32-t;function On(e){let t=new Uint32Array((e.length+8>>6)*16+16);e.forEach((s,i)=>{t[i>>2]|=s<<24-i%4*8}),t[e.length>>2]|=128<<24-e.length%4*8,t[t.length-2]=Math.floor(e.length/2**29),t[t.length-1]=e.length*8;let n=Uint32Array.of(1732584193,4023233417,2562383102,271733878,3285377520),r=new Uint32Array(80);for(let s=0;s<t.length;s+=16){for(let p=0;p<80;p++)r[p]=p<16?t[s+p]:vt(r[p-3]^r[p-8]^r[p-14]^r[p-16],1);let[i,c,u,d,f]=n;for(let p=0;p<80;p++){let m,I;p<20?(m=c&u|~c&d,I=1518500249):p<40?(m=c^u^d,I=1859775393):p<60?(m=c&u|c&d|u&d,I=2400959708):(m=c^u^d,I=3395469782);let w=vt(i,5)+m+f+I+r[p]|0;[f,d,u,c,i]=[d,u,vt(c,30),i,w]}[i,c,u,d,f].forEach((p,m)=>{n[m]+=p})}let o=new Uint8Array(20);return n.forEach((s,i)=>{o[i*4]=s>>>24,o[i*4+1]=s>>>16,o[i*4+2]=s>>>8,o[i*4+3]=s}),o}var Io="e28e8ada-5b76-4209-bba9-79b823a0af75",vo=e=>Array.from(e,t=>t.toString(16).padStart(2,"0")).join("");function Pn(e,t){let n=Uint8Array.from(e.replace(/-/g,"").match(/../g),c=>Number.parseInt(c,16)),r=new TextEncoder().encode(t),o=new Uint8Array(16+r.length);o.set(n),o.set(r,16);let s=On(o).slice(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=vo(s);return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20)}`}var ue=(e,t)=>typeof e=="string"&&e!==""&&e.length<=t?e:null;function He(e,t){return ue(e,64)??ue(t,256)}function Ln({sessionId:e,slot:t,arm:n}={}){let r=ue(e,256);return!r||!ue(t,256)||!ue(n,256)?null:Pn(Io,`${r}:${t}:${n}`)}var Eo="4b1f2c7e-9a3d-4e58-b6c1-2d7f0a9e8c53";function Tn({sessionId:e,surface:t}={}){let n=ue(e,256);return!n||!ue(t,64)?null:Pn(Eo,`${n}:${t}`)}var Co=Array.from({length:11},(e,t)=>t/10);function Oo(e,t){if(!e.isIntersecting)return!1;let{intersectionRect:n,boundingClientRect:r,rootBounds:o}=e;if(!n||!r)return!0;let s=n.width*n.height,i=r.width*r.height,c=o?Math.min(i,o.width*o.height):i;return c>0&&s/c>=t}function re(e){let{selector:t,onViewable:n,visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=e,i=new Map,c=new WeakSet,u=new Set,d=h=>{i.has(h)||i.set(h,setTimeout(()=>{i.delete(h),n(h)&&(p?.unobserve(h),u.delete(h))},o))},f=h=>{clearTimeout(i.get(h)),i.delete(h)},p=typeof IntersectionObserver>"u"?null:new IntersectionObserver(h=>{for(let O of h){let _=O.target;if(!Oo(O,r)){u.delete(_),f(_);continue}u.add(_),m()&&d(_)}},{threshold:Co}),m=()=>typeof document>"u"||document.visibilityState!=="hidden",I=()=>{if(m())for(let h of u)d(h);else for(let h of u)f(h)};document.addEventListener("visibilitychange",I);let w=()=>{for(let h of s.querySelectorAll(t))c.has(h)||(c.add(h),p?.observe(h))},k=typeof MutationObserver>"u"?null:new MutationObserver(()=>w()),b=()=>{w(),k?.observe(s===document?document.body:s,{childList:!0,subtree:!0})},x=s===document&&!document.body;return x?document.addEventListener("DOMContentLoaded",b,{once:!0}):b(),()=>{x&&document.removeEventListener("DOMContentLoaded",b),document.removeEventListener("visibilitychange",I),p?.disconnect(),k?.disconnect();for(let h of i.values())clearTimeout(h);i.clear(),u.clear()}}function Et(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-exposure]",visibleRatio:r=.5,dwellMs:o=1e3,root:s=document}=t;return re({selector:n,root:s,visibleRatio:r,dwellMs:o,onViewable(i){let c=i.dataset?.hpExposure?.trim();return c&&e.surfaceViewed({surface:c}),!0}})}var Nn=e=>{try{return new URL(e,document.baseURI).toString()}catch{return e}};function Ct(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-list]",tileSelector:r="[data-hp-product]",visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,c=new Set,u=w=>w.closest?.(n)??null,d=w=>{let k=w.dataset.hpList?.trim();return k?{list_id:k,category:w.dataset.hpListCategory?.trim()||null}:null},f=w=>Array.from(w.querySelectorAll(r)).filter(k=>u(k)===w),p=(w,k)=>{try{let b=JSON.parse(w.dataset.hpProduct??"");return!b||typeof b!="object"||!b.product_id?null:{...b,position:b.position??k+1,...b.url?{url:Nn(b.url)}:{},...b.image_url?{image_url:Nn(b.image_url)}:{}}}catch{return null}},m=re({selector:`${n} ${r}`,root:i,visibleRatio:o,dwellMs:s,onViewable(w){let k=u(w);if(!k||k.dataset.hpListView==="manual")return!0;let b=d(k);if(!b||c.has(b.list_id))return!0;let x=new Set,h=f(k).map(p).filter(O=>!O||x.has(O.product_id)?!1:(x.add(O.product_id),!0));return h.length===0||(c.add(b.list_id),e.productListViewed({...b,products:h})),!0}}),I=w=>{let b=w.target?.closest?.("a[href]")?.closest(r);if(!b)return;let x=u(b),h=p(b,x?f(x).indexOf(b):0);h&&e.productClicked({list_id:x?d(x)?.list_id??null:null,products:[h]})};return document.addEventListener("click",I,!0),()=>{document.removeEventListener("click",I,!0),m()}}function D(e,...t){let n=e.dataset??{};for(let r of t){let o=n[r];if(typeof o=="string"&&o.trim()!=="")return o.trim()}return null}function Fe(e,...t){let n=D(e,...t);if(n===null)return null;let r=Number(n);return Number.isFinite(r)?Math.trunc(r):null}function Po(e,t){let n=D(e,"hpPromotion");return n?{promotion_id:n,name:D(e,"hpPromotionName"),creative:D(e,"hpPromotionCreative"),position:D(e,"hpPromotionSlot")??String(t+1)}:null}function Ot(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-promotion]",resolve:r=Po,visibleRatio:o=.5,dwellMs:s=1e3,root:i=document}=t,c=new Set,u=p=>{let m=Array.from(i.querySelectorAll(n)),I=m.indexOf(p);try{return r(p,I<0?m.length:I)}catch{return null}},d=re({selector:n,root:i,visibleRatio:o,dwellMs:s,onViewable(p){let m=u(p);return!m||c.has(m.promotion_id)?!1:(c.add(m.promotion_id),e.promotionViewed(m),!0)}}),f=p=>{let m=p.target;if(!m||typeof m.closest!="function")return;let I=m.closest(n),w=m.closest("a[href]");if(!I||!w||!I.contains(w)&&!w.contains(I))return;let k=u(I);k&&e.promotionClicked({...k,href:w.getAttribute("href")})};return document.addEventListener("click",f,!0),()=>{document.removeEventListener("click",f,!0),d()}}function Lo(e){let t=D(e,"hpRecoRequest"),n=D(e,"hpRecoPlacement"),r=D(e,"hpRecoStrategy");if(!t||!n||!r)return null;let o=D(e,"hpRecoHoldout");return{recommendation_request_id:t,placement:n,strategy:r,recipe:D(e,"hpRecoRecipe"),algorithm_version:D(e,"hpRecoAlgorithmVersion"),experiment:D(e,"hpRecoExperiment"),variant:D(e,"hpRecoVariant"),holdout:o===null?null:o==="true",assignment_bucket:Fe(e,"hpRecoBucket"),assignment_unit_kind:D(e,"hpRecoUnitKind"),candidate_set_fingerprint:D(e,"hpRecoFingerprint"),candidate_set_size:Fe(e,"hpRecoCandidates"),ranked_by:D(e,"hpRecoRankedBy"),served_at:D(e,"hpRecoServedAt")}}function To(e,t){let n=D(e,"hpRecoProduct");if(!n)return null;let r=D(e,"hpRecoPrice");return{product_id:n,sku:D(e,"hpRecoSku"),name:D(e,"hpRecoName"),brand:D(e,"hpRecoBrand"),price:r===null||Number.isNaN(Number(r))?null:Number(r),position:Fe(e,"hpRecoPosition")??t+1}}function Pt(e,t={}){if(typeof window>"u"||typeof document>"u")return()=>{};let{selector:n="[data-hp-reco-request]",tileSelector:r="[data-hp-reco-product]",resolveRail:o=Lo,resolveTile:s=To,visibleRatio:i=.5,dwellMs:c=1e3,root:u=document}=t,d=new Set,f=new Map,p=new Map,m=(h,...O)=>{try{return h(...O)}catch{return null}},I=h=>typeof h.closest=="function"?h.closest(n):null,w=h=>Array.from(h.querySelectorAll(r)),k=(h,O)=>{if(p.delete(O.recommendation_request_id),d.has(O.recommendation_request_id))return;let _=w(h).map((y,P)=>m(s,y,P)).filter(y=>y?.product_id);if(_.length===0)return;d.add(O.recommendation_request_id);let g=[...f.get(O.recommendation_request_id)?.values()??[]].sort((y,P)=>y.position-P.position);e.recommendationsViewed({...O,products:_,viewable:g})},b=re({selector:`${n} ${r}`,root:u,visibleRatio:i,dwellMs:c,onViewable(h){let O=I(h);if(!O)return!0;let _=m(o,O);if(!_)return!0;let g=_.recommendation_request_id,y=m(s,h,w(O).indexOf(h));if(y?.product_id){f.has(g)||f.set(g,new Map);let P=f.get(g);P.has(y.position)||P.set(y.position,{position:y.position,product_id:y.product_id,viewable_at:new Date().toISOString()})}return!d.has(g)&&!p.has(g)&&p.set(g,setTimeout(()=>k(O,_),0)),!0}}),x=h=>{let O=h.target;if(!O||typeof O.closest!="function")return;let _=O.closest(r);if(!_)return;let g=O.closest("[data-hp-reco-interaction]"),y=O.closest("a[href]"),P=y&&(_.contains(y)||y.contains(_));if(!(g&&_.contains(g))&&!P)return;let N=I(_);if(!N)return;let V=m(o,N);if(!V)return;let G=m(s,_,w(N).indexOf(_));if(!G?.product_id)return;let F=V.recommendation_request_id;d.has(F)||(clearTimeout(p.get(F)),k(N,V)),e.productClicked({recommendation_request_id:V.recommendation_request_id,interaction:D(g??_,"hpRecoInteraction")??"navigate",products:[G]})};return document.addEventListener("click",x,!0),()=>{document.removeEventListener("click",x,!0);for(let h of p.values())clearTimeout(h);p.clear(),b()}}var _e=new Set(["home","list","product","search","basket","checkout","order_confirmation","login","register","account","info","blog","other"]),No=new Set(["products"]),Rn=e=>e==null;function Lt(e,t=new WeakSet){if(e instanceof Date)return e.toJSON();if(e===null||typeof e!="object"||t.has(e))return e;t.add(e);let n=Array.isArray(e)?e.map(r=>Lt(r,t)):Object.fromEntries(Object.entries(e).filter(([,r])=>!Rn(r)).map(([r,o])=>[r,Lt(o,t)]));return t.delete(e),n}function Tt(e){if(!e)return e;let t=Lt(e);for(let n of No)n in e&&Rn(e[n])&&(t[n]=e[n]);return t}function Mn(){try{let e=performance.getEntriesByType("navigation")[0];return e?["navigate","reload","back_forward","prerender"].includes(e.type)?e.type:"navigate":null}catch{return null}}var Ro=new Set(["","unknown","undefined","null","none","nil","nan","anonymous","guest","0","-1"]);function H(e){if(e==null)return null;let t=String(e).trim();return Ro.has(t.toLowerCase())?null:t}var Ce=e=>typeof e=="string"&&e!==""?e:null;function oe(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}var Dn="1.22";function j(e){if(typeof document>"u")return null;try{let t=document.cookie.split(";").map(n=>n.trim()).find(n=>n.startsWith(`${e}=`));return t&&decodeURIComponent(t.slice(e.length+1))||null}catch{return null}}var Mo={gclid:"gclid",fbclid:"fbclid",ttclid:"ttclid"},Do=/[a-z0-9._%+-]+@[a-z0-9-]+(\.[a-z0-9-]+)*\.[a-z]{2,}/i,Uo=/\d(?:[ -]?\d){12,}/,Vo=new Set(["gclid","fbclid","ttclid","msclkid"]);function Vn(e,t=""){if(typeof e!="string"||e==="")return!1;let n=[e];try{let o=decodeURIComponent(e.replace(/\+/g," "));o!==e&&n.push(o)}catch{}let r=!Vo.has(String(t).toLowerCase());return n.some(o=>Do.test(o)||r&&Uo.test(o))}function Rt(e){if(!e)return null;let t=new URLSearchParams(e),n={},r={utm_source:"source",utm_medium:"medium",utm_campaign:"name",utm_term:"term",utm_content:"content"};for(let[o,s]of[...Object.entries(r),...Object.entries(Mo)]){let i=t.get(o);i&&!Vn(i,o)&&(n[s]=i)}return Object.keys(n).length?n:null}var $o=["email","e-mail","password","pass","pwd","token","auth","code","uid","customer_id","postcode","zip","phone","applyCode"],Bo=["email","password","passwd","pwd","token","secret","auth","session","phone","postcode","zip","address","birth","card","cvv","iban","ssn","customerid","userid"],jo=["tel","uid","dob"],qo=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","ttclid","msclkid"],Ho=new Set($o.map(e=>e.toLowerCase()));function Fo(e){let t=String(e).toLowerCase();if(Ho.has(t))return!0;let n=t.replace(/[-_.]/g,"");return Bo.some(o=>n.includes(o))?!0:String(e).replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).some(o=>jo.includes(o))}function Nt(e){return(e??[]).map(t=>{try{return new RegExp(`^${t}$`,"i")}catch{return{test:n=>n.toLowerCase()===String(t).toLowerCase()}}})}function $n(e,t={}){if(!e)return null;try{let n=new URLSearchParams(e),r=t.queryParamAllowlist?Nt([...t.queryParamAllowlist,...qo]):null,o=Nt(t.queryParamBlocklist),s=Nt(t.sensitiveParamAllowlist);for(let c of new Set(n.keys()))(Fo(c)&&!s.some(d=>d.test(c))||n.getAll(c).some(d=>Vn(d,c))||(r?!r.some(d=>d.test(c)):o.some(d=>d.test(c))))&&n.delete(c);let i=n.toString();return i?`?${i}`:""}catch{return""}}function Bn(e,t,n={}){if(!e)return null;try{let r=new URL(e);return t&&r.origin===t?r.origin+r.pathname+($n(r.search,n)??""):r.origin+r.pathname}catch{return null}}function Mt(e,t={}){if(typeof e!="string"||typeof location>"u")return null;try{let n=new URL(e,location.href);return n.protocol!=="https:"&&n.protocol!=="http:"?null:Bn(n.href,location.origin,t)}catch{return null}}function Dt(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{3}$/.test(t)?t:null}function Un(e){if(typeof e!="string")return null;let t=e.trim().toUpperCase();return/^[A-Z]{2}$/.test(t)?t:null}function Ut(e){if(typeof e!="string")return null;let t=e.trim().replace(/_/g,"-");if(!/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$/.test(t))return null;try{return Intl.getCanonicalLocales(t)[0]}catch{return null}}function M(e,t){if(typeof e=="function")try{let n=e();if(n!=null)return n}catch{}return t}function Ko(e){return{...e.propertyId==null?{}:{property_id:String(e.propertyId)},channel:e.channel??null,market:e.market??null,environment:e.environment??null}}function Go(e){let t=typeof window<"u"?window.location:null,n=t?$n(t.search,e):null;return{url:t?t.origin+t.pathname+(n??""):e.pageUrl??null,path:t?t.pathname:e.pagePath??null,search:n??null,referrer:typeof document<"u"?Bn(document.referrer,t?.origin,e):null,title:typeof document<"u"&&document.title||null,type:e.pageType??null}}var Oe;function zo(){if(Oe!==void 0)return Oe;try{Oe=globalThis.Temporal?.Now?.timeZoneId?.()||Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{Oe=null}return Oe}function jn(e,t={}){let n=typeof window<"u"?window.location:null,r={library:{name:e.libraryName,version:e.libraryVersion},spec:{version:Dn},source:Ko(e),session_id:M(e.getSessionId,null),identity_trust:H(M(e.getAnonymousId,null))?"device":"none",page:Go(e),campaign:n?Rt(n.search):null,device:{user_agent:typeof navigator<"u"?navigator.userAgent:null,type:null,viewport_width:typeof window<"u"?window.innerWidth:null,viewport_height:typeof window<"u"?window.innerHeight:null},currency:Dt(M(e.getCurrency,e.currency)),locale:Ut(M(e.getLocale,e.locale)),timezone:zo(),country:Un(e.country),ship_to_country:Un(M(e.getShipToCountry,e.shipToCountry)),ip:null,bot:null,consent:e.getConsent?.()??null,experiments:M(e.getExperiments,null),audiences:M(e.getAudiences,null),decisions:M(e.getDecisions,null),recommendations:M(e.getRecommendations,null),extensions:M(e.getExtensions,null)};return qn(r,t)}function qn(e,t){if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&!Array.isArray(o)&&e[r]&&typeof e[r]=="object"&&!Array.isArray(e[r])?n[r]=qn(e[r],o):o!==void 0&&(n[r]=o);return n}var fe=Object.freeze({consent:"thg_hp_consent",retry:"thg_hp_retry",sessionSignals:"thg_hp_session_signals",identified:"thg_hp_identified",previousPage:"thg_hp_prev_page",decisions:"thg_hp_decisions",settings:"thg_hp_settings",held:"thg_hp_held",carried:"thg_hp_carried",recommendationContext:"thg_hp_recommendation_context",anonymousId:"thg_hp_anonymous_id",session:"thg_hp_session",preview:"thg_hp_preview",debug:"thg_hp_debug",onsite:"thg_hp_onsite",visitCampaign:"thg_hp_visit_campaign",answers:"thg_hp_answers"}),Jo={retry:"cdp.retry",sessionSignals:"cdp_session_signals",identified:"cdp_identified",previousPage:"cdp_prev_page_message_id"},Ke={...fe},Hn=!1;function Ge(e){let t={...fe};for(let[n,r]of Object.entries(e??{})){if(!(n in fe))throw new Error(`storageNames: unknown kind "${n}"`);if(typeof r!="string"||!/^[\w.-]+$/.test(r))throw new Error(`storageNames.${n} must be a non-empty cookie-safe name`);t[n]=r}Ke=t}function C(e){return Ke[e]}var Wo="_",Fn=e=>e==null||e===""?Wo:String(e);function U(e,t,n){let r=`${e}:${Fn(t)}`;return n==null||n===""?r:`${r}:${n}`}function Kn(e,t){return`${e}:${Fn(t)}:`}function ze(e){let t=`${Ke[e]}:`;try{for(let n of Object.keys(localStorage))n.startsWith(t)&&localStorage.removeItem(n)}catch{}}function Je(){if(!Hn){Hn=!0;for(let e of[()=>localStorage,()=>sessionStorage]){let t;try{if(t=e(),!t)continue;for(let n of Object.keys(t))for(let[r,o]of Object.entries(Jo)){if(n!==o&&!n.startsWith(`${o}:`))continue;let s=Ke[r]+n.slice(o.length);t.getItem(s)===null&&t.setItem(s,t.getItem(n)),t.removeItem(n)}}catch{}}}}var $t=1800*1e3,We=()=>{try{return typeof sessionStorage>"u"?null:sessionStorage}catch{return null}},Vt=()=>{try{return typeof localStorage>"u"?null:localStorage}catch{return null}};function Gn(e,t=()=>Date.now()){return{read(){try{let n=We()?.getItem(e),r=n?JSON.parse(n):null;return!r||t()-r.savedAt>$t?(r&&We()?.removeItem(e),{items:[],anonymousId:null}):{items:Array.isArray(r.items)?r.items:[],anonymousId:typeof r.anonymousId=="string"?r.anonymousId:null}}catch{return{items:[],anonymousId:null}}},write(n,r=null){try{n.length===0?We()?.removeItem(e):We()?.setItem(e,JSON.stringify({savedAt:t(),items:n,anonymousId:r}))}catch{}}}}var Xo=400*24*60*60;function se(e,t,n,r){if(typeof document>"u")return!1;try{let o=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",s=r?`; Domain=${r}`:"",i=n===null?"":`; Max-Age=${n}`;return document.cookie=`${e}=${encodeURIComponent(t)}; Path=/${i}; SameSite=Lax`+s+o,!0}catch{return!1}}function Yo({name:e,domain:t=null,legacyKey:n,read:r,mint:o,mayStore:s,carried:i=null}){let c=null;try{c=Vt()?.getItem(n)||null}catch{c=null}let u=r(e)??c??i,d=!1,f=()=>{if(!(d||u===null||!s())&&(d=se(e,u,Xo,t),!(!d||c===null)))try{Vt()?.removeItem(n),c=null}catch{}};return{get(){return u??(u=o()),f(),u},peek:()=>u,persist:f,forget(){se(e,"",0,t),u=null,d=!1;try{Vt()?.removeItem(n)}catch{}c=null}}}function zn(e,{carried:t=null,mayStore:n,orOwn:r=!1}){let o=e.anonymousIdSource,s=()=>Yo({name:C("anonymousId"),domain:e.consentCookieDomain??null,legacyKey:U(C("anonymousId"),e.propertyId),read:j,mint:oe,mayStore:n,carried:t});if(o?.source==="hp_cookie"){let u=s();return e.getAnonymousId=()=>u.get(),u}if(o?.source==="site_cookie"&&o.cookie){let u=o.cookie;e.getAnonymousId=()=>j(u)}if(!r)return null;let i=e.getAnonymousId,c=s();return e.getAnonymousId=()=>H(M(i,null))??c.get(),c}var Zo=200;function Jn(e,t,n=()=>Date.now()){let r=()=>U(C("carried"),e),o=!1;function s(){try{let i=JSON.parse(sessionStorage.getItem(r())??"null");return!i||!(n()-i.savedAt<=$t)?[]:Array.isArray(i.calls)?i.calls:[]}catch{return[]}}return{take(){let i=s();try{sessionStorage.removeItem(r())}catch{}return i},save(i){try{return o||!t()?!1:(sessionStorage.setItem(r(),JSON.stringify({savedAt:n(),calls:[...s(),...i].slice(-Zo)})),!0)}catch{return!1}},close(){o=!0}}}var Oa=fe.consent,Xe=Object.freeze({visitor:"visitor",host:"host"}),Xn=()=>({basis:Xe.host}),Qo="hp-consent",pe=["analytics","marketing","personalisation","ad_user_data","ad_personalization"],Yn={analytics:"a",marketing:"m",personalisation:"p",ad_user_data:"aud",ad_personalization:"adp"},ne=()=>typeof window<"u",Zn=()=>ne()&&typeof window.cookieStore?.addEventListener=="function",es=e=>e===!0?!0:e===!1?!1:null;function be(e){if(!e||typeof e!="object")return null;let t={};for(let n of pe)t[n]=es(e[n]);return t}function Bt(e,t){return!e||!t?e===t:pe.every(n=>e[n]===t[n])}function jt(e){if(!e)return"";let t=[];for(let n of pe){let r=e[n];(r===!0||r===!1)&&t.push(`${Yn[n]}=${r?1:0}`)}return t.join("&")}function qt(e){return{[Qo]:jt(be(e))}}function Pe(e){let t=be({});if(e==null)return t;let n=String(e).trim();if(n.length>=2&&n.startsWith('"')&&n.endsWith('"')&&(n=n.slice(1,-1)),n.includes("%"))try{n=decodeURIComponent(n.replace(/\+/g," "))}catch{return t}let r=Object.fromEntries(Object.entries(Yn).map(([s,i])=>[i,s])),o=new Set;for(let s of n.split("&")){let i=s.indexOf("=");if(i<=0)continue;let c=r[s.slice(0,i).trim()],u={1:!0,0:!1}[s.slice(i+1).trim()]??null;!c||u===null||o.has(c)||(t[c]===null?t[c]=u:t[c]!==u&&(t[c]=null,o.add(c)))}return t}function Ht(e,t){if(!t)return e;let n=r=>{if(!r)return r;let o={...r};for(let s of pe)s!=="analytics"&&t[s]!==!0&&(o[s]=null);return o};return{name:e.name,basis:e.basis,read:()=>n(e.read()),subscribe:r=>e.subscribe(o=>r(n(o))),get observesChanges(){return e.observesChanges}}}function Ft(e,t={}){return{...e,ad_user_data:t.ad_user_data??e.marketing,ad_personalization:t.ad_personalization??e.marketing}}function Ye(e,t){let n=!0;return{notify:()=>{if(n)try{let o=e();o&&t(o)}catch{}},stop:()=>n=!1}}var ts={analytics:["analytics","measure_content_performance","audience_measurement"],marketing:["marketing","targeting","advertising","select_personalized_ads","create_ads_profile"],personalisation:["personalisation","personalization","select_personalized_content","create_content_profile"]};function ns(e,t){if(!t?.length)return null;let n=!1;for(let[r,o]of Object.entries(e)){let s=String(o?.id??r).toLowerCase();if(t.some(c=>{let u=String(c).toLowerCase();return s===u||s.startsWith(`${u}-`)})&&(n=!0,o?.enabled===!0))return!0}return n?!1:null}function Qn(e={}){let t={...ts,...e.purposes};function n(){let r=ne()?window.Didomi:void 0;if(!r?.getCurrentUserStatus||r.shouldUserStatusBeCollected?.()!==!1||r.isUserStatusPartial?.()===!0)return null;let o=r.getCurrentUserStatus()?.purposes;if(!o||typeof o!="object")return null;let s=i=>ns(o,t[i]);return Ft({analytics:s("analytics"),marketing:s("marketing"),personalisation:s("personalisation")},{ad_user_data:s("ad_user_data"),ad_personalization:s("ad_personalization")})}return{name:"didomi",read:n,observesChanges:!0,subscribe(r){if(!ne())return()=>{};let o=Ye(n,r),s={event:"consent.changed",listener:o.notify};return window.didomiEventListeners=window.didomiEventListeners||[],window.didomiEventListeners.push(s),window.didomiOnReady=window.didomiOnReady||[],window.didomiOnReady.push(i=>{o.notify(),(i??window.Didomi)?.on?.("consent.changed",o.notify)}),window.Didomi?.on?.("consent.changed",o.notify),o.stop}}}function Wn(e){let t={};if(!e)return t;for(let n of String(e).split("&")){let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(r+1).replace(/\+/g," ");try{o=decodeURIComponent(o)}catch{}t[n.slice(0,r)]=o}return t}function er(e={}){let t={analytics:"C0002",personalisation:"C0003",marketing:"C0004",...e.groups},n=e.impliedConsent===!0;function r(){let i=Wn(j("OptanonConsent"));if(i.groups){let d={};for(let f of i.groups.split(",")){let[p,m]=f.split(":");p?.trim()&&(d[p.trim()]=m==="1"?!0:m==="0"?!1:null)}return f=>d[f]??!1}let c=ne()?window.OnetrustActiveGroups:void 0;if(typeof c!="string"||!c.length)return null;let u=new Set(c.split(",").map(d=>d.trim()).filter(Boolean));return d=>u.has(d)}function o(){if(j("OptanonAlertBoxClosed"))return!0;try{if(ne()&&window.OneTrust?.IsAlertBoxClosed?.()===!0)return!0}catch{}return n&&ne()&&(!!window.OneTrust||typeof window.OnetrustActiveGroups=="string")}function s(){if(!o())return null;let i=r();if(!i)return null;let c=p=>t[p]?i(t[p]):null,u=Ft({analytics:c("analytics"),marketing:c("marketing"),personalisation:c("personalisation")},{ad_user_data:c("ad_user_data"),ad_personalization:c("ad_personalization")}),d=Wn(j("OptanonConsent"));return(typeof navigator<"u"&&navigator.globalPrivacyControl===!0||d.isGpcEnabled==="1")&&(u.marketing=!1,u.ad_user_data=!1,u.ad_personalization=!1),u}return{name:"onetrust",read:s,observesChanges:!0,subscribe(i){if(!ne())return()=>{};let c=Ye(s,i),u=!1,d=()=>{u||!window.OneTrust?.OnConsentChanged||(u=!0,window.OneTrust.OnConsentChanged(c.notify))};window.addEventListener("OneTrustGroupsUpdated",c.notify);let f=window.OptanonWrapper;return window.OptanonWrapper=function(...m){try{typeof f=="function"&&f.apply(this,m)}finally{d(),c.notify()}},d(),()=>{c.stop(),window.removeEventListener("OneTrustGroupsUpdated",c.notify)}}}}function rs(e){let t=String(e).split(",").map(n=>n.trim()).filter(Boolean);return t.length?new Set(t):null}function tr(e){let{name:t,categories:n,parse:r=rs,refusedValue:o,source:s="native",changeEvent:i="thg_hp_consent_change"}=e??{};if(typeof t!="string"||t==="")throw new Error("cookieConsent: `name` (the cookie your banner writes) is required");if(!n||typeof n.analytics!="string")throw new Error("cookieConsent: `categories.analytics` (the category id that grants analytics) is required");function c(){let u=j(t);if(u==null)return null;let d;if(o!==void 0&&u===o)d=new Set;else try{d=r(u)}catch{d=null}if(!(d instanceof Set))return null;let f=p=>n[p]?d.has(n[p]):null;return Ft({analytics:f("analytics"),marketing:f("marketing"),personalisation:f("personalisation")},{ad_user_data:f("ad_user_data"),ad_personalization:f("ad_personalization")})}return{name:s,read:c,get observesChanges(){return Zn()},subscribe(u){if(!ne())return()=>{};let d=Ye(c,u),f=p=>{[...p.changed??[],...p.deleted??[]].some(I=>I?.name===t)&&d.notify()};return window.addEventListener(i,d.notify),window.cookieStore?.addEventListener?.("change",f),()=>{d.stop(),window.removeEventListener(i,d.notify),window.cookieStore?.removeEventListener?.("change",f)}}}}function nr(e={}){let t=e.name??C("consent"),n=()=>{let r=j(t);if(r==null)return null;let o=Pe(r);return o.analytics==null?null:o};return{name:"forwarded",read:n,get observesChanges(){return Zn()},subscribe(r){if(!ne())return()=>{};let o=Ye(n,r),s=i=>{[...i.changed??[],...i.deleted??[]].some(u=>u?.name===t)&&o.notify()};return window.cookieStore?.addEventListener?.("change",s),()=>{o.stop(),window.cookieStore?.removeEventListener?.("change",s)}}}}function rr(e){let t=be(e);return{name:"static",basis:Xe.host,read:()=>t?{...t}:null,observesChanges:!0,subscribe:()=>()=>{}}}function or(e){if(e==null)return null;let t=String(e).split("/").map(n=>n.trim()).filter(Boolean).join("/");return t===""?null:t}function os(e){let t=e.item_category;if(t!=null&&String(t).includes("/"))return or(t);let n=[t,e.item_category2,e.item_category3,e.item_category4,e.item_category5].map(r=>r==null?"":String(r).trim()).filter(Boolean);return or(n.join("/"))}var ss=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t};function is(...e){for(let t of e){if(typeof t=="number"&&Number.isFinite(t))return String(t);if(typeof t=="string"&&t.trim()!=="")return t.trim()}return null}var Ze=e=>is(e.item_group_id,e.item_id);function as(e,t=Ze){if(!e)return null;let n=c=>c==null||c===""||Number.isNaN(Number(c))?null:Number(c),r=c=>{let u=n(c);return u==null?null:Math.round(u*1e6)/1e6},o=c=>{let u=r(c);return u!=null&&u>=0?u:null},s=c=>{let u=n(c);return Number.isInteger(u)&&u>=0?u:null},i=ss;return{product_id:i(t(e)),sku:i(e.item_id),name:i(e.item_name),brand:i(e.item_brand),variant:i(e.item_variant)??i(e.variant),category:os(e),price:r(e.price),discount:o(e.discount),quantity:s(e.quantity),coupon:i(e.coupon),position:s(e.index)!=null?s(e.index)+1:null,url:i(e.url)??i(e.item_url)??null,image_url:i(e.image_url)??i(e.image_link)??null,displayed_sku:i(e.displayed_sku)??i(e.displayed_variant_sku)}}function Kt(e,t=Ze){return(e??[]).map(n=>as(n,t)).filter(n=>n?.product_id)}var cs=1e3,us={shipping:2,payment:3},ls=new Set(["password","google","apple","facebook","magic_link","sso","passkey","other"]),q=e=>{if(e==null||typeof e=="object")return null;let t=String(e).trim();return t===""?null:t},ds=e=>{if(e==null||e===""||typeof e=="object")return null;let t=Number(e);return Number.isFinite(t)&&t>=0?t:null},Qe=e=>e!==null&&typeof e=="object";function fs(e){return Array.isArray(e.items)?e.items.filter(Qe):null}function sr(e){let t=q(e)?.toLowerCase().replace(/[\s-]+/g,"_");return t?ls.has(t)?t:t==="email"||t==="email_password"?"password":"other":null}function ps({ecommerce:e,items:t}){let n=s=>({promotion_id:q(s.promotion_id),name:q(s.promotion_name),creative:q(s.creative_name),position:q(s.creative_slot)}),r=new Set,o=[];for(let s of[n(e),...t.map(n)])!s.promotion_id||r.has(s.promotion_id)||(r.add(s.promotion_id),o.push(s));return o}var ir=({ecommerce:e,items:t})=>q(e.item_list_id)??q(e.item_list_name)??q(t[0]?.item_list_id)??q(t[0]?.item_list_name),me=(e,t)=>t.products?.length?{event:e,properties:t}:null,ms=new Set(["product","products","item","items"]);function hs({ecommerce:e}){let t=q(e.item_id),n=q(e.content_type)?.toLowerCase();return!t||n&&!ms.has(n)?null:{event:"Product Shared",properties:{share_via:q(e.method),products:[{product_id:t}]}}}function gs(e){let t=o=>me("Product List Viewed",{list_id:ir(o),products:o.products}),n=o=>{let s=q(o.ecommerce.search_term);return s?{event:"Products Searched",properties:{query:s,...o.products.length?{products:o.products}:{}}}:null},r=o=>s=>s.promotions.map(i=>({event:o,properties:i}));return{view_item:o=>me("Product Viewed",{currency:o.currency,value:o.value,products:o.products.slice(0,1)}),view_item_list:t,view_search_results:o=>n(o)??t(o),search:n,select_item:o=>me("Product Clicked",{list_id:ir(o),products:o.products.slice(0,1)}),add_to_cart:o=>me("Product Added",{cart_id:q(o.ecommerce.cart_id),products:o.products}),remove_from_cart:o=>me("Product Removed",{cart_id:q(o.ecommerce.cart_id),products:o.products}),view_cart:o=>({event:"Cart Viewed",properties:{cart_id:q(o.ecommerce.cart_id),value:o.value,currency:o.currency,coupon:q(o.ecommerce.coupon),...o.itemsListed?{products:o.products}:{}}}),begin_checkout:o=>me("Checkout Started",{value:o.value,currency:o.currency,coupon:q(o.ecommerce.coupon),products:o.products}),add_shipping_info:o=>({event:"Checkout Step Completed",properties:{step:e.shipping,step_name:"shipping",shipping_method:q(o.ecommerce.shipping_tier)}}),add_payment_info:o=>({event:"Payment Info Entered",properties:{step:e.payment,step_name:"payment",payment_method:q(o.ecommerce.payment_type)}}),view_promotion:r("Promotion Viewed"),select_promotion:r("Promotion Clicked"),add_to_wishlist:o=>me("Product Added to Wishlist",{products:o.products}),share:hs,login:o=>({event:"Signed In",properties:{method:sr(o.ecommerce.method)}}),sign_up:o=>({event:"Signed Up",properties:{method:sr(o.ecommerce.method)}})}}var ys=e=>e.event;function ws(e,t){if(!Qe(e))return null;if(typeof e.length=="number"&&e[0]==="event"&&typeof e[1]=="string"){let r=Qe(e[2])?e[2]:{};return{name:e[1],entry:r,ecommerce:r}}let n=q(t(e));return n?{name:n,entry:e,ecommerce:Qe(e.ecommerce)?e.ecommerce:e}:null}function Gt(e){return Array.isArray(e)?`[${e.map(Gt).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Gt(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function ar(e,t={}){if(!e||typeof e.track!="function")throw new Error("connectDataLayer: analytics must have a track(event, properties, options) method");let n=t.dataLayer??(typeof window<"u"?window.dataLayer=window.dataLayer||[]:null);if(!Array.isArray(n))return()=>{};let r=gs({...us,...t.steps}),o=t.map??{},s=t.eventName??ys,i=t.productId??Ze,c=new Set(["purchase","refund",...t.ignore??[]]),u=t.dedupeMs??cs,d=new Map,f=!0;function p(_,g,y){if(u<=0)return!1;let P=`${_}|${y??""}|${Gt(g)}`,N=Date.now();for(let[V,G]of d)N-G>u&&d.delete(V);return d.has(P)?!0:(d.set(P,N),!1)}let m=null,I=new Set;function w(_,g){if(_!=="Product Viewed")return!1;let y=typeof location>"u"?"":location.pathname;y!==m&&(m=y,I.clear());let P=g.products?.[0]?.product_id;return P?I.has(P)?!0:(I.add(P),!1):!1}function k({event:_,properties:g={}},y){if(!_||p(_,g,y)||w(_,g))return;let P=y?{context:{currency:y}}:void 0;if(_==="Signed Out"&&typeof e.signedOut=="function"){e.signedOut(P);return}e.track(_,g,P)}function b(_){let g=t.transform?t.transform(_):_,y=ws(g,s);if(!y||c.has(y.name))return;let P=Object.hasOwn(o,y.name),N=P?o[y.name]:r[y.name];if(typeof N!="function")return;let V=fs(y.ecommerce),G=V??[],F={...y,items:G,itemsListed:V!==null,products:Kt(G,i),currency:Dt(y.ecommerce.currency),value:ds(y.ecommerce.value)};F.promotions=ps(F);let ee=P?N(g,{...F,toProducts:W=>Kt(W,i)}):N(F);for(let W of[ee].flat())W&&k(W,F.currency)}function x(_){if(f)try{b(_)}catch(g){try{t.onError?.(g,_)}catch{}}}for(let _ of n.slice())x(_);let h=n.push;function O(..._){let g=h.apply(this,_);for(let y of _)x(y);return g}return n.push=O,()=>{f=!1,n.push===O&&(n.push=h)}}var Ss="hp_debug",_s=256;function bs(){try{return new URLSearchParams(location.search).get(Ss)}catch{return null}}function cr(e,t){if(typeof location>"u")return!1;try{let n=bs();if(n!==null){let o=n.trim();o===""||o.length>_s?sessionStorage.removeItem(t):sessionStorage.setItem(t,o)}let r=sessionStorage.getItem(t);return!!(e&&r&&Cn(r)===e)}catch{return!1}}var Ae=class extends Error{},As={inHoldout:()=>!0,personalisationGroup:()=>"excluded",servingHeaders:()=>({}),recommendationContext:()=>({}),flush:()=>Promise.resolve(),reset:()=>{}};function zt(e,t){let n=As[e]??(()=>null),r=o=>(console.warn(`[hp] ${String(e)} failed; nothing was sent`,o),n());return function(...s){try{let i=t.apply(this,s);return typeof i?.then=="function"?Promise.resolve(i).catch(r):i}catch(i){if(i instanceof Ae)throw i;return r(i)}}}function ur(e){for(let t of Reflect.ownKeys(e)){let{value:n}=Object.getOwnPropertyDescriptor(e,t)??{};typeof n=="function"&&(e[t]=zt(t,n))}return e}var Le=Symbol("hp.identityOption");var ks=2160*60*60*1e3,xs=50,Is=20,vs=128,Jt=e=>U(C("answers"),e),tt=e=>typeof e=="string"&&e!==""&&e.length<=vs;function lr(e,t){try{let n=JSON.parse(localStorage.getItem(Jt(e)));return Array.isArray(n)?n.filter(r=>tt(r?.q)&&Array.isArray(r.v)&&r.v.every(tt)&&t-r.at<ks):[]}catch{return[]}}function dr(e,t=Date.now()){return Object.fromEntries(lr(e,t).map(n=>[n.q,n.v]))}function fr(e,t){let n=Array.isArray(t)?t:[];return(Array.isArray(e)?e:[]).flatMap(r=>{let o=n.find(c=>c?.key===r?.question);if(!o||o.type!=="one"&&o.type!=="many")return[];let s=new Set((o.options??[]).map(c=>c?.value)),i=(Array.isArray(r.values)?r.values:[]).filter(c=>s.has(c));return i.length?[{question:r.question,values:i}]:[]})}function pr(e,t,n=Date.now()){let r=(Array.isArray(t)?t:[]).filter(i=>tt(i?.question)&&Array.isArray(i.values));if(!r.length)return;let o=new Set(r.map(i=>i.question)),s=[...lr(e,n).filter(i=>!o.has(i.q)),...r.map(i=>({q:i.question,v:i.values.filter(tt).slice(0,Is),at:n}))].slice(-xs);try{et.delete(e),localStorage.setItem(Jt(e),JSON.stringify(s))}catch{}}var et=new Set;function mr(e){if(e===void 0)ze("answers"),et.clear();else if(!et.has(e)){try{localStorage.removeItem(Jt(e))}catch{}et.add(e)}}var Es=4320*60*60,Cs=100,Os=1e3,Ps=2e3,hr=500,nt=e=>(e?.unref?.(),e);function Ls(e,t){if(t?.analytics===!0&&e.analytics===!1)return"withdrawn";let n=pe.map(r=>e[r]).filter(r=>r!==null);return n.length&&n.every(Boolean)?"accept_all":n.length&&n.every(r=>!r)?"reject_all":"custom"}function Ts(e,t,n=C("consent")){if(!(typeof document>"u"))try{let r=typeof location<"u"&&location.protocol==="https:"?"; Secure":"",o=t?`; Domain=${t}`:"";document.cookie=`${n}=${jt(e)}; Path=/; Max-Age=${Es}; SameSite=Lax`+o+r}catch{}}function Ns(e){let t=Pe(j(e));return pe.some(n=>t[n]!==null)?t:null}function gr(e){let{adapter:t,timeoutMs:n=5e3,cookieDomain:r=null,cookieName:o=C("consent"),release:s,announce:i}=e,c=e.discard??(()=>{}),u="pending",d=null,f=null,p=null,m=null,I=!1,w=null,k=[],b=R=>{u=R,e.onStatus?.(R)};function x(){try{return be(t.read())}catch{return null}}function h(){f&&clearInterval(f),p&&clearTimeout(p),f=null,p=null}let O=()=>typeof window<"u"&&typeof document<"u",_=()=>{try{return typeof t.subscribe=="function"&&t.observesChanges===!0}catch{return!1}};function g(){m&&clearInterval(m),m=null}function y(){I||m||d===null||_()||O()&&document.visibilityState==="hidden"||(m=nt(setInterval(()=>F(x()),Ps)))}let P=()=>u==="pending"||u==="unknown",N=e.store??null,V=()=>{let R=k.splice(0);N?.write([]);for(let K of R)s(K)},G=()=>{let R=k.splice(0);N?.write([]);for(let K of R)c(K)};function F(R){let K=be(R);if(!K||K.analytics===null)return;let X=d===null,Y=X?Ns(o):d;if(!X&&Bt(Y,K))return;h(),d=K,y(),Ts(K,r,o);let ve=!Bt(Y,K);if(K.analytics){b("granted"),V(),ve&&i({action:Ls(K,Y),state:K,previous:Y,withdrawal:!1});return}G(),Y?.analytics===!0&&i({action:"withdrawn",state:K,previous:Y,withdrawal:!0}),b("denied")}function ee(){p=null,u==="pending"&&(b("unknown"),f&&clearInterval(f),f=nt(setInterval(()=>F(x()),Os)))}function W(R){if(P()){if(N){N.write(k);return}R?.type!=="visibilitychange"&&!R?.persisted&&G()}}let Se=R=>{document.visibilityState==="hidden"?(g(),W(R)):y()},je=R=>{g(),W(R)},ce=R=>{R?.persisted&&d!==null&&F(x()),y()};return{get status(){return u},get state(){return d?{...d}:null},stamp(){return d?{...d,source:t.name??null,basis:t.basis??Xe.visitor}:null},admits(){return u==="granted"},hold(R){return!P()||k.length>=hr?(c(R),!1):(k.push(R),!0)},onHidden:W,start(){I=!1;try{w=t.subscribe?.(R=>F(R))??null}catch(R){e.debug&&console.warn("[hp] consent adapter subscribe failed",R)}O()&&(window.addEventListener("pagehide",je),window.addEventListener("pageshow",ce),document.addEventListener("visibilitychange",Se)),N&&k.length===0&&k.push(...N.read().slice(-hr)),F(x()),!d&&(f=nt(setInterval(()=>F(x()),Cs)),p=nt(setTimeout(ee,n)))},stop(){I=!0,h(),g(),typeof w=="function"&&w(),O()&&(window.removeEventListener("pagehide",je),window.removeEventListener("pageshow",ce),document.removeEventListener("visibilitychange",Se))}}}var Rs=["recommendation","search_rank","banner","offer","layout","copy","price","other"],rt=e=>typeof e=="string"&&e!=="";function yr(e){return(Array.isArray(e?.decisions)?e.decisions:[]).filter(t=>rt(t?.slot)&&rt(t.decision_id)&&t.holdout!==!0).map(({decision_id:t,slot:n,arm:r,kind:o})=>({decision_id:t,slot:n,...rt(r)&&{arm:r},...Rs.includes(o)&&{kind:o}}))}function wr({key:e,mayStore:t}){let n,r=()=>{if(n)return n;try{let s=JSON.parse(sessionStorage.getItem(e));n=Array.isArray(s)?s.filter(i=>rt(i?.slot)):[]}catch{n=[]}return n},o=()=>{try{n?.length&&t()&&sessionStorage.setItem(e,JSON.stringify(n))}catch{}};return{persist:o,current:()=>r().length?n.map(s=>({...s})):null,remember(s){if(!s.length)return;let i=new Set(s.map(c=>c.slot));n=[...r().filter(c=>!i.has(c.slot)),...s],o()},forget(){n=[];try{sessionStorage.removeItem(e)}catch{}}}}function Ms(e){let t=2166136261,n=String(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return t^=t>>>16,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t>>>0}function ot(e,t,n=1e4){return Ms(`${t}\0${e}`)%n}function Wt(e){let t=o=>Math.min(Math.max(Number(o)||0,0),1),n=t(e.share),r=1-n;return{holdout_share:n,personalised_share:e.ramp==null?r:Math.min(t(e.ramp),r)}}function Xt(e,t){if(!e||typeof e.salt!="string")return{holdout:!1,bucket:null,group:"personalised"};let n=e.ramp!=null;if(t==null||t==="")return{holdout:!1,bucket:null,group:n?"excluded":"personalised"};let{holdout_share:r,personalised_share:o}=Wt(e),s=ot(t,e.salt),i=u=>Math.round(u*1e4),c=r>0&&s<i(r)?"holdout":!n||s<i(r+o)?"personalised":"excluded";return{holdout:c==="holdout",bucket:s,group:c}}function Sr(e,t){return typeof e!="string"||e===""||t==null||t===""?null:ot(t,`bandit-vs-default:${e}`)<1e4/2?"default":"bandit"}var Ds="hp_preview",Us=256;function _r(e,t=null){if(typeof location>"u")return j(e);let n=null;try{n=new URLSearchParams(location.search).get(Ds)}catch{n=null}if(n===null)return j(e);let r=n.trim();return r===""||r.length>Us?(se(e,"",0,t),null):(se(e,r,null,t),r)}var Vs=40,$s=128,Bs=5,js=60,Ar=e=>typeof e=="string"&&e!==""&&e.length<=$s&&!e.includes(","),br=e=>Array.isArray(e)?e.filter(Ar).slice(0,Vs):[],qs=e=>Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.replaceAll(","," ").trim()).filter(t=>t!=="").slice(0,Bs):[],Hs=e=>Object.entries(e&&typeof e=="object"?e:{}).filter(([t,n])=>Ar(t)&&Number.isFinite(n)&&n>=1).sort(([,t],[,n])=>n-t).slice(0,js).map(([t,n])=>`${t}:${Math.floor(n)}`);function Yt(e){let t={},n={viewed:br(e?.recentProducts),basket:br(e?.basketProducts),q:qs(e?.recentSearches),impressed:Hs(e?.impressions)};for(let[r,o]of Object.entries(n))o.length>0&&(t[r]=o.join(","));return t}var Fs=1800*1e3;function kr(e,t=Date.now()){try{localStorage.setItem(C("recommendationContext"),JSON.stringify({context:e,until:t+Fs}))}catch{}}function xr(){try{localStorage.removeItem(C("recommendationContext"))}catch{}}var Ks="hp_sample",Ir=1e4;function vr(e,t){return!(typeof t=="number"&&t<1)||e==null||e===""?!0:ot(e,Ks,Ir)<Math.round(t*Ir)}function ke(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var Gs=2,zs=12;function Te(e,t=Gs){return e.split("/").slice(0,t).join("/")}function Zt(e,t){if(typeof t!="string"||!t.trim())return null;let n=Te(ke(t));return n?(e.unshift(n),e.length=Math.min(e.length,zs),n):null}var he=()=>C("sessionSignals"),xe=null,Qt=()=>xe??he();function Er(){try{return xe?localStorage:sessionStorage}catch{return}}function Cr(e,t){let n=t==null?null:String(t),r=e?U(he(),n,e):null;if(r===xe)return;let o=xe===null?Js():null;if(xe=r,!!xe)try{let s=Qt(),i=Kn(he(),n);for(let c of Object.keys(localStorage))c.startsWith(i)&&c!==s&&localStorage.removeItem(c);o&&!localStorage.getItem(s)&&(localStorage.setItem(s,JSON.stringify(o)),sessionStorage.removeItem(he()))}catch{}}function Js(){try{let e=sessionStorage.getItem(he());if(!e)return null;let t=JSON.parse(e);return t&&(t.productViews>0||t.listViews>0||t.basketValue!=null||t.recentProducts?.length||t.recentBrowse?.length||t.campaign)?t:null}catch{return null}}function st(){return{productViews:0,listViews:0,cartAdds:0,searches:0,recentProducts:[],recentCategories:[],recentBrowse:[],basketProducts:[],basketValue:null,recentSearches:[],impressions:{},browsingCategory:null,recentBrowseCategories:[],browsingListing:null,listViewsByCategory:{},campaign:null,startedAt:0}}function en(){let e=Er();if(!e)return st();try{let t=e.getItem(Qt());return t?{...st(),...JSON.parse(t)}:{...st(),startedAt:Date.now()}}catch{return{...st(),startedAt:Date.now()}}}function Ne(e){let t=Er();if(t)try{t.setItem(Qt(),JSON.stringify(e))}catch{}}function Re(){return en()}function Or(){for(let e of[()=>sessionStorage,()=>localStorage])try{let t=e();t.removeItem(he());for(let n of Object.keys(t))n.startsWith(`${he()}:`)&&t.removeItem(n)}catch{}}var tn=20,Pr=200,Ws=new Set(["Product Viewed","Product Clicked","Product Added","Product Added to Wishlist"]),Xs=new Set(["Product Viewed","Product Added"]),Lr=50;function it(e,t){let n=Zt(e.recentBrowse,t);return n?(e.recentBrowseCategories=[e.browsingListing?.category??null,...e.recentBrowseCategories].slice(0,e.recentBrowse.length),n):null}function Ys(e,t){let n=e.listViewsByCategory;n[t]=(n[t]??0)+1;let r=Object.keys(n);if(r.length>Lr){let o={};for(let s of r.sort((i,c)=>n[c]-n[i]).slice(0,Lr))o[s]=n[s];e.listViewsByCategory=o}}var Tr=e=>[...new Set(e.map(t=>t?.product_id).filter(t=>typeof t=="string"&&t))].slice(0,tn);function Nr(e,t,n){let r=en();r.startedAt||(r.startedAt=Date.now());let o=n!==void 0&&JSON.stringify(n??null)!==JSON.stringify(r.campaign??null);o&&(r.campaign=n??null);let s=Array.isArray(t?.products)?t.products:[];switch(e){case"Product Viewed":r.productViews+=1,it(r,r.browsingCategory);break;case"Product List Viewed":{let u=t?.list_id,d=t?.category;if(!(typeof u=="string"&&u.includes("/")&&!u.startsWith("cdp-")))break;let p=typeof d=="string"&&Te(ke(d))||null,m=p?Te(ke(u)):"";if(!m){r.browsingCategory=null,r.browsingListing=null;break}r.browsingListing={key:m,category:p},it(r,m),r.browsingCategory=m,Ys(r,p),r.listViews+=1}break;case"Product List Filtered":{let u=t?.change,d=typeof t?.list_id=="string"?t.list_id:"",f=typeof u?.value=="string"?u.value:"",p=r.browsingListing;if(f&&u?.action!=="removed"&&p&&Te(ke(d))===p.key){let m=it(r,`${d}/${f}`);m&&(r.browsingCategory=m)}break}case"Product Added":{r.cartAdds+=1,it(r,r.browsingCategory);for(let u of s){let d=u.product_id;typeof d!="string"||!d||(r.basketProducts=[d,...r.basketProducts.filter(f=>f!==d)].slice(0,tn))}break}case"Product Removed":{for(let u of s){let d=u.product_id;typeof d=="string"&&d&&(r.basketProducts=r.basketProducts.filter(f=>f!==d))}break}case"Products Searched":{r.searches+=1;let u=t?.query;if(typeof u=="string"&&u.trim()){let d=u.trim().toLowerCase().slice(0,64);r.recentSearches=[d,...r.recentSearches.filter(f=>f!==d)].slice(0,5)}break}case"Product Clicked":case"Product Added to Wishlist":break;case"Cart Viewed":return s.length>0&&(r.basketProducts=Tr(s)),Ne(r),r;case"Cart Updated":{Array.isArray(t?.products)&&(r.basketProducts=Tr(s));let u=t?.value;return r.basketValue=typeof u=="number"&&Number.isFinite(u)&&u>=0?u:null,Ne(r),r}default:return o&&Ne(r),r}let i=Ws.has(e);if(i)for(let u of s)typeof u.product_id=="string"&&u.product_id&&delete r.impressions[u.product_id];else{for(let d of s){let f=d.product_id;typeof f!="string"||!f||(r.impressions[f]=(r.impressions[f]??0)+1)}let u=Object.keys(r.impressions);if(u.length>Pr){let d={};for(let f of u.sort((p,m)=>r.impressions[m]-r.impressions[p]).slice(0,Pr))d[f]=r.impressions[f];r.impressions=d}}let c=new Set;for(let u of s){let d=u.product_id;if(i&&typeof d=="string"&&d&&(r.recentProducts=[d,...r.recentProducts.filter(f=>f!==d)].slice(0,tn)),Xs.has(e)&&typeof u.category=="string"&&u.category){let f=ke(u.category);f&&!c.has(f)&&(c.add(f),Zt(r.recentCategories,f))}}return Ne(r),r}var at=1800*1e3;function Rr({name:e,domain:t=null,mayStore:n,now:r=()=>Date.now(),mint:o=oe}){let s=null,i=0,c=()=>{s!==null&&n()&&se(e,s,at/1e3,t)};return{get(){let u=r(),d=j(e);return d?s=d:(s===null||u-i>=at)&&(s=o()),i=u,c(),s},persist:c,forget(){se(e,"",0,t),s=null}}}var J=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Mr=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Dr=Object.freeze({enabled:!1}),rn=Object.freeze({enabled:!0,queryParamAllowlist:Object.freeze([])});function Ur(e,t){let n=e?.track;return J(n)?(Object.hasOwn(n,t)?n[t]:n.__default)?.enabled!==!1:!0}function Zs(e,t){return`${ie(e)}/v1/projects/${encodeURIComponent(t)}/settings`}var Qs="https://hp.thgingenuity.com";function ie(e){return e==null||e===""?Qs:$r(e)}function Vr(e,t){return e!=null&&e!==""?ie(e):t?.startsWith("https://")?t:ie(void 0)}function $r(e){if(typeof e!="string")return null;let t=e.trim().replace(/\/+$/,"");return/^https?:\/\/[^/\s]+$/i.test(t)?t:/^[a-z0-9.-]+(:\d+)?$/i.test(t)?`https://${t}`:null}function ei(e){if(!J(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>typeof n=="boolean"));return Object.keys(t).length?t:null}var nn=e=>typeof e=="number"&&e>=0&&e<=1,ti=/^[0-9a-f]{64}$/;function ni(e){return J(e)?{enabled:e.enabled===!0,tokenSha256:typeof e.tokenSha256=="string"&&ti.test(e.tokenSha256)?e.tokenSha256:null}:{enabled:!1,tokenSha256:null}}function ri(e){if(!J(e))return null;let t=Object.fromEntries(Object.entries(e).filter(([,n])=>J(n)&&nn(n.share)&&(n.ramp==null||nn(n.ramp))&&typeof n.salt=="string"&&n.salt!=="").map(([n,r])=>[n,{share:r.share,ramp:r.ramp??null,salt:r.salt,...Mr(r.readoutSlots)&&r.readoutSlots.length>0&&{readoutSlots:r.readoutSlots}}]));return Object.keys(t).length?t:null}var oi=/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,128}$/;function si(e){return J(e)?e.source==="hp_cookie"?{source:"hp_cookie"}:e.source!=="site_cookie"?null:e.cookie==null?{source:"site_cookie",cookie:null}:typeof e.cookie=="string"&&oi.test(e.cookie)?{source:"site_cookie",cookie:e.cookie}:null:null}function ii(e){let t=Array.isArray(e?.forms)?e.forms.filter(J):[];return t.length===0?null:{forms:t,capture:J(e.capture)?e.capture:null,...Number.isInteger(e.overlay_gap_minutes)?{overlay_gap_minutes:e.overlay_gap_minutes}:{}}}function ai(e){let t=J(e)?e.hp:null;return J(t)&&typeof t.enabled=="boolean"}function on(e){let t=J(e)?e.hp:null;if(!J(t)||t.enabled!==!0)return Dr;let n=ii(t.onsite);return{enabled:!0,propertyId:typeof t.propertyId=="string"&&t.propertyId!==""?t.propertyId:null,environment:typeof t.environment=="string"?t.environment:null,consentPurposes:ei(t.consent?.purposes),queryParamAllowlist:Mr(t.queryParamAllowlist)?t.queryParamAllowlist:null,anonymousId:si(t.anonymousId),apiHost:$r(t.apiHost),holdouts:ri(t.holdouts),sampleRate:nn(t.sampleRate)?t.sampleRate:1,debug:ni(t.debug),...n&&{onsite:n},plan:J(e.plan)&&J(e.plan.track)?{track:e.plan.track}:null}}var ci=3e3;async function Br(e,t,n=globalThis.fetch,r=ci){try{let o=await n(Zs(e,t),{credentials:"omit",headers:{accept:"application/json"},signal:AbortSignal.timeout?.(r)});if(o.status>=400&&o.status<500&&o.status!==408&&o.status!==429)return Dr;if(!o.ok)return null;let s=await o.json();return ai(s)?on(s):null}catch{return null}}var ct=e=>U(C("settings"),e);function jr(e){try{let t=localStorage.getItem(ct(e));if(!t)return null;let n=JSON.parse(t);return n?.enabled===!0?n:null}catch{return null}}function qr(e,t){try{t?.enabled===!0?localStorage.setItem(ct(e),JSON.stringify(t)):localStorage.removeItem(ct(e))}catch{}}function sn(e){try{localStorage.removeItem(ct(e))}catch{}}var ui={flushAt:20,flushIntervalMs:1e4,maxQueue:500,maxRetryAgeMs:1440*60*1e3,maxRetries:5,maxPersistedBatches:20,maxPersistedBytes:1024*1024,storageKey:fe.retry,beaconSafeBytes:56*1024,maxBatchEvents:100,maxBatchBytes:500*1024},ut=()=>Date.now(),Hr=3e4,fn=55*1024;function li(e,t=ut()){if(typeof e!="string")return 0;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*1e3;if(n==="")return 0;let r=Date.parse(n);return Number.isNaN(r)?0:Math.max(0,r-t)}var ae=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:Buffer.byteLength(e),an=()=>typeof window<"u"&&typeof document<"u";function di(){try{return!an()||!window.localStorage?null:(window.localStorage.getItem("thg_hp_probe"),window.localStorage)}catch{return null}}var A,cn,un,lt,ln,dn,Fr,Me,De,Ue,Kr,dt,Gr,ft,pt=class{constructor(t){vn(this,A);this.o={...ui,...t},this.queue=[],this.timer=null,this.storage=di(),this.inflight=null,this.sending=new Set,this.epoch=0,this.sinceRefusal=new Set,this.wakers=new Set,this.replayAllowed=!this.o.deferReplay,this.draining=null,this.failing=!1,this.answered=!1,an()&&(window.addEventListener("pagehide",()=>this.flush({beacon:!0})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush()}),L(this,A,ft).call(this))}markFailing(){this.answered||(this.failing=!0)}replayPersisted(){return this.replayAllowed=!0,L(this,A,ft).call(this)}clearPersisted(){if(this.replayAllowed=!1,!!this.storage)try{let t=L(this,A,Ue).call(this).filter(n=>this.sinceRefusal.has(n?.id));t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey)}catch{}}discardQueued(){this.queue=[],this.epoch+=1,this.sinceRefusal.clear(),L(this,A,un).call(this);for(let t of this.wakers)t()}enqueue(t){let n;try{n=JSON.parse(JSON.stringify(t))}catch(r){this.o.onError?.(`event ${t?.messageId??""} cannot be serialised; dropped`,r);return}this.queue.push(n),this.queue.length>this.o.maxQueue&&this.queue.splice(0,this.queue.length-this.o.maxQueue),this.queue.length>=this.o.flushAt?this.flush():L(this,A,cn).call(this)}flush(t={}){if(L(this,A,un).call(this),this.queue.length===0)return Promise.resolve();if(t.beacon&&an()&&typeof navigator<"u"&&navigator.sendBeacon)return L(this,A,Fr).call(this),Promise.resolve();if(this.inflight)return this.inflight;let n=L(this,A,dn).call(this,this.queue,this.o.maxBatchEvents,this.o.maxBatchBytes).map(o=>{let s=L(this,A,dt).call(this,o);return s&&(this.sending.add(s),this.sinceRefusal.add(s)),{batch:o,id:s}});this.queue=[];let r=this.epoch;return this.inflight=(async()=>{for(let{batch:o,id:s}of n){if(r!==this.epoch){L(this,A,De).call(this,s);continue}await L(this,A,Me).call(this,o,0,s,r)}})().finally(()=>{this.inflight=null,this.queue.length>=this.o.flushAt?this.flush():this.queue.length&&L(this,A,cn).call(this)}),this.inflight}};A=new WeakSet,cn=function(){this.timer||(this.timer=setTimeout(()=>this.flush(),this.o.flushIntervalMs),this.timer?.unref?.())},un=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},lt=function(t){return JSON.stringify({batch:t,writeKey:this.o.writeKey,sentAt:new Date().toISOString()})},ln=function(){return`${this.o.apiHost.replace(/\/$/,"")}/v1/batch`},dn=function(t,n,r){let o=ae(L(this,A,lt).call(this,[])),s=[],i=[],c=o;for(let u of t){let d=ae(JSON.stringify(u))+1;i.length&&(i.length>=n||c+d>r)&&(s.push(i),i=[],c=o),i.push(u),c+=d}return i.length&&s.push(i),s},Fr=function(){let t=this.queue;this.queue=[];let n=L(this,A,ln).call(this);for(let r of L(this,A,dn).call(this,t,this.o.maxBatchEvents,this.o.beaconSafeBytes)){let o=L(this,A,lt).call(this,r);if(ae(o)<=this.o.beaconSafeBytes){let s=!1;try{s=navigator.sendBeacon(n,new Blob([o],{type:"text/plain"}))}catch{s=!1}if(s){let i=this.failing?L(this,A,dt).call(this,r):null;i&&this.sending.add(i);continue}}L(this,A,Me).call(this,r,0,L(this,A,dt).call(this,r))}},Me=async function(t,n,r=null,o=this.epoch){r&&this.sending.add(r);let s=L(this,A,lt).call(this,t),i=0;try{let c=await fetch(L(this,A,ln).call(this),{method:"POST",headers:{"Content-Type":"text/plain"},body:s,keepalive:ae(s)<=this.o.beaconSafeBytes});if(c.ok)return this.failing=!1,this.answered=!0,L(this,A,De).call(this,r),L(this,A,ft).call(this),!0;let u=c.status===408||c.status===429||c.status>=500;if(u&&(i=li(c.headers?.get?.("retry-after"))),!u)return L(this,A,De).call(this,r),this.o.onError?.(`CDP ingest rejected batch (${c.status}); dropping ${t.length} events`),!0;throw new Error(`retryable ${c.status}`)}catch(c){if(this.failing=!0,n>=this.o.maxRetries){r&&this.sending.delete(r);let d=r?"kept for the next page":"dropped";return this.o.onError?.(`CDP ingest unreachable after ${n} attempts; ${d}: ${t.length} events`,c),!1}let u=Math.max(Math.min(1e3*2**n,Hr)*(.5+Math.random()),Math.min(i,Hr));return o===this.epoch&&await new Promise(d=>{let f=()=>{clearTimeout(p),this.wakers.delete(f),d()},p=setTimeout(f,u);this.wakers.add(f)}),o!==this.epoch?(L(this,A,De).call(this,r),!1):L(this,A,Me).call(this,t,n+1,r,o)}},De=function(t){t&&(this.sending.delete(t),this.sinceRefusal.delete(t),L(this,A,Gr).call(this,t))},Ue=function(){let t=JSON.parse(this.storage.getItem(this.o.storageKey)||"[]");return Array.isArray(t)?t:[]},Kr=function(t,n){let r=i=>ae(JSON.stringify(i))+1,o=[...t,n].slice(-this.o.maxPersistedBatches),s=o.reduce((i,c)=>i+r(c),2);for(;o.length>1&&s>this.o.maxPersistedBytes;)s-=r(o[0]),o=o.slice(1);for(;o.length;)try{return this.storage.setItem(this.o.storageKey,JSON.stringify(o)),!0}catch{o=o.slice(1)}return!1},dt=function(t){if(!this.storage||this.o.mayPersist&&!this.o.mayPersist())return null;try{let n={at:ut(),id:`${ut()}-${Math.random().toString(36).slice(2)}`,batch:t};return ae(JSON.stringify(n))+3>this.o.maxPersistedBytes?null:L(this,A,Kr).call(this,L(this,A,Ue).call(this),n)?n.id:null}catch{return null}},Gr=function(t){if(!(!t||!this.storage))try{let n=L(this,A,Ue).call(this).filter(r=>r.id!==t);n.length?this.storage.setItem(this.o.storageKey,JSON.stringify(n)):this.storage.removeItem(this.o.storageKey)}catch{}},ft=function(){if(!this.storage||!this.replayAllowed)return this.draining??Promise.resolve();if(this.draining)return this.draining;let t;try{let r=L(this,A,Ue).call(this);t=r.filter(o=>Array.isArray(o?.batch)&&ut()-o.at<this.o.maxRetryAgeMs).map(o=>o.id?o:{...o,id:`${o.at}-${Math.random().toString(36).slice(2)}`}),(t.length!==r.length||t.some((o,s)=>o!==r[s]))&&(t.length?this.storage.setItem(this.o.storageKey,JSON.stringify(t)):this.storage.removeItem(this.o.storageKey))}catch{return Promise.resolve()}let n=t.filter(r=>!this.sending.has(r.id));return n.length?(this.draining=(async()=>{for(let r of n)if(!this.replayAllowed||!await L(this,A,Me).call(this,r.batch,0,r.id))return})().finally(()=>{this.draining=null}),this.draining):Promise.resolve()};var pn="3.31.0",mn="@thg-agentic/hyper-personalisation-web";var fi=100,pi=["source","medium","campaign","content","term"];function Jr(e){if(!e||typeof e!="object")return null;let t={};for(let n of pi){let r=e[n==="campaign"?"name":n];typeof r=="string"&&r&&(t[n]=r.slice(0,fi))}return Object.keys(t).length?t:null}var Wr=e=>U(C("visitCampaign"),e==null?null:String(e)),Ie=new Map;function Xr(e){if(Ie.has(e))return Ie.get(e);try{let t=JSON.parse(localStorage.getItem(e));return t&&typeof t=="object"?t:null}catch{return null}}function zr(e,t){try{t?localStorage.setItem(e,JSON.stringify(t)):localStorage.removeItem(e),Ie.delete(e)}catch{t?Ie.set(e,t):Ie.delete(e)}}function Yr(e,t,n){return typeof e?.tags=="object"&&e.tags!==null&&Number.isFinite(e.at)&&n-e.at<at&&!(t&&e.sid&&e.sid!==t)?e:null}function mt(e,{sessionId:t=null,now:n=Date.now()}={}){return Yr(Xr(Wr(e)),t,n)?.tags??null}function Zr(e,t,{sessionId:n=null,keepSession:r=!1,now:o=Date.now()}={}){let s=Wr(e),i=Xr(s),c=Yr(i,n,o),u=c?.tags??t??null;return u?zr(s,{tags:u,at:o,sid:(r?n:null)??c?.sid??null}):i&&zr(s,null),u}function hn(){Ie.clear(),ze("visitCampaign")}var mi=new Set(["audiences","decisions","recommendations"]);var hi=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),gi=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),yi=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access");function wi(e){let t={...e??{}},n=Array.isArray(t.products)?t.products:null;if(t.item_count==null&&n){let r=n.map(o=>o?.quantity);r.every(Number.isInteger)&&(t.item_count=r.reduce((o,s)=>o+s,0))}return t}var Si="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";function _i(e){if(/^[0-9a-fA-F]{64}$/.test(e))return e.toLowerCase();if(!/^[A-Za-z0-9+/_-]{43}=?$/.test(e))return null;try{let t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(44,"="));return t.length!==32?null:Array.from(t,n=>n.charCodeAt(0).toString(16).padStart(2,"0")).join("")}catch{return null}}function gt(e){if(typeof e!="string")return null;let t=_i(e.trim());return t===Si?null:t}var Qr=Object.freeze({email_sha256:"sha256",phone_sha256:"sha256",accepts_marketing:"boolean",gender:"string",created_at:"date-time"}),bi=/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/i;function Ai(e){if(typeof e!="string"||!bi.test(e))return!1;let[t,n,r]=e.slice(0,10).split("-").map(Number),o=new Date(Date.UTC(t,n-1,r));return o.getUTCMonth()===n-1&&o.getUTCDate()===r&&!Number.isNaN(Date.parse(e))}function ki(e,t){return t===null?null:e==="sha256"?gt(t)??void 0:e==="date-time"?t instanceof Date?Number.isNaN(t.getTime())?void 0:t.toISOString():Ai(t)?t:void 0:typeof t===e?t:void 0}function xi(e,t){let n={},r=[];for(let[o,s]of Object.entries(e)){let i=Object.hasOwn(Qr,o)?Qr[o]:null,c=i?ki(i,s):void 0;c===void 0?r.push(o):n[o]=c}return t&&r.length&&console.warn(`[hp] identify: not sent, not spec traits: ${r.join(", ")}`),n}var eo=!1,to=!1;function Ii(){to||(to=!0,console.warn("[hp] no consent adapter: events are sent under the host's lawful basis (basis 'host'). Pass `consent` to send only once the visitor allows analytics."))}function vi(e){!e||eo||(eo=!0,console.warn("[hp] mintAnonymousId is ignored since 3.6: where device ids come from is set per source in the console (the site\u2019s own cookie, or Hyper-Personalisation\u2019s)."))}function Ei(e){try{return ae(JSON.stringify(e))}catch{return 0}}function ht(e){return e&&typeof e.context=="object"&&e.context!==null?e.context:e}function Ci(e,t){if(e==null||String(e)===t)return;let n=[["localStorage","retry",(r,o)=>[...Array.isArray(r)?r:[],...Array.isArray(o)?o:[]]],["sessionStorage","held",(r,o)=>o?{...o,items:[...r.items??[],...o.items??[]]}:r]];for(let[r,o,s]of n)try{let i=globalThis[r],c=U(C(o),e),u=i?.getItem(c);if(!u)continue;let d=U(C(o),t),f=i.getItem(d);i.setItem(d,JSON.stringify(s(JSON.parse(u),f?JSON.parse(f):null))),i.removeItem(c)}catch{}}function no(e){let t=ie(e?.apiHost);if(!t)throw new Error("createAnalytics: apiHost, when given, must be a host or an http(s) origin");if(e?.propertyId!==null&&!e?.propertyId)throw new Error("createAnalytics: propertyId is required (null: the ingest stamps the key\u2019s)");let n={libraryName:mn,libraryVersion:pn,writeKey:"web",queryParamBlocklist:[],debug:!1,validate:null,consentTimeoutMs:5e3,...e,apiHost:t};Ge(n.storageNames),Je();let r=!!n.consent;r||Ii();let o=null;n.getConsent=()=>o?o.stamp():Xn();let s=()=>!r||o?.status==="granted";Ci(n.propertyId,n.writeKey);let i=r&&n.holdAcrossPages?Gn(U(C("held"),n.writeKey)):null,c=i?.read()??{items:[],anonymousId:null};n.mintAnonymousId!==void 0&&vi(n.debug);let u=zn(n,{carried:c.anonymousId,mayStore:s,orOwn:!0}),d=Rr({name:C("session"),domain:n.consentCookieDomain??null,mayStore:s}),f=n.getSessionId;n.getSessionId=()=>H(M(f,null))??d.get();let p=_r(C("preview"),n.consentCookieDomain??null),m=()=>H(M(f,null))??j(C("session")),I=Jr(typeof location>"u"?null:Rt(location.search)),w=(a=null)=>{p||Zr(n.propertyId,a,{sessionId:m(),keepSession:s()})},k=(a,l)=>n.debug&&console.warn("[hp]",a,l??""),b=n.transport??new pt({apiHost:n.apiHost,writeKey:n.writeKey,storageKey:U(C("retry"),n.writeKey),mayPersist:r?()=>o?.status==="granted":void 0,deferReplay:r,onError:k}),x=U(C("previousPage"),n.propertyId),h=null,O=()=>{if(h)return h;try{return sessionStorage.getItem(x)||null}catch{return null}};typeof window<"u"&&window.addEventListener("pageshow",a=>{a.persisted&&(h=null)});let _=a=>{if(h=a||null,!(r&&o.status!=="granted"))try{sessionStorage.setItem(x,a)}catch{}},g=wr({key:U(C("decisions"),n.propertyId),mayStore:s});n.getDecisions??(n.getDecisions=g.current);let y=H(M(n.getUserId,null)),P=null,N=null,V=y?Ce(n.identityToken):null,G=null,F=null,ee=null,W=new Set,Se=new Set;function je(a){if(a.type==="page"&&(ee=null),a.type==="track"&&a.event==="Product Viewed"){let S=a.properties?.products?.[0]?.product_id;ee=typeof S=="string"&&S?S:ee}if(a.type!=="track"||a.event!=="Cart Updated")return;let l=a.properties?.value;F=typeof l=="number"&&Number.isFinite(l)&&l>=0?l:null;for(let S of W)try{S()}catch(E){console.warn("[hp] a basket listener failed",E)}}function ce(a,l,S=!1){je(a),w();try{return R(a,l,S)}catch(E){if(E instanceof Ae)throw E;return console.warn("[hp] the event was not sent",E),null}}function R(a,l,S){let E=G;G=null;let $=a.type==="track"?a.event:a.type;if(!S&&!Ur(n.plan,$))return null;let T={messageId:E?.messageId??oe(),timestamp:E?.timestamp??new Date().toISOString(),anonymousId:H(M(n.getAnonymousId,null)),userId:y??null,...a,context:jn(n,ht(l))};if(T.properties&&(T.properties=Tt(T.properties)),typeof T.properties?.href=="string"&&(T.properties.href=Mt(T.properties.href,n)),!S&&!vr(T.anonymousId,n.sampleRate))return n.debug&&console.debug("[hp] not sent: outside the sample",T),null;if(n.beforeSend){let te;try{te=n.beforeSend(T)}catch(bo){return console.warn("[hp] beforeSend failed; the event was not sent",bo),null}if(!te)return null;let{type:z,event:xn,messageId:So,timestamp:_o}=T;T={...te,type:z,messageId:So,timestamp:_o,...xn?{event:xn}:{}}}if(n.validate){let te=n.validate(T,{producer:"web"});if(!te.valid){let z=`[hp] invalid ${T.event??T.type}:
2
2
  ${te.errors.join(`
3
- `)}`;if(n.throwOnInvalid)throw new Ie(z);console.error(z)}}n.debug&&console.debug("[hp]",T.event??T.type,T);let bt=fi(T);return bt>cn?(k(`${T.event??T.type} not sent: ${bt} bytes, over the ${cn}-byte limit for one event`),null):(oo(T,_),T)}function K(a){if((a.type==="track"||a.type==="page")&&ro(a),n.onEvent)try{n.onEvent(a)}catch(d){console.warn("[hp] onEvent observer failed",d)}}let Z=()=>r&&o?.state?.personalisation===!0,Y=()=>yr(M(n.getSessionId,null),n.propertyId),ve=!1;function ro(a){try{if(Z()){Y();let d=Ir(a.event,a.properties,lt(n.propertyId,{sessionId:m()}));a.type==="track"&&fr(zt(d)),ve=!0}else He()}catch(d){n.debug&&console.warn("[hp] the visit was not recorded",d)}}function He(a=!1){pr(),(a||ve)&&wr(),ve=!1}function St(){l.forget(),g.forget(),_t.clear(),c?.forget(),He(!0),dn()}function oo(a,d){!r||d||o.admits()?(K(a),b.enqueue(a)):o.hold(a)}let v=(a,d,_)=>ce({type:"track",event:a,properties:d??{}},_),_t=new Set,so=(a,d,_)=>a==="audiences"?{audiences:d?null:_.audiences??[]}:a==="decisions"?{decisions:(_.decisions??[]).map(C=>({slot:C.slot,decision_id:C.decision_id??null,arm:C.arm??null,...C.variant&&{variant:C.variant}}))}:{recommendation_request_id:_.recommendation_request_id??null};w(A),r&&(o=sr({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>u.items,write:a=>i.write(a,c?.peek()??null)},release(a){a.context&&(a.context.consent=o.stamp()),K(a),b.enqueue(a)},onStatus(a){if(a==="granted"&&(c?.persist(),l.persist(),h&&S(h),g.persist(),b.replayPersisted?.()),a==="denied"){b.clearPersisted?.(),c?.forget(),l.forget();try{sessionStorage.removeItem(x)}catch{}g.forget(),He(!0)}try{n.onConsentStatus?.(a)}catch(d){console.warn("[hp] onConsentStatus observer failed",d)}if(a==="granted"||a==="denied")for(let d of Se)try{d()}catch(_){console.warn("[hp] a consent listener failed",_)}},announce({action:a,state:d,previous:_,withdrawal:C}){d?.personalisation!==!0&&He(_?.personalisation===!0),C&&(b.discardQueued?.(),dn()),ce({type:"track",event:"Consent Updated",properties:{action:a,state:d}},void 0,C),C&&b.flush()}}),o.start(),w());let mn=()=>n.holdout?Kt(n.holdout):null,hn=()=>Gt(n.holdout,F(M(n.getAnonymousId,null))).group;function io(a,d){if(!Array.isArray(a?.decisions))return a;let _=n.holdout?.readoutSlots??[],C=F(M(n.getAnonymousId,null));return{...a,decisions:a.decisions.map(V=>{let T=V?.variant==="bandit"||V?.variant==="default"?V.variant:!d&&V?.holdout!==!0&&_.includes(V?.slot)?cr(V.slot,C):null;return T?T==="default"?{...V,variant:T,decision_id:null}:{...V,variant:T}:V})}}function gn(a,d){if(p)return null;let _=a?.exposure,C=_?.holdout===!0,V=io(a,C);return g.remember(ir(V)),!_?.token||_t.has(_.token)?null:(_t.add(_.token),v("Personalisation Exposed",{exposure_token:_.token,surface:_.surface,holdout:C,holdout_share:_.holdout_share??mn()?.holdout_share??null,personalised_share:_.personalised_share??mn()?.personalised_share??null,...so(_.surface,C,V)},d))}function yn(a){return y&&St(),y=null,O=null,N=null,U=null,a}return rr({track:(a,d,_)=>a==="Signed Out"?yn(v(a,d,_)):v(a,d,_),page(a,d){a??(a={});let _=n.pageType??null;a.type&&(_e.has(a.type)?(_=a.type,n.pageType=a.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${a.type}". Allowed: ${[..._e].join(", ")}`));let C=ce({type:"page",properties:{name:a.name??null,navigation_trigger:a.navigation_trigger??Pn(),previous_message_id:E()}},{page:{type:_},...dt(d)??{}});return C&&S(C.messageId),C},identify(a,d,_){let{userId:C,...V}=a&&typeof a=="object"?a:{},T=Ce(dt(d)?.identity_token);if(C!==void 0){let z=F(C);U=z?z===y?T??U:T:null,_===Le?N=z:O&&z&&z!==O?St():n.debug&&N&&z&&z!==N&&console.warn("[hp] identify names another userId than the identity option; using the new one"),y=z,z&&_!==Le&&(O=z)}else T&&y&&(U=T);let{identity_token:bt,...te}=dt(d)??{};return ce({type:"identify",traits:ui(V,n.debug)},U?{...te,identity_token:U}:te)},reset(){y&&St(),y=null,O=null,N=null,U=null,S("")},productViewed:(a,d)=>v("Product Viewed",a,d),productListViewed:(a,d)=>v("Product List Viewed",a,d),recommendationsViewed:(a,d)=>v("Recommendations Viewed",a,d),personalisationExposed:(a,d)=>v("Personalisation Exposed",a,d),recordExposure:gn,surfaceViewed({surface:a}={},d){if(!Qs.has(a)||!n.holdout||a!=="decisions"&&!Z())return null;let _=F(M(n.getAnonymousId,null)),C=Gt(n.holdout,_).group;if(C==="excluded")return null;let V=vn({sessionId:Fe(M(n.getSessionId,null),_),surface:a});return V?gn({exposure:{token:V,surface:a,holdout:C==="holdout"}},d):null},inHoldout:()=>hn()!=="personalised",personalisationGroup:hn,productClicked:(a,d)=>v("Product Clicked",a,d),productListFiltered:(a,d)=>v("Product List Filtered",a,d),productsSearched:(a,d)=>v("Products Searched",a,d),searchSuggestionsViewed:(a,d)=>v("Search Suggestions Viewed",a,d),productAdded:(a,d)=>v("Product Added",a,d),productRemoved:(a,d)=>v("Product Removed",a,d),cartUpdated:(a,d)=>v("Cart Updated",ri(a),d),identityLinked:(a,d)=>v("Identity Linked",a,d),slotEngaged:(a,d)=>p?null:v("Slot Engaged",a,d),productVariantSelected:(a,d)=>v("Product Variant Selected",a,d),cartViewed:(a,d)=>v("Cart Viewed",a,d),productAddedToWishlist:(a,d)=>v("Product Added to Wishlist",a,d),productRemovedFromWishlist:(a,d)=>v("Product Removed from Wishlist",a,d),wishlistProductAddedToCart:(a,d)=>v("Wishlist Product Added to Cart",a,d),productShared:(a,d)=>v("Product Shared",a,d),cartShared:(a,d)=>v("Cart Shared",a,d),couponEntered:(a,d)=>v("Coupon Entered",a,d),couponApplied:(a,d)=>v("Coupon Applied",a,d),couponDenied:(a,d)=>v("Coupon Denied",a,d),couponRemoved:(a,d)=>v("Coupon Removed",a,d),checkoutStarted:(a,d)=>v("Checkout Started",a,d),promotionViewed:(a,d)=>v("Promotion Viewed",a,d),promotionClicked:(a,d)=>v("Promotion Clicked",a,d),checkoutStepViewed:(a,d)=>v("Checkout Step Viewed",a,d),checkoutStepCompleted:(a,d)=>v("Checkout Step Completed",a,d),paymentInfoEntered:(a,d)=>v("Payment Info Entered",a,d),checkoutFailed:(a,d)=>v("Checkout Failed",a,d),signedIn:(a,d)=>v("Signed In",a,d),signedUp:(a,d)=>v("Signed Up",a,d),signedOut:a=>yn(v("Signed Out",{},a)),newsletterSubscribed:(a,d)=>v("Newsletter Subscribed",a,d),newsletterUnsubscribed:(a,d)=>v("Newsletter Unsubscribed",a,d),preferencesStated:(a,d)=>v("Preferences Stated",a,d),backInStockSubscribed:(a,d)=>v("Back In Stock Subscribed",a,d),productReviewed:(a,d)=>v("Product Reviewed",a,d),consentUpdated:(a,d)=>v("Consent Updated",a,d),flush:a=>b.flush(a),recommendationContext(){if(!Z())return{};try{return Y(),zt(Re())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>$t(o?.state??null),get lastPageMessageId(){return E()},get anonymousId(){return F(M(n.getAnonymousId,null))},[ni](){return{writeKey:n.writeKey,library:{name:ln,version:un},storageKey:$(P("onsite"),n.propertyId),gatewayHost:n.apiHost,servingHost:n.servingHost??n.apiHost,settings:n.onsite??null,debug:n.debug===!0,preview:p,anonymousId:()=>F(M(n.getAnonymousId,null)),sessionId:()=>F(M(n.getSessionId,null)),identityToken:()=>Z()?U:null,analytics:s,personalisation:Z,consent:()=>n.getConsent(),headers:()=>$t(o?.state??null),pageUrl:()=>typeof location>"u"?null:Lt(location.href,n),locale:()=>Nt(M(n.getLocale,n.locale)),campaign:()=>p?A:lt(n.propertyId,{sessionId:m()}),basketValue:()=>{let a=Re().basketValue;return q??(Number.isFinite(a)?a:null)},sessionSignals:()=>Z()?(Y(),{...Re(),campaign:lt(n.propertyId,{sessionId:m()})}):null,visitContext:()=>{let a=Z();a&&Y();let d=a?Re():null,_=C=>Array.isArray(C)?C.filter(V=>typeof V=="string"&&V.length<=128).slice(0,20):[];return{...n.pageType?{page_type:n.pageType}:{},...ee?{product_id:ee}:{},...d?{basket:_(d.basketProducts),viewed:_(d.recentProducts)}:{}}},onBasket:a=>(J.add(a),()=>J.delete(a)),consentAnswered:()=>!o||o.status==="granted"||o.status==="denied",onConsentAnswered:a=>(Se.add(a),()=>Se.delete(a))}},[ti](){b.markFailing?.()},[ei](a,d,_){if(typeof this[a]=="function"){G=typeof _?.messageId=="string"&&typeof _?.timestamp=="string"?{messageId:_.messageId,timestamp:_.timestamp}:null;try{this[a](...Array.isArray(d)?d:[])}finally{G=null}}}})}var Ve=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),X=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),$e=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),pt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),mi=["shown","submitted","apply","closed","held","nothing"],Gr=10,ge=()=>typeof window>"u"?null:window;function Be(){try{for(let{resolve:e}of ge()?.[X]?.splice(0)??[])e(!1)}catch{}}var ye=Object.freeze({open(e){try{let t=ge();if(!t||typeof e!="string")return Promise.resolve(!1);if(t[Ve])return t[Ve].open(e);if(t[X]??(t[X]=[]),t[X].length<Gr)return new Promise(n=>t[X].push({slot:e,resolve:n}))}catch{}return Promise.resolve(!1)},show(e){return ye.open(e)},on(e,t){var n;try{let r=ge();return!r||!mi.includes(e)||typeof t!="function"?()=>{}:(r[$e]??(r[$e]={}),((n=r[$e])[e]??(n[e]=new Set)).add(t),()=>r[$e][e].delete(t))}catch{return()=>{}}},suppress(e="page"){try{let t=ge();if(!t)return;(t[pt]??(t[pt]=new Set)).add(String(e)),t[Ve]?.suppress()}catch{}},unsuppress(e){try{let t=ge()?.[pt];e===void 0?t?.clear():t?.delete(String(e))}catch{}},ready(){try{let e=ge();if(!e)return Promise.resolve([]);if(e[Ve])return Promise.resolve(ye.debug());if(e[X]??(e[X]=[]),e[X].length<Gr)return new Promise(t=>e[X].push({slot:null,resolve:()=>t(ye.debug())}))}catch{}return Promise.resolve([])},debug(){try{return ge()?.[Ve]?.debug()??[]}catch{return[]}}});function zr(e){let t=typeof document>"u"?null:document.currentScript?.src;return t?new URL(e,t).href:null}var mt=new Map;function Wr(e,t){return window[t]?Promise.resolve(window[t]):e?(mt.has(t)||mt.set(t,new Promise((n,r)=>{let o=document.createElement("script");o.src=e,o.async=!0,o.onload=()=>window[t]?n(window[t]):r(new Error(`${e} did not register`)),o.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(o)}).finally(()=>mt.delete(t))),mt.get(t)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var hi=zr("onsite.min.js"),fn=()=>Wr(hi,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module"));var pn=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),gi=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),yi=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),Jr=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),wi=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),Si=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),_i=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),yt=e=>e?()=>j(e):()=>null,Zr={didomi:e=>zn({purposes:e.purposes}),onetrust:e=>Wn({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>Jn({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>Yn({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return Xn(e.state)}},Yr=Object.keys(Zr),we=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),ht=e=>typeof e=="string"&&e!=="",bi=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),Qr=e=>we(e)&&typeof e.read=="function";function Ii(e,t={}){let n=[];if(!we(e))return["config must be { writeKey, apiHost? }"];ht(e.writeKey)||n.push("writeKey is required"),ie(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!ht(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!Qr(r)&&!(we(r)&&Yr.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${Yr.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!we(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.onsite!==void 0&&typeof t.onsite!="boolean"&&!we(t.onsite)&&n.push("onsite must be true, false or the onsite options"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!we(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!ht(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(we(t.dataLayer)?(t.dataLayer.name!==void 0&&!ht(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!bi(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function ki(e,t,n){if(Qr(e))return Bt(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??Zr[r];return Bt(s(o),t.consentPurposes)}var wt=(e,t,n)=>`${e??""}|${t??""}${n?"|v":""}`,xi=(e,t,n,r)=>e===wt(t,n,!0)||!r&&e===wt(t,n,!1),Ai=e=>{if(e.context?.identity_token===void 0)return e;let{identity_token:t,...n}=e.context;return{...e,context:n}},eo=e=>{try{return sessionStorage.getItem(e)}catch{return null}};function vi(e,t){let n=F(t?.userId),r=ft(t?.emailSha256);if(!n&&!r)return null;let o=eo($(P("identified"),e));return xi(o,n,r,n!==null&&Ce(t?.token)!==null)?null:{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function Ei({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:en(n.settings),revalidated:null};let r=Pr(t,e),o=Or(e);if(o)return{settings:o,revalidated:r,fetched:r};let s=await r;return s?{settings:s,revalidated:r,fetched:r}:{settings:Qt,revalidated:null,fetched:r}}function to(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[pn])return r[pn];let o=Hn(e?.writeKey,()=>{let{analytics:i}=Oe(j(P("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=Li(e,n,o);if(r){let i=n.extend?.getSessionId??yt(n.identityCookies?.sessionId),u=yt(n.identityCookies?.anonymousId);r[Si]=({slot:c,arm:l}={})=>An({sessionId:Fe(i(),u()),slot:c,arm:l}),r[pn]=s,r[yi]=o,r[gi]?.(s)}return s}function Ci(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function Xr(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(At(e,r(n.promotions))),n.productLists&&o.push(xt(e,r(n.productLists))),n.recommendations&&o.push(vt(e,r(n.recommendations))),n.exposures&&o.push(kt(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}var Pi=1e3;function Oi(e,t,n,r){if(!t)return Be();let o=n.onsite?fn():null;o?.catch(()=>{}),(r?Promise.race([r.then(i=>i??n),new Promise(i=>setTimeout(()=>i(n),Pi))]):Promise.resolve(n)).then(i=>{let u=i.enabled?i.onsite:null;if(!u)return Be();let c=t===!0?{}:t;return(o??fn()).then(l=>l.startOnsite(e,{...c,settings:c.settings??u}))}).catch(i=>{Be(),console.warn("[hp] onsite not started:",i?.message??i)})}function gt(e){return e.close(),Be(),null}async function Li(e,t,n){try{let r=Ii(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),gt(n);Ke(t.storageNames),Ge();let{writeKey:o}=e,[{settings:s,revalidated:i,fetched:u},c]=await Promise.all([Ei(e,t),Promise.resolve(t.identity).catch(()=>null)]),l=i?s:null,f=!1,p=()=>f&&l&&Lr(o,l);if(i?.then(g=>{g&&(l=g,g.enabled?p():tn(o))}),!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),gt(n);let m=t.propertyId??s.propertyId??null;if(!m&&s!==Qt)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),gt(n);let{preset:A}=t,w=vi(m,c),k=t.debug===!0||s.debug?.enabled===!0||nr(s.debug?.tokenSha256??null,P("debug")),b=F(c?.userId),x=Kr({apiHost:Er(e.apiHost,s.apiHost),servingHost:ie(e.apiHost),onsite:s.onsite??null,writeKey:o,propertyId:m,pageType:_e.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[m],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:ki(t.consent,s,A),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:k,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:yt(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?yt(t.identityCookies.sessionId):void 0,getUserId:()=>b,identityToken:c?.token,beforeSend:t.beforeSend,...t.extend,onConsentStatus(g){if(g==="granted"&&(f=!0,p()),g==="denied"){tn(o);try{sessionStorage.removeItem($(P("identified"),m))}catch{}}t.extend?.onConsentStatus?.(g)},onEvent(g){if(g.type==="identify"){let y=$(P("identified"),m),O=F(g.userId),N=ft(g.traits?.email_sha256),U=!!g.context?.identity_token||eo(y)===wt(O,N,!0);try{sessionStorage.setItem(y,wt(O,N,U))}catch{}}t.extend?.onEvent?.(Ai(g))}});typeof window<"u"&&(window[_i]=()=>x.recommendationContext()),u?.then(g=>g===null&&x[wi]());for(let[g,y,O]of n.take())try{x[Jr](g,y,O)}catch(N){console.warn(`[hp] carried ${g} failed`,N)}x[Jr]("page",[t.pageType?{type:t.pageType}:{}],{messageId:oe(),timestamp:Ci()});let h=Xr(x,t.autocapture),E=x.page;x.page=qt("page",(...g)=>{let y=E(...g);return h(),h=Xr(x,t.autocapture),y});let S=typeof window<"u"?window:null;if(S?.addEventListener?.("pageshow",g=>{g.persisted&&x.page({navigation_trigger:"back_forward"})}),t.dataLayer&&S){let g=t.dataLayer.name??"dataLayer";S[g]=S[g]||[],tr(x,{...A,dataLayer:S[g],ignore:[...A?.ignore??[],...t.dataLayer.ignore??[]],onError:y=>k&&console.warn("[hp] dataLayer mapping failed",y)})}return w&&x.identify(w,void 0,Le),x.onsite=ye,Oi(x,t.onsite,s,i),x}catch(r){return console.warn("[hp] not started:",r?.message??r),gt(n)}}function no(e){e.initialized=!0,to(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var B=window.hp=window.hp||[];B.servingHeaders??(B.servingHeaders=()=>({}));B.inHoldout??(B.inHoldout=()=>!0);B.personalisationGroup??(B.personalisationGroup=()=>"excluded");B.recommendationContext??(B.recommendationContext=()=>({}));B.onsite??(B.onsite=ye);B.initialized||(B._config?no(B):B.load=(e,t)=>{B._config=e,B._options=t??{},no(B)});})();
3
+ `)}`;if(n.throwOnInvalid)throw new Ae(z);console.error(z)}}n.debug&&console.debug("[hp]",T.event??T.type,T);let It=Ei(T);return It>fn?(k(`${T.event??T.type} not sent: ${It} bytes, over the ${fn}-byte limit for one event`),null):(go(T,S),T)}function K(a){if((a.type==="track"||a.type==="page")&&ho(a),n.onEvent)try{n.onEvent(a)}catch(l){console.warn("[hp] onEvent observer failed",l)}}let X=()=>r&&o?.state?.personalisation===!0,Y=()=>Cr(M(n.getSessionId,null),n.propertyId),ve=!1,wn=null;function ho(a){try{if(X()){Y();let l=Nr(a.event,a.properties,mt(n.propertyId,{sessionId:m()}));a.type==="track"&&kr(Yt(l)),a.event==="Preferences Stated"&&a.properties?.source==="onsite"&&Sn([a.properties],a.properties.slot),ve=!0}else qe(!1,n.propertyId??null)}catch(l){n.debug&&console.warn("[hp] the visit was not recorded",l)}}function Sn(a,l){let S=(wn??n.onsite)?.forms?.find?.(E=>E?.slot===l);pr(n.propertyId,fr(a,S?.questions))}function qe(a=!1,l=void 0){xr(),mr(l),(a||ve)&&Or(),ve=!1}function kt(){d.forget(),g.forget(),xt.clear(),u?.forget(),qe(!0),hn()}function go(a,l){!r||l||o.admits()?(K(a),b.enqueue(a)):o.hold(a)}let v=(a,l,S)=>ce({type:"track",event:a,properties:l??{}},S),xt=new Set,yo=(a,l,S)=>a==="audiences"?{audiences:l?null:S.audiences??[]}:a==="decisions"?{decisions:(S.decisions??[]).map(E=>({slot:E.slot,decision_id:E.decision_id??null,arm:E.arm??null,...E.variant&&{variant:E.variant}}))}:{recommendation_request_id:S.recommendation_request_id??null};w(I),r&&(o=gr({adapter:n.consent,timeoutMs:n.consentTimeoutMs,cookieDomain:n.consentCookieDomain,debug:n.debug,store:i&&{read:()=>c.items,write:a=>i.write(a,u?.peek()??null)},release(a){a.context&&(a.context.consent=o.stamp()),K(a),b.enqueue(a)},onStatus(a){if(a==="granted"&&(u?.persist(),d.persist(),h&&_(h),g.persist(),b.replayPersisted?.()),a==="denied"){b.clearPersisted?.(),u?.forget(),d.forget();try{sessionStorage.removeItem(x)}catch{}g.forget(),qe(!0)}try{n.onConsentStatus?.(a)}catch(l){console.warn("[hp] onConsentStatus observer failed",l)}if(a==="granted"||a==="denied")for(let l of Se)try{l()}catch(S){console.warn("[hp] a consent listener failed",S)}},announce({action:a,state:l,previous:S,withdrawal:E}){l?.personalisation!==!0&&qe(S?.personalisation===!0),E&&(b.discardQueued?.(),hn()),ce({type:"track",event:"Consent Updated",properties:{action:a,state:l}},void 0,E),E&&b.flush()}}),o.start(),w());let _n=()=>n.holdout?Wt(n.holdout):null,bn=()=>Xt(n.holdout,H(M(n.getAnonymousId,null))).group;function wo(a,l){if(!Array.isArray(a?.decisions))return a;let S=n.holdout?.readoutSlots??[],E=H(M(n.getAnonymousId,null));return{...a,decisions:a.decisions.map($=>{let T=$?.variant==="bandit"||$?.variant==="default"?$.variant:!l&&$?.holdout!==!0&&S.includes($?.slot)?Sr($.slot,E):null;return T?T==="default"?{...$,variant:T,decision_id:null}:{...$,variant:T}:$})}}function An(a,l){if(p)return null;let S=a?.exposure,E=S?.holdout===!0,$=wo(a,E);return g.remember(yr($)),!S?.token||xt.has(S.token)?null:(xt.add(S.token),v("Personalisation Exposed",{exposure_token:S.token,surface:S.surface,holdout:E,holdout_share:S.holdout_share??_n()?.holdout_share??null,personalised_share:S.personalised_share??_n()?.personalised_share??null,...yo(S.surface,E,$)},l))}function kn(a){return y&&kt(),y=null,P=null,N=null,V=null,a}return ur({track:(a,l,S)=>a==="Signed Out"?kn(v(a,l,S)):v(a,l,S),page(a,l){a??(a={});let S=n.pageType??null;a.type&&(_e.has(a.type)?(S=a.type,n.pageType=a.type):n.debug&&console.warn(`[hp] ignoring unknown page.type "${a.type}". Allowed: ${[..._e].join(", ")}`));let E=ce({type:"page",properties:{name:a.name??null,navigation_trigger:a.navigation_trigger??Mn(),previous_message_id:O()}},{page:{type:S},...ht(l)??{}});return E&&_(E.messageId),E},identify(a,l,S){let{userId:E,...$}=a&&typeof a=="object"?a:{},T=Ce(ht(l)?.identity_token);if(E!==void 0){let z=H(E);V=z?z===y?T??V:T:null,S===Le?N=z:P&&z&&z!==P?kt():n.debug&&N&&z&&z!==N&&console.warn("[hp] identify names another userId than the identity option; using the new one"),y=z,z&&S!==Le&&(P=z)}else T&&y&&(V=T);let{identity_token:It,...te}=ht(l)??{};return ce({type:"identify",traits:xi($,n.debug)},V?{...te,identity_token:V}:te)},reset(){y&&kt(),y=null,P=null,N=null,V=null,_("")},productViewed:(a,l)=>v("Product Viewed",a,l),productListViewed:(a,l)=>v("Product List Viewed",a,l),recommendationsViewed:(a,l)=>v("Recommendations Viewed",a,l),personalisationExposed:(a,l)=>v("Personalisation Exposed",a,l),recordExposure:An,surfaceViewed({surface:a}={},l){if(!mi.has(a)||!n.holdout||a!=="decisions"&&!X())return null;let S=H(M(n.getAnonymousId,null)),E=Xt(n.holdout,S).group;if(E==="excluded")return null;let $=Tn({sessionId:He(M(n.getSessionId,null),S),surface:a});return $?An({exposure:{token:$,surface:a,holdout:E==="holdout"}},l):null},inHoldout:()=>bn()!=="personalised",personalisationGroup:bn,productClicked:(a,l)=>v("Product Clicked",a,l),productListFiltered:(a,l)=>v("Product List Filtered",a,l),productsSearched:(a,l)=>v("Products Searched",a,l),searchSuggestionsViewed:(a,l)=>v("Search Suggestions Viewed",a,l),productAdded:(a,l)=>v("Product Added",a,l),productRemoved:(a,l)=>v("Product Removed",a,l),cartUpdated:(a,l)=>v("Cart Updated",wi(a),l),identityLinked:(a,l)=>v("Identity Linked",a,l),slotEngaged:(a,l)=>p?null:v("Slot Engaged",a,l),productVariantSelected:(a,l)=>v("Product Variant Selected",a,l),cartViewed:(a,l)=>v("Cart Viewed",a,l),productAddedToWishlist:(a,l)=>v("Product Added to Wishlist",a,l),productRemovedFromWishlist:(a,l)=>v("Product Removed from Wishlist",a,l),wishlistProductAddedToCart:(a,l)=>v("Wishlist Product Added to Cart",a,l),productShared:(a,l)=>v("Product Shared",a,l),cartShared:(a,l)=>v("Cart Shared",a,l),couponEntered:(a,l)=>v("Coupon Entered",a,l),couponApplied:(a,l)=>v("Coupon Applied",a,l),couponDenied:(a,l)=>v("Coupon Denied",a,l),couponRemoved:(a,l)=>v("Coupon Removed",a,l),checkoutStarted:(a,l)=>v("Checkout Started",a,l),promotionViewed:(a,l)=>v("Promotion Viewed",a,l),promotionClicked:(a,l)=>v("Promotion Clicked",a,l),checkoutStepViewed:(a,l)=>v("Checkout Step Viewed",a,l),checkoutStepCompleted:(a,l)=>v("Checkout Step Completed",a,l),paymentInfoEntered:(a,l)=>v("Payment Info Entered",a,l),checkoutFailed:(a,l)=>v("Checkout Failed",a,l),signedIn:(a,l)=>v("Signed In",a,l),signedUp:(a,l)=>v("Signed Up",a,l),signedOut:a=>kn(v("Signed Out",{},a)),newsletterSubscribed:(a,l)=>v("Newsletter Subscribed",a,l),newsletterUnsubscribed:(a,l)=>v("Newsletter Unsubscribed",a,l),preferencesStated:(a,l)=>v("Preferences Stated",a,l),backInStockSubscribed:(a,l)=>v("Back In Stock Subscribed",a,l),productReviewed:(a,l)=>v("Product Reviewed",a,l),consentUpdated:(a,l)=>v("Consent Updated",a,l),flush:a=>b.flush(a),recommendationContext(){if(!X())return{};try{return Y(),Yt(Re())}catch{return{}}},get consent(){return o?o.state:null},servingHeaders:()=>qt(o?.state??null),get lastPageMessageId(){return O()},get anonymousId(){return H(M(n.getAnonymousId,null))},[yi](){return{writeKey:n.writeKey,library:{name:mn,version:pn},storageKey:U(C("onsite"),n.propertyId),gatewayHost:n.apiHost,servingHost:n.servingHost??n.apiHost,settings:n.onsite??null,debug:n.debug===!0,preview:p,anonymousId:()=>H(M(n.getAnonymousId,null)),sessionId:()=>H(M(n.getSessionId,null)),identityToken:()=>X()?V:null,analytics:s,personalisation:X,answered:(a,l)=>{X()&&Sn(a,l)},started:a=>{wn=a},consent:()=>n.getConsent(),headers:()=>qt(o?.state??null),pageUrl:()=>typeof location>"u"?null:Mt(location.href,n),locale:()=>Ut(M(n.getLocale,n.locale)),campaign:()=>p?I:mt(n.propertyId,{sessionId:m()}),basketValue:()=>{let a=Re().basketValue;return F??(Number.isFinite(a)?a:null)},sessionSignals:()=>X()?(Y(),{...Re(),campaign:mt(n.propertyId,{sessionId:m()}),answers:dr(n.propertyId)}):null,visitContext:()=>{let a=X();a&&Y();let l=a?Re():null,S=E=>Array.isArray(E)?E.filter($=>typeof $=="string"&&$.length<=128).slice(0,20):[];return{...n.pageType?{page_type:n.pageType}:{},...ee?{product_id:ee}:{},...l?{basket:S(l.basketProducts),viewed:S(l.recentProducts)}:{}}},onBasket:a=>(W.add(a),()=>W.delete(a)),consentAnswered:()=>!o||o.status==="granted"||o.status==="denied",onConsentAnswered:a=>(Se.add(a),()=>Se.delete(a))}},[gi](){b.markFailing?.()},[hi](a,l,S){if(typeof this[a]=="function"){G=typeof S?.messageId=="string"&&typeof S?.timestamp=="string"?{messageId:S.messageId,timestamp:S.timestamp}:null;try{this[a](...Array.isArray(l)?l:[])}finally{G=null}}}})}var Ve=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),Z=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),$e=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),yt=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Oi=["shown","submitted","apply","closed","held","nothing"],ro=10,ge=()=>typeof window>"u"?null:window;function Be(){try{for(let{resolve:e}of ge()?.[Z]?.splice(0)??[])e(!1)}catch{}}var ye=Object.freeze({open(e){try{let t=ge();if(!t||typeof e!="string")return Promise.resolve(!1);if(t[Ve])return t[Ve].open(e);if(t[Z]??(t[Z]=[]),t[Z].length<ro)return new Promise(n=>t[Z].push({slot:e,resolve:n}))}catch{}return Promise.resolve(!1)},show(e){return ye.open(e)},on(e,t){var n;try{let r=ge();return!r||!Oi.includes(e)||typeof t!="function"?()=>{}:(r[$e]??(r[$e]={}),((n=r[$e])[e]??(n[e]=new Set)).add(t),()=>r[$e][e].delete(t))}catch{return()=>{}}},suppress(e="page"){try{let t=ge();if(!t)return;(t[yt]??(t[yt]=new Set)).add(String(e)),t[Ve]?.suppress()}catch{}},unsuppress(e){try{let t=ge()?.[yt];e===void 0?t?.clear():t?.delete(String(e))}catch{}},ready(){try{let e=ge();if(!e)return Promise.resolve([]);if(e[Ve])return Promise.resolve(ye.debug());if(e[Z]??(e[Z]=[]),e[Z].length<ro)return new Promise(t=>e[Z].push({slot:null,resolve:()=>t(ye.debug())}))}catch{}return Promise.resolve([])},debug(){try{return ge()?.[Ve]?.debug()??[]}catch{return[]}}});function oo(e){let t=typeof document>"u"?null:document.currentScript?.src;return t?new URL(e,t).href:null}var wt=new Map;function so(e,t){return window[t]?Promise.resolve(window[t]):e?(wt.has(t)||wt.set(t,new Promise((n,r)=>{let o=document.createElement("script");o.src=e,o.async=!0,o.onload=()=>window[t]?n(window[t]):r(new Error(`${e} did not register`)),o.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(o)}).finally(()=>wt.delete(t))),wt.get(t)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var Pi=oo("onsite.min.js"),gn=()=>so(Pi,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module"));var yn=Symbol.for("@thg-agentic/hyper-personalisation-web.bootstrap"),Li=Symbol.for("@thg-agentic/hyper-personalisation-web.drain"),Ti=Symbol.for("@thg-agentic/hyper-personalisation-web.carry"),io=Symbol.for("@thg-agentic/hyper-personalisation-web.replay"),Ni=Symbol.for("@thg-agentic/hyper-personalisation-web.unreachable"),Ri=Symbol.for("@thg-agentic/hyper-personalisation-web.assignment"),Mi=Symbol.for("@thg-agentic/hyper-personalisation-web.recommendation-context"),bt=e=>e?()=>j(e):()=>null,uo={didomi:e=>Qn({purposes:e.purposes}),onetrust:e=>er({groups:e.groups,impliedConsent:e.impliedConsent}),cookie:e=>tr({name:e.name,categories:e.categories,refusedValue:e.refusedValue,source:e.source,changeEvent:e.changeEvent}),forwarded:e=>nr({name:e.name}),static:e=>{if(!e.state||typeof e.state!="object")throw new Error('consent.state is required for provider "static"');return rr(e.state)}},ao=Object.keys(uo),we=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),St=e=>typeof e=="string"&&e!=="",Di=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"),lo=e=>we(e)&&typeof e.read=="function";function Ui(e,t={}){let n=[];if(!we(e))return["config must be { writeKey, apiHost? }"];St(e.writeKey)||n.push("writeKey is required"),ie(e.apiHost)||n.push("apiHost, when given, must be a host or an http(s) origin"),t.propertyId!==void 0&&!St(t.propertyId)&&n.push("propertyId must be a string");let{consent:r}=t;if(!lo(r)&&!(we(r)&&ao.includes(r.provider))&&n.push(`consent must be a consent adapter or { provider: ${ao.join(" | ")} }`),t.autocapture!==void 0&&t.autocapture!==!1&&!we(t.autocapture)&&n.push("autocapture must be false or { promotions, productLists, recommendations }"),t.onsite!==void 0&&typeof t.onsite!="boolean"&&!we(t.onsite)&&n.push("onsite must be true, false or the onsite options"),t.beforeSend!==void 0&&typeof t.beforeSend!="function"&&n.push("beforeSend must be a function"),t.identityCookies!==void 0)if(!we(t.identityCookies))n.push("identityCookies must be an object");else for(let o of["anonymousId","sessionId"]){let s=t.identityCookies[o];s!==void 0&&!St(s)&&n.push(`identityCookies.${o} must be a cookie name`)}for(let o of["getCurrency","getShipToCountry","getLocale"])t[o]!==void 0&&typeof t[o]!="function"&&n.push(`${o} must be a function`);return t.dataLayer!==void 0&&(we(t.dataLayer)?(t.dataLayer.name!==void 0&&!St(t.dataLayer.name)&&n.push("dataLayer.name must be a string"),t.dataLayer.ignore!==void 0&&!Di(t.dataLayer.ignore)&&n.push("dataLayer.ignore must be an array of strings")):n.push("dataLayer must be an object")),n}function Vi(e,t,n){if(lo(e))return Ht(e,t.consentPurposes);let{provider:r,...o}=e,s=n?.consent?.[r]??uo[r];return Ht(s(o),t.consentPurposes)}var At=(e,t,n)=>`${e??""}|${t??""}${n?"|v":""}`,$i=(e,t,n,r)=>e===At(t,n,!0)||!r&&e===At(t,n,!1),Bi=e=>{if(e.context?.identity_token===void 0)return e;let{identity_token:t,...n}=e.context;return{...e,context:n}},fo=e=>{try{return sessionStorage.getItem(e)}catch{return null}};function ji(e,t){let n=H(t?.userId),r=gt(t?.emailSha256);if(!n&&!r)return null;let o=fo(U(C("identified"),e));return $i(o,n,r,n!==null&&Ce(t?.token)!==null)?null:{...n?{userId:n}:{},...r?{email_sha256:r}:{}}}async function qi({writeKey:e,apiHost:t},n){if(n.settings!==void 0)return{settings:on(n.settings),revalidated:null};let r=Br(t,e),o=jr(e);if(o)return{settings:o,revalidated:r,fetched:r};let s=await r;return s?{settings:s,revalidated:r,fetched:r}:{settings:rn,revalidated:null,fetched:r}}function po(e,t){let n=t??{},r=typeof window<"u"?window:null;if(r?.[yn])return r[yn];let o=Jn(e?.writeKey,()=>{let{analytics:i}=Pe(j(C("consent")));return i===!0||i===null&&n.holdAcrossPages===!0}),s=Gi(e,n,o);if(r){let i=n.extend?.getSessionId??bt(n.identityCookies?.sessionId),c=bt(n.identityCookies?.anonymousId);r[Ri]=({slot:u,arm:d}={})=>Ln({sessionId:He(i(),c()),slot:u,arm:d}),r[yn]=s,r[Ti]=o,r[Li]?.(s)}return s}function Hi(){let e=globalThis.performance?.now?.();return new Date(Date.now()-(Number.isFinite(e)?e:0)).toISOString()}function co(e,t){if(t===!1)return()=>{};let n={promotions:!0,productLists:!0,recommendations:!0,exposures:!0,...t},r=s=>s&&typeof s=="object"?s:{},o=[];try{n.promotions&&o.push(Ot(e,r(n.promotions))),n.productLists&&o.push(Ct(e,r(n.productLists))),n.recommendations&&o.push(Pt(e,r(n.recommendations))),n.exposures&&o.push(Et(e,r(n.exposures)))}catch(s){console.warn("[hp] autocapture not started:",s?.message??s)}return()=>{for(let s of o)s()}}var Fi=1e3;function Ki(e,t,n,r){if(!t)return Be();let o=n.onsite?gn():null;o?.catch(()=>{}),(r?Promise.race([r.then(i=>i??n),new Promise(i=>setTimeout(()=>i(n),Fi))]):Promise.resolve(n)).then(i=>{let c=i.enabled?i.onsite:null;if(!c)return Be();let u=t===!0?{}:t;return(o??gn()).then(d=>d.startOnsite(e,{...u,settings:u.settings??c}))}).catch(i=>{Be(),console.warn("[hp] onsite not started:",i?.message??i)})}function _t(e){return e.close(),Be(),null}async function Gi(e,t,n){try{let r=Ui(e,t);if(r.length)return console.warn(`[hp] not started, the configuration is invalid: ${r.join("; ")}`),_t(n);Ge(t.storageNames),Je();let{writeKey:o}=e,[{settings:s,revalidated:i,fetched:c},u]=await Promise.all([qi(e,t),Promise.resolve(t.identity).catch(()=>null)]),d=i?s:null,f=!1,p=()=>f&&d&&qr(o,d);if(i?.then(g=>{g&&(d=g,g.enabled?p():sn(o))}),!s.enabled)return t.debug&&console.info("[hp] off: the settings for this write key do not enable it"),_t(n);let m=t.propertyId??s.propertyId??null;if(!m&&s!==rn)return console.warn("[hp] not started: this write key covers several properties, so propertyId is required"),_t(n);let{preset:I}=t,w=ji(m,u),k=t.debug===!0||s.debug?.enabled===!0||cr(s.debug?.tokenSha256??null,C("debug")),b=H(u?.userId),x=no({apiHost:Vr(e.apiHost,s.apiHost),servingHost:ie(e.apiHost),onsite:s.onsite??null,writeKey:o,propertyId:m,pageType:_e.has(t.pageType)?t.pageType:void 0,environment:s.environment,queryParamAllowlist:s.queryParamAllowlist??void 0,plan:s.plan,sampleRate:s.sampleRate??1,holdout:s.holdouts?.[m],getCurrency:t.getCurrency,getShipToCountry:t.getShipToCountry,getLocale:t.getLocale,consent:Vi(t.consent,s,I),consentCookieDomain:t.consentCookieDomain,storageNames:t.storageNames,holdAcrossPages:t.holdAcrossPages===!0,mintAnonymousId:t.mintAnonymousId,debug:k,anonymousIdSource:s.anonymousId??void 0,getAnonymousId:bt(t.identityCookies?.anonymousId),getSessionId:t.identityCookies?.sessionId?bt(t.identityCookies.sessionId):void 0,getUserId:()=>b,identityToken:u?.token,beforeSend:t.beforeSend,...t.extend,onConsentStatus(g){if(g==="granted"&&(f=!0,p()),g==="denied"){sn(o);try{sessionStorage.removeItem(U(C("identified"),m))}catch{}}t.extend?.onConsentStatus?.(g)},onEvent(g){if(g.type==="identify"){let y=U(C("identified"),m),P=H(g.userId),N=gt(g.traits?.email_sha256),V=!!g.context?.identity_token||fo(y)===At(P,N,!0);try{sessionStorage.setItem(y,At(P,N,V))}catch{}}t.extend?.onEvent?.(Bi(g))}});typeof window<"u"&&(window[Mi]=()=>x.recommendationContext()),c?.then(g=>g===null&&x[Ni]());for(let[g,y,P]of n.take())try{x[io](g,y,P)}catch(N){console.warn(`[hp] carried ${g} failed`,N)}x[io]("page",[t.pageType?{type:t.pageType}:{}],{messageId:oe(),timestamp:Hi()});let h=co(x,t.autocapture),O=x.page;x.page=zt("page",(...g)=>{let y=O(...g);return h(),h=co(x,t.autocapture),y});let _=typeof window<"u"?window:null;if(_?.addEventListener?.("pageshow",g=>{g.persisted&&x.page({navigation_trigger:"back_forward"})}),t.dataLayer&&_){let g=t.dataLayer.name??"dataLayer";_[g]=_[g]||[],ar(x,{...I,dataLayer:_[g],ignore:[...I?.ignore??[],...t.dataLayer.ignore??[]],onError:y=>k&&console.warn("[hp] dataLayer mapping failed",y)})}return w&&x.identify(w,void 0,Le),x.onsite=ye,Ki(x,t.onsite,s,i),x}catch(r){return console.warn("[hp] not started:",r?.message??r),_t(n)}}function mo(e){e.initialized=!0,po(e._config,e._options).then(t=>{let n=e.splice(0);if(!t){for(let r of e.methods??[])e[r]=()=>e;return}e.client=t;for(let[r,o]of Object.entries(t))typeof o=="function"&&(e[r]=o);for(let[r,...o]of n)try{t[r]?.(...o)}catch(s){console.warn(`[hp] queued ${r} failed`,s)}})}var B=window.hp=window.hp||[];B.servingHeaders??(B.servingHeaders=()=>({}));B.inHoldout??(B.inHoldout=()=>!0);B.personalisationGroup??(B.personalisationGroup=()=>"excluded");B.recommendationContext??(B.recommendationContext=()=>({}));B.onsite??(B.onsite=ye);B.initialized||(B._config?mo(B):B.load=(e,t)=>{B._config=e,B._options=t??{},mo(B)});})();
@@ -1 +1 @@
1
- (()=>{var y=["source","medium","campaign","content","term"];var h=e=>String(e).trim().toLowerCase();function f(e,t,n){let s=h(e),r=h(n);return t==="is"?s===r:t==="contains"&&r!==""&&s.includes(r)}function d(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var A={gte:(e,t)=>e>=t,greater_than_or_equal:(e,t)=>e>=t,">=":(e,t)=>e>=t,lte:(e,t)=>e<=t,less_than_or_equal:(e,t)=>e<=t,"<=":(e,t)=>e<=t,eq:(e,t)=>e===t,equals:(e,t)=>e===t,"=":(e,t)=>e===t},p=e=>typeof e=="string",u=(e,t)=>p(t)&&f(e,"is",t),x={eq:u,equals:u,"=":u,neq:(e,t)=>p(t)&&!u(e,t),in:(e,t)=>Array.isArray(t)&&t.some(n=>u(e,n)),contains:(e,t)=>p(t)&&f(e,"contains",t)},D=new Set([...Object.keys(A),...Object.keys(x),"between"]);function g(e,t){let n=d(t);return n?e.filter(s=>s===n||s.startsWith(`${n}/`)).length:0}function S(e,t){return e.length===0?0:g(e,t)/e.length}var M={categoryViews:(e,t)=>g(e.recentCategories,t),categoryShare:(e,t)=>S(e.recentCategories,t),browseViews:(e,t)=>g(e.recentBrowse,t),browseShare:(e,t)=>S(e.recentBrowse,t)};function q(e,t){let n=e.indexOf(".");if(n>0){let r=e.slice(0,n),c=e.slice(n+1);if(r==="campaign"){let o=y.includes(c)?t.campaign?.[c]:null;return typeof o=="string"?o:null}let i=M[r];return i&&c?i(t,c):null}let s=t[e];return typeof s=="number"?s:null}function w(e,t){let n=q(e.field,t);if(n===null)return!1;if(typeof n=="string"){let r=x[e.operator];return r?r(n,e.value):!1}if(e.operator==="between")return typeof e.value=="number"&&typeof e.value2=="number"&&n>=e.value&&n<=e.value2;let s=A[e.operator];return!s||typeof e.value!="number"?!1:s(n,e.value)}function v(e,t){let n=e.rules??[];if(n.length===0)return!1;let s=new Map;for(let i of n){let o=i.group??0,a=s.get(o);a?a.push(i):s.set(o,[i])}let r=e.groupOperators??[],c=[];for(let[i,o]of s)c.push(r[i]==="OR"?o.some(a=>w(a,t)):o.every(a=>w(a,t)));return e.groupJoin==="OR"?c.some(Boolean):c.every(Boolean)}function O(e,t){if(!Array.isArray(t))return e;let n=new Set(t),s=e.recentBrowseCategories??[],r=(e.recentBrowse??[]).filter((i,o)=>n.has(s[o])),c=Object.entries(e.listViewsByCategory??{}).reduce((i,[o,a])=>n.has(o)?i+a:i,0);return{...e,recentBrowse:r,listViews:c}}var R=100,C=128,_=e=>typeof e=="string"&&e!==""&&e.length<=C,l=new WeakMap;function m(e){if(!l.has(e)){let t=e.datafile().then(n=>n.status===200?n.body:null).catch(()=>null);l.set(e,t),t.then(n=>{!n&&l.get(e)===t&&l.delete(e)})}return l.get(e)}async function b(e,t,n=[],s=[]){let r=await m(e),c=t?.(),i=Array.isArray(r?.session_audiences)?r.session_audiences:[],o=r&&c?I(r,c):[];return E([...o,...s],n,i)}function E(e,t,n){let s=new Map(n.map(o=>[o?.slug,Array.isArray(o?.requires)?o.requires:[]])),r=new Set,c=o=>{if(!r.has(o)){r.add(o);for(let a of s.get(o)??[])c(a)}};for(let o of t)c(o);let i=[...new Set(e.filter(_))];return[...i.filter(o=>r.has(o)),...i.filter(o=>!r.has(o))].slice(0,R)}function I(e,t){let n=Array.isArray(e?.session_audiences)?e.session_audiences:[],s=O(t,e.browse_categories??null);return n.filter(r=>_(r?.slug)&&v(r,s)).map(r=>r.slug)}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences")]={prefetch:m,visitAudiences:b};})();
1
+ (()=>{var w=["source","medium","campaign","content","term"];var d=e=>String(e).trim().toLowerCase();function f(e,t,n){let i=d(e),o=d(n);return t==="is"?i===o:t==="contains"&&o!==""&&i.includes(o)}function S(e){return e.trim().toLowerCase().replace(/\s*\/\s*/g,"/").replace(/^\/+|\/+$/g,"")}var O={gte:(e,t)=>e>=t,greater_than_or_equal:(e,t)=>e>=t,">=":(e,t)=>e>=t,lte:(e,t)=>e<=t,less_than_or_equal:(e,t)=>e<=t,"<=":(e,t)=>e<=t,eq:(e,t)=>e===t,equals:(e,t)=>e===t,"=":(e,t)=>e===t},p=e=>typeof e=="string",u=(e,t)=>p(t)&&f(e,"is",t),x={eq:u,equals:u,"=":u,neq:(e,t)=>p(t)&&!u(e,t),in:(e,t)=>Array.isArray(t)&&t.some(n=>u(e,n)),contains:(e,t)=>p(t)&&f(e,"contains",t)},g={in:(e,t)=>t.some(n=>e.includes(n)),not_in:(e,t)=>!t.some(n=>e.includes(n)),all:(e,t)=>t.every(n=>e.includes(n))},G=new Set([...Object.keys(O),...Object.keys(x),...Object.keys(g),"between"]);function m(e,t){let n=S(t);return n?e.filter(i=>i===n||i.startsWith(`${n}/`)).length:0}function A(e,t){return e.length===0?0:m(e,t)/e.length}var j={categoryViews:(e,t)=>m(e.recentCategories,t),categoryShare:(e,t)=>A(e.recentCategories,t),browseViews:(e,t)=>m(e.recentBrowse,t),browseShare:(e,t)=>A(e.recentBrowse,t)};function I(e,t){let n=e.indexOf(".");if(n>0){let o=e.slice(0,n),s=e.slice(n+1);if(o==="campaign"){let r=w.includes(s)?t.campaign?.[s]:null;return typeof r=="string"?r:null}if(o==="answer"){let{answers:r}=t;return!r||typeof r!="object"?null:Object.hasOwn(r,s)&&Array.isArray(r[s])?r[s]:[]}let c=j[o];return c&&s?c(t,s):null}let i=t[e];return typeof i=="number"?i:null}function v(e,t){let n=I(e.field,t);if(n===null)return!1;if(Array.isArray(n))return Array.isArray(e.value)&&e.value.length>0&&Object.hasOwn(g,e.operator)&&g[e.operator](n,e.value);if(typeof n=="string"){let o=x[e.operator];return o?o(n,e.value):!1}if(e.operator==="between")return typeof e.value=="number"&&typeof e.value2=="number"&&n>=e.value&&n<=e.value2;let i=O[e.operator];return!i||typeof e.value!="number"?!1:i(n,e.value)}function y(e,t){let n=e.rules??[];if(n.length===0)return!1;let i=new Map;for(let c of n){let r=c.group??0,a=i.get(r);a?a.push(c):i.set(r,[c])}let o=e.groupOperators??[],s=[];for(let[c,r]of i)s.push(o[c]==="OR"?r.some(a=>v(a,t)):r.every(a=>v(a,t)));return e.groupJoin==="OR"?s.some(Boolean):s.every(Boolean)}function _(e,t){return e.early===!0&&Array.isArray(e.answer_rules)&&typeof t?.answers=="object"&&y({...e,rules:[...e.rules??[],...e.answer_rules]},t)}function b(e,t){if(!Array.isArray(t))return e;let n=new Set(t),i=e.recentBrowseCategories??[],o=(e.recentBrowse??[]).filter((c,r)=>n.has(i[r])),s=Object.entries(e.listViewsByCategory??{}).reduce((c,[r,a])=>n.has(r)?c+a:c,0);return{...e,recentBrowse:o,listViews:s}}var N=100,T=128,q=e=>typeof e=="string"&&e!==""&&e.length<=T,l=new WeakMap;function h(e){if(!l.has(e)){let t=e.datafile().then(n=>n.status===200?n.body:null).catch(()=>null);l.set(e,t),t.then(n=>{!n&&l.get(e)===t&&l.delete(e)})}return l.get(e)}async function E(e,t,n=[],i=[]){let o=await h(e),s=t?.(),c=Array.isArray(o?.session_audiences)?o.session_audiences:[],r=o&&s?M(o,s):[],a=R([...r,...i],n,c),C=o&&s?M(o,s,_):[];return{claims:a,answered:R(C,n,c)}}function R(e,t,n){let i=new Map(n.map(r=>[r?.slug,Array.isArray(r?.requires)?r.requires:[]])),o=new Set,s=r=>{if(!o.has(r)){o.add(r);for(let a of i.get(r)??[])s(a)}};for(let r of t)s(r);let c=[...new Set(e.filter(q))];return[...c.filter(r=>o.has(r)),...c.filter(r=>!o.has(r))].slice(0,N)}function M(e,t,n=y){let i=Array.isArray(e?.session_audiences)?e.session_audiences:[],o=b(t,e.browse_categories??null);return i.filter(s=>q(s?.slug)&&n(s,o)).map(s=>s.slug)}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences")]={prefetch:h,visitAudiences:E};})();
@@ -1 +1 @@
1
- (()=>{function E(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var G=new Map;function x(e,s){return window[s]?Promise.resolve(window[s]):e?(G.has(s)||G.set(s,new Promise((n,i)=>{let u=document.createElement("script");u.src=e,u.async=!0,u.onload=()=>window[s]?n(window[s]):i(new Error(`${e} did not register`)),u.onerror=()=>i(new Error(`${e} did not load`)),document.head.append(u)}).finally(()=>G.delete(s))),G.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var nt=E("onsite-answers.min.js"),ge=()=>x(nt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var st="/v1/capture/challenge",ot=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:st;function we(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),i=s.servingHost??e.servingHost,u=s.gatewayHost??e.gatewayHost;async function r(p,{method:f="GET",body:o,consent:a=!1,timeoutMs:c}={}){if(!n)return{status:0,body:null};try{let y=await n(p,{method:f,credentials:"omit",signal:c&&AbortSignal.timeout?.(c),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...o?{"content-type":"application/json"}:{},...a?e.headers():{}},...o?{body:JSON.stringify(o)}:{}}),_=null;try{_=await y.json()}catch{}return{status:y.status,body:_}}catch{return{status:0,body:null}}}return{decide:(p,f,{visitAudiences:o,visitCampaign:a,visitContext:c,timeoutMs:y=3e3}={})=>r(`${i}/v1/decisions`,{method:"POST",consent:!0,timeoutMs:Math.max(1,y),body:{slots:[f?{key:p,pin:{experiment:f[0],arm:f[1],split:f[2]}}:p],library:e.library,identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,identity_token:e.identityToken?.()??void 0,...e.preview?{preview:e.preview}:{},...o?{visit_audiences:o}:{},...a?{visit_campaign:a}:{},...c?{visit_context:c}:{}}}),datafile:()=>r(`${i}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>r(`${u}${ot(s.challenge)}`),capture:p=>r(`${u}/v1/capture`,{method:"POST",body:p}),answers:p=>r(`${u}/v1/capture/answers`,{method:"POST",body:p}),claim:p=>r(`${i}/v1/offers/claim`,{method:"POST",consent:!0,body:p,timeoutMs:8e3})}}var it=E("onsite-audiences.min.js"),ye=()=>x(it,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function be(e,s){let n={},i=()=>{try{let r=JSON.parse(e().getItem(s));r&&typeof r=="object"&&(n=r)}catch{}return n};return{read:i,write:r=>{let p=i();r(p),n=p;try{e().setItem(s,JSON.stringify(p))}catch{}}}}function Se(e,s=()=>!0){let n=be(()=>sessionStorage,e),i=be(()=>localStorage,e),u=()=>s()?i:n,r=()=>{let o=i.read();(o.sub!==void 0||o.k!==void 0)&&i.write(a=>{delete a.sub,delete a.k})},p=()=>s()?[n.read(),i.read()]:(r(),[n.read()]),f=(o,a)=>{var c;return o.f??(o.f={}),(c=o.f)[a]??(c[a]={}),o.f[a]};return{seen(o){let a=i.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:a.n??0,closedAt:a.c??null,submitted:a.s===1}},subscribed:()=>p().some(o=>o.sub===1),shown(o){n.write(a=>{let c=f(a,o);c.n=(c.n??0)+1}),i.write(a=>{let c=f(a,o);c.n=(c.n??0)+1})},closed(o,a=Date.now()){i.write(c=>{f(c,o).c=a})},tab(o,a){n.write(c=>{let y=f(c,o);a?y.t=1:delete y.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,a){if(a===void 0)return n.read().f?.[o]?.p??null;n.write(c=>{f(c,o).p=a})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(a=>{a.o=o})},code(o,a=Date.now()){if(o===void 0){let[c]=p().flatMap(y=>y.k?[y.k]:[]).sort((y,_)=>_.at-y.at);return c&&a-c.at<14*864e5?c.c:null}return u().write(c=>{c.k={c:o,at:a}}),o},submitted(o){i.write(a=>{f(a,o).s=1}),u().write(a=>{a.sub=1})}}}var rt=E("onsite-products.min.js"),V=()=>x(rt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products"));var lt=E("onsite-render.min.js"),_e=()=>x(lt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var at=["source","medium","campaign","content","term"];var Ae=e=>String(e).trim().toLowerCase();function ct(e,s,n){let i=Ae(e),u=Ae(n);return s==="is"?i===u:s==="contains"&&u!==""&&i.includes(u)}function ve(e,s){return(Array.isArray(e)?e:[]).every(n=>{let i=s?.[n?.field];return!at.includes(n?.field)||typeof i!="string"?!1:[].concat(n.values??[]).some(u=>ct(i,n.match,u))})}var Me=["popup","sheet","bar","teaser","inline","fullscreen"],ut=["entry","exit","scroll","time","idle","inline","manual"],oe=e=>e!=="inline",Ie=e=>e==="popup"||e==="sheet"||e==="fullscreen",v=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],Ee=e=>Number.isInteger(e)&&e>=0?e:null,dt={field:null,match:null,values:[]},pt=e=>e==null?[]:Array.isArray(e)&&e.every(v)?e:[dt];function Ce(e){if(!v(e)||typeof e.slot!="string"||e.slot==="")return null;let s=v(e.trigger)?e.trigger:{};if(!Me.includes(e.format)||!ut.includes(s.type))return null;let n=v(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:v(e.pages)?e.pages:{},devices:j(e.devices),aliases:j(e.aliases),audiences:j(e.audiences),arrived_from:pt(e.arrived_from),caps:{per_session:Ee(n.per_session),lifetime:Ee(n.lifetime),after_close_days:Number.isFinite(n.after_close_days)?n.after_close_days:null},window:v(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(v):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(v):[]}}var ft=/^[a-z][a-z0-9_-]{0,31}$/;function Oe(e){if(!v(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>v(n)&&ft.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:Me.includes(e.format)?e.format:null,theme:v(e.theme)?e.theme:{},steps:s}}function xe(e,s){let n=String(e).split("*").map(i=>i.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function ht(e,s){let n=j(e?.include);return(!n.length||n.some(i=>xe(i,s)))&&!j(e?.exclude).some(i=>xe(i,s))}function De(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var Te=e=>typeof e=="string"?Date.parse(e):Number.NaN,U=e=>e.trigger.type==="manual";function ie(e,s){let n=[];ht(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),ve(e.arrived_from,s.campaign)||n.push("not from its campaign");let i=Te(e.window.starts_at),u=Te(e.window.ends_at);if((s.now<i||s.now>=u)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(s.personalisation?s.audiences&&!e.audiences.some(f=>s.audiences.includes(f))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview||s.asked||U(e))return n;let{seen:r}=s,{caps:p}=e;return r.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),p.per_session!==null&&r.session>=p.per_session&&n.push("per_session cap"),p.lifetime!==null&&r.lifetime>=p.lifetime&&n.push("lifetime cap"),p.after_close_days!==null&&r.closedAt&&s.now-r.closedAt<p.after_close_days*864e5&&n.push("closed recently"),n}var $e=(e,s)=>s.priority-e.priority;var mt=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function gt(){let e=[];return{on:(i,u,r,p={passive:!0})=>{i.addEventListener(u,r,p),e.push(()=>i.removeEventListener(u,r,p))},later:(i,u)=>{let r=setTimeout(i,u);e.push(()=>clearTimeout(r))},stop:()=>{for(let i of e.splice(0))i()}}}var Ne=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},wt=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function yt({on:e,later:s},n,i,u,r){let p=!1,f=!1,o=null,a=0;s(()=>{p=!0},i.delay_ms??5e3),e(r,"mousemove",c=>{c.clientY>u.innerHeight*.1&&(f=!0),o!==null&&(a=c.clientY-o),o=c.clientY}),e(r,"mouseout",c=>{p&&f&&!c.relatedTarget&&c.clientY<=0&&a<0&&!wt(r)&&n("exit")})}function bt({on:e,later:s},n,i,u,r){let p=!1,f=0,o=u.scrollY,a=Date.now(),c=null,y=null;s(()=>{p=!0},i.delay_ms??5e3),e(u,"scroll",()=>{let _=u.scrollY,T=Date.now();if(f=Math.max(f,Ne(u,r)),_<o){(!c||T-c.t>300)&&(c={y:o,t:a});let M=c.y-_;p&&f>=.3&&M>=120&&M/Math.max(1,T-c.t)>=.5&&n("exit_scroll")}else c=null;o=_,a=T}),e(r,"visibilitychange",()=>{r.visibilityState==="hidden"?y=Date.now():y!==null&&Date.now()-y>=1e4&&n("return"),r.visibilityState!=="hidden"&&(y=null)})}function Pe(e,s,{device:n,win:i=window,doc:u=document}){let r=gt(),p=(e.seconds??30)*1e3;if(e.type==="entry"&&r.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&r.later(()=>s("time"),p),e.type==="exit"&&(n==="mobile"?bt:yt)(r,s,e,i,u),e.type==="scroll"){let f=e.depth??.5;r.on(i,"scroll",()=>Ne(i,u)>=f&&s("scroll"))}if(e.type==="idle"){let f=null,o=()=>{clearTimeout(f),f=setTimeout(()=>s("idle"),p)};o();for(let a of mt)r.on(a==="scroll"?i:u,a,o);return r.on(u,"visibilitychange",o),()=>{clearTimeout(f),r.stop()}}return r.stop}var St=E("onsite-wheel.min.js"),ke=()=>x(St,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Le=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),W=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),_t=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),At=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Re=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Fe={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},vt=new Set(["decision-failed","no-creative","no-code","renderer-failed","products-failed","error"]),je=3e3,Ue={status:0,body:null},Et=1500,We=50,xt=300,Tt=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}},Mt=e=>Array.isArray(e?.steps)&&e.steps.some(s=>Array.isArray(s?.blocks)&&s.blocks.some(n=>n?.t==="products"));function Ke(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[W])return window[W];let n=typeof e?.[Le]=="function"?e[Le]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let i=s.settings??n.settings??{},u=we(n,{...s,challenge:i.capture?.challenge}),r=n.preview?Fe:Se(n.storageKey,n.personalisation),p=()=>n.campaign?.()??null,f=new Map,o=()=>window[Re]?.size>0,a=(t,l)=>{for(let d of window[At]?.[t]??[])try{d(l)}catch(h){console.warn(`[hp] onsite ${t} listener failed:`,h)}},c=De(window),y=n.debug||s.debug===!0||Tt(),_=new Map,T=new Map,M=[];for(let t of Array.isArray(i.forms)?i.forms:[]){let l=Ce(t);l?M.push(l):_.set(String(t?.slot??`form ${_.size+1}`),{slot:String(t?.slot??""),state:"invalid",code:"invalid",reasons:["not a form this SDK can show"]})}let re=()=>ye().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&M.some(t=>t.audiences.length>0)&&re().then(t=>t?.prefetch(u));let N=new Map,K=new Map,I=null,le=!1,ae=new Set,He=t=>{for(let l of N.keys()){let d=f.get(l);if(!t||!d||d.modal?.())return l}return null},H=null,q=new Set,B=Number.isInteger(i.overlay_gap_minutes)?i.overlay_gap_minutes:0,Ye=()=>{let t=r.coveredAt();if(!(B>0)||typeof t!="number")return null;let l=Math.max(0,Math.floor((Date.now()-t)/6e4));return l<B?`a popup showed ${l} min ago; ${B} min between them`:null},P=new Set,Y=new Map,b=(t,l,d,h=[])=>(_.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:l,code:d,reasons:h}),y&&console.info(`[hp] onsite ${t.slot}: ${l}${h.length?` (${h.join("; ")})`:""}`),{state:l,code:d}),D=(t,l,d,h)=>(N.delete(t.slot),b(t,l,d,h)),k=(t,l,d)=>{let h;return Promise.race([t,new Promise(w=>{h=setTimeout(w,l-Date.now(),d)})]).then(w=>Date.now()>l?d:w).finally(()=>clearTimeout(h))},Xe=(t,l)=>{le||o()||(I??(I=t.slot),a("nothing",{slot:t.slot,format:t.format,code:l}))},ce=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},ue=t=>({path:location.pathname,device:c,campaign:p(),now:Date.now(),seen:r.seen(t.slot),subscribed:r.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:ce()}),J=t=>{T.get(t.slot)?.(),T.delete(t.slot)};function L(t,l,d=!1,h=U(t),w=Date.now()+je){if(f.has(t.slot))return Promise.resolve({state:"shown",code:"shown",asked:h});let g=K.get(t.slot);return g?(g.asked||(g.asked=h),g.done):(g={asked:h},g.done=ze(t,l,d,h,w).catch(A=>f.has(t.slot)?{state:"shown",code:"shown"}:(console.warn("[hp] onsite form failed:",A?.message??A),D(t,"not shown","error",[`failed: ${A?.message??A}`]))).then(A=>(K.delete(t.slot),{...A,asked:g.asked||g.opened})),K.set(t.slot,g),g.done)}async function ze(t,l,d,h,w){if(o())return b(t,"not shown","suppressed",[`suppressed: ${[...window[Re]].join(", ")}`]);let g=ie(t,{...ue(t),...d?{seen:Fe.seen()}:{},asked:h});if(g.length)return b(t,"not eligible","not-eligible",g);let A=Ie(t.format)&&!d,C=A&&!h&&Ye();if(C)return b(t,"not shown","overlay-gap",[C]);if(A&&!n.preview&&n.consentAnswered?.()===!1)return Y.set(t,h),b(t,"not shown","awaiting-consent",["waiting for the consent banner"]);let O=oe(t.format),pe=O&&He(h);if(pe)return b(t,"not shown","another-showing",[`${pe} is showing`]);if(O&&I&&!h)return b(t,"not shown","allowance-spent",[`${I} already showed on this page view`]);let X=null;if(!O){try{X=document.querySelector(t.trigger.selector??"")}catch{X=null}if(!X)return b(t,"not shown","no-element",["no element matches its selector"])}O&&N.set(t.slot,t),J(t),b(t,"asking for a decision","deciding",[l]);let Be=_e().catch(m=>(console.warn("[hp] onsite renderer not loaded:",m?.message??m),null)),z=t.visit_context===!0?V().catch(()=>null):null,Q=ce()??[],fe=[...new Set([...t.audiences,...Q])].filter(m=>Q.includes(m)).slice(0,100),Je=t.audiences.length>0&&!n.preview&&n.personalisation()?await k(re().then(m=>m?m.visitAudiences(u,n.sessionSignals,t.audiences,Q):fe),Math.min(w,Date.now()+Et),fe):null,F=Date.now()<w?await k(u.decide(t.slot,r.pin(t.slot),{visitAudiences:Je,visitCampaign:t.arrived_from.length?p():null,visitContext:t.visit_context===!0?n.visitContext?.()??null:null,timeoutMs:w-Date.now()}),w,Ue):Ue,ee=F.status===200?F.body?.decisions:null,S=Array.isArray(ee)?ee.find(m=>m?.slot===t.slot):null;S?.experiment&&S.arm&&S.split&&r.pin(t.slot,[S.experiment,S.arm,S.split]);let $=S&&S.holdout!==!0?Oe(S.payload):null,he=$?.steps[0].blocks??[],me=S?.offer?.code??(n.preview?"PREVIEW":r.code()),Ze=n.basketValue?.()??null,te=he.some(m=>m?.t==="code")&&!me&&"no code to remind of"||he.some(m=>m?.t==="progress")&&!(Ze>0)&&"the basket is empty";if(te){let m=te==="the basket is empty";return m&&P.add(t),D(t,"not shown",m?"empty-basket":"no-code",[te])}if(P.delete(t),!$){let m=S?.holdout===!0;return m&&n.analytics()&&e.recordExposure(F.body),O&&m&&(I??(I=t.slot)),m&&!h&&a("held",{slot:t.slot,arm:S.arm??null,format:t.format}),m||Array.isArray(ee)?D(t,m?"held out":"no decision",m?"held-out":"no-creative",["no creative for this visitor"]):D(t,"no decision","decision-failed",[`decisions answered ${F.status}`])}let ne=await k(Be,w,null);if(!ne)return D(t,"not shown","renderer-failed",["the renderer did not load"]);if(Mt($)&&(z??(z=V().catch(()=>null)),!await k(z,w,null)))return D(t,"not shown","products-failed",["its products did not load"]);if(await k(ne.warm?.(t,$,$.steps[0].id,ae),Math.min(w,Date.now()+xt)),o())return D(t,"not shown","suppressed",["suppressed"]);let se=(m,tt={})=>a(m,{slot:t.slot,arm:S.arm??null,format:$.format??t.format,...tt}),Qe=ne.mountForm({form:t,creative:$,decision:S,access:n,client:e,api:u,counters:r,loadWheel:ke,loadAnswers:ge,loadProducts:()=>z??V(),container:X,warmed:ae,coupon:me,basket:()=>n.basketValue?.()??null,emit:se,onClose(m){f.delete(t.slot),N.delete(t.slot),b(t,"closed","closed",[m]),se("closed",{reason:m})}});f.set(t.slot,Qe),d||r.shown(t.slot),A&&r.covered(),O&&(I??(I=t.slot)),n.analytics()&&e.recordExposure(F.body);let et=b(t,"shown","shown",[l]);return se("shown"),et}function Z(t,l,d=U(t)){if(!oe(t.format))return L(t,l,!1,d);if(!H){let h={forms:[],taken:new Set,deadline:Date.now()+We+je};H=h,q.add(h),setTimeout(()=>{H=null,Ge(h)},We)}H.forms.push([t,l,d])}async function Ge(t){let l=t.forms.sort(([h],[w])=>$e(h,w)),d=null;for(let[h,[w,g,A]]of l.entries()){if(t.taken.has(w))continue;let C=await L(w,g,!1,A,t.deadline);if(!d&&vt.has(C.code)&&!C.asked&&(d=[w,C.code]),C.state==="shown"||C.state==="held out"){for(let[O]of l.slice(h+1))b(O,"not shown","lower-priority",[`${w.slot} has a higher priority`]);d=null;break}}q.delete(t),d&&Xe(...d)}for(let t of M){if(t.format==="teaser"&&r.tabOut(t.slot)){L(t,"tab kept from an earlier page",!0);continue}let l=ie(t,ue(t));if(l.length){b(t,"not eligible","not-eligible",l);continue}let d=t.trigger.type;d==="manual"?b(t,"waiting for hp.onsite.open","waiting-for-open"):d==="inline"||t.format==="inline"?L(t,"inline"):de(t)}function de(t){J(t),T.set(t.slot,Pe(t.trigger,l=>{J(t),Z(t,l)},{device:c})),b(t,"armed","armed",[`${t.trigger.type} on ${c}`])}let Ve=n.onConsentAnswered?.(()=>{let t=[...Y];Y.clear();for(let[l,d]of t)f.has(l.slot)||(d?Z(l,"manual",d):de(l))}),qe=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...P];P.clear();for(let l of t)f.has(l.slot)||Z(l,"the basket changed")}),R=Object.freeze({open(t){let l=M.find(g=>g.slot===t),d=l??M.find(g=>g.aliases.includes(t));if(!d)return Promise.resolve(!1);if(f.has(d.slot))return Promise.resolve(!0);for(let g of q)g.taken.add(d);let h=L(d,"manual",!1,U(d)||!l),w=K.get(d.slot);return w&&(w.opened=!0),h.then(({state:g})=>g==="shown")},suppress(){for(let[t,l]of f){l.destroy(),f.delete(t),N.delete(t);let d=M.find(h=>h.slot===t);d&&b(d,"closed","suppressed",["suppressed"])}},debug:()=>[..._.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){le=!0;for(let t of T.values())t();T.clear(),qe?.(),Ve?.(),P.clear(),Y.clear(),window[W]===R&&delete window[W]}});window[W]=R;for(let{slot:t,resolve:l}of window[_t]?.splice(0)??[])l(R.open(t));return y&&console.table?.(R.debug()),R}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Ke};})();
1
+ (()=>{function x(e){let s=typeof document>"u"?null:document.currentScript?.src;return s?new URL(e,s).href:null}var G=new Map;function T(e,s){return window[s]?Promise.resolve(window[s]):e?(G.has(s)||G.set(s,new Promise((n,r)=>{let p=document.createElement("script");p.src=e,p.async=!0,p.onload=()=>window[s]?n(window[s]):r(new Error(`${e} did not register`)),p.onerror=()=>r(new Error(`${e} did not load`)),document.head.append(p)}).finally(()=>G.delete(s))),G.get(s)):Promise.reject(new Error("the CDN script\u2019s own URL is unknown"))}var nt=x("onsite-answers.min.js"),ge=()=>T(nt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.answers"));var st="/v1/capture/challenge",ot=e=>typeof e=="string"&&/^\/v1\/[\w/-]+$/.test(e)?e:st;function me(e,s={}){let n=s.fetch??globalThis.fetch?.bind(globalThis),r=s.servingHost??e.servingHost,p=s.gatewayHost??e.gatewayHost;async function l(c,{method:o="GET",body:i,consent:u=!1,timeoutMs:y}={}){if(!n)return{status:0,body:null};try{let S=await n(c,{method:o,credentials:"omit",signal:y&&AbortSignal.timeout?.(y),headers:{accept:"application/json",authorization:`Bearer ${e.writeKey}`,...i?{"content-type":"application/json"}:{},...u?e.headers():{}},...i?{body:JSON.stringify(i)}:{}}),A=null;try{A=await S.json()}catch{}return{status:S.status,body:A}}catch{return{status:0,body:null}}}let h=(c,o)=>l(`${p}/v1/capture${c}`,{method:"POST",body:o}).then(i=>(i.status>=200&&i.status<300&&e.answered?.(o.answers,o.slot),i));return{decide:(c,o,{visitAudiences:i,visitCampaign:u,visitContext:y,timeoutMs:S=3e3}={})=>l(`${r}/v1/decisions`,{method:"POST",consent:!0,timeoutMs:Math.max(1,S),body:{slots:[o?{key:c,pin:{experiment:o[0],arm:o[1],split:o[2]}}:c],library:e.library,identifier_value:e.anonymousId()??void 0,session_id:e.sessionId()??void 0,identity_token:e.identityToken?.()??void 0,...e.preview?{preview:e.preview}:{},...i&&{visit_audiences:i.claims,...i.answered?.length&&{answered_audiences:i.answered}},...u?{visit_campaign:u}:{},...y?{visit_context:y}:{}}}),datafile:()=>l(`${r}/v1/audiences/datafile`,{timeoutMs:1500}),challenge:()=>l(`${p}${ot(s.challenge)}`),capture:c=>h("",c),answers:c=>h("/answers",c),claim:c=>l(`${r}/v1/offers/claim`,{method:"POST",consent:!0,body:c,timeoutMs:8e3})}}var it=x("onsite-audiences.min.js"),ye=()=>T(it,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.audiences"));function be(e,s){let n={},r=()=>{try{let l=JSON.parse(e().getItem(s));l&&typeof l=="object"&&(n=l)}catch{}return n};return{read:r,write:l=>{let h=r();l(h),n=h;try{e().setItem(s,JSON.stringify(h))}catch{}}}}function Se(e,s=()=>!0){let n=be(()=>sessionStorage,e),r=be(()=>localStorage,e),p=()=>s()?r:n,l=()=>{let o=r.read();(o.sub!==void 0||o.k!==void 0)&&r.write(i=>{delete i.sub,delete i.k})},h=()=>s()?[n.read(),r.read()]:(l(),[n.read()]),c=(o,i)=>{var u;return o.f??(o.f={}),(u=o.f)[i]??(u[i]={}),o.f[i]};return{seen(o){let i=r.read().f?.[o]??{};return{session:n.read().f?.[o]?.n??0,lifetime:i.n??0,closedAt:i.c??null,submitted:i.s===1}},subscribed:()=>h().some(o=>o.sub===1),shown(o){n.write(i=>{let u=c(i,o);u.n=(u.n??0)+1}),r.write(i=>{let u=c(i,o);u.n=(u.n??0)+1})},closed(o,i=Date.now()){r.write(u=>{c(u,o).c=i})},tab(o,i){n.write(u=>{let y=c(u,o);i?y.t=1:delete y.t})},tabOut:o=>n.read().f?.[o]?.t===1,pin(o,i){if(i===void 0)return n.read().f?.[o]?.p??null;n.write(u=>{c(u,o).p=i})},coveredAt:()=>n.read().o??null,covered(o=Date.now()){n.write(i=>{i.o=o})},code(o,i=Date.now()){if(o===void 0){let[u]=h().flatMap(y=>y.k?[y.k]:[]).sort((y,S)=>S.at-y.at);return u&&i-u.at<14*864e5?u.c:null}return p().write(u=>{u.k={c:o,at:i}}),o},submitted(o){r.write(i=>{c(i,o).s=1}),p().write(i=>{i.sub=1})}}}var rt=x("onsite-products.min.js"),V=()=>T(rt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.products"));var lt=x("onsite-render.min.js"),_e=()=>T(lt,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.render"));var at=["source","medium","campaign","content","term"];var Ae=e=>String(e).trim().toLowerCase();function ct(e,s,n){let r=Ae(e),p=Ae(n);return s==="is"?r===p:s==="contains"&&p!==""&&r.includes(p)}function ve(e,s){return(Array.isArray(e)?e:[]).every(n=>{let r=s?.[n?.field];return!at.includes(n?.field)||typeof r!="string"?!1:[].concat(n.values??[]).some(p=>ct(r,n.match,p))})}var Me=["popup","sheet","bar","teaser","inline","fullscreen"],ut=["entry","exit","scroll","time","idle","inline","manual"],oe=e=>e!=="inline",Ie=e=>e==="popup"||e==="sheet"||e==="fullscreen",E=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),j=e=>Array.isArray(e)?e.filter(s=>typeof s=="string"):[],Ee=e=>Number.isInteger(e)&&e>=0?e:null,dt={field:null,match:null,values:[]},pt=e=>e==null?[]:Array.isArray(e)&&e.every(E)?e:[dt];function Ce(e){if(!E(e)||typeof e.slot!="string"||e.slot==="")return null;let s=E(e.trigger)?e.trigger:{};if(!Me.includes(e.format)||!ut.includes(s.type))return null;let n=E(e.caps)?e.caps:{};return{...e,trigger:s,priority:Number.isFinite(e.priority)?e.priority:0,pages:E(e.pages)?e.pages:{},devices:j(e.devices),aliases:j(e.aliases),audiences:j(e.audiences),arrived_from:pt(e.arrived_from),caps:{per_session:Ee(n.per_session),lifetime:Ee(n.lifetime),after_close_days:Number.isFinite(n.after_close_days)?n.after_close_days:null},window:E(e.window)?e.window:{},questions:Array.isArray(e.questions)?e.questions.filter(E):[],prizes:Array.isArray(e.prizes)?e.prizes.filter(E):[]}}var ft=/^[a-z][a-z0-9_-]{0,31}$/;function Oe(e){if(!E(e)||e.v!==1||!Array.isArray(e.steps))return null;let s=e.steps.filter(n=>E(n)&&ft.test(n.id)&&Array.isArray(n.blocks));return s.length===0?null:{format:Me.includes(e.format)?e.format:null,theme:E(e.theme)?e.theme:{},steps:s}}function xe(e,s){let n=String(e).split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${n}$`,"i").test(s)}function ht(e,s){let n=j(e?.include);return(!n.length||n.some(r=>xe(r,s)))&&!j(e?.exclude).some(r=>xe(r,s))}function De(e){return e.matchMedia?.("(hover: none) and (pointer: coarse)")?.matches===!0||e.innerWidth<768?"mobile":"desktop"}var Te=e=>typeof e=="string"?Date.parse(e):Number.NaN,U=e=>e.trigger.type==="manual";function ie(e,s){let n=[];ht(e.pages,s.path)||n.push("page not included"),e.devices.length&&!e.devices.includes(s.device)&&n.push(`not on ${s.device}`),ve(e.arrived_from,s.campaign)||n.push("not from its campaign");let r=Te(e.window.starts_at),p=Te(e.window.ends_at);if((s.now<r||s.now>=p)&&n.push("outside its dates"),e.audiences.length&&!s.preview&&(s.personalisation?s.audiences&&!e.audiences.some(c=>s.audiences.includes(c))&&n.push("not in its audiences"):n.push("audiences need personalisation consent")),s.preview||s.asked||U(e))return n;let{seen:l}=s,{caps:h}=e;return l.submitted&&n.push("already submitted"),e.exclude_subscribed===!0&&s.subscribed&&n.push("already subscribed"),h.per_session!==null&&l.session>=h.per_session&&n.push("per_session cap"),h.lifetime!==null&&l.lifetime>=h.lifetime&&n.push("lifetime cap"),h.after_close_days!==null&&l.closedAt&&s.now-l.closedAt<h.after_close_days*864e5&&n.push("closed recently"),n}var $e=(e,s)=>s.priority-e.priority;var wt=["mousemove","pointerdown","keydown","scroll","touchstart","wheel"];function gt(){let e=[];return{on:(r,p,l,h={passive:!0})=>{r.addEventListener(p,l,h),e.push(()=>r.removeEventListener(p,l,h))},later:(r,p)=>{let l=setTimeout(r,p);e.push(()=>clearTimeout(l))},stop:()=>{for(let r of e.splice(0))r()}}}var Ne=(e,s)=>{let n=s.documentElement.scrollHeight||0;return n>0?(e.scrollY+e.innerHeight)/n:0},mt=e=>{let s=e.activeElement;return!!(s&&(/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)||s.isContentEditable))};function yt({on:e,later:s},n,r,p,l){let h=!1,c=!1,o=null,i=0;s(()=>{h=!0},r.delay_ms??5e3),e(l,"mousemove",u=>{u.clientY>p.innerHeight*.1&&(c=!0),o!==null&&(i=u.clientY-o),o=u.clientY}),e(l,"mouseout",u=>{h&&c&&!u.relatedTarget&&u.clientY<=0&&i<0&&!mt(l)&&n("exit")})}function bt({on:e,later:s},n,r,p,l){let h=!1,c=0,o=p.scrollY,i=Date.now(),u=null,y=null;s(()=>{h=!0},r.delay_ms??5e3),e(p,"scroll",()=>{let S=p.scrollY,A=Date.now();if(c=Math.max(c,Ne(p,l)),S<o){(!u||A-u.t>300)&&(u={y:o,t:i});let M=u.y-S;h&&c>=.3&&M>=120&&M/Math.max(1,A-u.t)>=.5&&n("exit_scroll")}else u=null;o=S,i=A}),e(l,"visibilitychange",()=>{l.visibilityState==="hidden"?y=Date.now():y!==null&&Date.now()-y>=1e4&&n("return"),l.visibilityState!=="hidden"&&(y=null)})}function Pe(e,s,{device:n,win:r=window,doc:p=document}){let l=gt(),h=(e.seconds??30)*1e3;if(e.type==="entry"&&l.later(()=>s("entry"),e.delay_ms??0),e.type==="time"&&l.later(()=>s("time"),h),e.type==="exit"&&(n==="mobile"?bt:yt)(l,s,e,r,p),e.type==="scroll"){let c=e.depth??.5;l.on(r,"scroll",()=>Ne(r,p)>=c&&s("scroll"))}if(e.type==="idle"){let c=null,o=()=>{clearTimeout(c),c=setTimeout(()=>s("idle"),h)};o();for(let i of wt)l.on(i==="scroll"?r:p,i,o);return l.on(p,"visibilitychange",o),()=>{clearTimeout(c),l.stop()}}return l.stop}var St=x("onsite-wheel.min.js"),ke=()=>T(St,Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.wheel"));var Le=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite-access"),W=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite"),_t=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.pending"),At=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.listeners"),Re=Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.suppressed"),Fe={seen:()=>({session:0,lifetime:0,closedAt:null,submitted:!1}),subscribed:()=>!1,shown(){},closed(){},submitted(){},tab(){},tabOut:()=>!1,pin:()=>null,coveredAt:()=>null,covered(){},code:()=>null},vt=new Set(["decision-failed","no-creative","no-code","renderer-failed","products-failed","error"]),je=3e3,Ue={status:0,body:null},Et=1500,We=50,xt=300,Tt=()=>{try{return new URLSearchParams(location.search).get("hp_debug")==="onsite"}catch{return!1}},Mt=e=>Array.isArray(e?.steps)&&e.steps.some(s=>Array.isArray(s?.blocks)&&s.blocks.some(n=>n?.t==="products"));function Ke(e,s={}){if(typeof window>"u"||typeof document>"u")return null;if(window[W])return window[W];let n=typeof e?.[Le]=="function"?e[Le]():null;if(!n)return console.warn("[hp] onsite: startOnsite needs the client bootstrap or createAnalytics made"),null;let r=s.settings??n.settings??{};n.started?.(r);let p=me(n,{...s,challenge:r.capture?.challenge}),l=n.preview?Fe:Se(n.storageKey,n.personalisation),h=()=>n.campaign?.()??null,c=new Map,o=()=>window[Re]?.size>0,i=(t,a)=>{for(let d of window[At]?.[t]??[])try{d(a)}catch(f){console.warn(`[hp] onsite ${t} listener failed:`,f)}},u=De(window),y=n.debug||s.debug===!0||Tt(),S=new Map,A=new Map,M=[];for(let t of Array.isArray(r.forms)?r.forms:[]){let a=Ce(t);a?M.push(a):S.set(String(t?.slot??`form ${S.size+1}`),{slot:String(t?.slot??""),state:"invalid",code:"invalid",reasons:["not a form this SDK can show"]})}let re=()=>ye().catch(t=>(console.warn("[hp] onsite audiences not loaded:",t?.message??t),null));n.personalisation()&&M.some(t=>t.audiences.length>0)&&re().then(t=>t?.prefetch(p));let N=new Map,K=new Map,I=null,le=!1,ae=new Set,He=t=>{for(let a of N.keys()){let d=c.get(a);if(!t||!d||d.modal?.())return a}return null},H=null,q=new Set,B=Number.isInteger(r.overlay_gap_minutes)?r.overlay_gap_minutes:0,Ye=()=>{let t=l.coveredAt();if(!(B>0)||typeof t!="number")return null;let a=Math.max(0,Math.floor((Date.now()-t)/6e4));return a<B?`a popup showed ${a} min ago; ${B} min between them`:null},P=new Set,Y=new Map,b=(t,a,d,f=[])=>(S.set(t.slot,{slot:t.slot,format:t.format,trigger:t.trigger.type,priority:t.priority,state:a,code:d,reasons:f}),y&&console.info(`[hp] onsite ${t.slot}: ${a}${f.length?` (${f.join("; ")})`:""}`),{state:a,code:d}),D=(t,a,d,f)=>(N.delete(t.slot),b(t,a,d,f)),k=(t,a,d)=>{let f;return Promise.race([t,new Promise(m=>{f=setTimeout(m,a-Date.now(),d)})]).then(m=>Date.now()>a?d:m).finally(()=>clearTimeout(f))},Xe=(t,a)=>{le||o()||(I??(I=t.slot),i("nothing",{slot:t.slot,format:t.format,code:a}))},ce=()=>{try{let t=s.audiences?.();return Array.isArray(t)?t:null}catch{return null}},ue=t=>({path:location.pathname,device:u,campaign:h(),now:Date.now(),seen:l.seen(t.slot),subscribed:l.subscribed()||s.subscribed?.()===!0,personalisation:n.personalisation(),preview:!!n.preview,audiences:ce()}),J=t=>{A.get(t.slot)?.(),A.delete(t.slot)};function L(t,a,d=!1,f=U(t),m=Date.now()+je){if(c.has(t.slot))return Promise.resolve({state:"shown",code:"shown",asked:f});let g=K.get(t.slot);return g?(g.asked||(g.asked=f),g.done):(g={asked:f},g.done=ze(t,a,d,f,m).catch(v=>c.has(t.slot)?{state:"shown",code:"shown"}:(console.warn("[hp] onsite form failed:",v?.message??v),D(t,"not shown","error",[`failed: ${v?.message??v}`]))).then(v=>(K.delete(t.slot),{...v,asked:g.asked||g.opened})),K.set(t.slot,g),g.done)}async function ze(t,a,d,f,m){if(o())return b(t,"not shown","suppressed",[`suppressed: ${[...window[Re]].join(", ")}`]);let g=ie(t,{...ue(t),...d?{seen:Fe.seen()}:{},asked:f});if(g.length)return b(t,"not eligible","not-eligible",g);let v=Ie(t.format)&&!d,C=v&&!f&&Ye();if(C)return b(t,"not shown","overlay-gap",[C]);if(v&&!n.preview&&n.consentAnswered?.()===!1)return Y.set(t,f),b(t,"not shown","awaiting-consent",["waiting for the consent banner"]);let O=oe(t.format),pe=O&&He(f);if(pe)return b(t,"not shown","another-showing",[`${pe} is showing`]);if(O&&I&&!f)return b(t,"not shown","allowance-spent",[`${I} already showed on this page view`]);let X=null;if(!O){try{X=document.querySelector(t.trigger.selector??"")}catch{X=null}if(!X)return b(t,"not shown","no-element",["no element matches its selector"])}O&&N.set(t.slot,t),J(t),b(t,"asking for a decision","deciding",[a]);let Be=_e().catch(w=>(console.warn("[hp] onsite renderer not loaded:",w?.message??w),null)),z=t.visit_context===!0?V().catch(()=>null):null,Q=ce()??[],fe={claims:[...new Set([...t.audiences,...Q])].filter(w=>Q.includes(w)).slice(0,100)},Je=t.audiences.length>0&&!n.preview&&n.personalisation()?await k(re().then(w=>w?w.visitAudiences(p,n.sessionSignals,t.audiences,Q):fe),Math.min(m,Date.now()+Et),fe):null,F=Date.now()<m?await k(p.decide(t.slot,l.pin(t.slot),{visitAudiences:Je,visitCampaign:t.arrived_from.length?h():null,visitContext:t.visit_context===!0?n.visitContext?.()??null:null,timeoutMs:m-Date.now()}),m,Ue):Ue,ee=F.status===200?F.body?.decisions:null,_=Array.isArray(ee)?ee.find(w=>w?.slot===t.slot):null;_?.experiment&&_.arm&&_.split&&l.pin(t.slot,[_.experiment,_.arm,_.split]);let $=_&&_.holdout!==!0?Oe(_.payload):null,he=$?.steps[0].blocks??[],we=_?.offer?.code??(n.preview?"PREVIEW":l.code()),Ze=n.basketValue?.()??null,te=he.some(w=>w?.t==="code")&&!we&&"no code to remind of"||he.some(w=>w?.t==="progress")&&!(Ze>0)&&"the basket is empty";if(te){let w=te==="the basket is empty";return w&&P.add(t),D(t,"not shown",w?"empty-basket":"no-code",[te])}if(P.delete(t),!$){let w=_?.holdout===!0;return w&&n.analytics()&&e.recordExposure(F.body),O&&w&&(I??(I=t.slot)),w&&!f&&i("held",{slot:t.slot,arm:_.arm??null,format:t.format}),w||Array.isArray(ee)?D(t,w?"held out":"no decision",w?"held-out":"no-creative",["no creative for this visitor"]):D(t,"no decision","decision-failed",[`decisions answered ${F.status}`])}let ne=await k(Be,m,null);if(!ne)return D(t,"not shown","renderer-failed",["the renderer did not load"]);if(Mt($)&&(z??(z=V().catch(()=>null)),!await k(z,m,null)))return D(t,"not shown","products-failed",["its products did not load"]);if(await k(ne.warm?.(t,$,$.steps[0].id,ae),Math.min(m,Date.now()+xt)),o())return D(t,"not shown","suppressed",["suppressed"]);let se=(w,tt={})=>i(w,{slot:t.slot,arm:_.arm??null,format:$.format??t.format,...tt}),Qe=ne.mountForm({form:t,creative:$,decision:_,access:n,client:e,api:p,counters:l,loadWheel:ke,loadAnswers:ge,loadProducts:()=>z??V(),container:X,warmed:ae,coupon:we,basket:()=>n.basketValue?.()??null,emit:se,onClose(w){c.delete(t.slot),N.delete(t.slot),b(t,"closed","closed",[w]),se("closed",{reason:w})}});c.set(t.slot,Qe),d||l.shown(t.slot),v&&l.covered(),O&&(I??(I=t.slot)),n.analytics()&&e.recordExposure(F.body);let et=b(t,"shown","shown",[a]);return se("shown"),et}function Z(t,a,d=U(t)){if(!oe(t.format))return L(t,a,!1,d);if(!H){let f={forms:[],taken:new Set,deadline:Date.now()+We+je};H=f,q.add(f),setTimeout(()=>{H=null,Ge(f)},We)}H.forms.push([t,a,d])}async function Ge(t){let a=t.forms.sort(([f],[m])=>$e(f,m)),d=null;for(let[f,[m,g,v]]of a.entries()){if(t.taken.has(m))continue;let C=await L(m,g,!1,v,t.deadline);if(!d&&vt.has(C.code)&&!C.asked&&(d=[m,C.code]),C.state==="shown"||C.state==="held out"){for(let[O]of a.slice(f+1))b(O,"not shown","lower-priority",[`${m.slot} has a higher priority`]);d=null;break}}q.delete(t),d&&Xe(...d)}for(let t of M){if(t.format==="teaser"&&l.tabOut(t.slot)){L(t,"tab kept from an earlier page",!0);continue}let a=ie(t,ue(t));if(a.length){b(t,"not eligible","not-eligible",a);continue}let d=t.trigger.type;d==="manual"?b(t,"waiting for hp.onsite.open","waiting-for-open"):d==="inline"||t.format==="inline"?L(t,"inline"):de(t)}function de(t){J(t),A.set(t.slot,Pe(t.trigger,a=>{J(t),Z(t,a)},{device:u})),b(t,"armed","armed",[`${t.trigger.type} on ${u}`])}let Ve=n.onConsentAnswered?.(()=>{let t=[...Y];Y.clear();for(let[a,d]of t)c.has(a.slot)||(d?Z(a,"manual",d):de(a))}),qe=n.onBasket?.(()=>{if(!((n.basketValue?.()??0)>0))return;let t=[...P];P.clear();for(let a of t)c.has(a.slot)||Z(a,"the basket changed")}),R=Object.freeze({open(t){let a=M.find(g=>g.slot===t),d=a??M.find(g=>g.aliases.includes(t));if(!d)return Promise.resolve(!1);if(c.has(d.slot))return Promise.resolve(!0);for(let g of q)g.taken.add(d);let f=L(d,"manual",!1,U(d)||!a),m=K.get(d.slot);return m&&(m.opened=!0),f.then(({state:g})=>g==="shown")},suppress(){for(let[t,a]of c){a.destroy(),c.delete(t),N.delete(t);let d=M.find(f=>f.slot===t);d&&b(d,"closed","suppressed",["suppressed"])}},debug:()=>[...S.values()].map(t=>({...t,reasons:[...t.reasons]})),stop(){le=!0;for(let t of A.values())t();A.clear(),qe?.(),Ve?.(),P.clear(),Y.clear(),window[W]===R&&delete window[W]}});window[W]=R;for(let{slot:t,resolve:a}of window[_t]?.splice(0)??[])a(R.open(t));return y&&console.table?.(R.debug()),R}window[Symbol.for("@thg-agentic/hyper-personalisation-web.onsite.module")]={startOnsite:Ke};})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thg-agentic/hyper-personalisation-web",
3
- "version": "3.30.0",
3
+ "version": "3.31.0",
4
4
  "description": "Browser SDK for the THG Hyper-Personalisation event specification: event tracking from a write key and remote settings, strict CMP-agnostic consent, a GA4 dataLayer bridge and in-session audience evaluation. Dependency-free ESM on the Segment wire protocol, a CDN script (dist/hp.min.js), and an optional @segment/analytics-next plugin path.",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The answers this shopper gave a property's onsite forms, kept on the device under personalisation
3
+ * consent only, so an early audience (ADR 0064) is decided as they answer, before the warehouse has
4
+ * the answer. The latest answer to each question counts, as in the warehouse, for 90 days from
5
+ * when it was given. Cleared with the visit: a refusal or withdrawal, a sign-out, another user
6
+ * signing in. Never contact data: a question's key and the option values chosen.
7
+ */
8
+
9
+ import { forgetEveryScope, storageKey, storageName } from './storage-scope.js';
10
+
11
+ const KEEP_MS = 90 * 24 * 60 * 60 * 1000;
12
+ const MAX_QUESTIONS = 50;
13
+ const MAX_VALUES = 20;
14
+ const MAX_TEXT = 128;
15
+
16
+ const keyOf = (propertyId) => storageKey(storageName('answers'), propertyId);
17
+ const text = (v) => typeof v === 'string' && v !== '' && v.length <= MAX_TEXT;
18
+
19
+ /** `[{ q, v, at }]`, newest last, without the lapsed or malformed. */
20
+ function kept(propertyId, now) {
21
+ try {
22
+ const list = JSON.parse(localStorage.getItem(keyOf(propertyId)));
23
+ return Array.isArray(list)
24
+ ? list.filter(
25
+ (a) =>
26
+ text(a?.q) &&
27
+ Array.isArray(a.v) &&
28
+ a.v.every(text) &&
29
+ now - a.at < KEEP_MS,
30
+ )
31
+ : [];
32
+ } catch {
33
+ return [];
34
+ }
35
+ }
36
+
37
+ /** The answers kept for this property, by question: `{ shopping_for: ['womens'] }`. */
38
+ export function readAnswers(propertyId, now = Date.now()) {
39
+ return Object.fromEntries(kept(propertyId, now).map((a) => [a.q, a.v]));
40
+ }
41
+
42
+ /**
43
+ * Only answers to a choice question of the form (`one` or `many`, from its settings' `questions`),
44
+ * and of those only its option values: never a date, a number or anything typed.
45
+ */
46
+ export function choiceAnswers(answers, questions) {
47
+ const asked = Array.isArray(questions) ? questions : [];
48
+ return (Array.isArray(answers) ? answers : []).flatMap((a) => {
49
+ const q = asked.find((x) => x?.key === a?.question);
50
+ if (!q || (q.type !== 'one' && q.type !== 'many')) return [];
51
+ const options = new Set((q.options ?? []).map((o) => o?.value));
52
+ const values = (Array.isArray(a.values) ? a.values : []).filter((v) =>
53
+ options.has(v),
54
+ );
55
+ return values.length ? [{ question: a.question, values }] : [];
56
+ });
57
+ }
58
+
59
+ /** Keep `answers` (`[{ question, values }]`), each replacing that question's earlier answer. */
60
+ export function rememberAnswers(propertyId, answers, now = Date.now()) {
61
+ const given = (Array.isArray(answers) ? answers : []).filter(
62
+ (a) => text(a?.question) && Array.isArray(a.values),
63
+ );
64
+ if (!given.length) return;
65
+ const asked = new Set(given.map((a) => a.question));
66
+ const next = [
67
+ ...kept(propertyId, now).filter((a) => !asked.has(a.q)),
68
+ ...given.map((a) => ({
69
+ q: a.question,
70
+ v: a.values.filter(text).slice(0, MAX_VALUES),
71
+ at: now,
72
+ })),
73
+ ].slice(-MAX_QUESTIONS);
74
+ try {
75
+ forgotten.delete(propertyId);
76
+ localStorage.setItem(keyOf(propertyId), JSON.stringify(next));
77
+ } catch {
78
+ // Quota or a disabled store: an early audience then waits for the warehouse.
79
+ }
80
+ }
81
+
82
+ /** The properties whose answers this page has removed, and written none since. */
83
+ const forgotten = new Set();
84
+
85
+ /**
86
+ * Forget the answers: `propertyId`'s, once a page while nothing new is kept (an event from a visitor
87
+ * without the grant); with none, every property's on the device (a consent change, a sign-out).
88
+ */
89
+ export function forgetAnswers(propertyId) {
90
+ if (propertyId === undefined) {
91
+ forgetEveryScope('answers');
92
+ forgotten.clear();
93
+ } else if (!forgotten.has(propertyId)) {
94
+ try {
95
+ localStorage.removeItem(keyOf(propertyId));
96
+ } catch {
97
+ // Nothing was stored.
98
+ }
99
+ forgotten.add(propertyId);
100
+ }
101
+ }
package/src/index.js CHANGED
@@ -42,6 +42,12 @@
42
42
  * trackRecommendationRails(analytics);
43
43
  */
44
44
 
45
+ import {
46
+ choiceAnswers,
47
+ forgetAnswers,
48
+ readAnswers,
49
+ rememberAnswers,
50
+ } from './answer-memory.js';
45
51
  import { assignmentSession, surfaceExposureToken } from './assignment.js';
46
52
  import { hostConsent, servingHeaders } from './consent.js';
47
53
  import { createConsentGate } from './consent-gate.js';
@@ -669,6 +675,8 @@ export function createAnalytics(options) {
669
675
  setSessionScope(perRequest(cfg.getSessionId, null), cfg.propertyId);
670
676
 
671
677
  let visitKept = false;
678
+ /** The settings the onsite runtime started on, once it has (`started`). */
679
+ let onsiteSettings = null;
672
680
 
673
681
  /** What `recommendationContext()` reads: the products and searches of the events sent. */
674
682
  function recordVisit(event) {
@@ -684,10 +692,17 @@ export function createAnalytics(options) {
684
692
  // A page view changes nothing a rail reads, so it does not extend what is kept for one.
685
693
  if (event.type === 'track')
686
694
  keepVisit(recommendationContextFrom(signals));
695
+ // What the shopper answered a form, for an early audience on the next page (ADR 0064). Kept as
696
+ // it is reported, as every other part of the visit is, not when the batch is delivered.
697
+ if (
698
+ event.event === 'Preferences Stated' &&
699
+ event.properties?.source === 'onsite'
700
+ )
701
+ keepAnswers([event.properties], event.properties.slot);
687
702
  visitKept = true;
688
703
  } else {
689
704
  // Not allowed, or withdrawn: what was kept under the permission goes with it.
690
- forgetKeptVisit();
705
+ forgetKeptVisit(false, cfg.propertyId ?? null);
691
706
  }
692
707
  } catch (err) {
693
708
  if (cfg.debug) console.warn('[hp] the visit was not recorded', err);
@@ -695,11 +710,25 @@ export function createAnalytics(options) {
695
710
  }
696
711
 
697
712
  /**
698
- * What the visit built up for recommendations, kept only under personalisation consent. The
699
- * session signals are cleared only when this SDK built them, unless `all`: a refusal or a sign-out.
713
+ * A form's choice answers, kept under personalisation consent, its questions read from the settings
714
+ * the onsite runtime started on (refreshed since the page's own), or the page's before it starts.
715
+ */
716
+ function keepAnswers(answers, slot) {
717
+ const form = (onsiteSettings ?? cfg.onsite)?.forms?.find?.(
718
+ (f) => f?.slot === slot,
719
+ );
720
+ rememberAnswers(cfg.propertyId, choiceAnswers(answers, form?.questions));
721
+ }
722
+
723
+ /**
724
+ * What the visit built up for recommendations, and the answers given to forms, kept only under
725
+ * personalisation consent. The session signals are cleared only when this SDK built them, unless
726
+ * `all`: a refusal or a sign-out. The answers are every property's, except on an event's path,
727
+ * which names its own (`answersOf`) so no event sweeps the device.
700
728
  */
701
- function forgetKeptVisit(all = false) {
729
+ function forgetKeptVisit(all = false, answersOf = undefined) {
702
730
  forgetVisit();
731
+ forgetAnswers(answersOf);
703
732
  if (all || visitKept) clearSessionSignals();
704
733
  visitKept = false;
705
734
  }
@@ -1197,6 +1226,14 @@ export function createAnalytics(options) {
1197
1226
  identityToken: () => (personalisationGranted() ? identityToken : null),
1198
1227
  analytics: granted,
1199
1228
  personalisation: personalisationGranted,
1229
+ /** A sign-up form's answers, once the gateway took them (`POST /v1/capture`, `/v1/capture/answers`). */
1230
+ answered: (answers, slot) => {
1231
+ if (personalisationGranted()) keepAnswers(answers, slot);
1232
+ },
1233
+ /** The settings the runtime started on, for the questions of the answers it reports. */
1234
+ started: (settings) => {
1235
+ onsiteSettings = settings;
1236
+ },
1200
1237
  consent: () => cfg.getConsent(),
1201
1238
  headers: () => servingHeaders(gate?.state ?? null),
1202
1239
  pageUrl: () =>
@@ -1229,6 +1266,7 @@ export function createAnalytics(options) {
1229
1266
  campaign: readVisitCampaign(cfg.propertyId, {
1230
1267
  sessionId: keptSession(),
1231
1268
  }),
1269
+ answers: readAnswers(cfg.propertyId),
1232
1270
  };
1233
1271
  },
1234
1272
  /**
package/src/onsite/api.js CHANGED
@@ -61,6 +61,19 @@ export function createApi(access, options = {}) {
61
61
  }
62
62
  }
63
63
 
64
+ /**
65
+ * A sign-up or its later answers, to the gateway. Once it takes them (2xx), the answers are kept
66
+ * on the device under personalisation consent, as a quiz's are (ADR 0064).
67
+ */
68
+ const taken = (path, body) =>
69
+ call(`${gateway}/v1/capture${path}`, { method: 'POST', body }).then(
70
+ (res) => {
71
+ if (res.status >= 200 && res.status < 300)
72
+ access.answered?.(body.answers, body.slot);
73
+ return res;
74
+ },
75
+ );
76
+
64
77
  return {
65
78
  /**
66
79
  * The decision for one slot, as the page's other serving calls ask for it, with its pin and
@@ -100,7 +113,12 @@ export function createApi(access, options = {}) {
100
113
  // What a promo reminder's code is answered for under a publishable key (ADR 0067).
101
114
  identity_token: access.identityToken?.() ?? undefined,
102
115
  ...(access.preview ? { preview: access.preview } : {}),
103
- ...(visitAudiences ? { visit_audiences: visitAudiences } : {}),
116
+ ...(visitAudiences && {
117
+ visit_audiences: visitAudiences.claims,
118
+ ...(visitAudiences.answered?.length && {
119
+ answered_audiences: visitAudiences.answered,
120
+ }),
121
+ }),
104
122
  ...(visitCampaign ? { visit_campaign: visitCampaign } : {}),
105
123
  ...(visitContext ? { visit_context: visitContext } : {}),
106
124
  },
@@ -111,10 +129,9 @@ export function createApi(access, options = {}) {
111
129
  timeoutMs: DATAFILE_TIMEOUT_MS,
112
130
  }),
113
131
  challenge: () => call(`${gateway}${challengePath(options.challenge)}`),
114
- capture: (body) => call(`${gateway}/v1/capture`, { method: 'POST', body }),
132
+ capture: (body) => taken('', body),
115
133
  // Answers given after the email step, with its address and receipt.
116
- answers: (body) =>
117
- call(`${gateway}/v1/capture/answers`, { method: 'POST', body }),
134
+ answers: (body) => taken('/answers', body),
118
135
  // Bounded, so the page's `submitted`, which waits for the claim, always comes.
119
136
  claim: (body) =>
120
137
  call(`${serving}/v1/offers/claim`, {
@@ -131,6 +131,7 @@ export function startOnsite(client, options = {}) {
131
131
  return null;
132
132
  }
133
133
  const settings = options.settings ?? access.settings ?? {};
134
+ access.started?.(settings);
134
135
  const api = createApi(access, {
135
136
  ...options,
136
137
  challenge: settings.capture?.challenge,
@@ -414,9 +415,11 @@ export function startOnsite(client, options = {}) {
414
415
  // The evaluator orders the page's own with the visit's (targets and what they require first);
415
416
  // a fallback sends the page's alone, the form's targets first and capped at the server's 100.
416
417
  const page = sessionAudiences() ?? [];
417
- const given = [...new Set([...form.audiences, ...page])]
418
- .filter((slug) => page.includes(slug))
419
- .slice(0, 100);
418
+ const given = {
419
+ claims: [...new Set([...form.audiences, ...page])]
420
+ .filter((slug) => page.includes(slug))
421
+ .slice(0, 100),
422
+ };
420
423
  const claimed =
421
424
  form.audiences.length > 0 && !access.preview && access.personalisation()
422
425
  ? await within(
@@ -7,7 +7,11 @@
7
7
  * limited and the visitor allowed personalisation.
8
8
  */
9
9
 
10
- import { catalogueBrowse, sessionRulesHold } from '../session/rules.js';
10
+ import {
11
+ answeredRulesHold,
12
+ catalogueBrowse,
13
+ sessionRulesHold,
14
+ } from '../session/rules.js';
11
15
 
12
16
  /** What the decide request accepts: more, or a longer slug, and it ignores the lot. */
13
17
  const MAX_AUDIENCES = 100;
@@ -45,7 +49,9 @@ export function prefetch(api) {
45
49
  * personalisation consent.
46
50
  * @param {string[]} [targets] The audiences the form is limited to.
47
51
  * @param {string[]} [given] The session audiences the page gave (`startOnsite`'s `audiences()`).
48
- * @returns {Promise<string[]>}
52
+ * @returns {Promise<{ claims: string[], answered: string[] }>} `claims`, the slugs to send as
53
+ * `visit_audiences`; `answered`, the early audiences that hold on the answers this device keeps,
54
+ * as `answered_audiences`.
49
55
  */
50
56
  export async function visitAudiences(api, signals, targets = [], given = []) {
51
57
  const datafile = await prefetch(api);
@@ -54,7 +60,12 @@ export async function visitAudiences(api, signals, targets = [], given = []) {
54
60
  ? datafile.session_audiences
55
61
  : [];
56
62
  const held = datafile && visit ? holdingAudiences(datafile, visit) : [];
57
- return firstWanted([...held, ...given], targets, session);
63
+ const claims = firstWanted([...held, ...given], targets, session);
64
+ const answered =
65
+ datafile && visit
66
+ ? holdingAudiences(datafile, visit, answeredRulesHold)
67
+ : [];
68
+ return { claims, answered: firstWanted(answered, targets, session) };
58
69
  }
59
70
 
60
71
  /** `slugs`, once each, `targets` and their transitive `requires` first, capped. */
@@ -79,16 +90,15 @@ export function firstWanted(slugs, targets, session) {
79
90
  /**
80
91
  * @param {{ session_audiences?: unknown, browse_categories?: unknown }} datafile `GET /v1/audiences/datafile`.
81
92
  * @param {object} signals This visit's session signals.
93
+ * @param {(audience: object, signals: object) => boolean} [holds]
82
94
  * @returns {string[]}
83
95
  */
84
- export function holdingAudiences(datafile, signals) {
96
+ export function holdingAudiences(datafile, signals, holds = sessionRulesHold) {
85
97
  const audiences = Array.isArray(datafile?.session_audiences)
86
98
  ? datafile.session_audiences
87
99
  : [];
88
100
  const visit = catalogueBrowse(signals, datafile.browse_categories ?? null);
89
101
  return audiences
90
- .filter(
91
- (audience) => isSlug(audience?.slug) && sessionRulesHold(audience, visit),
92
- )
102
+ .filter((audience) => isSlug(audience?.slug) && holds(audience, visit))
93
103
  .map((audience) => audience.slug);
94
104
  }
@@ -33,6 +33,16 @@ const STRING_OPERATORS = {
33
33
  contains: (a, b) => text(b) && tagMatches(a, 'contains', b),
34
34
  };
35
35
 
36
+ /**
37
+ * Operators on an answer (`answer.<question>`): the values the shopper chose against the rule's
38
+ * list, as the SQL compiler reads them. With no answer kept, "is none of" holds, as `not exists`.
39
+ */
40
+ const LIST_OPERATORS = {
41
+ in: (chosen, list) => list.some((v) => chosen.includes(v)),
42
+ not_in: (chosen, list) => !list.some((v) => chosen.includes(v)),
43
+ all: (chosen, list) => list.every((v) => chosen.includes(v)),
44
+ };
45
+
36
46
  /**
37
47
  * Every operator this evaluator can apply, including `between`. A contract test keeps the session
38
48
  * trait catalogue inside this set, since an unsupported operator fails closed silently.
@@ -40,6 +50,7 @@ const STRING_OPERATORS = {
40
50
  export const SESSION_OPERATORS = new Set([
41
51
  ...Object.keys(OPERATORS),
42
52
  ...Object.keys(STRING_OPERATORS),
53
+ ...Object.keys(LIST_OPERATORS),
43
54
  'between',
44
55
  ]);
45
56
 
@@ -71,10 +82,11 @@ const MEASURES = {
71
82
  /**
72
83
  * What a rule's field is worth right now, or null if this build does not know the field.
73
84
  *
74
- * A field is a counter name, `measure.dimension` (`browseShare.damen/schuhe`), or one of the
85
+ * A field is a counter name, `measure.dimension` (`browseShare.damen/schuhe`), one of the
75
86
  * visit's campaign tags (`campaign.source`), which is text and null for a visit that arrived
76
- * untagged. Exported so a storefront can explain a personalisation. Unknown fields fail the rule
77
- * closed.
87
+ * untagged, or an answer (`answer.shopping_for`), the values chosen and empty for none, but null
88
+ * where the signals carry no answers (the onsite runtime's do). Exported so a storefront can
89
+ * explain a personalisation. Unknown fields fail the rule closed.
78
90
  */
79
91
  export function measureField(field, signals) {
80
92
  const separator = field.indexOf('.');
@@ -87,6 +99,13 @@ export function measureField(field, signals) {
87
99
  : null;
88
100
  return typeof tag === 'string' ? tag : null;
89
101
  }
102
+ if (name === 'answer') {
103
+ const { answers } = signals;
104
+ if (!answers || typeof answers !== 'object') return null;
105
+ return Object.hasOwn(answers, arg) && Array.isArray(answers[arg])
106
+ ? answers[arg]
107
+ : [];
108
+ }
90
109
  const fn = MEASURES[name];
91
110
  return fn && arg ? fn(signals, arg) : null;
92
111
  }
@@ -97,6 +116,14 @@ export function measureField(field, signals) {
97
116
  export function evaluateSessionRule(rule, signals) {
98
117
  const actual = measureField(rule.field, signals);
99
118
  if (actual === null) return false;
119
+ if (Array.isArray(actual)) {
120
+ const list = Array.isArray(rule.value) && rule.value.length > 0;
121
+ return (
122
+ list &&
123
+ Object.hasOwn(LIST_OPERATORS, rule.operator) &&
124
+ LIST_OPERATORS[rule.operator](actual, rule.value)
125
+ );
126
+ }
100
127
  if (typeof actual === 'string') {
101
128
  const compare = STRING_OPERATORS[rule.operator];
102
129
  return compare ? compare(actual, rule.value) : false;
@@ -146,6 +173,25 @@ export function sessionRulesHold(audience, signals) {
146
173
  : groupResults.every(Boolean);
147
174
  }
148
175
 
176
+ /**
177
+ * Whether an early audience (ADR 0064) holds on the answers this device keeps: its visit rules and
178
+ * its `answer_rules` together, grouped as authored. Never when the signals carry no answers.
179
+ */
180
+ export function answeredRulesHold(audience, signals) {
181
+ return (
182
+ audience.early === true &&
183
+ Array.isArray(audience.answer_rules) &&
184
+ typeof signals?.answers === 'object' &&
185
+ sessionRulesHold(
186
+ {
187
+ ...audience,
188
+ rules: [...(audience.rules ?? []), ...audience.answer_rules],
189
+ },
190
+ signals,
191
+ )
192
+ );
193
+ }
194
+
149
195
  /**
150
196
  * The audiences this visitor is in right now: precomputed membership from the edge, plus any
151
197
  * session audience whose rules hold.
@@ -229,12 +275,21 @@ export function resolveAudienceMemberships(
229
275
  if (active.has(audience.slug)) continue;
230
276
  const required = audience.requires ?? [];
231
277
  if (!required.every(met)) continue;
232
- if (audience.mixed && !qualified.has(audience.slug)) continue;
233
- if (!audience.rules || audience.rules.length === 0) continue;
234
- if (sessionRulesHold(audience, visit)) {
278
+ // An early audience is in from the answers this device keeps, without the warehouse: they are
279
+ // the shopper's own. Otherwise it is the MIXED audience it ships as.
280
+ const source = answeredRulesHold(audience, visit)
281
+ ? 'session'
282
+ : (!audience.mixed || qualified.has(audience.slug)) &&
283
+ audience.rules?.length > 0 &&
284
+ sessionRulesHold(audience, visit)
285
+ ? audience.mixed
286
+ ? 'mixed'
287
+ : 'session'
288
+ : null;
289
+ if (source) {
235
290
  active.add(audience.slug);
236
291
  // Mixed is its own source: half of it was decided by a batch run, not by this visit.
237
- bySlug.set(audience.slug, audience.mixed ? 'mixed' : 'session');
292
+ bySlug.set(audience.slug, source);
238
293
  admitted = true;
239
294
  }
240
295
  }
@@ -70,6 +70,12 @@ export const DEFAULT_STORAGE_NAMES = Object.freeze({
70
70
  * person id (3.26).
71
71
  */
72
72
  visitCampaign: 'thg_hp_visit_campaign',
73
+ /**
74
+ * localStorage, per property: the answers given to its onsite forms, each kept 90 days, so an
75
+ * audience on answers is decided as the shopper answers. Only under personalisation consent;
76
+ * question keys and option values, never contact data (3.31).
77
+ */
78
+ answers: 'thg_hp_answers',
73
79
  });
74
80
 
75
81
  /**
@@ -138,6 +144,22 @@ export function storagePrefix(name, tenant) {
138
144
  return `${name}:${segment(tenant)}:`;
139
145
  }
140
146
 
147
+ /**
148
+ * Remove every tenant's localStorage keys of one kind on this origin: consent is withdrawn on the
149
+ * device, and a sign-out ends what the device kept for everyone.
150
+ *
151
+ * @param {keyof typeof DEFAULT_STORAGE_NAMES} kind
152
+ */
153
+ export function forgetEveryScope(kind) {
154
+ const prefix = `${names[kind]}:`;
155
+ try {
156
+ for (const key of Object.keys(localStorage))
157
+ if (key.startsWith(prefix)) localStorage.removeItem(key);
158
+ } catch {
159
+ // Nothing was kept.
160
+ }
161
+ }
162
+
141
163
  /**
142
164
  * Move every legacy `cdp*` key to its current name, once per page, in both stores.
143
165
  *
package/src/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = '3.30.0';
1
+ export const VERSION = '3.31.0';
2
2
  export const LIB = '@thg-agentic/hyper-personalisation-web';
@@ -13,7 +13,7 @@
13
13
  */
14
14
 
15
15
  import { SESSION_TIMEOUT_MS } from './session-id.js';
16
- import { storageKey, storageName } from './storage-scope.js';
16
+ import { forgetEveryScope, storageKey, storageName } from './storage-scope.js';
17
17
 
18
18
  /** The longest a tag is read: the control plane's CAMPAIGN_VALUE_MAX, which the server cuts to. */
19
19
  const TAG_MAX = 100;
@@ -167,11 +167,5 @@ export function keepVisitCampaign(
167
167
  /** Forget every property's visit campaign on this origin: a sign-out, or consent withdrawn. */
168
168
  export function clearVisitCampaign() {
169
169
  memory.clear();
170
- try {
171
- const prefix = `${storageName('visitCampaign')}:`;
172
- for (const key of Object.keys(localStorage))
173
- if (key.startsWith(prefix)) localStorage.removeItem(key);
174
- } catch {
175
- /* nothing was kept */
176
- }
170
+ forgetEveryScope('visitCampaign');
177
171
  }
package/types/index.d.ts CHANGED
@@ -496,6 +496,11 @@ export interface StorageNames {
496
496
  preview?: string;
497
497
  /** sessionStorage: the debug token from `?hp_debug=` (3.18). Default 'thg_hp_debug'. */
498
498
  debug?: string;
499
+ /**
500
+ * localStorage, per property, under personalisation consent: the answers given to its onsite
501
+ * forms, each kept 90 days (3.31). Default 'thg_hp_answers'.
502
+ */
503
+ answers?: string;
499
504
  }
500
505
 
501
506
  /** Where a source's device ids come from: the settings' `hp.anonymousId` (since 3.6). */