// Version: 20250709 (function(d,M){typeof exports=="object"&&typeof module<"u"?M(exports):typeof define=="function"&&define.amd?define(["exports"],M):(d=typeof globalThis<"u"?globalThis:d||self,M(d.JBLWebSocket={}))})(this,function(d){"use strict";var M=null;const L={sendHealthStream:()=>{let t={};t.router="getHealthStream";let e=i.getWebSocket();e.readyState===WebSocket.OPEN?i.sendMsg(JSON.stringify(t)):e.addEventListener("open",function(n){i.sendMsg(JSON.stringify(t))})},setHealthFun:t=>{M=t},getHealthFun:t=>{M(t)},getHealthCallbakfun:t=>M},b=t=>t!==null&&typeof t<"u",w=t=>{let e="";return t.indexOf("//")>-1?t.indexOf(".ourdvsss.com")>-1?e=t.split("/")[0]+"//"+t.split("/")[3]:e=t.split("/")[0]+"//"+t.split("/")[2]:e=t.split("/")[0],e=e.split("?")[0],e},$t=t=>{var e;return e=t.split(".m3u8")[0],e},Ue=(t,e)=>{e.time=new Date().getTime();let n=JSON.stringify(e);localStorage.setItem(t,n)},Ot=t=>t.replace("https://","").replace("http://",""),I=()=>{const t=navigator.userAgent,e=[[/android/i,"Android Device"],[/(iPad|iPhone|iPod)/,"iOS Device"],[/Win/,"Windows Device"],[/Mac/,"MacOS Device"]];for(let[n,o]of e)if(n.test(t)&&!(o==="iOS Device"&&window.MSStream))return o;return"Unknown Device"},k=()=>{const t=navigator.userAgent,e=[[/Edg/i,"Edge"],[/Chrome/i,"Chrome"],[/Firefox/i,"Firefox"],[/Safari/i,"Safari"],[/MSIE/i,"IE"],[/FBAN/i,"Facebook"],[/instagram/i,"Instagram"],[/Zalo/i,"Zalo"],[/MicroMessenger/i,"WeChat"],[/WeChat/i,"WeChat"],[/StApp/i,"StApp"],[/KUAPP/i,"KUAPP"]];for(let[n,o]of e)if(n.test(t))return o;return t},Ht="wss://web.analysiscloud.info/m1uudG5uIU/?project=",jt="https://web.analysiscloud.info/ccu/m1uudG5uIU/config",Mt="https://web.analysiscloud.info/ccu/m1uudG5uIU/upsert",Ft="https://web.analysiscloud.info/ccu/m1uudG5uIU/get";var ce=null,fe={},ge=null;const ze=t=>{ce=t,Pe(window.location.hostname,"x",navigator.appVersion,"",""),We()},Bt=()=>fetch(jt).then(t=>t.json()).then(t=>{ze(t)}).catch(t=>console.error(t)),We=()=>{if(Re(),ce.streamTest_enable!=1){console.log("streamTest is disabled");return}ge=setInterval(()=>{try{let t=fe;if(t.uid)fetch(Mt,{method:"POST",body:JSON.stringify(t)}).catch(e=>console.error(e));else return}catch{}},ce.streamTest_interval*6e4)},Re=()=>{b(ge)&&(clearInterval(ge),ge=null)},Pe=(t,e,n,o,s)=>{let r={};r={},r.projectName=i.getProject(),r.serverId=t,r.uid=e,r.device=n,r.streamName=o,r.cdnName=s,r.updateTime=new Date().getTime(),fe=r},E={ccu_config:ce,getInfo:()=>fe,setConfig:ze,restart:Bt,start:We,stop:Re,upsert:Pe,remove:()=>{let t={};t.updateTime=new Date().getTime(),fe=t}};var m={},h={},X=null;const Jt=t=>(Ae(),h.enable=t.apiTest_enable,h.timeout=t.apiTest_timeout,!h.enable||h.enable!=1||!h.timeout?(console.log("apiTest is disabled"),!1):(X=setInterval(()=>{Ge()},h.timeout),!0)),Ut=()=>{h.enable=0,m={},Ae()},Ae=()=>{b(X)&&(clearInterval(X),X=null)},zt=(t,e,n,o)=>{if(h.enable&&h.enable!=1||L.getHealthCallbakfun()!=null)return;let s=t==null?void 0:t.split("?")[0];m[s]||(m[s]=qe(s));let r=m[s];e=Number(e),r.server=o,r.maxSpeed=r.maxSpeed>e?r.maxSpeed:e,r.minSpeed=r.minSpeed{if(h.enable&&h.enable!=1||L.getHealthCallbakfun()!=null)return;let n=t.split("?")[0];m[n]||(m[n]=qe(n));let o=m[n];o.server="cache",o.cacheCount++},Rt=(t,e,n)=>{if(h.enable&&h.enable!=1||L.getHealthCallbakfun()!=null)return;let o=t.split("?")[0];m[o]||(m[o]=Ke(o));let s=m[o];if(s.server=n,e!=null){let r=(e==null?void 0:e.status)+"@@@"+((e==null?void 0:e.name)==null?"":e.name)+"@@@"+e.statusText;s.failMessage.add(r)}s.failCount++},Pt=(t,e,n)=>{if(h.enable&&h.enable!=1||L.getHealthCallbakfun()!=null)return;let o=t.split("?")[0];m[o]||(m[o]=Ke(o));let s=m[o];if(s.server=n,e!=null){let r="5xx@@@"+e.name+"@@@"+e.statusText;s.failMessage.add(r)}},Ge=()=>{let t=m;if(m={},L.getHealthCallbakfun()!=null)return;let e={},n=Object.keys(t).map(s=>t[s]);n.forEach(s=>{s.failMessage!=null&&(s.failMessage=Array.from(s.failMessage))}),e.router="apiTestInfo",e.data={};for(var o=0;o{let e={},n=E.getInfo();return e.server=n.serverId?n.serverId:"",e.domain=window.location.hostname,e.apiUrl=t,e.xfIp="",e.urlCount=0,e.cacheCount=0,e.failCount=0,e.maxSpeed=0,e.minSpeed=1/0,e.avgSpeed=0,e.totalSize=0,e.failMessage=new Set,e.device=I(),e.browser=k(),e},Ke=t=>{let e={},n=E.getInfo();return e.server=n.serverId?n.serverId:"",e.domain=window.location.hostname,e.apiUrl=t,e.xfIp="",e.urlCount=0,e.cacheCount=0,e.failCount=0,e.maxSpeed=0,e.minSpeed=1/0,e.avgSpeed=0,e.totalSize=0,e.failMessage=new Set,e.device=I(),e.browser=k(),e},At=(t,e,n)=>{let o={};o.router="apiTestInfo",o.data={};let s={},r=E.getInfo();s.server=r.serverId?r.serverId:"",s.domain=window.location.hostname,s.apiUrl=window.location.hostname+"/"+t,s.xfIp=t,s.urlCount=1,s.cacheCount=0,s.failCount=0,s.maxSpeed=e,s.minSpeed=e,s.avgSpeed=e,s.totalSize=n||0,s.device=I(),s.browser=k(),o.data.info=[s],i.sendMsg(JSON.stringify(o))};function Gt(){return m}const l={api_map:m,api_config:h,api_taskId:X,getApiTestInfo:Gt,setJBLConfig:Jt,stop:Ut,record:zt,recordCache:Wt,recordfail:Rt,recordbest:Pt,sendData:Ge,sendWebSiteLog:At};var _={},V={},F=!0,Y=!0,S={},C=null,P=0,Q="",B="";const me=()=>{_.router="hlsTestInfo",_.data={},_.data.info=[]},Ze=()=>{V.router="hlsTsInfo",V.data={},V.data.info=[]},qt=t=>{let e=document.createElement("video");if(e.muted=!0,!Hls.isSupported())return console.log("Your Browser does not support MediaSourceExtension / MP4 mediasource"),!1;let n=0,o=0,s=!1,r=new Hls;return r.loadSource(t),r.autoLevelCapping=0,r.attachMedia(e),r.on(Hls.Events.MEDIA_ATTACHED,(a,u)=>{e.play()}),r.on(Hls.Events.FRAG_BUFFERED,function(a,u){try{n+=u.stats.loading.end-u.stats.loading.start,o++}catch(g){console.error(g)}}),r.on(Hls.Events.ERROR,(a,u)=>{s=!0}),new Promise(a=>{setTimeout(()=>{let u=Number(n/o).toFixed(2),g={url:t,error_status:s,ms:u};r.destroy(),a(g)},6e3)})},Kt=(t,e)=>{t==null||t==null||(C!=null&&clearInterval(C),S.timeout!=null&&(C=setInterval(()=>{F=!0,Y=!0},S.timeout)),Q!=e&&(Q=e,B=""),F=!0,Y=!0,t.on("hlsFragLoading",Ve),t.on("hlsLevelUpdated",Ye),t.on("hlsError",Xe),t.on("hlsFragBuffered",Qe))},Xe=(t,e)=>{if(!F)return;F=!1;let n={};n.domain=B==""?w(e.context.url):B,n.channelName=Q,n.msTime=.1,n.speed=0,n.size=0,n.urlCount=1,n.totalSize=P.toFixed(3),n.device=I(),n.browser=k(),me(),_.data.info.push(n),pe(JSON.stringify(_))},Ve=(t,e)=>{let n=w(e.frag.url);n!=B&&B!=""&&et(B),B=n},Ye=(t,e)=>{let n=e.details.fragments[e.details.fragments.length-1],o=n.baseurl,s=$t(o),r=n.relurl.split("?")[0],a={m3u8url:s,relurl:r};Y&&(Y=!1,Ze(),V.data.info.push(a),tt(JSON.stringify(V)))},Qe=(t,e)=>{P+=e.stats.total/1024;try{let n;e.stats.tbuffered?n=e.stats.tbuffered-e.stats.trequest:n=e.stats.loading.end-e.stats.loading.start;let o=Math.round(8*e.stats.total/n),s=e.frag.duration*1e3/n,r=(o/1e3).toFixed(2),a={};if(a.domain=w(e.frag.url),a.channelName=Q,a.speed=r,a.size=(e.stats.total/1024).toFixed(3),a.totalSize=P.toFixed(3),a.msTime=s.toFixed(3),a.urlCount=0,a.device=I(),a.browser=k(),!F)return;F=!1,me(),_.data.info.push(a),pe(JSON.stringify(_))}catch(n){console.log(n)}},et=t=>{let e={};e.domain=t,e.channelName=Q,e.msTime=.1,e.speed=0,e.size=0,e.urlCount=1,e.totalSize=P.toFixed(3),me(),_.data.info.push(e),pe(JSON.stringify(_))},pe=t=>{if(!S.enable||S.enable!=1){console.log("hlsTest is disabled"),P=0;return}i.sendMsg(t)&&(P=0)},tt=t=>{if(!S.enable||S.enable!=1){console.log("hlsTs is disabled");return}i.sendMsg(t)},he={init:me,ts_init:Ze,createHls:qt,testSpeedToHlsjs:Kt,listenError:Xe,listenUrl:Ve,listenM3U8:Ye,speedTest:Qe,sendPunishment:et,sendData:pe,sendTsData:tt,setJBLConfig:t=>{S.enable=t.hlsTest_enable,S.timeout=t.hlsTest_timeout,C!=null&&clearInterval(C),S.timeout!=null&&(C=setInterval(()=>{F=!0,Y=!0},S.timeout))},stop:()=>{S.enable=0,b(C)&&(clearInterval(C),C=null)}};var N={},D={},ee="",$={},ve=!1,J=null,be=0,Zt=0,te=0,ne=0,U=0,xe=0,A="";const Le=()=>{N.router="flvTestInfo",N.data={},N.data.info=[],te=0,ne=0},Xt=(t,e)=>{t==null||t==null||(J!=null&&clearInterval(J),$.timeout!=null&&(J=setInterval(()=>{ve=!0},$.timeout)),ee!=e&&(ee=e,A=""),Le(),U=0,D=t,D.on("statistics_info",ot))},nt=t=>{let e=w(t.url);e!=A&&A!=""&&st(A),A=e},ot=t=>{nt(t);let e=0;if(D.buffered.length>0){let o=0;D.buffered.end(0)>=be&&(o=D.buffered.end(0)-be),o!=0&&(te+=o,ne++),be=D.buffered.end(0)}let n=D._transmuxer._controller._ioctl._currentRange.to/1024;if(xe=n-U,te!=0&&ne!=0&&(e=te/ne),!$.enable||$.enable!=1){console.log("flvTest is disabled");return}if(ve&&!(t.speed==null||t.speed==0))try{let o=(t.speed/1024*8).toFixed(1),s={};s.domain=w(t.url),s.speed=o,U==0?s.totalSize=n:s.totalSize=n-U,U=n,s.msTime=e.toFixed(3),s.channelName=ee,s.device=I(),s.browser=k(),ve=!1,Le(),N.data.info.push(s),Ee(JSON.stringify(N))}catch(o){console.log(o)}},st=t=>{let e={};e.domain=t,e.channelName=ee,e.msTime=.1,e.speed=0,e.size=0,e.urlCount=1,e.totalSize=xe.toFixed(3),e.device=I(),e.browser=k(),Le(),U=0,N.data.info.push(e),Ee(JSON.stringify(N))},Ee=t=>{i.sendMsg(t)},Ne={flvSpeedInfo:N,flvPlayer:D,channelName:ee,config:$,flag:ve,taskId:J,oldBuffer:be,oldDroppedFrames:Zt,totalDuration:te,count:ne,totalSize:U,change_size:xe,uUrl:A,testSpeedToFlvjs:Xt,listenUrl:nt,speedTest:ot,sendPunishment:st,sendData:Ee,setJBLConfig:t=>{$.enable=t.hlsTest_enable,$.timeout=t.hlsTest_timeout},stop:()=>{$.enable=0,b(J)&&(clearInterval(J),J=null)}};var O={},c={},oe="",T={},Se=!1,z=null,we=0,x={url:"",channelName:"",buffered:0,oldBuffer:0,newBuffer:0},rt=0,Vt=0,Te=0,De=0,H=0,ye=0,W="";const Ie=()=>{O.router="flvTestInfo",O.data={},O.data.info=[],Te=0,De=0},Yt=(t,e)=>{t==null||t==null||(z!=null&&clearInterval(z),T.timeout!=null&&(z=setInterval(()=>{Se=!0},T.timeout)),oe!=e&&(oe=e,W=""),Ie(),x={url:"",channelName:e,buffered:0,oldBuffer:0,newBuffer:0},ye=H,H=0,rt=performance.now(),c=t,c.on("Exception",n=>{x.buffered=-1,ke(W)}),c.on("error",n=>{x.buffered=-1,ke(W)}),c.on("loading_complete",()=>{const o=performance.now()-rt;let s=w(c._mediaDataSource.url);s=Ot(s),l.sendWebSiteLog("s_"+s,o,0)}),c.on("metadata_arrived",n=>{performance.now()}),c.on("media_info",n=>{c._transmuxer!=null&&c._transmuxer.on("media_segment",(o,s)=>{let r=s.data.byteLength;H+=r}),c._decompressor!=null&&c._decompressor.on("media_segment",(o,s)=>{let r=s.transfer.reduce((a,u)=>a+u.byteLength,0);H+=r})}),c.on("statistics_info",en))},Qt=t=>{let e=w(t.url);x.url=e,e!=W&&W!=""&&ke(W),W=e},en=t=>{if(Qt(t),c.buffered.length>0){let e=0;c.buffered.end(0)>=we&&(e=c.buffered.end(0)-we),Te+=e,De++,x.buffered=c.buffered.end(0)-c.currentTime,x.newBuffer=e,x.oldBuffer=c.buffered.end(0),we=c.buffered.end(0)}if(!T.enable||T.enable!=1){Ie(),H=0,ye=0,console.log("mpegTest is disabled");return}if(Se&&!(t.speed==null||t.speed==0))try{let e=H/(T.timeout/1e3),n=Te/(T.timeout/1e3),o={};o.domain=w(t.url),o.speed=e,o.totalSize=(H/1024).toFixed(3),H=0,o.msTime=n.toFixed(3),o.channelName=oe,o.device=I(),o.browser=k(),Se=!1,Ie(),O.data.info.push(o),$e(JSON.stringify(O))}catch(e){console.log(e)}},tn=()=>x,ke=(t,e)=>{let n={};n.domain=w(t),n.channelName=oe,n.msTime=.1,n.speed=0,n.size=0,n.urlCount=1,n.errCode=e||0,n.device=I(),n.browser=k(),n.totalSize=(ye/1024).toFixed(3),n.loaderTime=0,Ie(),ye=0,O.data.info.push(n),$e(JSON.stringify(O))},$e=t=>{i.sendMsg(t)},se={mpegSpeedInfo:O,mpegPlayer:c,channelName:oe,config:T,flag:Se,taskId:z,oldBuffer:we,bufferInfo:x,oldDroppedFrames:Vt,totalDuration:Te,count:De,testSpeedTompegjs:Yt,getBuffer:tn,sendPunishment:ke,sendData:$e,showLog:(t,e,n)=>{console.info("flag: ",n),console.info("Url: ",t.url),console.info("SeepData: ",e)},setJBLConfig:t=>{T.enable=t.hlsTest_enable,T.timeout=t.hlsTest_timeout},stop:()=>{T.enable=0,b(z)&&(clearInterval(z),z=null)}};var R=null,G=0,Oe={};const nn=t=>{Oe=t,G=0};function on(){b(R)&&(clearInterval(R),R=null);let t={};t.router="heartbeat",t.data={key:i.getJblClientId().key};let e=JSON.stringify(t);i.getWebSocket().send(e),R=setInterval(()=>{try{if(G+=1,i.getWebSocket()===null){G=0,i.createWebSocket(i.getProject(),i.getChannel(),i.getSubproject());return}if(G>=3){G=0,b(i.getWebSocket())&&i.getWebSocket().close(),i.setWebSocket(null);return}b(i.getWebSocket())&&i.getWebSocket().readyState===WebSocket.OPEN&&(t.router="heartbeat",t.data={key:i.getJblClientId().key},e=JSON.stringify(t),i.getWebSocket().send(e))}catch{}},Oe.heartbeat_timeout)}function sn(){b(R)&&(clearInterval(R),R=null)}function rn(t){G=t}const _e={config:Oe,setCount:rn,setConfig:nn,start:on,close:sn};var at="",re={};const an=t=>{at=t,it()},ln=t=>{t.monitor_check!=null&&t.monitor_check!==""&&(re.monitor_check=t.monitor_check),re.xhr_test_timeout=isNaN(Number(t.xhr_test_timeout))?1e3:t.xhr_test_timeout},it=()=>{const t=new XMLHttpRequest;let e=at+"?t="+new Date().getTime();t.open("GET",e,!0),t.timeout=re.xhr_test_timeout,t.jbl_base_test=!1;const n={timeout:re.xhr_test_timeout};for(const o in n.headers)n.headers.hasOwnProperty(o)&&t.setRequestHeader(o,n.headers[o]);t.onreadystatechange=function(){let o={};if(t.readyState===4){t.getResponseHeader("Content-Type");const s=t.responseText;o.cacheControl=this.getResponseHeader("Cache-Control")||o;const r=re.monitor_check;if(r&&!s.includes(r)){let a={url:e,name:"Response mismatch",statusText:s};l.recordbest(e,a,"")}}},t.send()},lt={setConfig:ln,receive:an,run:it};var q={result:{}},ae=[];const ut=(t,e,n)=>{let o={};o.type=t,o.group=e,o.lines=n;let s={};s.router="getGroupResult",s.data=o;let r=i.getWebSocket();r!=null&&(r.readyState===WebSocket.OPEN?(i.sendMsg(JSON.stringify(s)),ae.filter(u=>u.type==t&&u.group==e).length==0&&ae.push(o)):r.addEventListener("open",function(a){i.sendMsg(JSON.stringify(s)),ae.filter(g=>g.type==t&&g.group==e).length==0&&ae.push(o)}))},K={groupResultObj:q,setGroupInfo:ut,resetGroupDataLine:async()=>{ae.forEach(async t=>{ut(t.type,t.group,t.lines)})},getGroupData:async(t,e,n)=>{let o=i.getProject(),s={};s.project=o,s.type=e,s.group=n;let r=localStorage.getItem("group_best_line"),a=JSON.parse(r);if(a!=null&&new Date().getTime()-a.time<6e4)return q.result=a.result,q;let u=new URL(Ft),g={};try{let y=800,Z=new AbortController,f=Z.signal;const v=setTimeout(()=>Z.abort(),y);Object.keys(s).forEach(Dt=>u.searchParams.append(Dt,s[Dt]));let ue=u.href,de=await fetch(ue,{signal:f});clearTimeout(v);let j=await de.json();g[j.name]=j.value,Ue("group_best_line",q),q.result[e+"_"+n]=j.value==null?"":j.value}catch{q.result[e+"_"+n]=""}}};var p=null,He="",je="",dt="",ct=!1,Me={},Fe={key:""};const un=t=>{dt=t.socketUrl,t.webSocket},dn=()=>Fe,cn=()=>p,fn=t=>{p=t},gn=()=>He,mn=()=>je,pn=()=>Me,ft=t=>{let e={};e.router="getHlsConfigSetting",e.data={...t};const n=Intl.DateTimeFormat().resolvedOptions().timeZone,o=navigator.language||navigator.userLanguage;typeof t=="object"&&t!==null?e.data={...t}:e.data={},e.data.domain=window.location.hostname,e.data.zone=n,e.data.lang=o,Be(JSON.stringify(e));let s={};s.router="getResourceUrl",s.data={},s.data.chname=je,Be(JSON.stringify(s))},hn=async(t,e,n)=>{He=t,je=e;let o=dt+He;if(console.log("JBL Version:v20250625-1 "+o),b(p))return console.log("jbl connection exists, do nothing"),null;if("WebSocket"in window)p=new WebSocket(o);else return console.log("jbl webSocket is not supported"),null;return p.onerror=()=>(console.warn("jbl webSocket error"),b(p)&&p.close(),null),p.onopen=()=>(console.log("jbl webSocket connected"),ft(n),K.resetGroupDataLine(),null),p.onmessage=s=>{_e.setCount(0);var r=JSON.parse(s.data);switch(r.router){case"heartbeat":Fe={time:new Date().getTime(),key:r.data};break;case"getResourceUrl":Me.result=r.data;break;case"getDomainSetting":lt.receive(r.data);break;case"getHealthStream":L.getHealthFun(r.data),l.stop();break;case"getGroupResult":K.groupResultObj.result[r.data.name]=r.data.value,Ue("group_best_line",K.groupResultObj);break;case"getHlsConfigSetting":let a=r.data;l.setJBLConfig(a),E.setConfig(a),_e.setConfig(a),_e.start(),lt.setConfig(a),he.setJBLConfig(a),Ne.setJBLConfig(a),se.setJBLConfig(a);break}},p.onclose=()=>(l.stop(),he.stop(),Ne.stop(),se.stop(),console.log("jbl webSocket closed"),b(p)&&p.close(),Fe=null,p=null,ct||E.restart(),null),window.onbeforeunload=()=>{try{ct=!0,E.stop(),_e.close(),p.close()}catch{}},p},Be=t=>b(p)?(p.send(t),!0):(console.log("webSocket doesn't exist, do nothing"),!1),i={resourceUrlObj:Me,getJblClientId:dn,getResourceUrlObj:pn,getWebSocket:cn,setWebSocket:fn,getProject:gn,getChannel:mn,getConfigData:ft,sendMsg:Be,createWebSocket:hn,setSocketConfig:un};var ie={},Ce=null;const vn=()=>{ie.router="userInfo",ie.data={}},bn=t=>{let e={...t};const n=Intl.DateTimeFormat().resolvedOptions().timeZone,o=navigator.language||navigator.userLanguage;typeof t=="object"&&t!==null?e={...t}:e={},e.domain=window.location.hostname,e.zone=n,e.lang=o,vn();let s=i.getWebSocket();ie.data=e,s&&s.readyState===1?i.sendMsg(JSON.stringify(ie)):Ce=JSON.stringify(ie),Sn()},Sn=()=>{let t=i.getWebSocket();t&&t.addEventListener("open",()=>{Ce&&(i.sendMsg(Ce),Ce=null)})},wn={sendData:bn,stop};function Tn(){var t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(){t.apply(this,arguments);let e=new Date().getTime(),n=arguments[1];this.addEventListener("progress",function(r){this.prvdownloaded=r.loaded}),this.addEventListener("load",function(){let r="";if(this.jbl_base_test&&(r=this.getResponseHeader("Server")),this.status>=200&&this.status<300){let a=new Date().getTime()-e;this.prvdownloaded==null?this.prvdownloaded=0:this.prvdownloaded,l.record(n,a,this.prvdownloaded,r)}else if(this.status>=400&&this.status<500){let a={status:this.status,statusText:this.statusText};l.recordfail(n,a,"")}else if(this.status>=500){let a={status:this.status,statusText:this.statusText};l.recordfail(n,a,"")}});const o=function(){let r={name:"Network Error",status:"5xx",statusText:"Network Error"};l.recordfail(n,r,"")},s=function(){let r={name:"Timeout",status:"0",statusText:"Timeout"};l.recordfail(n,r,"")};this.addEventListener("error",o),this.addEventListener("timeout",s)}}function yn(t,e){t.fetch=function(){let n=new Date().getTime(),o=arguments[0].url==null?arguments[0]:arguments[0].url,s=arguments[1]==null?{}:arguments[1],r=e.apply(this,arguments),a=o==null?void 0:o.split("?")[0],u=a==null?void 0:a.split("/"),g=u==null?void 0:u.pop();return s.signal&&g&&g.indexOf(".flv")!=-1?r:new Promise((y,Z)=>{r.then(f=>{if(f.ok){let v=f.clone(),ue=v.headers.get("Server")==null?"":v.headers.get("Server");v.arrayBuffer().then(de=>{let j=new Date().getTime()-n;f.status==200&&l.record(o,j,de.byteLength,ue)})}else{let v=f.headers.get("Server");l.recordfail(o,f,v)}return y(f)}).catch(f=>{if(f.response){let v={};f.response.headers.forEach((de,j)=>{v[j]=de});let ue={name:f.name,status:f.response.status,statusText:f.response.statusText};l.recordfail(o,ue,v.Server)}else{let v={name:f.name,status:"5xx",statusText:f.message||"Failed to fetch"};l.recordfail(o,v,"")}return Z(f)})})}}function In(){window.addEventListener("load",()=>{var t=performance.getEntriesByType("resource");t.forEach(function(e){let n=e.responseStatus;if(n>=200&&n<=299)e.transferSize===0&&e.encodedBodySize===0&&e.decodedBodySize===0?l.recordCache(e.name,""):l.record(e.name,e.duration.toFixed(4),e.transferSize,"");else if(n>=400&&n<=599){let o={name:"window load Error",status:n,statusText:"window load Error"};l.recordfail(e.name,o)}else e.transferSize===0&&e.encodedBodySize===0&&e.decodedBodySize===0?l.recordCache(e.name,""):l.record(e.name,e.duration.toFixed(4),e.transferSize,"")})})}function kn(){window.addEventListener("error",t=>{console.log("jbl window error:",t)})}function _n(){const t=window.open;window.open=function(e,n,o){console.log("window.open called with URL:",e);const s=t.apply(this,arguments);let r=new Date().getTime();if(s)s.onload=function(){var u=new Date().getTime()-r;l.record(e,u.toFixed(4),0)},s.onerror=function(){console.error("Error loading new window:",e);let a={name:"New window Error",status:"5xx",statusText:"New window Error"};l.recordfail(e,a,"")};else{console.error("Failed to open new window:",e);let a={name:"New window Error",status:"5xx",statusText:"Failed to open new window"};l.recordfail(e,a,"")}return s}}function Cn(){window.addEventListener("beforeunload",()=>{l.sendData()})}function gt(t){t.startTime=new Date().getTime(),t.count=0,t.onload=function(){var e=new Date().getTime(),n=e-t.startTime;t.count==0&&l.record(t.src,n,0,""),t.count++},t.onerror=function(){let e={name:"iframe Error",status:"5xx",statusText:"iframe Error"};l.recordfail(t.src,e,"")}}function mt(t){t.addEventListener("click",e=>{e.target.href!=null?l.record(e.target.href,0,0,""):l.record(e.currentTarget.href,0,0,"")})}function xn(){document.addEventListener("DOMContentLoaded",function(){var t=document.getElementsByTagName("iframe");document.querySelectorAll("a").forEach(s=>{mt(s)});for(var n=0;n{console.error("Window error:",t);let e={name:"Window Error",status:"5xx",statusText:t.message||"Window Error"};l.recordfail("",e,"")}),window.addEventListener("unhandledrejection",t=>{console.error("Unhandled rejection:",t.reason);let e={name:"Unhandled Rejection",status:"5xx",statusText:t.reason.message||"Unhandled Rejection"};l.recordfail("",e,"")})}const le={load:In,error:kn,beforeunload:Cn,open:_n,contentLoaded:xn,windowError:Ln},En={getLocating:async(t=[1])=>{Array.isArray(t)||(t=[t]);let e=[!1,!1,!1],n={match:"NOT UK",ip:"",loc:""};const o=Intl.DateTimeFormat().resolvedOptions().timeZone,s=navigator.language||navigator.userLanguage;["Europe/London","Europe/Belfast","Europe/Guernsey","Europe/Isle_of_Man","Europe/Jersey"].includes(o)&&(e[0]=!0),s.includes("GB")&&(e[1]=!0);const a="https://"+window.location.hostname+"/cdn-cgi/trace";return await fetch(a).then(g=>g.text()).then(g=>{const y={};g.split(` `).forEach(Z=>{const[f,v]=Z.split("=");f&&v&&(y[f.trim()]=v.trim())}),n.ip=y.ip||"",n.loc=y.loc||"",y.loc&&y.loc.trim()==="GB"&&(e[2]=!0)}).catch(g=>{console.warn("GET IP Data Fail:",g)}),t.every(g=>e[g-1])&&(n.match="UK"),n}},Nn=XMLHttpRequest.prototype.open;if(typeof window<"u")try{Tn(Nn),yn(window,window.fetch),le.load(),le.error(),le.open(),le.beforeunload(),le.contentLoaded()}catch(t){console.warn("modifyFetch patch failed:",t)}var Je="";i.setSocketConfig({socketUrl:Ht,webSocket:null});const pt=(t,e,n)=>{Je=t,i.createWebSocket(Je,e,n)},ht=async(t,e)=>{L.setHealthFun(e),await i.createWebSocket(t,"",{}),L.sendHealthStream()},vt=(t,e,n,o,s)=>{E.upsert(t,e,n,o,s)},bt=()=>{E.remove()},St=(t,e,n)=>{l.sendWebSiteLog(t,e,n)},wt=(t,e,n)=>{K.setGroupInfo(t,e,n)},Tt=async(t,e)=>(await K.getGroupData(Je,t,e),K.groupResultObj),yt=(t,e)=>{he.testSpeedToHlsjs(t,e)},It=t=>he.createHls(t),kt=(t,e)=>{Ne.testSpeedToFlvjs(t,e)},_t=(t,e)=>{se.testSpeedTompegjs(t,e)},Ct=(t,e)=>{se.sendPunishment(t,e)},xt=()=>se.getBuffer(),Lt=()=>i.resourceUrlObj,Et=t=>w(t),Nt=t=>wn.sendData(t),Dn={connect:pt,getHealthStream:ht,upsert:vt,remove:bt,sendWebLog:St,testLine:wt,getGroupResult:Tt,testHls:yt,testSpeedHls:It,testFlv:kt,testMpeg:_t,sendMpegErrCode:Ct,getMpegBuffer:xt,getResourceUrl:Lt,extractHostname:Et,sendUserInfo:Nt,getLocating:En.getLocating};d.connect=pt,d.default=Dn,d.extractHostname=Et,d.getGroupResult=Tt,d.getHealthStream=ht,d.getMpegBuffer=xt,d.getResourceUrl=Lt,d.remove=bt,d.sendMpegErrCode=Ct,d.sendUserInfo=Nt,d.sendWebLog=St,d.testFlv=kt,d.testHls=yt,d.testLine=wt,d.testMpeg=_t,d.testSpeedHls=It,d.upsert=vt,Object.defineProperties(d,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});