>

All products featured on Glamour are independently selected by our editors. However, when you buy something through our retail links, we may earn an affiliate commission.

There’s one thing that springs to mind when we think of Kate Middleton: her insanely bouncy blowout. Her signature locks will go down in history as some of the silkiest on record. We’ve been tirelessly attempting to achieve the same shine and volume since she started dating Prince William.

So it was music to our ears when we found out that the Duchess of Cambridge uses a $26 hair product from one of our favorite beauty brands to smooth frizz and flyaways. It hydrates hair, makes it more workable for optimum styling, and leaves it feeling smoother than ever. Interested?

The product in question is Kiehl’s Creme With Silk Groom—a nongreasy styling cream recommended for frizzy, dry, or damaged hair that helps to condition and soften.

Ahead of the royal visit to Norway and Sweden back in 2018, Kate Middleton’s hairstylist, Amanda Cook Tucker, shared a photo of the countless brushes, tools, and cans of hair spray she was taking with her on the tour, and this bad boy made the cut.

iconGalleryBeauty AwardsThe Best Products for Wavy Hair of 2022

iconGalleryBeauty AwardsThe Best Products for Straight Hair of 2022

iconGalleryBeauty AwardsThe Best Curly Hair Products of 2022

iconGalleryHairThe 31 Best Hair Dryers for Every Texture and Budget, According to Glamour Editors

iframe”);t&&!n.length&&e(!0),n.length&&e(!1)}function connectionBait(e,t){const n=new XMLHttpRequest;n.open(“GET”,”https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”,!0),n.onreadystatechange=function(){4===n.readyState&&0===n.status&&e(!0),4===n.readyState&&200===n.status&&(t||e(!1))},n.send()}function detect(e,t){let n=!1;const r={},o={};function i(){return function(t){n||(n=!0,cleanUp(o,r),e(t))}}function s(){setTimeout((()=>{cosmeticBait(i(),r,o)}),1)}function a(){setTimeout((()=>{adServerLoaded(i(),t)}),4e3)}connectionBait(i(),t),”complete”===document.readyState?(s(),a()):”interactive”===document.readyState?(s(),window.addEventListener(“load”,a,!1)):(window.addEventListener(“DOMContentLoaded”,s,!1),window.addEventListener(“load”,a,!1))}function AdBlockDetect(e,t){const n=t.getSingleInstance().getPageDefinition().slotNames;detect((t=>{t?e.emit(“ads.environment.adblock.detected”):e.emit(“ads.environment.adblock.notdetected”),set$1(window,”cns.pageContext.adBlock”,t),sparrowCollector.onAdBlockDetected(t),snowplowCollector.onAdBlockDetected(t)}),(null==n?void 0:n.length)>0)}function isPlainObject(e){return!!e&&e.constructor===Object}function concatUniques(e){if(!(e=e.filter(Array.isArray)).length)return[];const t=e.shift();return Array.from(new Set(t.concat.apply(t,e)))}function mergeBase(e,t,n,r){let o;if(isPlainObject(t)?o=e.filter((e=>isPlainObject(e[n]))):Array.isArray(t)&&(o=e.filter((e=>Array.isArray(e[n])))),o&&o.length){t=merge(o.map((e=>e[n])),r)}return t}function merge(e,t){const n=e.filter((e=>!!e));if(n<2)return e[0];const r=concatUniques(n.filter((e=>!!e)).map(Object.keys)),o=n[0];return r.reduce(((e,r)=>{let o=n.filter((e=>void 0!==e[r]));if(t){let n=!1,i=o[0][r];for(let e=1;e=0;o–){let i=n[o][r];if(void 0!==i)return e[r]=mergeBase(n,i,r,t),e}return e}),o)}function mergeViewportSizes(e,t){const n={};return Object.keys(e).forEach((r=>{if(n[r]=e[r]||[],t&&void 0!==t[r])if(!1===t[r]||!t[r]&&!1===e[r])n[r]=!1;else{n[r]=concatUniques([e[r],t[r]]);const o=n[r].filter((e=>e&&”-“===e[0])),i=o.map((e=>e.slice(1))),s=o.concat(i);n[r]=difference(n[r],s)}})),n}function mergeObjectsOfArrays(e){return concatUniques(e.map(Object.keys)).reduce(((t,n)=>{const r=e.map((e=>e[n])).filter(Array.isArray);return r.length&&(t[n]=concatUniques(r)),t}),{})}const isRunningOnClient=”undefined”!=typeof window;function isObject(e){return”object”==typeof e&&e.constructor===Object}function getRender(e){return pick(e,[“desktop”,”tablet”,”mobile”,”constellation”,”slot”])}function stringToFunction(string){return eval(“(“+string+”)”)}function updateSlotBlock(e){e.when&&(e.when=isRunningOnClient&&stringToFunction(e.when)||e.when.toString()),e.in&&e.in.el&&e.in.when&&(e.in.when=isRunningOnClient&&stringToFunction(e.in.when)||e.in.when.toString())}function slotComplexRenderPreProcessor(e){Object.values(e||{}).forEach((e=>{isObject(e)&&e.every&&e.el&&updateSlotBlock(e)}))}function slotComplexRenderProcessor(e){e&&(e.slot?slotComplexRenderPreProcessor(e.slot):Object.values(e).forEach((e=>{slotComplexRenderPreProcessor(e.slot)})))}function mergePlugins(e,t){return Object.keys(t).reduce(((n,r)=>{const o=merge([{},e[r],t[r]],((e,t)=>{if(!1!==e&&!0===t)return e}));return o&&(n[r]=o),n}),{})}function mergeSlotTypeDefinitions(e,t){return Object.keys(t).reduce(((n,r)=>{const o=mergeAdTechConfigs(e[r],t[r]);return o&&(n[r]=o),n}),{})}const specialKeys={types:(e,t)=>{if(isObject(e))return mergeSlotTypeDefinitions(e,t)},groups:(e,t)=>e?isObject(e)?concatUniques([e,t]):void 0:t,targeting:(e,t)=>e?isObject(e)?mergeObjectsOfArrays([e,t]):void 0:t,position:(e,t)=>e?isObject(e)?mergeObjectsOfArrays([e,t]):void 0:t,content_type:(e,t)=>e?isObject(e)?mergeObjectsOfArrays([e,t]):void 0:t,sizes:(e,t)=>{if(isObject(e))return mergeViewportSizes(e,t)},render:(e,t)=>(slotComplexRenderProcessor(e),slotComplexRenderProcessor(t),getRender(e?t||e:t)),plugins:mergePlugins};function adConfigMerger(e,t,n){let r;return specialKeys[n]?r=specialKeys[n](e,t):Array.isArray(e)&&Array.isArray(t)&&(r=t),r}function mergeAdTechConfigs(e,t){return merge([{},e,t],adConfigMerger)}const errorMessage=”Ads — Ad unit path generation error : “,matcher$1=”[^A-Za-z0-9]”;function dashSlugify(e){const t=new RegExp(matcher$1,”g”);return e&&e.toString().toLowerCase().replace(t,”-“).replace(/-+/g,”-“).replace(/(^-|-$)/g,””)}function evalPath(fnString,options){try{const pathFn=eval(“(“+fnString+”)”);if(“function”==typeof pathFn)return pathFn(options);error$1(`${errorMessage} generation function is not a function`)}catch(e){error$1(`${errorMessage} generation function cannot be evaluated`)}}function searchMap(e,t){return Object.keys(e).reduce(((n,r)=>find$1(e[r],(e=>e===t))?r:n),!1)}function findCategory(e){let t=e.channel,n=t?dashSlugify(t):”misc”;return n=”home”===n?”homepage”:n,n}function findContentType(e){const t=get$1(e,”adUnit.map.contentType”);t||error$1(`${errorMessage} Content type map is missing in the config`);const n=searchMap(t,e.templateType);return n||error$1(`${errorMessage} contentType is undefined`),n}function matchAdUnitPathComponent(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:””;t.sort(((e,t)=>{const n=Array.isArray(e)?e[0].length:e.length;return(Array.isArray(t)?t[0].length:t.length)-n}));for(let n=0;n{e[t]=e[t]||0;const n=e[t];return e[t]++,n},this.current=t=>e[t]||0},PositionCounter=function(){let e={};this.next=t=>{e[t]=e[t]||1;const n=e[t];return e[t]++,n}},Store=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const t=new Map(Object.entries(e));this.getState=e=>t.has(e)?t.get(e):{},this.setState=function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=t.has(e)?t.get(e):{},o=Object.freeze(_objectSpread2(_objectSpread2({},r),n));return t.set(e,o),o},this.getStore=()=>t},SlotStore=function(){const e=new Store,t=new Set;this.getSlotState=t=>e.getState(t),this.setSlotState=(t,n)=>e.setState(t,n),this.isSpacerCreative=e=>t.has(e),this.setSpacerCreativeId=e=>{t.add(e)},this.getStore=()=>e.getStore()},matcher=”[^A-Za-z0-9]”;function slugify(e){const t=new RegExp(matcher,”g”);return e.toString().toLowerCase().replace(t,”_”).replace(/_+/g,”_”).replace(/(^_|_$)/g,””)}function defineReadOnlyProperties(e,t){const n=Object.keys(t),r={};for(let e=0;e{!n&&e[t]&&(n=e[t])})),n||e._default||e.__default}function getSpecificityPattern(e){let t=e.slug,n=e.channel,r=e.subChannel,o=e.templateType;return[t,`${n}_${r}_${o}`,`${n}_${o}`,`${o}`]}function getSlotNamesForPage(e,t){const n=getSpecificityPattern(e);return matchVariantPattern(get$1(t,”slot.sets”),n)}function getConfig(){return get$1(window,”cns.config.config”)}function getBrandAdUnitId(){return get$1(getConfig(),”slot.__auid_one”)}function getAdUnit(){const e=get$1(window,”cns.config.config.ad_unit”)||{};return{generatePath:e.generate_path,categoryMatch:e.category_match,contentTypeMatch:e.content_type_match,map:{contentType:get$1(e,”map.content_type”)}}}function getNetwork(){return get$1(window,”cns.config.config.network”)}function getViewportRange(e,t,n){const r=getConfig()[n],o=r&&matchVariantPattern(r,e);return o&&o[t]||o||0}function getPathOverride(){return queryParameters&&queryParameters.ao_iu}function getVersoFlag(e){const t=get$1(e,”keywords.platform”)||[];return!!(t.length&&”verso”===t[0])}function getOverrideVpRange(e,t){return get$1(t,`request_vp_range.${e}`)}function getPageRefreshTime(){return getConfig().refresh}function CompleteDefiner(e,t,n){const r=new SlotCounter,o=new PositionCounter,i=new SlotStore,s=getSpecificityPattern(e),a=getConfig(),c=a.slot.types,l=getSlotNamesForPage(e,a),d=c._default||{},u=(a||{}).useBlueprintTargeting,g=getTargetingKeyTranslator(void 0!==u&&u),p=”for_children”,f=”static_refresh_size”,m=”can_be_hidden”,y=”insert_after_react_ready”,b=”is_sticky”,h=”required_targeting”,w=”wait_for_oop”;function $(e){const t=e.render;return t&&(t.slot||t[n]&&t[n].slot)}function S(e,t,r,o){e||warn(`Invalid sizes: unable to define ‘${r}’ on ${n}.`,{definition:o,slotName:r}),t||warn(`Invalid render: unable to define: ‘${r}’ on ${n}`,{definition:o,slotName:r})}const v=freeze(l.reduce(((e,r)=>{const o=mergeAdTechConfigs(d,c[r]._default),i=function(e){const n=matchVariantPattern(c[e],s);return t?mergeAdTechConfigs(n,t):n}(r),a=mergeAdTechConfigs(o,i);return function(e,t,n){const r=t.sizes,o=r&&r[n]&&r[n].length,i=r&&!1===r[n],s=$(t),a=o&&!i;return!!t.isOutOfPage||(S(a,s,e,t),o&&!i&&s)}(r,a,n)&&(e[r]=freeze(a)),e}),{})),T=freeze(Object.keys(v));const P=new function(){defineReadOnlyProperties(this,{slug:e.slug,server:e.server,keywords:e.keywords,channel:e.channel||”misc”,subChannel:e.subChannel,subSubChannel:e.subSubChannel,device:n,templateType:e.templateType,contentType:e.contentType,forChildren:e[p],slotNames:T,network:getNetwork(),brand:getBrandAdUnitId(),requestViewportRange:getViewportRange(s,n,”request_vp_range”),adUnit:getAdUnit(),isVerso:getVersoFlag(e),useRoadblock:getConfig().useRoadblock,lazyloadSettings:getViewportRange(s,n,”lazyload_settings”),pageRefresh:getPageRefreshTime()}),freeze(this)};function A(t){const i=v[t]?v[t]:{sizes:{}};function s(e,n){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e=void 0!==e?e:r.next(t);const s=`${t}_${e}`;n=void 0!==n?n:o.next(this.position);const a=this.position&&slugify(this.position),c=`${a}_${n}`;defineReadOnlyProperties(this,{id:s,slotCount:e,positionCount:n,positionId:c,data:i}),this.getAdUnitPath=()=>getAdUnitPath(this,P),freeze(this)}this.getRenderBlock=()=>$(i),this.getSizes=()=>i.sizes[n],this.getSizesArray=()=>sizesToArray(i.sizes[n]),this.getSizeMapping=()=>{const e=window.googletag.sizeMapping();return e.addSize([1024,0],sizesToArray(i.sizes.desktop)).addSize([768,0],sizesToArray(i.sizes.tablet)).addSize([0,0],sizesToArray(i.sizes.mobile)),e.build()},this.shouldWaitUntilVisibleBeforeDisplay=()=>!i[m],this.getCustomData=()=>i.data,s.prototype=this,this.getSlotDefinition=function(){for(var e=arguments.length,t=new Array(e),n=0;n{const t=g(“pos_instance”),n=g(“ctx_slot_instance”),r=parseInt(e.getTargeting(t)[0],10);return new s(parseInt(e.getTargeting(n)[0],10),r)},this.getSlotRefreshTime=(e,t,n)=>{let r;return r=void 0!==t?t:e,r&&r[n]&&(r=r[n]),r},defineReadOnlyProperties(this,{slotName:t,isOutOfPage:!!i.isOutOfPage,refresh:this.getSlotRefreshTime(P.pageRefresh,i.refresh,n),isSticky:isStickyDeviceEnabled(i[b],n),hasStaticRefreshSize:!!i[f],suffix:i.suffix,channel:e.channel,subChannel:e.subChannel,subSubChannel:e.subSubChannel,templateType:e.templateType,override:getPathOverride(),brand:getBrandAdUnitId(),network:getNetwork(),shouldWaitForOOP:i[w],shouldWaitForReact:!!i[y],requiredTargeting:i[h]||[],position:i.position,overrideRequestViewportRange:getOverrideVpRange(n,i)}),freeze(this)}this.getSlotTypeDefinition=e=>new A(e),this.getSlotDefinitionFromGPTSlot=e=>{const t=e.getSlotElementId().split(“_”);t.pop();return new A(t.join(“_”)).getSlotDefinitionFromGPTSlot(e)},this.getSlotStateStore=()=>i,this.getPageDefinition=()=>P,freeze(this)}const reactReadyEvent=”react.ready”;function onReactReady(){set$1(window,”_cne.pageCreated”,!0)}function enableCNE(e){if(e.history(reactReadyEvent).length)return onReactReady();e.on(reactReadyEvent,onReactReady)}const eval2=eval;function getText(e){let t=””;const n=e.childNodes;for(let e=0;ee.previousSibling,above:e=>e.previousSibling,after:e=>e.nextSibling,below:e=>e.nextSibling,prepend:e=>e.firstElementChild,append:e=>e.lastElementChild};function getInsertionTarget(e,t){if(insertionMethods[t])return insertionMethods[t](e)}function alreadyExists(e,t){const n=getInsertionTarget(e,t),r=n&&n.classList&&n.classList.contains(“cns-ads-stage”),o=n&&n.firstChild,i=o&&o.classList&&o.classList.contains(“cns-ads-stage”);return!(!r&&!i)}function checkEvery(e){let t=e.injectionBlock,n=e.index;return”number”==typeof t.every&&!!t.every&&”number”==typeof n}function checkCustomCondition(e){return”function”==typeof e.customConditionFn}const shouldAddSlotConditions=[{name:”every”,check:checkEvery,fn:e=>(e.index+1)%e.injectionBlock.every==0},{name:”custom condition”,check:checkCustomCondition,fn:e=>(0,e.customConditionFn)(e.domNode,e.meta)}];function shouldAddSlot(e){for(let t=0;t{const r=e[n];let o;return”string”==typeof r?o=findAll(r):isValidComplexInjection(r)?o=getDomNodesForInjectionBlock(r):(o=[],error$1(“invalid”,r)),n=normalizeMethod(n),o=o.filter((e=>!alreadyExists(e,n))),o&&o.length&&(t[n]=o),t}),{})}const PromiseLock=function(){let e;return function(t){return function(){for(var n=arguments.length,r=new Array(n),o=0;ot(…r)));return e=n.then((()=>{})),n}return e=t(…r),e}}};function createContainerEl(e,t,n){const r=createElement(“div”,{id:`${e}_${t}`});return addClasses(r,[“cns-ads-container”]),setStyle(r,{margin:”0px auto”,boxSizing:”content-box”}),n&&setElementData(r,n),r}function createAdDivs(e,t,n,r){const o=”cns-ads-slot-type-“,i=e.replace(new RegExp(“_”,”g”),”-“).toLowerCase(),s=createElement(“div”,{id:`${o}${i}-${t}`});addClasses(s,[“cns-ads-stage”,o+i,`${o+i}-${t}`]),setElementData(s,{name:`${e}_${t}`,”slot-type”:e}),r||setStyle(s,{fontSize:0,lineHeight:0,overflow:”hidden”}),”_out_of_page”===e&&addClasses(s,[“cns-ads-slot-type-out-of-page”]);const a=createElement(“div”);return addClasses(a,[“cns-ads-flex-sizer”]),s.appendChild(a),s.appendChild(createContainerEl(e,t,n)),s}function InjectRefreshDisplayInjectionStrategy(e,t,n,r){window.googletag=window.googletag||{};const o=window.googletag,i={after:(e,t)=>e.parentNode.insertBefore(t,e.nextSibling),prepend:(e,t)=>e.insertBefore(t,e.children[0]),append:(e,t)=>e.appendChild(t),before:(e,t)=>e.parentNode.insertBefore(t,e)};this.insertSlot=function(s,a,c,l,d){fastdom.mutate((()=>{const u=createAdDivs(a.slotName,a.slotCount,_objectSpread2(_objectSpread2({},a.getCustomData()),a.data),r);!function(e,t,n){i[t]?i[t](e,n):e[t](n)}(c,l,u),d(u,a,(()=>{((r,i)=>{const s=t.getSingleInstance().getPageDefinition();e([“refreshLC-serviceLT”],{pageDefinition:s},(t=>(applyTargeting(o.pubads(),t),e([“refresh”],{slotDefinition:i,slot:r,pageDefinition:s},(e=>{e?(applyTargeting(r,e),n.reset(i),get$1(window,”cns.config.config.useRoadblock”)||o.pubads().refresh([r],{changeCorrelator:!1}),debug$1(`refreshing.${r.getSlotElementId()}`)):error$1(“slot targeting is missing”,s,i)})))))})(s,a)}))}))}}const allowedIntersectionOptions=[“threshold”,”rootMargin”],defaultIntersectionObserverOptions={threshold:0,rootMargin:”0px 0px”},_EventEmitter=new EventEmitter(“VisibilityObserver”),debug=_EventEmitter.debug,error=_EventEmitter.error;function isIntersecting(e){return any(e,(e=>e.isIntersecting))}function hasHigherIntersectionRatio(e,t){return void 0===e||any(t,(t=>t.intersectionRatio>=(e||0)))}function getIntersectionObserverOptions(e){return Object.assign({},defaultIntersectionObserverOptions,pick(e,allowedIntersectionOptions))}function observeEvents(e,t,n,r){fastdom.measure((()=>{try{const r=new IntersectionObserver((o=>{hasHigherIntersectionRatio(t.intersectionRatio,o)&&isIntersecting(o)?(debug(“visible”,{el:e,entries:o}),n(!0,r)):(debug(“notVisible”,{el:e,entries:o}),n(!1,r))}),getIntersectionObserverOptions(t));r.observe(e)}catch(e){r(e)}}))}function onIntersection(e,t,n){observeEvents(e,t,(e=>n(e)),(e=>error(“onIntersection”,e)))}function onceVisible(e,t){return new Promise(((n,r)=>{observeEvents(e,t,((e,t)=>{e&&(n(),t.disconnect())}),r)}))}function reactRule(e,t){return!e||t}function targetingRule(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];const r=Object.keys(t);return all(e,(e=>find$1(n,(t=>t===e))||find$1(r,(t=>t===e))))}function canRequest(e){let t=e.slotTypeDefinition,n=e.pageTargeting,r=e.slotTargeting,o=e.reactReady,i=e.oopHasRendered,s=e.excludedPositions;const a=!!r,c=targetingRule(t.requiredTargeting,r,n),l=reactRule(t.shouldWaitForReact,o),d=t.shouldWaitForOOP,u=t.position,g=s.has(u);let p=a&&c&&l&&!g&&!(d&&!i);return debug$1(`canRequest.${t.slotName}.${p}`,{slotTypeDefinition:t,pageTargeting:n,slotTargeting:r,reactReady:o,oopHasRendered:i,excludedPositions:s}),p}function UnassumingInsert(e,t,n,r){window.googletag=window.googletag||{};const o=window.googletag,i=t.withTargeting,s=r.getSingleInstance().getPageDefinition().isVerso,a=new InjectRefreshDisplayInjectionStrategy(i,r,n,s),c=new Set;let l=!1,d=!1;function u(e,t){let n;return r.getSingleInstance().getSlotStateStore().setSlotState(e.id,{nodeId:e.data&&e.data[“node-id”]}),n=t?o.defineOutOfPageSlot(e.getAdUnitPath(),e.id):o.defineSlot(e.getAdUnitPath(),e.getSizesArray(),e.id).defineSizeMapping(e.getSizeMapping()),n}function g(e,t){return(n,r,i)=>{const s=function(e){if(e.shouldWaitUntilVisibleBeforeDisplay())return onceVisible}(r),a=()=>{const e=r.id;debug$1(“insert.display”,e),o.display(e),i()},c=e.requestViewportRange,l=t.overrideRequestViewportRange;if(s)return s(n,{rootMargin:`${void 0!==l?l:c}% 0%`}).then(a);a()}}const p=(new PromiseLock)((e=>{const t=e.getSingleInstance().getPageDefinition();return i([“service”],{pageDefinition:t},(n=>{if(n)return applyTargeting(o.pubads(),n),Promise.all(t.slotNames.map((r=>{const s=e.getSingleInstance().getSlotTypeDefinition(r);return function(e,t){let n;const r=e.getRenderBlock();return n=getCandidateElementsFromRenderBlock(r),Promise.all(Object.keys(n).map((r=>(debug$1(“candidatesByMethod.”+e.slotName,{method:r,els:n[r],definition:e}),Promise.all(n[r].map((e=>t(e,r))))))))}(s,((e,r)=>i([“slot”],{pageTargeting:n,slotTypeDefinition:s,reactReady:d,el:e},(p=>{if(!p)return void error$1(“slot type targeting is missing”,t,s);const f=o.pubads().getTargetingKeys();if(!canRequest({slotTypeDefinition:s,pageTargeting:f,slotTargeting:p,reactReady:d,oopHasRendered:l,excludedPositions:c}))return void debug$1(`${s.slotName}.notRequestable`,s,d,n,p);const m=e.dataset.nodeId,y=s.getSlotDefinition(void 0,void 0,_objectSpread2({},m&&{“node-id”:m})),b=y.isOutOfPage,h=u(y,b);if(!h)return void error$1(“the slot cannot be defined”,y,h);h.addService(window.googletag.pubads()),b&&h.addService(window.googletag.companionAds());const w=_objectSpread2({},p);h.updateTargetingFromMap(w),i([“define”],{slot:h,slotDefinition:y},(e=>{applyTargeting(h,e)})),a.insertSlot(h,y,e,r,g(t,s))}))))})));error$1(“page targeting is missing”,t)})).catch(handlePromiseError(“insert error”)).then((()=>new Promise((e=>fastdom.mutate((()=>setTimeout(e,1e3))))))).catch(handlePromiseError(“impossible mutate error”))}));var f;f=()=>{d=!0},e.history(“react.ready”).length?f():e.on(“react.ready”,f),function(){const t=e.on(“#.slotRenderEnded.#”,((n,r)=>{r.topic&&r.topic.includes(“out_of_page”)&&(l=!0,t(),e.emit(“ads.componentDidUpdate”))}))}(),e.on(“ads.excludePositions”,(e=>{e.forEach(c.add,c)})),this.insert=t=>{!function(t){o.pubadsReady?t():e.on(“ads.pubadsReady”,t)}((()=>{p(t),function(t){e.on(“react.ready”,t),e.on(“#.componentDidMount.#”,t),e.on(“#.componentDidUpdate.#”,t)}(debounce((()=>p(t)),500))}))}}function UniqueTimerStore(){const e={};function t(t){const n=e[t];n&&(clearTimeout(n),e[t]=null)}this.startTimer=function(n,r,o){t(n),e[n]=setTimeout((()=>{t(n),r()}),o)},this.endTimer=t}function KeyCounter(){let e={};this.increment=t=>{e[t]||(e[t]=0),e[t]+=1},this.remove=t=>{e[t]&&delete e[t]},this.getCount=t=>e[t]||0}function RefreshControl(e,t){const n=t.withTargeting,r=new EventEmitter(“RefreshControl”).debug,o=new KeyCounter,i=new KeyCounter,s=new Set,a=new Set,c=new Set,l=new UniqueTimerStore,d=[[“aged”,e=>s.has(e)],[“impressions”,e=>i.getCount(e)],[“visible”,e=>c.has(e)]],u=e=>`${e}.refresh_${o.getCount(e)}`,g=t=>e.getSingleInstance().getSlotDefinitionFromGPTSlot(t);function p(t){const i=e.getSingleInstance().getPageDefinition(),s=getSlotById(t),a=g(s);r(`setTargeting.${u(t)}`);const c=getConfig$1(window).config.useBlueprintTargeting,l=getTargetingKeyTranslator(void 0!==c&&c)(“ctx_slot_rn”);return s.setTargeting(l,o.getCount(t)),n([“refreshLC-serviceLT”],{pageDefinition:i},(e=>(applyTargeting(window.googletag.pubads(),e),n([“refresh”],{pageDefinition:i,slotDefinition:a,slot:s},(e=>{applyTargeting(s,e)})))))}function f(e){return void 0===e?3e4:!Number.isNaN(parseInt(e,10))&&e>0?e:0}const m=cumulativeArgumentDebounce((e=>{const t=uniq(e.map((e=>e[0])));if(window.cns.flags.shouldNotRefresh)r(“window.cns.flags.shouldNotRefresh”);else if(r(`refreshing.${t.map((e=>u(e))).join(“,”)}`),t.forEach((e=>h(g(getSlotById(e))))),!get$1(window,”cns.config.config.useRoadblock”)){const e=t.map(getSlotById);window.googletag.pubads().refresh(e,{changeCorrelator:!1})}}),100);function y(e){r(`onChange.${e}.(${d.map((t=>t[0]+”:”+t[1](e))).join(“,”)})`),all(d,(t=>t[1](e)))&&p(e).then((()=>{m(e)}))}function b(e,t){0===(t=f(t))?y(e):l.startTimer(e,(()=>{s.add(e),y(e)}),t),r(`willRefreshIn.${e}.${t}`)}function h(e){const t=e.id;i.remove(t),s.delete(t),b(t,e.refresh)}function w(e){return!e.isOutOfPage&&!window.cns.flags.shouldNotRefresh&&!1!==e.refresh}this.reset=function(e){w(e)?h(e):r(`slotNotRefreshable.${e.id}`)},this.onSlotRenderEnded=function(e){const t=e.slot,n=g(t).id;o.increment(n)},this.onImpressionViewable=function(e){const t=e.slot.getSlotElementId();i.increment(t),r(`${t}.impressionIncremented`),y(t),w(g(e.slot))&&function(e){if(!a.has(e)){const t=getElementById(e);a.add(e),onIntersection(t,{},(t=>{t?(c.add(e),y(e)):c.delete(e)}))}}(t)},this.disableRefresh=function(e){l.endTimer(e)},this.delayRefresh=b,this.normalizeRefreshTimeout=f}function ShareOfVoice(){let e=!1,t=””;this.getTargeting=function(){const e={};return t&&(e.ctx_line_items=[t]),e},this.onSlotRenderEnded=function(n){e||(e=!0,t=n.lineItemId)}}function cnsMetricsApi(){return e=>{e({emit:pixel})}}var updateRefresh=e=>{let t=e.refreshControl;return e=>{let n=e.slotName,r=e.refresh;”number”==typeof r&&r>0?t.delayRefresh(n,r):t.disableRefresh(n)}};function CNSAdsAPI(e,t,n,r){function o(e){let t=e.device,n=void 0===t?”desktop”:t,r=e.server,o=void 0===r?”staging”:r;return new Promise(((e,t)=>{o&&n||t(),e()}))}function i(){return!0===get$1(window,”cns.pageContext.adBlock”)}const s=updateRefresh({refreshControl:t});function a(e,t){const n=e.frameElement.parentElement.parentElement.id;s({slotName:n,refresh:t})}function c(e){const t=window.cns.pageContext,o=new CompleteDefiner(Object.assign({},t,e),null,getViewportTemplate());n.reset((()=>o)),r.insert(n)}function l(){resetUserData(),window.googletag.cmd.push((()=>{window.googletag.pubads().clear(),window.googletag.destroySlots()})),fastdom.mutate((()=>{const e=document.querySelectorAll(“.cns-ads-stage”);for(let t=0;t{}),”adblock.installed”),blocked:deprecated(i,”adblock.blocked”)},pages:{create:c,destroy:l,get:()=>({slots:{add:deprecated(d,”slots.add”),get:deprecated((()=>{}),”slots.get”),refresh:deprecated((()=>{}),”slots.refresh”),destroy:deprecated((()=>{}),”slots.destroy”)}})}})}}function CNSShim(e,t,n,r){const o=new CNSAdsAPI(e,t,n,r);var i;i={ads:o.executeCallback,metrics:cnsMetricsApi()},window.cns.async=function(e,t){i[e](t)},window.cns.queue.forEach((e=>{let t=e.service,n=e.callback;window.cns.async(t,n)})),delete window.cns.queue}var spacerCreative=e=>{let t=e.definer;return e=>{let n=e.creativeId;const r=t.getSingleInstance().getSlotStateStore();r.setSpacerCreativeId(n);const o=r.getStore();window.cnBus&&Array.from(o.values()).forEach((e=>{let t=e.creativeId,r=e.nodeId;r&&t&&n===t&&window.cnBus.emit(`ads.creative.${r}.spacer`,{})}))}};function SafeFrameMessageListener(e){const t=function(t){const n=new Map(Object.keys(t).map((n=>[n,t[n](e)])));return e=>{const t=e.data,r=t.cnsAdEvent,o=t.payload;if(r&&n.has(r)){return n.get(r)(o,e)}}}({updateRefresh:updateRefresh,”ads.creative.spacer”:spacerCreative});window.addEventListener(“message”,t)}function SourceOfTruth(e){let t;this.getSingleInstance=function(){return t||(t=e()),t},this.reset=function(n){t=n?n():e()}}const _window=window,cns=_window.cns,cnBus=_window.cnBus;function about(){return{buildDate:cns.buildDate,fastAdsHead:cns.fastAdsHead,fastAdsFooter:cns.fastAdsFooter,runtimeId:queryParameters.runtimeId||runtimeId}}function attachListeners(e,t){const n=getConfig$1(window),r=new ShareOfVoice,o=new TargetingLifecycle(n,r),i=new RefreshControl(t,o),s=new UnassumingInsert(e,o,i,t);new CNSShim(e,i,t,s),new GPTRouter(t,i,r,e),new SafeFrameMessageListener({refreshControl:i,definer:t}),emitBoomPixel(“adsReady”),cns.addTargeting=o.register,AdBlockDetect(e,t);s.insert(t),sparrowCollector.onRoadblockRendered(cnBus),snowplowCollector.onRoadblockDetected(cnBus)}function initAdsLibrary(){sendBoomerangAdLibraryInformation();const e=new SourceOfTruth((()=>{const e=getViewportTemplate();return new CompleteDefiner(getPageContext(window),null,e)}));setupPermutive(),attachListeners(cnBus,e),enableCNE(cnBus)}function startFooter(){if(addDefaultSubscriptions(cnBus,featureFlags.bus_log),”info”===queryParameters.ao_tools&&append({src:`https://ad-tools.condenastdigital.com/ads-${queryParameters.ao_tools}/prod/index.js`,targ:document.head}),!queryParameters.ap_noads){if(hasPII())return sparrowCollector.onPIIDetected(),void snowplowCollector.onPIIDetected();setupIAS(),setupMoat(),til((()=>cns.pageContext),(()=>{shouldWaitForConsent()?onConsent(initAdsLibrary):initAdsLibrary()}))}}set$1(window,”cns.buildDate”,getConfig$1(window).buildDate),set$1(window,”cns.fastAdsFooter”,version),set$1(window,”cns.runtimeId”,queryParameters.runtimeId||runtimeId),set$1(window,”cns.about”,about),set$1(window,”cns.timing.footerStart”,Date.now()),set$1(window,”cns.addTargeting”,(()=>{})),startFooter()})();