1document.addEventListener('DOMContentLoaded',function(){var banner;if(getCookie('g_uuid')&&!getCookie('personalization_banner_checked')){const state=getBannerState().state;let offer=getBannerState().offer;if(state!=='closed'){let hasBanner=JSON.parse(localStorage.getItem('personalization-banner'));if(hasBanner){if(Date.now()>hasBanner.expires){localStorage.removeItem('personalization-banner');hasBanner=!1}} 2if(hasBanner){$('#personalization-banner-holder').html(hasBanner.value);bannerGeneralFunction(state)}else{if(offer){offer=offer}else{offer=0} 3fetch(`${ajaxurl}?action=get_personalization_banner&offer=${offer}`).then(response=>{if(!response.ok){throw new Error(`Server error: ${response.status}`)} 4return response.text()}).then(html=>{const trimmed=html.trim();if(trimmed==='0'||trimmed===''||trimmed.includes('Service Temporarily Unavailable')){console.warn('Invalid or empty banner response, skipping injection.');return} 5$('#personalization-banner-holder').html(trimmed);const ttl=3600*1000*24;const now=Date.now();window.localStorage.setItem('personalization-banner',JSON.stringify({value:trimmed,expires:now+ttl}));bannerGeneralFunction(state)}).catch(error=>{console.error('API Error:',error)})}}} 6function bannerGeneralFunction(state){const banner=document.getElementById('personalization-banner');const arrow=document.getElementById('personalization-banner-arrow');const closeBtn=document.getElementById('personalization-banner-close');const minimized=document.getElementById('personalization-banner-minimized');if(state==='minimized'){minimizeBanner(banner,minimized)}else{showBanner(banner,minimized)} 7let currentState=state;arrow.addEventListener('click',function(){minimizeBanner(banner,minimized);setBannerState('minimized');currentState='minimized'});minimized.addEventListener('click',function(){expandBanner(banner,minimized);setBannerState('expanded');currentState='expanded'});closeBtn.addEventListener('click',function(e){e.preventDefault();hideBanner(banner,minimized);setBannerState('closed');currentState='closed'});let lastScrollY=window.scrollY;let scrollCooldown=!1;const COOLDOWN_DURATION=300;const SCROLL_BUFFER=10;let bannerBottom=null;let scrollScheduled=!1;function onScroll(){scrollScheduled=!1;if(!bannerBottom){const bannerTop=banner.getBoundingClientRect().top+window.scrollY;bannerBottom=bannerTop+banner.offsetHeight} 8if(currentState!=='expanded')return;if(scrollCooldown)return;const currentScrollY=window.scrollY;const scrollingDown=currentScrollY>lastScrollY;if(scrollingDown&¤tScrollY>bannerBottom+SCROLL_BUFFER){minimizeBanner(banner,minimized);triggerScrollCooldown()}else if(!scrollingDown&¤tScrollY<bannerBottom-SCROLL_BUFFER){expandBanner(banner,minimized);triggerScrollCooldown()} 9lastScrollY=currentScrollY} 10window.addEventListener('scroll',function(){if(scrollScheduled)return;scrollScheduled=!0;requestAnimationFrame(onScroll)},{passive:!0});function triggerScrollCooldown(){scrollCooldown=!0;setTimeout(()=>{scrollCooldown=!1;lastScrollY=window.scrollY},COOLDOWN_DURATION)}} 11function setBannerState(state){localStorage.setItem('personalizationBannerState',JSON.stringify({state,timestamp:Date.now(),offer:document.getElementById('personalization-banner').dataset.selectedOffer}))} 12function getBannerState(){const data=localStorage.getItem('personalizationBannerState');if(!data)return{state:'expanded'};try{const parsed=JSON.parse(data);if(parsed.state==='closed'&&Date.now()-parsed.timestamp>24*60*60*1000){localStorage.removeItem('personalization-banner');return{state:'expanded',offer:parsed.offer}} 13return parsed}catch{return{state:'expanded'}}} 14function showBanner(banner,minimized){banner.style.display='';minimized.style.display='none'} 15function hideBanner(banner,minimized){banner.style.display='none';minimized.style.display='none'} 16function minimizeBanner(banner,minimized){banner.style.display='none';minimized.style.display=''} 17function expandBanner(banner,minimized){banner.style.display='';minimized.style.display='none'}})
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.