window.app={socket:null,console:{}};var Base64ToArrayBuffer=function(base64Str){var binStr=atob(base64Str);var ab=new ArrayBuffer(binStr.length);var bv=new Uint8Array(ab);for(var i=0,l=binStr.length;ic.codePointAt(0));return(new TextDecoder).decode(u8Array)};class BrowserProperties{static initiateBrowserProperties(global){global.L={};let ua=navigator.userAgent.toLowerCase();let uv=navigator.vendor.toLowerCase();let doc=document.documentElement;let ie="ActiveXObject"in global;let cypressTest=ua.indexOf("cypress")!==-1;let clipboardApiAvailable=navigator.clipboard!==undefined&&navigator.clipboard.write!==undefined&&navigator.clipboard.read!==undefined;let webkit=ua.indexOf("webkit")!==-1;let chrome=ua.indexOf("chrome")!==-1;let gecko=(ua.indexOf("gecko")!==-1||cypressTest&&"MozUserFocus"in doc.style)&&!webkit&&!global.opera&&!ie;let safari=!chrome&&(ua.indexOf("safari")!==-1||uv.indexOf("apple")==0);let win=navigator.platform.indexOf("Win")===0;let mobile=typeof orientation!=="undefined"||ua.indexOf("mobile")!==-1;let msPointer=!global.PointerEvent&&global.MSPointerEvent;let pointer=global.PointerEvent&&navigator.pointerEnabled&&navigator.maxTouchPoints||msPointer;let webkit3d="WebKitCSSMatrix"in global&&"m11"in new global.WebKitCSSMatrix;let gecko3d="MozPerspective"in doc.style;var mac=navigator.appVersion.indexOf("Mac")!=-1||navigator.userAgent.indexOf("Mac")!=-1;var chromebook=global.ThisIsTheAndroidApp&&global.COOLMessageHandler.isChromeOS();var navigatorLang=navigator.languages&&navigator.languages.length?navigator.languages[0]:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage;function getFirefoxVersion(){var version="";var userAgent=navigator.userAgent.toLowerCase();if(userAgent.indexOf("firefox")!==-1){var matches=userAgent.match(/firefox\/([0-9]+\.*[0-9]*)/);if(matches){version=matches[1]}}return version}window.L.Browser={ie:ie,edge:"msLaunchUri"in navigator&&!("documentMode"in document),webkit:webkit,gecko:gecko,geckoVersion:getFirefoxVersion(),android:ua.indexOf("android")!==-1,chrome:chrome,safari:safari,win:win,mac:mac,any3d:!global.L_DISABLE_3D&&(webkit3d||gecko3d),mobile:mobile,mobileWebkit:mobile&&webkit,cypressTest:cypressTest,clipboardApiAvailable:clipboardApiAvailable,msPointer:!!msPointer,pointer:!!pointer,retina:(global.devicePixelRatio||global.screen.deviceXDPI/global.screen.logicalXDPI)>1,lang:navigatorLang};global.mode={isChromebook:function(){return chromebook},isMobile:function(){if(global.mode.isChromebook())return false;if(global.L.Browser.mobile&&global.L.Browser.cypressTest){return true}return global.L.Browser.mobile&&(screen.width<768||screen.height<768)},isTablet:function(){if(global.mode.isChromebook())return false;return global.L.Browser.mobile&&!global.mode.isMobile()},isDesktop:function(){if(global.mode.isChromebook())return true;return!global.L.Browser.mobile},getDeviceFormFactor:function(){if(global.mode.isMobile())return"mobile";else if(global.mode.isTablet())return"tablet";else if(global.mode.isDesktop())return"desktop";else return null}}}}class InitializerBase{constructor(){BrowserProperties.initiateBrowserProperties(window);this.uriPrefix=document.getElementById("init-uri-prefix").value;this.brandingUriPrefix=this.uriPrefix;window.welcomeUrl=document.getElementById("init-welcome-url")?document.getElementById("init-welcome-url").value:"";window.feedbackUrl=document.getElementById("init-feedback-url")?document.getElementById("init-feedback-url").value:"";window.buyProductUrl=document.getElementById("init-buy-product-url")?document.getElementById("init-buy-product-url").value:"";let initCSSVars=document.getElementById("init-css-vars")?document.getElementById("init-css-vars").value:"";if(initCSSVars){initCSSVars=atob(initCSSVars);const sheet=new CSSStyleSheet;if(typeof sheet.replace==="function"){sheet.replace(initCSSVars);document.adoptedStyleSheets.push(sheet)}}const element=window.L.initial=document.getElementById("initial-variables");window.L.initial._stubMessage=function(){};window.host="";window.serviceRoot="";window.hexifyUrl=false;window.versionPath="";window.accessToken=element.dataset.accessToken;window.accessTokenTTL=element.dataset.accessTokenTtl;window.noAuthHeader=element.dataset.noAuthHeader;window.accessHeader=element.dataset.accessHeader;window.postMessageOriginExt="";window.coolwsdVersion="";window.enableWelcomeMessage=false;window.autoShowWelcome=false;window.autoShowFeedback=true;window.allowUpdateNotification=false;window.useIntegrationTheme=false;window.enableMacrosExecution=false;window.enableAccessibility=false;window.protocolDebug=false;window.enableDebug=false;window.frameAncestors="";window.socketProxy=false;window.uiDefaults={};window.useStatusbarSaveIndicator=false;window.checkFileInfoOverride={};window.deeplEnabled=false;window.zoteroEnabled=false;window.savedUIState=true;window.extraExportFormats=[];window.wasmEnabled=false;window.indirectionUrl="";window.geolocationSetup=false;window.canvasSlideshowEnabled=false;window.wopiSettingBaseUrl=element.dataset.wopiSettingBaseUrl;window.tileSize=256;window.ThisIsAMobileApp=false;window.ThisIsTheiOSApp=false;window.ThisIsTheGtkApp=false;window.ThisIsTheAndroidApp=false;window.ThisIsTheEmscriptenApp=false;window.bundlejsLoaded=false;window.fullyLoadedAndReady=false;window.addEventListener("load",function(){window.fullyLoadedAndReady=true;const contentKeeper=document.getElementById("content-keeper");while(contentKeeper.children.length>0)document.body.insertBefore(contentKeeper.children[contentKeeper.children.length-1],document.body.firstChild);document.getElementById("content-keeper").remove()},false);let productName=document.getElementById("init-product-branding-name").value;if(typeof productName==="string"&&productName.length){window.brandProductName=productName}let productURL=document.getElementById("init-product-branding-url").value;if(typeof productURL==="string"&&productURL.length){window.brandProductURL=productURL}this.initiateCoolParams()}initiateCoolParams(){const gls=window.location.search;const coolParams={p:new URLSearchParams(gls.slice(gls.lastIndexOf("?")+1))};coolParams.get=function(name){const value=this.p.get(name);return value===null?"":value}.bind(coolParams);coolParams.set=function(name,value){this.p.set(name,value)}.bind(coolParams);window.coolParams=coolParams}loadCSSFiles(){const link=document.createElement("link");link.setAttribute("rel","stylesheet");link.setAttribute("type","text/css");const brandingLink=document.createElement("link");brandingLink.setAttribute("rel","stylesheet");brandingLink.setAttribute("type","text/css");const theme_name=document.getElementById("init-branding-name").value;let theme_prefix="";if(window.useIntegrationTheme&&theme_name!=="")theme_prefix=theme_name+"/";if(window.mode.isMobile()){link.setAttribute("href",this.uriPrefix+"device-mobile.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-mobile.css")}else if(window.mode.isTablet()){link.setAttribute("href",this.uriPrefix+"device-tablet.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-tablet.css")}else{link.setAttribute("href",this.uriPrefix+"device-desktop.css");brandingLink.setAttribute("href",this.brandingUriPrefix+theme_prefix+"branding-desktop.css")}const otherStylesheets=document.querySelectorAll('link[rel="stylesheet"]');const lastOtherStylesheet=otherStylesheets[otherStylesheets.length-1];lastOtherStylesheet.insertAdjacentElement("afterend",link).insertAdjacentElement("afterend",brandingLink)}initializeViewMode(){const darkTheme=window.coolParams.get("darkTheme");if(darkTheme){window.uiDefaults={darkTheme:true}}}afterInitialization(){this.initializeViewMode();this.loadCSSFiles()}}class BrowserInitializer extends InitializerBase{constructor(){super();window.WOPIpostMessageReady=false;this._boundPostMessageHandler=this.postMessageHandler.bind(this);window.addEventListener("message",this._boundPostMessageHandler,false);const element=document.getElementById("initial-variables");window.host=element.dataset.host;window.serviceRoot=element.dataset.serviceRoot;window.hexifyUrl=element.dataset.hexifyUrl.toLowerCase().trim()==="true";window.versionPath=element.dataset.versionPath;window.postMessageOriginExt=element.dataset.postMessageOriginExt;window.coolLogging=element.dataset.coolLogging;window.coolwsdVersion=element.dataset.coolwsdVersion;window.enableWelcomeMessage=element.dataset.enableWelcomeMessage.toLowerCase().trim()==="true";window.autoShowWelcome=element.dataset.autoShowWelcome.toLowerCase().trim()==="true";window.autoShowFeedback=element.dataset.autoShowFeedback.toLowerCase().trim()==="true";window.allowUpdateNotification=element.dataset.allowUpdateNotification.toLowerCase().trim()==="true";window.userInterfaceMode=element.dataset.userInterfaceMode;window.useIntegrationTheme=element.dataset.useIntegrationTheme.toLowerCase().trim()==="true";window.useStatusbarSaveIndicator=element.dataset.statusbarSaveIndicator.toLowerCase().trim()==="true";window.enableMacrosExecution=element.dataset.enableMacrosExecution.toLowerCase().trim()==="true";window.enableAccessibility=element.dataset.enableAccessibility.toLowerCase().trim()==="true";window.outOfFocusTimeoutSecs=parseInt(element.dataset.outOfFocusTimeoutSecs);window.idleTimeoutSecs=parseInt(element.dataset.idleTimeoutSecs);window.minSavedMessageTimeoutSecs=parseInt(element.dataset.minSavedMessageTimeoutSecs);window.protocolDebug=element.dataset.protocolDebug.toLowerCase().trim()==="true";window.enableDebug=element.dataset.enableDebug.toLowerCase().trim()==="true";window.frameAncestors=decodeURIComponent(element.dataset.frameAncestors);window.socketProxy=element.dataset.socketProxy.toLowerCase().trim()==="true";window.uiDefaults=JSON.parse(atob(element.dataset.uiDefaults));window.checkFileInfoOverride=element.dataset.checkFileInfoOverride;window.deeplEnabled=element.dataset.deeplEnabled.toLowerCase().trim()==="true";window.zoteroEnabled=element.dataset.zoteroEnabled.toLowerCase().trim()==="true";window.documentSigningEnabled=element.dataset.documentSigningEnabled.toLowerCase().trim()==="true";window.savedUIState=element.dataset.savedUiState.toLowerCase().trim()==="true";window.extraExportFormats=Array.from(element.dataset.extraExportFormats.split(" "));window.wasmEnabled=element.dataset.wasmEnabled.toLowerCase().trim()==="true";window.indirectionUrl=element.dataset.indirectionUrl;window.geolocationSetup=element.dataset.geolocationSetup.toLowerCase().trim()==="true";window.canvasSlideshowEnabled=element.dataset.canvasSlideshowEnabled.toLowerCase().trim()==="true";window.wopiSettingBaseUrl=element.dataset.wopiSettingBaseUrl}postMessageHandler(e){if(!(e&&e.data))return;try{var msg=JSON.parse(e.data)}catch(err){return}if(msg.MessageId==="Host_PostmessageReady"){window.WOPIPostmessageReady=true;window.removeEventListener("message",this._boundPostMessageHandler,false);console.log("Received Host_PostmessageReady.")}}}class MobileAppInitializer extends InitializerBase{constructor(){super();window.ThisIsAMobileApp=true;window.HelpFile=document.getElementById("init-help-file").value;window.open=function(url,windowName,windowFeatures){window.postMobileMessage("HYPERLINK "+url)};const element=document.getElementById("initial-variables");window.MobileAppName=element.dataset.mobileAppName;window.brandProductName=element.dataset.mobileAppName;window.coolLogging="true";window.outOfFocusTimeoutSecs=1e6;window.idleTimeoutSecs=1e6;window.canvasSlideshowEnabled=true}}class IOSAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheiOSApp=true;window.postMobileMessage=function(msg){window.webkit.messageHandlers.lok.postMessage(msg)};window.postMobileError=function(msg){window.webkit.messageHandlers.error.postMessage(msg)};window.postMobileDebug=function(msg){window.webkit.messageHandlers.debug.postMessage(msg)};document.dir=window.coolParams.get("dir");window.userInterfaceMode=window.coolParams.get("userinterfacemode");this.brandingUriPrefix="Branding/"+this.brandingUriPrefix}}class GTKAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheGtkApp=true;window.postMobileMessage=function(msg){window.webkit.messageHandlers.cool.postMessage(msg,"*")};window.postMobileError=function(msg){window.webkit.messageHandlers.error.postMessage(msg,"*")};window.postMobileDebug=function(msg){window.webkit.messageHandlers.debug.postMessage(msg,"*")}}}class AndroidAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheAndroidApp=true;window.postMobileMessage=function(msg){window.COOLMessageHandler.postMobileMessage(msg)};window.postMobileError=function(msg){window.COOLMessageHandler.postMobileError(msg)};window.postMobileDebug=function(msg){window.COOLMessageHandler.postMobileDebug(msg)};window.userInterfaceMode=window.coolParams.get("userinterfacemode")}}class EMSCRIPTENAppInitializer extends MobileAppInitializer{constructor(){super();window.ThisIsTheEmscriptenApp=true;window.postMobileMessage=function(msg){Module._handle_cool_message(Module.stringToNewUTF8(msg))};window.postMobileError=function(msg){console.log("COOL Error: "+msg)};window.postMobileDebug=function(msg){console.log("COOL Debug: "+msg)};window.userInterfaceMode="notebookbar"}}function getInitializerClass(){window.appType=document.getElementById("init-app-type").value;if(window.appType==="browser"){return new BrowserInitializer}else if(window.appType==="mobile"){let osType=document.getElementById("init-mobile-app-os-type");if(osType){osType=osType.value;if(osType==="IOS")return new IOSAppInitializer;else if(osType==="GTK")return new GTKAppInitializer;else if(osType==="ANDROID")return new AndroidAppInitializer;else if(osType==="EMSCRIPTEN")return new EMSCRIPTENAppInitializer}}}(function(global){const initializer=getInitializerClass();initializer.afterInitialization();global.logServer=function(log){if(global.ThisIsAMobileApp){global.postMobileError(log)}else if(global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1){global.socket.send(log)}else if(global.socket&&global.L&&global.app.definitions.Socket&&global.socket instanceof global.app.definitions.Socket&&global.socket.connected()){global.socket.sendMessage(log)}else{fetch(global.location.pathname.match(/.*\//)+"logging.html",{method:"POST",headers:{"Content-Type":"application/json"},body:global.coolLogging+" "+log})}};global.setLogging=function(doLogging){var loggingMethods=["error","warn","info","debug","trace","log","assert","time","timeEnd","group","groupEnd"];if(!doLogging){var noop=function(){};for(var i=0;i{Object.keys(object).forEach(key=>{const fullKey=parentKey?`${parentKey}.${key}`:key;const value=object[key];if(typeof value==="object"&&!Array.isArray(value)&&value!==null){processObject(value,fullKey)}else if(Array.isArray(value)){global.prefs._userBrowserSetting[fullKey]=JSON.stringify(value)}else{global.prefs._userBrowserSetting[fullKey]=typeof value==="boolean"?value?"true":"false":value}})};processObject(settingJSON);global.prefs._localStorageCache={};global.prefs.useBrowserSetting=true;global.getAccessibilityState()},_renameLocalStoragePref:function(oldName,newName){if(!global.prefs.canPersist){return}const oldValue=global.localStorage.getItem(oldName);const newValue=global.localStorage.getItem(newName);if(oldValue===null||newValue!==null){return}global.localStorage.setItem(newName,oldValue)},_getUIDefault:function(key,defaultValue=undefined){const parts=key.split(".");let result=global.uiDefaults;for(const part of parts){if(!Object.prototype.hasOwnProperty.call(result,part)){return defaultValue}if(typeof result==="string"){return defaultValue}result=result[part]}if(typeof result!=="string"){return defaultValue}return result},get:function(key,defaultValue=undefined){if(key in global.prefs._localStorageCache){return global.prefs._localStorageCache[key]}const uiDefault=global.prefs._getUIDefault(key);if(!global.savedUIState&&uiDefault!==undefined){global.prefs._localStorageCache[key]=uiDefault;return uiDefault}if(global.prefs.useBrowserSetting){let val=defaultValue;if(Object.prototype.hasOwnProperty.call(global.prefs._userBrowserSetting,key))val=global.prefs._userBrowserSetting[key];if(val!==undefined){global.prefs._localStorageCache[key]=val;return val}}if(global.prefs.canPersist){const localStorageItem=global.localStorage.getItem(key);if(localStorageItem){global.prefs._localStorageCache[key]=localStorageItem;return localStorageItem}}if(uiDefault!==undefined){global.prefs._localStorageCache[key]=uiDefault;return uiDefault}global.prefs._localStorageCache[key]=defaultValue;return defaultValue},sendPendingBrowserSettingsUpdate:function(){const isEmpty=obj=>Object.keys(obj).length===0;if(!isEmpty(global.prefs._settingUpdateJSON)){global.socket.send("browsersetting action=update json="+JSON.stringify(global.prefs._settingUpdateJSON));global.prefs._settingUpdateJSON={}}clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=undefined},setMultiple:function(prefsObject){const browserSettingEnabled=global.prefs.useBrowserSetting;for(const[key,value]of Object.entries(prefsObject)){if(browserSettingEnabled){const oldValue=global.prefs._userBrowserSetting[key];global.prefs._userBrowserSetting[key]=value;if(oldValue!==value)global.prefs._settingUpdateJSON[key]=value}if(global.prefs.canPersist){global.localStorage.setItem(key,value)}global.prefs._localStorageCache[key]=value}const isEmpty=obj=>Object.keys(obj).length===0;if(browserSettingEnabled&&!isEmpty(global.prefs._settingUpdateJSON)&&global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1){clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=setTimeout(L.bind(this.sendPendingBrowserSettingsUpdate,this),5e3)}},set:function(key,value){value=String(value);if(global.prefs.useBrowserSetting){const oldValue=global.prefs._userBrowserSetting[key];global.prefs._userBrowserSetting[key]=value;if(global.socket&&(global.socket instanceof WebSocket||global.socket instanceof global.IndirectSocket)&&global.socket.readyState===1&&oldValue!==value){global.prefs._settingUpdateJSON[key]=value;clearTimeout(global.prefs._pendingSettingUpdate);global.prefs._pendingSettingUpdate=setTimeout(L.bind(this.sendPendingBrowserSettingsUpdate,this),5e3)}}if(global.prefs.canPersist){global.localStorage.setItem(key,value)}global.prefs._localStorageCache[key]=value},remove:function(key){if(global.prefs.useBrowserSetting){global.prefs._userBrowserSetting.delete(key)}if(global.prefs.canPersist){global.localStorage.removeItem(key)}global.prefs._localStorageCache[key]=undefined},getBoolean:function(key,defaultValue=false){const value=global.prefs.get(key,"").toLowerCase();if(value==="false"){return false}if(value==="true"){return true}return defaultValue},getNumber:function(key,defaultValue=NaN){const value=global.prefs.get(key,"").toLowerCase();const parsedValue=parseFloat(value);if(isNaN(parsedValue)){return defaultValue}return parsedValue}};global.getAccessibilityState=function(){var isCalcTest=global.docURL.includes("data/desktop/calc/")||global.docURL.includes("data/mobile/calc/")||global.docURL.includes("data/idle/calc/")||global.docURL.includes("data/multiuser/calc/");if(L.Browser.cypressTest&&isCalcTest)global.enableAccessibility=false;if(L.Browser.cypressTest)global.prefs.set("accessibilityState",global.enableAccessibility);return global.prefs.getBoolean("accessibilityState")};const prefDocTypes=["text","spreadsheet","presentation","drawing"];for(const docType of prefDocTypes){global.prefs._renameLocalStoragePref(`UIDefaults_${docType}_darkTheme`,"darkTheme")}const oldDocTypePrefs=["A11yCheckDeck","NavigatorDeck","PropertyDeck","SdCustomAnimationDeck","SdMasterPagesDeck","SdSlideTransitionDeck","ShowResolved","ShowRuler","ShowSidebar","ShowStatusbar","ShowToolbar"];for(const pref of oldDocTypePrefs){for(const docType of prefDocTypes){global.prefs._renameLocalStoragePref(`UIDefaults_${docType}_${pref}`,`${docType}.${pref}`)}}global.keyboard={onscreenKeyboardHint:global.uiDefaults["onscreenKeyboardHint"],guessOnscreenKeyboard:function(){if(global.keyboard.onscreenKeyboardHint!=undefined)return global.keyboard.onscreenKeyboardHint;return global.ThisIsAMobileApp&&!global.ThisIsTheEmscriptenApp||global.mode.isMobile()||global.mode.isTablet()},hintOnscreenKeyboard:function(hint){if(global.app&&global.L.Map&&global.L.Map.THIS._docLayer.isCalc()&&hint!==undefined){var command={Enable:{type:"boolean",value:hint}};global.L.Map.THIS.sendUnoCommand(".uno:MoveKeepInsertMode",command)}global.keyboard.onscreenKeyboardHint=hint}};global.memo={_lastId:0,_getId:function(obj){if(obj===null||obj===undefined){return""+obj}if(!("_coolMemoId"in obj)){obj["_coolMemoId"]=++global.memo._lastId}return obj._coolMemoId},_decoratorMemo:{},decorator:function(decorator,context){var decoratorId=global.memo._getId(decorator);var contextId=global.memo._getId(context);return function(f){var functionId=global.memo._getId(f);if(global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]===undefined){global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]=decorator.apply(this,arguments);if(context!==null&&context!==undefined){global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]=global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId].bind(context)}}return global.memo._decoratorMemo[decoratorId+" "+contextId+" "+functionId]}},_bindMemo:{},bind:function(f,context){var functionId=global.memo._getId(f);var contextId=global.memo._getId(context);if(global.memo._bindMemo[functionId+" "+contextId]===undefined){global.memo._bindMemo[functionId+" "+contextId]=f.bind(context)}return global.memo._bindMemo[functionId+" "+contextId]}};global.touch={isTouchEvent:function(e){if(e.originalEvent){e=e.originalEvent}if(L.Browser.cypressTest&&global.L.Browser.mobile){return true}if(e.pointerType){return e.pointerType==="touch"||e.pointerType==="kinect"}if(e.isMouseEvent!==undefined){return!e.isMouseEvent}if(e.guessEmulatedFromTouch){return true}return!(e instanceof MouseEvent)},touchOnly:global.memo.decorator(function(f){return function(e){if(!global.touch.isTouchEvent(e))return;return f.apply(this,arguments)}}),mouseOnly:global.memo.decorator(function(f){return function(e){if(global.touch.isTouchEvent(e))return;return f.apply(this,arguments)}}),hasPrimaryTouchscreen:function(){return global.matchMedia("(pointer: coarse)").matches},hasAnyTouchscreen:function(){return global.matchMedia("(any-pointer: coarse)").matches},lastEventWasTouch:null,lastEventTime:null,currentlyUsingTouchscreen:function(){if(global.touch.lastEventWasTouch!==null){return global.touch.lastEventWasTouch}return global.touch.hasAnyTouchscreen()}};const registerTapOrClick=e=>{registerGuessEmulatedFromTouch(e);global.touch.lastEventWasTouch=global.touch.isTouchEvent(e);global.touch.lastEventTime=Date.now()};const registerGuessEmulatedFromTouch=e=>{e.guessEmulatedFromTouch=global.touch.lastEventWasTouch&&Date.now()-global.touch.lastEventTime<50};document.addEventListener("touchstart",registerTapOrClick,{capture:true});document.addEventListener("touchend",registerTapOrClick,{capture:true});document.addEventListener("mousedown",registerTapOrClick,{capture:true});document.addEventListener("mouseup",registerTapOrClick,{capture:true});document.addEventListener("pointerdown",registerTapOrClick,{capture:true});document.addEventListener("pointerup",registerTapOrClick,{capture:true});document.addEventListener("mouseenter",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseleave",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseover",registerGuessEmulatedFromTouch,{capture:true});document.addEventListener("mouseout",registerGuessEmulatedFromTouch,{capture:true});global.deviceFormFactor=global.mode.getDeviceFormFactor();if(global.ThisIsTheiOSApp){global.addEventListener("keydown",function(e){if(e.metaKey){e.preventDefault()}if(global.MagicKeyDownHandler)global.MagicKeyDownHandler(e)});global.addEventListener("keyup",function(e){if(e.metaKey){e.preventDefault()}if(global.MagicKeyUpHandler)global.MagicKeyUpHandler(e)})}document.addEventListener("contextmenu",function(e){if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},false);global.fakeWebSocketCounter=0;global.FakeWebSocket=function(){this.binaryType="arraybuffer";this.bufferedAmount=0;this.extensions="";this.protocol="";this.readyState=1;this.id=global.fakeWebSocketCounter++;this.onclose=function(){};this.onerror=function(){};this.onmessage=function(){};this.onopen=function(){};this.close=function(){}};global.FakeWebSocket.prototype.send=function(data){global.postMobileMessage(data)};global.proxySocketCounter=0;global.ProxySocket=function(uri){var that=this;this.uri=uri;this.binaryType="arraybuffer";this.bufferedAmount=0;this.extensions="";this.unloading=false;this.protocol="";this.connected=true;this.readyState=0;this.sessionId="open";this.id=global.proxySocketCounter++;this.msgInflight=0;this.openInflight=0;this.inSerial=1;this.outSerial=1;this.minPollMs=25;this.maxPollMs=500;this.curPollMs=this.minPollMs;this.minIdlePollsToThrottle=3;this.throttleFactor=1.15;this.lastDataTimestamp=performance.now();this.serialQueue=new Map;this.onclose=function(){};this.onerror=function(){};this.onmessage=function(){};this.decoder=new TextDecoder;this.doSlice=function(bytes,start,end){return bytes.slice(start,end)};this.decode=function(bytes,start,end){return this.decoder.decode(this.doSlice(bytes,start,end))};this.processBufferedMessages=function(expectedSerial){while(this.serialQueue.has(expectedSerial)){let bufferedMessage=this.serialQueue.get(expectedSerial);this.inSerial=bufferedMessage.serial;try{this.onmessage({data:bufferedMessage.data})}catch(e){global.app.console.error(e);global.app.console.warn(`Failed processing a ProxySocket message (due to ${e}), ignoring`)}this.serialQueue.delete(expectedSerial);expectedSerial++}},this.parseIncomingArray=function(arr){for(var i=0;i=4){if(that.curPollMs30*1e3){global.app.console.debug("Close connection after no response for 30secs");that._signalErrorClose()}else global.app.console.debug("High latency connection - too much in-flight, pausing.");return}that._setPollInterval(that.maxPollMs);var req=new XMLHttpRequest;const url=that.getEndPoint("write");req.open("POST",url);req.responseType="arraybuffer";req.addEventListener("load",function(){if(this.status==200){var data=new Uint8Array(this.response);if(data.length){that.curPollMs=that.minPollMs;that._setPollInterval(that.curPollMs);that.lastDataTimestamp=performance.now();that.parseIncomingArray(data);return}}else{global.app.console.debug("proxy: error on incoming response "+this.status);that._signalErrorClose()}if(that.curPollMs=that.minIdlePollsToThrottle*that.curPollMs){that.curPollMs=Math.min(that.maxPollMs,that.curPollMs*that.throttleFactor)|0}}that._setPollInterval(that.curPollMs)});req.addEventListener("loadend",function(){that.msgInflight--});const toSend=that.sendQueue;that.sendQueue="";that.msgInflight++;req.send(toSend.concat("."))};this.getSessionId=function(){if(this.openInflight>0){global.app.console.debug("Waiting for session open");return}if(this.delaySession)return;if(global.lastCreatedProxySocket){var msSince=performance.now()-global.lastCreatedProxySocket;if(msSince<250){var delay=250-msSince;global.app.console.debug("Wait to re-try session creation for "+delay+"ms");this.curPollMs=delay;this.delaySession=setTimeout(function(){that.delaySession=undefined;that.getSessionId()},delay);return}}global.lastCreatedProxySocket=performance.now();var req=new XMLHttpRequest;const endPoint=that.getEndPoint("open");req.open("POST",endPoint);req.responseType="text";req.addEventListener("load",function(){global.app.console.debug("got session: "+this.responseText);if(this.status!==200||!this.responseText||this.responseText.indexOf("\n")>=0){global.app.console.debug("Error: failed to fetch session id! error: "+this.status);that._signalErrorClose()}else{that.sessionId=this.responseText;that.readyState=1;that.onopen();that._setPollInterval(that.curPollMs)}});req.addEventListener("loadend",function(){global.app.console.debug("Open completed state: "+that.readyState);that.openInflight--});req.send("");this.openInflight++};this.send=function(msg){var hadData=this.sendQueue.length>0;this.sendQueue=this.sendQueue.concat("B0x"+this.outSerial.toString(16)+"\n"+"0x"+(new TextEncoder).encode(msg).length.toString(16)+"\n"+msg+"\n");this.outSerial++;if(that.curPollMs>that.minPollMs||!hadData){if(that.msgInflight<=3){that.curPollMs=that.minPollMs;that._setPollInterval(that.curPollMs)}}};this.sendCloseMsg=function(beacon){const url=that.getEndPoint("close");if(!beacon){var req=new XMLHttpRequest;req.open("POST",url);req.send("")}else navigator.sendBeacon(url,"")};this.close=function(){var oldState=this.readyState;global.app.console.debug("proxy: close socket");this.readyState=3;this.onclose();clearInterval(this.pollInterval);clearTimeout(this.delaySession);this.pollInterval=undefined;if(oldState===1)this.sendCloseMsg(this.unloading);this.sessionId="open"};this.setUnloading=function(){this.unloading=true};this.getEndPoint=function(command){var base=this.uri;return base+"/"+this.sessionId+"/"+command+"/"+this.outSerial};global.app.console.debug("proxy: new socket "+this.id+" "+this.uri);this.getSessionId()};class MobileSocket extends global.ProxySocket{constructor(url){super("cool:/cool/mobilesocket"+url);delete this.send;delete this._setPollInterval;delete this.close}send(data){global.postMobileMessage(data)}close(){}_setPollInterval(){}}global.iterateCSSImages=function(visitor){var visitUrls=function(rules,visitor,base){if(!rules)return;for(var r=0;r0)wopiSrc+="&"+wopiSrcParam}else if(wopiSrcParam&&wopiSrcParam.length>0){wopiSrc="?"+wopiSrcParam}suffix=suffix||"/ws";var encodedDocUrl=encodeURIComponent(docUrlParams)+suffix+wopiSrc;if(global.hexifyUrl)encodedDocUrl=global.hexEncode(encodedDocUrl);return root+encodedDocUrl+"/ws"};global.makeWsUrlWopiSrc=function(path,docUrlParams,suffix,wopiSrcParam){var websocketURI=global.makeWsUrl(path);return global.makeDocAndWopiSrcUrl(websocketURI,docUrlParams,suffix,wopiSrcParam)};global.makeHttpUrl=function(path){global.app.console.assert(global.webserver.startsWith("http"),"webserver is not http: "+global.webserver);return global.webserver+global.serviceRoot+path};global.makeHttpUrlWopiSrc=function(path,docUrlParams,suffix,wopiSrcParam){var httpURI=global.makeHttpUrl(path);return global.makeDocAndWopiSrcUrl(httpURI,docUrlParams,suffix,wopiSrcParam)};global.makeClientVisibleArea=function(){const width=window.innerWidth*15;const height=window.innerHeight*15;return"0;0;"+width+";"+height};global.hexEncode=function(string){var bytes=(new TextEncoder).encode(string);var hex="0x";for(var i=0;i