const oneSecond=1e3;window.rum={config:{cdnTestStartTimeout:1},instance:{die:!1,primaryStarted:!1,primaryFinished:!1},shuffleArray:function(b){for(let a=b.length-1;0<a;a--){const c=Math.floor(Math.random()*(a+1));[b[a],b[c]]=[b[c],b[a]]}return b},isLowBandwidthMode:function(){return!!navigator.connection&&(null===navigator.connection.effectiveType?navigator.connection.saveData:"4g"!==navigator.connection.effectiveType||navigator.connection.saveData)},uniqueId:function(){return Math.random().toString(36).substr(2,9)+Date.now().toString(36)},connectionInfo:function(){return navigator.connection?{downlink:navigator.connection.downlink,downlinkMax:navigator.connection.downlinkMax,effectiveType:navigator.connection.effectiveType,rtt:navigator.connection.rtt,saveData:navigator.connection.saveData,type:navigator.connection.type}:{}},pagePerformanceData:function(){return{instance:this.instance.instanceId,timestamp:Date.now(),timeZone:this.instance.timeZone,connection:this.instance.connection,operatingSystem:this.instance.operatingSystem,userAgent:this.instance.userAgent,performance:performance.timing,resources:performance.getEntriesByType("resource")}},cdnPerformanceData:function(a,b,c,d){return{instance:this.instance.instanceId,timestamp:Date.now(),timeZone:this.instance.timeZone,connection:this.instance.connection,operatingSystem:this.instance.operatingSystem,userAgent:this.instance.userAgent,cdn:a,test:c,result:d,resources:performance.getEntriesByType("resource").filter(function(a){return"img"==a.initiatorType&&a.startTime>b&&a.name.includes(c)})}},sendBeacon:function(a,b){try{b.id=this.config.websiteOwnerId,b.token=this.config.rumToken,b.tokenTime=this.config.rumTokenTime,navigator.sendBeacon(this.config.beaconUrl+a,JSON.stringify(b))}catch(a){}},sendPageLoadBeacon:function(){this.sendBeacon("?type=page",this.pagePerformanceData())},sendCdnPerformanceBeacon:function(a,b,c,d){this.sendBeacon("?type=cdn&cdn="+a+"&result="+d,this.cdnPerformanceData(a,b,c,d))},getCdnTestInterval:function(a){return"primary"===a?this.config.cdnPriorityInterval*oneSecond:"secondary"===a?this.config.cdnSecondaryInterval*oneSecond:0},pickCdnToTest:function(a){if(0===this.instance.pendingCdnTests.length)switch(this.instance.primaryStarted&&(this.instance.primaryFinished=!0,a="secondary"),a){case"primary":console.log("primary"),this.instance.primaryStarted=!0;const b=Object.keys(this.config.cdnPriorityEndpoints);this.instance.pendingCdnTests=b;break;case"secondary":const c=[...Object.keys(this.config.cdnPriorityEndpoints),...Object.keys(this.config.cdnSecondaryEndpoints)];this.instance.pendingCdnTests=c;break;default:this.instance.pendingCdnTests=[];}return this.shuffleArray(this.instance.pendingCdnTests),this.instance.pendingCdnTests.shift()},getCdnEndpointConfig:function(a){return a in this.config.cdnPriorityEndpoints?this.config.cdnPriorityEndpoints[a]:a in this.config.cdnSecondaryEndpoints?this.config.cdnSecondaryEndpoints[a]:void 0},doesCdnSupportMultipleSizeTesting:function(a){let b=this.getCdnEndpointConfig(a),c=b[0];return c.endsWith("/")},createHiddenElement:function(){let a=document.createElement("div");return a.style.display="none",a.style.visibility="hidden",a.style.position="absolute",a.style.width="0",a.style.height="0",a},loadCdnImage:function(a,b,c){let d=this;return new Promise((e,f)=>{let g=d.getCdnEndpointConfig(a),h=g[0],i=g[1],j=g[2],k=document.createElement("img");if(i+="&instance="+d.instance.instanceId,i+="&cdn="+a,i+="&test="+c,k.setAttribute("width","0"),k.setAttribute("height","0"),"CUSTOM"===j)k.setAttribute("src",h+i);else{let c="";d.doesCdnSupportMultipleSizeTesting(a)&&(c=d.config.cdnImages[b],i+="&size="+b),k.setAttribute("src",h+c+i)}const l=setTimeout(()=>{k.removeEventListener("load",m),k.removeEventListener("error",n),f({timeout:!0})},this.config.imageLoadTimeout*oneSecond),m=a=>{e(a),clearTimeout(l)},n=a=>{f(a),clearTimeout(l)};k.addEventListener("load",m,{passive:!0}),k.addEventListener("error",n,{passive:!0}),d.instance.container.appendChild(k)})},start:function(a){let b=this;this.config=a,setTimeout(function(){b.waitForLoaded()},100)},waitForLoaded:function(){let a=this;"complete"==document.readyState?a.startMonitoringConnection():document.addEventListener("readystatechange",b=>{"complete"===b.target.readyState&&a.startMonitoringConnection()},{passive:!0})},startMonitoringConnection:function(){let a=this;window.addEventListener("online",function(){null===this.instance.intervalId&&a.startMonitoring()},{passive:!0}),window.addEventListener("offline",function(){a.startMonitoring()},{passive:!0}),navigator.onLine&&a.startMonitoring()},startMonitoring:function(){let a=this;a.instance.die||(a.instance.started=new Date,a.instance.timeZone=a.instance.started.getTimezoneOffset(),a.instance.connection=a.connectionInfo(),a.instance.lowBandwidth=a.isLowBandwidthMode(),a.instance.operatingSystem=navigator.platform,a.instance.userAgent=navigator.userAgent,a.instance.pendingCdnTests=[],a.instance.cdnTestRunning=!1,a.instance.priorityMode=!1,a.instance.instanceId=a.uniqueId(),a.sendPageLoadBeacon(),null==a.instance.container&&(a.instance.container=a.createHiddenElement()),setTimeout(()=>{a.testCdnPerformance("primary"),a.instance.intervalId=setInterval(()=>a.testCdnPerformance("primary"),a.getCdnTestInterval("primary"))},a.config.cdnTestStartTimeout*oneSecond))},stopMonitoring:function(){null!==this.instance.intervalId&&(this.instance.die=!0,clearInterval(this.instance.intervalId),this.instance.intervalId=null)},performTest:function(a,b,c,d,e){let f=this,g=d.shift();f.loadCdnImage(c,g,e).then(()=>{const g=performance.now()-a;return g>=b?void f.cdnTestFinished(c,a,e,"timeout"):void(0===d.length?f.cdnTestFinished(c,a,e,"complete"):f.performTest(a,b,c,d,e))}).catch(b=>{b.timeout?f.cdnTestFinished(c,a,e,"imageTimeout"):f.cdnTestFinished(c,a,e,"error")})},testCdnPerformance:(a,b=!1)=>{let c=this.rum;const d=c.config,e=d.stopTime&&d.stopTime instanceof Date;if(e&&d.stopTime.getTime()<=new Date().getTime())return void c.stopMonitoring();if(!navigator.onLine||c.instance.die)return void c.stopMonitoring();if(!c.instance.cdnTestRunning){c.instance.cdnTestRunning=!0;const d=c.pickCdnToTest(a),e=["test",d,c.uniqueId()].join("-"),f=performance.now(),g=c.config.cdnTestDuration*oneSecond;let h=Object.keys(c.config.cdnImages);1<=h.length&&c.instance.lowBandwidth&&(h=[h.shift()]),0==h.length&&(h=["1"]),c.doesCdnSupportMultipleSizeTesting(d)||(h=["1"]),b?c.performTest(f,g,d,h,e):c.instance.primaryFinished?(c.instance.cdnTestRunning=!1,clearInterval(c.instance.intervalId),c.instance.intervalId=setInterval(()=>c.testCdnPerformance("secondary",!0),c.getCdnTestInterval("secondary"))):c.performTest(f,g,d,h,e)}},cdnTestFinished:function(a,b,c,d){this.sendCdnPerformanceBeacon(a,b,c,d),performance.clearMarks(),this.instance.container.textContent="",this.instance.cdnTestRunning=!1}};