diff --git a/views/js/loader/diagnostic.min.js b/views/js/loader/diagnostic.min.js index c22170d..afc513f 100644 --- a/views/js/loader/diagnostic.min.js +++ b/views/js/loader/diagnostic.min.js @@ -1,2 +1,2 @@ -(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("taoClientDiagnostic/tools/fixedDecimals",[],function(){"use strict";return function fixedDecimals(value,decimals){const shift=Math.pow(10,Math.abs(decimals||1));return Math.round(+value*shift)/shift||0}}),define("taoClientDiagnostic/tools/stats",["lodash","taoClientDiagnostic/tools/fixedDecimals"],function(_,fixedDecimals){"use strict";var _Mathfloor=Math.floor,_Mathmax=Math.max,_Mathmin=Math.min;function valueGetter(name){return"function"==typeof name?name:item=>item&&item[name]||0}return function stats(list,fieldName,decimals){var _Mathceil=Math.ceil,_Mathsqrt=Math.sqrt,_NumberMAX_VALUE=Number.MAX_VALUE;const getValue=valueGetter(fieldName),values=[];let min=_NumberMAX_VALUE,max=0,count=0;const sum=_.reduce(list,(sum,item)=>{if("undefined"!=typeof item){const value=getValue(item);return values.push(value),min=_Mathmin(min,value),max=_Mathmax(max,value),sum+=value,count++,sum}},0),average=sum/(count||1),sum2=values.reduce((sum,value)=>{const diff=value-average;return sum+=diff*diff,sum},0),variance=1{results[key]=fixedDecimals(value,decimals)}),results.values=list,results}}),define("taoClientDiagnostic/tools/getConfig",["lodash"],function(_){"use strict";return function getConfig(config,defaults){return _(config||{}).omit(value=>null===value||"undefined"==typeof value).defaults(defaults||{}).value()}}),define("taoClientDiagnostic/tools/getLabels",[],function(){"use strict";var _Mathmax2=Math.max,_Mathmin2=Math.min;return function getLabels(messages,level){return messages=messages||{},Array.isArray(messages)||(messages=[messages]),level=_Mathmin2(_Mathmax2(parseInt(level,10)||0,1),messages.length||1)-1,messages[level]||{}}}),define("taoClientDiagnostic/tools/getStatus",["lodash"],function(_){"use strict";var _Mathmax3=Math.max;return function getStatus(percentage,thresholds,opts){const options=opts||{},testPercentage=_Mathmax3(0,Math.min(100,Math.round(parseInt(percentage,10)||0))),globalPercentage=options.minimumGlobalPercentage?_Mathmax3(testPercentage,options.minimumGlobalPercentage):testPercentage,status={percentage:testPercentage,globalPercentage:globalPercentage,quality:{}};if(thresholds){Array.isArray(thresholds)||(thresholds=[thresholds]);let feedback;const len=thresholds.length;for(let i=0;i=step.threshold))feedback=step;else break}feedback&&(status.feedback=_.clone(feedback))}return status}}),define("taoClientDiagnostic/tools/performances/tester",["jquery","lodash","i18n","async","context","helpers","taoClientDiagnostic/tools/stats","taoQtiItem/qtiItem/core/Loader","taoQtiItem/qtiCommonRenderer/renderers/Renderer","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus"],function($,_,__,async,context,helpers,stats,Loader,Renderer,getConfig,getLabels,getStatus){"use strict";var _Mathabs=Math.abs;function loadItem(data,done){const qtiJsonFile=`${data.url}qti.json`,urlTokens=data.url.split("/"),extension=urlTokens[0],fullpath=require.s.contexts._.config.paths[extension],baseUrl=data.url.replace(extension,fullpath),loader=new Loader,renderer=new Renderer({baseUrl:baseUrl});renderer.getAssetManager&&renderer.getAssetManager().setData("baseUrl",baseUrl),require([`json!${qtiJsonFile}`],function(itemData){loader.loadItemData(itemData,function(item){renderer.load(function(){const start=window.performance.now();item.setRenderer(this);const $container=$("
").appendTo("body");$container.append(item.render()),item.postRender(),$container.remove();const end=window.performance.now(),duration=(end-start)/_second,result={id:data.id,url:data.url,duration:duration};done(null,result)},this.getLoadedClasses())})})}const _second=1e3,_defaultTimeout=30000,_defaultOccurrencesCount=10,_defaultSamples=["taoClientDiagnostic/tools/performances/data/sample1/","taoClientDiagnostic/tools/performances/data/sample2/","taoClientDiagnostic/tools/performances/data/sample3/"],_defaults={id:"performances",optimal:.025,threshold:.25},_thresholds=[{threshold:0,message:__("Very slow performances"),type:"error"},{threshold:33,message:__("Average performances"),type:"warning"},{threshold:66,message:__("Good performances"),type:"success"}],_messages=[{title:__("Workstation performances"),status:__("Checking the performances..."),performancesMin:__("Minimum rendering time"),performancesMax:__("Maximum rendering time"),performancesAverage:__("Average rendering time")}],_sampleBaseId="sample";return function performancesTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);let idx=0;const _samples=_.map(!_.isEmpty(initConfig.samples)&&initConfig.samples||_defaultSamples,sample=>(idx++,{id:_sampleBaseId+idx,url:sample,timeout:1e3*initConfig.timeout||_defaultTimeout,nb:initConfig.occurrences||_defaultOccurrencesCount}));return _samples[0].nb++,{start(done){const tests=[];_.forEach(_samples,data=>{const cb=_.partial(loadItem,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),async.series(tests,(err,measures)=>{const decimals=2;if(err&&!measures.length)throw err;measures.shift();const results=stats(measures,"duration",2),status=this.getFeedback(results.average),summary=this.getSummary(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{performancesMin:{message:labels.performancesMin,value:`${results.min} s`},performancesMax:{message:labels.performancesMax,value:`${results.max} s`},performancesAverage:{message:labels.performancesAverage,value:`${results.average} s`}}},getFeedback(result){const optimal=initConfig.optimal,range=_Mathabs(optimal-initConfig.threshold),status=getStatus(100*((range+optimal-result)/range),_thresholds);return status.title=labels.title,status.id=initConfig.id,status}}}}),define("taoClientDiagnostic/tools/bandwidth/tester",["lodash","i18n","async","context","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/stats","taoClientDiagnostic/tools/fixedDecimals","taoClientDiagnostic/tools/getStatus"],function(_,__,async,context,getConfig,getLabels,stats,fixedDecimals,getStatus){"use strict";var _Mathfloor2=Math.floor,_Mathmax4=Math.max;function download(data,cb){if(data.threshold&&this.bandwidth{const end=window.performance.now();clearTimeout(timeoutId);const duration=end-start,bytes=data.size,seconds=duration/_second,speed=8*bytes/seconds/_mega;return this.bandwidth=_Mathmax4(this.bandwidth,speed),cb(null,{id:data.id,file:data.file,size:data.size,duration,speed})},request.onerror=err=>{clearTimeout(timeoutId),cb(err)},request.onreadystatechange=()=>{4===request.readyState&&200!==request.status&&(clearTimeout(timeoutId),cb(request.status))},request.send()}const _kilo=1024,_mega=1048576,_second=1e3,_thresholds=[{threshold:0,message:__("Low bandwidth"),type:"error"},{threshold:33,message:__("Average bandwidth"),type:"warning"},{threshold:66,message:__("Good bandwidth"),type:"success"}],_defaults={id:"bandwidth",unit:.16,ideal:45,max:100,minimumGlobalPercentage:!1,feedbackThresholds:_thresholds,fallbackThreshold:.2},_downloadData={"10KB":{id:"10KB",file:"data/bin10KB.data",size:10240,timeout:_second,threshold:0,nb:10},"100KB":{id:"100KB",file:"data/bin100KB.data",size:102400,timeout:2*_second,threshold:0,nb:5},"1MB":{id:"1MB",file:"data/bin1MB.data",size:_mega,timeout:20*_second,threshold:0,nb:3}},_messages=[{title:__("Bandwidth"),status:__("Checking the bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle"),bandwidthMin:__("Minimum bandwidth"),bandwidthMax:__("Maximum bandwidth"),bandwidthAverage:__("Average bandwidth")},{title:__("Media intensive bandwidth"),status:__("Checking the media intensive bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle with media intensive"),bandwidthMin:__("Minimum intensive bandwidth"),bandwidthMax:__("Maximum intensive bandwidth"),bandwidthAverage:__("Average intensive bandwidth")}];return function bandwidthTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return _.isArray(initConfig.feedbackThresholds)&&!initConfig.feedbackThresholds.length&&(initConfig.feedbackThresholds=_thresholds),{start(done){const tests=[];_.forEach(_downloadData,data=>{const cb=download.bind(this,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),this.bandwidth=0,async.series(tests,(err,measures)=>{function getValue(value){let speed=0;return value&&(duration+=value.duration,size+=value.size,speed=value.speed,value.speed=fixedDecimals(speed,decimals)),speed}let duration=0,size=0;const decimals=2,resultsBySize={};if(err&&!measures.length)throw err;const results=stats(measures,getValue,2);_.forEach(_downloadData,(data,key)=>{resultsBySize[key]=stats(_.filter(measures,o=>o.id===key),getValue,decimals)}),results.duration=fixedDecimals(duration/_second,2),results.size=size;const summary=this.getSummary(results),status=this.getFeedback(results,resultsBySize);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{bandwidthMin:{message:labels.bandwidthMin,value:results.min+" Mbps"},bandwidthMax:{message:labels.bandwidthMax,value:results.max+" Mbps"},bandwidthAverage:{message:labels.bandwidthAverage,value:results.average+" Mbps"}}},getFeedback(result,resultsBySize){const avgResult=result.average,bandwidthUnit=initConfig.unit,threshold=initConfig.ideal,maxTestTakers=initConfig.max,max=threshold*bandwidthUnit,getStatusOptions=initConfig.minimumGlobalPercentage?{minimumGlobalPercentage:initConfig.minimumGlobalPercentage}:{},baseBandwidth=avgResult;let stable=!0;_.forEach(resultsBySize,resultBySize=>{resultBySize.min/resultBySize.averagemaxTestTakers&&(nb=">"+maxTestTakers),status.id=initConfig.id,status.title=labels.title,status.feedback.legend=labels.legend,status.quality.label=nb,stable||(status.feedback.type="warning",status.feedback.message=__("Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience."),status.feedback.legend=__("Simultaneous test takers under normal connection conditions.")),2{const xhr=new window.XMLHttpRequest,startTime=Date.now();return xhr.upload.addEventListener("progress",evt=>{if(evt.lengthComputable){const passedTime=Date.now()-startTime;data.push({time:passedTime,loaded:evt.loaded,speed:8*evt.loaded/_mega/(passedTime/1e3)})}},!1),xhr}})}const _kilo=1024,_mega=1048576;let data=[];const _defaults={id:"upload",size:_mega,optimal:_mega},_thresholds=[{threshold:0,message:__("Low upload speed"),type:"error"},{threshold:33,message:__("Average upload speed"),type:"warning"},{threshold:66,message:__("Good upload speed"),type:"success"}],_messages=[{title:__("Upload speed"),status:__("Checking upload speed..."),uploadAvg:__("Average upload speed"),uploadMax:__("Max upload speed")}];return function uploadTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){upload(parseInt(initConfig.size,10)).then(()=>{let totalSpeed=0,maxSpeed=0;_.forEach(data,val=>{totalSpeed+=val.speed,maxSpeedlist.some(entry=>{const{browser,device,os,versions}=entry;return!(currentDevice!==device)&&!(os&&os.toLowerCase()!==currentOS)&&!(browser.toLowerCase()!==currentBrowser)&&_(versions).map(version=>version.split("-")).flatten().value().some(version=>0<=currentVersion.localeCompare(version,void 0,{numeric:!0}))},{}))}const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level),fetchBrowserList=()=>request({url:initConfig.browserslistUrl,noToken:!0}).catch(()=>[]);return{start(done){getPlatformInfo(window,initConfig).catch(err=>(logger.error(err),{browser:unknown,browserVersion:"",os:unknown,osVersion:"",isMobile:!1})).then(platformInfo=>checkBrowserSupport(platformInfo).then(browserSupported=>Object.assign(platformInfo,{browserSupported}))).then(platformInfo=>{request({url:urlHelper.route(initConfig.action,initConfig.controller,initConfig.extension),data:platformInfo,method:"POST",noToken:!0}).catch(()=>({success:!1,type:"error",message:__("Unable to validate the data as the server did not respond in time.")})).then(data=>{const percentage="success"===data.type?100:"warning"===data.type?33:0,status=this.getFeedback(percentage,data),summary=this.getSummary(platformInfo);status.customMsgRenderer=customMsg=>(customMsg||"").replace(_placeHolders.CURRENT_BROWSER,summary.browser.value).replace(_placeHolders.CURRENT_OS,summary.os.value),done(status,summary,platformInfo)})})},get labels(){return labels},getSummary(results){const currentBrowser=`${results.browser} ${results.browserVersion}`,currentOs=`${results.os} ${results.osVersion}`;return{browser:{message:labels.browser,value:currentBrowser},os:{message:labels.os,value:currentOs}}},getFeedback(result,data){const status=getStatus(result,data);return status.id=initConfig.id,status.title=labels.title,status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="

",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="

",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

",buffer}function program5(depth0,data){var stack1,helper,buffer="";return buffer+="

",(helper=helpers.setup)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.setup,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

",buffer}function program7(depth0,data){var helper,options,buffer="";return buffer+="\n

\n \n \n

\n

\n \n \n

\n ",buffer}function program9(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(12,program12,data),fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program10(depth0,data){var helper,options,buffer="";return buffer+="\n

\n \n \n

\n

\n \n \n

\n ",buffer}function program12(depth0,data){var helper,options,buffer="";return buffer+="\n

\n \n \n

\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
\n\n

",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

\n\n
\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.setup,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(7,program7,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
\n\n
\n \n
\n\n
    \n\n
    \n

    \n
    \n\n
    ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/result",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var helper,options,buffer="";return buffer+="\n
    \n \n \n
    \n
    \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this;return buffer+="
  • \n

    ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

    \n
    \n\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.details,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
  • ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/details",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
    \n

    "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Details",options):helperMissing.call(depth0,"__","Details",options)))+"

    \n
    \n \n \n ",stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
    \n
    \n
    ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="
    ",(helper=helpers.legend)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.legend,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
    ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="
    ",(helper=helpers.customMsg)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.customMsg,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
    ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
    \n \n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.legend,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.customMsg,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
    ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" wide"}function program3(depth0,data){var stack1,helper,buffer="";return buffer+=" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
    \n
    \n
    ",buffer})}),define("css!taoClientDiagnosticCss/diagnostics",[],function(){}),define("taoClientDiagnostic/tools/diagnostic/diagnostic",["jquery","lodash","i18n","async","ui/component","core/logger","core/store","core/request","core/dataProvider/request","ui/dialog/alert","ui/feedback","util/url","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/bandwidth/tester","taoClientDiagnostic/tools/upload/tester","taoClientDiagnostic/tools/browser/tester","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/getConfig","tpl!taoClientDiagnostic/tools/diagnostic/tpl/main","tpl!taoClientDiagnostic/tools/diagnostic/tpl/result","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","css!taoClientDiagnosticCss/diagnostics"],function($,_,__,async,component,loggerFactory,store,request,requestData,dialogAlert,feedback,urlHelper,performancesTester,bandwidthTester,uploadTester,browserTester,getStatus,getConfig,mainTpl,resultTpl,detailsTpl,feedbackTpl,qualityBarTpl){"use strict";const logger=loggerFactory("taoClientDiagnostic/diagnostic"),_defaults={title:__("System Compatibility"),header:__("This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform."),info:__("Be aware that these tests will take up to several minutes."),button:__("Test system compatibility"),actionStore:"storeData",actionSchool:"schoolName",controller:"DiagnosticChecker",extension:"taoClientDiagnostic",actionDropId:"deleteId",storeAllRuns:!1,configurableText:{}},_thresholds=[{threshold:0,message:__("Your system requires a compatibility update, please contact your system administrator."),type:"error"},{threshold:33,message:__("Your system is not optimal, please contact your system administrator."),type:"warning"},{threshold:66,message:__("Your system is fully compliant."),type:"success"}],diagnostic={changeStatus(status){return this.is("rendered")&&this.controls.$status.html(status),this},store(type,data,done){const config=this.config,url=urlHelper.route(config.actionStore,config.controller,config.extension,config.storeParams);data=_.omit(data,"values"),data.type=type,request({url,data,method:"POST",noToken:!0}).then(done).catch(err=>{logger.error(err),feedback().error(__("Unable to save the results! Please check your connection.")),done()})},getCustomMsg(key){return this.config.configurableText[key]},addCustomFeedbackMsg(status,msg){this.hasFailed(status)&&msg&&(_.isFunction(status.customMsgRenderer)&&(msg=status.customMsgRenderer(msg)),status.feedback=status.feedback||{},status.feedback.customMsg=msg)},hasFailed(result){return!(result&&result.feedback&&"success"===result.feedback.type)},addResult(result){if(this.is("rendered")){result.quality&&result.quality.label&&2{$indicator.length&&$indicator.animate({left:result.percentage*$main.outerWidth()/100-$indicator.outerWidth()/2})})}return this},cleanUp(){return this.controls.$results.empty(),this},enable(){return this.controls.$start.removeClass("hidden"),this},disable(){return this.controls.$start.addClass("hidden"),this},prepare(){return this.trigger("start"),this.changeStatus(__("Starting...")),this.setState("running",!0),this.setState("done",!1),this.cleanUp(),this.disable(),this},finish(){const config=this.config;return this.enable(),config.storeAllRuns&&this.deleteIdentifier(),this.trigger("end"),this.changeStatus(__("Done!")),this.setState("running",!1),this.setState("done",!0),this},deleteIdentifier(){const url=urlHelper.route(this.config.actionDropId,this.config.controller,this.config.extension);return request({url,method:"POST",noToken:!0})},run(){const information=[],scores={},testers=[],customInput=this.getCustomInput(),doRun=()=>{const doCheck=(testerConfig,cb)=>{const testerId=testerConfig.id;this.trigger("starttester",testerId),this.setState(testerId,!0);const processTester=testerFactory=>{const tester=testerFactory(getConfig(testerConfig,this.config),this);this.changeStatus(tester.labels.status),tester.start((status,details,results)=>{if(testerConfig.customMsgKey){const customMsg=this.getCustomMsg(testerConfig.customMsgKey);this.addCustomFeedbackMsg(status,customMsg)}_.forEach(details,info=>information.push(info)),scores[status.id]=status,this.trigger("endtester",testerId,status),this.setState(testerId,!1),results=_.mapValues(results,value=>{switch(typeof value){case"boolean":return value?1:0;case"object":return JSON.stringify(value)}return value}),this.store(testerId,results,()=>{this.addResult(status),cb()})})},processFailure=err=>{logger.error(err),feedback().error(__("Unable to process with the diagnostic tester %s. The tester module is unreachable.",testerId)),cb()};require([testerConfig.tester],processTester,processFailure)};this.is("rendered")&&(this.prepare(),_.forEach(this.config.testers,(testerConfig,testerId)=>{testerConfig.id=testerConfig.id||testerId,testerConfig.enabled&&testers.push(cb=>doCheck(testerConfig,cb))}),async.series(testers,()=>{const total=_.minBy(scores,"globalPercentage"),status=getStatus(total.globalPercentage,_thresholds);status.title=__("Total"),status.id="total",this.addCustomFeedbackMsg(status,this.config.configurableText.diagTotalCheckResult),status.details=information,this.addResult(status),this.finish()}))};return 0<_.size(customInput)?this.store("custom_input",customInput,doRun):doRun(),this},getCustomInput(){const vars={};return window.location.href.replace(location.hash,"").replace(/[?&]+([^=&]+)=?([^&]*)?/gi,(m,key,value)=>{_.has(this.config.customInput,key)&&(vars[key]="undefined"==typeof value?"":value)}),vars}};return function diagnosticFactory(container,config){config&&_.forEach(["title","header","footer","info","button"],name=>{config[name]&&(config[name]=__(config[name]))});const diagComponent=component(diagnostic,_defaults).setTemplate(mainTpl).on("destroy",function onDiagnosticDestroy(){this.controls=null}).on("init",function onDiagnosticInit(){this.render(container)}).on("render",function onDiagnosticRender(){function getInputValue(name){const $control=getControl(name);return($control&&$control.val()||"").trim()}function setInputValue(name,value){const $control=getControl(name);$control&&$control.val(value)}function toggleControl(name,state){const $control=getControl(name);$control&&("undefined"==typeof state&&(state=!$control.is(":enabled")),state?$control.prop("disabled",!1):$control.prop("disabled",!0))}const runDiagnostics=data=>{data&&_.isPlainObject(data)&&(this.config.storeParams=_.assign(this.config.storeParams||{},data)),this.run()};let launch=()=>runDiagnostics();const getControl=name=>this.controls[`\$${name}`],requestSchoolName=values=>{const componentConfig=this.config;return requestData(urlHelper.route(componentConfig.actionSchool,componentConfig.controller,componentConfig.extension),values,"POST").then(data=>({school_name:data,school_number:values.school_number}))},manageSchoolProperties=(fields,validate)=>{function toggleStart(){const allow=_.every(fields,getInputValue);return toggleControl("start",allow),allow}function toggleFields(state){_.forEach(fields,function(fieldName){toggleControl(fieldName,state)})}_.forEach(fields,fieldName=>{this.controls[`\$${fieldName}`]=this.getElement().find(`[data-control="${fieldName}"]`).on("keypress",e=>{const shouldStart=13===e.which;shouldStart&&e.preventDefault(),_.defer(()=>{toggleStart()&&shouldStart&&this.controls.$start.click()})})}),toggleStart(),toggleFields(!1),store("client-diagnostic").then(storage=>(this.on("start.school",()=>{_.forEach(fields,fieldName=>{storage.setItem(fieldName,getInputValue(fieldName)).catch(error=>{logger.error(error)})})}),Promise.all(_.map(fields,fieldName=>storage.getItem(fieldName).then(value=>{setInputValue(fieldName,value)}))))).catch(error=>{logger.error(error)}).then(()=>{toggleFields(!0),toggleStart()}),launch=()=>{const values=_.reduce(fields,(result,fieldName)=>(result[fieldName]=getInputValue(fieldName),result),{});this.changeStatus(__("Getting school name...")).cleanUp().disable(),_.isFunction(validate)?validate(values).then(runDiagnostics).catch(error=>{const response=error.response||{},message=response.errorMsg||response.errorMessage||__("An error occurred! Please verify your input!");dialogAlert(message),logger.error(error),this.changeStatus(__("Failed to get school name")).enable()}):runDiagnostics(values)},this.on("start.school",()=>{toggleFields(!1)}).on("end.school",()=>{toggleFields(!0)})};this.controls={$start:this.$component.find("[data-action=\"test-launcher\"]"),$status:this.$component.find(".status h2"),$results:this.$component.find(".results")},this.controls.$start.on("click",()=>{this.controls.$start.is(":enabled")&&launch()}),this.config.requireSchoolName&&(this.config.validateSchoolName?manageSchoolProperties(["school_number","school_pin"],requestSchoolName):manageSchoolProperties(["school_name"])),this.config.requireSchoolId&&manageSchoolProperties(["school_id","workstation"]),this.controls.$results.on("click","button[data-action=\"show-details\"]",function onShowDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.removeClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"hide-details\"]").removeClass("hidden")}),this.controls.$results.on("click","button[data-action=\"hide-details\"]",function onHideDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.addClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"show-details\"]").removeClass("hidden")})});return _.defer(()=>diagComponent.init(config)),diagComponent}}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\"Source Sans Pro\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\"Source Sans Pro\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\" - \"}table.datatable .progress .item-time:before{content:\" (\"}table.datatable .progress .item-time .total:before{content:\" / \"}table.datatable .progress .item-time:after{content:\")\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\"Source Sans Pro\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\"Source Sans Pro\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */"),define("taoClientDiagnostic/loader/diagnostic.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoQtiItem/loader/taoQtiItem.min","taoItems/loader/taoItems.min"]); +(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("taoClientDiagnostic/tools/fixedDecimals",[],function(){"use strict";return function fixedDecimals(value,decimals){const shift=Math.pow(10,Math.abs(decimals||1));return Math.round(+value*shift)/shift||0}}),define("taoClientDiagnostic/tools/stats",["lodash","taoClientDiagnostic/tools/fixedDecimals"],function(_,fixedDecimals){"use strict";var _Mathfloor=Math.floor,_Mathmax=Math.max,_Mathmin=Math.min;function valueGetter(name){return"function"==typeof name?name:item=>item&&item[name]||0}return function stats(list,fieldName,decimals){var _Mathceil=Math.ceil,_Mathsqrt=Math.sqrt,_NumberMAX_VALUE=Number.MAX_VALUE;const getValue=valueGetter(fieldName),values=[];let min=_NumberMAX_VALUE,max=0,count=0;const sum=_.reduce(list,(sum,item)=>{if("undefined"!=typeof item){const value=getValue(item);return values.push(value),min=_Mathmin(min,value),max=_Mathmax(max,value),sum+=value,count++,sum}},0),average=sum/(count||1),sum2=values.reduce((sum,value)=>{const diff=value-average;return sum+=diff*diff,sum},0),variance=1{results[key]=fixedDecimals(value,decimals)}),results.values=list,results}}),define("taoClientDiagnostic/tools/getConfig",["lodash"],function(_){"use strict";return function getConfig(config,defaults){return _(config||{}).omitBy(value=>null===value||"undefined"==typeof value).defaults(defaults||{}).value()}}),define("taoClientDiagnostic/tools/getLabels",[],function(){"use strict";var _Mathmax2=Math.max,_Mathmin2=Math.min;return function getLabels(messages,level){return messages=messages||{},Array.isArray(messages)||(messages=[messages]),level=_Mathmin2(_Mathmax2(parseInt(level,10)||0,1),messages.length||1)-1,messages[level]||{}}}),define("taoClientDiagnostic/tools/getStatus",["lodash"],function(_){"use strict";var _Mathmax3=Math.max;return function getStatus(percentage,thresholds,opts){const options=opts||{},testPercentage=_Mathmax3(0,Math.min(100,Math.round(parseInt(percentage,10)||0))),globalPercentage=options.minimumGlobalPercentage?_Mathmax3(testPercentage,options.minimumGlobalPercentage):testPercentage,status={percentage:testPercentage,globalPercentage:globalPercentage,quality:{}};if(thresholds){Array.isArray(thresholds)||(thresholds=[thresholds]);let feedback;const len=thresholds.length;for(let i=0;i=step.threshold))feedback=step;else break}feedback&&(status.feedback=_.clone(feedback))}return status}}),define("taoClientDiagnostic/tools/performances/tester",["jquery","lodash","i18n","async","context","helpers","taoClientDiagnostic/tools/stats","taoQtiItem/qtiItem/core/Loader","taoQtiItem/qtiCommonRenderer/renderers/Renderer","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus"],function($,_,__,async,context,helpers,stats,Loader,Renderer,getConfig,getLabels,getStatus){"use strict";var _Mathabs=Math.abs;function loadItem(data,done){const qtiJsonFile=`${data.url}qti.json`,urlTokens=data.url.split("/"),extension=urlTokens[0],fullpath=require.s.contexts._.config.paths[extension],baseUrl=data.url.replace(extension,fullpath),loader=new Loader,renderer=new Renderer({baseUrl:baseUrl});renderer.getAssetManager&&renderer.getAssetManager().setData("baseUrl",baseUrl),require([`json!${qtiJsonFile}`],function(itemData){loader.loadItemData(itemData,function(item){renderer.load(function(){const start=window.performance.now();item.setRenderer(this);const $container=$("
    ").appendTo("body");$container.append(item.render()),item.postRender(),$container.remove();const end=window.performance.now(),duration=(end-start)/_second,result={id:data.id,url:data.url,duration:duration};done(null,result)},this.getLoadedClasses())})})}const _second=1e3,_defaultTimeout=30000,_defaultOccurrencesCount=10,_defaultSamples=["taoClientDiagnostic/tools/performances/data/sample1/","taoClientDiagnostic/tools/performances/data/sample2/","taoClientDiagnostic/tools/performances/data/sample3/"],_defaults={id:"performances",optimal:.025,threshold:.25},_thresholds=[{threshold:0,message:__("Very slow performances"),type:"error"},{threshold:33,message:__("Average performances"),type:"warning"},{threshold:66,message:__("Good performances"),type:"success"}],_messages=[{title:__("Workstation performances"),status:__("Checking the performances..."),performancesMin:__("Minimum rendering time"),performancesMax:__("Maximum rendering time"),performancesAverage:__("Average rendering time")}],_sampleBaseId="sample";return function performancesTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);let idx=0;const _samples=_.map(!_.isEmpty(initConfig.samples)&&initConfig.samples||_defaultSamples,sample=>(idx++,{id:_sampleBaseId+idx,url:sample,timeout:1e3*initConfig.timeout||_defaultTimeout,nb:initConfig.occurrences||_defaultOccurrencesCount}));return _samples[0].nb++,{start(done){const tests=[];_.forEach(_samples,data=>{const cb=_.partial(loadItem,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),async.series(tests,(err,measures)=>{const decimals=2;if(err&&!measures.length)throw err;measures.shift();const results=stats(measures,"duration",2),status=this.getFeedback(results.average),summary=this.getSummary(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{performancesMin:{message:labels.performancesMin,value:`${results.min} s`},performancesMax:{message:labels.performancesMax,value:`${results.max} s`},performancesAverage:{message:labels.performancesAverage,value:`${results.average} s`}}},getFeedback(result){const optimal=initConfig.optimal,range=_Mathabs(optimal-initConfig.threshold),status=getStatus(100*((range+optimal-result)/range),_thresholds);return status.title=labels.title,status.id=initConfig.id,status}}}}),define("taoClientDiagnostic/tools/bandwidth/tester",["lodash","i18n","async","context","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/stats","taoClientDiagnostic/tools/fixedDecimals","taoClientDiagnostic/tools/getStatus"],function(_,__,async,context,getConfig,getLabels,stats,fixedDecimals,getStatus){"use strict";var _Mathfloor2=Math.floor,_Mathmax4=Math.max;function download(data,cb){if(data.threshold&&this.bandwidth{const end=window.performance.now();clearTimeout(timeoutId);const duration=end-start,bytes=data.size,seconds=duration/_second,speed=8*bytes/seconds/_mega;return this.bandwidth=_Mathmax4(this.bandwidth,speed),cb(null,{id:data.id,file:data.file,size:data.size,duration,speed})},request.onerror=err=>{clearTimeout(timeoutId),cb(err)},request.onreadystatechange=()=>{4===request.readyState&&200!==request.status&&(clearTimeout(timeoutId),cb(request.status))},request.send()}const _kilo=1024,_mega=1048576,_second=1e3,_thresholds=[{threshold:0,message:__("Low bandwidth"),type:"error"},{threshold:33,message:__("Average bandwidth"),type:"warning"},{threshold:66,message:__("Good bandwidth"),type:"success"}],_defaults={id:"bandwidth",unit:.16,ideal:45,max:100,minimumGlobalPercentage:!1,feedbackThresholds:_thresholds,fallbackThreshold:.2},_downloadData={"10KB":{id:"10KB",file:"data/bin10KB.data",size:10240,timeout:_second,threshold:0,nb:10},"100KB":{id:"100KB",file:"data/bin100KB.data",size:102400,timeout:2*_second,threshold:0,nb:5},"1MB":{id:"1MB",file:"data/bin1MB.data",size:_mega,timeout:20*_second,threshold:0,nb:3}},_messages=[{title:__("Bandwidth"),status:__("Checking the bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle"),bandwidthMin:__("Minimum bandwidth"),bandwidthMax:__("Maximum bandwidth"),bandwidthAverage:__("Average bandwidth")},{title:__("Media intensive bandwidth"),status:__("Checking the media intensive bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle with media intensive"),bandwidthMin:__("Minimum intensive bandwidth"),bandwidthMax:__("Maximum intensive bandwidth"),bandwidthAverage:__("Average intensive bandwidth")}];return function bandwidthTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return _.isArray(initConfig.feedbackThresholds)&&!initConfig.feedbackThresholds.length&&(initConfig.feedbackThresholds=_thresholds),{start(done){const tests=[];_.forEach(_downloadData,data=>{const cb=download.bind(this,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),this.bandwidth=0,async.series(tests,(err,measures)=>{function getValue(value){let speed=0;return value&&(duration+=value.duration,size+=value.size,speed=value.speed,value.speed=fixedDecimals(speed,decimals)),speed}let duration=0,size=0;const decimals=2,resultsBySize={};if(err&&!measures.length)throw err;const results=stats(measures,getValue,2);_.forEach(_downloadData,(data,key)=>{resultsBySize[key]=stats(_.filter(measures,o=>o.id===key),getValue,decimals)}),results.duration=fixedDecimals(duration/_second,2),results.size=size;const summary=this.getSummary(results),status=this.getFeedback(results,resultsBySize);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{bandwidthMin:{message:labels.bandwidthMin,value:results.min+" Mbps"},bandwidthMax:{message:labels.bandwidthMax,value:results.max+" Mbps"},bandwidthAverage:{message:labels.bandwidthAverage,value:results.average+" Mbps"}}},getFeedback(result,resultsBySize){const avgResult=result.average,bandwidthUnit=initConfig.unit,threshold=initConfig.ideal,maxTestTakers=initConfig.max,max=threshold*bandwidthUnit,getStatusOptions=initConfig.minimumGlobalPercentage?{minimumGlobalPercentage:initConfig.minimumGlobalPercentage}:{},baseBandwidth=avgResult;let stable=!0;_.forEach(resultsBySize,resultBySize=>{resultBySize.min/resultBySize.averagemaxTestTakers&&(nb=">"+maxTestTakers),status.id=initConfig.id,status.title=labels.title,status.feedback.legend=labels.legend,status.quality.label=nb,stable||(status.feedback.type="warning",status.feedback.message=__("Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience."),status.feedback.legend=__("Simultaneous test takers under normal connection conditions.")),2{const xhr=new window.XMLHttpRequest,startTime=Date.now();return xhr.upload.addEventListener("progress",evt=>{if(evt.lengthComputable){const passedTime=Date.now()-startTime;data.push({time:passedTime,loaded:evt.loaded,speed:8*evt.loaded/_mega/(passedTime/1e3)})}},!1),xhr}})}const _kilo=1024,_mega=1048576;let data=[];const _defaults={id:"upload",size:_mega,optimal:_mega},_thresholds=[{threshold:0,message:__("Low upload speed"),type:"error"},{threshold:33,message:__("Average upload speed"),type:"warning"},{threshold:66,message:__("Good upload speed"),type:"success"}],_messages=[{title:__("Upload speed"),status:__("Checking upload speed..."),uploadAvg:__("Average upload speed"),uploadMax:__("Max upload speed")}];return function uploadTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){upload(parseInt(initConfig.size,10)).then(()=>{let totalSpeed=0,maxSpeed=0;_.forEach(data,val=>{totalSpeed+=val.speed,maxSpeedlist.some(entry=>{const{browser,device,os,versions}=entry;return!(currentDevice!==device)&&!(os&&os.toLowerCase()!==currentOS)&&!(browser.toLowerCase()!==currentBrowser)&&_(versions).map(version=>version.split("-")).flatten().value().some(version=>0<=currentVersion.localeCompare(version,void 0,{numeric:!0}))},{}))}const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level),fetchBrowserList=()=>request({url:initConfig.browserslistUrl,noToken:!0}).catch(()=>[]);return{start(done){getPlatformInfo(window,initConfig).catch(err=>(logger.error(err),{browser:unknown,browserVersion:"",os:unknown,osVersion:"",isMobile:!1})).then(platformInfo=>checkBrowserSupport(platformInfo).then(browserSupported=>Object.assign(platformInfo,{browserSupported}))).then(platformInfo=>{request({url:urlHelper.route(initConfig.action,initConfig.controller,initConfig.extension),data:platformInfo,method:"POST",noToken:!0}).catch(()=>({success:!1,type:"error",message:__("Unable to validate the data as the server did not respond in time.")})).then(data=>{const percentage="success"===data.type?100:"warning"===data.type?33:0,status=this.getFeedback(percentage,data),summary=this.getSummary(platformInfo);status.customMsgRenderer=customMsg=>(customMsg||"").replace(_placeHolders.CURRENT_BROWSER,summary.browser.value).replace(_placeHolders.CURRENT_OS,summary.os.value),done(status,summary,platformInfo)})})},get labels(){return labels},getSummary(results){const currentBrowser=`${results.browser} ${results.browserVersion}`,currentOs=`${results.os} ${results.osVersion}`;return{browser:{message:labels.browser,value:currentBrowser},os:{message:labels.os,value:currentOs}}},getFeedback(result,data){const status=getStatus(result,data);return status.id=initConfig.id,status.title=labels.title,status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="

    ",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

    ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="

    ",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

    ",buffer}function program5(depth0,data){var stack1,helper,buffer="";return buffer+="

    ",(helper=helpers.setup)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.setup,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

    ",buffer}function program7(depth0,data){var helper,options,buffer="";return buffer+="\n

    \n \n \n

    \n

    \n \n \n

    \n ",buffer}function program9(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(12,program12,data),fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program10(depth0,data){var helper,options,buffer="";return buffer+="\n

    \n \n \n

    \n

    \n \n \n

    \n ",buffer}function program12(depth0,data){var helper,options,buffer="";return buffer+="\n

    \n \n \n

    \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
    \n\n

    ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

    \n\n
    \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.setup,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(7,program7,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
    \n\n
    \n \n
    \n\n
      \n\n
      \n

      \n
      \n\n
      ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/result",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var helper,options,buffer="";return buffer+="\n
      \n \n \n
      \n
      \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this;return buffer+="
    • \n

      ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

      \n
      \n\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.details,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
    • ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/details",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
      \n

      "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Details",options):helperMissing.call(depth0,"__","Details",options)))+"

      \n
      \n \n \n ",stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
      \n
      \n
      ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="
      ",(helper=helpers.legend)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.legend,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
      ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="
      ",(helper=helpers.customMsg)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.customMsg,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
      ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
      \n \n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.legend,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.customMsg,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
      ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" wide"}function program3(depth0,data){var stack1,helper,buffer="";return buffer+=" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
      \n
      \n
      ",buffer})}),define("css!taoClientDiagnosticCss/diagnostics",[],function(){}),define("taoClientDiagnostic/tools/diagnostic/diagnostic",["jquery","lodash","i18n","async","ui/component","core/logger","core/store","core/request","core/dataProvider/request","ui/dialog/alert","ui/feedback","util/url","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/bandwidth/tester","taoClientDiagnostic/tools/upload/tester","taoClientDiagnostic/tools/browser/tester","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/getConfig","tpl!taoClientDiagnostic/tools/diagnostic/tpl/main","tpl!taoClientDiagnostic/tools/diagnostic/tpl/result","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","css!taoClientDiagnosticCss/diagnostics"],function($,_,__,async,component,loggerFactory,store,request,requestData,dialogAlert,feedback,urlHelper,performancesTester,bandwidthTester,uploadTester,browserTester,getStatus,getConfig,mainTpl,resultTpl,detailsTpl,feedbackTpl,qualityBarTpl){"use strict";const logger=loggerFactory("taoClientDiagnostic/diagnostic"),_defaults={title:__("System Compatibility"),header:__("This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform."),info:__("Be aware that these tests will take up to several minutes."),button:__("Test system compatibility"),actionStore:"storeData",actionSchool:"schoolName",controller:"DiagnosticChecker",extension:"taoClientDiagnostic",actionDropId:"deleteId",storeAllRuns:!1,configurableText:{}},_thresholds=[{threshold:0,message:__("Your system requires a compatibility update, please contact your system administrator."),type:"error"},{threshold:33,message:__("Your system is not optimal, please contact your system administrator."),type:"warning"},{threshold:66,message:__("Your system is fully compliant."),type:"success"}],diagnostic={changeStatus(status){return this.is("rendered")&&this.controls.$status.html(status),this},store(type,data,done){const config=this.config,url=urlHelper.route(config.actionStore,config.controller,config.extension,config.storeParams);data=_.omit(data,"values"),data.type=type,request({url,data,method:"POST",noToken:!0}).then(done).catch(err=>{logger.error(err),feedback().error(__("Unable to save the results! Please check your connection.")),done()})},getCustomMsg(key){return this.config.configurableText[key]},addCustomFeedbackMsg(status,msg){this.hasFailed(status)&&msg&&(_.isFunction(status.customMsgRenderer)&&(msg=status.customMsgRenderer(msg)),status.feedback=status.feedback||{},status.feedback.customMsg=msg)},hasFailed(result){return!(result&&result.feedback&&"success"===result.feedback.type)},addResult(result){if(this.is("rendered")){result.quality&&result.quality.label&&2{$indicator.length&&$indicator.animate({left:result.percentage*$main.outerWidth()/100-$indicator.outerWidth()/2})})}return this},cleanUp(){return this.controls.$results.empty(),this},enable(){return this.controls.$start.removeClass("hidden"),this},disable(){return this.controls.$start.addClass("hidden"),this},prepare(){return this.trigger("start"),this.changeStatus(__("Starting...")),this.setState("running",!0),this.setState("done",!1),this.cleanUp(),this.disable(),this},finish(){const config=this.config;return this.enable(),config.storeAllRuns&&this.deleteIdentifier(),this.trigger("end"),this.changeStatus(__("Done!")),this.setState("running",!1),this.setState("done",!0),this},deleteIdentifier(){const url=urlHelper.route(this.config.actionDropId,this.config.controller,this.config.extension);return request({url,method:"POST",noToken:!0})},run(){const information=[],scores={},testers=[],customInput=this.getCustomInput(),doRun=()=>{const doCheck=(testerConfig,cb)=>{const testerId=testerConfig.id;this.trigger("starttester",testerId),this.setState(testerId,!0);const processTester=testerFactory=>{const tester=testerFactory(getConfig(testerConfig,this.config),this);this.changeStatus(tester.labels.status),tester.start((status,details,results)=>{if(testerConfig.customMsgKey){const customMsg=this.getCustomMsg(testerConfig.customMsgKey);this.addCustomFeedbackMsg(status,customMsg)}_.forEach(details,info=>information.push(info)),scores[status.id]=status,this.trigger("endtester",testerId,status),this.setState(testerId,!1),results=_.mapValues(results,value=>{switch(typeof value){case"boolean":return value?1:0;case"object":return JSON.stringify(value)}return value}),this.store(testerId,results,()=>{this.addResult(status),cb()})})},processFailure=err=>{logger.error(err),feedback().error(__("Unable to process with the diagnostic tester %s. The tester module is unreachable.",testerId)),cb()};require([testerConfig.tester],processTester,processFailure)};this.is("rendered")&&(this.prepare(),_.forEach(this.config.testers,(testerConfig,testerId)=>{testerConfig.id=testerConfig.id||testerId,testerConfig.enabled&&testers.push(cb=>doCheck(testerConfig,cb))}),async.series(testers,()=>{const total=_.minBy(scores,"globalPercentage"),status=getStatus(total.globalPercentage,_thresholds);status.title=__("Total"),status.id="total",this.addCustomFeedbackMsg(status,this.config.configurableText.diagTotalCheckResult),status.details=information,this.addResult(status),this.finish()}))};return 0<_.size(customInput)?this.store("custom_input",customInput,doRun):doRun(),this},getCustomInput(){const vars={};return window.location.href.replace(location.hash,"").replace(/[?&]+([^=&]+)=?([^&]*)?/gi,(m,key,value)=>{_.has(this.config.customInput,key)&&(vars[key]="undefined"==typeof value?"":value)}),vars}};return function diagnosticFactory(container,config){config&&_.forEach(["title","header","footer","info","button"],name=>{config[name]&&(config[name]=__(config[name]))});const diagComponent=component(diagnostic,_defaults).setTemplate(mainTpl).on("destroy",function onDiagnosticDestroy(){this.controls=null}).on("init",function onDiagnosticInit(){this.render(container)}).on("render",function onDiagnosticRender(){function getInputValue(name){const $control=getControl(name);return($control&&$control.val()||"").trim()}function setInputValue(name,value){const $control=getControl(name);$control&&$control.val(value)}function toggleControl(name,state){const $control=getControl(name);$control&&("undefined"==typeof state&&(state=!$control.is(":enabled")),state?$control.prop("disabled",!1):$control.prop("disabled",!0))}const runDiagnostics=data=>{data&&_.isPlainObject(data)&&(this.config.storeParams=_.assign(this.config.storeParams||{},data)),this.run()};let launch=()=>runDiagnostics();const getControl=name=>this.controls[`\$${name}`],requestSchoolName=values=>{const componentConfig=this.config;return requestData(urlHelper.route(componentConfig.actionSchool,componentConfig.controller,componentConfig.extension),values,"POST").then(data=>({school_name:data,school_number:values.school_number}))},manageSchoolProperties=(fields,validate)=>{function toggleStart(){const allow=_.every(fields,getInputValue);return toggleControl("start",allow),allow}function toggleFields(state){_.forEach(fields,function(fieldName){toggleControl(fieldName,state)})}_.forEach(fields,fieldName=>{this.controls[`\$${fieldName}`]=this.getElement().find(`[data-control="${fieldName}"]`).on("keypress",e=>{const shouldStart=13===e.which;shouldStart&&e.preventDefault(),_.defer(()=>{toggleStart()&&shouldStart&&this.controls.$start.click()})})}),toggleStart(),toggleFields(!1),store("client-diagnostic").then(storage=>(this.on("start.school",()=>{_.forEach(fields,fieldName=>{storage.setItem(fieldName,getInputValue(fieldName)).catch(error=>{logger.error(error)})})}),Promise.all(_.map(fields,fieldName=>storage.getItem(fieldName).then(value=>{setInputValue(fieldName,value)}))))).catch(error=>{logger.error(error)}).then(()=>{toggleFields(!0),toggleStart()}),launch=()=>{const values=_.reduce(fields,(result,fieldName)=>(result[fieldName]=getInputValue(fieldName),result),{});this.changeStatus(__("Getting school name...")).cleanUp().disable(),_.isFunction(validate)?validate(values).then(runDiagnostics).catch(error=>{const response=error.response||{},message=response.errorMsg||response.errorMessage||__("An error occurred! Please verify your input!");dialogAlert(message),logger.error(error),this.changeStatus(__("Failed to get school name")).enable()}):runDiagnostics(values)},this.on("start.school",()=>{toggleFields(!1)}).on("end.school",()=>{toggleFields(!0)})};this.controls={$start:this.$component.find("[data-action=\"test-launcher\"]"),$status:this.$component.find(".status h2"),$results:this.$component.find(".results")},this.controls.$start.on("click",()=>{this.controls.$start.is(":enabled")&&launch()}),this.config.requireSchoolName&&(this.config.validateSchoolName?manageSchoolProperties(["school_number","school_pin"],requestSchoolName):manageSchoolProperties(["school_name"])),this.config.requireSchoolId&&manageSchoolProperties(["school_id","workstation"]),this.controls.$results.on("click","button[data-action=\"show-details\"]",function onShowDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.removeClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"hide-details\"]").removeClass("hidden")}),this.controls.$results.on("click","button[data-action=\"hide-details\"]",function onHideDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.addClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"show-details\"]").removeClass("hidden")})});return _.defer(()=>diagComponent.init(config)),diagComponent}}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\"Source Sans Pro\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\"Source Sans Pro\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\" - \"}table.datatable .progress .item-time:before{content:\" (\"}table.datatable .progress .item-time .total:before{content:\" / \"}table.datatable .progress .item-time:after{content:\")\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\"Source Sans Pro\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\"Source Sans Pro\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */"),define("taoClientDiagnostic/loader/diagnostic.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoQtiItem/loader/taoQtiItem.min","taoItems/loader/taoItems.min"]); //# sourceMappingURL=diagnostic.min.js.map \ No newline at end of file diff --git a/views/js/loader/diagnostic.min.js.map b/views/js/loader/diagnostic.min.js.map index 5ff5276..5887a11 100644 --- a/views/js/loader/diagnostic.min.js.map +++ b/views/js/loader/diagnostic.min.js.map @@ -1 +1 @@ -{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","fixedDecimals","value","decimals","shift","Math","pow","abs","round","_","_Mathfloor","floor","_Mathmax","max","_Mathmin","min","valueGetter","name","stats","list","fieldName","_Mathceil","ceil","_Mathsqrt","sqrt","_NumberMAX_VALUE","Number","MAX_VALUE","getValue","values","count","sum","reduce","push","average","sum2","diff","variance","sort","middle","median","results","key","getConfig","config","defaults","omit","_Mathmax2","_Mathmin2","getLabels","messages","level","Array","isArray","parseInt","_Mathmax3","getStatus","percentage","thresholds","opts","options","testPercentage","globalPercentage","minimumGlobalPercentage","status","quality","feedback","len","i","step","threshold","clone","$","__","async","context","helpers","Loader","Renderer","_Mathabs","loadItem","data","done","qtiJsonFile","url","urlTokens","split","extension","fullpath","s","contexts","paths","baseUrl","replace","loader","renderer","getAssetManager","setData","itemData","loadItemData","load","performance","now","setRenderer","$container","appendTo","append","render","postRender","remove","end","duration","_second","result","id","getLoadedClasses","_defaultTimeout","_defaultOccurrencesCount","_defaultSamples","_defaults","optimal","_thresholds","message","type","_messages","title","performancesMin","performancesMax","performancesAverage","_sampleBaseId","performancesTester","initConfig","labels","idx","_samples","map","isEmpty","samples","sample","timeout","nb","occurrences","tests","cb","partial","iterations","series","measures","getFeedback","summary","getSummary","range","_Mathfloor2","_Mathmax4","download","bandwidth","root_url","file","Date","timeoutId","setTimeout","request","XMLHttpRequest","open","setRequestHeader","onload","clearTimeout","bytes","size","seconds","speed","_mega","onerror","onreadystatechange","send","_kilo","unit","ideal","feedbackThresholds","fallbackThreshold","_downloadData","\"10KB\"","\"100KB\"","\"1MB\"","legend","bandwidthMin","bandwidthMax","bandwidthAverage","bandwidthTester","bind","resultsBySize","o","avgResult","bandwidthUnit","maxTestTakers","getStatusOptions","baseBandwidth","stable","resultBySize","label","toString","wide","urlHelper","_Mathround","generateStr","text","possible","charAt","random","upload","route","cache","str","ajax","xhr","startTime","evt","lengthComputable","passedTime","time","uploadAvg","uploadMax","uploadTester","then","totalSpeed","maxSpeed","val","avgSpeed","avg","getTesterUrl","win","action","navigator","screen","e","f","ua","userAgent","ActiveXObject","opera","chrome","createElement","Worker","applicationCache","history","pushState","documentElement","webkitRequestFullScreen","r","substring","w","width","h","height","defaultConfig","browserVersionAction","browserVersionController","browserVersionExtension","getPlatformInfo","noToken","loggerFactory","logger","browserslistUrl","_placeHolders","CURRENT_BROWSER","CURRENT_OS","browser","os","unknown","browserTester","checkBrowserSupport","platformInfo","currentDevice","isMobile","currentOS","toLowerCase","currentBrowser","currentVersion","browserVersion","fetchBrowserList","some","entry","device","versions","version","flatten","localeCompare","numeric","catch","error","osVersion","browserSupported","Object","assign","method","success","customMsgRenderer","customMsg","currentOs","hb","template","Handlebars","depth0","partials","program1","stack1","helper","buffer","header","call","hash","escapeExpression","program3","info","program5","setup","program7","helperMissing","program9","validateSchoolName","inverse","self","program","program12","fn","program10","compilerInfo","merge","functionType","noop","requireSchoolId","requireSchoolName","button","details","each","component","store","requestData","dialogAlert","mainTpl","resultTpl","detailsTpl","feedbackTpl","qualityBarTpl","actionStore","actionSchool","actionDropId","storeAllRuns","configurableText","diagnostic","changeStatus","is","controls","$status","html","storeParams","getCustomMsg","addCustomFeedbackMsg","msg","hasFailed","isFunction","addResult","$main","$result","find","$indicator","$results","fadeIn","animate","left","outerWidth","cleanUp","empty","enable","$start","removeClass","disable","addClass","prepare","trigger","setState","finish","deleteIdentifier","run","information","scores","testers","customInput","getCustomInput","doRun","doCheck","testerConfig","testerId","processTester","testerFactory","tester","customMsgKey","mapValues","stringify","processFailure","enabled","total","minBy","diagTotalCheckResult","vars","location","href","m","has","diagnosticFactory","container","diagComponent","setTemplate","on","onDiagnosticDestroy","onDiagnosticInit","onDiagnosticRender","getInputValue","$control","getControl","trim","setInputValue","toggleControl","state","prop","runDiagnostics","isPlainObject","launch","requestSchoolName","componentConfig","school_name","school_number","manageSchoolProperties","fields","validate","toggleStart","allow","every","toggleFields","getElement","shouldStart","which","preventDefault","defer","click","storage","setItem","Promise","all","getItem","response","errorMsg","errorMessage","$component","onShowDetails","$btn","closest","$details","onHideDetails","init","c","d","a","getElementsByTagName","appendChild","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","../tools/fixedDecimals.js","../tools/stats.js","../tools/getConfig.js","../tools/getLabels.js","../tools/getStatus.js","../tools/performances/tester.js","../tools/bandwidth/tester.js","../tools/upload/tester.js","../tools/getPlatformInfo.js","../tools/browser/tester.js","../tools/diagnostic/tpl/main!tpl","../tools/diagnostic/tpl/result!tpl","../tools/diagnostic/tpl/details!tpl","../tools/diagnostic/tpl/feedback!tpl","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","../../taoClientDiagnosticCss/diagnostics!css","../tools/diagnostic/diagnostic.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fixedDecimals',[],function() {\n 'use strict';\n\n /**\n * Rounds a value to a fixed number of decimals\n * @param {number} value - The value to round\n * @param {number} decimals - The number of decimal\n * @returns {number}\n */\n return function fixedDecimals(value, decimals) {\n const shift = Math.pow(10, Math.abs(decimals || 1));\n return Math.round(Number(value) * shift) / shift || 0;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/stats',['lodash', 'taoClientDiagnostic/tools/fixedDecimals'], function(_, fixedDecimals) {\n 'use strict';\n\n /**\n * Gets a getter function that extracts a value from a record.\n * @param {string|Function} name - the name to extract from the record, or a getter function\n * @returns {Function}\n * @private\n */\n function valueGetter(name) {\n if ('function' === typeof name) {\n return name;\n }\n\n return item => (item && item[name]) || 0;\n }\n\n /**\n * Computes some stats on a list from a particular field\n * @param {Array|object} list - The list to compute stats on\n * @param {string|Function} fieldName - The name of the field to process, or a callback method returning the value\n * @param {number} [decimals] - Optional number of fixed decimals for values\n * @returns {object}\n */\n return function stats(list, fieldName, decimals) {\n const getValue = valueGetter(fieldName);\n const values = [];\n let min = Number.MAX_VALUE;\n let max = 0;\n let count = 0;\n\n // process first pass stats: compute sum, min and max values\n const sum = _.reduce(\n list,\n (sum, item) => {\n if ('undefined' !== typeof item) {\n const value = getValue(item);\n values.push(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n sum += value;\n count++;\n return sum;\n }\n },\n 0\n );\n\n // compute the average value\n const average = sum / (count || 1);\n\n // process second pass stats: compute variance\n const sum2 = values.reduce((sum, value) => {\n const diff = value - average;\n sum += diff * diff;\n return sum;\n }, 0);\n\n // compute standard variance\n const variance = count > 1 ? Math.sqrt(sum2 / (count - 1)) : 0;\n\n // compute the median value\n values.sort();\n const middle = count / 2;\n const median = (values[Math.floor(middle)] + values[Math.ceil(middle)]) / 2;\n\n const results = {\n min,\n max,\n sum,\n count,\n average,\n median,\n variance\n };\n\n if (decimals) {\n _.forEach(results, (value, key) => {\n results[key] = fixedDecimals(value, decimals);\n });\n }\n\n results.values = list;\n return results;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getConfig',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets a config set\n * @param {object} [config]\n * @param {object} [defaults]\n * @returns {object}\n */\n return function getConfig(config, defaults) {\n return _(config || {})\n .omit(value => value === null || typeof value === 'undefined')\n .defaults(defaults || {})\n .value();\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getLabels',[],function() {\n 'use strict';\n\n /**\n * Gets the list of messages related to a particular level.\n * The level is provided as a numeric value, starting from 1.\n * @param {Array|object} messages - The list of messages for all levels.\n * If only one object is provided is will be wrapped into an array\n * @param {number|string} level - The level for which filter the messages.\n * It should be comprised within the available indexes.\n * Higher levels will be reduced to the higher available,\n * lower levels will be increased to the lowest.\n * @returns {object}\n */\n return function getLabels(messages, level) {\n messages = messages || {};\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n // Compute the level value that targets which list of labels to use.\n // It should be comprised within the available indexes.\n // Higher levels will be reduced to the higher available, lower levels will be increased to the lowest.\n level = Math.min(Math.max(parseInt(level, 10) || 0, 1), messages.length || 1) - 1;\n\n return messages[level] || {};\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getStatus',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets the correct status message for a given percentage from a list of thresholds.\n * @param {number|string} percentage - The actual percentage. Must be comprised between 0 and 100.\n * Other values will be adjusted to fit the interval.\n * @param {Array|object} [thresholds] - A list of descriptors for each thresholds.\n * A threshold field must be provided for each.\n * @param {object} [opts]\n * @param {object} [minimumGlobalPercentage] - lowest value that will be used in the global score computation\n * @returns {object} Returns the corresponding threshold, or an empty object if none match.\n */\n return function getStatus(percentage, thresholds, opts) {\n const options = opts || {};\n const testPercentage = Math.max(0, Math.min(100, Math.round(parseInt(percentage, 10) || 0)));\n const globalPercentage = options.minimumGlobalPercentage\n ? Math.max(testPercentage, options.minimumGlobalPercentage)\n : testPercentage;\n\n // need a structure compatible with the handlebars template\n const status = {\n // the percentage is between 0 and 100 and obviously must be a number\n percentage: testPercentage,\n globalPercentage: globalPercentage,\n quality: {}\n };\n\n // grab a feedback related to the percentage in the thresholds list\n if (thresholds) {\n if (!Array.isArray(thresholds)) {\n thresholds = [thresholds];\n }\n\n let feedback;\n const len = thresholds.length;\n for (let i = 0; i < len; i++) {\n const step = thresholds[i];\n if (step && (!step.threshold || status.percentage >= step.threshold)) {\n feedback = step;\n } else {\n break;\n }\n }\n\n if (feedback) {\n status.feedback = _.clone(feedback);\n }\n }\n\n return status;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/performances/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'helpers',\n 'taoClientDiagnostic/tools/stats',\n 'taoQtiItem/qtiItem/core/Loader',\n 'taoQtiItem/qtiCommonRenderer/renderers/Renderer',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, context, helpers, stats, Loader, Renderer, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * Default timeout duration\n * @type {number}\n * @private\n */\n const _defaultTimeout = 30 * _second;\n\n /**\n * Default number of renderings by samples\n * @type {number}\n * @private\n */\n const _defaultOccurrencesCount = 10;\n\n /**\n * List of default samples\n * @type {Array}\n * @private\n */\n const _defaultSamples = [\n 'taoClientDiagnostic/tools/performances/data/sample1/',\n 'taoClientDiagnostic/tools/performances/data/sample2/',\n 'taoClientDiagnostic/tools/performances/data/sample3/'\n ];\n\n /**\n * Default values for the performances tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'performances',\n\n // The threshold for optimal performances\n optimal: 0.025,\n\n // The threshold for minimal performances\n threshold: 0.25\n };\n\n /**\n * A list of thresholds for performances check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Very slow performances'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average performances'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good performances'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Workstation performances'),\n status: __('Checking the performances...'),\n performancesMin: __('Minimum rendering time'),\n performancesMax: __('Maximum rendering time'),\n performancesAverage: __('Average rendering time')\n }\n ];\n\n /**\n * Base text used to build sample identifiers\n * @type {string}\n * @private\n */\n const _sampleBaseId = 'sample';\n\n /**\n * Loads a page inside a div and compute the time to load\n * @param {object} data The descriptor of the page to load\n * @param {Function} done A callback function called to provide the result\n * @private\n */\n function loadItem(data, done) {\n //item location config\n const qtiJsonFile = `${data.url}qti.json`;\n const urlTokens = data.url.split('/');\n const extension = urlTokens[0];\n const fullpath = require.s.contexts._.config.paths[extension];\n const baseUrl = data.url.replace(extension, fullpath);\n const loader = new Loader();\n const renderer = new Renderer({\n baseUrl: baseUrl // compatibility mode for legacy installations\n });\n\n // check needed by compatibility mode for legacy installations\n if (renderer.getAssetManager) {\n renderer.getAssetManager().setData('baseUrl', baseUrl);\n }\n\n require([`json!${qtiJsonFile}`], function(itemData) {\n loader.loadItemData(itemData, function(item) {\n renderer.load(function() {\n //start right before rendering\n const start = window.performance.now();\n\n //set renderer\n item.setRenderer(this);\n\n //render markup\n const $container = $('
      ').appendTo('body');\n $container.append(item.render());\n\n //execute javascript\n item.postRender();\n\n //remove item\n $container.remove();\n\n //done\n const end = window.performance.now();\n\n const duration = (end - start) / _second;\n\n const result = {\n id: data.id,\n url: data.url,\n duration: duration\n };\n\n done(null, result);\n }, this.getLoadedClasses());\n });\n });\n }\n\n /**\n * Performs a browser performances test by running a heavy page\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.optimal] - The threshold for optimal performances\n * @param {number} [config.threshold] - The threshold for minimal performances\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function performancesTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n let idx = 0;\n const _samples = _.map((!_.isEmpty(initConfig.samples) && initConfig.samples) || _defaultSamples, sample => {\n idx++;\n return {\n id: _sampleBaseId + idx,\n url: sample,\n timeout: initConfig.timeout * 1000 || _defaultTimeout,\n nb: initConfig.occurrences || _defaultOccurrencesCount\n };\n });\n\n // add one occurrence on the first sample to obfuscate the time needed to load the runner\n _samples[0].nb++;\n\n return {\n /**\n * Performs a performances test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_samples, data => {\n const cb = _.partial(loadItem, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n async.series(tests, (err, measures) => {\n const decimals = 2;\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n\n // remove the first result to obfuscate the time needed to load the runner\n measures.shift();\n\n const results = stats(measures, 'duration', decimals);\n const status = this.getFeedback(results.average);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n performancesMin: { message: labels.performancesMin, value: `${results.min} s` },\n performancesMax: { message: labels.performancesMax, value: `${results.max} s` },\n performancesAverage: { message: labels.performancesAverage, value: `${results.average} s` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {Number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal;\n const range = Math.abs(optimal - initConfig.threshold);\n const status = getStatus(((range + optimal - result) / range) * 100, _thresholds);\n\n status.title = labels.title;\n status.id = initConfig.id;\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/bandwidth/tester',[\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/stats',\n 'taoClientDiagnostic/tools/fixedDecimals',\n 'taoClientDiagnostic/tools/getStatus'\n], function(_, __, async, context, getConfig, getLabels, stats, fixedDecimals, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low bandwidth'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average bandwidth'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good bandwidth'),\n type: 'success'\n }\n ];\n\n /**\n * Default values for the bandwidth tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'bandwidth',\n\n // The typical bandwidth needed for a test taker (Mbps)\n unit: 0.16,\n\n // The thresholds for optimal bandwidth\n ideal: 45,\n\n // Maximum number of test takers to display\n max: 100,\n\n // Lowest value that will be used in the global score computation\n minimumGlobalPercentage: false,\n\n // A list of thresholds for bandwidth check\n feedbackThresholds: _thresholds,\n\n fallbackThreshold: 0.2\n };\n\n /**\n * List of descriptors defining the data sets to download.\n * - file : path of the file containing the test data\n * - size : the given size of the file\n * - timeout : the timeout for the download\n * - threshold : a bandwidth threshold above which the data set can be downloaded to evaluate a more accurate value\n * - nb : number of download iterations\n * @type {object}\n * @private\n */\n const _downloadData = {\n '10KB': {\n id: '10KB',\n file: 'data/bin10KB.data',\n size: 10 * _kilo,\n timeout: _second,\n threshold: 0,\n nb: 10\n },\n '100KB': {\n id: '100KB',\n file: 'data/bin100KB.data',\n size: 100 * _kilo,\n timeout: 2 * _second,\n threshold: 0,\n nb: 5\n },\n '1MB': {\n id: '1MB',\n file: 'data/bin1MB.data',\n size: _mega,\n timeout: 20 * _second,\n threshold: 0,\n nb: 3\n }\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object[]}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Bandwidth'),\n status: __('Checking the bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle'),\n bandwidthMin: __('Minimum bandwidth'),\n bandwidthMax: __('Maximum bandwidth'),\n bandwidthAverage: __('Average bandwidth')\n },\n // level 2\n {\n title: __('Media intensive bandwidth'),\n status: __('Checking the media intensive bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle with media intensive'),\n bandwidthMin: __('Minimum intensive bandwidth'),\n bandwidthMax: __('Maximum intensive bandwidth'),\n bandwidthAverage: __('Average intensive bandwidth')\n }\n ];\n\n /**\n * Download a data set as described by the provided descriptor and compute the duration.\n * @param {object} data The data set descriptor to use for download\n * @param {Function} cb A callback function called at the end of the download.\n * This callback is also called if a timeout breaks the download;\n * @private\n */\n function download(data, cb) {\n if (data.threshold && this.bandwidth < data.threshold) {\n return cb('threshold');\n }\n\n const start = window.performance.now();\n const url = `${context['root_url']}taoClientDiagnostic/views/js/tools/bandwidth/${data.file}?${Date.now()}`;\n const timeoutId = window.setTimeout(cb, data.timeout, 'timeout');\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.setRequestHeader('Accept', 'application/octet-stream');\n\n request.onload = () => {\n const end = window.performance.now();\n clearTimeout(timeoutId);\n\n const duration = end - start;\n const bytes = data.size;\n const seconds = duration / _second;\n\n // speed in Mbps\n const speed = (bytes * 8) / seconds / _mega;\n\n this.bandwidth = Math.max(this.bandwidth, speed);\n\n return cb(null, {\n id: data.id,\n file: data.file,\n size: data.size,\n duration,\n speed\n });\n };\n request.onerror = err => {\n clearTimeout(timeoutId);\n cb(err);\n };\n\n request.onreadystatechange = () => {\n if (request.readyState === 4 && request.status !== 200) {\n clearTimeout(timeoutId);\n cb(request.status);\n }\n };\n\n request.send();\n }\n\n /**\n * Performs a bandwidth test by downloading a bunch of data sets with different sizes\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {number} [config.ideal] - The thresholds for optimal bandwidth\n * @param {number} [config.max] - Maximum number of test takers to display\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function bandwidthTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n // override the feedback thresholds given by the config in case it is an empty array\n if (_.isArray(initConfig.feedbackThresholds) && !initConfig.feedbackThresholds.length) {\n initConfig.feedbackThresholds = _thresholds;\n }\n\n return {\n /**\n * Performs a bandwidth test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_downloadData, data => {\n const cb = download.bind(this, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n this.bandwidth = 0;\n\n async.series(tests, (err, measures) => {\n let duration = 0;\n let size = 0;\n const decimals = 2;\n const resultsBySize = {};\n\n function getValue(value) {\n let speed = 0;\n\n if (value) {\n duration += value.duration;\n size += value.size;\n\n speed = value.speed;\n value.speed = fixedDecimals(speed, decimals);\n }\n\n return speed;\n }\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n const results = stats(measures, getValue, decimals);\n\n _.forEach(_downloadData, (data, key) => {\n resultsBySize[key] = stats(\n _.filter(measures, o => o.id === key),\n getValue,\n decimals\n );\n });\n\n results.duration = fixedDecimals(duration / _second, decimals);\n results.size = size;\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results, resultsBySize);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n bandwidthMin: { message: labels.bandwidthMin, value: results.min + ' Mbps' },\n bandwidthMax: { message: labels.bandwidthMax, value: results.max + ' Mbps' },\n bandwidthAverage: { message: labels.bandwidthAverage, value: results.average + ' Mbps' }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} result\n * @param {number} result.max\n * @param {number} result.min\n * @param {number} result.average\n * @param {object} resultsBySize - result statistics grouped by size\n * @returns {object}\n */\n getFeedback(result, resultsBySize) {\n const avgResult = result.average;\n const bandwidthUnit = initConfig.unit;\n const threshold = initConfig.ideal;\n const maxTestTakers = initConfig.max;\n const max = threshold * bandwidthUnit;\n const getStatusOptions = initConfig.minimumGlobalPercentage\n ? { minimumGlobalPercentage: initConfig.minimumGlobalPercentage }\n : {};\n const baseBandwidth = avgResult;\n let stable = true;\n\n _.forEach(resultsBySize, resultBySize => {\n if (resultBySize.min / resultBySize.average < initConfig.fallbackThreshold) {\n stable = false;\n }\n });\n\n const status = getStatus((baseBandwidth / max) * 100, initConfig.feedbackThresholds, getStatusOptions);\n\n let nb = Math.floor(baseBandwidth / bandwidthUnit);\n\n if (nb > maxTestTakers) {\n nb = '>' + maxTestTakers;\n }\n\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.legend = labels.legend;\n status.quality.label = nb;\n\n if (!stable) {\n status.feedback.type = 'warning';\n status.feedback.message = __(\n 'Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience.'\n );\n status.feedback.legend = __('Simultaneous test takers under normal connection conditions.');\n }\n\n if (nb.toString().length > 2) {\n status.quality.wide = true;\n }\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/upload/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'util/url',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, urlHelper, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Result of diagnostic\n * @type {Array}\n * @private\n */\n let data = [];\n\n /**\n * Default values for the upload speed tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'upload',\n\n // Size of data to sent to server during speed test in bytes\n size: _mega,\n\n // Optimal speed in bytes per second\n optimal: _mega\n };\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low upload speed'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average upload speed'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good upload speed'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Upload speed'),\n status: __('Checking upload speed...'),\n uploadAvg: __('Average upload speed'),\n uploadMax: __('Max upload speed')\n }\n ];\n\n /**\n * Generate random string of given length\n * @param {number} length\n */\n function generateStr(length) {\n let text = '';\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n }\n\n /**\n * Upload generated string to check upload speed.\n * @param {number} size of string to upload in bytes\n * @return {object} jqXHR\n */\n function upload(size) {\n const url = urlHelper.route('upload', 'CompatibilityChecker', 'taoClientDiagnostic', { cache: Date.now() });\n const str = generateStr(size);\n data = [];\n\n return $.ajax({\n url: url,\n type: 'POST',\n data: {\n upload: str\n },\n xhr: () => {\n const xhr = new window.XMLHttpRequest();\n const startTime = Date.now();\n // Upload progress\n xhr.upload.addEventListener(\n 'progress',\n evt => {\n if (evt.lengthComputable) {\n const passedTime = Date.now() - startTime;\n data.push({\n time: passedTime,\n loaded: evt.loaded,\n speed: (evt.loaded * 8) / _mega / (passedTime / 1000)\n });\n }\n },\n false\n );\n\n return xhr;\n }\n });\n }\n\n /**\n * Performs a upload speed test\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.size] - Size of data to sent to server during speed test in bytes\n * @param {number} [config.optimal] - Optimal speed in bytes per second\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function uploadTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs upload speed test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n upload(parseInt(initConfig.size, 10)).then(() => {\n let totalSpeed = 0;\n let maxSpeed = 0;\n\n _.forEach(data, val => {\n totalSpeed += val.speed;\n if (maxSpeed < val.speed) {\n maxSpeed = Math.round(val.speed * 100) / 100;\n }\n });\n const avgSpeed = Math.round((totalSpeed / data.length) * 100) / 100;\n const results = {\n max: maxSpeed,\n avg: avgSpeed,\n type: 'upload'\n };\n\n const status = this.getFeedback(avgSpeed);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n uploadAvg: { message: labels.uploadAvg, value: `${results.avg} Mbps` },\n uploadMax: { message: labels.uploadMax, value: `${results.max} Mbps` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal / _mega;\n const status = getStatus((100 / optimal) * result, _thresholds);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getPlatformInfo',['core/request', 'util/url', 'taoClientDiagnostic/tools/getConfig'], function(request, urlHelper, getConfig) {\n 'use strict';\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const defaultConfig = {\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic'\n };\n\n /**\n * Gets the URL of the platform tester\n * @param {Window} win\n * @param {string} action\n * @param {string} controller\n * @param {string} extension\n * @returns {string}\n * @private\n */\n function getTesterUrl(win, action, controller, extension) {\n const document = win.document;\n const navigator = win.navigator;\n const screen = win.screen;\n const params = {};\n let e = 0;\n let f = 0;\n\n // append the browser user agent\n params.ua = navigator.userAgent;\n\n // detect browser family\n e |= win.ActiveXObject ? 1 : 0;\n e |= win.opera ? 2 : 0;\n e |= win.chrome ? 4 : 0;\n e |= 'getBoxObjectFor' in document || 'mozInnerScreenX' in win ? 8 : 0;\n e |=\n 'WebKitCSSMatrix' in win || 'WebKitPoint' in win || 'webkitStorageInfo' in win || 'webkitURL' in win\n ? 16\n : 0;\n e |= e & 16 && {}.toString.toString().indexOf('\\n') === -1 ? 32 : 0;\n params.e = e;\n\n // gather info about browser functionality\n f |= 'sandbox' in document.createElement('iframe') ? 1 : 0;\n f |= 'WebSocket' in win ? 2 : 0;\n f |= win.Worker ? 4 : 0;\n f |= win.applicationCache ? 8 : 0;\n f |= win.history && win.history.pushState ? 16 : 0;\n f |= document.documentElement.webkitRequestFullScreen ? 32 : 0;\n f |= 'FileReader' in win ? 64 : 0;\n params.f = f;\n\n // append a unique ID\n params.r = Math.random()\n .toString(36)\n .substring(7);\n\n // get the screen size\n params.w = screen.width;\n params.h = screen.height;\n\n return urlHelper.route(action, controller, extension, params);\n }\n\n /**\n * Check the user browser and os.\n *\n * This helper performs a server request to gather information about the user browser and os.\n * @param {Window} window - Need an access to the window object\n * @param {object} config\n * @param {string} config.browserVersionAction - The name of the action to call to get the browser checker\n * @param {string} config.browserVersionController - The name of the controller to call to get the browser checker\n * @param {string} config.browserVersionExtension - The name of the extension containing the controller to call to get the browser checker\n * @returns {Promise}\n */\n return function getPlatformInfo(win, config) {\n config = getConfig(config, defaultConfig);\n\n const url = getTesterUrl(\n win,\n config.browserVersionAction,\n config.browserVersionController,\n config.browserVersionExtension\n );\n\n return request({ url, noToken: true });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/browser/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/request',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getPlatformInfo',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, urlHelper, loggerFactory, request, getConfig, getLabels, getPlatformInfo, getStatus) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/browser');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'browser',\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic',\n action: 'check',\n controller: 'DiagnosticChecker',\n browserslistUrl: 'https://oat-sa.github.io/browserslist-app-tao/api.json'\n };\n\n /**\n * Placeholder variables for custom messages\n * @type {object}\n * @private\n */\n const _placeHolders = {\n CURRENT_BROWSER: '%CURRENT_BROWSER%',\n CURRENT_OS: '%CURRENT_OS%'\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Operating system and web browser'),\n status: __('Checking the browser...'),\n browser: __('Web browser'),\n os: __('Operating system')\n }\n ];\n\n /**\n * Fallback name to recover from connectivity error\n * @param {string}\n * @private\n */\n const unknown = __('Unknown');\n\n /**\n * Performs a browser support test\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.action] - The name of the action to call to get the browser checker\n * @param {string} [config.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.extension] - The name of the extension containing the controller to call to get the browser checker\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n /**\n * Fetches the list of fully supported browsers\n * @returns {Promise}\n * @private\n */\n const fetchBrowserList = () => request({ url: initConfig.browserslistUrl, noToken: true }).catch(() => []);\n\n /**\n * Checks the current browser against the list of fully supported browsers\n * @param platformInfo\n * @returns {Promise}\n * @private\n */\n function checkBrowserSupport(platformInfo) {\n const currentDevice = platformInfo.isMobile ? 'mobile' : 'desktop';\n const currentOS = platformInfo.os.toLowerCase();\n const currentBrowser = platformInfo.browser.toLowerCase();\n const currentVersion = platformInfo.browserVersion;\n return fetchBrowserList().then(list =>\n list.some(entry => {\n const { browser, device, os, versions } = entry;\n\n if (currentDevice !== device) {\n return false;\n }\n\n if (os && os.toLowerCase() !== currentOS) {\n return false;\n }\n\n if (browser.toLowerCase() !== currentBrowser) {\n return false;\n }\n\n // Using lodash because of IE support.\n // Some useful traversal algorithms are needed and they don't have polyfill in our bundles.\n // The versions come with an inconsistent format and they need to be processed upfront.\n return _(versions)\n .map(version => version.split('-'))\n .flatten()\n .value()\n .some(version => currentVersion.localeCompare(version, void 0, { numeric: true }) >= 0);\n }, {})\n );\n }\n\n return {\n /**\n * Performs a browser support test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n getPlatformInfo(window, initConfig)\n .catch(err => {\n logger.error(err);\n return {\n browser: unknown,\n browserVersion: '',\n os: unknown,\n osVersion: '',\n isMobile: false\n };\n })\n .then(platformInfo =>\n checkBrowserSupport(platformInfo).then(browserSupported =>\n Object.assign(platformInfo, { browserSupported })\n )\n )\n .then(platformInfo => {\n request({\n url: urlHelper.route(initConfig.action, initConfig.controller, initConfig.extension),\n data: platformInfo,\n method: 'POST',\n noToken: true\n })\n .catch(() => {\n return {\n success: false,\n type: 'error',\n message: __('Unable to validate the data as the server did not respond in time.')\n };\n })\n .then(data => {\n const percentage = 'success' === data.type ? 100 : 'warning' === data.type ? 33 : 0;\n const status = this.getFeedback(percentage, data);\n const summary = this.getSummary(platformInfo);\n\n status.customMsgRenderer = customMsg => {\n return (customMsg || '')\n .replace(_placeHolders.CURRENT_BROWSER, summary.browser.value)\n .replace(_placeHolders.CURRENT_OS, summary.os.value);\n };\n\n done(status, summary, platformInfo);\n });\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const currentBrowser = `${results.browser} ${results.browserVersion}`;\n const currentOs = `${results.os} ${results.osVersion}`;\n return {\n browser: {\n message: labels.browser,\n value: currentBrowser\n },\n os: {\n message: labels.os,\n value: currentOs\n }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @param {object} data\n * @returns {object}\n */\n getFeedback(result, data) {\n const status = getStatus(result, data);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

      \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

      \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \";\n return buffer;\n }\n\nfunction program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

      \";\n if (helper = helpers.setup) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.setup); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \";\n return buffer;\n }\n\nfunction program7(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

      \\n \\n \\n

      \\n

      \\n \\n \\n

      \\n \";\n return buffer;\n }\n\nfunction program9(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program10(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

      \\n \\n \\n

      \\n

      \\n \\n \\n

      \\n \";\n return buffer;\n }\n\nfunction program12(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

      \\n \\n \\n

      \\n \";\n return buffer;\n }\n\n buffer += \"
      \\n\\n

      \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \\n\\n
      \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.setup), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      \\n\\n
      \\n \\n
      \\n\\n
        \\n\\n
        \\n

        \\n
        \\n\\n
        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/result', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
        \\n \\n \\n
        \\n
        \\n \";\n return buffer;\n }\n\n buffer += \"
      • \\n

        \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \\n
        \\n\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.details), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      • \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/details', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n return buffer;\n }\n\n buffer += \"
        \\n

        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Details\", options) : helperMissing.call(depth0, \"__\", \"Details\", options)))\n + \"

        \\n
        \\n \\n \\n \";\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
        \\n
        \\n
        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
        \";\n if (helper = helpers.legend) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.legend); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
        \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
        \";\n if (helper = helpers.customMsg) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.customMsg); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
        \";\n return buffer;\n }\n\n buffer += \"
        \\n \\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.legend), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.customMsg), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \" wide\";\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\";\n return buffer;\n }\n\n buffer += \"
        \\n
        \\n
        \";\n return buffer;\n }); });\n","\ndefine('css!taoClientDiagnosticCss/diagnostics',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/diagnostic/diagnostic',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'ui/component',\n 'core/logger',\n 'core/store',\n 'core/request',\n 'core/dataProvider/request',\n 'ui/dialog/alert',\n 'ui/feedback',\n 'util/url',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/bandwidth/tester',\n 'taoClientDiagnostic/tools/upload/tester',\n 'taoClientDiagnostic/tools/browser/tester',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/getConfig',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/main',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/result',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar',\n 'css!taoClientDiagnosticCss/diagnostics'\n], function(\n $,\n _,\n __,\n async,\n component,\n loggerFactory,\n store,\n request,\n requestData,\n dialogAlert,\n feedback,\n urlHelper,\n performancesTester,\n bandwidthTester,\n uploadTester,\n browserTester,\n getStatus,\n getConfig,\n mainTpl,\n resultTpl,\n detailsTpl,\n feedbackTpl,\n qualityBarTpl\n) {\n 'use strict';\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/diagnostic');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n title: __('System Compatibility'),\n header: __(\n 'This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform.'\n ),\n info: __('Be aware that these tests will take up to several minutes.'),\n button: __('Test system compatibility'),\n actionStore: 'storeData',\n actionSchool: 'schoolName',\n controller: 'DiagnosticChecker',\n extension: 'taoClientDiagnostic',\n actionDropId: 'deleteId',\n storeAllRuns: false,\n configurableText: {}\n };\n\n /**\n * A list of thresholds for summary\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Your system requires a compatibility update, please contact your system administrator.'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Your system is not optimal, please contact your system administrator.'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Your system is fully compliant.'),\n type: 'success'\n }\n ];\n\n /**\n * Defines a diagnostic tool\n * @type {object}\n */\n const diagnostic = {\n /**\n * Updates the displayed status\n * @param {string} status\n * @returns {diagnostic}\n * @private\n */\n changeStatus(status) {\n if (this.is('rendered')) {\n this.controls.$status.html(status);\n }\n return this;\n },\n\n /**\n * Sends the detailed stats to the server\n * @param {string} type The type of stats\n * @param {object} data The stats details\n * @param {Function} done A callback method called once server has responded\n */\n store(type, data, done) {\n const config = this.config;\n const url = urlHelper.route(config.actionStore, config.controller, config.extension, config.storeParams);\n\n data = _.omit(data, 'values');\n data.type = type;\n\n request({ url, data, method: 'POST', noToken: true })\n .then(done)\n .catch(err => {\n logger.error(err);\n feedback().error(__('Unable to save the results! Please check your connection.'));\n done();\n });\n },\n\n /**\n * Retrieve a custom message from the config\n * @param key\n * @returns {*}\n */\n getCustomMsg(key) {\n return this.config.configurableText[key];\n },\n\n /**\n * Enrich the feedback object with a custom message if the test has failed\n * @param {object} status - the test result\n * @param {string} msg - the custom message\n */\n addCustomFeedbackMsg(status, msg) {\n if (this.hasFailed(status) && msg) {\n if (_.isFunction(status.customMsgRenderer)) {\n msg = status.customMsgRenderer(msg);\n }\n status.feedback = status.feedback || {};\n status.feedback.customMsg = msg;\n }\n },\n\n /**\n * Check if a result is considered as failed\n * @param {object} result\n * @returns {boolean}\n */\n hasFailed(result) {\n return !(result && result.feedback && result.feedback.type === 'success');\n },\n\n /**\n * Add a result row\n * @param {object} result\n * @returns {diagnostic}\n */\n addResult(result) {\n if (this.is('rendered')) {\n // adjust the width of the displayed label, if any, to the text length\n if (result.quality && result.quality.label && result.quality.label.toString().length > 2) {\n result.quality.wide = true;\n }\n\n // create and append the result to the displayed list\n const $main = $(resultTpl(result));\n const $result = $main.find('.result');\n if (result.feedback) {\n $result.append($(feedbackTpl(result.feedback)));\n }\n if (result.quality) {\n $result.append($(qualityBarTpl(result.quality)));\n }\n if (result.details) {\n $main.find('.details').append($(detailsTpl(result.details)));\n }\n\n const $indicator = $main.find('.quality-indicator');\n this.controls.$results.append($main);\n\n // the result is hidden by default, show it with a little animation\n $main.fadeIn(() => {\n if ($indicator.length) {\n $indicator.animate({\n left: (result.percentage * $main.outerWidth()) / 100 - $indicator.outerWidth() / 2\n });\n }\n });\n }\n\n return this;\n },\n\n /**\n * Removes the last results if any\n * @returns {diagnostic}\n */\n cleanUp() {\n this.controls.$results.empty();\n return this;\n },\n\n /**\n * Enables the start button\n * @returns {diagnostic}\n */\n enable() {\n this.controls.$start.removeClass('hidden');\n return this;\n },\n\n /**\n * Disables the start button\n * @returns {diagnostic}\n */\n disable() {\n this.controls.$start.addClass('hidden');\n return this;\n },\n\n /**\n * Does some preparations before starting the diagnostics\n * @returns {diagnostic}\n * @private\n */\n prepare() {\n /**\n * Notifies the diagnostic start\n * @event diagnostic#start\n */\n this.trigger('start');\n this.changeStatus(__('Starting...'));\n this.setState('running', true);\n this.setState('done', false);\n\n // first we need a clean space to display the results, so remove the last results if any\n this.cleanUp();\n\n // remove the start button during the diagnostic\n this.disable();\n\n return this;\n },\n\n /**\n * Does some post process after ending the diagnostics\n * @returns {diagnostic}\n * @private\n */\n finish() {\n const config = this.config;\n\n // restore the start button to allow a new diagnostic run\n this.enable();\n\n if (config.storeAllRuns) {\n this.deleteIdentifier();\n }\n\n /**\n * Notifies the diagnostic end\n * @event diagnostic#end\n */\n this.trigger('end');\n this.changeStatus(__('Done!'));\n this.setState('running', false);\n this.setState('done', true);\n\n return this;\n },\n\n /**\n * delete unique id for this test session (next test will generate new one)\n */\n deleteIdentifier() {\n const url = urlHelper.route(this.config.actionDropId, this.config.controller, this.config.extension);\n return request({ url, method: 'POST', noToken: true });\n },\n\n /**\n * Runs the diagnostics\n * @returns {diagnostic}\n */\n run() {\n const information = [];\n const scores = {};\n const testers = [];\n const customInput = this.getCustomInput();\n\n const doRun = () => {\n // common handling for testers\n const doCheck = (testerConfig, cb) => {\n const testerId = testerConfig.id;\n\n /**\n * Notifies the start of a tester operation\n * @event diagnostic#starttester\n * @param {string} name - The name of the tester\n */\n this.trigger('starttester', testerId);\n this.setState(testerId, true);\n\n /**\n * Process the diagnostic from the loaded tester\n * @param {Function} testerFactory\n * @private\n */\n const processTester = testerFactory => {\n const tester = testerFactory(getConfig(testerConfig, this.config), this);\n this.changeStatus(tester.labels.status);\n tester.start((status, details, results) => {\n if (testerConfig.customMsgKey) {\n const customMsg = this.getCustomMsg(testerConfig.customMsgKey);\n this.addCustomFeedbackMsg(status, customMsg);\n }\n\n // the returned details must be ingested into the main details list\n _.forEach(details, info => information.push(info));\n scores[status.id] = status;\n\n /**\n * Notifies the end of a tester operation\n * @event diagnostic#endtester\n * @param {string} id - The identifier of the tester\n * @param {Array} results - The results of the test\n */\n this.trigger('endtester', testerId, status);\n this.setState(testerId, false);\n\n // results should be filtered in order to encode complex data\n results = _.mapValues(results, value => {\n switch (typeof value) {\n case 'boolean':\n return value ? 1 : 0;\n case 'object':\n return JSON.stringify(value);\n }\n return value;\n });\n\n // send the data to store\n this.store(testerId, results, () => {\n this.addResult(status);\n cb();\n });\n });\n };\n\n /**\n * React to loading failure\n * @param {Error} err\n * @private\n */\n const processFailure = err => {\n logger.error(err);\n feedback().error(\n __(\n 'Unable to process with the diagnostic tester %s. The tester module is unreachable.',\n testerId\n )\n );\n cb();\n };\n\n require([testerConfig.tester], processTester, processFailure);\n };\n\n if (this.is('rendered')) {\n // set up the component to a new run\n this.prepare();\n\n _.forEach(this.config.testers, (testerConfig, testerId) => {\n testerConfig.id = testerConfig.id || testerId;\n if (testerConfig.enabled) {\n testers.push(cb => doCheck(testerConfig, cb));\n }\n });\n\n // launch each testers in series, then display the results\n async.series(testers, () => {\n // pick the lowest percentage as the main score\n const total = _.minBy(scores, 'globalPercentage');\n\n // get a status according to the main score\n const status = getStatus(total.globalPercentage, _thresholds);\n\n // display the result\n status.title = __('Total');\n status.id = 'total';\n this.addCustomFeedbackMsg(status, this.config.configurableText.diagTotalCheckResult);\n\n status.details = information;\n this.addResult(status);\n\n // done !\n this.finish();\n });\n }\n };\n\n if (_.size(customInput) > 0) {\n this.store('custom_input', customInput, doRun);\n } else {\n doRun();\n }\n\n return this;\n },\n\n getCustomInput() {\n const vars = {};\n\n window.location.href.replace(location.hash, '').replace(/[?&]+([^=&]+)=?([^&]*)?/gi, (m, key, value) => {\n if (_.has(this.config['customInput'], key)) {\n vars[key] = typeof value !== 'undefined' ? value : '';\n }\n });\n\n return vars;\n }\n };\n\n /**\n * Builds an instance of the diagnostic tool\n * @param {object} container - Container in which the initialisation will render the diagnostic\n * @param {object} config\n * @param {string} [config.title] - The displayed title\n * @param {string} [config.header] - A header text displayed to describe the component\n * @param {string} [config.info] - An information text displayed to warn about run duration\n * @param {string} [config.button] - The caption of the start button\n * @param {string} [config.actionStore] - The name of the action to call to store the results\n * @param {string} [config.actionCheck] - The name of the action to call to check the browser results\n * @param {string} [config.actionSchool] - The name of the action to call to get the school name\n * @param {string} [config.controller] - The name of the controller to call\n * @param {string} [config.extension] - The name of the extension containing the controller\n * @param {object} [config.storeParams] - A list of additional parameters to send with diagnostic results\n * @param {boolean} [config.requireSchoolName] - If `true` require a school name to allow the tests to start\n * @param {boolean} [config.requireSchoolId] - If `true` require a school ID to allow the tests to start\n * @param {boolean} [config.validateSchoolName] - If `true` require a school number and a PIN to get the school name and to allow the tests to start\n *\n * @param {string} [config.browser.action] - The name of the action to call to get the browser checker\n * @param {string} [config.browser.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.browser.extension] - The name of the extension containing the controller to call to get the browser checker\n *\n * @param {number} [config.bandwidth.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {Array} [config.bandwidth.ideal] - The thresholds for optimal bandwidth, one by bar\n * @param {number} [config.bandwidth.max] - Maximum number of test takers to display\n *\n * @param {Array} [config.performances.samples] - A list of samples to render in order to compute the rendering performances\n * @param {number} [config.performances.occurrences] - The number of renderings by samples\n * @param {number} [config.performances.timeout] - Max allowed duration for a sample rendering\n * @param {number} [config.performances.optimal] - The threshold for optimal performances\n * @param {number} [config.performances.threshold] - The threshold for minimal performances\n * @returns {diagnostic}\n */\n return function diagnosticFactory(container, config) {\n // fix the translations for content loaded from config files\n if (config) {\n _.forEach(['title', 'header', 'footer', 'info', 'button'], name => {\n if (config[name]) {\n config[name] = __(config[name]);\n }\n });\n }\n\n const diagComponent = component(diagnostic, _defaults)\n .setTemplate(mainTpl)\n\n // uninstalls the component\n .on('destroy', function onDiagnosticDestroy() {\n this.controls = null;\n })\n\n // initialise component\n .on('init', function onDiagnosticInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticRender() {\n /**\n * Starts the tests\n * @param {object} [data]\n * @private\n */\n const runDiagnostics = data => {\n // append the school name to the queries\n if (data && _.isPlainObject(data)) {\n this.config.storeParams = _.assign(this.config.storeParams || {}, data);\n }\n\n this.run();\n };\n\n /**\n * Default launcher\n * @private\n */\n let launch = () => runDiagnostics();\n\n /**\n * Gets a control by its registered name\n * @param {string} name - the name registered in the collection of controls\n * @private\n */\n const getControl = name => this.controls[`\\$${name}`];\n\n /**\n * Gets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @returns {string}\n * @private\n */\n function getInputValue(name) {\n const $control = getControl(name);\n return (($control && $control.val()) || '').trim();\n }\n\n /**\n * Sets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @param {string} value\n * @private\n */\n function setInputValue(name, value) {\n const $control = getControl(name);\n $control && $control.val(value);\n }\n\n /**\n * Enable/Disable a control\n * @param {string} name - the name registered in the collection of controls\n * @param {boolean} [state]\n * @private\n */\n function toggleControl(name, state) {\n const $control = getControl(name);\n if ($control) {\n if (typeof state === 'undefined') {\n state = !$control.is(':enabled');\n }\n if (state) {\n $control.prop('disabled', false);\n } else {\n $control.prop('disabled', true);\n }\n }\n }\n\n /**\n * Requests the server to get the school name\n * @param {object} values\n * @private\n */\n const requestSchoolName = values => {\n const componentConfig = this.config;\n return requestData(\n urlHelper.route(\n componentConfig.actionSchool,\n componentConfig.controller,\n componentConfig.extension\n ),\n values,\n 'POST'\n ).then(data => {\n return {\n school_name: data,\n school_number: values.school_number\n };\n });\n };\n\n /**\n * Install the school name manager.\n * @todo: improve this by moving it into a plugin, and obviously implement the plugin handling\n * @private\n */\n const manageSchoolProperties = (fields, validate) => {\n /**\n * Checks if the start button can be enabled\n * @returns {boolean}\n * @private\n */\n function toggleStart() {\n const allow = _.every(fields, getInputValue);\n toggleControl('start', allow);\n return allow;\n }\n\n /**\n * Enables/Disables the fields\n * @param {boolean} state\n * @private\n */\n function toggleFields(state) {\n _.forEach(fields, function(fieldName) {\n toggleControl(fieldName, state);\n });\n }\n\n // ensure the diagnostic cannot start without all fields properly input\n _.forEach(fields, fieldName => {\n this.controls[`\\$${fieldName}`] = this.getElement()\n .find(`[data-control=\"${fieldName}\"]`)\n .on('keypress', e => {\n const shouldStart = e.which === 13;\n if (shouldStart) {\n e.preventDefault();\n }\n _.defer(() => {\n if (toggleStart() && shouldStart) {\n this.controls.$start.click();\n }\n });\n });\n });\n\n toggleStart();\n\n // will store the school name in the browser storage, that will allow to restore it next time\n toggleFields(false);\n store('client-diagnostic')\n .then(storage => {\n // store the school name on test start, to ensure consistency\n this.on('start.school', () => {\n _.forEach(fields, fieldName => {\n storage.setItem(fieldName, getInputValue(fieldName)).catch(error => {\n logger.error(error);\n });\n });\n });\n\n // restore the school name on load\n return Promise.all(\n _.map(fields, fieldName => {\n return storage.getItem(fieldName).then(value => {\n setInputValue(fieldName, value);\n });\n })\n );\n })\n .catch(error => {\n logger.error(error);\n })\n .then(() => {\n toggleFields(true);\n toggleStart();\n });\n\n // ensure the fields are validated and the school name is properly sent before allowing to launch the test\n launch = () => {\n const values = _.reduce(\n fields,\n (result, fieldName) => {\n result[fieldName] = getInputValue(fieldName);\n return result;\n },\n {}\n );\n\n this.changeStatus(__('Getting school name...'))\n .cleanUp()\n .disable();\n\n if (_.isFunction(validate)) {\n validate(values)\n .then(runDiagnostics)\n .catch(error => {\n const response = error.response || {};\n const message =\n response.errorMsg ||\n response.errorMessage ||\n __('An error occurred! Please verify your input!');\n dialogAlert(message);\n logger.error(error);\n this.changeStatus(__('Failed to get school name')).enable();\n });\n } else {\n runDiagnostics(values);\n }\n };\n\n // ensure the fields are not writable while the test is running\n this.on('start.school', () => {\n toggleFields(false);\n }).on('end.school', () => {\n toggleFields(true);\n });\n };\n\n // get access to all needed placeholders\n this.controls = {\n $start: this.$component.find('[data-action=\"test-launcher\"]'),\n $status: this.$component.find('.status h2'),\n $results: this.$component.find('.results')\n };\n\n // start the diagnostic\n this.controls.$start.on('click', () => {\n this.controls.$start.is(':enabled') && launch();\n });\n\n if (this.config.requireSchoolName) {\n if (this.config.validateSchoolName) {\n manageSchoolProperties(['school_number', 'school_pin'], requestSchoolName);\n } else {\n manageSchoolProperties(['school_name']);\n }\n }\n\n if (this.config.requireSchoolId) {\n manageSchoolProperties(['school_id', 'workstation']);\n }\n\n // show result details\n this.controls.$results.on('click', 'button[data-action=\"show-details\"]', function onShowDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.removeClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"hide-details\"]').removeClass('hidden');\n });\n\n // hide result details\n this.controls.$results.on('click', 'button[data-action=\"hide-details\"]', function onHideDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.addClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"show-details\"]').removeClass('hidden');\n });\n });\n\n _.defer(() => diagComponent.init(config));\n\n return diagComponent;\n };\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\\\"Source Sans Pro\\\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\\\" - \\\"}table.datatable .progress .item-time:before{content:\\\" (\\\"}table.datatable .progress .item-time .total:before{content:\\\" / \\\"}table.datatable .progress .item-time:after{content:\\\")\\\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */');\n","\ndefine(\"taoClientDiagnostic/loader/diagnostic.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoQtiItem/loader/taoQtiItem.min\",\"taoItems/loader/taoItems.min\"]);\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","fixedDecimals","value","decimals","shift","Math","pow","abs","round","_","_Mathfloor","floor","_Mathmax","max","_Mathmin","min","valueGetter","name","stats","list","fieldName","_Mathceil","ceil","_Mathsqrt","sqrt","_NumberMAX_VALUE","Number","MAX_VALUE","getValue","values","count","sum","reduce","push","average","sum2","diff","variance","sort","middle","median","results","key","getConfig","config","defaults","omitBy","_Mathmax2","_Mathmin2","getLabels","messages","level","Array","isArray","parseInt","_Mathmax3","getStatus","percentage","thresholds","opts","options","testPercentage","globalPercentage","minimumGlobalPercentage","status","quality","feedback","len","i","step","threshold","clone","$","__","async","context","helpers","Loader","Renderer","_Mathabs","loadItem","data","done","qtiJsonFile","url","urlTokens","split","extension","fullpath","s","contexts","paths","baseUrl","replace","loader","renderer","getAssetManager","setData","itemData","loadItemData","load","performance","now","setRenderer","$container","appendTo","append","render","postRender","remove","end","duration","_second","result","id","getLoadedClasses","_defaultTimeout","_defaultOccurrencesCount","_defaultSamples","_defaults","optimal","_thresholds","message","type","_messages","title","performancesMin","performancesMax","performancesAverage","_sampleBaseId","performancesTester","initConfig","labels","idx","_samples","map","isEmpty","samples","sample","timeout","nb","occurrences","tests","cb","partial","iterations","series","measures","getFeedback","summary","getSummary","range","_Mathfloor2","_Mathmax4","download","bandwidth","root_url","file","Date","timeoutId","setTimeout","request","XMLHttpRequest","open","setRequestHeader","onload","clearTimeout","bytes","size","seconds","speed","_mega","onerror","onreadystatechange","send","_kilo","unit","ideal","feedbackThresholds","fallbackThreshold","_downloadData","\"10KB\"","\"100KB\"","\"1MB\"","legend","bandwidthMin","bandwidthMax","bandwidthAverage","bandwidthTester","bind","resultsBySize","o","avgResult","bandwidthUnit","maxTestTakers","getStatusOptions","baseBandwidth","stable","resultBySize","label","toString","wide","urlHelper","_Mathround","generateStr","text","possible","charAt","random","upload","route","cache","str","ajax","xhr","startTime","evt","lengthComputable","passedTime","time","uploadAvg","uploadMax","uploadTester","then","totalSpeed","maxSpeed","val","avgSpeed","avg","getTesterUrl","win","action","navigator","screen","e","f","ua","userAgent","ActiveXObject","opera","chrome","createElement","Worker","applicationCache","history","pushState","documentElement","webkitRequestFullScreen","r","substring","w","width","h","height","defaultConfig","browserVersionAction","browserVersionController","browserVersionExtension","getPlatformInfo","noToken","loggerFactory","logger","browserslistUrl","_placeHolders","CURRENT_BROWSER","CURRENT_OS","browser","os","unknown","browserTester","checkBrowserSupport","platformInfo","currentDevice","isMobile","currentOS","toLowerCase","currentBrowser","currentVersion","browserVersion","fetchBrowserList","some","entry","device","versions","version","flatten","localeCompare","numeric","catch","error","osVersion","browserSupported","Object","assign","method","success","customMsgRenderer","customMsg","currentOs","hb","template","Handlebars","depth0","partials","program1","stack1","helper","buffer","header","call","hash","escapeExpression","program3","info","program5","setup","program7","helperMissing","program9","validateSchoolName","inverse","self","program","program12","fn","program10","compilerInfo","merge","functionType","noop","requireSchoolId","requireSchoolName","button","details","each","component","store","requestData","dialogAlert","mainTpl","resultTpl","detailsTpl","feedbackTpl","qualityBarTpl","actionStore","actionSchool","actionDropId","storeAllRuns","configurableText","diagnostic","changeStatus","is","controls","$status","html","storeParams","omit","getCustomMsg","addCustomFeedbackMsg","msg","hasFailed","isFunction","addResult","$main","$result","find","$indicator","$results","fadeIn","animate","left","outerWidth","cleanUp","empty","enable","$start","removeClass","disable","addClass","prepare","trigger","setState","finish","deleteIdentifier","run","information","scores","testers","customInput","getCustomInput","doRun","doCheck","testerConfig","testerId","processTester","testerFactory","tester","customMsgKey","mapValues","stringify","processFailure","enabled","total","minBy","diagTotalCheckResult","vars","location","href","m","has","diagnosticFactory","container","diagComponent","setTemplate","on","onDiagnosticDestroy","onDiagnosticInit","onDiagnosticRender","getInputValue","$control","getControl","trim","setInputValue","toggleControl","state","prop","runDiagnostics","isPlainObject","launch","requestSchoolName","componentConfig","school_name","school_number","manageSchoolProperties","fields","validate","toggleStart","allow","every","toggleFields","getElement","shouldStart","which","preventDefault","defer","click","storage","setItem","Promise","all","getItem","response","errorMsg","errorMessage","$component","onShowDetails","$btn","closest","$details","onHideDetails","init","c","d","a","getElementsByTagName","appendChild","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","../tools/fixedDecimals.js","../tools/stats.js","../tools/getConfig.js","../tools/getLabels.js","../tools/getStatus.js","../tools/performances/tester.js","../tools/bandwidth/tester.js","../tools/upload/tester.js","../tools/getPlatformInfo.js","../tools/browser/tester.js","../tools/diagnostic/tpl/main!tpl","../tools/diagnostic/tpl/result!tpl","../tools/diagnostic/tpl/details!tpl","../tools/diagnostic/tpl/feedback!tpl","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","../../taoClientDiagnosticCss/diagnostics!css","../tools/diagnostic/diagnostic.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fixedDecimals',[],function() {\n 'use strict';\n\n /**\n * Rounds a value to a fixed number of decimals\n * @param {number} value - The value to round\n * @param {number} decimals - The number of decimal\n * @returns {number}\n */\n return function fixedDecimals(value, decimals) {\n const shift = Math.pow(10, Math.abs(decimals || 1));\n return Math.round(Number(value) * shift) / shift || 0;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/stats',['lodash', 'taoClientDiagnostic/tools/fixedDecimals'], function(_, fixedDecimals) {\n 'use strict';\n\n /**\n * Gets a getter function that extracts a value from a record.\n * @param {string|Function} name - the name to extract from the record, or a getter function\n * @returns {Function}\n * @private\n */\n function valueGetter(name) {\n if ('function' === typeof name) {\n return name;\n }\n\n return item => (item && item[name]) || 0;\n }\n\n /**\n * Computes some stats on a list from a particular field\n * @param {Array|object} list - The list to compute stats on\n * @param {string|Function} fieldName - The name of the field to process, or a callback method returning the value\n * @param {number} [decimals] - Optional number of fixed decimals for values\n * @returns {object}\n */\n return function stats(list, fieldName, decimals) {\n const getValue = valueGetter(fieldName);\n const values = [];\n let min = Number.MAX_VALUE;\n let max = 0;\n let count = 0;\n\n // process first pass stats: compute sum, min and max values\n const sum = _.reduce(\n list,\n (sum, item) => {\n if ('undefined' !== typeof item) {\n const value = getValue(item);\n values.push(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n sum += value;\n count++;\n return sum;\n }\n },\n 0\n );\n\n // compute the average value\n const average = sum / (count || 1);\n\n // process second pass stats: compute variance\n const sum2 = values.reduce((sum, value) => {\n const diff = value - average;\n sum += diff * diff;\n return sum;\n }, 0);\n\n // compute standard variance\n const variance = count > 1 ? Math.sqrt(sum2 / (count - 1)) : 0;\n\n // compute the median value\n values.sort();\n const middle = count / 2;\n const median = (values[Math.floor(middle)] + values[Math.ceil(middle)]) / 2;\n\n const results = {\n min,\n max,\n sum,\n count,\n average,\n median,\n variance\n };\n\n if (decimals) {\n _.forEach(results, (value, key) => {\n results[key] = fixedDecimals(value, decimals);\n });\n }\n\n results.values = list;\n return results;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2024 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getConfig',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets a config set\n * @param {object} [config]\n * @param {object} [defaults]\n * @returns {object}\n */\n return function getConfig(config, defaults) {\n return _(config || {})\n .omitBy(value => value === null || typeof value === 'undefined')\n .defaults(defaults || {})\n .value();\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getLabels',[],function() {\n 'use strict';\n\n /**\n * Gets the list of messages related to a particular level.\n * The level is provided as a numeric value, starting from 1.\n * @param {Array|object} messages - The list of messages for all levels.\n * If only one object is provided is will be wrapped into an array\n * @param {number|string} level - The level for which filter the messages.\n * It should be comprised within the available indexes.\n * Higher levels will be reduced to the higher available,\n * lower levels will be increased to the lowest.\n * @returns {object}\n */\n return function getLabels(messages, level) {\n messages = messages || {};\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n // Compute the level value that targets which list of labels to use.\n // It should be comprised within the available indexes.\n // Higher levels will be reduced to the higher available, lower levels will be increased to the lowest.\n level = Math.min(Math.max(parseInt(level, 10) || 0, 1), messages.length || 1) - 1;\n\n return messages[level] || {};\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getStatus',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets the correct status message for a given percentage from a list of thresholds.\n * @param {number|string} percentage - The actual percentage. Must be comprised between 0 and 100.\n * Other values will be adjusted to fit the interval.\n * @param {Array|object} [thresholds] - A list of descriptors for each thresholds.\n * A threshold field must be provided for each.\n * @param {object} [opts]\n * @param {object} [minimumGlobalPercentage] - lowest value that will be used in the global score computation\n * @returns {object} Returns the corresponding threshold, or an empty object if none match.\n */\n return function getStatus(percentage, thresholds, opts) {\n const options = opts || {};\n const testPercentage = Math.max(0, Math.min(100, Math.round(parseInt(percentage, 10) || 0)));\n const globalPercentage = options.minimumGlobalPercentage\n ? Math.max(testPercentage, options.minimumGlobalPercentage)\n : testPercentage;\n\n // need a structure compatible with the handlebars template\n const status = {\n // the percentage is between 0 and 100 and obviously must be a number\n percentage: testPercentage,\n globalPercentage: globalPercentage,\n quality: {}\n };\n\n // grab a feedback related to the percentage in the thresholds list\n if (thresholds) {\n if (!Array.isArray(thresholds)) {\n thresholds = [thresholds];\n }\n\n let feedback;\n const len = thresholds.length;\n for (let i = 0; i < len; i++) {\n const step = thresholds[i];\n if (step && (!step.threshold || status.percentage >= step.threshold)) {\n feedback = step;\n } else {\n break;\n }\n }\n\n if (feedback) {\n status.feedback = _.clone(feedback);\n }\n }\n\n return status;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/performances/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'helpers',\n 'taoClientDiagnostic/tools/stats',\n 'taoQtiItem/qtiItem/core/Loader',\n 'taoQtiItem/qtiCommonRenderer/renderers/Renderer',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, context, helpers, stats, Loader, Renderer, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * Default timeout duration\n * @type {number}\n * @private\n */\n const _defaultTimeout = 30 * _second;\n\n /**\n * Default number of renderings by samples\n * @type {number}\n * @private\n */\n const _defaultOccurrencesCount = 10;\n\n /**\n * List of default samples\n * @type {Array}\n * @private\n */\n const _defaultSamples = [\n 'taoClientDiagnostic/tools/performances/data/sample1/',\n 'taoClientDiagnostic/tools/performances/data/sample2/',\n 'taoClientDiagnostic/tools/performances/data/sample3/'\n ];\n\n /**\n * Default values for the performances tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'performances',\n\n // The threshold for optimal performances\n optimal: 0.025,\n\n // The threshold for minimal performances\n threshold: 0.25\n };\n\n /**\n * A list of thresholds for performances check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Very slow performances'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average performances'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good performances'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Workstation performances'),\n status: __('Checking the performances...'),\n performancesMin: __('Minimum rendering time'),\n performancesMax: __('Maximum rendering time'),\n performancesAverage: __('Average rendering time')\n }\n ];\n\n /**\n * Base text used to build sample identifiers\n * @type {string}\n * @private\n */\n const _sampleBaseId = 'sample';\n\n /**\n * Loads a page inside a div and compute the time to load\n * @param {object} data The descriptor of the page to load\n * @param {Function} done A callback function called to provide the result\n * @private\n */\n function loadItem(data, done) {\n //item location config\n const qtiJsonFile = `${data.url}qti.json`;\n const urlTokens = data.url.split('/');\n const extension = urlTokens[0];\n const fullpath = require.s.contexts._.config.paths[extension];\n const baseUrl = data.url.replace(extension, fullpath);\n const loader = new Loader();\n const renderer = new Renderer({\n baseUrl: baseUrl // compatibility mode for legacy installations\n });\n\n // check needed by compatibility mode for legacy installations\n if (renderer.getAssetManager) {\n renderer.getAssetManager().setData('baseUrl', baseUrl);\n }\n\n require([`json!${qtiJsonFile}`], function(itemData) {\n loader.loadItemData(itemData, function(item) {\n renderer.load(function() {\n //start right before rendering\n const start = window.performance.now();\n\n //set renderer\n item.setRenderer(this);\n\n //render markup\n const $container = $('
        ').appendTo('body');\n $container.append(item.render());\n\n //execute javascript\n item.postRender();\n\n //remove item\n $container.remove();\n\n //done\n const end = window.performance.now();\n\n const duration = (end - start) / _second;\n\n const result = {\n id: data.id,\n url: data.url,\n duration: duration\n };\n\n done(null, result);\n }, this.getLoadedClasses());\n });\n });\n }\n\n /**\n * Performs a browser performances test by running a heavy page\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.optimal] - The threshold for optimal performances\n * @param {number} [config.threshold] - The threshold for minimal performances\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function performancesTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n let idx = 0;\n const _samples = _.map((!_.isEmpty(initConfig.samples) && initConfig.samples) || _defaultSamples, sample => {\n idx++;\n return {\n id: _sampleBaseId + idx,\n url: sample,\n timeout: initConfig.timeout * 1000 || _defaultTimeout,\n nb: initConfig.occurrences || _defaultOccurrencesCount\n };\n });\n\n // add one occurrence on the first sample to obfuscate the time needed to load the runner\n _samples[0].nb++;\n\n return {\n /**\n * Performs a performances test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_samples, data => {\n const cb = _.partial(loadItem, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n async.series(tests, (err, measures) => {\n const decimals = 2;\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n\n // remove the first result to obfuscate the time needed to load the runner\n measures.shift();\n\n const results = stats(measures, 'duration', decimals);\n const status = this.getFeedback(results.average);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n performancesMin: { message: labels.performancesMin, value: `${results.min} s` },\n performancesMax: { message: labels.performancesMax, value: `${results.max} s` },\n performancesAverage: { message: labels.performancesAverage, value: `${results.average} s` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {Number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal;\n const range = Math.abs(optimal - initConfig.threshold);\n const status = getStatus(((range + optimal - result) / range) * 100, _thresholds);\n\n status.title = labels.title;\n status.id = initConfig.id;\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/bandwidth/tester',[\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/stats',\n 'taoClientDiagnostic/tools/fixedDecimals',\n 'taoClientDiagnostic/tools/getStatus'\n], function(_, __, async, context, getConfig, getLabels, stats, fixedDecimals, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low bandwidth'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average bandwidth'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good bandwidth'),\n type: 'success'\n }\n ];\n\n /**\n * Default values for the bandwidth tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'bandwidth',\n\n // The typical bandwidth needed for a test taker (Mbps)\n unit: 0.16,\n\n // The thresholds for optimal bandwidth\n ideal: 45,\n\n // Maximum number of test takers to display\n max: 100,\n\n // Lowest value that will be used in the global score computation\n minimumGlobalPercentage: false,\n\n // A list of thresholds for bandwidth check\n feedbackThresholds: _thresholds,\n\n fallbackThreshold: 0.2\n };\n\n /**\n * List of descriptors defining the data sets to download.\n * - file : path of the file containing the test data\n * - size : the given size of the file\n * - timeout : the timeout for the download\n * - threshold : a bandwidth threshold above which the data set can be downloaded to evaluate a more accurate value\n * - nb : number of download iterations\n * @type {object}\n * @private\n */\n const _downloadData = {\n '10KB': {\n id: '10KB',\n file: 'data/bin10KB.data',\n size: 10 * _kilo,\n timeout: _second,\n threshold: 0,\n nb: 10\n },\n '100KB': {\n id: '100KB',\n file: 'data/bin100KB.data',\n size: 100 * _kilo,\n timeout: 2 * _second,\n threshold: 0,\n nb: 5\n },\n '1MB': {\n id: '1MB',\n file: 'data/bin1MB.data',\n size: _mega,\n timeout: 20 * _second,\n threshold: 0,\n nb: 3\n }\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object[]}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Bandwidth'),\n status: __('Checking the bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle'),\n bandwidthMin: __('Minimum bandwidth'),\n bandwidthMax: __('Maximum bandwidth'),\n bandwidthAverage: __('Average bandwidth')\n },\n // level 2\n {\n title: __('Media intensive bandwidth'),\n status: __('Checking the media intensive bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle with media intensive'),\n bandwidthMin: __('Minimum intensive bandwidth'),\n bandwidthMax: __('Maximum intensive bandwidth'),\n bandwidthAverage: __('Average intensive bandwidth')\n }\n ];\n\n /**\n * Download a data set as described by the provided descriptor and compute the duration.\n * @param {object} data The data set descriptor to use for download\n * @param {Function} cb A callback function called at the end of the download.\n * This callback is also called if a timeout breaks the download;\n * @private\n */\n function download(data, cb) {\n if (data.threshold && this.bandwidth < data.threshold) {\n return cb('threshold');\n }\n\n const start = window.performance.now();\n const url = `${context['root_url']}taoClientDiagnostic/views/js/tools/bandwidth/${data.file}?${Date.now()}`;\n const timeoutId = window.setTimeout(cb, data.timeout, 'timeout');\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.setRequestHeader('Accept', 'application/octet-stream');\n\n request.onload = () => {\n const end = window.performance.now();\n clearTimeout(timeoutId);\n\n const duration = end - start;\n const bytes = data.size;\n const seconds = duration / _second;\n\n // speed in Mbps\n const speed = (bytes * 8) / seconds / _mega;\n\n this.bandwidth = Math.max(this.bandwidth, speed);\n\n return cb(null, {\n id: data.id,\n file: data.file,\n size: data.size,\n duration,\n speed\n });\n };\n request.onerror = err => {\n clearTimeout(timeoutId);\n cb(err);\n };\n\n request.onreadystatechange = () => {\n if (request.readyState === 4 && request.status !== 200) {\n clearTimeout(timeoutId);\n cb(request.status);\n }\n };\n\n request.send();\n }\n\n /**\n * Performs a bandwidth test by downloading a bunch of data sets with different sizes\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {number} [config.ideal] - The thresholds for optimal bandwidth\n * @param {number} [config.max] - Maximum number of test takers to display\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function bandwidthTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n // override the feedback thresholds given by the config in case it is an empty array\n if (_.isArray(initConfig.feedbackThresholds) && !initConfig.feedbackThresholds.length) {\n initConfig.feedbackThresholds = _thresholds;\n }\n\n return {\n /**\n * Performs a bandwidth test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_downloadData, data => {\n const cb = download.bind(this, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n this.bandwidth = 0;\n\n async.series(tests, (err, measures) => {\n let duration = 0;\n let size = 0;\n const decimals = 2;\n const resultsBySize = {};\n\n function getValue(value) {\n let speed = 0;\n\n if (value) {\n duration += value.duration;\n size += value.size;\n\n speed = value.speed;\n value.speed = fixedDecimals(speed, decimals);\n }\n\n return speed;\n }\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n const results = stats(measures, getValue, decimals);\n\n _.forEach(_downloadData, (data, key) => {\n resultsBySize[key] = stats(\n _.filter(measures, o => o.id === key),\n getValue,\n decimals\n );\n });\n\n results.duration = fixedDecimals(duration / _second, decimals);\n results.size = size;\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results, resultsBySize);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n bandwidthMin: { message: labels.bandwidthMin, value: results.min + ' Mbps' },\n bandwidthMax: { message: labels.bandwidthMax, value: results.max + ' Mbps' },\n bandwidthAverage: { message: labels.bandwidthAverage, value: results.average + ' Mbps' }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} result\n * @param {number} result.max\n * @param {number} result.min\n * @param {number} result.average\n * @param {object} resultsBySize - result statistics grouped by size\n * @returns {object}\n */\n getFeedback(result, resultsBySize) {\n const avgResult = result.average;\n const bandwidthUnit = initConfig.unit;\n const threshold = initConfig.ideal;\n const maxTestTakers = initConfig.max;\n const max = threshold * bandwidthUnit;\n const getStatusOptions = initConfig.minimumGlobalPercentage\n ? { minimumGlobalPercentage: initConfig.minimumGlobalPercentage }\n : {};\n const baseBandwidth = avgResult;\n let stable = true;\n\n _.forEach(resultsBySize, resultBySize => {\n if (resultBySize.min / resultBySize.average < initConfig.fallbackThreshold) {\n stable = false;\n }\n });\n\n const status = getStatus((baseBandwidth / max) * 100, initConfig.feedbackThresholds, getStatusOptions);\n\n let nb = Math.floor(baseBandwidth / bandwidthUnit);\n\n if (nb > maxTestTakers) {\n nb = '>' + maxTestTakers;\n }\n\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.legend = labels.legend;\n status.quality.label = nb;\n\n if (!stable) {\n status.feedback.type = 'warning';\n status.feedback.message = __(\n 'Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience.'\n );\n status.feedback.legend = __('Simultaneous test takers under normal connection conditions.');\n }\n\n if (nb.toString().length > 2) {\n status.quality.wide = true;\n }\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/upload/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'util/url',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, urlHelper, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Result of diagnostic\n * @type {Array}\n * @private\n */\n let data = [];\n\n /**\n * Default values for the upload speed tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'upload',\n\n // Size of data to sent to server during speed test in bytes\n size: _mega,\n\n // Optimal speed in bytes per second\n optimal: _mega\n };\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low upload speed'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average upload speed'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good upload speed'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Upload speed'),\n status: __('Checking upload speed...'),\n uploadAvg: __('Average upload speed'),\n uploadMax: __('Max upload speed')\n }\n ];\n\n /**\n * Generate random string of given length\n * @param {number} length\n */\n function generateStr(length) {\n let text = '';\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n }\n\n /**\n * Upload generated string to check upload speed.\n * @param {number} size of string to upload in bytes\n * @return {object} jqXHR\n */\n function upload(size) {\n const url = urlHelper.route('upload', 'CompatibilityChecker', 'taoClientDiagnostic', { cache: Date.now() });\n const str = generateStr(size);\n data = [];\n\n return $.ajax({\n url: url,\n type: 'POST',\n data: {\n upload: str\n },\n xhr: () => {\n const xhr = new window.XMLHttpRequest();\n const startTime = Date.now();\n // Upload progress\n xhr.upload.addEventListener(\n 'progress',\n evt => {\n if (evt.lengthComputable) {\n const passedTime = Date.now() - startTime;\n data.push({\n time: passedTime,\n loaded: evt.loaded,\n speed: (evt.loaded * 8) / _mega / (passedTime / 1000)\n });\n }\n },\n false\n );\n\n return xhr;\n }\n });\n }\n\n /**\n * Performs a upload speed test\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.size] - Size of data to sent to server during speed test in bytes\n * @param {number} [config.optimal] - Optimal speed in bytes per second\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function uploadTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs upload speed test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n upload(parseInt(initConfig.size, 10)).then(() => {\n let totalSpeed = 0;\n let maxSpeed = 0;\n\n _.forEach(data, val => {\n totalSpeed += val.speed;\n if (maxSpeed < val.speed) {\n maxSpeed = Math.round(val.speed * 100) / 100;\n }\n });\n const avgSpeed = Math.round((totalSpeed / data.length) * 100) / 100;\n const results = {\n max: maxSpeed,\n avg: avgSpeed,\n type: 'upload'\n };\n\n const status = this.getFeedback(avgSpeed);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n uploadAvg: { message: labels.uploadAvg, value: `${results.avg} Mbps` },\n uploadMax: { message: labels.uploadMax, value: `${results.max} Mbps` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal / _mega;\n const status = getStatus((100 / optimal) * result, _thresholds);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getPlatformInfo',['core/request', 'util/url', 'taoClientDiagnostic/tools/getConfig'], function(request, urlHelper, getConfig) {\n 'use strict';\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const defaultConfig = {\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic'\n };\n\n /**\n * Gets the URL of the platform tester\n * @param {Window} win\n * @param {string} action\n * @param {string} controller\n * @param {string} extension\n * @returns {string}\n * @private\n */\n function getTesterUrl(win, action, controller, extension) {\n const document = win.document;\n const navigator = win.navigator;\n const screen = win.screen;\n const params = {};\n let e = 0;\n let f = 0;\n\n // append the browser user agent\n params.ua = navigator.userAgent;\n\n // detect browser family\n e |= win.ActiveXObject ? 1 : 0;\n e |= win.opera ? 2 : 0;\n e |= win.chrome ? 4 : 0;\n e |= 'getBoxObjectFor' in document || 'mozInnerScreenX' in win ? 8 : 0;\n e |=\n 'WebKitCSSMatrix' in win || 'WebKitPoint' in win || 'webkitStorageInfo' in win || 'webkitURL' in win\n ? 16\n : 0;\n e |= e & 16 && {}.toString.toString().indexOf('\\n') === -1 ? 32 : 0;\n params.e = e;\n\n // gather info about browser functionality\n f |= 'sandbox' in document.createElement('iframe') ? 1 : 0;\n f |= 'WebSocket' in win ? 2 : 0;\n f |= win.Worker ? 4 : 0;\n f |= win.applicationCache ? 8 : 0;\n f |= win.history && win.history.pushState ? 16 : 0;\n f |= document.documentElement.webkitRequestFullScreen ? 32 : 0;\n f |= 'FileReader' in win ? 64 : 0;\n params.f = f;\n\n // append a unique ID\n params.r = Math.random()\n .toString(36)\n .substring(7);\n\n // get the screen size\n params.w = screen.width;\n params.h = screen.height;\n\n return urlHelper.route(action, controller, extension, params);\n }\n\n /**\n * Check the user browser and os.\n *\n * This helper performs a server request to gather information about the user browser and os.\n * @param {Window} window - Need an access to the window object\n * @param {object} config\n * @param {string} config.browserVersionAction - The name of the action to call to get the browser checker\n * @param {string} config.browserVersionController - The name of the controller to call to get the browser checker\n * @param {string} config.browserVersionExtension - The name of the extension containing the controller to call to get the browser checker\n * @returns {Promise}\n */\n return function getPlatformInfo(win, config) {\n config = getConfig(config, defaultConfig);\n\n const url = getTesterUrl(\n win,\n config.browserVersionAction,\n config.browserVersionController,\n config.browserVersionExtension\n );\n\n return request({ url, noToken: true });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/browser/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/request',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getPlatformInfo',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, urlHelper, loggerFactory, request, getConfig, getLabels, getPlatformInfo, getStatus) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/browser');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'browser',\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic',\n action: 'check',\n controller: 'DiagnosticChecker',\n browserslistUrl: 'https://oat-sa.github.io/browserslist-app-tao/api.json'\n };\n\n /**\n * Placeholder variables for custom messages\n * @type {object}\n * @private\n */\n const _placeHolders = {\n CURRENT_BROWSER: '%CURRENT_BROWSER%',\n CURRENT_OS: '%CURRENT_OS%'\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Operating system and web browser'),\n status: __('Checking the browser...'),\n browser: __('Web browser'),\n os: __('Operating system')\n }\n ];\n\n /**\n * Fallback name to recover from connectivity error\n * @param {string}\n * @private\n */\n const unknown = __('Unknown');\n\n /**\n * Performs a browser support test\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.action] - The name of the action to call to get the browser checker\n * @param {string} [config.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.extension] - The name of the extension containing the controller to call to get the browser checker\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n /**\n * Fetches the list of fully supported browsers\n * @returns {Promise}\n * @private\n */\n const fetchBrowserList = () => request({ url: initConfig.browserslistUrl, noToken: true }).catch(() => []);\n\n /**\n * Checks the current browser against the list of fully supported browsers\n * @param platformInfo\n * @returns {Promise}\n * @private\n */\n function checkBrowserSupport(platformInfo) {\n const currentDevice = platformInfo.isMobile ? 'mobile' : 'desktop';\n const currentOS = platformInfo.os.toLowerCase();\n const currentBrowser = platformInfo.browser.toLowerCase();\n const currentVersion = platformInfo.browserVersion;\n return fetchBrowserList().then(list =>\n list.some(entry => {\n const { browser, device, os, versions } = entry;\n\n if (currentDevice !== device) {\n return false;\n }\n\n if (os && os.toLowerCase() !== currentOS) {\n return false;\n }\n\n if (browser.toLowerCase() !== currentBrowser) {\n return false;\n }\n\n // Using lodash because of IE support.\n // Some useful traversal algorithms are needed and they don't have polyfill in our bundles.\n // The versions come with an inconsistent format and they need to be processed upfront.\n return _(versions)\n .map(version => version.split('-'))\n .flatten()\n .value()\n .some(version => currentVersion.localeCompare(version, void 0, { numeric: true }) >= 0);\n }, {})\n );\n }\n\n return {\n /**\n * Performs a browser support test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n getPlatformInfo(window, initConfig)\n .catch(err => {\n logger.error(err);\n return {\n browser: unknown,\n browserVersion: '',\n os: unknown,\n osVersion: '',\n isMobile: false\n };\n })\n .then(platformInfo =>\n checkBrowserSupport(platformInfo).then(browserSupported =>\n Object.assign(platformInfo, { browserSupported })\n )\n )\n .then(platformInfo => {\n request({\n url: urlHelper.route(initConfig.action, initConfig.controller, initConfig.extension),\n data: platformInfo,\n method: 'POST',\n noToken: true\n })\n .catch(() => {\n return {\n success: false,\n type: 'error',\n message: __('Unable to validate the data as the server did not respond in time.')\n };\n })\n .then(data => {\n const percentage = 'success' === data.type ? 100 : 'warning' === data.type ? 33 : 0;\n const status = this.getFeedback(percentage, data);\n const summary = this.getSummary(platformInfo);\n\n status.customMsgRenderer = customMsg => {\n return (customMsg || '')\n .replace(_placeHolders.CURRENT_BROWSER, summary.browser.value)\n .replace(_placeHolders.CURRENT_OS, summary.os.value);\n };\n\n done(status, summary, platformInfo);\n });\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const currentBrowser = `${results.browser} ${results.browserVersion}`;\n const currentOs = `${results.os} ${results.osVersion}`;\n return {\n browser: {\n message: labels.browser,\n value: currentBrowser\n },\n os: {\n message: labels.os,\n value: currentOs\n }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @param {object} data\n * @returns {object}\n */\n getFeedback(result, data) {\n const status = getStatus(result, data);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

        \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

        \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \";\n return buffer;\n }\n\nfunction program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

        \";\n if (helper = helpers.setup) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.setup); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \";\n return buffer;\n }\n\nfunction program7(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

        \\n \\n \\n

        \\n

        \\n \\n \\n

        \\n \";\n return buffer;\n }\n\nfunction program9(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program10(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

        \\n \\n \\n

        \\n

        \\n \\n \\n

        \\n \";\n return buffer;\n }\n\nfunction program12(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

        \\n \\n \\n

        \\n \";\n return buffer;\n }\n\n buffer += \"
        \\n\\n

        \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

        \\n\\n
        \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.setup), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
        \\n\\n
        \\n \\n
        \\n\\n
          \\n\\n
          \\n

          \\n
          \\n\\n
          \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/result', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
          \\n \\n \\n
          \\n
          \\n \";\n return buffer;\n }\n\n buffer += \"
        • \\n

          \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

          \\n
          \\n\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.details), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
        • \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/details', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n return buffer;\n }\n\n buffer += \"
          \\n

          \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Details\", options) : helperMissing.call(depth0, \"__\", \"Details\", options)))\n + \"

          \\n
          \\n \\n \\n \";\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
          \\n
          \\n
          \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
          \";\n if (helper = helpers.legend) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.legend); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
          \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
          \";\n if (helper = helpers.customMsg) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.customMsg); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
          \";\n return buffer;\n }\n\n buffer += \"
          \\n \\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.legend), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.customMsg), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
          \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \" wide\";\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\";\n return buffer;\n }\n\n buffer += \"
          \\n
          \\n
          \";\n return buffer;\n }); });\n","\ndefine('css!taoClientDiagnosticCss/diagnostics',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/diagnostic/diagnostic',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'ui/component',\n 'core/logger',\n 'core/store',\n 'core/request',\n 'core/dataProvider/request',\n 'ui/dialog/alert',\n 'ui/feedback',\n 'util/url',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/bandwidth/tester',\n 'taoClientDiagnostic/tools/upload/tester',\n 'taoClientDiagnostic/tools/browser/tester',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/getConfig',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/main',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/result',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar',\n 'css!taoClientDiagnosticCss/diagnostics'\n], function(\n $,\n _,\n __,\n async,\n component,\n loggerFactory,\n store,\n request,\n requestData,\n dialogAlert,\n feedback,\n urlHelper,\n performancesTester,\n bandwidthTester,\n uploadTester,\n browserTester,\n getStatus,\n getConfig,\n mainTpl,\n resultTpl,\n detailsTpl,\n feedbackTpl,\n qualityBarTpl\n) {\n 'use strict';\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/diagnostic');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n title: __('System Compatibility'),\n header: __(\n 'This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform.'\n ),\n info: __('Be aware that these tests will take up to several minutes.'),\n button: __('Test system compatibility'),\n actionStore: 'storeData',\n actionSchool: 'schoolName',\n controller: 'DiagnosticChecker',\n extension: 'taoClientDiagnostic',\n actionDropId: 'deleteId',\n storeAllRuns: false,\n configurableText: {}\n };\n\n /**\n * A list of thresholds for summary\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Your system requires a compatibility update, please contact your system administrator.'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Your system is not optimal, please contact your system administrator.'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Your system is fully compliant.'),\n type: 'success'\n }\n ];\n\n /**\n * Defines a diagnostic tool\n * @type {object}\n */\n const diagnostic = {\n /**\n * Updates the displayed status\n * @param {string} status\n * @returns {diagnostic}\n * @private\n */\n changeStatus(status) {\n if (this.is('rendered')) {\n this.controls.$status.html(status);\n }\n return this;\n },\n\n /**\n * Sends the detailed stats to the server\n * @param {string} type The type of stats\n * @param {object} data The stats details\n * @param {Function} done A callback method called once server has responded\n */\n store(type, data, done) {\n const config = this.config;\n const url = urlHelper.route(config.actionStore, config.controller, config.extension, config.storeParams);\n\n data = _.omit(data, 'values');\n data.type = type;\n\n request({ url, data, method: 'POST', noToken: true })\n .then(done)\n .catch(err => {\n logger.error(err);\n feedback().error(__('Unable to save the results! Please check your connection.'));\n done();\n });\n },\n\n /**\n * Retrieve a custom message from the config\n * @param key\n * @returns {*}\n */\n getCustomMsg(key) {\n return this.config.configurableText[key];\n },\n\n /**\n * Enrich the feedback object with a custom message if the test has failed\n * @param {object} status - the test result\n * @param {string} msg - the custom message\n */\n addCustomFeedbackMsg(status, msg) {\n if (this.hasFailed(status) && msg) {\n if (_.isFunction(status.customMsgRenderer)) {\n msg = status.customMsgRenderer(msg);\n }\n status.feedback = status.feedback || {};\n status.feedback.customMsg = msg;\n }\n },\n\n /**\n * Check if a result is considered as failed\n * @param {object} result\n * @returns {boolean}\n */\n hasFailed(result) {\n return !(result && result.feedback && result.feedback.type === 'success');\n },\n\n /**\n * Add a result row\n * @param {object} result\n * @returns {diagnostic}\n */\n addResult(result) {\n if (this.is('rendered')) {\n // adjust the width of the displayed label, if any, to the text length\n if (result.quality && result.quality.label && result.quality.label.toString().length > 2) {\n result.quality.wide = true;\n }\n\n // create and append the result to the displayed list\n const $main = $(resultTpl(result));\n const $result = $main.find('.result');\n if (result.feedback) {\n $result.append($(feedbackTpl(result.feedback)));\n }\n if (result.quality) {\n $result.append($(qualityBarTpl(result.quality)));\n }\n if (result.details) {\n $main.find('.details').append($(detailsTpl(result.details)));\n }\n\n const $indicator = $main.find('.quality-indicator');\n this.controls.$results.append($main);\n\n // the result is hidden by default, show it with a little animation\n $main.fadeIn(() => {\n if ($indicator.length) {\n $indicator.animate({\n left: (result.percentage * $main.outerWidth()) / 100 - $indicator.outerWidth() / 2\n });\n }\n });\n }\n\n return this;\n },\n\n /**\n * Removes the last results if any\n * @returns {diagnostic}\n */\n cleanUp() {\n this.controls.$results.empty();\n return this;\n },\n\n /**\n * Enables the start button\n * @returns {diagnostic}\n */\n enable() {\n this.controls.$start.removeClass('hidden');\n return this;\n },\n\n /**\n * Disables the start button\n * @returns {diagnostic}\n */\n disable() {\n this.controls.$start.addClass('hidden');\n return this;\n },\n\n /**\n * Does some preparations before starting the diagnostics\n * @returns {diagnostic}\n * @private\n */\n prepare() {\n /**\n * Notifies the diagnostic start\n * @event diagnostic#start\n */\n this.trigger('start');\n this.changeStatus(__('Starting...'));\n this.setState('running', true);\n this.setState('done', false);\n\n // first we need a clean space to display the results, so remove the last results if any\n this.cleanUp();\n\n // remove the start button during the diagnostic\n this.disable();\n\n return this;\n },\n\n /**\n * Does some post process after ending the diagnostics\n * @returns {diagnostic}\n * @private\n */\n finish() {\n const config = this.config;\n\n // restore the start button to allow a new diagnostic run\n this.enable();\n\n if (config.storeAllRuns) {\n this.deleteIdentifier();\n }\n\n /**\n * Notifies the diagnostic end\n * @event diagnostic#end\n */\n this.trigger('end');\n this.changeStatus(__('Done!'));\n this.setState('running', false);\n this.setState('done', true);\n\n return this;\n },\n\n /**\n * delete unique id for this test session (next test will generate new one)\n */\n deleteIdentifier() {\n const url = urlHelper.route(this.config.actionDropId, this.config.controller, this.config.extension);\n return request({ url, method: 'POST', noToken: true });\n },\n\n /**\n * Runs the diagnostics\n * @returns {diagnostic}\n */\n run() {\n const information = [];\n const scores = {};\n const testers = [];\n const customInput = this.getCustomInput();\n\n const doRun = () => {\n // common handling for testers\n const doCheck = (testerConfig, cb) => {\n const testerId = testerConfig.id;\n\n /**\n * Notifies the start of a tester operation\n * @event diagnostic#starttester\n * @param {string} name - The name of the tester\n */\n this.trigger('starttester', testerId);\n this.setState(testerId, true);\n\n /**\n * Process the diagnostic from the loaded tester\n * @param {Function} testerFactory\n * @private\n */\n const processTester = testerFactory => {\n const tester = testerFactory(getConfig(testerConfig, this.config), this);\n this.changeStatus(tester.labels.status);\n tester.start((status, details, results) => {\n if (testerConfig.customMsgKey) {\n const customMsg = this.getCustomMsg(testerConfig.customMsgKey);\n this.addCustomFeedbackMsg(status, customMsg);\n }\n\n // the returned details must be ingested into the main details list\n _.forEach(details, info => information.push(info));\n scores[status.id] = status;\n\n /**\n * Notifies the end of a tester operation\n * @event diagnostic#endtester\n * @param {string} id - The identifier of the tester\n * @param {Array} results - The results of the test\n */\n this.trigger('endtester', testerId, status);\n this.setState(testerId, false);\n\n // results should be filtered in order to encode complex data\n results = _.mapValues(results, value => {\n switch (typeof value) {\n case 'boolean':\n return value ? 1 : 0;\n case 'object':\n return JSON.stringify(value);\n }\n return value;\n });\n\n // send the data to store\n this.store(testerId, results, () => {\n this.addResult(status);\n cb();\n });\n });\n };\n\n /**\n * React to loading failure\n * @param {Error} err\n * @private\n */\n const processFailure = err => {\n logger.error(err);\n feedback().error(\n __(\n 'Unable to process with the diagnostic tester %s. The tester module is unreachable.',\n testerId\n )\n );\n cb();\n };\n\n require([testerConfig.tester], processTester, processFailure);\n };\n\n if (this.is('rendered')) {\n // set up the component to a new run\n this.prepare();\n\n _.forEach(this.config.testers, (testerConfig, testerId) => {\n testerConfig.id = testerConfig.id || testerId;\n if (testerConfig.enabled) {\n testers.push(cb => doCheck(testerConfig, cb));\n }\n });\n\n // launch each testers in series, then display the results\n async.series(testers, () => {\n // pick the lowest percentage as the main score\n const total = _.minBy(scores, 'globalPercentage');\n\n // get a status according to the main score\n const status = getStatus(total.globalPercentage, _thresholds);\n\n // display the result\n status.title = __('Total');\n status.id = 'total';\n this.addCustomFeedbackMsg(status, this.config.configurableText.diagTotalCheckResult);\n\n status.details = information;\n this.addResult(status);\n\n // done !\n this.finish();\n });\n }\n };\n\n if (_.size(customInput) > 0) {\n this.store('custom_input', customInput, doRun);\n } else {\n doRun();\n }\n\n return this;\n },\n\n getCustomInput() {\n const vars = {};\n\n window.location.href.replace(location.hash, '').replace(/[?&]+([^=&]+)=?([^&]*)?/gi, (m, key, value) => {\n if (_.has(this.config['customInput'], key)) {\n vars[key] = typeof value !== 'undefined' ? value : '';\n }\n });\n\n return vars;\n }\n };\n\n /**\n * Builds an instance of the diagnostic tool\n * @param {object} container - Container in which the initialisation will render the diagnostic\n * @param {object} config\n * @param {string} [config.title] - The displayed title\n * @param {string} [config.header] - A header text displayed to describe the component\n * @param {string} [config.info] - An information text displayed to warn about run duration\n * @param {string} [config.button] - The caption of the start button\n * @param {string} [config.actionStore] - The name of the action to call to store the results\n * @param {string} [config.actionCheck] - The name of the action to call to check the browser results\n * @param {string} [config.actionSchool] - The name of the action to call to get the school name\n * @param {string} [config.controller] - The name of the controller to call\n * @param {string} [config.extension] - The name of the extension containing the controller\n * @param {object} [config.storeParams] - A list of additional parameters to send with diagnostic results\n * @param {boolean} [config.requireSchoolName] - If `true` require a school name to allow the tests to start\n * @param {boolean} [config.requireSchoolId] - If `true` require a school ID to allow the tests to start\n * @param {boolean} [config.validateSchoolName] - If `true` require a school number and a PIN to get the school name and to allow the tests to start\n *\n * @param {string} [config.browser.action] - The name of the action to call to get the browser checker\n * @param {string} [config.browser.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.browser.extension] - The name of the extension containing the controller to call to get the browser checker\n *\n * @param {number} [config.bandwidth.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {Array} [config.bandwidth.ideal] - The thresholds for optimal bandwidth, one by bar\n * @param {number} [config.bandwidth.max] - Maximum number of test takers to display\n *\n * @param {Array} [config.performances.samples] - A list of samples to render in order to compute the rendering performances\n * @param {number} [config.performances.occurrences] - The number of renderings by samples\n * @param {number} [config.performances.timeout] - Max allowed duration for a sample rendering\n * @param {number} [config.performances.optimal] - The threshold for optimal performances\n * @param {number} [config.performances.threshold] - The threshold for minimal performances\n * @returns {diagnostic}\n */\n return function diagnosticFactory(container, config) {\n // fix the translations for content loaded from config files\n if (config) {\n _.forEach(['title', 'header', 'footer', 'info', 'button'], name => {\n if (config[name]) {\n config[name] = __(config[name]);\n }\n });\n }\n\n const diagComponent = component(diagnostic, _defaults)\n .setTemplate(mainTpl)\n\n // uninstalls the component\n .on('destroy', function onDiagnosticDestroy() {\n this.controls = null;\n })\n\n // initialise component\n .on('init', function onDiagnosticInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticRender() {\n /**\n * Starts the tests\n * @param {object} [data]\n * @private\n */\n const runDiagnostics = data => {\n // append the school name to the queries\n if (data && _.isPlainObject(data)) {\n this.config.storeParams = _.assign(this.config.storeParams || {}, data);\n }\n\n this.run();\n };\n\n /**\n * Default launcher\n * @private\n */\n let launch = () => runDiagnostics();\n\n /**\n * Gets a control by its registered name\n * @param {string} name - the name registered in the collection of controls\n * @private\n */\n const getControl = name => this.controls[`\\$${name}`];\n\n /**\n * Gets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @returns {string}\n * @private\n */\n function getInputValue(name) {\n const $control = getControl(name);\n return (($control && $control.val()) || '').trim();\n }\n\n /**\n * Sets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @param {string} value\n * @private\n */\n function setInputValue(name, value) {\n const $control = getControl(name);\n $control && $control.val(value);\n }\n\n /**\n * Enable/Disable a control\n * @param {string} name - the name registered in the collection of controls\n * @param {boolean} [state]\n * @private\n */\n function toggleControl(name, state) {\n const $control = getControl(name);\n if ($control) {\n if (typeof state === 'undefined') {\n state = !$control.is(':enabled');\n }\n if (state) {\n $control.prop('disabled', false);\n } else {\n $control.prop('disabled', true);\n }\n }\n }\n\n /**\n * Requests the server to get the school name\n * @param {object} values\n * @private\n */\n const requestSchoolName = values => {\n const componentConfig = this.config;\n return requestData(\n urlHelper.route(\n componentConfig.actionSchool,\n componentConfig.controller,\n componentConfig.extension\n ),\n values,\n 'POST'\n ).then(data => {\n return {\n school_name: data,\n school_number: values.school_number\n };\n });\n };\n\n /**\n * Install the school name manager.\n * @todo: improve this by moving it into a plugin, and obviously implement the plugin handling\n * @private\n */\n const manageSchoolProperties = (fields, validate) => {\n /**\n * Checks if the start button can be enabled\n * @returns {boolean}\n * @private\n */\n function toggleStart() {\n const allow = _.every(fields, getInputValue);\n toggleControl('start', allow);\n return allow;\n }\n\n /**\n * Enables/Disables the fields\n * @param {boolean} state\n * @private\n */\n function toggleFields(state) {\n _.forEach(fields, function(fieldName) {\n toggleControl(fieldName, state);\n });\n }\n\n // ensure the diagnostic cannot start without all fields properly input\n _.forEach(fields, fieldName => {\n this.controls[`\\$${fieldName}`] = this.getElement()\n .find(`[data-control=\"${fieldName}\"]`)\n .on('keypress', e => {\n const shouldStart = e.which === 13;\n if (shouldStart) {\n e.preventDefault();\n }\n _.defer(() => {\n if (toggleStart() && shouldStart) {\n this.controls.$start.click();\n }\n });\n });\n });\n\n toggleStart();\n\n // will store the school name in the browser storage, that will allow to restore it next time\n toggleFields(false);\n store('client-diagnostic')\n .then(storage => {\n // store the school name on test start, to ensure consistency\n this.on('start.school', () => {\n _.forEach(fields, fieldName => {\n storage.setItem(fieldName, getInputValue(fieldName)).catch(error => {\n logger.error(error);\n });\n });\n });\n\n // restore the school name on load\n return Promise.all(\n _.map(fields, fieldName => {\n return storage.getItem(fieldName).then(value => {\n setInputValue(fieldName, value);\n });\n })\n );\n })\n .catch(error => {\n logger.error(error);\n })\n .then(() => {\n toggleFields(true);\n toggleStart();\n });\n\n // ensure the fields are validated and the school name is properly sent before allowing to launch the test\n launch = () => {\n const values = _.reduce(\n fields,\n (result, fieldName) => {\n result[fieldName] = getInputValue(fieldName);\n return result;\n },\n {}\n );\n\n this.changeStatus(__('Getting school name...'))\n .cleanUp()\n .disable();\n\n if (_.isFunction(validate)) {\n validate(values)\n .then(runDiagnostics)\n .catch(error => {\n const response = error.response || {};\n const message =\n response.errorMsg ||\n response.errorMessage ||\n __('An error occurred! Please verify your input!');\n dialogAlert(message);\n logger.error(error);\n this.changeStatus(__('Failed to get school name')).enable();\n });\n } else {\n runDiagnostics(values);\n }\n };\n\n // ensure the fields are not writable while the test is running\n this.on('start.school', () => {\n toggleFields(false);\n }).on('end.school', () => {\n toggleFields(true);\n });\n };\n\n // get access to all needed placeholders\n this.controls = {\n $start: this.$component.find('[data-action=\"test-launcher\"]'),\n $status: this.$component.find('.status h2'),\n $results: this.$component.find('.results')\n };\n\n // start the diagnostic\n this.controls.$start.on('click', () => {\n this.controls.$start.is(':enabled') && launch();\n });\n\n if (this.config.requireSchoolName) {\n if (this.config.validateSchoolName) {\n manageSchoolProperties(['school_number', 'school_pin'], requestSchoolName);\n } else {\n manageSchoolProperties(['school_name']);\n }\n }\n\n if (this.config.requireSchoolId) {\n manageSchoolProperties(['school_id', 'workstation']);\n }\n\n // show result details\n this.controls.$results.on('click', 'button[data-action=\"show-details\"]', function onShowDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.removeClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"hide-details\"]').removeClass('hidden');\n });\n\n // hide result details\n this.controls.$results.on('click', 'button[data-action=\"hide-details\"]', function onHideDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.addClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"show-details\"]').removeClass('hidden');\n });\n });\n\n _.defer(() => diagComponent.init(config));\n\n return diagComponent;\n };\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\\\"Source Sans Pro\\\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\\\" - \\\"}table.datatable .progress .item-time:before{content:\\\" (\\\"}table.datatable .progress .item-time .total:before{content:\\\" / \\\"}table.datatable .progress .item-time:after{content:\\\")\\\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */');\n","\ndefine(\"taoClientDiagnostic/loader/diagnostic.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoQtiItem/loader/taoQtiItem.min\",\"taoItems/loader/taoItems.min\"]);\n"],"mappings":"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"} \ No newline at end of file diff --git a/views/js/loader/taoClientDiagnostic.min.js b/views/js/loader/taoClientDiagnostic.min.js index bcc3c38..20899ff 100644 --- a/views/js/loader/taoClientDiagnostic.min.js +++ b/views/js/loader/taoClientDiagnostic.min.js @@ -1,2 +1,2 @@ -(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("taoClientDiagnostic/tools/message",["jquery","ui/feedback"],function($,feedback){"use strict";return function showMessages(container){const $feedbackBox=$(container);$feedbackBox.data("error")&&feedback().error($feedbackBox.data("error")),$feedbackBox.data("message")&&feedback().error($feedbackBox.data("message"))}}),define("taoClientDiagnostic/controller/Authenticator/login",["taoClientDiagnostic/tools/message"],function(showMessage){"use strict";return{start(){showMessage("#feedback-box")}}}),define("tpl!taoClientDiagnostic/component/diagnostic/tpl/component",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="
          \n

          "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Diagnostic Tool",options):helperMissing.call(depth0,"__","Diagnostic Tool",options)))+"

          \n
          ",buffer})}),define("taoClientDiagnostic/component/diagnostic/diagnosticLoader",["lodash","ui/component","core/moduleLoader","context","module","tpl!taoClientDiagnostic/component/diagnostic/tpl/component","layout/loading-bar"],function(_,componentFactory,moduleLoader,context,module,componentTpl,loadingBar){"use strict";return function diagnosticLoaderFactory(container,config){const component=componentFactory().setTemplate(componentTpl).on("init",function onDiagnosticLoaderInit(){this.render(container)}).on("render",function onDiagnosticLoaderRender(){const moduleConfig=module.config(),identifiers=Object.keys(moduleConfig.diagnostics);moduleLoader({},_.isFunction).addList(moduleConfig.diagnostics).load(context.bundle).then(factories=>{const componentConfig=this.getConfig();factories.forEach((factory,index)=>{const factoryName=identifiers[index],factoryConfig=componentConfig[factoryName];factoryConfig.controller=componentConfig.controller,factory(this.getElement(),factoryConfig).on("render",function onRender(){factoryConfig.autoStart&&this.run()}).on("start",()=>loadingBar.start()).on("end",()=>loadingBar.stop())}),this.trigger("ready")})});return _.defer(()=>component.init(config)),component}}),define("taoClientDiagnostic/controller/CompatibilityChecker/diagnostics",["jquery","taoClientDiagnostic/tools/message","taoClientDiagnostic/component/diagnostic/diagnosticLoader"],function($,showMessage,diagnosticFactory){"use strict";return{start:function(config){const $contentArea=$(".content");showMessage("#feedback-box"),diagnosticFactory($contentArea,config)}}}),define("taoClientDiagnostic/tools/fixedDecimals",[],function(){"use strict";return function fixedDecimals(value,decimals){const shift=Math.pow(10,Math.abs(decimals||1));return Math.round(+value*shift)/shift||0}}),define("taoClientDiagnostic/tools/stats",["lodash","taoClientDiagnostic/tools/fixedDecimals"],function(_,fixedDecimals){"use strict";var _Mathfloor=Math.floor,_Mathmax=Math.max,_Mathmin=Math.min;function valueGetter(name){return"function"==typeof name?name:item=>item&&item[name]||0}return function stats(list,fieldName,decimals){var _Mathceil=Math.ceil,_Mathsqrt=Math.sqrt,_NumberMAX_VALUE=Number.MAX_VALUE;const getValue=valueGetter(fieldName),values=[];let min=_NumberMAX_VALUE,max=0,count=0;const sum=_.reduce(list,(sum,item)=>{if("undefined"!=typeof item){const value=getValue(item);return values.push(value),min=_Mathmin(min,value),max=_Mathmax(max,value),sum+=value,count++,sum}},0),average=sum/(count||1),sum2=values.reduce((sum,value)=>{const diff=value-average;return sum+=diff*diff,sum},0),variance=1{results[key]=fixedDecimals(value,decimals)}),results.values=list,results}}),define("taoClientDiagnostic/tools/getConfig",["lodash"],function(_){"use strict";return function getConfig(config,defaults){return _(config||{}).omit(value=>null===value||"undefined"==typeof value).defaults(defaults||{}).value()}}),define("taoClientDiagnostic/tools/getLabels",[],function(){"use strict";var _Mathmax2=Math.max,_Mathmin2=Math.min;return function getLabels(messages,level){return messages=messages||{},Array.isArray(messages)||(messages=[messages]),level=_Mathmin2(_Mathmax2(parseInt(level,10)||0,1),messages.length||1)-1,messages[level]||{}}}),define("taoClientDiagnostic/tools/getStatus",["lodash"],function(_){"use strict";var _Mathmax3=Math.max;return function getStatus(percentage,thresholds,opts){const options=opts||{},testPercentage=_Mathmax3(0,Math.min(100,Math.round(parseInt(percentage,10)||0))),globalPercentage=options.minimumGlobalPercentage?_Mathmax3(testPercentage,options.minimumGlobalPercentage):testPercentage,status={percentage:testPercentage,globalPercentage:globalPercentage,quality:{}};if(thresholds){Array.isArray(thresholds)||(thresholds=[thresholds]);let feedback;const len=thresholds.length;for(let i=0;i=step.threshold))feedback=step;else break}feedback&&(status.feedback=_.clone(feedback))}return status}}),define("taoClientDiagnostic/tools/performances/tester",["jquery","lodash","i18n","async","context","helpers","taoClientDiagnostic/tools/stats","taoQtiItem/qtiItem/core/Loader","taoQtiItem/qtiCommonRenderer/renderers/Renderer","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus"],function($,_,__,async,context,helpers,stats,Loader,Renderer,getConfig,getLabels,getStatus){"use strict";var _Mathabs=Math.abs;function loadItem(data,done){const qtiJsonFile=`${data.url}qti.json`,urlTokens=data.url.split("/"),extension=urlTokens[0],fullpath=require.s.contexts._.config.paths[extension],baseUrl=data.url.replace(extension,fullpath),loader=new Loader,renderer=new Renderer({baseUrl:baseUrl});renderer.getAssetManager&&renderer.getAssetManager().setData("baseUrl",baseUrl),require([`json!${qtiJsonFile}`],function(itemData){loader.loadItemData(itemData,function(item){renderer.load(function(){const start=window.performance.now();item.setRenderer(this);const $container=$("
          ").appendTo("body");$container.append(item.render()),item.postRender(),$container.remove();const end=window.performance.now(),duration=(end-start)/_second,result={id:data.id,url:data.url,duration:duration};done(null,result)},this.getLoadedClasses())})})}const _second=1e3,_defaultTimeout=30000,_defaultOccurrencesCount=10,_defaultSamples=["taoClientDiagnostic/tools/performances/data/sample1/","taoClientDiagnostic/tools/performances/data/sample2/","taoClientDiagnostic/tools/performances/data/sample3/"],_defaults={id:"performances",optimal:.025,threshold:.25},_thresholds=[{threshold:0,message:__("Very slow performances"),type:"error"},{threshold:33,message:__("Average performances"),type:"warning"},{threshold:66,message:__("Good performances"),type:"success"}],_messages=[{title:__("Workstation performances"),status:__("Checking the performances..."),performancesMin:__("Minimum rendering time"),performancesMax:__("Maximum rendering time"),performancesAverage:__("Average rendering time")}],_sampleBaseId="sample";return function performancesTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);let idx=0;const _samples=_.map(!_.isEmpty(initConfig.samples)&&initConfig.samples||_defaultSamples,sample=>(idx++,{id:_sampleBaseId+idx,url:sample,timeout:1e3*initConfig.timeout||_defaultTimeout,nb:initConfig.occurrences||_defaultOccurrencesCount}));return _samples[0].nb++,{start(done){const tests=[];_.forEach(_samples,data=>{const cb=_.partial(loadItem,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),async.series(tests,(err,measures)=>{const decimals=2;if(err&&!measures.length)throw err;measures.shift();const results=stats(measures,"duration",2),status=this.getFeedback(results.average),summary=this.getSummary(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{performancesMin:{message:labels.performancesMin,value:`${results.min} s`},performancesMax:{message:labels.performancesMax,value:`${results.max} s`},performancesAverage:{message:labels.performancesAverage,value:`${results.average} s`}}},getFeedback(result){const optimal=initConfig.optimal,range=_Mathabs(optimal-initConfig.threshold),status=getStatus(100*((range+optimal-result)/range),_thresholds);return status.title=labels.title,status.id=initConfig.id,status}}}}),define("taoClientDiagnostic/tools/bandwidth/tester",["lodash","i18n","async","context","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/stats","taoClientDiagnostic/tools/fixedDecimals","taoClientDiagnostic/tools/getStatus"],function(_,__,async,context,getConfig,getLabels,stats,fixedDecimals,getStatus){"use strict";var _Mathfloor2=Math.floor,_Mathmax4=Math.max;function download(data,cb){if(data.threshold&&this.bandwidth{const end=window.performance.now();clearTimeout(timeoutId);const duration=end-start,bytes=data.size,seconds=duration/_second,speed=8*bytes/seconds/_mega;return this.bandwidth=_Mathmax4(this.bandwidth,speed),cb(null,{id:data.id,file:data.file,size:data.size,duration,speed})},request.onerror=err=>{clearTimeout(timeoutId),cb(err)},request.onreadystatechange=()=>{4===request.readyState&&200!==request.status&&(clearTimeout(timeoutId),cb(request.status))},request.send()}const _kilo=1024,_mega=1048576,_second=1e3,_thresholds=[{threshold:0,message:__("Low bandwidth"),type:"error"},{threshold:33,message:__("Average bandwidth"),type:"warning"},{threshold:66,message:__("Good bandwidth"),type:"success"}],_defaults={id:"bandwidth",unit:.16,ideal:45,max:100,minimumGlobalPercentage:!1,feedbackThresholds:_thresholds,fallbackThreshold:.2},_downloadData={"10KB":{id:"10KB",file:"data/bin10KB.data",size:10240,timeout:_second,threshold:0,nb:10},"100KB":{id:"100KB",file:"data/bin100KB.data",size:102400,timeout:2*_second,threshold:0,nb:5},"1MB":{id:"1MB",file:"data/bin1MB.data",size:_mega,timeout:20*_second,threshold:0,nb:3}},_messages=[{title:__("Bandwidth"),status:__("Checking the bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle"),bandwidthMin:__("Minimum bandwidth"),bandwidthMax:__("Maximum bandwidth"),bandwidthAverage:__("Average bandwidth")},{title:__("Media intensive bandwidth"),status:__("Checking the media intensive bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle with media intensive"),bandwidthMin:__("Minimum intensive bandwidth"),bandwidthMax:__("Maximum intensive bandwidth"),bandwidthAverage:__("Average intensive bandwidth")}];return function bandwidthTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return _.isArray(initConfig.feedbackThresholds)&&!initConfig.feedbackThresholds.length&&(initConfig.feedbackThresholds=_thresholds),{start(done){const tests=[];_.forEach(_downloadData,data=>{const cb=download.bind(this,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),this.bandwidth=0,async.series(tests,(err,measures)=>{function getValue(value){let speed=0;return value&&(duration+=value.duration,size+=value.size,speed=value.speed,value.speed=fixedDecimals(speed,decimals)),speed}let duration=0,size=0;const decimals=2,resultsBySize={};if(err&&!measures.length)throw err;const results=stats(measures,getValue,2);_.forEach(_downloadData,(data,key)=>{resultsBySize[key]=stats(_.filter(measures,o=>o.id===key),getValue,decimals)}),results.duration=fixedDecimals(duration/_second,2),results.size=size;const summary=this.getSummary(results),status=this.getFeedback(results,resultsBySize);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{bandwidthMin:{message:labels.bandwidthMin,value:results.min+" Mbps"},bandwidthMax:{message:labels.bandwidthMax,value:results.max+" Mbps"},bandwidthAverage:{message:labels.bandwidthAverage,value:results.average+" Mbps"}}},getFeedback(result,resultsBySize){const avgResult=result.average,bandwidthUnit=initConfig.unit,threshold=initConfig.ideal,maxTestTakers=initConfig.max,max=threshold*bandwidthUnit,getStatusOptions=initConfig.minimumGlobalPercentage?{minimumGlobalPercentage:initConfig.minimumGlobalPercentage}:{},baseBandwidth=avgResult;let stable=!0;_.forEach(resultsBySize,resultBySize=>{resultBySize.min/resultBySize.averagemaxTestTakers&&(nb=">"+maxTestTakers),status.id=initConfig.id,status.title=labels.title,status.feedback.legend=labels.legend,status.quality.label=nb,stable||(status.feedback.type="warning",status.feedback.message=__("Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience."),status.feedback.legend=__("Simultaneous test takers under normal connection conditions.")),2{const xhr=new window.XMLHttpRequest,startTime=Date.now();return xhr.upload.addEventListener("progress",evt=>{if(evt.lengthComputable){const passedTime=Date.now()-startTime;data.push({time:passedTime,loaded:evt.loaded,speed:8*evt.loaded/_mega/(passedTime/1e3)})}},!1),xhr}})}const _kilo=1024,_mega=1048576;let data=[];const _defaults={id:"upload",size:_mega,optimal:_mega},_thresholds=[{threshold:0,message:__("Low upload speed"),type:"error"},{threshold:33,message:__("Average upload speed"),type:"warning"},{threshold:66,message:__("Good upload speed"),type:"success"}],_messages=[{title:__("Upload speed"),status:__("Checking upload speed..."),uploadAvg:__("Average upload speed"),uploadMax:__("Max upload speed")}];return function uploadTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){upload(parseInt(initConfig.size,10)).then(()=>{let totalSpeed=0,maxSpeed=0;_.forEach(data,val=>{totalSpeed+=val.speed,maxSpeedlist.some(entry=>{const{browser,device,os,versions}=entry;return!(currentDevice!==device)&&!(os&&os.toLowerCase()!==currentOS)&&!(browser.toLowerCase()!==currentBrowser)&&_(versions).map(version=>version.split("-")).flatten().value().some(version=>0<=currentVersion.localeCompare(version,void 0,{numeric:!0}))},{}))}const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level),fetchBrowserList=()=>request({url:initConfig.browserslistUrl,noToken:!0}).catch(()=>[]);return{start(done){getPlatformInfo(window,initConfig).catch(err=>(logger.error(err),{browser:unknown,browserVersion:"",os:unknown,osVersion:"",isMobile:!1})).then(platformInfo=>checkBrowserSupport(platformInfo).then(browserSupported=>Object.assign(platformInfo,{browserSupported}))).then(platformInfo=>{request({url:urlHelper.route(initConfig.action,initConfig.controller,initConfig.extension),data:platformInfo,method:"POST",noToken:!0}).catch(()=>({success:!1,type:"error",message:__("Unable to validate the data as the server did not respond in time.")})).then(data=>{const percentage="success"===data.type?100:"warning"===data.type?33:0,status=this.getFeedback(percentage,data),summary=this.getSummary(platformInfo);status.customMsgRenderer=customMsg=>(customMsg||"").replace(_placeHolders.CURRENT_BROWSER,summary.browser.value).replace(_placeHolders.CURRENT_OS,summary.os.value),done(status,summary,platformInfo)})})},get labels(){return labels},getSummary(results){const currentBrowser=`${results.browser} ${results.browserVersion}`,currentOs=`${results.os} ${results.osVersion}`;return{browser:{message:labels.browser,value:currentBrowser},os:{message:labels.os,value:currentOs}}},getFeedback(result,data){const status=getStatus(result,data);return status.id=initConfig.id,status.title=labels.title,status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="

          ",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="

          ",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          ",buffer}function program5(depth0,data){var stack1,helper,buffer="";return buffer+="

          ",(helper=helpers.setup)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.setup,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          ",buffer}function program7(depth0,data){var helper,options,buffer="";return buffer+="\n

          \n \n \n

          \n

          \n \n \n

          \n ",buffer}function program9(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(12,program12,data),fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program10(depth0,data){var helper,options,buffer="";return buffer+="\n

          \n \n \n

          \n

          \n \n \n

          \n ",buffer}function program12(depth0,data){var helper,options,buffer="";return buffer+="\n

          \n \n \n

          \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
          \n\n

          ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

          \n\n
          \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.setup,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(7,program7,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          \n\n
          \n \n
          \n\n
            \n\n
            \n

            \n
            \n\n
            ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/result",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var helper,options,buffer="";return buffer+="\n
            \n \n \n
            \n
            \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this;return buffer+="
          • \n

            ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

            \n
            \n\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.details,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
          • ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/details",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
            \n

            "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Details",options):helperMissing.call(depth0,"__","Details",options)))+"

            \n
            \n \n \n ",stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
            \n
            \n
            ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="
            ",(helper=helpers.legend)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.legend,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
            ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="
            ",(helper=helpers.customMsg)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.customMsg,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
            ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
            \n \n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.legend,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.customMsg,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
            ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" wide"}function program3(depth0,data){var stack1,helper,buffer="";return buffer+=" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
            \n
            \n
            ",buffer})}),define("css!taoClientDiagnosticCss/diagnostics",[],function(){}),define("taoClientDiagnostic/tools/diagnostic/diagnostic",["jquery","lodash","i18n","async","ui/component","core/logger","core/store","core/request","core/dataProvider/request","ui/dialog/alert","ui/feedback","util/url","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/bandwidth/tester","taoClientDiagnostic/tools/upload/tester","taoClientDiagnostic/tools/browser/tester","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/getConfig","tpl!taoClientDiagnostic/tools/diagnostic/tpl/main","tpl!taoClientDiagnostic/tools/diagnostic/tpl/result","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","css!taoClientDiagnosticCss/diagnostics"],function($,_,__,async,component,loggerFactory,store,request,requestData,dialogAlert,feedback,urlHelper,performancesTester,bandwidthTester,uploadTester,browserTester,getStatus,getConfig,mainTpl,resultTpl,detailsTpl,feedbackTpl,qualityBarTpl){"use strict";const logger=loggerFactory("taoClientDiagnostic/diagnostic"),_defaults={title:__("System Compatibility"),header:__("This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform."),info:__("Be aware that these tests will take up to several minutes."),button:__("Test system compatibility"),actionStore:"storeData",actionSchool:"schoolName",controller:"DiagnosticChecker",extension:"taoClientDiagnostic",actionDropId:"deleteId",storeAllRuns:!1,configurableText:{}},_thresholds=[{threshold:0,message:__("Your system requires a compatibility update, please contact your system administrator."),type:"error"},{threshold:33,message:__("Your system is not optimal, please contact your system administrator."),type:"warning"},{threshold:66,message:__("Your system is fully compliant."),type:"success"}],diagnostic={changeStatus(status){return this.is("rendered")&&this.controls.$status.html(status),this},store(type,data,done){const config=this.config,url=urlHelper.route(config.actionStore,config.controller,config.extension,config.storeParams);data=_.omit(data,"values"),data.type=type,request({url,data,method:"POST",noToken:!0}).then(done).catch(err=>{logger.error(err),feedback().error(__("Unable to save the results! Please check your connection.")),done()})},getCustomMsg(key){return this.config.configurableText[key]},addCustomFeedbackMsg(status,msg){this.hasFailed(status)&&msg&&(_.isFunction(status.customMsgRenderer)&&(msg=status.customMsgRenderer(msg)),status.feedback=status.feedback||{},status.feedback.customMsg=msg)},hasFailed(result){return!(result&&result.feedback&&"success"===result.feedback.type)},addResult(result){if(this.is("rendered")){result.quality&&result.quality.label&&2{$indicator.length&&$indicator.animate({left:result.percentage*$main.outerWidth()/100-$indicator.outerWidth()/2})})}return this},cleanUp(){return this.controls.$results.empty(),this},enable(){return this.controls.$start.removeClass("hidden"),this},disable(){return this.controls.$start.addClass("hidden"),this},prepare(){return this.trigger("start"),this.changeStatus(__("Starting...")),this.setState("running",!0),this.setState("done",!1),this.cleanUp(),this.disable(),this},finish(){const config=this.config;return this.enable(),config.storeAllRuns&&this.deleteIdentifier(),this.trigger("end"),this.changeStatus(__("Done!")),this.setState("running",!1),this.setState("done",!0),this},deleteIdentifier(){const url=urlHelper.route(this.config.actionDropId,this.config.controller,this.config.extension);return request({url,method:"POST",noToken:!0})},run(){const information=[],scores={},testers=[],customInput=this.getCustomInput(),doRun=()=>{const doCheck=(testerConfig,cb)=>{const testerId=testerConfig.id;this.trigger("starttester",testerId),this.setState(testerId,!0);const processTester=testerFactory=>{const tester=testerFactory(getConfig(testerConfig,this.config),this);this.changeStatus(tester.labels.status),tester.start((status,details,results)=>{if(testerConfig.customMsgKey){const customMsg=this.getCustomMsg(testerConfig.customMsgKey);this.addCustomFeedbackMsg(status,customMsg)}_.forEach(details,info=>information.push(info)),scores[status.id]=status,this.trigger("endtester",testerId,status),this.setState(testerId,!1),results=_.mapValues(results,value=>{switch(typeof value){case"boolean":return value?1:0;case"object":return JSON.stringify(value)}return value}),this.store(testerId,results,()=>{this.addResult(status),cb()})})},processFailure=err=>{logger.error(err),feedback().error(__("Unable to process with the diagnostic tester %s. The tester module is unreachable.",testerId)),cb()};require([testerConfig.tester],processTester,processFailure)};this.is("rendered")&&(this.prepare(),_.forEach(this.config.testers,(testerConfig,testerId)=>{testerConfig.id=testerConfig.id||testerId,testerConfig.enabled&&testers.push(cb=>doCheck(testerConfig,cb))}),async.series(testers,()=>{const total=_.minBy(scores,"globalPercentage"),status=getStatus(total.globalPercentage,_thresholds);status.title=__("Total"),status.id="total",this.addCustomFeedbackMsg(status,this.config.configurableText.diagTotalCheckResult),status.details=information,this.addResult(status),this.finish()}))};return 0<_.size(customInput)?this.store("custom_input",customInput,doRun):doRun(),this},getCustomInput(){const vars={};return window.location.href.replace(location.hash,"").replace(/[?&]+([^=&]+)=?([^&]*)?/gi,(m,key,value)=>{_.has(this.config.customInput,key)&&(vars[key]="undefined"==typeof value?"":value)}),vars}};return function diagnosticFactory(container,config){config&&_.forEach(["title","header","footer","info","button"],name=>{config[name]&&(config[name]=__(config[name]))});const diagComponent=component(diagnostic,_defaults).setTemplate(mainTpl).on("destroy",function onDiagnosticDestroy(){this.controls=null}).on("init",function onDiagnosticInit(){this.render(container)}).on("render",function onDiagnosticRender(){function getInputValue(name){const $control=getControl(name);return($control&&$control.val()||"").trim()}function setInputValue(name,value){const $control=getControl(name);$control&&$control.val(value)}function toggleControl(name,state){const $control=getControl(name);$control&&("undefined"==typeof state&&(state=!$control.is(":enabled")),state?$control.prop("disabled",!1):$control.prop("disabled",!0))}const runDiagnostics=data=>{data&&_.isPlainObject(data)&&(this.config.storeParams=_.assign(this.config.storeParams||{},data)),this.run()};let launch=()=>runDiagnostics();const getControl=name=>this.controls[`\$${name}`],requestSchoolName=values=>{const componentConfig=this.config;return requestData(urlHelper.route(componentConfig.actionSchool,componentConfig.controller,componentConfig.extension),values,"POST").then(data=>({school_name:data,school_number:values.school_number}))},manageSchoolProperties=(fields,validate)=>{function toggleStart(){const allow=_.every(fields,getInputValue);return toggleControl("start",allow),allow}function toggleFields(state){_.forEach(fields,function(fieldName){toggleControl(fieldName,state)})}_.forEach(fields,fieldName=>{this.controls[`\$${fieldName}`]=this.getElement().find(`[data-control="${fieldName}"]`).on("keypress",e=>{const shouldStart=13===e.which;shouldStart&&e.preventDefault(),_.defer(()=>{toggleStart()&&shouldStart&&this.controls.$start.click()})})}),toggleStart(),toggleFields(!1),store("client-diagnostic").then(storage=>(this.on("start.school",()=>{_.forEach(fields,fieldName=>{storage.setItem(fieldName,getInputValue(fieldName)).catch(error=>{logger.error(error)})})}),Promise.all(_.map(fields,fieldName=>storage.getItem(fieldName).then(value=>{setInputValue(fieldName,value)}))))).catch(error=>{logger.error(error)}).then(()=>{toggleFields(!0),toggleStart()}),launch=()=>{const values=_.reduce(fields,(result,fieldName)=>(result[fieldName]=getInputValue(fieldName),result),{});this.changeStatus(__("Getting school name...")).cleanUp().disable(),_.isFunction(validate)?validate(values).then(runDiagnostics).catch(error=>{const response=error.response||{},message=response.errorMsg||response.errorMessage||__("An error occurred! Please verify your input!");dialogAlert(message),logger.error(error),this.changeStatus(__("Failed to get school name")).enable()}):runDiagnostics(values)},this.on("start.school",()=>{toggleFields(!1)}).on("end.school",()=>{toggleFields(!0)})};this.controls={$start:this.$component.find("[data-action=\"test-launcher\"]"),$status:this.$component.find(".status h2"),$results:this.$component.find(".results")},this.controls.$start.on("click",()=>{this.controls.$start.is(":enabled")&&launch()}),this.config.requireSchoolName&&(this.config.validateSchoolName?manageSchoolProperties(["school_number","school_pin"],requestSchoolName):manageSchoolProperties(["school_name"])),this.config.requireSchoolId&&manageSchoolProperties(["school_id","workstation"]),this.controls.$results.on("click","button[data-action=\"show-details\"]",function onShowDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.removeClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"hide-details\"]").removeClass("hidden")}),this.controls.$results.on("click","button[data-action=\"hide-details\"]",function onHideDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.addClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"show-details\"]").removeClass("hidden")})});return _.defer(()=>diagComponent.init(config)),diagComponent}}),define("tpl!taoClientDiagnostic/templates/diagnostic/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.diagInstructions,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program2(depth0,data){var stack1,helper,buffer="";return buffer+="

            ",(helper=helpers.diagInstructions)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.diagInstructions,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

            ",buffer}function program4(depth0,data){var stack1,helper,buffer="";return buffer+="

            ",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

            ",buffer}function program6(depth0,data){var stack1,helper,buffer="";return buffer+="

            ",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

            ",buffer}function program8(depth0,data){var helper,options,buffer="";return buffer+="\n

            \n \n \n

            \n ",buffer}function program10(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(13,program13,data),fn:self.program(11,program11,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program11(depth0,data){var helper,options,buffer="";return buffer+="\n

            \n \n \n

            \n

            \n \n \n

            \n ",buffer}function program13(depth0,data){var helper,options,buffer="";return buffer+="\n

            \n \n \n

            \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing;return buffer+="
            \n\n

            ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

            \n\n
            \n ",stack1=helpers["with"].call(depth0,depth0&&depth0.configurableText,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(4,program4,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n

            \n \n \n

            \n
            \n\n
            \n \n
            \n\n
              \n\n
              \n

              \n
              \n\n
              ",buffer})}),define("taoClientDiagnostic/controller/Diagnostic/diagnostic",["module","jquery","i18n","helpers","core/request","layout/loading-bar","ui/actionbar","ui/feedback","taoClientDiagnostic/tools/diagnostic/diagnostic","tpl!taoClientDiagnostic/templates/diagnostic/main"],function(module,$,__,helpers,request,loadingBar,actionbar,feedback,diagnosticFactory,diagnosticTpl){"use strict";const cssScope=".diagnostic-runner";return loadingBar.start(),{start(){function installTester(workstation){diagnosticFactory($list,config).setTemplate(diagnosticTpl).on("render",function onDiagnosticRender(){this.controls.$workstation=this.getElement().find("[data-control=\"workstation\"]").on("keypress",e=>{13===e.which&&(e.preventDefault(),this.run())}).val(workstation),loadingBar.stop(),config.autoStart&&this.run()}).on("start",function onDiagnosticStart(){this.config.storeParams=this.config.storeParams||{},this.config.storeParams.workstation=this.controls.$workstation.val(),this.controls.$workstation.prop("disabled",!0),loadingBar.start()}).on("end",function onDiagnosticEnd(){this.controls.$workstation.prop("disabled",!1),loadingBar.stop()})}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",$list=$container.find(".list"),$panel=$(".panel"),extensionConfig=$container.data("config")||{},config=extensionConfig.diagnostic||extensionConfig,indexUrl=helpers._url("index","Diagnostic",extension),buttons=[],moduleConfig=module.config()||{};config.configurableText=moduleConfig.configurableText||{},buttons.push({id:"back",icon:"step-backward",title:__("Return to the list"),label:__("List of readiness checks"),action(){window.location.href=indexUrl}}),window.self===window.top&&buttons.push({id:"exitButton",icon:"close",title:__("Exit"),label:__("Exit"),action(){window.self.close()}}),actionbar({renderTo:$panel,buttons});const url=helpers._url("workstation","DiagnosticChecker",extension);request({url,noToken:!0}).then(data=>installTester(data&&data.workstation)).catch(()=>{feedback().error(__("Unable to get the workstation name!")),installTester()})}}}),!function(e,t,i){"use strict";"function"==typeof define&&define.amd?define("taoClientDiagnostic/lib/fingerprint/fingerprint2",i):"undefined"!=typeof module&&module.exports?module.exports=i():t.exports?t.exports=i():t[e]=i()}("Fingerprint2",this,function(){"use strict";var e=function(t){if(!(this instanceof e))return new e(t);var i={swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",detectScreenOrientation:!0,sortPluginsFor:[/palemoon/i],userDefinedFonts:[]};this.options=this.extend(t,i),this.nativeForEach=Array.prototype.forEach,this.nativeMap=Array.prototype.map};return e.prototype={extend:function(e,t){if(null==e)return t;for(var i in e)null!=e[i]&&t[i]!==e[i]&&(t[i]=e[i]);return t},get:function(e){var t=this,i={data:[],push:function(e){var i=e.key,a=e.value;"function"==typeof t.options.preprocessor&&(a=t.options.preprocessor(i,a)),this.data.push({key:i,value:a})}};i=this.userAgentKey(i),i=this.languageKey(i),i=this.colorDepthKey(i),i=this.pixelRatioKey(i),i=this.hardwareConcurrencyKey(i),i=this.screenResolutionKey(i),i=this.availableScreenResolutionKey(i),i=this.timezoneOffsetKey(i),i=this.sessionStorageKey(i),i=this.localStorageKey(i),i=this.indexedDbKey(i),i=this.addBehaviorKey(i),i=this.openDatabaseKey(i),i=this.cpuClassKey(i),i=this.platformKey(i),i=this.doNotTrackKey(i),i=this.pluginsKey(i),i=this.canvasKey(i),i=this.webglKey(i),i=this.adBlockKey(i),i=this.hasLiedLanguagesKey(i),i=this.hasLiedResolutionKey(i),i=this.hasLiedOsKey(i),i=this.hasLiedBrowserKey(i),i=this.touchSupportKey(i),i=this.customEntropyFunction(i),this.fontsKey(i,function(i){var a=[];t.each(i.data,function(e){var t=e.value;"undefined"!=typeof e.value.join&&(t=e.value.join(";")),a.push(t)});var r=t.x64hash128(a.join("~~~"),31);return e(r,i.data)})},customEntropyFunction:function(e){return"function"==typeof this.options.customFunction&&e.push({key:"custom",value:this.options.customFunction()}),e},userAgentKey:function(e){return this.options.excludeUserAgent||e.push({key:"user_agent",value:this.getUserAgent()}),e},getUserAgent:function(){return navigator.userAgent},languageKey:function(e){return this.options.excludeLanguage||e.push({key:"language",value:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||""}),e},colorDepthKey:function(e){return this.options.excludeColorDepth||e.push({key:"color_depth",value:screen.colorDepth||-1}),e},pixelRatioKey:function(e){return this.options.excludePixelRatio||e.push({key:"pixel_ratio",value:this.getPixelRatio()}),e},getPixelRatio:function(){return window.devicePixelRatio||""},screenResolutionKey:function(e){return this.options.excludeScreenResolution?e:this.getScreenResolution(e)},getScreenResolution:function(e){var t;return t=this.options.detectScreenOrientation&&screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height],"undefined"!=typeof t&&e.push({key:"resolution",value:t}),e},availableScreenResolutionKey:function(e){return this.options.excludeAvailableScreenResolution?e:this.getAvailableScreenResolution(e)},getAvailableScreenResolution:function(e){var t;return screen.availWidth&&screen.availHeight&&(t=this.options.detectScreenOrientation?screen.availHeight>screen.availWidth?[screen.availHeight,screen.availWidth]:[screen.availWidth,screen.availHeight]:[screen.availHeight,screen.availWidth]),"undefined"!=typeof t&&e.push({key:"available_resolution",value:t}),e},timezoneOffsetKey:function(e){return this.options.excludeTimezoneOffset||e.push({key:"timezone_offset",value:new Date().getTimezoneOffset()}),e},sessionStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasSessionStorage()&&e.push({key:"session_storage",value:1}),e},localStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasLocalStorage()&&e.push({key:"local_storage",value:1}),e},indexedDbKey:function(e){return!this.options.excludeIndexedDB&&this.hasIndexedDB()&&e.push({key:"indexed_db",value:1}),e},addBehaviorKey:function(e){return document.body&&!this.options.excludeAddBehavior&&document.body.addBehavior&&e.push({key:"add_behavior",value:1}),e},openDatabaseKey:function(e){return!this.options.excludeOpenDatabase&&window.openDatabase&&e.push({key:"open_database",value:1}),e},cpuClassKey:function(e){return this.options.excludeCpuClass||e.push({key:"cpu_class",value:this.getNavigatorCpuClass()}),e},platformKey:function(e){return this.options.excludePlatform||e.push({key:"navigator_platform",value:this.getNavigatorPlatform()}),e},doNotTrackKey:function(e){return this.options.excludeDoNotTrack||e.push({key:"do_not_track",value:this.getDoNotTrack()}),e},canvasKey:function(e){return!this.options.excludeCanvas&&this.isCanvasSupported()&&e.push({key:"canvas",value:this.getCanvasFp()}),e},webglKey:function(e){return this.options.excludeWebGL?e:this.isWebGlSupported()?(e.push({key:"webgl",value:this.getWebglFp()}),e):e},adBlockKey:function(e){return this.options.excludeAdBlock||e.push({key:"adblock",value:this.getAdBlock()}),e},hasLiedLanguagesKey:function(e){return this.options.excludeHasLiedLanguages||e.push({key:"has_lied_languages",value:this.getHasLiedLanguages()}),e},hasLiedResolutionKey:function(e){return this.options.excludeHasLiedResolution||e.push({key:"has_lied_resolution",value:this.getHasLiedResolution()}),e},hasLiedOsKey:function(e){return this.options.excludeHasLiedOs||e.push({key:"has_lied_os",value:this.getHasLiedOs()}),e},hasLiedBrowserKey:function(e){return this.options.excludeHasLiedBrowser||e.push({key:"has_lied_browser",value:this.getHasLiedBrowser()}),e},fontsKey:function(e,t){return this.options.excludeJsFonts?this.flashFontsKey(e,t):this.jsFontsKey(e,t)},flashFontsKey:function(e,t){return this.options.excludeFlashFonts?t(e):this.hasSwfObjectLoaded()&&this.hasMinFlashInstalled()?"undefined"==typeof this.options.swfPath?t(e):void this.loadSwfAndDetectFonts(function(i){e.push({key:"swf_fonts",value:i.join(";")}),t(e)}):t(e)},jsFontsKey:function(e,t){var i=this;return setTimeout(function(){var a=["monospace","sans-serif","serif"],r=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Garamond","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"],n=["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"];i.options.extendedJsFonts&&(r=r.concat(n)),r=r.concat(i.options.userDefinedFonts);var o="mmmmmmmmmmlli",s="72px",l=document.getElementsByTagName("body")[0],h=document.createElement("div"),u=document.createElement("div"),c={},d={},g=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.lineHeight="normal",e.innerHTML="mmmmmmmmmmlli",e},p=function(e,t){var i=g();return i.style.fontFamily="'"+e+"',"+t,i},f=function(){for(var r,e=[],t=0,i=a.length;tt.name?1:e.name>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Multiply:function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Rotl:function(e,t){return t%=64,32===t?[e[1],e[0]]:32>t?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},x64LeftShift:function(e,t){return t%=64,0===t?e:32>t?[e[0]<>>32-t,e[1]<>>1]),e=this.x64Multiply(e,[4283543511,3981806797]),e=this.x64Xor(e,[0,e[0]>>>1]),e=this.x64Multiply(e,[3301882366,444984403]),e=this.x64Xor(e,[0,e[0]>>>1])},x64hash128:function(e,t){e=e||"",t=t||0;for(var i=e.length%16,a=e.length-i,r=[0,t],n=[0,t],o=[0,0],s=[0,0],l=[2277735313,289559509],h=[1291169091,658871167],u=0;u>>0).toString(16)).slice(-8)+("00000000"+(r[1]>>>0).toString(16)).slice(-8)+("00000000"+(n[0]>>>0).toString(16)).slice(-8)+("00000000"+(n[1]>>>0).toString(16)).slice(-8)}},e.VERSION="1.5.1",e}),define("taoClientDiagnostic/tools/fingerprint/tester",["jquery","lodash","i18n","util/url","core/logger","core/store","core/format","lib/uuid","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/lib/fingerprint/fingerprint2"],function($,_,__,url,loggerFactory,store,format,uuid,getConfig,getLabels,getStatus,Fingerprint2){"use strict";const logger=loggerFactory("taoClientDiagnostic/fingerprint"),_defaults={id:"fingerprint"},_storageKeys={store:"client-diagnostic",uuid:"uuid",fingerprint:"value",details:"details",errors:"errors",changed:"changed"},_thresholdValues={error:0,storageIssue:50,changedFingerprint:90,success:100},_thresholds=[{threshold:_thresholdValues.error,message:__("Cannot get your fingerprint"),type:"error"},{threshold:_thresholdValues.storageIssue,message:__("Your fingerprint is %s. However we encountered issue while retrieving the data. Maybe your available disk space is too small"),type:"warning"},{threshold:_thresholdValues.changedFingerprint,message:__("Your fingerprint is %s. However it seems it has changed since the last check. It could be related to changes in your system."),type:"success"},{threshold:_thresholdValues.success,message:__("Your fingerprint is %s"),type:"success"}],_messages=[{title:__("Fingerprint"),status:__("Computing the fingerprint..."),fingerprintValue:__("Fingerprint"),fingerprintUUID:__("Dynamic UID"),fingerprintDetails:__("Fingerprint sources"),fingerprintChanged:__("Change since last fingerprint"),fingerprintErrors:__("Fingerprint errors"),fingerprintError:__("Fingerprint error")}];return function browserFingerprint(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){function handleError(error){errors.push({key:"error",value:""+error}),logger.error(error)}function getStorageKey(key){return`${initConfig.id}-${_storageKeys[key]}`}let browserStorage,browserId="error",lastFingerprint="error",freshBrowserId=!1,newFingerprint=!1;const errors=[];store(_storageKeys.store).then(storage=>(browserStorage=storage,Promise.all([browserStorage.getItem(getStorageKey("uuid")).then(value=>{browserId=value}),browserStorage.getItem(getStorageKey("fingerprint")).then(value=>{lastFingerprint=value})]))).catch(handleError).then(()=>new Promise(resolve=>{new Fingerprint2().get((result,details)=>{const results={};results[_storageKeys.fingerprint]=(""+result).toUpperCase(),results[_storageKeys.details]=details,resolve(results)})})).then(results=>{const pendingPromises=[],resultFingerprint=results[_storageKeys.fingerprint];return browserId||(browserId=uuid(32,16),freshBrowserId=!0),newFingerprint=lastFingerprint!==resultFingerprint&&"error"!==lastFingerprint,results[_storageKeys.uuid]=browserId,results[_storageKeys.changed]=newFingerprint&&!freshBrowserId,browserStorage&&(freshBrowserId&&pendingPromises.push(browserStorage.setItem(getStorageKey("uuid"),browserId)),newFingerprint&&pendingPromises.push(browserStorage.setItem(getStorageKey("fingerprint"),resultFingerprint))),Promise.all(pendingPromises).catch(handleError).then(()=>results)}).catch(handleError).then(results=>{results=results||{},errors.length&&(results[_storageKeys.errors]=errors.length,results[_storageKeys.details]=(results[_storageKeys.details]||[]).concat(errors));const summary=this.getSummary(results),status=this.getFeedback(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){const sources=_(results[_storageKeys.details]).map("key").pull("error").value(),summary={fingerprintValue:{message:labels.fingerprintValue,value:results[_storageKeys.fingerprint]},fingerprintDetails:{message:labels.fingerprintDetails,value:__("%d sources (%s)",_.size(sources),sources.join(", "))},fingerprintChanged:{message:labels.fingerprintChanged,value:results[_storageKeys.changed]?__("Yes"):__("No")}};return results[_storageKeys.errors]&&(summary.fingerprintErrors={message:labels.fingerprintErrors,value:results[_storageKeys.errors]},_.forEach(results[_storageKeys.details],(details,idx)=>{"error"===details.key&&(summary["fingerprintError"+idx]={message:labels.fingerprintError,value:details.value})})),summary},getFeedback(results){let percentage;percentage=results&&results[_storageKeys.fingerprint]&&"error"!==results[_storageKeys.fingerprint]?"error"===results[_storageKeys.uuid]?_thresholdValues.storageIssue:results[_storageKeys.changed]?_thresholdValues.changedFingerprint:_thresholdValues.success:_thresholdValues.error;const status=getStatus(percentage,_thresholds);return status.id=initConfig.id,status.title=labels.title,status.feedback.message=format(status.feedback.message,results&&results[_storageKeys.fingerprint]),status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,options,buffer="";return buffer+="\n\n ",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),stack1=helpers["if"].call(depth0,depth0&&depth0.errors,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n \n",buffer}function program2(depth0,data){return" errors"}function program4(depth0,data){var helper,options,buffer="";return buffer+=" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Errors occurred! Please see details",options):helperMissing.call(depth0,"__","Errors occurred! Please see details",options)))+"\"",buffer}function program6(depth0,data){return" "}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,functionType="function";return stack1=helpers["if"].call(depth0,depth0&&depth0.value,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""})}),define("taoClientDiagnostic/tools/csvExporter",["jquery","lodash","i18n","core/request","layout/loading-bar","helpers"],function($,_,__,request,loadingBar,helpers){"use strict";const cssScope=".diagnostic-index";return{exportCsv(model){function mappingDiagnosticsData(diagnostics){return diagnostics.map(diagnostic=>{const result={};return _.forEach(model,field=>{result[field.id]=field.transform?field.transform(diagnostic[field.id],diagnostic):diagnostic[field.id]}),result})}function arrayToCsv(data){let columnDelimiter=1{let ctr=0;keys.forEach(key=>{0");link.attr("download",filename).attr("href",url).get(0).click(),URL.revokeObjectURL(url),link=null}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",serviceUrl=helpers._url("diagnosticData","Diagnostic",extension);loadingBar.start(),request({url:serviceUrl,data:{rows:Number.MAX_SAFE_INTEGER},noToken:!0}).then(response=>{const mappedData=mappingDiagnosticsData(response.data);let csvContent=arrayToCsv(mappedData);downloadFile(csvContent,__("diagnostics.csv"),"text/csv"),loadingBar.stop()}).catch(()=>{loadingBar.stop()})}}}),define("taoClientDiagnostic/controller/Diagnostic/index",["jquery","lodash","i18n","helpers","moment","core/request","layout/loading-bar","util/encode","ui/feedback","ui/dialog","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/fingerprint/tester","tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","taoClientDiagnostic/tools/csvExporter","ui/datatable","lib/moment-timezone.min"],function($,_,__,helpers,moment,request,loadingBar,encode,feedback,dialog,getStatus,performancesTesterFactory,fingerprintTesterFactory,fingerprintTpl,detailsTpl,csvExporter){"use strict";var _Mathmax5=Math.max,_Mathround2=Math.round,_Mathpow=Math.pow;function formatNumber(value,digits){const nb="undefined"==typeof digits?2:_Mathmax5(0,parseInt(digits,10)),factor=_Mathpow(10,nb)||1;return _Mathround2(value*factor)/factor}function formatBandwidth(value){return 100 100":formatNumber(value)}function transformDateToLocal(date){let time;if(_.isFinite(date)){_.isNumber(date)||(date=_.parseInt(date,10));const d=new Date(1e3*date);time=moment.utc(d)}else time=moment.tz(date,defaultDateTimeZone);return time.tz(moment.tz.guess()).format(defaultDateFormat)}const cssScope=".diagnostic-index",defaultDateTimeZone="UTC",defaultDateFormat="Y/MM/DD HH:mm:ss";return loadingBar.start(),{start(){function requestData(url,selection,message){selection&&selection.length&&(loadingBar.start(),request({url,data:{id:selection},method:"POST",noToken:!0}).then(response=>{loadingBar.stop(),response&&response.success?(message&&feedback().success(message),$list.datatable("refresh")):feedback().error(`${__("Something went wrong ...")}
              ${encode.html(response.error)}`,{encodeHtml:!1})}).catch(()=>loadingBar.stop()))}function remove(selection){requestData(removeUrl,selection,__("The readiness check result have been removed"))}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",$list=$container.find(".list");let dataset=$container.data("set");const extensionConfig=$container.data("config")||{},config=extensionConfig.diagnostic||extensionConfig,installedExtension=$container.data("installedextension")||!1,diagnosticUrl=helpers._url("diagnostic","Diagnostic",extension),removeUrl=helpers._url("remove","Diagnostic",extension),serviceUrl=helpers._url("diagnosticData","Diagnostic",extension),performancesTester=performancesTesterFactory(config.testers.performance||{}),fingerprintTester=fingerprintTesterFactory(config.testers.fingerprint||{}),tools=[],actions=[],model=[];tools.push({id:"refresh",icon:"reset",title:__("Refresh the page"),label:__("Refresh"),action(){$list.datatable("refresh")}}),tools.push({id:"launch",icon:"play",title:__("Launch another readiness check"),label:__("Launch readiness check"),action(){window.location.href=diagnosticUrl}}),config.export&&tools.push({id:"csvExport",icon:"export",title:__("Export CSV"),label:__("Export CSV"),action(){csvExporter.exportCsv(model)}}),installedExtension&&tools.push({id:"lti",icon:"play",title:__("Try a test delivery"),label:__("Try a test delivery"),action(){window.location.href=deliveryUrl}}),tools.push({id:"remove",icon:"remove",title:__("Remove the selected readiness check results"),label:__("Remove"),massAction:!0,action(selection){dialog({message:__("The selected readiness check results will be removed. Continue ?"),autoRender:!0,autoDestroy:!0,onOkBtn(){remove(selection)}})}}),window.self===window.top&&tools.push({id:"exitButton",icon:"close",title:__("Exit"),label:__("Exit"),action(){window.self.close()}}),actions.push({id:"remove",icon:"remove",title:__("Remove the readiness check result?"),action(id){dialog({autoRender:!0,autoDestroy:!0,message:__("The readiness check result will be removed. Continue ?"),onOkBtn(){remove([id])}})}}),model.push({id:"workstation",label:__("Workstation")}),config.requireSchoolName&&model.push({id:"school_name",label:__("School name")}),config.requireSchoolId&&model.push({id:"school_id",label:__("School id")}),config.validateSchoolName&&model.push({id:"school_number",label:__("School number")}),config.testers.fingerprint&&config.testers.fingerprint.enabled&&(model.push({id:"fingerprint-cell",label:__("Fingerprint"),transform(v,row){return fingerprintTpl(row.fingerprint)}}),$list.on("click.fingerprint",".fingerprint-cell span.details",function(e){const id=$(e.target).closest("tr").data("itemIdentifier"),row=_.find(dataset.data,{id:id});row&&dialog({content:detailsTpl(fingerprintTester.getSummary(row.fingerprint)),buttons:"ok",autoRender:!0,autoDestroy:!0})})),config.testers.screen&&config.testers.screen.enabled&&model.push({id:"screen_size",label:__("Screen resolution"),transform(value,row){if(row.screen&&row.screen.width&&row.screen.height)return row.screen.width+"x"+row.screen.height}}),config.testers.browser&&config.testers.browser.enabled&&(model.push({id:"os",label:__("OS")}),model.push({id:"browser",label:__("Browser")})),config.testers.performance&&config.testers.performance.enabled&&model.push({id:"performance",label:__("Performances"),transform(value){const status=performancesTester.getFeedback(value);return status.feedback&&status.feedback.message}}),config.testers.bandwidth&&config.testers.bandwidth.enabled&&model.push({id:"bandwidth",label:__("Bandwidth"),transform:formatBandwidth}),config.testers.intensive_bandwidth&&config.testers.intensive_bandwidth.enabled&&model.push({id:"intensive_bandwidth",label:__("Intensive bandwidth"),transform:formatBandwidth}),config.testers.upload&&config.testers.upload.enabled&&model.push({id:"upload",label:__("Upload speed"),transform:formatBandwidth}),model.push({id:"date",label:__("Date"),transform:transformDateToLocal}),$list.on("query.datatable",()=>loadingBar.start()).on("load.datatable",(e,data)=>{dataset=data,loadingBar.stop()}).datatable({url:serviceUrl,status:{empty:__("No readiness checks have been done!"),available:__("Readiness checks already done"),loading:__("Loading")},selectable:!0,tools,actions,model},dataset)}}}),define("css!taoClientDiagnosticCss/exclusion-list-form",[],function(){}),define("taoClientDiagnostic/controller/ExclusionList/editInstance",["jquery","ui/tooltipster","select2","css!taoClientDiagnosticCss/exclusion-list-form"],function($,tooltipster){"use strict";return{start(){}}}),define("taoClientDiagnostic/controller/routes",{Authenticator:{actions:{login:"controller/Authenticator/login"}},CompatibilityChecker:{actions:{index:"controller/CompatibilityChecker/diagnostics"}},Diagnostic:{actions:{index:"controller/Diagnostic/index",diagnostic:"controller/Diagnostic/diagnostic"}},ExcludedBrowsers:{actions:{editInstance:"controller/ExclusionList/editInstance"}},ExcludedOS:{actions:{editInstance:"controller/ExclusionList/editInstance"}}}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\"Source Sans Pro\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\"Source Sans Pro\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\" - \"}table.datatable .progress .item-time:before{content:\" (\"}table.datatable .progress .item-time .total:before{content:\" / \"}table.datatable .progress .item-time:after{content:\")\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\"Source Sans Pro\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\"Source Sans Pro\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */.exclusion-list-form .xhtml_form input[type=text],.exclusion-list-form .xhtml_form select{width:60%}.exclusion-list-form .xhtml_form .icon-help.tooltipstered{float:right;line-height:25px}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/exclusion-list-form.css.map */"),define("taoClientDiagnostic/loader/taoClientDiagnostic.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoQtiItem/loader/taoQtiItem.min","taoItems/loader/taoItems.min"]); +(function(){"use strict";var loaderScript=document.getElementById("amd-loader"),configUrl=loaderScript.getAttribute("data-config"),bundle=loaderScript.getAttribute("data-bundle"),loadController=function loadController(){var controllerOptions={},controllerPath=loaderScript.getAttribute("data-controller"),params=loaderScript.getAttribute("data-params");try{controllerOptions=JSON.parse(params)}catch(err){controllerOptions={}}window.require([controllerPath],function(controller){var startController=function startController(){window.started||(window.started=!0,controller.start(controllerOptions))};document.addEventListener("readystatechange",startController,!1),"complete"===document.readyState&&startController()})};window.require([configUrl],function(){window.loadBundles||(window.loaded={},window.loadBundles=function loadBundles(bundles){bundles=bundles||[],bundles=bundles.concat(window.bundles),bundles=bundles.filter(function(item,index){return item&&bundles.indexOf(item)===index&&!0!==window.loaded[item]}),require(bundles,function(){bundles.forEach(function(item){window.loaded[item]=!0}),loadController()})}),bundle||window.bundles&&window.bundles.length?window.loadBundles([bundle]):loadController()})})(),define("loader/bootstrap",function(){}),define("taoClientDiagnostic/tools/message",["jquery","ui/feedback"],function($,feedback){"use strict";return function showMessages(container){const $feedbackBox=$(container);$feedbackBox.data("error")&&feedback().error($feedbackBox.data("error")),$feedbackBox.data("message")&&feedback().error($feedbackBox.data("message"))}}),define("taoClientDiagnostic/controller/Authenticator/login",["taoClientDiagnostic/tools/message"],function(showMessage){"use strict";return{start(){showMessage("#feedback-box")}}}),define("tpl!taoClientDiagnostic/component/diagnostic/tpl/component",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="
              \n

              "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Diagnostic Tool",options):helperMissing.call(depth0,"__","Diagnostic Tool",options)))+"

              \n
              ",buffer})}),define("taoClientDiagnostic/component/diagnostic/diagnosticLoader",["lodash","ui/component","core/moduleLoader","context","module","tpl!taoClientDiagnostic/component/diagnostic/tpl/component","layout/loading-bar"],function(_,componentFactory,moduleLoader,context,module,componentTpl,loadingBar){"use strict";return function diagnosticLoaderFactory(container,config){const component=componentFactory().setTemplate(componentTpl).on("init",function onDiagnosticLoaderInit(){this.render(container)}).on("render",function onDiagnosticLoaderRender(){const moduleConfig=module.config(),identifiers=Object.keys(moduleConfig.diagnostics);moduleLoader({},_.isFunction).addList(moduleConfig.diagnostics).load(context.bundle).then(factories=>{const componentConfig=this.getConfig();factories.forEach((factory,index)=>{const factoryName=identifiers[index],factoryConfig=componentConfig[factoryName];factoryConfig.controller=componentConfig.controller,factory(this.getElement(),factoryConfig).on("render",function onRender(){factoryConfig.autoStart&&this.run()}).on("start",()=>loadingBar.start()).on("end",()=>loadingBar.stop())}),this.trigger("ready")})});return _.defer(()=>component.init(config)),component}}),define("taoClientDiagnostic/controller/CompatibilityChecker/diagnostics",["jquery","taoClientDiagnostic/tools/message","taoClientDiagnostic/component/diagnostic/diagnosticLoader"],function($,showMessage,diagnosticFactory){"use strict";return{start:function(config){const $contentArea=$(".content");showMessage("#feedback-box"),diagnosticFactory($contentArea,config)}}}),define("taoClientDiagnostic/tools/fixedDecimals",[],function(){"use strict";return function fixedDecimals(value,decimals){const shift=Math.pow(10,Math.abs(decimals||1));return Math.round(+value*shift)/shift||0}}),define("taoClientDiagnostic/tools/stats",["lodash","taoClientDiagnostic/tools/fixedDecimals"],function(_,fixedDecimals){"use strict";var _Mathfloor=Math.floor,_Mathmax=Math.max,_Mathmin=Math.min;function valueGetter(name){return"function"==typeof name?name:item=>item&&item[name]||0}return function stats(list,fieldName,decimals){var _Mathceil=Math.ceil,_Mathsqrt=Math.sqrt,_NumberMAX_VALUE=Number.MAX_VALUE;const getValue=valueGetter(fieldName),values=[];let min=_NumberMAX_VALUE,max=0,count=0;const sum=_.reduce(list,(sum,item)=>{if("undefined"!=typeof item){const value=getValue(item);return values.push(value),min=_Mathmin(min,value),max=_Mathmax(max,value),sum+=value,count++,sum}},0),average=sum/(count||1),sum2=values.reduce((sum,value)=>{const diff=value-average;return sum+=diff*diff,sum},0),variance=1{results[key]=fixedDecimals(value,decimals)}),results.values=list,results}}),define("taoClientDiagnostic/tools/getConfig",["lodash"],function(_){"use strict";return function getConfig(config,defaults){return _(config||{}).omitBy(value=>null===value||"undefined"==typeof value).defaults(defaults||{}).value()}}),define("taoClientDiagnostic/tools/getLabels",[],function(){"use strict";var _Mathmax2=Math.max,_Mathmin2=Math.min;return function getLabels(messages,level){return messages=messages||{},Array.isArray(messages)||(messages=[messages]),level=_Mathmin2(_Mathmax2(parseInt(level,10)||0,1),messages.length||1)-1,messages[level]||{}}}),define("taoClientDiagnostic/tools/getStatus",["lodash"],function(_){"use strict";var _Mathmax3=Math.max;return function getStatus(percentage,thresholds,opts){const options=opts||{},testPercentage=_Mathmax3(0,Math.min(100,Math.round(parseInt(percentage,10)||0))),globalPercentage=options.minimumGlobalPercentage?_Mathmax3(testPercentage,options.minimumGlobalPercentage):testPercentage,status={percentage:testPercentage,globalPercentage:globalPercentage,quality:{}};if(thresholds){Array.isArray(thresholds)||(thresholds=[thresholds]);let feedback;const len=thresholds.length;for(let i=0;i=step.threshold))feedback=step;else break}feedback&&(status.feedback=_.clone(feedback))}return status}}),define("taoClientDiagnostic/tools/performances/tester",["jquery","lodash","i18n","async","context","helpers","taoClientDiagnostic/tools/stats","taoQtiItem/qtiItem/core/Loader","taoQtiItem/qtiCommonRenderer/renderers/Renderer","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus"],function($,_,__,async,context,helpers,stats,Loader,Renderer,getConfig,getLabels,getStatus){"use strict";var _Mathabs=Math.abs;function loadItem(data,done){const qtiJsonFile=`${data.url}qti.json`,urlTokens=data.url.split("/"),extension=urlTokens[0],fullpath=require.s.contexts._.config.paths[extension],baseUrl=data.url.replace(extension,fullpath),loader=new Loader,renderer=new Renderer({baseUrl:baseUrl});renderer.getAssetManager&&renderer.getAssetManager().setData("baseUrl",baseUrl),require([`json!${qtiJsonFile}`],function(itemData){loader.loadItemData(itemData,function(item){renderer.load(function(){const start=window.performance.now();item.setRenderer(this);const $container=$("
              ").appendTo("body");$container.append(item.render()),item.postRender(),$container.remove();const end=window.performance.now(),duration=(end-start)/_second,result={id:data.id,url:data.url,duration:duration};done(null,result)},this.getLoadedClasses())})})}const _second=1e3,_defaultTimeout=30000,_defaultOccurrencesCount=10,_defaultSamples=["taoClientDiagnostic/tools/performances/data/sample1/","taoClientDiagnostic/tools/performances/data/sample2/","taoClientDiagnostic/tools/performances/data/sample3/"],_defaults={id:"performances",optimal:.025,threshold:.25},_thresholds=[{threshold:0,message:__("Very slow performances"),type:"error"},{threshold:33,message:__("Average performances"),type:"warning"},{threshold:66,message:__("Good performances"),type:"success"}],_messages=[{title:__("Workstation performances"),status:__("Checking the performances..."),performancesMin:__("Minimum rendering time"),performancesMax:__("Maximum rendering time"),performancesAverage:__("Average rendering time")}],_sampleBaseId="sample";return function performancesTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);let idx=0;const _samples=_.map(!_.isEmpty(initConfig.samples)&&initConfig.samples||_defaultSamples,sample=>(idx++,{id:_sampleBaseId+idx,url:sample,timeout:1e3*initConfig.timeout||_defaultTimeout,nb:initConfig.occurrences||_defaultOccurrencesCount}));return _samples[0].nb++,{start(done){const tests=[];_.forEach(_samples,data=>{const cb=_.partial(loadItem,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),async.series(tests,(err,measures)=>{const decimals=2;if(err&&!measures.length)throw err;measures.shift();const results=stats(measures,"duration",2),status=this.getFeedback(results.average),summary=this.getSummary(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{performancesMin:{message:labels.performancesMin,value:`${results.min} s`},performancesMax:{message:labels.performancesMax,value:`${results.max} s`},performancesAverage:{message:labels.performancesAverage,value:`${results.average} s`}}},getFeedback(result){const optimal=initConfig.optimal,range=_Mathabs(optimal-initConfig.threshold),status=getStatus(100*((range+optimal-result)/range),_thresholds);return status.title=labels.title,status.id=initConfig.id,status}}}}),define("taoClientDiagnostic/tools/bandwidth/tester",["lodash","i18n","async","context","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/stats","taoClientDiagnostic/tools/fixedDecimals","taoClientDiagnostic/tools/getStatus"],function(_,__,async,context,getConfig,getLabels,stats,fixedDecimals,getStatus){"use strict";var _Mathfloor2=Math.floor,_Mathmax4=Math.max;function download(data,cb){if(data.threshold&&this.bandwidth{const end=window.performance.now();clearTimeout(timeoutId);const duration=end-start,bytes=data.size,seconds=duration/_second,speed=8*bytes/seconds/_mega;return this.bandwidth=_Mathmax4(this.bandwidth,speed),cb(null,{id:data.id,file:data.file,size:data.size,duration,speed})},request.onerror=err=>{clearTimeout(timeoutId),cb(err)},request.onreadystatechange=()=>{4===request.readyState&&200!==request.status&&(clearTimeout(timeoutId),cb(request.status))},request.send()}const _kilo=1024,_mega=1048576,_second=1e3,_thresholds=[{threshold:0,message:__("Low bandwidth"),type:"error"},{threshold:33,message:__("Average bandwidth"),type:"warning"},{threshold:66,message:__("Good bandwidth"),type:"success"}],_defaults={id:"bandwidth",unit:.16,ideal:45,max:100,minimumGlobalPercentage:!1,feedbackThresholds:_thresholds,fallbackThreshold:.2},_downloadData={"10KB":{id:"10KB",file:"data/bin10KB.data",size:10240,timeout:_second,threshold:0,nb:10},"100KB":{id:"100KB",file:"data/bin100KB.data",size:102400,timeout:2*_second,threshold:0,nb:5},"1MB":{id:"1MB",file:"data/bin1MB.data",size:_mega,timeout:20*_second,threshold:0,nb:3}},_messages=[{title:__("Bandwidth"),status:__("Checking the bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle"),bandwidthMin:__("Minimum bandwidth"),bandwidthMax:__("Maximum bandwidth"),bandwidthAverage:__("Average bandwidth")},{title:__("Media intensive bandwidth"),status:__("Checking the media intensive bandwidth..."),legend:__("Number of simultaneous test takers the connection can handle with media intensive"),bandwidthMin:__("Minimum intensive bandwidth"),bandwidthMax:__("Maximum intensive bandwidth"),bandwidthAverage:__("Average intensive bandwidth")}];return function bandwidthTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return _.isArray(initConfig.feedbackThresholds)&&!initConfig.feedbackThresholds.length&&(initConfig.feedbackThresholds=_thresholds),{start(done){const tests=[];_.forEach(_downloadData,data=>{const cb=download.bind(this,data);for(let iterations=data.nb||1;iterations--;)tests.push(cb)}),this.bandwidth=0,async.series(tests,(err,measures)=>{function getValue(value){let speed=0;return value&&(duration+=value.duration,size+=value.size,speed=value.speed,value.speed=fixedDecimals(speed,decimals)),speed}let duration=0,size=0;const decimals=2,resultsBySize={};if(err&&!measures.length)throw err;const results=stats(measures,getValue,2);_.forEach(_downloadData,(data,key)=>{resultsBySize[key]=stats(_.filter(measures,o=>o.id===key),getValue,decimals)}),results.duration=fixedDecimals(duration/_second,2),results.size=size;const summary=this.getSummary(results),status=this.getFeedback(results,resultsBySize);done(status,summary,results)})},get labels(){return labels},getSummary(results){return{bandwidthMin:{message:labels.bandwidthMin,value:results.min+" Mbps"},bandwidthMax:{message:labels.bandwidthMax,value:results.max+" Mbps"},bandwidthAverage:{message:labels.bandwidthAverage,value:results.average+" Mbps"}}},getFeedback(result,resultsBySize){const avgResult=result.average,bandwidthUnit=initConfig.unit,threshold=initConfig.ideal,maxTestTakers=initConfig.max,max=threshold*bandwidthUnit,getStatusOptions=initConfig.minimumGlobalPercentage?{minimumGlobalPercentage:initConfig.minimumGlobalPercentage}:{},baseBandwidth=avgResult;let stable=!0;_.forEach(resultsBySize,resultBySize=>{resultBySize.min/resultBySize.averagemaxTestTakers&&(nb=">"+maxTestTakers),status.id=initConfig.id,status.title=labels.title,status.feedback.legend=labels.legend,status.quality.label=nb,stable||(status.feedback.type="warning",status.feedback.message=__("Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience."),status.feedback.legend=__("Simultaneous test takers under normal connection conditions.")),2{const xhr=new window.XMLHttpRequest,startTime=Date.now();return xhr.upload.addEventListener("progress",evt=>{if(evt.lengthComputable){const passedTime=Date.now()-startTime;data.push({time:passedTime,loaded:evt.loaded,speed:8*evt.loaded/_mega/(passedTime/1e3)})}},!1),xhr}})}const _kilo=1024,_mega=1048576;let data=[];const _defaults={id:"upload",size:_mega,optimal:_mega},_thresholds=[{threshold:0,message:__("Low upload speed"),type:"error"},{threshold:33,message:__("Average upload speed"),type:"warning"},{threshold:66,message:__("Good upload speed"),type:"success"}],_messages=[{title:__("Upload speed"),status:__("Checking upload speed..."),uploadAvg:__("Average upload speed"),uploadMax:__("Max upload speed")}];return function uploadTester(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){upload(parseInt(initConfig.size,10)).then(()=>{let totalSpeed=0,maxSpeed=0;_.forEach(data,val=>{totalSpeed+=val.speed,maxSpeedlist.some(entry=>{const{browser,device,os,versions}=entry;return!(currentDevice!==device)&&!(os&&os.toLowerCase()!==currentOS)&&!(browser.toLowerCase()!==currentBrowser)&&_(versions).map(version=>version.split("-")).flatten().value().some(version=>0<=currentVersion.localeCompare(version,void 0,{numeric:!0}))},{}))}const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level),fetchBrowserList=()=>request({url:initConfig.browserslistUrl,noToken:!0}).catch(()=>[]);return{start(done){getPlatformInfo(window,initConfig).catch(err=>(logger.error(err),{browser:unknown,browserVersion:"",os:unknown,osVersion:"",isMobile:!1})).then(platformInfo=>checkBrowserSupport(platformInfo).then(browserSupported=>Object.assign(platformInfo,{browserSupported}))).then(platformInfo=>{request({url:urlHelper.route(initConfig.action,initConfig.controller,initConfig.extension),data:platformInfo,method:"POST",noToken:!0}).catch(()=>({success:!1,type:"error",message:__("Unable to validate the data as the server did not respond in time.")})).then(data=>{const percentage="success"===data.type?100:"warning"===data.type?33:0,status=this.getFeedback(percentage,data),summary=this.getSummary(platformInfo);status.customMsgRenderer=customMsg=>(customMsg||"").replace(_placeHolders.CURRENT_BROWSER,summary.browser.value).replace(_placeHolders.CURRENT_OS,summary.os.value),done(status,summary,platformInfo)})})},get labels(){return labels},getSummary(results){const currentBrowser=`${results.browser} ${results.browserVersion}`,currentOs=`${results.os} ${results.osVersion}`;return{browser:{message:labels.browser,value:currentBrowser},os:{message:labels.os,value:currentOs}}},getFeedback(result,data){const status=getStatus(result,data);return status.id=initConfig.id,status.title=labels.title,status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="

              ",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

              ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="

              ",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

              ",buffer}function program5(depth0,data){var stack1,helper,buffer="";return buffer+="

              ",(helper=helpers.setup)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.setup,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

              ",buffer}function program7(depth0,data){var helper,options,buffer="";return buffer+="\n

              \n \n \n

              \n

              \n \n \n

              \n ",buffer}function program9(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(12,program12,data),fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program10(depth0,data){var helper,options,buffer="";return buffer+="\n

              \n \n \n

              \n

              \n \n \n

              \n ",buffer}function program12(depth0,data){var helper,options,buffer="";return buffer+="\n

              \n \n \n

              \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
              \n\n

              ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

              \n\n
              \n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.setup,{hash:{},inverse:self.noop,fn:self.program(5,program5,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(7,program7,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(9,program9,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
              \n\n
              \n \n
              \n\n
                \n\n
                \n

                \n
                \n\n
                ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/result",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var helper,options,buffer="";return buffer+="\n
                \n \n \n
                \n
                \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,functionType="function",self=this;return buffer+="
              • \n

                ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

                \n
                \n\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.details,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
              • ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/details",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,helperMissing=helpers.helperMissing,self=this;return buffer+="
                \n

                "+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Details",options):helperMissing.call(depth0,"__","Details",options)))+"

                \n
                \n \n \n ",stack1=helpers.each.call(depth0,depth0,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n
                \n
                \n
                ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="
                ",(helper=helpers.legend)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.legend,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
                ",buffer}function program3(depth0,data){var stack1,helper,buffer="";return buffer+="
                ",(helper=helpers.customMsg)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.customMsg,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"
                ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
                \n \n ",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.legend,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.customMsg,{hash:{},inverse:self.noop,fn:self.program(3,program3,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n
                ",buffer})}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){return" wide"}function program3(depth0,data){var stack1,helper,buffer="";return buffer+=" title=\"",(helper=helpers.label)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.label,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"\"",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this;return buffer+="
                \n
                \n
                ",buffer})}),define("css!taoClientDiagnosticCss/diagnostics",[],function(){}),define("taoClientDiagnostic/tools/diagnostic/diagnostic",["jquery","lodash","i18n","async","ui/component","core/logger","core/store","core/request","core/dataProvider/request","ui/dialog/alert","ui/feedback","util/url","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/bandwidth/tester","taoClientDiagnostic/tools/upload/tester","taoClientDiagnostic/tools/browser/tester","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/getConfig","tpl!taoClientDiagnostic/tools/diagnostic/tpl/main","tpl!taoClientDiagnostic/tools/diagnostic/tpl/result","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","css!taoClientDiagnosticCss/diagnostics"],function($,_,__,async,component,loggerFactory,store,request,requestData,dialogAlert,feedback,urlHelper,performancesTester,bandwidthTester,uploadTester,browserTester,getStatus,getConfig,mainTpl,resultTpl,detailsTpl,feedbackTpl,qualityBarTpl){"use strict";const logger=loggerFactory("taoClientDiagnostic/diagnostic"),_defaults={title:__("System Compatibility"),header:__("This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform."),info:__("Be aware that these tests will take up to several minutes."),button:__("Test system compatibility"),actionStore:"storeData",actionSchool:"schoolName",controller:"DiagnosticChecker",extension:"taoClientDiagnostic",actionDropId:"deleteId",storeAllRuns:!1,configurableText:{}},_thresholds=[{threshold:0,message:__("Your system requires a compatibility update, please contact your system administrator."),type:"error"},{threshold:33,message:__("Your system is not optimal, please contact your system administrator."),type:"warning"},{threshold:66,message:__("Your system is fully compliant."),type:"success"}],diagnostic={changeStatus(status){return this.is("rendered")&&this.controls.$status.html(status),this},store(type,data,done){const config=this.config,url=urlHelper.route(config.actionStore,config.controller,config.extension,config.storeParams);data=_.omit(data,"values"),data.type=type,request({url,data,method:"POST",noToken:!0}).then(done).catch(err=>{logger.error(err),feedback().error(__("Unable to save the results! Please check your connection.")),done()})},getCustomMsg(key){return this.config.configurableText[key]},addCustomFeedbackMsg(status,msg){this.hasFailed(status)&&msg&&(_.isFunction(status.customMsgRenderer)&&(msg=status.customMsgRenderer(msg)),status.feedback=status.feedback||{},status.feedback.customMsg=msg)},hasFailed(result){return!(result&&result.feedback&&"success"===result.feedback.type)},addResult(result){if(this.is("rendered")){result.quality&&result.quality.label&&2{$indicator.length&&$indicator.animate({left:result.percentage*$main.outerWidth()/100-$indicator.outerWidth()/2})})}return this},cleanUp(){return this.controls.$results.empty(),this},enable(){return this.controls.$start.removeClass("hidden"),this},disable(){return this.controls.$start.addClass("hidden"),this},prepare(){return this.trigger("start"),this.changeStatus(__("Starting...")),this.setState("running",!0),this.setState("done",!1),this.cleanUp(),this.disable(),this},finish(){const config=this.config;return this.enable(),config.storeAllRuns&&this.deleteIdentifier(),this.trigger("end"),this.changeStatus(__("Done!")),this.setState("running",!1),this.setState("done",!0),this},deleteIdentifier(){const url=urlHelper.route(this.config.actionDropId,this.config.controller,this.config.extension);return request({url,method:"POST",noToken:!0})},run(){const information=[],scores={},testers=[],customInput=this.getCustomInput(),doRun=()=>{const doCheck=(testerConfig,cb)=>{const testerId=testerConfig.id;this.trigger("starttester",testerId),this.setState(testerId,!0);const processTester=testerFactory=>{const tester=testerFactory(getConfig(testerConfig,this.config),this);this.changeStatus(tester.labels.status),tester.start((status,details,results)=>{if(testerConfig.customMsgKey){const customMsg=this.getCustomMsg(testerConfig.customMsgKey);this.addCustomFeedbackMsg(status,customMsg)}_.forEach(details,info=>information.push(info)),scores[status.id]=status,this.trigger("endtester",testerId,status),this.setState(testerId,!1),results=_.mapValues(results,value=>{switch(typeof value){case"boolean":return value?1:0;case"object":return JSON.stringify(value)}return value}),this.store(testerId,results,()=>{this.addResult(status),cb()})})},processFailure=err=>{logger.error(err),feedback().error(__("Unable to process with the diagnostic tester %s. The tester module is unreachable.",testerId)),cb()};require([testerConfig.tester],processTester,processFailure)};this.is("rendered")&&(this.prepare(),_.forEach(this.config.testers,(testerConfig,testerId)=>{testerConfig.id=testerConfig.id||testerId,testerConfig.enabled&&testers.push(cb=>doCheck(testerConfig,cb))}),async.series(testers,()=>{const total=_.minBy(scores,"globalPercentage"),status=getStatus(total.globalPercentage,_thresholds);status.title=__("Total"),status.id="total",this.addCustomFeedbackMsg(status,this.config.configurableText.diagTotalCheckResult),status.details=information,this.addResult(status),this.finish()}))};return 0<_.size(customInput)?this.store("custom_input",customInput,doRun):doRun(),this},getCustomInput(){const vars={};return window.location.href.replace(location.hash,"").replace(/[?&]+([^=&]+)=?([^&]*)?/gi,(m,key,value)=>{_.has(this.config.customInput,key)&&(vars[key]="undefined"==typeof value?"":value)}),vars}};return function diagnosticFactory(container,config){config&&_.forEach(["title","header","footer","info","button"],name=>{config[name]&&(config[name]=__(config[name]))});const diagComponent=component(diagnostic,_defaults).setTemplate(mainTpl).on("destroy",function onDiagnosticDestroy(){this.controls=null}).on("init",function onDiagnosticInit(){this.render(container)}).on("render",function onDiagnosticRender(){function getInputValue(name){const $control=getControl(name);return($control&&$control.val()||"").trim()}function setInputValue(name,value){const $control=getControl(name);$control&&$control.val(value)}function toggleControl(name,state){const $control=getControl(name);$control&&("undefined"==typeof state&&(state=!$control.is(":enabled")),state?$control.prop("disabled",!1):$control.prop("disabled",!0))}const runDiagnostics=data=>{data&&_.isPlainObject(data)&&(this.config.storeParams=_.assign(this.config.storeParams||{},data)),this.run()};let launch=()=>runDiagnostics();const getControl=name=>this.controls[`\$${name}`],requestSchoolName=values=>{const componentConfig=this.config;return requestData(urlHelper.route(componentConfig.actionSchool,componentConfig.controller,componentConfig.extension),values,"POST").then(data=>({school_name:data,school_number:values.school_number}))},manageSchoolProperties=(fields,validate)=>{function toggleStart(){const allow=_.every(fields,getInputValue);return toggleControl("start",allow),allow}function toggleFields(state){_.forEach(fields,function(fieldName){toggleControl(fieldName,state)})}_.forEach(fields,fieldName=>{this.controls[`\$${fieldName}`]=this.getElement().find(`[data-control="${fieldName}"]`).on("keypress",e=>{const shouldStart=13===e.which;shouldStart&&e.preventDefault(),_.defer(()=>{toggleStart()&&shouldStart&&this.controls.$start.click()})})}),toggleStart(),toggleFields(!1),store("client-diagnostic").then(storage=>(this.on("start.school",()=>{_.forEach(fields,fieldName=>{storage.setItem(fieldName,getInputValue(fieldName)).catch(error=>{logger.error(error)})})}),Promise.all(_.map(fields,fieldName=>storage.getItem(fieldName).then(value=>{setInputValue(fieldName,value)}))))).catch(error=>{logger.error(error)}).then(()=>{toggleFields(!0),toggleStart()}),launch=()=>{const values=_.reduce(fields,(result,fieldName)=>(result[fieldName]=getInputValue(fieldName),result),{});this.changeStatus(__("Getting school name...")).cleanUp().disable(),_.isFunction(validate)?validate(values).then(runDiagnostics).catch(error=>{const response=error.response||{},message=response.errorMsg||response.errorMessage||__("An error occurred! Please verify your input!");dialogAlert(message),logger.error(error),this.changeStatus(__("Failed to get school name")).enable()}):runDiagnostics(values)},this.on("start.school",()=>{toggleFields(!1)}).on("end.school",()=>{toggleFields(!0)})};this.controls={$start:this.$component.find("[data-action=\"test-launcher\"]"),$status:this.$component.find(".status h2"),$results:this.$component.find(".results")},this.controls.$start.on("click",()=>{this.controls.$start.is(":enabled")&&launch()}),this.config.requireSchoolName&&(this.config.validateSchoolName?manageSchoolProperties(["school_number","school_pin"],requestSchoolName):manageSchoolProperties(["school_name"])),this.config.requireSchoolId&&manageSchoolProperties(["school_id","workstation"]),this.controls.$results.on("click","button[data-action=\"show-details\"]",function onShowDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.removeClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"hide-details\"]").removeClass("hidden")}),this.controls.$results.on("click","button[data-action=\"hide-details\"]",function onHideDetails(){const $btn=$(this).closest("button"),$result=$btn.closest("[data-result]"),$details=$result.find(".details");$details.addClass("hidden"),$btn.addClass("hidden"),$result.find("[data-action=\"show-details\"]").removeClass("hidden")})});return _.defer(()=>diagComponent.init(config)),diagComponent}}),define("tpl!taoClientDiagnostic/templates/diagnostic/main",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.diagInstructions,{hash:{},inverse:self.noop,fn:self.program(2,program2,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program2(depth0,data){var stack1,helper,buffer="";return buffer+="

                ",(helper=helpers.diagInstructions)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.diagInstructions,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

                ",buffer}function program4(depth0,data){var stack1,helper,buffer="";return buffer+="

                ",(helper=helpers.header)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.header,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

                ",buffer}function program6(depth0,data){var stack1,helper,buffer="";return buffer+="

                ",(helper=helpers.info)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.info,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

                ",buffer}function program8(depth0,data){var helper,options,buffer="";return buffer+="\n

                \n \n \n

                \n ",buffer}function program10(depth0,data){var stack1,buffer="";return buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.validateSchoolName,{hash:{},inverse:self.program(13,program13,data),fn:self.program(11,program11,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",buffer}function program11(depth0,data){var helper,options,buffer="";return buffer+="\n

                \n \n \n

                \n

                \n \n \n

                \n ",buffer}function program13(depth0,data){var helper,options,buffer="";return buffer+="\n

                \n \n \n

                \n ",buffer}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,options,buffer="",functionType="function",escapeExpression=this.escapeExpression,self=this,helperMissing=helpers.helperMissing;return buffer+="
                \n\n

                ",(helper=helpers.title)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.title,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"

                \n\n
                \n ",stack1=helpers["with"].call(depth0,depth0&&depth0.configurableText,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.header,{hash:{},inverse:self.noop,fn:self.program(4,program4,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.info,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolId,{hash:{},inverse:self.noop,fn:self.program(8,program8,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n ",stack1=helpers["if"].call(depth0,depth0&&depth0.requireSchoolName,{hash:{},inverse:self.noop,fn:self.program(10,program10,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n

                \n \n \n

                \n
                \n\n
                \n \n
                \n\n
                  \n\n
                  \n

                  \n
                  \n\n
                  ",buffer})}),define("taoClientDiagnostic/controller/Diagnostic/diagnostic",["module","jquery","i18n","helpers","core/request","layout/loading-bar","ui/actionbar","ui/feedback","taoClientDiagnostic/tools/diagnostic/diagnostic","tpl!taoClientDiagnostic/templates/diagnostic/main"],function(module,$,__,helpers,request,loadingBar,actionbar,feedback,diagnosticFactory,diagnosticTpl){"use strict";const cssScope=".diagnostic-runner";return loadingBar.start(),{start(){function installTester(workstation){diagnosticFactory($list,config).setTemplate(diagnosticTpl).on("render",function onDiagnosticRender(){this.controls.$workstation=this.getElement().find("[data-control=\"workstation\"]").on("keypress",e=>{13===e.which&&(e.preventDefault(),this.run())}).val(workstation),loadingBar.stop(),config.autoStart&&this.run()}).on("start",function onDiagnosticStart(){this.config.storeParams=this.config.storeParams||{},this.config.storeParams.workstation=this.controls.$workstation.val(),this.controls.$workstation.prop("disabled",!0),loadingBar.start()}).on("end",function onDiagnosticEnd(){this.controls.$workstation.prop("disabled",!1),loadingBar.stop()})}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",$list=$container.find(".list"),$panel=$(".panel"),extensionConfig=$container.data("config")||{},config=extensionConfig.diagnostic||extensionConfig,indexUrl=helpers._url("index","Diagnostic",extension),buttons=[],moduleConfig=module.config()||{};config.configurableText=moduleConfig.configurableText||{},buttons.push({id:"back",icon:"step-backward",title:__("Return to the list"),label:__("List of readiness checks"),action(){window.location.href=indexUrl}}),window.self===window.top&&buttons.push({id:"exitButton",icon:"close",title:__("Exit"),label:__("Exit"),action(){window.self.close()}}),actionbar({renderTo:$panel,buttons});const url=helpers._url("workstation","DiagnosticChecker",extension);request({url,noToken:!0}).then(data=>installTester(data&&data.workstation)).catch(()=>{feedback().error(__("Unable to get the workstation name!")),installTester()})}}}),!function(e,t,i){"use strict";"function"==typeof define&&define.amd?define("taoClientDiagnostic/lib/fingerprint/fingerprint2",i):"undefined"!=typeof module&&module.exports?module.exports=i():t.exports?t.exports=i():t[e]=i()}("Fingerprint2",this,function(){"use strict";var e=function(t){if(!(this instanceof e))return new e(t);var i={swfContainerId:"fingerprintjs2",swfPath:"flash/compiled/FontList.swf",detectScreenOrientation:!0,sortPluginsFor:[/palemoon/i],userDefinedFonts:[]};this.options=this.extend(t,i),this.nativeForEach=Array.prototype.forEach,this.nativeMap=Array.prototype.map};return e.prototype={extend:function(e,t){if(null==e)return t;for(var i in e)null!=e[i]&&t[i]!==e[i]&&(t[i]=e[i]);return t},get:function(e){var t=this,i={data:[],push:function(e){var i=e.key,a=e.value;"function"==typeof t.options.preprocessor&&(a=t.options.preprocessor(i,a)),this.data.push({key:i,value:a})}};i=this.userAgentKey(i),i=this.languageKey(i),i=this.colorDepthKey(i),i=this.pixelRatioKey(i),i=this.hardwareConcurrencyKey(i),i=this.screenResolutionKey(i),i=this.availableScreenResolutionKey(i),i=this.timezoneOffsetKey(i),i=this.sessionStorageKey(i),i=this.localStorageKey(i),i=this.indexedDbKey(i),i=this.addBehaviorKey(i),i=this.openDatabaseKey(i),i=this.cpuClassKey(i),i=this.platformKey(i),i=this.doNotTrackKey(i),i=this.pluginsKey(i),i=this.canvasKey(i),i=this.webglKey(i),i=this.adBlockKey(i),i=this.hasLiedLanguagesKey(i),i=this.hasLiedResolutionKey(i),i=this.hasLiedOsKey(i),i=this.hasLiedBrowserKey(i),i=this.touchSupportKey(i),i=this.customEntropyFunction(i),this.fontsKey(i,function(i){var a=[];t.each(i.data,function(e){var t=e.value;"undefined"!=typeof e.value.join&&(t=e.value.join(";")),a.push(t)});var r=t.x64hash128(a.join("~~~"),31);return e(r,i.data)})},customEntropyFunction:function(e){return"function"==typeof this.options.customFunction&&e.push({key:"custom",value:this.options.customFunction()}),e},userAgentKey:function(e){return this.options.excludeUserAgent||e.push({key:"user_agent",value:this.getUserAgent()}),e},getUserAgent:function(){return navigator.userAgent},languageKey:function(e){return this.options.excludeLanguage||e.push({key:"language",value:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||""}),e},colorDepthKey:function(e){return this.options.excludeColorDepth||e.push({key:"color_depth",value:screen.colorDepth||-1}),e},pixelRatioKey:function(e){return this.options.excludePixelRatio||e.push({key:"pixel_ratio",value:this.getPixelRatio()}),e},getPixelRatio:function(){return window.devicePixelRatio||""},screenResolutionKey:function(e){return this.options.excludeScreenResolution?e:this.getScreenResolution(e)},getScreenResolution:function(e){var t;return t=this.options.detectScreenOrientation&&screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height],"undefined"!=typeof t&&e.push({key:"resolution",value:t}),e},availableScreenResolutionKey:function(e){return this.options.excludeAvailableScreenResolution?e:this.getAvailableScreenResolution(e)},getAvailableScreenResolution:function(e){var t;return screen.availWidth&&screen.availHeight&&(t=this.options.detectScreenOrientation?screen.availHeight>screen.availWidth?[screen.availHeight,screen.availWidth]:[screen.availWidth,screen.availHeight]:[screen.availHeight,screen.availWidth]),"undefined"!=typeof t&&e.push({key:"available_resolution",value:t}),e},timezoneOffsetKey:function(e){return this.options.excludeTimezoneOffset||e.push({key:"timezone_offset",value:new Date().getTimezoneOffset()}),e},sessionStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasSessionStorage()&&e.push({key:"session_storage",value:1}),e},localStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasLocalStorage()&&e.push({key:"local_storage",value:1}),e},indexedDbKey:function(e){return!this.options.excludeIndexedDB&&this.hasIndexedDB()&&e.push({key:"indexed_db",value:1}),e},addBehaviorKey:function(e){return document.body&&!this.options.excludeAddBehavior&&document.body.addBehavior&&e.push({key:"add_behavior",value:1}),e},openDatabaseKey:function(e){return!this.options.excludeOpenDatabase&&window.openDatabase&&e.push({key:"open_database",value:1}),e},cpuClassKey:function(e){return this.options.excludeCpuClass||e.push({key:"cpu_class",value:this.getNavigatorCpuClass()}),e},platformKey:function(e){return this.options.excludePlatform||e.push({key:"navigator_platform",value:this.getNavigatorPlatform()}),e},doNotTrackKey:function(e){return this.options.excludeDoNotTrack||e.push({key:"do_not_track",value:this.getDoNotTrack()}),e},canvasKey:function(e){return!this.options.excludeCanvas&&this.isCanvasSupported()&&e.push({key:"canvas",value:this.getCanvasFp()}),e},webglKey:function(e){return this.options.excludeWebGL?e:this.isWebGlSupported()?(e.push({key:"webgl",value:this.getWebglFp()}),e):e},adBlockKey:function(e){return this.options.excludeAdBlock||e.push({key:"adblock",value:this.getAdBlock()}),e},hasLiedLanguagesKey:function(e){return this.options.excludeHasLiedLanguages||e.push({key:"has_lied_languages",value:this.getHasLiedLanguages()}),e},hasLiedResolutionKey:function(e){return this.options.excludeHasLiedResolution||e.push({key:"has_lied_resolution",value:this.getHasLiedResolution()}),e},hasLiedOsKey:function(e){return this.options.excludeHasLiedOs||e.push({key:"has_lied_os",value:this.getHasLiedOs()}),e},hasLiedBrowserKey:function(e){return this.options.excludeHasLiedBrowser||e.push({key:"has_lied_browser",value:this.getHasLiedBrowser()}),e},fontsKey:function(e,t){return this.options.excludeJsFonts?this.flashFontsKey(e,t):this.jsFontsKey(e,t)},flashFontsKey:function(e,t){return this.options.excludeFlashFonts?t(e):this.hasSwfObjectLoaded()&&this.hasMinFlashInstalled()?"undefined"==typeof this.options.swfPath?t(e):void this.loadSwfAndDetectFonts(function(i){e.push({key:"swf_fonts",value:i.join(";")}),t(e)}):t(e)},jsFontsKey:function(e,t){var i=this;return setTimeout(function(){var a=["monospace","sans-serif","serif"],r=["Andale Mono","Arial","Arial Black","Arial Hebrew","Arial MT","Arial Narrow","Arial Rounded MT Bold","Arial Unicode MS","Bitstream Vera Sans Mono","Book Antiqua","Bookman Old Style","Calibri","Cambria","Cambria Math","Century","Century Gothic","Century Schoolbook","Comic Sans","Comic Sans MS","Consolas","Courier","Courier New","Garamond","Geneva","Georgia","Helvetica","Helvetica Neue","Impact","Lucida Bright","Lucida Calligraphy","Lucida Console","Lucida Fax","LUCIDA GRANDE","Lucida Handwriting","Lucida Sans","Lucida Sans Typewriter","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Monotype Corsiva","MS Gothic","MS Outlook","MS PGothic","MS Reference Sans Serif","MS Sans Serif","MS Serif","MYRIAD","MYRIAD PRO","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Segoe UI Light","Segoe UI Semibold","Segoe UI Symbol","Tahoma","Times","Times New Roman","Times New Roman PS","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3"],n=["Abadi MT Condensed Light","Academy Engraved LET","ADOBE CASLON PRO","Adobe Garamond","ADOBE GARAMOND PRO","Agency FB","Aharoni","Albertus Extra Bold","Albertus Medium","Algerian","Amazone BT","American Typewriter","American Typewriter Condensed","AmerType Md BT","Andalus","Angsana New","AngsanaUPC","Antique Olive","Aparajita","Apple Chancery","Apple Color Emoji","Apple SD Gothic Neo","Arabic Typesetting","ARCHER","ARNO PRO","Arrus BT","Aurora Cn BT","AvantGarde Bk BT","AvantGarde Md BT","AVENIR","Ayuthaya","Bandy","Bangla Sangam MN","Bank Gothic","BankGothic Md BT","Baskerville","Baskerville Old Face","Batang","BatangChe","Bauer Bodoni","Bauhaus 93","Bazooka","Bell MT","Bembo","Benguiat Bk BT","Berlin Sans FB","Berlin Sans FB Demi","Bernard MT Condensed","BernhardFashion BT","BernhardMod BT","Big Caslon","BinnerD","Blackadder ITC","BlairMdITC TT","Bodoni 72","Bodoni 72 Oldstyle","Bodoni 72 Smallcaps","Bodoni MT","Bodoni MT Black","Bodoni MT Condensed","Bodoni MT Poster Compressed","Bookshelf Symbol 7","Boulder","Bradley Hand","Bradley Hand ITC","Bremen Bd BT","Britannic Bold","Broadway","Browallia New","BrowalliaUPC","Brush Script MT","Californian FB","Calisto MT","Calligrapher","Candara","CaslonOpnface BT","Castellar","Centaur","Cezanne","CG Omega","CG Times","Chalkboard","Chalkboard SE","Chalkduster","Charlesworth","Charter Bd BT","Charter BT","Chaucer","ChelthmITC Bk BT","Chiller","Clarendon","Clarendon Condensed","CloisterBlack BT","Cochin","Colonna MT","Constantia","Cooper Black","Copperplate","Copperplate Gothic","Copperplate Gothic Bold","Copperplate Gothic Light","CopperplGoth Bd BT","Corbel","Cordia New","CordiaUPC","Cornerstone","Coronet","Cuckoo","Curlz MT","DaunPenh","Dauphin","David","DB LCD Temp","DELICIOUS","Denmark","DFKai-SB","Didot","DilleniaUPC","DIN","DokChampa","Dotum","DotumChe","Ebrima","Edwardian Script ITC","Elephant","English 111 Vivace BT","Engravers MT","EngraversGothic BT","Eras Bold ITC","Eras Demi ITC","Eras Light ITC","Eras Medium ITC","EucrosiaUPC","Euphemia","Euphemia UCAS","EUROSTILE","Exotc350 Bd BT","FangSong","Felix Titling","Fixedsys","FONTIN","Footlight MT Light","Forte","FrankRuehl","Fransiscan","Freefrm721 Blk BT","FreesiaUPC","Freestyle Script","French Script MT","FrnkGothITC Bk BT","Fruitger","FRUTIGER","Futura","Futura Bk BT","Futura Lt BT","Futura Md BT","Futura ZBlk BT","FuturaBlack BT","Gabriola","Galliard BT","Gautami","Geeza Pro","Geometr231 BT","Geometr231 Hv BT","Geometr231 Lt BT","GeoSlab 703 Lt BT","GeoSlab 703 XBd BT","Gigi","Gill Sans","Gill Sans MT","Gill Sans MT Condensed","Gill Sans MT Ext Condensed Bold","Gill Sans Ultra Bold","Gill Sans Ultra Bold Condensed","Gisha","Gloucester MT Extra Condensed","GOTHAM","GOTHAM BOLD","Goudy Old Style","Goudy Stout","GoudyHandtooled BT","GoudyOLSt BT","Gujarati Sangam MN","Gulim","GulimChe","Gungsuh","GungsuhChe","Gurmukhi MN","Haettenschweiler","Harlow Solid Italic","Harrington","Heather","Heiti SC","Heiti TC","HELV","Herald","High Tower Text","Hiragino Kaku Gothic ProN","Hiragino Mincho ProN","Hoefler Text","Humanst 521 Cn BT","Humanst521 BT","Humanst521 Lt BT","Imprint MT Shadow","Incised901 Bd BT","Incised901 BT","Incised901 Lt BT","INCONSOLATA","Informal Roman","Informal011 BT","INTERSTATE","IrisUPC","Iskoola Pota","JasmineUPC","Jazz LET","Jenson","Jester","Jokerman","Juice ITC","Kabel Bk BT","Kabel Ult BT","Kailasa","KaiTi","Kalinga","Kannada Sangam MN","Kartika","Kaufmann Bd BT","Kaufmann BT","Khmer UI","KodchiangUPC","Kokila","Korinna BT","Kristen ITC","Krungthep","Kunstler Script","Lao UI","Latha","Leelawadee","Letter Gothic","Levenim MT","LilyUPC","Lithograph","Lithograph Light","Long Island","Lydian BT","Magneto","Maiandra GD","Malayalam Sangam MN","Malgun Gothic","Mangal","Marigold","Marion","Marker Felt","Market","Marlett","Matisse ITC","Matura MT Script Capitals","Meiryo","Meiryo UI","Microsoft Himalaya","Microsoft JhengHei","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Uighur","Microsoft YaHei","Microsoft Yi Baiti","MingLiU","MingLiU_HKSCS","MingLiU_HKSCS-ExtB","MingLiU-ExtB","Minion","Minion Pro","Miriam","Miriam Fixed","Mistral","Modern","Modern No. 20","Mona Lisa Solid ITC TT","Mongolian Baiti","MONO","MoolBoran","Mrs Eaves","MS LineDraw","MS Mincho","MS PMincho","MS Reference Specialty","MS UI Gothic","MT Extra","MUSEO","MV Boli","Nadeem","Narkisim","NEVIS","News Gothic","News GothicMT","NewsGoth BT","Niagara Engraved","Niagara Solid","Noteworthy","NSimSun","Nyala","OCR A Extended","Old Century","Old English Text MT","Onyx","Onyx BT","OPTIMA","Oriya Sangam MN","OSAKA","OzHandicraft BT","Palace Script MT","Papyrus","Parchment","Party LET","Pegasus","Perpetua","Perpetua Titling MT","PetitaBold","Pickwick","Plantagenet Cherokee","Playbill","PMingLiU","PMingLiU-ExtB","Poor Richard","Poster","PosterBodoni BT","PRINCETOWN LET","Pristina","PTBarnum BT","Pythagoras","Raavi","Rage Italic","Ravie","Ribbon131 Bd BT","Rockwell","Rockwell Condensed","Rockwell Extra Bold","Rod","Roman","Sakkal Majalla","Santa Fe LET","Savoye LET","Sceptre","Script","Script MT Bold","SCRIPTINA","Serifa","Serifa BT","Serifa Th BT","ShelleyVolante BT","Sherwood","Shonar Bangla","Showcard Gothic","Shruti","Signboard","SILKSCREEN","SimHei","Simplified Arabic","Simplified Arabic Fixed","SimSun","SimSun-ExtB","Sinhala Sangam MN","Sketch Rockwell","Skia","Small Fonts","Snap ITC","Snell Roundhand","Socket","Souvenir Lt BT","Staccato222 BT","Steamer","Stencil","Storybook","Styllo","Subway","Swis721 BlkEx BT","Swiss911 XCm BT","Sylfaen","Synchro LET","System","Tamil Sangam MN","Technical","Teletype","Telugu Sangam MN","Tempus Sans ITC","Terminal","Thonburi","Traditional Arabic","Trajan","TRAJAN PRO","Tristan","Tubular","Tunga","Tw Cen MT","Tw Cen MT Condensed","Tw Cen MT Condensed Extra Bold","TypoUpright BT","Unicorn","Univers","Univers CE 55 Medium","Univers Condensed","Utsaah","Vagabond","Vani","Vijaya","Viner Hand ITC","VisualUI","Vivaldi","Vladimir Script","Vrinda","Westminster","WHITNEY","Wide Latin","ZapfEllipt BT","ZapfHumnst BT","ZapfHumnst Dm BT","Zapfino","Zurich BlkEx BT","Zurich Ex BT","ZWAdobeF"];i.options.extendedJsFonts&&(r=r.concat(n)),r=r.concat(i.options.userDefinedFonts);var o="mmmmmmmmmmlli",s="72px",l=document.getElementsByTagName("body")[0],h=document.createElement("div"),u=document.createElement("div"),c={},d={},g=function(){var e=document.createElement("span");return e.style.position="absolute",e.style.left="-9999px",e.style.fontSize="72px",e.style.lineHeight="normal",e.innerHTML="mmmmmmmmmmlli",e},p=function(e,t){var i=g();return i.style.fontFamily="'"+e+"',"+t,i},f=function(){for(var r,e=[],t=0,i=a.length;tt.name?1:e.name>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Multiply:function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Rotl:function(e,t){return t%=64,32===t?[e[1],e[0]]:32>t?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},x64LeftShift:function(e,t){return t%=64,0===t?e:32>t?[e[0]<>>32-t,e[1]<>>1]),e=this.x64Multiply(e,[4283543511,3981806797]),e=this.x64Xor(e,[0,e[0]>>>1]),e=this.x64Multiply(e,[3301882366,444984403]),e=this.x64Xor(e,[0,e[0]>>>1])},x64hash128:function(e,t){e=e||"",t=t||0;for(var i=e.length%16,a=e.length-i,r=[0,t],n=[0,t],o=[0,0],s=[0,0],l=[2277735313,289559509],h=[1291169091,658871167],u=0;u>>0).toString(16)).slice(-8)+("00000000"+(r[1]>>>0).toString(16)).slice(-8)+("00000000"+(n[0]>>>0).toString(16)).slice(-8)+("00000000"+(n[1]>>>0).toString(16)).slice(-8)}},e.VERSION="1.5.1",e}),define("taoClientDiagnostic/tools/fingerprint/tester",["jquery","lodash","i18n","util/url","core/logger","core/store","core/format","lib/uuid","taoClientDiagnostic/tools/getConfig","taoClientDiagnostic/tools/getLabels","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/lib/fingerprint/fingerprint2"],function($,_,__,url,loggerFactory,store,format,uuid,getConfig,getLabels,getStatus,Fingerprint2){"use strict";const logger=loggerFactory("taoClientDiagnostic/fingerprint"),_defaults={id:"fingerprint"},_storageKeys={store:"client-diagnostic",uuid:"uuid",fingerprint:"value",details:"details",errors:"errors",changed:"changed"},_thresholdValues={error:0,storageIssue:50,changedFingerprint:90,success:100},_thresholds=[{threshold:_thresholdValues.error,message:__("Cannot get your fingerprint"),type:"error"},{threshold:_thresholdValues.storageIssue,message:__("Your fingerprint is %s. However we encountered issue while retrieving the data. Maybe your available disk space is too small"),type:"warning"},{threshold:_thresholdValues.changedFingerprint,message:__("Your fingerprint is %s. However it seems it has changed since the last check. It could be related to changes in your system."),type:"success"},{threshold:_thresholdValues.success,message:__("Your fingerprint is %s"),type:"success"}],_messages=[{title:__("Fingerprint"),status:__("Computing the fingerprint..."),fingerprintValue:__("Fingerprint"),fingerprintUUID:__("Dynamic UID"),fingerprintDetails:__("Fingerprint sources"),fingerprintChanged:__("Change since last fingerprint"),fingerprintErrors:__("Fingerprint errors"),fingerprintError:__("Fingerprint error")}];return function browserFingerprint(config){const initConfig=getConfig(config,_defaults),labels=getLabels(_messages,initConfig.level);return{start(done){function handleError(error){errors.push({key:"error",value:""+error}),logger.error(error)}function getStorageKey(key){return`${initConfig.id}-${_storageKeys[key]}`}let browserStorage,browserId="error",lastFingerprint="error",freshBrowserId=!1,newFingerprint=!1;const errors=[];store(_storageKeys.store).then(storage=>(browserStorage=storage,Promise.all([browserStorage.getItem(getStorageKey("uuid")).then(value=>{browserId=value}),browserStorage.getItem(getStorageKey("fingerprint")).then(value=>{lastFingerprint=value})]))).catch(handleError).then(()=>new Promise(resolve=>{new Fingerprint2().get((result,details)=>{const results={};results[_storageKeys.fingerprint]=(""+result).toUpperCase(),results[_storageKeys.details]=details,resolve(results)})})).then(results=>{const pendingPromises=[],resultFingerprint=results[_storageKeys.fingerprint];return browserId||(browserId=uuid(32,16),freshBrowserId=!0),newFingerprint=lastFingerprint!==resultFingerprint&&"error"!==lastFingerprint,results[_storageKeys.uuid]=browserId,results[_storageKeys.changed]=newFingerprint&&!freshBrowserId,browserStorage&&(freshBrowserId&&pendingPromises.push(browserStorage.setItem(getStorageKey("uuid"),browserId)),newFingerprint&&pendingPromises.push(browserStorage.setItem(getStorageKey("fingerprint"),resultFingerprint))),Promise.all(pendingPromises).catch(handleError).then(()=>results)}).catch(handleError).then(results=>{results=results||{},errors.length&&(results[_storageKeys.errors]=errors.length,results[_storageKeys.details]=(results[_storageKeys.details]||[]).concat(errors));const summary=this.getSummary(results),status=this.getFeedback(results);done(status,summary,results)})},get labels(){return labels},getSummary(results){const sources=_(results[_storageKeys.details]).map("key").pull("error").value(),summary={fingerprintValue:{message:labels.fingerprintValue,value:results[_storageKeys.fingerprint]},fingerprintDetails:{message:labels.fingerprintDetails,value:__("%d sources (%s)",_.size(sources),sources.join(", "))},fingerprintChanged:{message:labels.fingerprintChanged,value:results[_storageKeys.changed]?__("Yes"):__("No")}};return results[_storageKeys.errors]&&(summary.fingerprintErrors={message:labels.fingerprintErrors,value:results[_storageKeys.errors]},_.forEach(results[_storageKeys.details],(details,idx)=>{"error"===details.key&&(summary["fingerprintError"+idx]={message:labels.fingerprintError,value:details.value})})),summary},getFeedback(results){let percentage;percentage=results&&results[_storageKeys.fingerprint]&&"error"!==results[_storageKeys.fingerprint]?"error"===results[_storageKeys.uuid]?_thresholdValues.storageIssue:results[_storageKeys.changed]?_thresholdValues.changedFingerprint:_thresholdValues.success:_thresholdValues.error;const status=getStatus(percentage,_thresholds);return status.id=initConfig.id,status.title=labels.title,status.feedback.message=format(status.feedback.message,results&&results[_storageKeys.fingerprint]),status}}}}),define("tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,options,buffer="";return buffer+="\n\n ",(helper=helpers.value)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.value,stack1="function"===typeof helper?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1),stack1=helpers["if"].call(depth0,depth0&&depth0.errors,{hash:{},inverse:self.noop,fn:self.program(6,program6,data),data:data}),(stack1||0===stack1)&&(buffer+=stack1),buffer+="\n \n \n",buffer}function program2(depth0,data){return" errors"}function program4(depth0,data){var helper,options,buffer="";return buffer+=" title=\""+escapeExpression((helper=helpers.__||depth0&&depth0.__,options={hash:{},data:data},helper?helper.call(depth0,"Errors occurred! Please see details",options):helperMissing.call(depth0,"__","Errors occurred! Please see details",options)))+"\"",buffer}function program6(depth0,data){return" "}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression,self=this,functionType="function";return stack1=helpers["if"].call(depth0,depth0&&depth0.value,{hash:{},inverse:self.noop,fn:self.program(1,program1,data),data:data}),stack1||0===stack1?stack1:""})}),define("taoClientDiagnostic/tools/csvExporter",["jquery","lodash","i18n","core/request","layout/loading-bar","helpers"],function($,_,__,request,loadingBar,helpers){"use strict";const cssScope=".diagnostic-index";return{exportCsv(model){function mappingDiagnosticsData(diagnostics){return diagnostics.map(diagnostic=>{const result={};return _.forEach(model,field=>{result[field.id]=field.transform?field.transform(diagnostic[field.id],diagnostic):diagnostic[field.id]}),result})}function arrayToCsv(data){let columnDelimiter=1{let ctr=0;keys.forEach(key=>{0");link.attr("download",filename).attr("href",url).get(0).click(),URL.revokeObjectURL(url),link=null}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",serviceUrl=helpers._url("diagnosticData","Diagnostic",extension);loadingBar.start(),request({url:serviceUrl,data:{rows:Number.MAX_SAFE_INTEGER},noToken:!0}).then(response=>{const mappedData=mappingDiagnosticsData(response.data);let csvContent=arrayToCsv(mappedData);downloadFile(csvContent,__("diagnostics.csv"),"text/csv"),loadingBar.stop()}).catch(()=>{loadingBar.stop()})}}}),define("taoClientDiagnostic/controller/Diagnostic/index",["jquery","lodash","i18n","helpers","moment","core/request","layout/loading-bar","util/encode","ui/feedback","ui/dialog","taoClientDiagnostic/tools/getStatus","taoClientDiagnostic/tools/performances/tester","taoClientDiagnostic/tools/fingerprint/tester","tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint","tpl!taoClientDiagnostic/tools/diagnostic/tpl/details","taoClientDiagnostic/tools/csvExporter","ui/datatable","lib/moment-timezone.min"],function($,_,__,helpers,moment,request,loadingBar,encode,feedback,dialog,getStatus,performancesTesterFactory,fingerprintTesterFactory,fingerprintTpl,detailsTpl,csvExporter){"use strict";var _Mathmax5=Math.max,_Mathround2=Math.round,_Mathpow=Math.pow;function formatNumber(value,digits){const nb="undefined"==typeof digits?2:_Mathmax5(0,parseInt(digits,10)),factor=_Mathpow(10,nb)||1;return _Mathround2(value*factor)/factor}function formatBandwidth(value){return 100 100":formatNumber(value)}function transformDateToLocal(date){let time;if(_.isFinite(date)){_.isNumber(date)||(date=_.parseInt(date,10));const d=new Date(1e3*date);time=moment.utc(d)}else time=moment.tz(date,defaultDateTimeZone);return time.tz(moment.tz.guess()).format(defaultDateFormat)}const cssScope=".diagnostic-index",defaultDateTimeZone="UTC",defaultDateFormat="Y/MM/DD HH:mm:ss";return loadingBar.start(),{start(){function requestData(url,selection,message){selection&&selection.length&&(loadingBar.start(),request({url,data:{id:selection},method:"POST",noToken:!0}).then(response=>{loadingBar.stop(),response&&response.success?(message&&feedback().success(message),$list.datatable("refresh")):feedback().error(`${__("Something went wrong ...")}
                  ${encode.html(response.error)}`,{encodeHtml:!1})}).catch(()=>loadingBar.stop()))}function remove(selection){requestData(removeUrl,selection,__("The readiness check result have been removed"))}const $container=$(cssScope),extension=$container.data("extension")||"taoClientDiagnostic",$list=$container.find(".list");let dataset=$container.data("set");const extensionConfig=$container.data("config")||{},config=extensionConfig.diagnostic||extensionConfig,installedExtension=$container.data("installedextension")||!1,diagnosticUrl=helpers._url("diagnostic","Diagnostic",extension),removeUrl=helpers._url("remove","Diagnostic",extension),serviceUrl=helpers._url("diagnosticData","Diagnostic",extension),performancesTester=performancesTesterFactory(config.testers.performance||{}),fingerprintTester=fingerprintTesterFactory(config.testers.fingerprint||{}),tools=[],actions=[],model=[];tools.push({id:"refresh",icon:"reset",title:__("Refresh the page"),label:__("Refresh"),action(){$list.datatable("refresh")}}),tools.push({id:"launch",icon:"play",title:__("Launch another readiness check"),label:__("Launch readiness check"),action(){window.location.href=diagnosticUrl}}),config.export&&tools.push({id:"csvExport",icon:"export",title:__("Export CSV"),label:__("Export CSV"),action(){csvExporter.exportCsv(model)}}),installedExtension&&tools.push({id:"lti",icon:"play",title:__("Try a test delivery"),label:__("Try a test delivery"),action(){window.location.href=deliveryUrl}}),tools.push({id:"remove",icon:"remove",title:__("Remove the selected readiness check results"),label:__("Remove"),massAction:!0,action(selection){dialog({message:__("The selected readiness check results will be removed. Continue ?"),autoRender:!0,autoDestroy:!0,onOkBtn(){remove(selection)}})}}),window.self===window.top&&tools.push({id:"exitButton",icon:"close",title:__("Exit"),label:__("Exit"),action(){window.self.close()}}),actions.push({id:"remove",icon:"remove",title:__("Remove the readiness check result?"),action(id){dialog({autoRender:!0,autoDestroy:!0,message:__("The readiness check result will be removed. Continue ?"),onOkBtn(){remove([id])}})}}),model.push({id:"workstation",label:__("Workstation")}),config.requireSchoolName&&model.push({id:"school_name",label:__("School name")}),config.requireSchoolId&&model.push({id:"school_id",label:__("School id")}),config.validateSchoolName&&model.push({id:"school_number",label:__("School number")}),config.testers.fingerprint&&config.testers.fingerprint.enabled&&(model.push({id:"fingerprint-cell",label:__("Fingerprint"),transform(v,row){return fingerprintTpl(row.fingerprint)}}),$list.on("click.fingerprint",".fingerprint-cell span.details",function(e){const id=$(e.target).closest("tr").data("itemIdentifier"),row=_.find(dataset.data,{id:id});row&&dialog({content:detailsTpl(fingerprintTester.getSummary(row.fingerprint)),buttons:"ok",autoRender:!0,autoDestroy:!0})})),config.testers.screen&&config.testers.screen.enabled&&model.push({id:"screen_size",label:__("Screen resolution"),transform(value,row){if(row.screen&&row.screen.width&&row.screen.height)return row.screen.width+"x"+row.screen.height}}),config.testers.browser&&config.testers.browser.enabled&&(model.push({id:"os",label:__("OS")}),model.push({id:"browser",label:__("Browser")})),config.testers.performance&&config.testers.performance.enabled&&model.push({id:"performance",label:__("Performances"),transform(value){const status=performancesTester.getFeedback(value);return status.feedback&&status.feedback.message}}),config.testers.bandwidth&&config.testers.bandwidth.enabled&&model.push({id:"bandwidth",label:__("Bandwidth"),transform:formatBandwidth}),config.testers.intensive_bandwidth&&config.testers.intensive_bandwidth.enabled&&model.push({id:"intensive_bandwidth",label:__("Intensive bandwidth"),transform:formatBandwidth}),config.testers.upload&&config.testers.upload.enabled&&model.push({id:"upload",label:__("Upload speed"),transform:formatBandwidth}),model.push({id:"date",label:__("Date"),transform:transformDateToLocal}),$list.on("query.datatable",()=>loadingBar.start()).on("load.datatable",(e,data)=>{dataset=data,loadingBar.stop()}).datatable({url:serviceUrl,status:{empty:__("No readiness checks have been done!"),available:__("Readiness checks already done"),loading:__("Loading")},selectable:!0,tools,actions,model},dataset)}}}),define("css!taoClientDiagnosticCss/exclusion-list-form",[],function(){}),define("taoClientDiagnostic/controller/ExclusionList/editInstance",["jquery","ui/tooltipster","select2","css!taoClientDiagnosticCss/exclusion-list-form"],function($,tooltipster){"use strict";return{start(){}}}),define("taoClientDiagnostic/controller/routes",{Authenticator:{actions:{login:"controller/Authenticator/login"}},CompatibilityChecker:{actions:{index:"controller/CompatibilityChecker/diagnostics"}},Diagnostic:{actions:{index:"controller/Diagnostic/index",diagnostic:"controller/Diagnostic/diagnostic"}},ExcludedBrowsers:{actions:{editInstance:"controller/ExclusionList/editInstance"}},ExcludedOS:{actions:{editInstance:"controller/ExclusionList/editInstance"}}}),function(c){var d=document,a="appendChild",i="styleSheet",s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}(".diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\"Source Sans Pro\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\"Source Sans Pro\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\" - \"}table.datatable .progress .item-time:before{content:\" (\"}table.datatable .progress .item-time .total:before{content:\" / \"}table.datatable .progress .item-time:after{content:\")\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\"Source Sans Pro\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\"Source Sans Pro\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */.exclusion-list-form .xhtml_form input[type=text],.exclusion-list-form .xhtml_form select{width:60%}.exclusion-list-form .xhtml_form .icon-help.tooltipstered{float:right;line-height:25px}\n\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/exclusion-list-form.css.map */"),define("taoClientDiagnostic/loader/taoClientDiagnostic.bundle",function(){}),window.bundles=(window.bundles||[]).concat(["taoQtiItem/loader/taoQtiItem.min","taoItems/loader/taoItems.min"]); //# sourceMappingURL=taoClientDiagnostic.min.js.map \ No newline at end of file diff --git a/views/js/loader/taoClientDiagnostic.min.js.map b/views/js/loader/taoClientDiagnostic.min.js.map index 5f07020..3b9f874 100644 --- a/views/js/loader/taoClientDiagnostic.min.js.map +++ b/views/js/loader/taoClientDiagnostic.min.js.map @@ -1 +1 @@ -{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","$","feedback","showMessages","container","$feedbackBox","data","error","showMessage","hb","template","Handlebars","depth0","helpers","partials","compilerInfo","merge","helper","options","buffer","helperMissing","escapeExpression","__","hash","call","_","componentFactory","moduleLoader","context","module","componentTpl","loadingBar","diagnosticLoaderFactory","config","component","setTemplate","on","onDiagnosticLoaderInit","render","onDiagnosticLoaderRender","moduleConfig","identifiers","Object","keys","diagnostics","isFunction","addList","load","then","factories","componentConfig","getConfig","factory","factoryName","factoryConfig","getElement","onRender","autoStart","run","stop","trigger","defer","init","diagnosticFactory","$contentArea","fixedDecimals","value","decimals","shift","Math","pow","abs","round","_Mathfloor","floor","_Mathmax","max","_Mathmin","min","valueGetter","name","stats","list","fieldName","_Mathceil","ceil","_Mathsqrt","sqrt","_NumberMAX_VALUE","Number","MAX_VALUE","getValue","values","count","sum","reduce","push","average","sum2","diff","variance","sort","middle","median","results","key","defaults","omit","_Mathmax2","_Mathmin2","getLabels","messages","level","Array","isArray","parseInt","_Mathmax3","getStatus","percentage","thresholds","opts","testPercentage","globalPercentage","minimumGlobalPercentage","status","quality","len","i","step","threshold","clone","async","Loader","Renderer","_Mathabs","loadItem","done","qtiJsonFile","url","urlTokens","split","extension","fullpath","s","contexts","paths","baseUrl","replace","loader","renderer","getAssetManager","setData","itemData","loadItemData","performance","now","setRenderer","$container","appendTo","append","postRender","remove","end","duration","_second","result","id","getLoadedClasses","_defaultTimeout","_defaultOccurrencesCount","_defaultSamples","_defaults","optimal","_thresholds","message","type","_messages","title","performancesMin","performancesMax","performancesAverage","_sampleBaseId","performancesTester","initConfig","labels","idx","_samples","map","isEmpty","samples","sample","timeout","nb","occurrences","tests","cb","partial","iterations","series","measures","getFeedback","summary","getSummary","range","_Mathfloor2","_Mathmax4","download","bandwidth","root_url","file","Date","timeoutId","setTimeout","request","XMLHttpRequest","open","setRequestHeader","onload","clearTimeout","bytes","size","seconds","speed","_mega","onerror","onreadystatechange","send","_kilo","unit","ideal","feedbackThresholds","fallbackThreshold","_downloadData","\"10KB\"","\"100KB\"","\"1MB\"","legend","bandwidthMin","bandwidthMax","bandwidthAverage","bandwidthTester","bind","resultsBySize","o","avgResult","bandwidthUnit","maxTestTakers","getStatusOptions","baseBandwidth","stable","resultBySize","label","toString","wide","urlHelper","_Mathround","generateStr","text","possible","charAt","random","upload","route","cache","str","ajax","xhr","startTime","evt","lengthComputable","passedTime","time","uploadAvg","uploadMax","uploadTester","totalSpeed","maxSpeed","val","avgSpeed","avg","getTesterUrl","win","action","navigator","screen","e","f","ua","userAgent","ActiveXObject","opera","chrome","createElement","Worker","applicationCache","history","pushState","documentElement","webkitRequestFullScreen","r","substring","w","width","h","height","defaultConfig","browserVersionAction","browserVersionController","browserVersionExtension","getPlatformInfo","noToken","loggerFactory","logger","browserslistUrl","_placeHolders","CURRENT_BROWSER","CURRENT_OS","browser","os","unknown","browserTester","checkBrowserSupport","platformInfo","currentDevice","isMobile","currentOS","toLowerCase","currentBrowser","currentVersion","browserVersion","fetchBrowserList","some","entry","device","versions","version","flatten","localeCompare","numeric","catch","osVersion","browserSupported","assign","method","success","customMsgRenderer","customMsg","currentOs","program1","stack1","header","program3","info","program5","setup","program7","program9","validateSchoolName","inverse","self","program","program12","fn","program10","functionType","noop","requireSchoolId","requireSchoolName","button","details","each","store","requestData","dialogAlert","mainTpl","resultTpl","detailsTpl","feedbackTpl","qualityBarTpl","actionStore","actionSchool","actionDropId","storeAllRuns","configurableText","diagnostic","changeStatus","is","controls","$status","html","storeParams","getCustomMsg","addCustomFeedbackMsg","msg","hasFailed","addResult","$main","$result","find","$indicator","$results","fadeIn","animate","left","outerWidth","cleanUp","empty","enable","$start","removeClass","disable","addClass","prepare","setState","finish","deleteIdentifier","information","scores","testers","customInput","getCustomInput","doRun","doCheck","testerConfig","testerId","processTester","testerFactory","tester","customMsgKey","mapValues","stringify","processFailure","enabled","total","minBy","diagTotalCheckResult","vars","location","href","m","has","diagComponent","onDiagnosticDestroy","onDiagnosticInit","onDiagnosticRender","getInputValue","$control","getControl","trim","setInputValue","toggleControl","state","prop","runDiagnostics","isPlainObject","launch","requestSchoolName","school_name","school_number","manageSchoolProperties","fields","validate","toggleStart","allow","every","toggleFields","shouldStart","which","preventDefault","click","storage","setItem","Promise","all","getItem","response","errorMsg","errorMessage","$component","onShowDetails","$btn","closest","$details","onHideDetails","diagInstructions","program2","program4","program6","program8","program13","program11","actionbar","diagnosticTpl","cssScope","installTester","workstation","$list","$workstation","onDiagnosticStart","onDiagnosticEnd","$panel","extensionConfig","indexUrl","_url","buttons","icon","top","close","renderTo","t","amd","exports","swfContainerId","swfPath","detectScreenOrientation","sortPluginsFor","userDefinedFonts","extend","nativeForEach","prototype","nativeMap","get","a","preprocessor","userAgentKey","languageKey","colorDepthKey","pixelRatioKey","hardwareConcurrencyKey","screenResolutionKey","availableScreenResolutionKey","timezoneOffsetKey","sessionStorageKey","localStorageKey","indexedDbKey","addBehaviorKey","openDatabaseKey","cpuClassKey","platformKey","doNotTrackKey","pluginsKey","canvasKey","webglKey","adBlockKey","hasLiedLanguagesKey","hasLiedResolutionKey","hasLiedOsKey","hasLiedBrowserKey","touchSupportKey","customEntropyFunction","fontsKey","join","x64hash128","customFunction","excludeUserAgent","getUserAgent","excludeLanguage","language","userLanguage","browserLanguage","systemLanguage","excludeColorDepth","colorDepth","excludePixelRatio","getPixelRatio","devicePixelRatio","excludeScreenResolution","getScreenResolution","excludeAvailableScreenResolution","getAvailableScreenResolution","availWidth","availHeight","excludeTimezoneOffset","getTimezoneOffset","excludeSessionStorage","hasSessionStorage","hasLocalStorage","excludeIndexedDB","hasIndexedDB","body","excludeAddBehavior","addBehavior","excludeOpenDatabase","openDatabase","excludeCpuClass","getNavigatorCpuClass","excludePlatform","getNavigatorPlatform","excludeDoNotTrack","getDoNotTrack","excludeCanvas","isCanvasSupported","getCanvasFp","excludeWebGL","isWebGlSupported","getWebglFp","excludeAdBlock","getAdBlock","excludeHasLiedLanguages","getHasLiedLanguages","excludeHasLiedResolution","getHasLiedResolution","excludeHasLiedOs","getHasLiedOs","excludeHasLiedBrowser","getHasLiedBrowser","excludeJsFonts","flashFontsKey","jsFontsKey","excludeFlashFonts","hasSwfObjectLoaded","hasMinFlashInstalled","loadSwfAndDetectFonts","n","extendedJsFonts","l","getElementsByTagName","u","c","d","g","style","position","fontSize","lineHeight","innerHTML","p","fontFamily","appendChild","T","offsetWidth","offsetHeight","S","x","v","E","M","A","y","removeChild","excludePlugins","isIE","excludeIEPlugins","getIEPlugins","getRegularPlugins","plugins","pluginsShouldBeSorted","suffixes","description","getOwnPropertyDescriptor","match","excludeTouchSupport","getTouchSupport","excludeHardwareConcurrency","getHardwareConcurrency","sessionStorage","localStorage","indexedDB","hardwareConcurrency","cpuClass","platform","doNotTrack","msDoNotTrack","maxTouchPoints","msMaxTouchPoints","createEvent","_MathPI","PI","display","getContext","rect","isPointInPath","textBaseline","fillStyle","fillRect","font","dontUseFakeFontInCanvas","fillText","globalCompositeOperation","beginPath","arc","closePath","fill","toDataURL","clearColor","DEPTH_TEST","depthFunc","LEQUAL","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","getExtension","getParameter","MAX_TEXTURE_MAX_ANISOTROPY_EXT","getWebglCanvas","createBuffer","bindBuffer","ARRAY_BUFFER","Float32Array","bufferData","STATIC_DRAW","itemSize","numItems","createProgram","createShader","VERTEX_SHADER","shaderSource","compileShader","FRAGMENT_SHADER","attachShader","linkProgram","useProgram","vertexPosAttrib","getAttribLocation","offsetUniform","getUniformLocation","enableVertexAttribArray","vertexPosArray","vertexAttribPointer","FLOAT","uniform2f","drawArrays","TRIANGLE_STRIP","canvas","getSupportedExtensions","ALIASED_LINE_WIDTH_RANGE","ALIASED_POINT_SIZE_RANGE","ALPHA_BITS","getContextAttributes","antialias","BLUE_BITS","DEPTH_BITS","GREEN_BITS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_CUBE_MAP_TEXTURE_SIZE","MAX_FRAGMENT_UNIFORM_VECTORS","MAX_RENDERBUFFER_SIZE","MAX_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_VARYING_VECTORS","MAX_VERTEX_ATTRIBS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_VERTEX_UNIFORM_VECTORS","MAX_VIEWPORT_DIMS","RED_BITS","RENDERER","SHADING_LANGUAGE_VERSION","STENCIL_BITS","VENDOR","VERSION","UNMASKED_VENDOR_WEBGL","UNMASKED_RENDERER_WEBGL","getShaderPrecisionFormat","HIGH_FLOAT","precision","rangeMin","rangeMax","MEDIUM_FLOAT","LOW_FLOAT","HIGH_INT","MEDIUM_INT","LOW_INT","className","getElementsByClassName","languages","substr","oscpu","productSub","eval","toSource","WebGLRenderingContext","appName","test","swfobject","hasFlashPlayerVersion","addFlashDivNode","setAttribute","___fp_swf_loaded","onReady","allowScriptAccess","menu","embedSWF","hasOwnProperty","x64Add","x64Multiply","x64Rotl","x64LeftShift","x64Xor","x64Fmix","charCodeAt","slice","format","uuid","Fingerprint2","_storageKeys","fingerprint","errors","changed","_thresholdValues","storageIssue","changedFingerprint","fingerprintValue","fingerprintUUID","fingerprintDetails","fingerprintChanged","fingerprintErrors","fingerprintError","browserFingerprint","handleError","getStorageKey","browserStorage","browserId","lastFingerprint","freshBrowserId","newFingerprint","resolve","toUpperCase","pendingPromises","resultFingerprint","sources","pull","exportCsv","model","mappingDiagnosticsData","field","transform","arrayToCsv","columnDelimiter","arguments","lineDelimiter","ctr","includes","downloadFile","content","filename","blob","Blob","URL","createObjectURL","link","attr","revokeObjectURL","serviceUrl","rows","MAX_SAFE_INTEGER","mappedData","csvContent","moment","encode","dialog","performancesTesterFactory","fingerprintTesterFactory","fingerprintTpl","csvExporter","_Mathmax5","_Mathround2","_Mathpow","formatNumber","digits","factor","formatBandwidth","transformDateToLocal","date","isFinite","isNumber","utc","tz","defaultDateTimeZone","guess","defaultDateFormat","selection","datatable","encodeHtml","removeUrl","dataset","installedExtension","diagnosticUrl","fingerprintTester","tools","actions","export","deliveryUrl","massAction","autoRender","autoDestroy","onOkBtn","row","target","intensive_bandwidth","available","loading","selectable","tooltipster","Authenticator","login","CompatibilityChecker","Diagnostic","ExcludedBrowsers","editInstance","ExcludedOS","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","../tools/message.js","../controller/Authenticator/login.js","../component/diagnostic/tpl/component!tpl","../component/diagnostic/diagnosticLoader.js","../controller/CompatibilityChecker/diagnostics.js","../tools/fixedDecimals.js","../tools/stats.js","../tools/getConfig.js","../tools/getLabels.js","../tools/getStatus.js","../tools/performances/tester.js","../tools/bandwidth/tester.js","../tools/upload/tester.js","../tools/getPlatformInfo.js","../tools/browser/tester.js","../tools/diagnostic/tpl/main!tpl","../tools/diagnostic/tpl/result!tpl","../tools/diagnostic/tpl/details!tpl","../tools/diagnostic/tpl/feedback!tpl","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","../../taoClientDiagnosticCss/diagnostics!css","../tools/diagnostic/diagnostic.js","../templates/diagnostic/main!tpl","../controller/Diagnostic/diagnostic.js","../lib/fingerprint/fingerprint2.js","../tools/fingerprint/tester.js","../tools/diagnostic/tpl/fingerprint!tpl","../tools/csvExporter.js","../controller/Diagnostic/index.js","css!taoClientDiagnosticCss/exclusion-list-form","../controller/ExclusionList/editInstance.js","../controller/routes.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/tools/message',['jquery', 'ui/feedback'], function($, feedback) {\n 'use strict';\n\n /**\n * Displays the messages set into a markup\n * @param {string|jQuery|HTMLElement} container\n */\n return function showMessages(container) {\n const $feedbackBox = $(container);\n\n if ($feedbackBox.data('error')) {\n feedback().error($feedbackBox.data('error'));\n }\n if ($feedbackBox.data('message')) {\n feedback().error($feedbackBox.data('message'));\n }\n };\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/Authenticator/login',['taoClientDiagnostic/tools/message'], function(showMessage) {\n 'use strict';\n\n return {\n start() {\n showMessage('#feedback-box');\n }\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/component/diagnostic/tpl/component', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
                  \\n

                  \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Diagnostic Tool\", options) : helperMissing.call(depth0, \"__\", \"Diagnostic Tool\", options)))\n + \"

                  \\n
                  \";\n return buffer;\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/component/diagnostic/diagnosticLoader',[\n 'lodash',\n 'ui/component',\n 'core/moduleLoader',\n 'context',\n 'module',\n 'tpl!taoClientDiagnostic/component/diagnostic/tpl/component',\n 'layout/loading-bar'\n], function(_, componentFactory, moduleLoader, context, module, componentTpl, loadingBar) {\n 'use strict';\n\n /*\n * This component factory is loading diagnostic tool modules and initialising with their configuration.\n * @param {object} container - Container in which the module will render diagnostic check\n * @param {object} config - Some config options.\n */\n return function diagnosticLoaderFactory(container, config) {\n const component = componentFactory()\n // set the component's layout\n .setTemplate(componentTpl)\n\n // auto render on init\n .on('init', function onDiagnosticLoaderInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticLoaderRender() {\n const moduleConfig = module.config();\n const identifiers = Object.keys(moduleConfig.diagnostics);\n /*\n * This loads all the modules from module configuration, which are in the `diagnostics` array.\n */\n moduleLoader({}, _.isFunction)\n .addList(moduleConfig.diagnostics)\n .load(context.bundle)\n .then(factories => {\n const componentConfig = this.getConfig();\n\n /*\n * Read all factories and initialise them with their config from component.\n */\n factories.forEach((factory, index) => {\n const factoryName = identifiers[index];\n const factoryConfig = componentConfig[factoryName];\n factoryConfig.controller = componentConfig.controller;\n\n factory(this.getElement(), factoryConfig)\n .on('render', function onRender() {\n if (factoryConfig.autoStart) {\n this.run();\n }\n })\n .on('start', () => loadingBar.start())\n .on('end', () => loadingBar.stop());\n });\n\n /**\n * @event ready\n */\n this.trigger('ready');\n });\n });\n\n _.defer(() => component.init(config));\n\n return component;\n };\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/CompatibilityChecker/diagnostics',[\n 'jquery',\n 'taoClientDiagnostic/tools/message',\n 'taoClientDiagnostic/component/diagnostic/diagnosticLoader'\n], function($, showMessage, diagnosticFactory) {\n 'use strict';\n\n return {\n start: function(config) {\n const $contentArea = $('.content');\n\n showMessage('#feedback-box');\n\n diagnosticFactory($contentArea, config);\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fixedDecimals',[],function() {\n 'use strict';\n\n /**\n * Rounds a value to a fixed number of decimals\n * @param {number} value - The value to round\n * @param {number} decimals - The number of decimal\n * @returns {number}\n */\n return function fixedDecimals(value, decimals) {\n const shift = Math.pow(10, Math.abs(decimals || 1));\n return Math.round(Number(value) * shift) / shift || 0;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/stats',['lodash', 'taoClientDiagnostic/tools/fixedDecimals'], function(_, fixedDecimals) {\n 'use strict';\n\n /**\n * Gets a getter function that extracts a value from a record.\n * @param {string|Function} name - the name to extract from the record, or a getter function\n * @returns {Function}\n * @private\n */\n function valueGetter(name) {\n if ('function' === typeof name) {\n return name;\n }\n\n return item => (item && item[name]) || 0;\n }\n\n /**\n * Computes some stats on a list from a particular field\n * @param {Array|object} list - The list to compute stats on\n * @param {string|Function} fieldName - The name of the field to process, or a callback method returning the value\n * @param {number} [decimals] - Optional number of fixed decimals for values\n * @returns {object}\n */\n return function stats(list, fieldName, decimals) {\n const getValue = valueGetter(fieldName);\n const values = [];\n let min = Number.MAX_VALUE;\n let max = 0;\n let count = 0;\n\n // process first pass stats: compute sum, min and max values\n const sum = _.reduce(\n list,\n (sum, item) => {\n if ('undefined' !== typeof item) {\n const value = getValue(item);\n values.push(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n sum += value;\n count++;\n return sum;\n }\n },\n 0\n );\n\n // compute the average value\n const average = sum / (count || 1);\n\n // process second pass stats: compute variance\n const sum2 = values.reduce((sum, value) => {\n const diff = value - average;\n sum += diff * diff;\n return sum;\n }, 0);\n\n // compute standard variance\n const variance = count > 1 ? Math.sqrt(sum2 / (count - 1)) : 0;\n\n // compute the median value\n values.sort();\n const middle = count / 2;\n const median = (values[Math.floor(middle)] + values[Math.ceil(middle)]) / 2;\n\n const results = {\n min,\n max,\n sum,\n count,\n average,\n median,\n variance\n };\n\n if (decimals) {\n _.forEach(results, (value, key) => {\n results[key] = fixedDecimals(value, decimals);\n });\n }\n\n results.values = list;\n return results;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getConfig',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets a config set\n * @param {object} [config]\n * @param {object} [defaults]\n * @returns {object}\n */\n return function getConfig(config, defaults) {\n return _(config || {})\n .omit(value => value === null || typeof value === 'undefined')\n .defaults(defaults || {})\n .value();\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getLabels',[],function() {\n 'use strict';\n\n /**\n * Gets the list of messages related to a particular level.\n * The level is provided as a numeric value, starting from 1.\n * @param {Array|object} messages - The list of messages for all levels.\n * If only one object is provided is will be wrapped into an array\n * @param {number|string} level - The level for which filter the messages.\n * It should be comprised within the available indexes.\n * Higher levels will be reduced to the higher available,\n * lower levels will be increased to the lowest.\n * @returns {object}\n */\n return function getLabels(messages, level) {\n messages = messages || {};\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n // Compute the level value that targets which list of labels to use.\n // It should be comprised within the available indexes.\n // Higher levels will be reduced to the higher available, lower levels will be increased to the lowest.\n level = Math.min(Math.max(parseInt(level, 10) || 0, 1), messages.length || 1) - 1;\n\n return messages[level] || {};\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getStatus',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets the correct status message for a given percentage from a list of thresholds.\n * @param {number|string} percentage - The actual percentage. Must be comprised between 0 and 100.\n * Other values will be adjusted to fit the interval.\n * @param {Array|object} [thresholds] - A list of descriptors for each thresholds.\n * A threshold field must be provided for each.\n * @param {object} [opts]\n * @param {object} [minimumGlobalPercentage] - lowest value that will be used in the global score computation\n * @returns {object} Returns the corresponding threshold, or an empty object if none match.\n */\n return function getStatus(percentage, thresholds, opts) {\n const options = opts || {};\n const testPercentage = Math.max(0, Math.min(100, Math.round(parseInt(percentage, 10) || 0)));\n const globalPercentage = options.minimumGlobalPercentage\n ? Math.max(testPercentage, options.minimumGlobalPercentage)\n : testPercentage;\n\n // need a structure compatible with the handlebars template\n const status = {\n // the percentage is between 0 and 100 and obviously must be a number\n percentage: testPercentage,\n globalPercentage: globalPercentage,\n quality: {}\n };\n\n // grab a feedback related to the percentage in the thresholds list\n if (thresholds) {\n if (!Array.isArray(thresholds)) {\n thresholds = [thresholds];\n }\n\n let feedback;\n const len = thresholds.length;\n for (let i = 0; i < len; i++) {\n const step = thresholds[i];\n if (step && (!step.threshold || status.percentage >= step.threshold)) {\n feedback = step;\n } else {\n break;\n }\n }\n\n if (feedback) {\n status.feedback = _.clone(feedback);\n }\n }\n\n return status;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/performances/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'helpers',\n 'taoClientDiagnostic/tools/stats',\n 'taoQtiItem/qtiItem/core/Loader',\n 'taoQtiItem/qtiCommonRenderer/renderers/Renderer',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, context, helpers, stats, Loader, Renderer, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * Default timeout duration\n * @type {number}\n * @private\n */\n const _defaultTimeout = 30 * _second;\n\n /**\n * Default number of renderings by samples\n * @type {number}\n * @private\n */\n const _defaultOccurrencesCount = 10;\n\n /**\n * List of default samples\n * @type {Array}\n * @private\n */\n const _defaultSamples = [\n 'taoClientDiagnostic/tools/performances/data/sample1/',\n 'taoClientDiagnostic/tools/performances/data/sample2/',\n 'taoClientDiagnostic/tools/performances/data/sample3/'\n ];\n\n /**\n * Default values for the performances tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'performances',\n\n // The threshold for optimal performances\n optimal: 0.025,\n\n // The threshold for minimal performances\n threshold: 0.25\n };\n\n /**\n * A list of thresholds for performances check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Very slow performances'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average performances'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good performances'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Workstation performances'),\n status: __('Checking the performances...'),\n performancesMin: __('Minimum rendering time'),\n performancesMax: __('Maximum rendering time'),\n performancesAverage: __('Average rendering time')\n }\n ];\n\n /**\n * Base text used to build sample identifiers\n * @type {string}\n * @private\n */\n const _sampleBaseId = 'sample';\n\n /**\n * Loads a page inside a div and compute the time to load\n * @param {object} data The descriptor of the page to load\n * @param {Function} done A callback function called to provide the result\n * @private\n */\n function loadItem(data, done) {\n //item location config\n const qtiJsonFile = `${data.url}qti.json`;\n const urlTokens = data.url.split('/');\n const extension = urlTokens[0];\n const fullpath = require.s.contexts._.config.paths[extension];\n const baseUrl = data.url.replace(extension, fullpath);\n const loader = new Loader();\n const renderer = new Renderer({\n baseUrl: baseUrl // compatibility mode for legacy installations\n });\n\n // check needed by compatibility mode for legacy installations\n if (renderer.getAssetManager) {\n renderer.getAssetManager().setData('baseUrl', baseUrl);\n }\n\n require([`json!${qtiJsonFile}`], function(itemData) {\n loader.loadItemData(itemData, function(item) {\n renderer.load(function() {\n //start right before rendering\n const start = window.performance.now();\n\n //set renderer\n item.setRenderer(this);\n\n //render markup\n const $container = $('
                  ').appendTo('body');\n $container.append(item.render());\n\n //execute javascript\n item.postRender();\n\n //remove item\n $container.remove();\n\n //done\n const end = window.performance.now();\n\n const duration = (end - start) / _second;\n\n const result = {\n id: data.id,\n url: data.url,\n duration: duration\n };\n\n done(null, result);\n }, this.getLoadedClasses());\n });\n });\n }\n\n /**\n * Performs a browser performances test by running a heavy page\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.optimal] - The threshold for optimal performances\n * @param {number} [config.threshold] - The threshold for minimal performances\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function performancesTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n let idx = 0;\n const _samples = _.map((!_.isEmpty(initConfig.samples) && initConfig.samples) || _defaultSamples, sample => {\n idx++;\n return {\n id: _sampleBaseId + idx,\n url: sample,\n timeout: initConfig.timeout * 1000 || _defaultTimeout,\n nb: initConfig.occurrences || _defaultOccurrencesCount\n };\n });\n\n // add one occurrence on the first sample to obfuscate the time needed to load the runner\n _samples[0].nb++;\n\n return {\n /**\n * Performs a performances test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_samples, data => {\n const cb = _.partial(loadItem, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n async.series(tests, (err, measures) => {\n const decimals = 2;\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n\n // remove the first result to obfuscate the time needed to load the runner\n measures.shift();\n\n const results = stats(measures, 'duration', decimals);\n const status = this.getFeedback(results.average);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n performancesMin: { message: labels.performancesMin, value: `${results.min} s` },\n performancesMax: { message: labels.performancesMax, value: `${results.max} s` },\n performancesAverage: { message: labels.performancesAverage, value: `${results.average} s` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {Number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal;\n const range = Math.abs(optimal - initConfig.threshold);\n const status = getStatus(((range + optimal - result) / range) * 100, _thresholds);\n\n status.title = labels.title;\n status.id = initConfig.id;\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/bandwidth/tester',[\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/stats',\n 'taoClientDiagnostic/tools/fixedDecimals',\n 'taoClientDiagnostic/tools/getStatus'\n], function(_, __, async, context, getConfig, getLabels, stats, fixedDecimals, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low bandwidth'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average bandwidth'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good bandwidth'),\n type: 'success'\n }\n ];\n\n /**\n * Default values for the bandwidth tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'bandwidth',\n\n // The typical bandwidth needed for a test taker (Mbps)\n unit: 0.16,\n\n // The thresholds for optimal bandwidth\n ideal: 45,\n\n // Maximum number of test takers to display\n max: 100,\n\n // Lowest value that will be used in the global score computation\n minimumGlobalPercentage: false,\n\n // A list of thresholds for bandwidth check\n feedbackThresholds: _thresholds,\n\n fallbackThreshold: 0.2\n };\n\n /**\n * List of descriptors defining the data sets to download.\n * - file : path of the file containing the test data\n * - size : the given size of the file\n * - timeout : the timeout for the download\n * - threshold : a bandwidth threshold above which the data set can be downloaded to evaluate a more accurate value\n * - nb : number of download iterations\n * @type {object}\n * @private\n */\n const _downloadData = {\n '10KB': {\n id: '10KB',\n file: 'data/bin10KB.data',\n size: 10 * _kilo,\n timeout: _second,\n threshold: 0,\n nb: 10\n },\n '100KB': {\n id: '100KB',\n file: 'data/bin100KB.data',\n size: 100 * _kilo,\n timeout: 2 * _second,\n threshold: 0,\n nb: 5\n },\n '1MB': {\n id: '1MB',\n file: 'data/bin1MB.data',\n size: _mega,\n timeout: 20 * _second,\n threshold: 0,\n nb: 3\n }\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object[]}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Bandwidth'),\n status: __('Checking the bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle'),\n bandwidthMin: __('Minimum bandwidth'),\n bandwidthMax: __('Maximum bandwidth'),\n bandwidthAverage: __('Average bandwidth')\n },\n // level 2\n {\n title: __('Media intensive bandwidth'),\n status: __('Checking the media intensive bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle with media intensive'),\n bandwidthMin: __('Minimum intensive bandwidth'),\n bandwidthMax: __('Maximum intensive bandwidth'),\n bandwidthAverage: __('Average intensive bandwidth')\n }\n ];\n\n /**\n * Download a data set as described by the provided descriptor and compute the duration.\n * @param {object} data The data set descriptor to use for download\n * @param {Function} cb A callback function called at the end of the download.\n * This callback is also called if a timeout breaks the download;\n * @private\n */\n function download(data, cb) {\n if (data.threshold && this.bandwidth < data.threshold) {\n return cb('threshold');\n }\n\n const start = window.performance.now();\n const url = `${context['root_url']}taoClientDiagnostic/views/js/tools/bandwidth/${data.file}?${Date.now()}`;\n const timeoutId = window.setTimeout(cb, data.timeout, 'timeout');\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.setRequestHeader('Accept', 'application/octet-stream');\n\n request.onload = () => {\n const end = window.performance.now();\n clearTimeout(timeoutId);\n\n const duration = end - start;\n const bytes = data.size;\n const seconds = duration / _second;\n\n // speed in Mbps\n const speed = (bytes * 8) / seconds / _mega;\n\n this.bandwidth = Math.max(this.bandwidth, speed);\n\n return cb(null, {\n id: data.id,\n file: data.file,\n size: data.size,\n duration,\n speed\n });\n };\n request.onerror = err => {\n clearTimeout(timeoutId);\n cb(err);\n };\n\n request.onreadystatechange = () => {\n if (request.readyState === 4 && request.status !== 200) {\n clearTimeout(timeoutId);\n cb(request.status);\n }\n };\n\n request.send();\n }\n\n /**\n * Performs a bandwidth test by downloading a bunch of data sets with different sizes\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {number} [config.ideal] - The thresholds for optimal bandwidth\n * @param {number} [config.max] - Maximum number of test takers to display\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function bandwidthTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n // override the feedback thresholds given by the config in case it is an empty array\n if (_.isArray(initConfig.feedbackThresholds) && !initConfig.feedbackThresholds.length) {\n initConfig.feedbackThresholds = _thresholds;\n }\n\n return {\n /**\n * Performs a bandwidth test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_downloadData, data => {\n const cb = download.bind(this, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n this.bandwidth = 0;\n\n async.series(tests, (err, measures) => {\n let duration = 0;\n let size = 0;\n const decimals = 2;\n const resultsBySize = {};\n\n function getValue(value) {\n let speed = 0;\n\n if (value) {\n duration += value.duration;\n size += value.size;\n\n speed = value.speed;\n value.speed = fixedDecimals(speed, decimals);\n }\n\n return speed;\n }\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n const results = stats(measures, getValue, decimals);\n\n _.forEach(_downloadData, (data, key) => {\n resultsBySize[key] = stats(\n _.filter(measures, o => o.id === key),\n getValue,\n decimals\n );\n });\n\n results.duration = fixedDecimals(duration / _second, decimals);\n results.size = size;\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results, resultsBySize);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n bandwidthMin: { message: labels.bandwidthMin, value: results.min + ' Mbps' },\n bandwidthMax: { message: labels.bandwidthMax, value: results.max + ' Mbps' },\n bandwidthAverage: { message: labels.bandwidthAverage, value: results.average + ' Mbps' }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} result\n * @param {number} result.max\n * @param {number} result.min\n * @param {number} result.average\n * @param {object} resultsBySize - result statistics grouped by size\n * @returns {object}\n */\n getFeedback(result, resultsBySize) {\n const avgResult = result.average;\n const bandwidthUnit = initConfig.unit;\n const threshold = initConfig.ideal;\n const maxTestTakers = initConfig.max;\n const max = threshold * bandwidthUnit;\n const getStatusOptions = initConfig.minimumGlobalPercentage\n ? { minimumGlobalPercentage: initConfig.minimumGlobalPercentage }\n : {};\n const baseBandwidth = avgResult;\n let stable = true;\n\n _.forEach(resultsBySize, resultBySize => {\n if (resultBySize.min / resultBySize.average < initConfig.fallbackThreshold) {\n stable = false;\n }\n });\n\n const status = getStatus((baseBandwidth / max) * 100, initConfig.feedbackThresholds, getStatusOptions);\n\n let nb = Math.floor(baseBandwidth / bandwidthUnit);\n\n if (nb > maxTestTakers) {\n nb = '>' + maxTestTakers;\n }\n\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.legend = labels.legend;\n status.quality.label = nb;\n\n if (!stable) {\n status.feedback.type = 'warning';\n status.feedback.message = __(\n 'Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience.'\n );\n status.feedback.legend = __('Simultaneous test takers under normal connection conditions.');\n }\n\n if (nb.toString().length > 2) {\n status.quality.wide = true;\n }\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/upload/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'util/url',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, urlHelper, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Result of diagnostic\n * @type {Array}\n * @private\n */\n let data = [];\n\n /**\n * Default values for the upload speed tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'upload',\n\n // Size of data to sent to server during speed test in bytes\n size: _mega,\n\n // Optimal speed in bytes per second\n optimal: _mega\n };\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low upload speed'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average upload speed'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good upload speed'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Upload speed'),\n status: __('Checking upload speed...'),\n uploadAvg: __('Average upload speed'),\n uploadMax: __('Max upload speed')\n }\n ];\n\n /**\n * Generate random string of given length\n * @param {number} length\n */\n function generateStr(length) {\n let text = '';\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n }\n\n /**\n * Upload generated string to check upload speed.\n * @param {number} size of string to upload in bytes\n * @return {object} jqXHR\n */\n function upload(size) {\n const url = urlHelper.route('upload', 'CompatibilityChecker', 'taoClientDiagnostic', { cache: Date.now() });\n const str = generateStr(size);\n data = [];\n\n return $.ajax({\n url: url,\n type: 'POST',\n data: {\n upload: str\n },\n xhr: () => {\n const xhr = new window.XMLHttpRequest();\n const startTime = Date.now();\n // Upload progress\n xhr.upload.addEventListener(\n 'progress',\n evt => {\n if (evt.lengthComputable) {\n const passedTime = Date.now() - startTime;\n data.push({\n time: passedTime,\n loaded: evt.loaded,\n speed: (evt.loaded * 8) / _mega / (passedTime / 1000)\n });\n }\n },\n false\n );\n\n return xhr;\n }\n });\n }\n\n /**\n * Performs a upload speed test\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.size] - Size of data to sent to server during speed test in bytes\n * @param {number} [config.optimal] - Optimal speed in bytes per second\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function uploadTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs upload speed test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n upload(parseInt(initConfig.size, 10)).then(() => {\n let totalSpeed = 0;\n let maxSpeed = 0;\n\n _.forEach(data, val => {\n totalSpeed += val.speed;\n if (maxSpeed < val.speed) {\n maxSpeed = Math.round(val.speed * 100) / 100;\n }\n });\n const avgSpeed = Math.round((totalSpeed / data.length) * 100) / 100;\n const results = {\n max: maxSpeed,\n avg: avgSpeed,\n type: 'upload'\n };\n\n const status = this.getFeedback(avgSpeed);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n uploadAvg: { message: labels.uploadAvg, value: `${results.avg} Mbps` },\n uploadMax: { message: labels.uploadMax, value: `${results.max} Mbps` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal / _mega;\n const status = getStatus((100 / optimal) * result, _thresholds);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getPlatformInfo',['core/request', 'util/url', 'taoClientDiagnostic/tools/getConfig'], function(request, urlHelper, getConfig) {\n 'use strict';\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const defaultConfig = {\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic'\n };\n\n /**\n * Gets the URL of the platform tester\n * @param {Window} win\n * @param {string} action\n * @param {string} controller\n * @param {string} extension\n * @returns {string}\n * @private\n */\n function getTesterUrl(win, action, controller, extension) {\n const document = win.document;\n const navigator = win.navigator;\n const screen = win.screen;\n const params = {};\n let e = 0;\n let f = 0;\n\n // append the browser user agent\n params.ua = navigator.userAgent;\n\n // detect browser family\n e |= win.ActiveXObject ? 1 : 0;\n e |= win.opera ? 2 : 0;\n e |= win.chrome ? 4 : 0;\n e |= 'getBoxObjectFor' in document || 'mozInnerScreenX' in win ? 8 : 0;\n e |=\n 'WebKitCSSMatrix' in win || 'WebKitPoint' in win || 'webkitStorageInfo' in win || 'webkitURL' in win\n ? 16\n : 0;\n e |= e & 16 && {}.toString.toString().indexOf('\\n') === -1 ? 32 : 0;\n params.e = e;\n\n // gather info about browser functionality\n f |= 'sandbox' in document.createElement('iframe') ? 1 : 0;\n f |= 'WebSocket' in win ? 2 : 0;\n f |= win.Worker ? 4 : 0;\n f |= win.applicationCache ? 8 : 0;\n f |= win.history && win.history.pushState ? 16 : 0;\n f |= document.documentElement.webkitRequestFullScreen ? 32 : 0;\n f |= 'FileReader' in win ? 64 : 0;\n params.f = f;\n\n // append a unique ID\n params.r = Math.random()\n .toString(36)\n .substring(7);\n\n // get the screen size\n params.w = screen.width;\n params.h = screen.height;\n\n return urlHelper.route(action, controller, extension, params);\n }\n\n /**\n * Check the user browser and os.\n *\n * This helper performs a server request to gather information about the user browser and os.\n * @param {Window} window - Need an access to the window object\n * @param {object} config\n * @param {string} config.browserVersionAction - The name of the action to call to get the browser checker\n * @param {string} config.browserVersionController - The name of the controller to call to get the browser checker\n * @param {string} config.browserVersionExtension - The name of the extension containing the controller to call to get the browser checker\n * @returns {Promise}\n */\n return function getPlatformInfo(win, config) {\n config = getConfig(config, defaultConfig);\n\n const url = getTesterUrl(\n win,\n config.browserVersionAction,\n config.browserVersionController,\n config.browserVersionExtension\n );\n\n return request({ url, noToken: true });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/browser/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/request',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getPlatformInfo',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, urlHelper, loggerFactory, request, getConfig, getLabels, getPlatformInfo, getStatus) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/browser');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'browser',\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic',\n action: 'check',\n controller: 'DiagnosticChecker',\n browserslistUrl: 'https://oat-sa.github.io/browserslist-app-tao/api.json'\n };\n\n /**\n * Placeholder variables for custom messages\n * @type {object}\n * @private\n */\n const _placeHolders = {\n CURRENT_BROWSER: '%CURRENT_BROWSER%',\n CURRENT_OS: '%CURRENT_OS%'\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Operating system and web browser'),\n status: __('Checking the browser...'),\n browser: __('Web browser'),\n os: __('Operating system')\n }\n ];\n\n /**\n * Fallback name to recover from connectivity error\n * @param {string}\n * @private\n */\n const unknown = __('Unknown');\n\n /**\n * Performs a browser support test\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.action] - The name of the action to call to get the browser checker\n * @param {string} [config.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.extension] - The name of the extension containing the controller to call to get the browser checker\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n /**\n * Fetches the list of fully supported browsers\n * @returns {Promise}\n * @private\n */\n const fetchBrowserList = () => request({ url: initConfig.browserslistUrl, noToken: true }).catch(() => []);\n\n /**\n * Checks the current browser against the list of fully supported browsers\n * @param platformInfo\n * @returns {Promise}\n * @private\n */\n function checkBrowserSupport(platformInfo) {\n const currentDevice = platformInfo.isMobile ? 'mobile' : 'desktop';\n const currentOS = platformInfo.os.toLowerCase();\n const currentBrowser = platformInfo.browser.toLowerCase();\n const currentVersion = platformInfo.browserVersion;\n return fetchBrowserList().then(list =>\n list.some(entry => {\n const { browser, device, os, versions } = entry;\n\n if (currentDevice !== device) {\n return false;\n }\n\n if (os && os.toLowerCase() !== currentOS) {\n return false;\n }\n\n if (browser.toLowerCase() !== currentBrowser) {\n return false;\n }\n\n // Using lodash because of IE support.\n // Some useful traversal algorithms are needed and they don't have polyfill in our bundles.\n // The versions come with an inconsistent format and they need to be processed upfront.\n return _(versions)\n .map(version => version.split('-'))\n .flatten()\n .value()\n .some(version => currentVersion.localeCompare(version, void 0, { numeric: true }) >= 0);\n }, {})\n );\n }\n\n return {\n /**\n * Performs a browser support test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n getPlatformInfo(window, initConfig)\n .catch(err => {\n logger.error(err);\n return {\n browser: unknown,\n browserVersion: '',\n os: unknown,\n osVersion: '',\n isMobile: false\n };\n })\n .then(platformInfo =>\n checkBrowserSupport(platformInfo).then(browserSupported =>\n Object.assign(platformInfo, { browserSupported })\n )\n )\n .then(platformInfo => {\n request({\n url: urlHelper.route(initConfig.action, initConfig.controller, initConfig.extension),\n data: platformInfo,\n method: 'POST',\n noToken: true\n })\n .catch(() => {\n return {\n success: false,\n type: 'error',\n message: __('Unable to validate the data as the server did not respond in time.')\n };\n })\n .then(data => {\n const percentage = 'success' === data.type ? 100 : 'warning' === data.type ? 33 : 0;\n const status = this.getFeedback(percentage, data);\n const summary = this.getSummary(platformInfo);\n\n status.customMsgRenderer = customMsg => {\n return (customMsg || '')\n .replace(_placeHolders.CURRENT_BROWSER, summary.browser.value)\n .replace(_placeHolders.CURRENT_OS, summary.os.value);\n };\n\n done(status, summary, platformInfo);\n });\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const currentBrowser = `${results.browser} ${results.browserVersion}`;\n const currentOs = `${results.os} ${results.osVersion}`;\n return {\n browser: {\n message: labels.browser,\n value: currentBrowser\n },\n os: {\n message: labels.os,\n value: currentOs\n }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @param {object} data\n * @returns {object}\n */\n getFeedback(result, data) {\n const status = getStatus(result, data);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                  \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                  \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                  \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                  \";\n return buffer;\n }\n\nfunction program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                  \";\n if (helper = helpers.setup) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.setup); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                  \";\n return buffer;\n }\n\nfunction program7(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                  \\n \\n \\n

                  \\n

                  \\n \\n \\n

                  \\n \";\n return buffer;\n }\n\nfunction program9(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program10(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                  \\n \\n \\n

                  \\n

                  \\n \\n \\n

                  \\n \";\n return buffer;\n }\n\nfunction program12(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                  \\n \\n \\n

                  \\n \";\n return buffer;\n }\n\n buffer += \"
                  \\n\\n

                  \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                  \\n\\n
                  \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.setup), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                  \\n\\n
                  \\n \\n
                  \\n\\n
                    \\n\\n
                    \\n

                    \\n
                    \\n\\n
                    \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/result', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
                    \\n \\n \\n
                    \\n
                    \\n \";\n return buffer;\n }\n\n buffer += \"
                  • \\n

                    \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                    \\n
                    \\n\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.details), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                  • \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/details', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n return buffer;\n }\n\n buffer += \"
                    \\n

                    \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Details\", options) : helperMissing.call(depth0, \"__\", \"Details\", options)))\n + \"

                    \\n
                    \\n \\n \\n \";\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
                    \\n
                    \\n
                    \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
                    \";\n if (helper = helpers.legend) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.legend); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
                    \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
                    \";\n if (helper = helpers.customMsg) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.customMsg); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
                    \";\n return buffer;\n }\n\n buffer += \"
                    \\n \\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.legend), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.customMsg), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                    \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \" wide\";\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\";\n return buffer;\n }\n\n buffer += \"
                    \\n
                    \\n
                    \";\n return buffer;\n }); });\n","\ndefine('css!taoClientDiagnosticCss/diagnostics',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/diagnostic/diagnostic',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'ui/component',\n 'core/logger',\n 'core/store',\n 'core/request',\n 'core/dataProvider/request',\n 'ui/dialog/alert',\n 'ui/feedback',\n 'util/url',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/bandwidth/tester',\n 'taoClientDiagnostic/tools/upload/tester',\n 'taoClientDiagnostic/tools/browser/tester',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/getConfig',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/main',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/result',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar',\n 'css!taoClientDiagnosticCss/diagnostics'\n], function(\n $,\n _,\n __,\n async,\n component,\n loggerFactory,\n store,\n request,\n requestData,\n dialogAlert,\n feedback,\n urlHelper,\n performancesTester,\n bandwidthTester,\n uploadTester,\n browserTester,\n getStatus,\n getConfig,\n mainTpl,\n resultTpl,\n detailsTpl,\n feedbackTpl,\n qualityBarTpl\n) {\n 'use strict';\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/diagnostic');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n title: __('System Compatibility'),\n header: __(\n 'This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform.'\n ),\n info: __('Be aware that these tests will take up to several minutes.'),\n button: __('Test system compatibility'),\n actionStore: 'storeData',\n actionSchool: 'schoolName',\n controller: 'DiagnosticChecker',\n extension: 'taoClientDiagnostic',\n actionDropId: 'deleteId',\n storeAllRuns: false,\n configurableText: {}\n };\n\n /**\n * A list of thresholds for summary\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Your system requires a compatibility update, please contact your system administrator.'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Your system is not optimal, please contact your system administrator.'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Your system is fully compliant.'),\n type: 'success'\n }\n ];\n\n /**\n * Defines a diagnostic tool\n * @type {object}\n */\n const diagnostic = {\n /**\n * Updates the displayed status\n * @param {string} status\n * @returns {diagnostic}\n * @private\n */\n changeStatus(status) {\n if (this.is('rendered')) {\n this.controls.$status.html(status);\n }\n return this;\n },\n\n /**\n * Sends the detailed stats to the server\n * @param {string} type The type of stats\n * @param {object} data The stats details\n * @param {Function} done A callback method called once server has responded\n */\n store(type, data, done) {\n const config = this.config;\n const url = urlHelper.route(config.actionStore, config.controller, config.extension, config.storeParams);\n\n data = _.omit(data, 'values');\n data.type = type;\n\n request({ url, data, method: 'POST', noToken: true })\n .then(done)\n .catch(err => {\n logger.error(err);\n feedback().error(__('Unable to save the results! Please check your connection.'));\n done();\n });\n },\n\n /**\n * Retrieve a custom message from the config\n * @param key\n * @returns {*}\n */\n getCustomMsg(key) {\n return this.config.configurableText[key];\n },\n\n /**\n * Enrich the feedback object with a custom message if the test has failed\n * @param {object} status - the test result\n * @param {string} msg - the custom message\n */\n addCustomFeedbackMsg(status, msg) {\n if (this.hasFailed(status) && msg) {\n if (_.isFunction(status.customMsgRenderer)) {\n msg = status.customMsgRenderer(msg);\n }\n status.feedback = status.feedback || {};\n status.feedback.customMsg = msg;\n }\n },\n\n /**\n * Check if a result is considered as failed\n * @param {object} result\n * @returns {boolean}\n */\n hasFailed(result) {\n return !(result && result.feedback && result.feedback.type === 'success');\n },\n\n /**\n * Add a result row\n * @param {object} result\n * @returns {diagnostic}\n */\n addResult(result) {\n if (this.is('rendered')) {\n // adjust the width of the displayed label, if any, to the text length\n if (result.quality && result.quality.label && result.quality.label.toString().length > 2) {\n result.quality.wide = true;\n }\n\n // create and append the result to the displayed list\n const $main = $(resultTpl(result));\n const $result = $main.find('.result');\n if (result.feedback) {\n $result.append($(feedbackTpl(result.feedback)));\n }\n if (result.quality) {\n $result.append($(qualityBarTpl(result.quality)));\n }\n if (result.details) {\n $main.find('.details').append($(detailsTpl(result.details)));\n }\n\n const $indicator = $main.find('.quality-indicator');\n this.controls.$results.append($main);\n\n // the result is hidden by default, show it with a little animation\n $main.fadeIn(() => {\n if ($indicator.length) {\n $indicator.animate({\n left: (result.percentage * $main.outerWidth()) / 100 - $indicator.outerWidth() / 2\n });\n }\n });\n }\n\n return this;\n },\n\n /**\n * Removes the last results if any\n * @returns {diagnostic}\n */\n cleanUp() {\n this.controls.$results.empty();\n return this;\n },\n\n /**\n * Enables the start button\n * @returns {diagnostic}\n */\n enable() {\n this.controls.$start.removeClass('hidden');\n return this;\n },\n\n /**\n * Disables the start button\n * @returns {diagnostic}\n */\n disable() {\n this.controls.$start.addClass('hidden');\n return this;\n },\n\n /**\n * Does some preparations before starting the diagnostics\n * @returns {diagnostic}\n * @private\n */\n prepare() {\n /**\n * Notifies the diagnostic start\n * @event diagnostic#start\n */\n this.trigger('start');\n this.changeStatus(__('Starting...'));\n this.setState('running', true);\n this.setState('done', false);\n\n // first we need a clean space to display the results, so remove the last results if any\n this.cleanUp();\n\n // remove the start button during the diagnostic\n this.disable();\n\n return this;\n },\n\n /**\n * Does some post process after ending the diagnostics\n * @returns {diagnostic}\n * @private\n */\n finish() {\n const config = this.config;\n\n // restore the start button to allow a new diagnostic run\n this.enable();\n\n if (config.storeAllRuns) {\n this.deleteIdentifier();\n }\n\n /**\n * Notifies the diagnostic end\n * @event diagnostic#end\n */\n this.trigger('end');\n this.changeStatus(__('Done!'));\n this.setState('running', false);\n this.setState('done', true);\n\n return this;\n },\n\n /**\n * delete unique id for this test session (next test will generate new one)\n */\n deleteIdentifier() {\n const url = urlHelper.route(this.config.actionDropId, this.config.controller, this.config.extension);\n return request({ url, method: 'POST', noToken: true });\n },\n\n /**\n * Runs the diagnostics\n * @returns {diagnostic}\n */\n run() {\n const information = [];\n const scores = {};\n const testers = [];\n const customInput = this.getCustomInput();\n\n const doRun = () => {\n // common handling for testers\n const doCheck = (testerConfig, cb) => {\n const testerId = testerConfig.id;\n\n /**\n * Notifies the start of a tester operation\n * @event diagnostic#starttester\n * @param {string} name - The name of the tester\n */\n this.trigger('starttester', testerId);\n this.setState(testerId, true);\n\n /**\n * Process the diagnostic from the loaded tester\n * @param {Function} testerFactory\n * @private\n */\n const processTester = testerFactory => {\n const tester = testerFactory(getConfig(testerConfig, this.config), this);\n this.changeStatus(tester.labels.status);\n tester.start((status, details, results) => {\n if (testerConfig.customMsgKey) {\n const customMsg = this.getCustomMsg(testerConfig.customMsgKey);\n this.addCustomFeedbackMsg(status, customMsg);\n }\n\n // the returned details must be ingested into the main details list\n _.forEach(details, info => information.push(info));\n scores[status.id] = status;\n\n /**\n * Notifies the end of a tester operation\n * @event diagnostic#endtester\n * @param {string} id - The identifier of the tester\n * @param {Array} results - The results of the test\n */\n this.trigger('endtester', testerId, status);\n this.setState(testerId, false);\n\n // results should be filtered in order to encode complex data\n results = _.mapValues(results, value => {\n switch (typeof value) {\n case 'boolean':\n return value ? 1 : 0;\n case 'object':\n return JSON.stringify(value);\n }\n return value;\n });\n\n // send the data to store\n this.store(testerId, results, () => {\n this.addResult(status);\n cb();\n });\n });\n };\n\n /**\n * React to loading failure\n * @param {Error} err\n * @private\n */\n const processFailure = err => {\n logger.error(err);\n feedback().error(\n __(\n 'Unable to process with the diagnostic tester %s. The tester module is unreachable.',\n testerId\n )\n );\n cb();\n };\n\n require([testerConfig.tester], processTester, processFailure);\n };\n\n if (this.is('rendered')) {\n // set up the component to a new run\n this.prepare();\n\n _.forEach(this.config.testers, (testerConfig, testerId) => {\n testerConfig.id = testerConfig.id || testerId;\n if (testerConfig.enabled) {\n testers.push(cb => doCheck(testerConfig, cb));\n }\n });\n\n // launch each testers in series, then display the results\n async.series(testers, () => {\n // pick the lowest percentage as the main score\n const total = _.minBy(scores, 'globalPercentage');\n\n // get a status according to the main score\n const status = getStatus(total.globalPercentage, _thresholds);\n\n // display the result\n status.title = __('Total');\n status.id = 'total';\n this.addCustomFeedbackMsg(status, this.config.configurableText.diagTotalCheckResult);\n\n status.details = information;\n this.addResult(status);\n\n // done !\n this.finish();\n });\n }\n };\n\n if (_.size(customInput) > 0) {\n this.store('custom_input', customInput, doRun);\n } else {\n doRun();\n }\n\n return this;\n },\n\n getCustomInput() {\n const vars = {};\n\n window.location.href.replace(location.hash, '').replace(/[?&]+([^=&]+)=?([^&]*)?/gi, (m, key, value) => {\n if (_.has(this.config['customInput'], key)) {\n vars[key] = typeof value !== 'undefined' ? value : '';\n }\n });\n\n return vars;\n }\n };\n\n /**\n * Builds an instance of the diagnostic tool\n * @param {object} container - Container in which the initialisation will render the diagnostic\n * @param {object} config\n * @param {string} [config.title] - The displayed title\n * @param {string} [config.header] - A header text displayed to describe the component\n * @param {string} [config.info] - An information text displayed to warn about run duration\n * @param {string} [config.button] - The caption of the start button\n * @param {string} [config.actionStore] - The name of the action to call to store the results\n * @param {string} [config.actionCheck] - The name of the action to call to check the browser results\n * @param {string} [config.actionSchool] - The name of the action to call to get the school name\n * @param {string} [config.controller] - The name of the controller to call\n * @param {string} [config.extension] - The name of the extension containing the controller\n * @param {object} [config.storeParams] - A list of additional parameters to send with diagnostic results\n * @param {boolean} [config.requireSchoolName] - If `true` require a school name to allow the tests to start\n * @param {boolean} [config.requireSchoolId] - If `true` require a school ID to allow the tests to start\n * @param {boolean} [config.validateSchoolName] - If `true` require a school number and a PIN to get the school name and to allow the tests to start\n *\n * @param {string} [config.browser.action] - The name of the action to call to get the browser checker\n * @param {string} [config.browser.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.browser.extension] - The name of the extension containing the controller to call to get the browser checker\n *\n * @param {number} [config.bandwidth.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {Array} [config.bandwidth.ideal] - The thresholds for optimal bandwidth, one by bar\n * @param {number} [config.bandwidth.max] - Maximum number of test takers to display\n *\n * @param {Array} [config.performances.samples] - A list of samples to render in order to compute the rendering performances\n * @param {number} [config.performances.occurrences] - The number of renderings by samples\n * @param {number} [config.performances.timeout] - Max allowed duration for a sample rendering\n * @param {number} [config.performances.optimal] - The threshold for optimal performances\n * @param {number} [config.performances.threshold] - The threshold for minimal performances\n * @returns {diagnostic}\n */\n return function diagnosticFactory(container, config) {\n // fix the translations for content loaded from config files\n if (config) {\n _.forEach(['title', 'header', 'footer', 'info', 'button'], name => {\n if (config[name]) {\n config[name] = __(config[name]);\n }\n });\n }\n\n const diagComponent = component(diagnostic, _defaults)\n .setTemplate(mainTpl)\n\n // uninstalls the component\n .on('destroy', function onDiagnosticDestroy() {\n this.controls = null;\n })\n\n // initialise component\n .on('init', function onDiagnosticInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticRender() {\n /**\n * Starts the tests\n * @param {object} [data]\n * @private\n */\n const runDiagnostics = data => {\n // append the school name to the queries\n if (data && _.isPlainObject(data)) {\n this.config.storeParams = _.assign(this.config.storeParams || {}, data);\n }\n\n this.run();\n };\n\n /**\n * Default launcher\n * @private\n */\n let launch = () => runDiagnostics();\n\n /**\n * Gets a control by its registered name\n * @param {string} name - the name registered in the collection of controls\n * @private\n */\n const getControl = name => this.controls[`\\$${name}`];\n\n /**\n * Gets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @returns {string}\n * @private\n */\n function getInputValue(name) {\n const $control = getControl(name);\n return (($control && $control.val()) || '').trim();\n }\n\n /**\n * Sets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @param {string} value\n * @private\n */\n function setInputValue(name, value) {\n const $control = getControl(name);\n $control && $control.val(value);\n }\n\n /**\n * Enable/Disable a control\n * @param {string} name - the name registered in the collection of controls\n * @param {boolean} [state]\n * @private\n */\n function toggleControl(name, state) {\n const $control = getControl(name);\n if ($control) {\n if (typeof state === 'undefined') {\n state = !$control.is(':enabled');\n }\n if (state) {\n $control.prop('disabled', false);\n } else {\n $control.prop('disabled', true);\n }\n }\n }\n\n /**\n * Requests the server to get the school name\n * @param {object} values\n * @private\n */\n const requestSchoolName = values => {\n const componentConfig = this.config;\n return requestData(\n urlHelper.route(\n componentConfig.actionSchool,\n componentConfig.controller,\n componentConfig.extension\n ),\n values,\n 'POST'\n ).then(data => {\n return {\n school_name: data,\n school_number: values.school_number\n };\n });\n };\n\n /**\n * Install the school name manager.\n * @todo: improve this by moving it into a plugin, and obviously implement the plugin handling\n * @private\n */\n const manageSchoolProperties = (fields, validate) => {\n /**\n * Checks if the start button can be enabled\n * @returns {boolean}\n * @private\n */\n function toggleStart() {\n const allow = _.every(fields, getInputValue);\n toggleControl('start', allow);\n return allow;\n }\n\n /**\n * Enables/Disables the fields\n * @param {boolean} state\n * @private\n */\n function toggleFields(state) {\n _.forEach(fields, function(fieldName) {\n toggleControl(fieldName, state);\n });\n }\n\n // ensure the diagnostic cannot start without all fields properly input\n _.forEach(fields, fieldName => {\n this.controls[`\\$${fieldName}`] = this.getElement()\n .find(`[data-control=\"${fieldName}\"]`)\n .on('keypress', e => {\n const shouldStart = e.which === 13;\n if (shouldStart) {\n e.preventDefault();\n }\n _.defer(() => {\n if (toggleStart() && shouldStart) {\n this.controls.$start.click();\n }\n });\n });\n });\n\n toggleStart();\n\n // will store the school name in the browser storage, that will allow to restore it next time\n toggleFields(false);\n store('client-diagnostic')\n .then(storage => {\n // store the school name on test start, to ensure consistency\n this.on('start.school', () => {\n _.forEach(fields, fieldName => {\n storage.setItem(fieldName, getInputValue(fieldName)).catch(error => {\n logger.error(error);\n });\n });\n });\n\n // restore the school name on load\n return Promise.all(\n _.map(fields, fieldName => {\n return storage.getItem(fieldName).then(value => {\n setInputValue(fieldName, value);\n });\n })\n );\n })\n .catch(error => {\n logger.error(error);\n })\n .then(() => {\n toggleFields(true);\n toggleStart();\n });\n\n // ensure the fields are validated and the school name is properly sent before allowing to launch the test\n launch = () => {\n const values = _.reduce(\n fields,\n (result, fieldName) => {\n result[fieldName] = getInputValue(fieldName);\n return result;\n },\n {}\n );\n\n this.changeStatus(__('Getting school name...'))\n .cleanUp()\n .disable();\n\n if (_.isFunction(validate)) {\n validate(values)\n .then(runDiagnostics)\n .catch(error => {\n const response = error.response || {};\n const message =\n response.errorMsg ||\n response.errorMessage ||\n __('An error occurred! Please verify your input!');\n dialogAlert(message);\n logger.error(error);\n this.changeStatus(__('Failed to get school name')).enable();\n });\n } else {\n runDiagnostics(values);\n }\n };\n\n // ensure the fields are not writable while the test is running\n this.on('start.school', () => {\n toggleFields(false);\n }).on('end.school', () => {\n toggleFields(true);\n });\n };\n\n // get access to all needed placeholders\n this.controls = {\n $start: this.$component.find('[data-action=\"test-launcher\"]'),\n $status: this.$component.find('.status h2'),\n $results: this.$component.find('.results')\n };\n\n // start the diagnostic\n this.controls.$start.on('click', () => {\n this.controls.$start.is(':enabled') && launch();\n });\n\n if (this.config.requireSchoolName) {\n if (this.config.validateSchoolName) {\n manageSchoolProperties(['school_number', 'school_pin'], requestSchoolName);\n } else {\n manageSchoolProperties(['school_name']);\n }\n }\n\n if (this.config.requireSchoolId) {\n manageSchoolProperties(['school_id', 'workstation']);\n }\n\n // show result details\n this.controls.$results.on('click', 'button[data-action=\"show-details\"]', function onShowDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.removeClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"hide-details\"]').removeClass('hidden');\n });\n\n // hide result details\n this.controls.$results.on('click', 'button[data-action=\"hide-details\"]', function onHideDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.addClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"show-details\"]').removeClass('hidden');\n });\n });\n\n _.defer(() => diagComponent.init(config));\n\n return diagComponent;\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/templates/diagnostic/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.diagInstructions), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                    \";\n if (helper = helpers.diagInstructions) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.diagInstructions); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                    \";\n return buffer;\n }\n\nfunction program4(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                    \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                    \";\n return buffer;\n }\n\nfunction program6(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                    \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                    \";\n return buffer;\n }\n\nfunction program8(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                    \\n \\n \\n

                    \\n \";\n return buffer;\n }\n\nfunction program10(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(13, program13, data),fn:self.program(11, program11, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program11(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                    \\n \\n \\n

                    \\n

                    \\n \\n \\n

                    \\n \";\n return buffer;\n }\n\nfunction program13(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                    \\n \\n \\n

                    \\n \";\n return buffer;\n }\n\n buffer += \"
                    \\n\\n

                    \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                    \\n\\n
                    \\n \";\n stack1 = helpers['with'].call(depth0, (depth0 && depth0.configurableText), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n

                    \\n \\n \\n

                    \\n
                    \\n\\n
                    \\n \\n
                    \\n\\n
                      \\n\\n
                      \\n

                      \\n
                      \\n\\n
                      \";\n return buffer;\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/Diagnostic/diagnostic',[\n 'module',\n 'jquery',\n 'i18n',\n 'helpers',\n 'core/request',\n 'layout/loading-bar',\n 'ui/actionbar',\n 'ui/feedback',\n 'taoClientDiagnostic/tools/diagnostic/diagnostic',\n 'tpl!taoClientDiagnostic/templates/diagnostic/main'\n], function(module, $, __, helpers, request, loadingBar, actionbar, feedback, diagnosticFactory, diagnosticTpl) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-runner';\n\n // the page is always loading data when starting\n loadingBar.start();\n\n /**\n * Controls the readiness check page\n * @type {object}\n */\n return {\n /**\n * Entry point of the page\n */\n start() {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const $list = $container.find('.list');\n const $panel = $('.panel');\n const extensionConfig = $container.data('config') || {};\n const config = extensionConfig.diagnostic || extensionConfig;\n const indexUrl = helpers._url('index', 'Diagnostic', extension);\n const buttons = [];\n const moduleConfig = module.config() || {};\n\n config.configurableText = moduleConfig.configurableText || {};\n\n /**\n * Installs the diagnostic tool GUI\n * @param {string} [workstation]\n */\n function installTester(workstation) {\n diagnosticFactory($list, config)\n .setTemplate(diagnosticTpl)\n .on('render', function onDiagnosticRender() {\n // get access to the input\n this.controls.$workstation = this.getElement()\n .find('[data-control=\"workstation\"]')\n .on('keypress', e => {\n if (e.which === 13) {\n e.preventDefault();\n this.run();\n }\n })\n .val(workstation);\n\n loadingBar.stop();\n if (config.autoStart) {\n this.run();\n }\n })\n .on('start', function onDiagnosticStart() {\n // append the workstation name to the queries\n this.config.storeParams = this.config.storeParams || {};\n this.config.storeParams.workstation = this.controls.$workstation.val();\n\n // disable the input when running the test\n this.controls.$workstation.prop('disabled', true);\n loadingBar.start();\n })\n .on('end', function onDiagnosticEnd() {\n // enable the input when the test is complete\n this.controls.$workstation.prop('disabled', false);\n loadingBar.stop();\n });\n }\n\n buttons.push({\n id: 'back',\n icon: 'step-backward',\n title: __('Return to the list'),\n label: __('List of readiness checks'),\n action() {\n window.location.href = indexUrl;\n }\n });\n\n // tool: close tab, this won't be present in an LTI iframe\n // button should always be right most\n if (window.self === window.top) {\n buttons.push({\n id: 'exitButton',\n icon: 'close',\n title: __('Exit'),\n label: __('Exit'),\n action() {\n window.self.close();\n }\n });\n }\n\n actionbar({\n renderTo: $panel,\n buttons\n });\n\n // need to know the workstation name to display it\n const url = helpers._url('workstation', 'DiagnosticChecker', extension);\n request({ url, noToken: true })\n .then(data => installTester(data && data.workstation))\n .catch(() => {\n feedback().error(__('Unable to get the workstation name!'));\n installTester();\n });\n }\n };\n});\n\n","!function(e,t,i){\"use strict\";\"function\"==typeof define&&define.amd?define('taoClientDiagnostic/lib/fingerprint/fingerprint2',i):\"undefined\"!=typeof module&&module.exports?module.exports=i():t.exports?t.exports=i():t[e]=i()}(\"Fingerprint2\",this,function(){\"use strict\";var e=function(t){if(!(this instanceof e))return new e(t);var i={swfContainerId:\"fingerprintjs2\",swfPath:\"flash/compiled/FontList.swf\",detectScreenOrientation:!0,sortPluginsFor:[/palemoon/i],userDefinedFonts:[]};this.options=this.extend(t,i),this.nativeForEach=Array.prototype.forEach,this.nativeMap=Array.prototype.map};return e.prototype={extend:function(e,t){if(null==e)return t;for(var i in e)null!=e[i]&&t[i]!==e[i]&&(t[i]=e[i]);return t},get:function(e){var t=this,i={data:[],push:function(e){var i=e.key,a=e.value;\"function\"==typeof t.options.preprocessor&&(a=t.options.preprocessor(i,a)),this.data.push({key:i,value:a})}};i=this.userAgentKey(i),i=this.languageKey(i),i=this.colorDepthKey(i),i=this.pixelRatioKey(i),i=this.hardwareConcurrencyKey(i),i=this.screenResolutionKey(i),i=this.availableScreenResolutionKey(i),i=this.timezoneOffsetKey(i),i=this.sessionStorageKey(i),i=this.localStorageKey(i),i=this.indexedDbKey(i),i=this.addBehaviorKey(i),i=this.openDatabaseKey(i),i=this.cpuClassKey(i),i=this.platformKey(i),i=this.doNotTrackKey(i),i=this.pluginsKey(i),i=this.canvasKey(i),i=this.webglKey(i),i=this.adBlockKey(i),i=this.hasLiedLanguagesKey(i),i=this.hasLiedResolutionKey(i),i=this.hasLiedOsKey(i),i=this.hasLiedBrowserKey(i),i=this.touchSupportKey(i),i=this.customEntropyFunction(i),this.fontsKey(i,function(i){var a=[];t.each(i.data,function(e){var t=e.value;\"undefined\"!=typeof e.value.join&&(t=e.value.join(\";\")),a.push(t)});var r=t.x64hash128(a.join(\"~~~\"),31);return e(r,i.data)})},customEntropyFunction:function(e){return\"function\"==typeof this.options.customFunction&&e.push({key:\"custom\",value:this.options.customFunction()}),e},userAgentKey:function(e){return this.options.excludeUserAgent||e.push({key:\"user_agent\",value:this.getUserAgent()}),e},getUserAgent:function(){return navigator.userAgent},languageKey:function(e){return this.options.excludeLanguage||e.push({key:\"language\",value:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||\"\"}),e},colorDepthKey:function(e){return this.options.excludeColorDepth||e.push({key:\"color_depth\",value:screen.colorDepth||-1}),e},pixelRatioKey:function(e){return this.options.excludePixelRatio||e.push({key:\"pixel_ratio\",value:this.getPixelRatio()}),e},getPixelRatio:function(){return window.devicePixelRatio||\"\"},screenResolutionKey:function(e){return this.options.excludeScreenResolution?e:this.getScreenResolution(e)},getScreenResolution:function(e){var t;return t=this.options.detectScreenOrientation&&screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height],\"undefined\"!=typeof t&&e.push({key:\"resolution\",value:t}),e},availableScreenResolutionKey:function(e){return this.options.excludeAvailableScreenResolution?e:this.getAvailableScreenResolution(e)},getAvailableScreenResolution:function(e){var t;return screen.availWidth&&screen.availHeight&&(t=this.options.detectScreenOrientation?screen.availHeight>screen.availWidth?[screen.availHeight,screen.availWidth]:[screen.availWidth,screen.availHeight]:[screen.availHeight,screen.availWidth]),\"undefined\"!=typeof t&&e.push({key:\"available_resolution\",value:t}),e},timezoneOffsetKey:function(e){return this.options.excludeTimezoneOffset||e.push({key:\"timezone_offset\",value:(new Date).getTimezoneOffset()}),e},sessionStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasSessionStorage()&&e.push({key:\"session_storage\",value:1}),e},localStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasLocalStorage()&&e.push({key:\"local_storage\",value:1}),e},indexedDbKey:function(e){return!this.options.excludeIndexedDB&&this.hasIndexedDB()&&e.push({key:\"indexed_db\",value:1}),e},addBehaviorKey:function(e){return document.body&&!this.options.excludeAddBehavior&&document.body.addBehavior&&e.push({key:\"add_behavior\",value:1}),e},openDatabaseKey:function(e){return!this.options.excludeOpenDatabase&&window.openDatabase&&e.push({key:\"open_database\",value:1}),e},cpuClassKey:function(e){return this.options.excludeCpuClass||e.push({key:\"cpu_class\",value:this.getNavigatorCpuClass()}),e},platformKey:function(e){return this.options.excludePlatform||e.push({key:\"navigator_platform\",value:this.getNavigatorPlatform()}),e},doNotTrackKey:function(e){return this.options.excludeDoNotTrack||e.push({key:\"do_not_track\",value:this.getDoNotTrack()}),e},canvasKey:function(e){return!this.options.excludeCanvas&&this.isCanvasSupported()&&e.push({key:\"canvas\",value:this.getCanvasFp()}),e},webglKey:function(e){return this.options.excludeWebGL?e:this.isWebGlSupported()?(e.push({key:\"webgl\",value:this.getWebglFp()}),e):e},adBlockKey:function(e){return this.options.excludeAdBlock||e.push({key:\"adblock\",value:this.getAdBlock()}),e},hasLiedLanguagesKey:function(e){return this.options.excludeHasLiedLanguages||e.push({key:\"has_lied_languages\",value:this.getHasLiedLanguages()}),e},hasLiedResolutionKey:function(e){return this.options.excludeHasLiedResolution||e.push({key:\"has_lied_resolution\",value:this.getHasLiedResolution()}),e},hasLiedOsKey:function(e){return this.options.excludeHasLiedOs||e.push({key:\"has_lied_os\",value:this.getHasLiedOs()}),e},hasLiedBrowserKey:function(e){return this.options.excludeHasLiedBrowser||e.push({key:\"has_lied_browser\",value:this.getHasLiedBrowser()}),e},fontsKey:function(e,t){return this.options.excludeJsFonts?this.flashFontsKey(e,t):this.jsFontsKey(e,t)},flashFontsKey:function(e,t){return this.options.excludeFlashFonts?t(e):this.hasSwfObjectLoaded()&&this.hasMinFlashInstalled()?\"undefined\"==typeof this.options.swfPath?t(e):void this.loadSwfAndDetectFonts(function(i){e.push({key:\"swf_fonts\",value:i.join(\";\")}),t(e)}):t(e)},jsFontsKey:function(e,t){var i=this;return setTimeout(function(){var a=[\"monospace\",\"sans-serif\",\"serif\"],r=[\"Andale Mono\",\"Arial\",\"Arial Black\",\"Arial Hebrew\",\"Arial MT\",\"Arial Narrow\",\"Arial Rounded MT Bold\",\"Arial Unicode MS\",\"Bitstream Vera Sans Mono\",\"Book Antiqua\",\"Bookman Old Style\",\"Calibri\",\"Cambria\",\"Cambria Math\",\"Century\",\"Century Gothic\",\"Century Schoolbook\",\"Comic Sans\",\"Comic Sans MS\",\"Consolas\",\"Courier\",\"Courier New\",\"Garamond\",\"Geneva\",\"Georgia\",\"Helvetica\",\"Helvetica Neue\",\"Impact\",\"Lucida Bright\",\"Lucida Calligraphy\",\"Lucida Console\",\"Lucida Fax\",\"LUCIDA GRANDE\",\"Lucida Handwriting\",\"Lucida Sans\",\"Lucida Sans Typewriter\",\"Lucida Sans Unicode\",\"Microsoft Sans Serif\",\"Monaco\",\"Monotype Corsiva\",\"MS Gothic\",\"MS Outlook\",\"MS PGothic\",\"MS Reference Sans Serif\",\"MS Sans Serif\",\"MS Serif\",\"MYRIAD\",\"MYRIAD PRO\",\"Palatino\",\"Palatino Linotype\",\"Segoe Print\",\"Segoe Script\",\"Segoe UI\",\"Segoe UI Light\",\"Segoe UI Semibold\",\"Segoe UI Symbol\",\"Tahoma\",\"Times\",\"Times New Roman\",\"Times New Roman PS\",\"Trebuchet MS\",\"Verdana\",\"Wingdings\",\"Wingdings 2\",\"Wingdings 3\"],n=[\"Abadi MT Condensed Light\",\"Academy Engraved LET\",\"ADOBE CASLON PRO\",\"Adobe Garamond\",\"ADOBE GARAMOND PRO\",\"Agency FB\",\"Aharoni\",\"Albertus Extra Bold\",\"Albertus Medium\",\"Algerian\",\"Amazone BT\",\"American Typewriter\",\"American Typewriter Condensed\",\"AmerType Md BT\",\"Andalus\",\"Angsana New\",\"AngsanaUPC\",\"Antique Olive\",\"Aparajita\",\"Apple Chancery\",\"Apple Color Emoji\",\"Apple SD Gothic Neo\",\"Arabic Typesetting\",\"ARCHER\",\"ARNO PRO\",\"Arrus BT\",\"Aurora Cn BT\",\"AvantGarde Bk BT\",\"AvantGarde Md BT\",\"AVENIR\",\"Ayuthaya\",\"Bandy\",\"Bangla Sangam MN\",\"Bank Gothic\",\"BankGothic Md BT\",\"Baskerville\",\"Baskerville Old Face\",\"Batang\",\"BatangChe\",\"Bauer Bodoni\",\"Bauhaus 93\",\"Bazooka\",\"Bell MT\",\"Bembo\",\"Benguiat Bk BT\",\"Berlin Sans FB\",\"Berlin Sans FB Demi\",\"Bernard MT Condensed\",\"BernhardFashion BT\",\"BernhardMod BT\",\"Big Caslon\",\"BinnerD\",\"Blackadder ITC\",\"BlairMdITC TT\",\"Bodoni 72\",\"Bodoni 72 Oldstyle\",\"Bodoni 72 Smallcaps\",\"Bodoni MT\",\"Bodoni MT Black\",\"Bodoni MT Condensed\",\"Bodoni MT Poster Compressed\",\"Bookshelf Symbol 7\",\"Boulder\",\"Bradley Hand\",\"Bradley Hand ITC\",\"Bremen Bd BT\",\"Britannic Bold\",\"Broadway\",\"Browallia New\",\"BrowalliaUPC\",\"Brush Script MT\",\"Californian FB\",\"Calisto MT\",\"Calligrapher\",\"Candara\",\"CaslonOpnface BT\",\"Castellar\",\"Centaur\",\"Cezanne\",\"CG Omega\",\"CG Times\",\"Chalkboard\",\"Chalkboard SE\",\"Chalkduster\",\"Charlesworth\",\"Charter Bd BT\",\"Charter BT\",\"Chaucer\",\"ChelthmITC Bk BT\",\"Chiller\",\"Clarendon\",\"Clarendon Condensed\",\"CloisterBlack BT\",\"Cochin\",\"Colonna MT\",\"Constantia\",\"Cooper Black\",\"Copperplate\",\"Copperplate Gothic\",\"Copperplate Gothic Bold\",\"Copperplate Gothic Light\",\"CopperplGoth Bd BT\",\"Corbel\",\"Cordia New\",\"CordiaUPC\",\"Cornerstone\",\"Coronet\",\"Cuckoo\",\"Curlz MT\",\"DaunPenh\",\"Dauphin\",\"David\",\"DB LCD Temp\",\"DELICIOUS\",\"Denmark\",\"DFKai-SB\",\"Didot\",\"DilleniaUPC\",\"DIN\",\"DokChampa\",\"Dotum\",\"DotumChe\",\"Ebrima\",\"Edwardian Script ITC\",\"Elephant\",\"English 111 Vivace BT\",\"Engravers MT\",\"EngraversGothic BT\",\"Eras Bold ITC\",\"Eras Demi ITC\",\"Eras Light ITC\",\"Eras Medium ITC\",\"EucrosiaUPC\",\"Euphemia\",\"Euphemia UCAS\",\"EUROSTILE\",\"Exotc350 Bd BT\",\"FangSong\",\"Felix Titling\",\"Fixedsys\",\"FONTIN\",\"Footlight MT Light\",\"Forte\",\"FrankRuehl\",\"Fransiscan\",\"Freefrm721 Blk BT\",\"FreesiaUPC\",\"Freestyle Script\",\"French Script MT\",\"FrnkGothITC Bk BT\",\"Fruitger\",\"FRUTIGER\",\"Futura\",\"Futura Bk BT\",\"Futura Lt BT\",\"Futura Md BT\",\"Futura ZBlk BT\",\"FuturaBlack BT\",\"Gabriola\",\"Galliard BT\",\"Gautami\",\"Geeza Pro\",\"Geometr231 BT\",\"Geometr231 Hv BT\",\"Geometr231 Lt BT\",\"GeoSlab 703 Lt BT\",\"GeoSlab 703 XBd BT\",\"Gigi\",\"Gill Sans\",\"Gill Sans MT\",\"Gill Sans MT Condensed\",\"Gill Sans MT Ext Condensed Bold\",\"Gill Sans Ultra Bold\",\"Gill Sans Ultra Bold Condensed\",\"Gisha\",\"Gloucester MT Extra Condensed\",\"GOTHAM\",\"GOTHAM BOLD\",\"Goudy Old Style\",\"Goudy Stout\",\"GoudyHandtooled BT\",\"GoudyOLSt BT\",\"Gujarati Sangam MN\",\"Gulim\",\"GulimChe\",\"Gungsuh\",\"GungsuhChe\",\"Gurmukhi MN\",\"Haettenschweiler\",\"Harlow Solid Italic\",\"Harrington\",\"Heather\",\"Heiti SC\",\"Heiti TC\",\"HELV\",\"Herald\",\"High Tower Text\",\"Hiragino Kaku Gothic ProN\",\"Hiragino Mincho ProN\",\"Hoefler Text\",\"Humanst 521 Cn BT\",\"Humanst521 BT\",\"Humanst521 Lt BT\",\"Imprint MT Shadow\",\"Incised901 Bd BT\",\"Incised901 BT\",\"Incised901 Lt BT\",\"INCONSOLATA\",\"Informal Roman\",\"Informal011 BT\",\"INTERSTATE\",\"IrisUPC\",\"Iskoola Pota\",\"JasmineUPC\",\"Jazz LET\",\"Jenson\",\"Jester\",\"Jokerman\",\"Juice ITC\",\"Kabel Bk BT\",\"Kabel Ult BT\",\"Kailasa\",\"KaiTi\",\"Kalinga\",\"Kannada Sangam MN\",\"Kartika\",\"Kaufmann Bd BT\",\"Kaufmann BT\",\"Khmer UI\",\"KodchiangUPC\",\"Kokila\",\"Korinna BT\",\"Kristen ITC\",\"Krungthep\",\"Kunstler Script\",\"Lao UI\",\"Latha\",\"Leelawadee\",\"Letter Gothic\",\"Levenim MT\",\"LilyUPC\",\"Lithograph\",\"Lithograph Light\",\"Long Island\",\"Lydian BT\",\"Magneto\",\"Maiandra GD\",\"Malayalam Sangam MN\",\"Malgun Gothic\",\"Mangal\",\"Marigold\",\"Marion\",\"Marker Felt\",\"Market\",\"Marlett\",\"Matisse ITC\",\"Matura MT Script Capitals\",\"Meiryo\",\"Meiryo UI\",\"Microsoft Himalaya\",\"Microsoft JhengHei\",\"Microsoft New Tai Lue\",\"Microsoft PhagsPa\",\"Microsoft Tai Le\",\"Microsoft Uighur\",\"Microsoft YaHei\",\"Microsoft Yi Baiti\",\"MingLiU\",\"MingLiU_HKSCS\",\"MingLiU_HKSCS-ExtB\",\"MingLiU-ExtB\",\"Minion\",\"Minion Pro\",\"Miriam\",\"Miriam Fixed\",\"Mistral\",\"Modern\",\"Modern No. 20\",\"Mona Lisa Solid ITC TT\",\"Mongolian Baiti\",\"MONO\",\"MoolBoran\",\"Mrs Eaves\",\"MS LineDraw\",\"MS Mincho\",\"MS PMincho\",\"MS Reference Specialty\",\"MS UI Gothic\",\"MT Extra\",\"MUSEO\",\"MV Boli\",\"Nadeem\",\"Narkisim\",\"NEVIS\",\"News Gothic\",\"News GothicMT\",\"NewsGoth BT\",\"Niagara Engraved\",\"Niagara Solid\",\"Noteworthy\",\"NSimSun\",\"Nyala\",\"OCR A Extended\",\"Old Century\",\"Old English Text MT\",\"Onyx\",\"Onyx BT\",\"OPTIMA\",\"Oriya Sangam MN\",\"OSAKA\",\"OzHandicraft BT\",\"Palace Script MT\",\"Papyrus\",\"Parchment\",\"Party LET\",\"Pegasus\",\"Perpetua\",\"Perpetua Titling MT\",\"PetitaBold\",\"Pickwick\",\"Plantagenet Cherokee\",\"Playbill\",\"PMingLiU\",\"PMingLiU-ExtB\",\"Poor Richard\",\"Poster\",\"PosterBodoni BT\",\"PRINCETOWN LET\",\"Pristina\",\"PTBarnum BT\",\"Pythagoras\",\"Raavi\",\"Rage Italic\",\"Ravie\",\"Ribbon131 Bd BT\",\"Rockwell\",\"Rockwell Condensed\",\"Rockwell Extra Bold\",\"Rod\",\"Roman\",\"Sakkal Majalla\",\"Santa Fe LET\",\"Savoye LET\",\"Sceptre\",\"Script\",\"Script MT Bold\",\"SCRIPTINA\",\"Serifa\",\"Serifa BT\",\"Serifa Th BT\",\"ShelleyVolante BT\",\"Sherwood\",\"Shonar Bangla\",\"Showcard Gothic\",\"Shruti\",\"Signboard\",\"SILKSCREEN\",\"SimHei\",\"Simplified Arabic\",\"Simplified Arabic Fixed\",\"SimSun\",\"SimSun-ExtB\",\"Sinhala Sangam MN\",\"Sketch Rockwell\",\"Skia\",\"Small Fonts\",\"Snap ITC\",\"Snell Roundhand\",\"Socket\",\"Souvenir Lt BT\",\"Staccato222 BT\",\"Steamer\",\"Stencil\",\"Storybook\",\"Styllo\",\"Subway\",\"Swis721 BlkEx BT\",\"Swiss911 XCm BT\",\"Sylfaen\",\"Synchro LET\",\"System\",\"Tamil Sangam MN\",\"Technical\",\"Teletype\",\"Telugu Sangam MN\",\"Tempus Sans ITC\",\"Terminal\",\"Thonburi\",\"Traditional Arabic\",\"Trajan\",\"TRAJAN PRO\",\"Tristan\",\"Tubular\",\"Tunga\",\"Tw Cen MT\",\"Tw Cen MT Condensed\",\"Tw Cen MT Condensed Extra Bold\",\"TypoUpright BT\",\"Unicorn\",\"Univers\",\"Univers CE 55 Medium\",\"Univers Condensed\",\"Utsaah\",\"Vagabond\",\"Vani\",\"Vijaya\",\"Viner Hand ITC\",\"VisualUI\",\"Vivaldi\",\"Vladimir Script\",\"Vrinda\",\"Westminster\",\"WHITNEY\",\"Wide Latin\",\"ZapfEllipt BT\",\"ZapfHumnst BT\",\"ZapfHumnst Dm BT\",\"Zapfino\",\"Zurich BlkEx BT\",\"Zurich Ex BT\",\"ZWAdobeF\"];i.options.extendedJsFonts&&(r=r.concat(n)),r=r.concat(i.options.userDefinedFonts);var o=\"mmmmmmmmmmlli\",s=\"72px\",l=document.getElementsByTagName(\"body\")[0],h=document.createElement(\"div\"),u=document.createElement(\"div\"),c={},d={},g=function(){var e=document.createElement(\"span\");return e.style.position=\"absolute\",e.style.left=\"-9999px\",e.style.fontSize=s,e.style.lineHeight=\"normal\",e.innerHTML=o,e},p=function(e,t){var i=g();return i.style.fontFamily=\"'\"+e+\"',\"+t,i},f=function(){for(var e=[],t=0,i=a.length;tt.name?1:e.name=0?\"Windows Phone\":t.indexOf(\"win\")>=0?\"Windows\":t.indexOf(\"android\")>=0?\"Android\":t.indexOf(\"linux\")>=0?\"Linux\":t.indexOf(\"iphone\")>=0||t.indexOf(\"ipad\")>=0?\"iOS\":t.indexOf(\"mac\")>=0?\"Mac\":\"Other\";var r;if(r=\"ontouchstart\"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0,r&&\"Windows Phone\"!==e&&\"Android\"!==e&&\"iOS\"!==e&&\"Other\"!==e)return!0;if(\"undefined\"!=typeof i){if(i=i.toLowerCase(),i.indexOf(\"win\")>=0&&\"Windows\"!==e&&\"Windows Phone\"!==e)return!0;if(i.indexOf(\"linux\")>=0&&\"Linux\"!==e&&\"Android\"!==e)return!0;if(i.indexOf(\"mac\")>=0&&\"Mac\"!==e&&\"iOS\"!==e)return!0;if(0===i.indexOf(\"win\")&&0===i.indexOf(\"linux\")&&i.indexOf(\"mac\")>=0&&\"other\"!==e)return!0}return a.indexOf(\"win\")>=0&&\"Windows\"!==e&&\"Windows Phone\"!==e||((a.indexOf(\"linux\")>=0||a.indexOf(\"android\")>=0||a.indexOf(\"pike\")>=0)&&\"Linux\"!==e&&\"Android\"!==e||((a.indexOf(\"mac\")>=0||a.indexOf(\"ipad\")>=0||a.indexOf(\"ipod\")>=0||a.indexOf(\"iphone\")>=0)&&\"Mac\"!==e&&\"iOS\"!==e||(0===a.indexOf(\"win\")&&0===a.indexOf(\"linux\")&&a.indexOf(\"mac\")>=0&&\"other\"!==e||\"undefined\"==typeof navigator.plugins&&\"Windows\"!==e&&\"Windows Phone\"!==e)))},getHasLiedBrowser:function(){var e,t=navigator.userAgent.toLowerCase(),i=navigator.productSub;if(e=t.indexOf(\"firefox\")>=0?\"Firefox\":t.indexOf(\"opera\")>=0||t.indexOf(\"opr\")>=0?\"Opera\":t.indexOf(\"chrome\")>=0?\"Chrome\":t.indexOf(\"safari\")>=0?\"Safari\":t.indexOf(\"trident\")>=0?\"Internet Explorer\":\"Other\",(\"Chrome\"===e||\"Safari\"===e||\"Opera\"===e)&&\"20030107\"!==i)return!0;var a=eval.toString().length;if(37===a&&\"Safari\"!==e&&\"Firefox\"!==e&&\"Other\"!==e)return!0;if(39===a&&\"Internet Explorer\"!==e&&\"Other\"!==e)return!0;if(33===a&&\"Chrome\"!==e&&\"Opera\"!==e&&\"Other\"!==e)return!0;var r;try{throw\"a\"}catch(n){try{n.toSource(),r=!0}catch(o){r=!1}}return!(!r||\"Firefox\"===e||\"Other\"===e)},isCanvasSupported:function(){var e=document.createElement(\"canvas\");return!(!e.getContext||!e.getContext(\"2d\"))},isWebGlSupported:function(){if(!this.isCanvasSupported())return!1;var e,t=document.createElement(\"canvas\");try{e=t.getContext&&(t.getContext(\"webgl\")||t.getContext(\"experimental-webgl\"))}catch(i){e=!1}return!!window.WebGLRenderingContext&&!!e},isIE:function(){return\"Microsoft Internet Explorer\"===navigator.appName||!(\"Netscape\"!==navigator.appName||!/Trident/.test(navigator.userAgent))},hasSwfObjectLoaded:function(){return\"undefined\"!=typeof window.swfobject},hasMinFlashInstalled:function(){return swfobject.hasFlashPlayerVersion(\"9.0.0\")},addFlashDivNode:function(){var e=document.createElement(\"div\");e.setAttribute(\"id\",this.options.swfContainerId),document.body.appendChild(e)},loadSwfAndDetectFonts:function(e){var t=\"___fp_swf_loaded\";window[t]=function(t){e(t)};var i=this.options.swfContainerId;this.addFlashDivNode();var a={onReady:t},r={allowScriptAccess:\"always\",menu:\"false\"};swfobject.embedSWF(this.options.swfPath,i,\"1\",\"1\",\"9.0.0\",!1,a,r,{})},getWebglCanvas:function(){var e=document.createElement(\"canvas\"),t=null;try{t=e.getContext(\"webgl\")||e.getContext(\"experimental-webgl\")}catch(i){}return t||(t=null),t},each:function(e,t,i){if(null!==e)if(this.nativeForEach&&e.forEach===this.nativeForEach)e.forEach(t,i);else if(e.length===+e.length){for(var a=0,r=e.length;a>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Multiply:function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Rotl:function(e,t){return t%=64,32===t?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},x64LeftShift:function(e,t){return t%=64,0===t?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=this.x64Multiply(e,[4283543511,3981806797]),e=this.x64Xor(e,[0,e[0]>>>1]),e=this.x64Multiply(e,[3301882366,444984403]),e=this.x64Xor(e,[0,e[0]>>>1])},x64hash128:function(e,t){\ne=e||\"\",t=t||0;for(var i=e.length%16,a=e.length-i,r=[0,t],n=[0,t],o=[0,0],s=[0,0],l=[2277735313,289559509],h=[1291169091,658871167],u=0;u>>0).toString(16)).slice(-8)+(\"00000000\"+(r[1]>>>0).toString(16)).slice(-8)+(\"00000000\"+(n[0]>>>0).toString(16)).slice(-8)+(\"00000000\"+(n[1]>>>0).toString(16)).slice(-8)}},e.VERSION=\"1.5.1\",e});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fingerprint/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/store',\n 'core/format',\n 'lib/uuid',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/lib/fingerprint/fingerprint2'\n], function($, _, __, url, loggerFactory, store, format, uuid, getConfig, getLabels, getStatus, Fingerprint2) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/fingerprint');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'fingerprint'\n };\n\n /**\n * The names of the storage keys used to persist info on the browser\n * @type {object}\n * @private\n */\n const _storageKeys = {\n store: 'client-diagnostic',\n uuid: 'uuid',\n fingerprint: 'value',\n details: 'details',\n errors: 'errors',\n changed: 'changed'\n };\n\n /**\n * List of threshold values, for each kind of context\n * @type {object}\n * @private\n */\n const _thresholdValues = {\n error: 0,\n storageIssue: 50,\n changedFingerprint: 90,\n success: 100\n };\n\n /**\n * A list of thresholds\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: _thresholdValues.error,\n message: __('Cannot get your fingerprint'),\n type: 'error'\n },\n {\n threshold: _thresholdValues.storageIssue,\n message: __(\n 'Your fingerprint is %s. However we encountered issue while retrieving the data. Maybe your available disk space is too small'\n ),\n type: 'warning'\n },\n {\n threshold: _thresholdValues.changedFingerprint,\n message: __(\n 'Your fingerprint is %s. However it seems it has changed since the last check. It could be related to changes in your system.'\n ),\n type: 'success'\n },\n {\n threshold: _thresholdValues.success,\n message: __('Your fingerprint is %s'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Fingerprint'),\n status: __('Computing the fingerprint...'),\n fingerprintValue: __('Fingerprint'),\n fingerprintUUID: __('Dynamic UID'),\n fingerprintDetails: __('Fingerprint sources'),\n fingerprintChanged: __('Change since last fingerprint'),\n fingerprintErrors: __('Fingerprint errors'),\n fingerprintError: __('Fingerprint error')\n }\n ];\n\n /**\n * Performs a browser fingerprint capture\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserFingerprint(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs a browser fingerprint capture, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n let browserId = 'error';\n let lastFingerprint = 'error';\n let freshBrowserId = false;\n let newFingerprint = false;\n let browserStorage;\n const errors = [];\n\n function handleError(error) {\n errors.push({\n key: 'error',\n value: '' + error\n });\n logger.error(error);\n }\n\n function getStorageKey(key) {\n return `${initConfig.id}-${_storageKeys[key]}`;\n }\n\n store(_storageKeys.store)\n .then(storage => {\n browserStorage = storage;\n return Promise.all([\n browserStorage.getItem(getStorageKey('uuid')).then(value => {\n browserId = value;\n }),\n browserStorage.getItem(getStorageKey('fingerprint')).then(value => {\n lastFingerprint = value;\n })\n ]);\n })\n .catch(handleError)\n .then(() => {\n return new Promise(resolve => {\n new Fingerprint2().get((result, details) => {\n const results = {};\n results[_storageKeys.fingerprint] = ('' + result).toUpperCase();\n results[_storageKeys.details] = details;\n resolve(results);\n });\n });\n })\n .then(results => {\n const pendingPromises = [];\n const resultFingerprint = results[_storageKeys.fingerprint];\n\n if (!browserId) {\n browserId = uuid(32, 16);\n freshBrowserId = true;\n }\n\n newFingerprint = lastFingerprint !== resultFingerprint && lastFingerprint !== 'error';\n\n // update the results with storage state\n // also detect a change in the fingerprint\n // (if the browser already have a uuid in the storage but the fingerprint changes)\n results[_storageKeys.uuid] = browserId;\n results[_storageKeys.changed] = newFingerprint && !freshBrowserId;\n\n if (browserStorage) {\n if (freshBrowserId) {\n pendingPromises.push(browserStorage.setItem(getStorageKey('uuid'), browserId));\n }\n if (newFingerprint) {\n pendingPromises.push(\n browserStorage.setItem(getStorageKey('fingerprint'), resultFingerprint)\n );\n }\n }\n\n return Promise.all(pendingPromises)\n .catch(handleError)\n .then(() => results);\n })\n .catch(handleError)\n .then(results => {\n results = results || {};\n if (errors.length) {\n results[_storageKeys.errors] = errors.length;\n results[_storageKeys.details] = (results[_storageKeys.details] || []).concat(errors);\n }\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results);\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const sources = _(results[_storageKeys.details])\n .map('key')\n .pull('error')\n .value();\n const summary = {\n fingerprintValue: {\n message: labels.fingerprintValue,\n value: results[_storageKeys.fingerprint]\n },\n fingerprintDetails: {\n message: labels.fingerprintDetails,\n value: __('%d sources (%s)', _.size(sources), sources.join(', '))\n },\n fingerprintChanged: {\n message: labels.fingerprintChanged,\n value: results[_storageKeys.changed] ? __('Yes') : __('No')\n }\n };\n\n if (results[_storageKeys.errors]) {\n summary.fingerprintErrors = {\n message: labels.fingerprintErrors,\n value: results[_storageKeys.errors]\n };\n\n _.forEach(results[_storageKeys.details], (details, idx) => {\n if (details.key === 'error') {\n summary['fingerprintError' + idx] = {\n message: labels.fingerprintError,\n value: details.value\n };\n }\n });\n }\n\n return summary;\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} results\n * @returns {object}\n */\n getFeedback(results) {\n let percentage;\n\n if (!results || !results[_storageKeys.fingerprint] || results[_storageKeys.fingerprint] === 'error') {\n percentage = _thresholdValues.error;\n } else if (results[_storageKeys.uuid] === 'error') {\n percentage = _thresholdValues.storageIssue;\n } else if (results[_storageKeys.changed]) {\n percentage = _thresholdValues.changedFingerprint;\n } else {\n percentage = _thresholdValues.success;\n }\n\n const status = getStatus(percentage, _thresholds);\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.message = format(status.feedback.message, results && results[_storageKeys.fingerprint]);\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this, functionType=\"function\";\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n\\n \";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.errors), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n \\n\";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \" errors\";\n }\n\nfunction program4(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Errors occurred! Please see details\", options) : helperMissing.call(depth0, \"__\", \"Errors occurred! Please see details\", options)))\n + \"\\\"\";\n return buffer;\n }\n\nfunction program6(depth0,data) {\n \n \n return \" \";\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.value), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/csvExporter',['jquery', 'lodash', 'i18n', 'core/request', 'layout/loading-bar', 'helpers'], function(\n $,\n _,\n __,\n request,\n loadingBar,\n helpers\n) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-index';\n\n /**\n * Export diagnostics to CSV\n * @type {object}\n */\n return {\n /**\n * Exports all diagnostics to CSV\n * @param {Array} model - data presentation model\n */\n exportCsv(model) {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const serviceUrl = helpers._url('diagnosticData', 'Diagnostic', extension);\n\n // filtering and transforming diagnostic data according to the model\n function mappingDiagnosticsData(diagnostics) {\n return diagnostics.map(diagnostic => {\n const result = {};\n _.forEach(model, field => {\n result[field.id] = field.transform\n ? field.transform(diagnostic[field.id], diagnostic)\n : diagnostic[field.id];\n });\n return result;\n });\n }\n\n // a string variable is created containing the contents of the csv file\n function arrayToCsv(data, columnDelimiter = ',', lineDelimiter = '\\n') {\n const keys = Object.keys(data[0]);\n let result = `${keys.join(columnDelimiter)}${lineDelimiter}`;\n data.forEach(item => {\n let ctr = 0;\n keys.forEach(key => {\n if (ctr > 0) {\n result += columnDelimiter;\n }\n result +=\n typeof item[key] === 'string' && item[key].includes(columnDelimiter)\n ? `\"${item[key]}\"`\n : item[key];\n ctr++;\n });\n result += lineDelimiter;\n });\n return result;\n }\n\n // file download from content\n function downloadFile(content, filename, type) {\n const blob = new Blob([content], { type: type });\n const url = URL.createObjectURL(blob);\n let link = $('');\n link.attr('download', filename)\n .attr('href', url)\n .get(0)\n .click();\n\n URL.revokeObjectURL(url);\n\n link = null;\n }\n\n loadingBar.start();\n\n request({\n url: serviceUrl,\n data: { rows: Number.MAX_SAFE_INTEGER },\n noToken: true\n })\n .then(response => {\n const mappedData = mappingDiagnosticsData(response.data);\n let csvContent = arrayToCsv(mappedData);\n downloadFile(csvContent, __('diagnostics.csv'), 'text/csv');\n loadingBar.stop();\n })\n .catch(() => {\n loadingBar.stop();\n });\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/controller/Diagnostic/index',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'helpers',\n 'moment',\n 'core/request',\n 'layout/loading-bar',\n 'util/encode',\n 'ui/feedback',\n 'ui/dialog',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/fingerprint/tester',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'taoClientDiagnostic/tools/csvExporter',\n 'ui/datatable',\n 'lib/moment-timezone.min'\n], function(\n $,\n _,\n __,\n helpers,\n moment,\n request,\n loadingBar,\n encode,\n feedback,\n dialog,\n getStatus,\n performancesTesterFactory,\n fingerprintTesterFactory,\n fingerprintTpl,\n detailsTpl,\n csvExporter\n) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-index';\n\n /**\n * Default Time Zone for date\n * @type {string}\n * @private\n */\n const defaultDateTimeZone = 'UTC';\n\n /**\n * Default date format\n * @type {string}\n * @private\n */\n const defaultDateFormat = 'Y/MM/DD HH:mm:ss';\n\n /**\n * Format a number with decimals\n * @param {number} value - The number to format\n * @param {number|string} [digits] - The number of decimals\n * @returns {number}\n * @private\n */\n function formatNumber(value, digits) {\n const nb = 'undefined' === typeof digits ? 2 : Math.max(0, parseInt(digits, 10));\n const factor = Math.pow(10, nb) || 1;\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Format a bandwidth value\n * @param {number} value\n * @returns {number|string}\n * @private\n */\n function formatBandwidth(value) {\n if (value > 100) {\n return '> 100';\n }\n\n return formatNumber(value);\n }\n\n /**\n * Transform date to local timezone\n * @param {string} date\n * @returns {string}\n * @private\n */\n function transformDateToLocal(date) {\n let time;\n\n if (_.isFinite(date)) {\n if (!_.isNumber(date)) {\n date = _.parseInt(date, 10);\n }\n const d = new Date(date * 1000);\n time = moment.utc(d);\n } else {\n time = moment.tz(date, defaultDateTimeZone);\n }\n\n return time.tz(moment.tz.guess()).format(defaultDateFormat);\n }\n\n // the page is always loading data when starting\n loadingBar.start();\n\n /**\n * Controls the readiness check page\n */\n return {\n /**\n * Entry point of the page\n */\n start() {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const $list = $container.find('.list');\n let dataset = $container.data('set');\n const extensionConfig = $container.data('config') || {};\n const config = extensionConfig.diagnostic || extensionConfig;\n const installedExtension = $container.data('installedextension') || false;\n const diagnosticUrl = helpers._url('diagnostic', 'Diagnostic', extension);\n const removeUrl = helpers._url('remove', 'Diagnostic', extension);\n const serviceUrl = helpers._url('diagnosticData', 'Diagnostic', extension);\n const performancesTester = performancesTesterFactory(config.testers.performance || {});\n const fingerprintTester = fingerprintTesterFactory(config.testers.fingerprint || {});\n\n const tools = [];\n const actions = [];\n const model = [];\n\n // request the server with a selection of readiness check results\n function requestData(url, selection, message) {\n if (selection && selection.length) {\n loadingBar.start();\n\n request({\n url,\n data: {\n id: selection\n },\n method: 'POST',\n noToken: true\n })\n .then(response => {\n loadingBar.stop();\n\n if (response && response.success) {\n if (message) {\n feedback().success(message);\n }\n $list.datatable('refresh');\n } else {\n feedback().error(\n `${__('Something went wrong ...')}
                      ${encode.html(response.error)}`,\n {\n encodeHtml: false\n }\n );\n }\n })\n .catch(() => loadingBar.stop());\n }\n }\n\n // request the server to remove the selected diagnostic-index\n function remove(selection) {\n requestData(removeUrl, selection, __('The readiness check result have been removed'));\n }\n\n // tool: page refresh\n tools.push({\n id: 'refresh',\n icon: 'reset',\n title: __('Refresh the page'),\n label: __('Refresh'),\n action() {\n $list.datatable('refresh');\n }\n });\n\n // tool: readiness check\n tools.push({\n id: 'launch',\n icon: 'play',\n title: __('Launch another readiness check'),\n label: __('Launch readiness check'),\n action() {\n window.location.href = diagnosticUrl;\n }\n });\n\n if (config.export) {\n // tool: export csv\n tools.push({\n id: 'csvExport',\n icon: 'export',\n title: __('Export CSV'),\n label: __('Export CSV'),\n action() {\n csvExporter.exportCsv(model);\n }\n });\n }\n\n if (installedExtension) {\n // tool: compatibility via lti\n tools.push({\n id: 'lti',\n icon: 'play',\n title: __('Try a test delivery'),\n label: __('Try a test delivery'),\n action() {\n window.location.href = deliveryUrl;\n }\n });\n }\n\n // tool: remove selected results\n tools.push({\n id: 'remove',\n icon: 'remove',\n title: __('Remove the selected readiness check results'),\n label: __('Remove'),\n massAction: true,\n action(selection) {\n dialog({\n message: __('The selected readiness check results will be removed. Continue ?'),\n autoRender: true,\n autoDestroy: true,\n onOkBtn() {\n remove(selection);\n }\n });\n }\n });\n\n // tool: close tab, this won't be present in an LTI iframe\n // button should always be right most\n if (window.self === window.top) {\n tools.push({\n id: 'exitButton',\n icon: 'close',\n title: __('Exit'),\n label: __('Exit'),\n action() {\n window.self.close();\n }\n });\n }\n\n // action: remove the result\n actions.push({\n id: 'remove',\n icon: 'remove',\n title: __('Remove the readiness check result?'),\n action(id) {\n dialog({\n autoRender: true,\n autoDestroy: true,\n message: __('The readiness check result will be removed. Continue ?'),\n onOkBtn() {\n remove([id]);\n }\n });\n }\n });\n\n // column: Workstation identifier\n model.push({\n id: 'workstation',\n label: __('Workstation')\n });\n\n // column: School name\n if (config.requireSchoolName) {\n model.push({\n id: 'school_name',\n label: __('School name')\n });\n }\n\n // column: School id\n if (config.requireSchoolId) {\n model.push({\n id: 'school_id',\n label: __('School id')\n });\n }\n\n // column: School number\n if (config.validateSchoolName) {\n model.push({\n id: 'school_number',\n label: __('School number')\n });\n }\n\n // results of fingerprinting\n if (config.testers.fingerprint && config.testers.fingerprint.enabled) {\n // column: Fingerprint of the workstation\n model.push({\n id: 'fingerprint-cell',\n label: __('Fingerprint'),\n transform(v, row) {\n return fingerprintTpl(row.fingerprint);\n }\n });\n\n $list.on('click.fingerprint', '.fingerprint-cell span.details', function(e) {\n const id = $(e.target)\n .closest('tr')\n .data('itemIdentifier');\n const row = _.find(dataset.data, { id: id });\n if (row) {\n dialog({\n content: detailsTpl(fingerprintTester.getSummary(row.fingerprint)),\n buttons: 'ok',\n autoRender: true,\n autoDestroy: true\n });\n }\n });\n }\n\n // results of screen test\n if (config.testers.screen && config.testers.screen.enabled) {\n // column: Screen Width and Height\n model.push({\n id: 'screen_size',\n label: __('Screen resolution'),\n transform(value, row) {\n if (row.screen && row.screen.width && row.screen.height) {\n return row.screen.width + 'x' + row.screen.height;\n }\n }\n });\n }\n\n // results of browser test\n if (config.testers.browser && config.testers.browser.enabled) {\n // column: Operating system information\n model.push({\n id: 'os',\n label: __('OS')\n });\n\n // column: Browser information\n model.push({\n id: 'browser',\n label: __('Browser')\n });\n }\n\n // results of performances test\n if (config.testers.performance && config.testers.performance.enabled) {\n // column: Performances of the workstation\n model.push({\n id: 'performance',\n label: __('Performances'),\n transform(value) {\n const status = performancesTester.getFeedback(value);\n return status.feedback && status.feedback.message;\n }\n });\n }\n\n // results of bandwidth test\n if (config.testers.bandwidth && config.testers.bandwidth.enabled) {\n // column: Available bandwidth\n model.push({\n id: 'bandwidth',\n label: __('Bandwidth'),\n transform: formatBandwidth\n });\n }\n\n // results of intensive bandwidth test\n if (config.testers.intensive_bandwidth && config.testers.intensive_bandwidth.enabled) {\n // column: Available bandwidth\n model.push({\n id: 'intensive_bandwidth',\n label: __('Intensive bandwidth'),\n transform: formatBandwidth\n });\n }\n\n // results of upload speed test\n if (config.testers.upload && config.testers.upload.enabled) {\n // column: Available upload speed\n model.push({\n id: 'upload',\n label: __('Upload speed'),\n transform: formatBandwidth\n });\n }\n\n // column: Date of diagnostic\n model.push({\n id: 'date',\n label: __('Date'),\n transform: transformDateToLocal\n });\n\n $list\n .on('query.datatable', () => loadingBar.start())\n .on('load.datatable', (e, data) => {\n dataset = data;\n loadingBar.stop();\n })\n .datatable(\n {\n url: serviceUrl,\n status: {\n empty: __('No readiness checks have been done!'),\n available: __('Readiness checks already done'),\n loading: __('Loading')\n },\n selectable: true,\n tools,\n actions,\n model\n },\n dataset\n );\n }\n };\n});\n\n","\ndefine('css!taoClientDiagnosticCss/exclusion-list-form',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n *\n */\ndefine('taoClientDiagnostic/controller/ExclusionList/editInstance',['jquery', 'ui/tooltipster', 'select2', 'css!taoClientDiagnosticCss/exclusion-list-form'], function(\n $,\n tooltipster\n) {\n 'use strict';\n\n return {\n start() {}\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 Open Assessment Technologies SA\n */\ndefine('taoClientDiagnostic/controller/routes',{\n Authenticator: {\n actions: {\n login: 'controller/Authenticator/login'\n }\n },\n CompatibilityChecker: {\n actions: {\n index: 'controller/CompatibilityChecker/diagnostics'\n }\n },\n Diagnostic: {\n actions: {\n index: 'controller/Diagnostic/index',\n diagnostic: 'controller/Diagnostic/diagnostic'\n }\n },\n ExcludedBrowsers: {\n actions: {\n editInstance: 'controller/ExclusionList/editInstance'\n }\n },\n ExcludedOS: {\n actions: {\n editInstance: 'controller/ExclusionList/editInstance'\n }\n }\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\\\"Source Sans Pro\\\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\\\" - \\\"}table.datatable .progress .item-time:before{content:\\\" (\\\"}table.datatable .progress .item-time .total:before{content:\\\" / \\\"}table.datatable .progress .item-time:after{content:\\\")\\\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */.exclusion-list-form .xhtml_form input[type=text],.exclusion-list-form .xhtml_form select{width:60%}.exclusion-list-form .xhtml_form .icon-help.tooltipstered{float:right;line-height:25px}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/exclusion-list-form.css.map */');\n","\ndefine(\"taoClientDiagnostic/loader/taoClientDiagnostic.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoQtiItem/loader/taoQtiItem.min\",\"taoItems/loader/taoItems.min\"]);\n"],"mappings":"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"} \ No newline at end of file +{"version":3,"names":["loaderScript","document","getElementById","configUrl","getAttribute","bundle","loadController","controllerOptions","controllerPath","params","JSON","parse","err","window","require","controller","startController","started","start","addEventListener","readyState","loadBundles","loaded","bundles","concat","filter","item","index","indexOf","forEach","length","define","$","feedback","showMessages","container","$feedbackBox","data","error","showMessage","hb","template","Handlebars","depth0","helpers","partials","compilerInfo","merge","helper","options","buffer","helperMissing","escapeExpression","__","hash","call","_","componentFactory","moduleLoader","context","module","componentTpl","loadingBar","diagnosticLoaderFactory","config","component","setTemplate","on","onDiagnosticLoaderInit","render","onDiagnosticLoaderRender","moduleConfig","identifiers","Object","keys","diagnostics","isFunction","addList","load","then","factories","componentConfig","getConfig","factory","factoryName","factoryConfig","getElement","onRender","autoStart","run","stop","trigger","defer","init","diagnosticFactory","$contentArea","fixedDecimals","value","decimals","shift","Math","pow","abs","round","_Mathfloor","floor","_Mathmax","max","_Mathmin","min","valueGetter","name","stats","list","fieldName","_Mathceil","ceil","_Mathsqrt","sqrt","_NumberMAX_VALUE","Number","MAX_VALUE","getValue","values","count","sum","reduce","push","average","sum2","diff","variance","sort","middle","median","results","key","defaults","omitBy","_Mathmax2","_Mathmin2","getLabels","messages","level","Array","isArray","parseInt","_Mathmax3","getStatus","percentage","thresholds","opts","testPercentage","globalPercentage","minimumGlobalPercentage","status","quality","len","i","step","threshold","clone","async","Loader","Renderer","_Mathabs","loadItem","done","qtiJsonFile","url","urlTokens","split","extension","fullpath","s","contexts","paths","baseUrl","replace","loader","renderer","getAssetManager","setData","itemData","loadItemData","performance","now","setRenderer","$container","appendTo","append","postRender","remove","end","duration","_second","result","id","getLoadedClasses","_defaultTimeout","_defaultOccurrencesCount","_defaultSamples","_defaults","optimal","_thresholds","message","type","_messages","title","performancesMin","performancesMax","performancesAverage","_sampleBaseId","performancesTester","initConfig","labels","idx","_samples","map","isEmpty","samples","sample","timeout","nb","occurrences","tests","cb","partial","iterations","series","measures","getFeedback","summary","getSummary","range","_Mathfloor2","_Mathmax4","download","bandwidth","root_url","file","Date","timeoutId","setTimeout","request","XMLHttpRequest","open","setRequestHeader","onload","clearTimeout","bytes","size","seconds","speed","_mega","onerror","onreadystatechange","send","_kilo","unit","ideal","feedbackThresholds","fallbackThreshold","_downloadData","\"10KB\"","\"100KB\"","\"1MB\"","legend","bandwidthMin","bandwidthMax","bandwidthAverage","bandwidthTester","bind","resultsBySize","o","avgResult","bandwidthUnit","maxTestTakers","getStatusOptions","baseBandwidth","stable","resultBySize","label","toString","wide","urlHelper","_Mathround","generateStr","text","possible","charAt","random","upload","route","cache","str","ajax","xhr","startTime","evt","lengthComputable","passedTime","time","uploadAvg","uploadMax","uploadTester","totalSpeed","maxSpeed","val","avgSpeed","avg","getTesterUrl","win","action","navigator","screen","e","f","ua","userAgent","ActiveXObject","opera","chrome","createElement","Worker","applicationCache","history","pushState","documentElement","webkitRequestFullScreen","r","substring","w","width","h","height","defaultConfig","browserVersionAction","browserVersionController","browserVersionExtension","getPlatformInfo","noToken","loggerFactory","logger","browserslistUrl","_placeHolders","CURRENT_BROWSER","CURRENT_OS","browser","os","unknown","browserTester","checkBrowserSupport","platformInfo","currentDevice","isMobile","currentOS","toLowerCase","currentBrowser","currentVersion","browserVersion","fetchBrowserList","some","entry","device","versions","version","flatten","localeCompare","numeric","catch","osVersion","browserSupported","assign","method","success","customMsgRenderer","customMsg","currentOs","program1","stack1","header","program3","info","program5","setup","program7","program9","validateSchoolName","inverse","self","program","program12","fn","program10","functionType","noop","requireSchoolId","requireSchoolName","button","details","each","store","requestData","dialogAlert","mainTpl","resultTpl","detailsTpl","feedbackTpl","qualityBarTpl","actionStore","actionSchool","actionDropId","storeAllRuns","configurableText","diagnostic","changeStatus","is","controls","$status","html","storeParams","omit","getCustomMsg","addCustomFeedbackMsg","msg","hasFailed","addResult","$main","$result","find","$indicator","$results","fadeIn","animate","left","outerWidth","cleanUp","empty","enable","$start","removeClass","disable","addClass","prepare","setState","finish","deleteIdentifier","information","scores","testers","customInput","getCustomInput","doRun","doCheck","testerConfig","testerId","processTester","testerFactory","tester","customMsgKey","mapValues","stringify","processFailure","enabled","total","minBy","diagTotalCheckResult","vars","location","href","m","has","diagComponent","onDiagnosticDestroy","onDiagnosticInit","onDiagnosticRender","getInputValue","$control","getControl","trim","setInputValue","toggleControl","state","prop","runDiagnostics","isPlainObject","launch","requestSchoolName","school_name","school_number","manageSchoolProperties","fields","validate","toggleStart","allow","every","toggleFields","shouldStart","which","preventDefault","click","storage","setItem","Promise","all","getItem","response","errorMsg","errorMessage","$component","onShowDetails","$btn","closest","$details","onHideDetails","diagInstructions","program2","program4","program6","program8","program13","program11","actionbar","diagnosticTpl","cssScope","installTester","workstation","$list","$workstation","onDiagnosticStart","onDiagnosticEnd","$panel","extensionConfig","indexUrl","_url","buttons","icon","top","close","renderTo","t","amd","exports","swfContainerId","swfPath","detectScreenOrientation","sortPluginsFor","userDefinedFonts","extend","nativeForEach","prototype","nativeMap","get","a","preprocessor","userAgentKey","languageKey","colorDepthKey","pixelRatioKey","hardwareConcurrencyKey","screenResolutionKey","availableScreenResolutionKey","timezoneOffsetKey","sessionStorageKey","localStorageKey","indexedDbKey","addBehaviorKey","openDatabaseKey","cpuClassKey","platformKey","doNotTrackKey","pluginsKey","canvasKey","webglKey","adBlockKey","hasLiedLanguagesKey","hasLiedResolutionKey","hasLiedOsKey","hasLiedBrowserKey","touchSupportKey","customEntropyFunction","fontsKey","join","x64hash128","customFunction","excludeUserAgent","getUserAgent","excludeLanguage","language","userLanguage","browserLanguage","systemLanguage","excludeColorDepth","colorDepth","excludePixelRatio","getPixelRatio","devicePixelRatio","excludeScreenResolution","getScreenResolution","excludeAvailableScreenResolution","getAvailableScreenResolution","availWidth","availHeight","excludeTimezoneOffset","getTimezoneOffset","excludeSessionStorage","hasSessionStorage","hasLocalStorage","excludeIndexedDB","hasIndexedDB","body","excludeAddBehavior","addBehavior","excludeOpenDatabase","openDatabase","excludeCpuClass","getNavigatorCpuClass","excludePlatform","getNavigatorPlatform","excludeDoNotTrack","getDoNotTrack","excludeCanvas","isCanvasSupported","getCanvasFp","excludeWebGL","isWebGlSupported","getWebglFp","excludeAdBlock","getAdBlock","excludeHasLiedLanguages","getHasLiedLanguages","excludeHasLiedResolution","getHasLiedResolution","excludeHasLiedOs","getHasLiedOs","excludeHasLiedBrowser","getHasLiedBrowser","excludeJsFonts","flashFontsKey","jsFontsKey","excludeFlashFonts","hasSwfObjectLoaded","hasMinFlashInstalled","loadSwfAndDetectFonts","n","extendedJsFonts","l","getElementsByTagName","u","c","d","g","style","position","fontSize","lineHeight","innerHTML","p","fontFamily","appendChild","T","offsetWidth","offsetHeight","S","x","v","E","M","A","y","removeChild","excludePlugins","isIE","excludeIEPlugins","getIEPlugins","getRegularPlugins","plugins","pluginsShouldBeSorted","suffixes","description","getOwnPropertyDescriptor","match","excludeTouchSupport","getTouchSupport","excludeHardwareConcurrency","getHardwareConcurrency","sessionStorage","localStorage","indexedDB","hardwareConcurrency","cpuClass","platform","doNotTrack","msDoNotTrack","maxTouchPoints","msMaxTouchPoints","createEvent","_MathPI","PI","display","getContext","rect","isPointInPath","textBaseline","fillStyle","fillRect","font","dontUseFakeFontInCanvas","fillText","globalCompositeOperation","beginPath","arc","closePath","fill","toDataURL","clearColor","DEPTH_TEST","depthFunc","LEQUAL","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","getExtension","getParameter","MAX_TEXTURE_MAX_ANISOTROPY_EXT","getWebglCanvas","createBuffer","bindBuffer","ARRAY_BUFFER","Float32Array","bufferData","STATIC_DRAW","itemSize","numItems","createProgram","createShader","VERTEX_SHADER","shaderSource","compileShader","FRAGMENT_SHADER","attachShader","linkProgram","useProgram","vertexPosAttrib","getAttribLocation","offsetUniform","getUniformLocation","enableVertexAttribArray","vertexPosArray","vertexAttribPointer","FLOAT","uniform2f","drawArrays","TRIANGLE_STRIP","canvas","getSupportedExtensions","ALIASED_LINE_WIDTH_RANGE","ALIASED_POINT_SIZE_RANGE","ALPHA_BITS","getContextAttributes","antialias","BLUE_BITS","DEPTH_BITS","GREEN_BITS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_CUBE_MAP_TEXTURE_SIZE","MAX_FRAGMENT_UNIFORM_VECTORS","MAX_RENDERBUFFER_SIZE","MAX_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_VARYING_VECTORS","MAX_VERTEX_ATTRIBS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_VERTEX_UNIFORM_VECTORS","MAX_VIEWPORT_DIMS","RED_BITS","RENDERER","SHADING_LANGUAGE_VERSION","STENCIL_BITS","VENDOR","VERSION","UNMASKED_VENDOR_WEBGL","UNMASKED_RENDERER_WEBGL","getShaderPrecisionFormat","HIGH_FLOAT","precision","rangeMin","rangeMax","MEDIUM_FLOAT","LOW_FLOAT","HIGH_INT","MEDIUM_INT","LOW_INT","className","getElementsByClassName","languages","substr","oscpu","productSub","eval","toSource","WebGLRenderingContext","appName","test","swfobject","hasFlashPlayerVersion","addFlashDivNode","setAttribute","___fp_swf_loaded","onReady","allowScriptAccess","menu","embedSWF","hasOwnProperty","x64Add","x64Multiply","x64Rotl","x64LeftShift","x64Xor","x64Fmix","charCodeAt","slice","format","uuid","Fingerprint2","_storageKeys","fingerprint","errors","changed","_thresholdValues","storageIssue","changedFingerprint","fingerprintValue","fingerprintUUID","fingerprintDetails","fingerprintChanged","fingerprintErrors","fingerprintError","browserFingerprint","handleError","getStorageKey","browserStorage","browserId","lastFingerprint","freshBrowserId","newFingerprint","resolve","toUpperCase","pendingPromises","resultFingerprint","sources","pull","exportCsv","model","mappingDiagnosticsData","field","transform","arrayToCsv","columnDelimiter","arguments","lineDelimiter","ctr","includes","downloadFile","content","filename","blob","Blob","URL","createObjectURL","link","attr","revokeObjectURL","serviceUrl","rows","MAX_SAFE_INTEGER","mappedData","csvContent","moment","encode","dialog","performancesTesterFactory","fingerprintTesterFactory","fingerprintTpl","csvExporter","_Mathmax5","_Mathround2","_Mathpow","formatNumber","digits","factor","formatBandwidth","transformDateToLocal","date","isFinite","isNumber","utc","tz","defaultDateTimeZone","guess","defaultDateFormat","selection","datatable","encodeHtml","removeUrl","dataset","installedExtension","diagnosticUrl","fingerprintTester","tools","actions","export","deliveryUrl","massAction","autoRender","autoDestroy","onOkBtn","row","target","intensive_bandwidth","available","loading","selectable","tooltipster","Authenticator","login","CompatibilityChecker","Diagnostic","ExcludedBrowsers","editInstance","ExcludedOS","styleSheet","cssText","createTextNode"],"sources":["/github/workspace/tao/views/build/config-wrap-start-default.js","../../loader/bootstrap.js","../tools/message.js","../controller/Authenticator/login.js","../component/diagnostic/tpl/component!tpl","../component/diagnostic/diagnosticLoader.js","../controller/CompatibilityChecker/diagnostics.js","../tools/fixedDecimals.js","../tools/stats.js","../tools/getConfig.js","../tools/getLabels.js","../tools/getStatus.js","../tools/performances/tester.js","../tools/bandwidth/tester.js","../tools/upload/tester.js","../tools/getPlatformInfo.js","../tools/browser/tester.js","../tools/diagnostic/tpl/main!tpl","../tools/diagnostic/tpl/result!tpl","../tools/diagnostic/tpl/details!tpl","../tools/diagnostic/tpl/feedback!tpl","tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar","../../taoClientDiagnosticCss/diagnostics!css","../tools/diagnostic/diagnostic.js","../templates/diagnostic/main!tpl","../controller/Diagnostic/diagnostic.js","../lib/fingerprint/fingerprint2.js","../tools/fingerprint/tester.js","../tools/diagnostic/tpl/fingerprint!tpl","../tools/csvExporter.js","../controller/Diagnostic/index.js","css!taoClientDiagnosticCss/exclusion-list-form","../controller/ExclusionList/editInstance.js","../controller/routes.js","onLayerEnd0.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"sourcesContent":["\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Bootstrap the app, start the entry controller\n * @author Bertrand Chevrier \n */\n(function(){\n 'use strict';\n\n\n\n var loaderScript = document.getElementById('amd-loader');\n var configUrl = loaderScript.getAttribute('data-config');\n var bundle = loaderScript.getAttribute('data-bundle');\n\n var loadController = function loadController(){\n var controllerOptions = {};\n var controllerPath = loaderScript.getAttribute('data-controller');\n var params = loaderScript.getAttribute('data-params');\n try{\n controllerOptions = JSON.parse(params);\n } catch(err){\n controllerOptions = {};\n }\n window.require([controllerPath], function(controller) {\n var startController = function startController(){\n if(!window.started){\n window.started = true;\n controller.start(controllerOptions);\n }\n };\n document.addEventListener('readystatechange', startController, false);\n if (document.readyState === 'complete') {\n startController();\n }\n });\n };\n\n //always start to load the config\n window.require([configUrl], function() {\n\n //define the global loading mechanism\n if(!window.loadBundles){\n //keep tracl of loaded bundles, even if require does it,\n //this prevent some unecessary cycles\n window.loaded = {};\n\n /**\n * Loading entry point for inter bundle dependency,\n * always take the bundles from the params and window.bundles\n * @param {String[]} [bundles] - an optional list of bundle to load\n */\n window.loadBundles = function loadBundles(bundles){\n bundles = bundles || [];\n bundles = bundles.concat(window.bundles)\n bundles = bundles.filter( function(item, index){\n return item && bundles.indexOf(item) === index && window.loaded[item] !== true;\n });\n require(bundles, function(){\n bundles.forEach( function( item ) {\n window.loaded[item] = true;\n });\n loadController();\n });\n }\n }\n\n if(bundle || (window.bundles && window.bundles.length)) {\n window.loadBundles([bundle]);\n } else {\n loadController();\n }\n });\n})();\n\ndefine(\"loader/bootstrap\", function(){});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/tools/message',['jquery', 'ui/feedback'], function($, feedback) {\n 'use strict';\n\n /**\n * Displays the messages set into a markup\n * @param {string|jQuery|HTMLElement} container\n */\n return function showMessages(container) {\n const $feedbackBox = $(container);\n\n if ($feedbackBox.data('error')) {\n feedback().error($feedbackBox.data('error'));\n }\n if ($feedbackBox.data('message')) {\n feedback().error($feedbackBox.data('message'));\n }\n };\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/Authenticator/login',['taoClientDiagnostic/tools/message'], function(showMessage) {\n 'use strict';\n\n return {\n start() {\n showMessage('#feedback-box');\n }\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/component/diagnostic/tpl/component', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
                      \\n

                      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Diagnostic Tool\", options) : helperMissing.call(depth0, \"__\", \"Diagnostic Tool\", options)))\n + \"

                      \\n
                      \";\n return buffer;\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2019-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/component/diagnostic/diagnosticLoader',[\n 'lodash',\n 'ui/component',\n 'core/moduleLoader',\n 'context',\n 'module',\n 'tpl!taoClientDiagnostic/component/diagnostic/tpl/component',\n 'layout/loading-bar'\n], function(_, componentFactory, moduleLoader, context, module, componentTpl, loadingBar) {\n 'use strict';\n\n /*\n * This component factory is loading diagnostic tool modules and initialising with their configuration.\n * @param {object} container - Container in which the module will render diagnostic check\n * @param {object} config - Some config options.\n */\n return function diagnosticLoaderFactory(container, config) {\n const component = componentFactory()\n // set the component's layout\n .setTemplate(componentTpl)\n\n // auto render on init\n .on('init', function onDiagnosticLoaderInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticLoaderRender() {\n const moduleConfig = module.config();\n const identifiers = Object.keys(moduleConfig.diagnostics);\n /*\n * This loads all the modules from module configuration, which are in the `diagnostics` array.\n */\n moduleLoader({}, _.isFunction)\n .addList(moduleConfig.diagnostics)\n .load(context.bundle)\n .then(factories => {\n const componentConfig = this.getConfig();\n\n /*\n * Read all factories and initialise them with their config from component.\n */\n factories.forEach((factory, index) => {\n const factoryName = identifiers[index];\n const factoryConfig = componentConfig[factoryName];\n factoryConfig.controller = componentConfig.controller;\n\n factory(this.getElement(), factoryConfig)\n .on('render', function onRender() {\n if (factoryConfig.autoStart) {\n this.run();\n }\n })\n .on('start', () => loadingBar.start())\n .on('end', () => loadingBar.stop());\n });\n\n /**\n * @event ready\n */\n this.trigger('ready');\n });\n });\n\n _.defer(() => component.init(config));\n\n return component;\n };\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/CompatibilityChecker/diagnostics',[\n 'jquery',\n 'taoClientDiagnostic/tools/message',\n 'taoClientDiagnostic/component/diagnostic/diagnosticLoader'\n], function($, showMessage, diagnosticFactory) {\n 'use strict';\n\n return {\n start: function(config) {\n const $contentArea = $('.content');\n\n showMessage('#feedback-box');\n\n diagnosticFactory($contentArea, config);\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fixedDecimals',[],function() {\n 'use strict';\n\n /**\n * Rounds a value to a fixed number of decimals\n * @param {number} value - The value to round\n * @param {number} decimals - The number of decimal\n * @returns {number}\n */\n return function fixedDecimals(value, decimals) {\n const shift = Math.pow(10, Math.abs(decimals || 1));\n return Math.round(Number(value) * shift) / shift || 0;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/stats',['lodash', 'taoClientDiagnostic/tools/fixedDecimals'], function(_, fixedDecimals) {\n 'use strict';\n\n /**\n * Gets a getter function that extracts a value from a record.\n * @param {string|Function} name - the name to extract from the record, or a getter function\n * @returns {Function}\n * @private\n */\n function valueGetter(name) {\n if ('function' === typeof name) {\n return name;\n }\n\n return item => (item && item[name]) || 0;\n }\n\n /**\n * Computes some stats on a list from a particular field\n * @param {Array|object} list - The list to compute stats on\n * @param {string|Function} fieldName - The name of the field to process, or a callback method returning the value\n * @param {number} [decimals] - Optional number of fixed decimals for values\n * @returns {object}\n */\n return function stats(list, fieldName, decimals) {\n const getValue = valueGetter(fieldName);\n const values = [];\n let min = Number.MAX_VALUE;\n let max = 0;\n let count = 0;\n\n // process first pass stats: compute sum, min and max values\n const sum = _.reduce(\n list,\n (sum, item) => {\n if ('undefined' !== typeof item) {\n const value = getValue(item);\n values.push(value);\n min = Math.min(min, value);\n max = Math.max(max, value);\n sum += value;\n count++;\n return sum;\n }\n },\n 0\n );\n\n // compute the average value\n const average = sum / (count || 1);\n\n // process second pass stats: compute variance\n const sum2 = values.reduce((sum, value) => {\n const diff = value - average;\n sum += diff * diff;\n return sum;\n }, 0);\n\n // compute standard variance\n const variance = count > 1 ? Math.sqrt(sum2 / (count - 1)) : 0;\n\n // compute the median value\n values.sort();\n const middle = count / 2;\n const median = (values[Math.floor(middle)] + values[Math.ceil(middle)]) / 2;\n\n const results = {\n min,\n max,\n sum,\n count,\n average,\n median,\n variance\n };\n\n if (decimals) {\n _.forEach(results, (value, key) => {\n results[key] = fixedDecimals(value, decimals);\n });\n }\n\n results.values = list;\n return results;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2024 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getConfig',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets a config set\n * @param {object} [config]\n * @param {object} [defaults]\n * @returns {object}\n */\n return function getConfig(config, defaults) {\n return _(config || {})\n .omitBy(value => value === null || typeof value === 'undefined')\n .defaults(defaults || {})\n .value();\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getLabels',[],function() {\n 'use strict';\n\n /**\n * Gets the list of messages related to a particular level.\n * The level is provided as a numeric value, starting from 1.\n * @param {Array|object} messages - The list of messages for all levels.\n * If only one object is provided is will be wrapped into an array\n * @param {number|string} level - The level for which filter the messages.\n * It should be comprised within the available indexes.\n * Higher levels will be reduced to the higher available,\n * lower levels will be increased to the lowest.\n * @returns {object}\n */\n return function getLabels(messages, level) {\n messages = messages || {};\n\n if (!Array.isArray(messages)) {\n messages = [messages];\n }\n\n // Compute the level value that targets which list of labels to use.\n // It should be comprised within the available indexes.\n // Higher levels will be reduced to the higher available, lower levels will be increased to the lowest.\n level = Math.min(Math.max(parseInt(level, 10) || 0, 1), messages.length || 1) - 1;\n\n return messages[level] || {};\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getStatus',['lodash'], function(_) {\n 'use strict';\n\n /**\n * Gets the correct status message for a given percentage from a list of thresholds.\n * @param {number|string} percentage - The actual percentage. Must be comprised between 0 and 100.\n * Other values will be adjusted to fit the interval.\n * @param {Array|object} [thresholds] - A list of descriptors for each thresholds.\n * A threshold field must be provided for each.\n * @param {object} [opts]\n * @param {object} [minimumGlobalPercentage] - lowest value that will be used in the global score computation\n * @returns {object} Returns the corresponding threshold, or an empty object if none match.\n */\n return function getStatus(percentage, thresholds, opts) {\n const options = opts || {};\n const testPercentage = Math.max(0, Math.min(100, Math.round(parseInt(percentage, 10) || 0)));\n const globalPercentage = options.minimumGlobalPercentage\n ? Math.max(testPercentage, options.minimumGlobalPercentage)\n : testPercentage;\n\n // need a structure compatible with the handlebars template\n const status = {\n // the percentage is between 0 and 100 and obviously must be a number\n percentage: testPercentage,\n globalPercentage: globalPercentage,\n quality: {}\n };\n\n // grab a feedback related to the percentage in the thresholds list\n if (thresholds) {\n if (!Array.isArray(thresholds)) {\n thresholds = [thresholds];\n }\n\n let feedback;\n const len = thresholds.length;\n for (let i = 0; i < len; i++) {\n const step = thresholds[i];\n if (step && (!step.threshold || status.percentage >= step.threshold)) {\n feedback = step;\n } else {\n break;\n }\n }\n\n if (feedback) {\n status.feedback = _.clone(feedback);\n }\n }\n\n return status;\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/performances/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'helpers',\n 'taoClientDiagnostic/tools/stats',\n 'taoQtiItem/qtiItem/core/Loader',\n 'taoQtiItem/qtiCommonRenderer/renderers/Renderer',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, context, helpers, stats, Loader, Renderer, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * Default timeout duration\n * @type {number}\n * @private\n */\n const _defaultTimeout = 30 * _second;\n\n /**\n * Default number of renderings by samples\n * @type {number}\n * @private\n */\n const _defaultOccurrencesCount = 10;\n\n /**\n * List of default samples\n * @type {Array}\n * @private\n */\n const _defaultSamples = [\n 'taoClientDiagnostic/tools/performances/data/sample1/',\n 'taoClientDiagnostic/tools/performances/data/sample2/',\n 'taoClientDiagnostic/tools/performances/data/sample3/'\n ];\n\n /**\n * Default values for the performances tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'performances',\n\n // The threshold for optimal performances\n optimal: 0.025,\n\n // The threshold for minimal performances\n threshold: 0.25\n };\n\n /**\n * A list of thresholds for performances check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Very slow performances'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average performances'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good performances'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Workstation performances'),\n status: __('Checking the performances...'),\n performancesMin: __('Minimum rendering time'),\n performancesMax: __('Maximum rendering time'),\n performancesAverage: __('Average rendering time')\n }\n ];\n\n /**\n * Base text used to build sample identifiers\n * @type {string}\n * @private\n */\n const _sampleBaseId = 'sample';\n\n /**\n * Loads a page inside a div and compute the time to load\n * @param {object} data The descriptor of the page to load\n * @param {Function} done A callback function called to provide the result\n * @private\n */\n function loadItem(data, done) {\n //item location config\n const qtiJsonFile = `${data.url}qti.json`;\n const urlTokens = data.url.split('/');\n const extension = urlTokens[0];\n const fullpath = require.s.contexts._.config.paths[extension];\n const baseUrl = data.url.replace(extension, fullpath);\n const loader = new Loader();\n const renderer = new Renderer({\n baseUrl: baseUrl // compatibility mode for legacy installations\n });\n\n // check needed by compatibility mode for legacy installations\n if (renderer.getAssetManager) {\n renderer.getAssetManager().setData('baseUrl', baseUrl);\n }\n\n require([`json!${qtiJsonFile}`], function(itemData) {\n loader.loadItemData(itemData, function(item) {\n renderer.load(function() {\n //start right before rendering\n const start = window.performance.now();\n\n //set renderer\n item.setRenderer(this);\n\n //render markup\n const $container = $('
                      ').appendTo('body');\n $container.append(item.render());\n\n //execute javascript\n item.postRender();\n\n //remove item\n $container.remove();\n\n //done\n const end = window.performance.now();\n\n const duration = (end - start) / _second;\n\n const result = {\n id: data.id,\n url: data.url,\n duration: duration\n };\n\n done(null, result);\n }, this.getLoadedClasses());\n });\n });\n }\n\n /**\n * Performs a browser performances test by running a heavy page\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.optimal] - The threshold for optimal performances\n * @param {number} [config.threshold] - The threshold for minimal performances\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function performancesTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n let idx = 0;\n const _samples = _.map((!_.isEmpty(initConfig.samples) && initConfig.samples) || _defaultSamples, sample => {\n idx++;\n return {\n id: _sampleBaseId + idx,\n url: sample,\n timeout: initConfig.timeout * 1000 || _defaultTimeout,\n nb: initConfig.occurrences || _defaultOccurrencesCount\n };\n });\n\n // add one occurrence on the first sample to obfuscate the time needed to load the runner\n _samples[0].nb++;\n\n return {\n /**\n * Performs a performances test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_samples, data => {\n const cb = _.partial(loadItem, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n async.series(tests, (err, measures) => {\n const decimals = 2;\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n\n // remove the first result to obfuscate the time needed to load the runner\n measures.shift();\n\n const results = stats(measures, 'duration', decimals);\n const status = this.getFeedback(results.average);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n performancesMin: { message: labels.performancesMin, value: `${results.min} s` },\n performancesMax: { message: labels.performancesMax, value: `${results.max} s` },\n performancesAverage: { message: labels.performancesAverage, value: `${results.average} s` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {Number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal;\n const range = Math.abs(optimal - initConfig.threshold);\n const status = getStatus(((range + optimal - result) / range) * 100, _thresholds);\n\n status.title = labels.title;\n status.id = initConfig.id;\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/bandwidth/tester',[\n 'lodash',\n 'i18n',\n 'async',\n 'context',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/stats',\n 'taoClientDiagnostic/tools/fixedDecimals',\n 'taoClientDiagnostic/tools/getStatus'\n], function(_, __, async, context, getConfig, getLabels, stats, fixedDecimals, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Duration of one second (in milliseconds)\n * @type {number}\n * @private\n */\n const _second = 1000;\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low bandwidth'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average bandwidth'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good bandwidth'),\n type: 'success'\n }\n ];\n\n /**\n * Default values for the bandwidth tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'bandwidth',\n\n // The typical bandwidth needed for a test taker (Mbps)\n unit: 0.16,\n\n // The thresholds for optimal bandwidth\n ideal: 45,\n\n // Maximum number of test takers to display\n max: 100,\n\n // Lowest value that will be used in the global score computation\n minimumGlobalPercentage: false,\n\n // A list of thresholds for bandwidth check\n feedbackThresholds: _thresholds,\n\n fallbackThreshold: 0.2\n };\n\n /**\n * List of descriptors defining the data sets to download.\n * - file : path of the file containing the test data\n * - size : the given size of the file\n * - timeout : the timeout for the download\n * - threshold : a bandwidth threshold above which the data set can be downloaded to evaluate a more accurate value\n * - nb : number of download iterations\n * @type {object}\n * @private\n */\n const _downloadData = {\n '10KB': {\n id: '10KB',\n file: 'data/bin10KB.data',\n size: 10 * _kilo,\n timeout: _second,\n threshold: 0,\n nb: 10\n },\n '100KB': {\n id: '100KB',\n file: 'data/bin100KB.data',\n size: 100 * _kilo,\n timeout: 2 * _second,\n threshold: 0,\n nb: 5\n },\n '1MB': {\n id: '1MB',\n file: 'data/bin1MB.data',\n size: _mega,\n timeout: 20 * _second,\n threshold: 0,\n nb: 3\n }\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object[]}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Bandwidth'),\n status: __('Checking the bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle'),\n bandwidthMin: __('Minimum bandwidth'),\n bandwidthMax: __('Maximum bandwidth'),\n bandwidthAverage: __('Average bandwidth')\n },\n // level 2\n {\n title: __('Media intensive bandwidth'),\n status: __('Checking the media intensive bandwidth...'),\n legend: __('Number of simultaneous test takers the connection can handle with media intensive'),\n bandwidthMin: __('Minimum intensive bandwidth'),\n bandwidthMax: __('Maximum intensive bandwidth'),\n bandwidthAverage: __('Average intensive bandwidth')\n }\n ];\n\n /**\n * Download a data set as described by the provided descriptor and compute the duration.\n * @param {object} data The data set descriptor to use for download\n * @param {Function} cb A callback function called at the end of the download.\n * This callback is also called if a timeout breaks the download;\n * @private\n */\n function download(data, cb) {\n if (data.threshold && this.bandwidth < data.threshold) {\n return cb('threshold');\n }\n\n const start = window.performance.now();\n const url = `${context['root_url']}taoClientDiagnostic/views/js/tools/bandwidth/${data.file}?${Date.now()}`;\n const timeoutId = window.setTimeout(cb, data.timeout, 'timeout');\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.setRequestHeader('Accept', 'application/octet-stream');\n\n request.onload = () => {\n const end = window.performance.now();\n clearTimeout(timeoutId);\n\n const duration = end - start;\n const bytes = data.size;\n const seconds = duration / _second;\n\n // speed in Mbps\n const speed = (bytes * 8) / seconds / _mega;\n\n this.bandwidth = Math.max(this.bandwidth, speed);\n\n return cb(null, {\n id: data.id,\n file: data.file,\n size: data.size,\n duration,\n speed\n });\n };\n request.onerror = err => {\n clearTimeout(timeoutId);\n cb(err);\n };\n\n request.onreadystatechange = () => {\n if (request.readyState === 4 && request.status !== 200) {\n clearTimeout(timeoutId);\n cb(request.status);\n }\n };\n\n request.send();\n }\n\n /**\n * Performs a bandwidth test by downloading a bunch of data sets with different sizes\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {number} [config.ideal] - The thresholds for optimal bandwidth\n * @param {number} [config.max] - Maximum number of test takers to display\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function bandwidthTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n // override the feedback thresholds given by the config in case it is an empty array\n if (_.isArray(initConfig.feedbackThresholds) && !initConfig.feedbackThresholds.length) {\n initConfig.feedbackThresholds = _thresholds;\n }\n\n return {\n /**\n * Performs a bandwidth test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n const tests = [];\n\n _.forEach(_downloadData, data => {\n const cb = download.bind(this, data);\n let iterations = data.nb || 1;\n while (iterations--) {\n tests.push(cb);\n }\n });\n\n this.bandwidth = 0;\n\n async.series(tests, (err, measures) => {\n let duration = 0;\n let size = 0;\n const decimals = 2;\n const resultsBySize = {};\n\n function getValue(value) {\n let speed = 0;\n\n if (value) {\n duration += value.duration;\n size += value.size;\n\n speed = value.speed;\n value.speed = fixedDecimals(speed, decimals);\n }\n\n return speed;\n }\n\n if (err && !measures.length) {\n //something went wrong\n throw err;\n }\n const results = stats(measures, getValue, decimals);\n\n _.forEach(_downloadData, (data, key) => {\n resultsBySize[key] = stats(\n _.filter(measures, o => o.id === key),\n getValue,\n decimals\n );\n });\n\n results.duration = fixedDecimals(duration / _second, decimals);\n results.size = size;\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results, resultsBySize);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n bandwidthMin: { message: labels.bandwidthMin, value: results.min + ' Mbps' },\n bandwidthMax: { message: labels.bandwidthMax, value: results.max + ' Mbps' },\n bandwidthAverage: { message: labels.bandwidthAverage, value: results.average + ' Mbps' }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} result\n * @param {number} result.max\n * @param {number} result.min\n * @param {number} result.average\n * @param {object} resultsBySize - result statistics grouped by size\n * @returns {object}\n */\n getFeedback(result, resultsBySize) {\n const avgResult = result.average;\n const bandwidthUnit = initConfig.unit;\n const threshold = initConfig.ideal;\n const maxTestTakers = initConfig.max;\n const max = threshold * bandwidthUnit;\n const getStatusOptions = initConfig.minimumGlobalPercentage\n ? { minimumGlobalPercentage: initConfig.minimumGlobalPercentage }\n : {};\n const baseBandwidth = avgResult;\n let stable = true;\n\n _.forEach(resultsBySize, resultBySize => {\n if (resultBySize.min / resultBySize.average < initConfig.fallbackThreshold) {\n stable = false;\n }\n });\n\n const status = getStatus((baseBandwidth / max) * 100, initConfig.feedbackThresholds, getStatusOptions);\n\n let nb = Math.floor(baseBandwidth / bandwidthUnit);\n\n if (nb > maxTestTakers) {\n nb = '>' + maxTestTakers;\n }\n\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.legend = labels.legend;\n status.quality.label = nb;\n\n if (!stable) {\n status.feedback.type = 'warning';\n status.feedback.message = __(\n 'Unstable bandwidth, temporary fluctuations in connection speed may affect test taker experience.'\n );\n status.feedback.legend = __('Simultaneous test takers under normal connection conditions.');\n }\n\n if (nb.toString().length > 2) {\n status.quality.wide = true;\n }\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/upload/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'util/url',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, async, urlHelper, getConfig, getLabels, getStatus) {\n 'use strict';\n\n /**\n * A binary kilo bytes (KiB)\n * @type {number}\n * @private\n */\n const _kilo = 1024;\n\n /**\n * A binary mega bytes (MiB)\n * @type {number}\n * @private\n */\n const _mega = _kilo * _kilo;\n\n /**\n * Result of diagnostic\n * @type {Array}\n * @private\n */\n let data = [];\n\n /**\n * Default values for the upload speed tester\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'upload',\n\n // Size of data to sent to server during speed test in bytes\n size: _mega,\n\n // Optimal speed in bytes per second\n optimal: _mega\n };\n\n /**\n * A list of thresholds for bandwidth check\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Low upload speed'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Average upload speed'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Good upload speed'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Upload speed'),\n status: __('Checking upload speed...'),\n uploadAvg: __('Average upload speed'),\n uploadMax: __('Max upload speed')\n }\n ];\n\n /**\n * Generate random string of given length\n * @param {number} length\n */\n function generateStr(length) {\n let text = '';\n const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return text;\n }\n\n /**\n * Upload generated string to check upload speed.\n * @param {number} size of string to upload in bytes\n * @return {object} jqXHR\n */\n function upload(size) {\n const url = urlHelper.route('upload', 'CompatibilityChecker', 'taoClientDiagnostic', { cache: Date.now() });\n const str = generateStr(size);\n data = [];\n\n return $.ajax({\n url: url,\n type: 'POST',\n data: {\n upload: str\n },\n xhr: () => {\n const xhr = new window.XMLHttpRequest();\n const startTime = Date.now();\n // Upload progress\n xhr.upload.addEventListener(\n 'progress',\n evt => {\n if (evt.lengthComputable) {\n const passedTime = Date.now() - startTime;\n data.push({\n time: passedTime,\n loaded: evt.loaded,\n speed: (evt.loaded * 8) / _mega / (passedTime / 1000)\n });\n }\n },\n false\n );\n\n return xhr;\n }\n });\n }\n\n /**\n * Performs a upload speed test\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {number} [config.size] - Size of data to sent to server during speed test in bytes\n * @param {number} [config.optimal] - Optimal speed in bytes per second\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function uploadTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs upload speed test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n upload(parseInt(initConfig.size, 10)).then(() => {\n let totalSpeed = 0;\n let maxSpeed = 0;\n\n _.forEach(data, val => {\n totalSpeed += val.speed;\n if (maxSpeed < val.speed) {\n maxSpeed = Math.round(val.speed * 100) / 100;\n }\n });\n const avgSpeed = Math.round((totalSpeed / data.length) * 100) / 100;\n const results = {\n max: maxSpeed,\n avg: avgSpeed,\n type: 'upload'\n };\n\n const status = this.getFeedback(avgSpeed);\n const summary = this.getSummary(results);\n\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n return {\n uploadAvg: { message: labels.uploadAvg, value: `${results.avg} Mbps` },\n uploadMax: { message: labels.uploadMax, value: `${results.max} Mbps` }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @returns {object}\n */\n getFeedback(result) {\n const optimal = initConfig.optimal / _mega;\n const status = getStatus((100 / optimal) * result, _thresholds);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/getPlatformInfo',['core/request', 'util/url', 'taoClientDiagnostic/tools/getConfig'], function(request, urlHelper, getConfig) {\n 'use strict';\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const defaultConfig = {\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic'\n };\n\n /**\n * Gets the URL of the platform tester\n * @param {Window} win\n * @param {string} action\n * @param {string} controller\n * @param {string} extension\n * @returns {string}\n * @private\n */\n function getTesterUrl(win, action, controller, extension) {\n const document = win.document;\n const navigator = win.navigator;\n const screen = win.screen;\n const params = {};\n let e = 0;\n let f = 0;\n\n // append the browser user agent\n params.ua = navigator.userAgent;\n\n // detect browser family\n e |= win.ActiveXObject ? 1 : 0;\n e |= win.opera ? 2 : 0;\n e |= win.chrome ? 4 : 0;\n e |= 'getBoxObjectFor' in document || 'mozInnerScreenX' in win ? 8 : 0;\n e |=\n 'WebKitCSSMatrix' in win || 'WebKitPoint' in win || 'webkitStorageInfo' in win || 'webkitURL' in win\n ? 16\n : 0;\n e |= e & 16 && {}.toString.toString().indexOf('\\n') === -1 ? 32 : 0;\n params.e = e;\n\n // gather info about browser functionality\n f |= 'sandbox' in document.createElement('iframe') ? 1 : 0;\n f |= 'WebSocket' in win ? 2 : 0;\n f |= win.Worker ? 4 : 0;\n f |= win.applicationCache ? 8 : 0;\n f |= win.history && win.history.pushState ? 16 : 0;\n f |= document.documentElement.webkitRequestFullScreen ? 32 : 0;\n f |= 'FileReader' in win ? 64 : 0;\n params.f = f;\n\n // append a unique ID\n params.r = Math.random()\n .toString(36)\n .substring(7);\n\n // get the screen size\n params.w = screen.width;\n params.h = screen.height;\n\n return urlHelper.route(action, controller, extension, params);\n }\n\n /**\n * Check the user browser and os.\n *\n * This helper performs a server request to gather information about the user browser and os.\n * @param {Window} window - Need an access to the window object\n * @param {object} config\n * @param {string} config.browserVersionAction - The name of the action to call to get the browser checker\n * @param {string} config.browserVersionController - The name of the controller to call to get the browser checker\n * @param {string} config.browserVersionExtension - The name of the extension containing the controller to call to get the browser checker\n * @returns {Promise}\n */\n return function getPlatformInfo(win, config) {\n config = getConfig(config, defaultConfig);\n\n const url = getTesterUrl(\n win,\n config.browserVersionAction,\n config.browserVersionController,\n config.browserVersionExtension\n );\n\n return request({ url, noToken: true });\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/browser/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/request',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getPlatformInfo',\n 'taoClientDiagnostic/tools/getStatus'\n], function($, _, __, urlHelper, loggerFactory, request, getConfig, getLabels, getPlatformInfo, getStatus) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/browser');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'browser',\n browserVersionAction: 'whichBrowser',\n browserVersionController: 'CompatibilityChecker',\n browserVersionExtension: 'taoClientDiagnostic',\n action: 'check',\n controller: 'DiagnosticChecker',\n browserslistUrl: 'https://oat-sa.github.io/browserslist-app-tao/api.json'\n };\n\n /**\n * Placeholder variables for custom messages\n * @type {object}\n * @private\n */\n const _placeHolders = {\n CURRENT_BROWSER: '%CURRENT_BROWSER%',\n CURRENT_OS: '%CURRENT_OS%'\n };\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Operating system and web browser'),\n status: __('Checking the browser...'),\n browser: __('Web browser'),\n os: __('Operating system')\n }\n ];\n\n /**\n * Fallback name to recover from connectivity error\n * @param {string}\n * @private\n */\n const unknown = __('Unknown');\n\n /**\n * Performs a browser support test\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.action] - The name of the action to call to get the browser checker\n * @param {string} [config.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.extension] - The name of the extension containing the controller to call to get the browser checker\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserTester(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n /**\n * Fetches the list of fully supported browsers\n * @returns {Promise}\n * @private\n */\n const fetchBrowserList = () => request({ url: initConfig.browserslistUrl, noToken: true }).catch(() => []);\n\n /**\n * Checks the current browser against the list of fully supported browsers\n * @param platformInfo\n * @returns {Promise}\n * @private\n */\n function checkBrowserSupport(platformInfo) {\n const currentDevice = platformInfo.isMobile ? 'mobile' : 'desktop';\n const currentOS = platformInfo.os.toLowerCase();\n const currentBrowser = platformInfo.browser.toLowerCase();\n const currentVersion = platformInfo.browserVersion;\n return fetchBrowserList().then(list =>\n list.some(entry => {\n const { browser, device, os, versions } = entry;\n\n if (currentDevice !== device) {\n return false;\n }\n\n if (os && os.toLowerCase() !== currentOS) {\n return false;\n }\n\n if (browser.toLowerCase() !== currentBrowser) {\n return false;\n }\n\n // Using lodash because of IE support.\n // Some useful traversal algorithms are needed and they don't have polyfill in our bundles.\n // The versions come with an inconsistent format and they need to be processed upfront.\n return _(versions)\n .map(version => version.split('-'))\n .flatten()\n .value()\n .some(version => currentVersion.localeCompare(version, void 0, { numeric: true }) >= 0);\n }, {})\n );\n }\n\n return {\n /**\n * Performs a browser support test, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n getPlatformInfo(window, initConfig)\n .catch(err => {\n logger.error(err);\n return {\n browser: unknown,\n browserVersion: '',\n os: unknown,\n osVersion: '',\n isMobile: false\n };\n })\n .then(platformInfo =>\n checkBrowserSupport(platformInfo).then(browserSupported =>\n Object.assign(platformInfo, { browserSupported })\n )\n )\n .then(platformInfo => {\n request({\n url: urlHelper.route(initConfig.action, initConfig.controller, initConfig.extension),\n data: platformInfo,\n method: 'POST',\n noToken: true\n })\n .catch(() => {\n return {\n success: false,\n type: 'error',\n message: __('Unable to validate the data as the server did not respond in time.')\n };\n })\n .then(data => {\n const percentage = 'success' === data.type ? 100 : 'warning' === data.type ? 33 : 0;\n const status = this.getFeedback(percentage, data);\n const summary = this.getSummary(platformInfo);\n\n status.customMsgRenderer = customMsg => {\n return (customMsg || '')\n .replace(_placeHolders.CURRENT_BROWSER, summary.browser.value)\n .replace(_placeHolders.CURRENT_OS, summary.os.value);\n };\n\n done(status, summary, platformInfo);\n });\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const currentBrowser = `${results.browser} ${results.browserVersion}`;\n const currentOs = `${results.os} ${results.osVersion}`;\n return {\n browser: {\n message: labels.browser,\n value: currentBrowser\n },\n os: {\n message: labels.os,\n value: currentOs\n }\n };\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {number} result\n * @param {object} data\n * @returns {object}\n */\n getFeedback(result, data) {\n const status = getStatus(result, data);\n\n status.id = initConfig.id;\n status.title = labels.title;\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                      \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                      \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                      \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                      \";\n return buffer;\n }\n\nfunction program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                      \";\n if (helper = helpers.setup) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.setup); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                      \";\n return buffer;\n }\n\nfunction program7(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                      \\n \\n \\n

                      \\n

                      \\n \\n \\n

                      \\n \";\n return buffer;\n }\n\nfunction program9(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program10(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                      \\n \\n \\n

                      \\n

                      \\n \\n \\n

                      \\n \";\n return buffer;\n }\n\nfunction program12(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                      \\n \\n \\n

                      \\n \";\n return buffer;\n }\n\n buffer += \"
                      \\n\\n

                      \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                      \\n\\n
                      \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.setup), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                      \\n\\n
                      \\n \\n
                      \\n\\n
                        \\n\\n
                        \\n

                        \\n
                        \\n\\n
                        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/result', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n
                        \\n \\n \\n
                        \\n
                        \\n \";\n return buffer;\n }\n\n buffer += \"
                      • \\n

                        \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                        \\n
                        \\n\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.details), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                      • \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/details', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n return buffer;\n }\n\n buffer += \"
                        \\n

                        \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Details\", options) : helperMissing.call(depth0, \"__\", \"Details\", options)))\n + \"

                        \\n
                        \\n \\n \\n \";\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n
                        \\n
                        \\n
                        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
                        \";\n if (helper = helpers.legend) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.legend); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
                        \";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"
                        \";\n if (helper = helpers.customMsg) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.customMsg); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"
                        \";\n return buffer;\n }\n\n buffer += \"
                        \\n \\n \";\n if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.legend), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.customMsg), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
                        \";\n return buffer;\n }); });\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \" wide\";\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\";\n return buffer;\n }\n\n buffer += \"
                        \\n
                        \\n
                        \";\n return buffer;\n }); });\n","\ndefine('css!taoClientDiagnosticCss/diagnostics',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/diagnostic/diagnostic',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'async',\n 'ui/component',\n 'core/logger',\n 'core/store',\n 'core/request',\n 'core/dataProvider/request',\n 'ui/dialog/alert',\n 'ui/feedback',\n 'util/url',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/bandwidth/tester',\n 'taoClientDiagnostic/tools/upload/tester',\n 'taoClientDiagnostic/tools/browser/tester',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/getConfig',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/main',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/result',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/feedback',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/quality-bar',\n 'css!taoClientDiagnosticCss/diagnostics'\n], function(\n $,\n _,\n __,\n async,\n component,\n loggerFactory,\n store,\n request,\n requestData,\n dialogAlert,\n feedback,\n urlHelper,\n performancesTester,\n bandwidthTester,\n uploadTester,\n browserTester,\n getStatus,\n getConfig,\n mainTpl,\n resultTpl,\n detailsTpl,\n feedbackTpl,\n qualityBarTpl\n) {\n 'use strict';\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/diagnostic');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n title: __('System Compatibility'),\n header: __(\n 'This tool will run a number of tests in order to establish how well your current environment is suitable to run the TAO platform.'\n ),\n info: __('Be aware that these tests will take up to several minutes.'),\n button: __('Test system compatibility'),\n actionStore: 'storeData',\n actionSchool: 'schoolName',\n controller: 'DiagnosticChecker',\n extension: 'taoClientDiagnostic',\n actionDropId: 'deleteId',\n storeAllRuns: false,\n configurableText: {}\n };\n\n /**\n * A list of thresholds for summary\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: 0,\n message: __('Your system requires a compatibility update, please contact your system administrator.'),\n type: 'error'\n },\n {\n threshold: 33,\n message: __('Your system is not optimal, please contact your system administrator.'),\n type: 'warning'\n },\n {\n threshold: 66,\n message: __('Your system is fully compliant.'),\n type: 'success'\n }\n ];\n\n /**\n * Defines a diagnostic tool\n * @type {object}\n */\n const diagnostic = {\n /**\n * Updates the displayed status\n * @param {string} status\n * @returns {diagnostic}\n * @private\n */\n changeStatus(status) {\n if (this.is('rendered')) {\n this.controls.$status.html(status);\n }\n return this;\n },\n\n /**\n * Sends the detailed stats to the server\n * @param {string} type The type of stats\n * @param {object} data The stats details\n * @param {Function} done A callback method called once server has responded\n */\n store(type, data, done) {\n const config = this.config;\n const url = urlHelper.route(config.actionStore, config.controller, config.extension, config.storeParams);\n\n data = _.omit(data, 'values');\n data.type = type;\n\n request({ url, data, method: 'POST', noToken: true })\n .then(done)\n .catch(err => {\n logger.error(err);\n feedback().error(__('Unable to save the results! Please check your connection.'));\n done();\n });\n },\n\n /**\n * Retrieve a custom message from the config\n * @param key\n * @returns {*}\n */\n getCustomMsg(key) {\n return this.config.configurableText[key];\n },\n\n /**\n * Enrich the feedback object with a custom message if the test has failed\n * @param {object} status - the test result\n * @param {string} msg - the custom message\n */\n addCustomFeedbackMsg(status, msg) {\n if (this.hasFailed(status) && msg) {\n if (_.isFunction(status.customMsgRenderer)) {\n msg = status.customMsgRenderer(msg);\n }\n status.feedback = status.feedback || {};\n status.feedback.customMsg = msg;\n }\n },\n\n /**\n * Check if a result is considered as failed\n * @param {object} result\n * @returns {boolean}\n */\n hasFailed(result) {\n return !(result && result.feedback && result.feedback.type === 'success');\n },\n\n /**\n * Add a result row\n * @param {object} result\n * @returns {diagnostic}\n */\n addResult(result) {\n if (this.is('rendered')) {\n // adjust the width of the displayed label, if any, to the text length\n if (result.quality && result.quality.label && result.quality.label.toString().length > 2) {\n result.quality.wide = true;\n }\n\n // create and append the result to the displayed list\n const $main = $(resultTpl(result));\n const $result = $main.find('.result');\n if (result.feedback) {\n $result.append($(feedbackTpl(result.feedback)));\n }\n if (result.quality) {\n $result.append($(qualityBarTpl(result.quality)));\n }\n if (result.details) {\n $main.find('.details').append($(detailsTpl(result.details)));\n }\n\n const $indicator = $main.find('.quality-indicator');\n this.controls.$results.append($main);\n\n // the result is hidden by default, show it with a little animation\n $main.fadeIn(() => {\n if ($indicator.length) {\n $indicator.animate({\n left: (result.percentage * $main.outerWidth()) / 100 - $indicator.outerWidth() / 2\n });\n }\n });\n }\n\n return this;\n },\n\n /**\n * Removes the last results if any\n * @returns {diagnostic}\n */\n cleanUp() {\n this.controls.$results.empty();\n return this;\n },\n\n /**\n * Enables the start button\n * @returns {diagnostic}\n */\n enable() {\n this.controls.$start.removeClass('hidden');\n return this;\n },\n\n /**\n * Disables the start button\n * @returns {diagnostic}\n */\n disable() {\n this.controls.$start.addClass('hidden');\n return this;\n },\n\n /**\n * Does some preparations before starting the diagnostics\n * @returns {diagnostic}\n * @private\n */\n prepare() {\n /**\n * Notifies the diagnostic start\n * @event diagnostic#start\n */\n this.trigger('start');\n this.changeStatus(__('Starting...'));\n this.setState('running', true);\n this.setState('done', false);\n\n // first we need a clean space to display the results, so remove the last results if any\n this.cleanUp();\n\n // remove the start button during the diagnostic\n this.disable();\n\n return this;\n },\n\n /**\n * Does some post process after ending the diagnostics\n * @returns {diagnostic}\n * @private\n */\n finish() {\n const config = this.config;\n\n // restore the start button to allow a new diagnostic run\n this.enable();\n\n if (config.storeAllRuns) {\n this.deleteIdentifier();\n }\n\n /**\n * Notifies the diagnostic end\n * @event diagnostic#end\n */\n this.trigger('end');\n this.changeStatus(__('Done!'));\n this.setState('running', false);\n this.setState('done', true);\n\n return this;\n },\n\n /**\n * delete unique id for this test session (next test will generate new one)\n */\n deleteIdentifier() {\n const url = urlHelper.route(this.config.actionDropId, this.config.controller, this.config.extension);\n return request({ url, method: 'POST', noToken: true });\n },\n\n /**\n * Runs the diagnostics\n * @returns {diagnostic}\n */\n run() {\n const information = [];\n const scores = {};\n const testers = [];\n const customInput = this.getCustomInput();\n\n const doRun = () => {\n // common handling for testers\n const doCheck = (testerConfig, cb) => {\n const testerId = testerConfig.id;\n\n /**\n * Notifies the start of a tester operation\n * @event diagnostic#starttester\n * @param {string} name - The name of the tester\n */\n this.trigger('starttester', testerId);\n this.setState(testerId, true);\n\n /**\n * Process the diagnostic from the loaded tester\n * @param {Function} testerFactory\n * @private\n */\n const processTester = testerFactory => {\n const tester = testerFactory(getConfig(testerConfig, this.config), this);\n this.changeStatus(tester.labels.status);\n tester.start((status, details, results) => {\n if (testerConfig.customMsgKey) {\n const customMsg = this.getCustomMsg(testerConfig.customMsgKey);\n this.addCustomFeedbackMsg(status, customMsg);\n }\n\n // the returned details must be ingested into the main details list\n _.forEach(details, info => information.push(info));\n scores[status.id] = status;\n\n /**\n * Notifies the end of a tester operation\n * @event diagnostic#endtester\n * @param {string} id - The identifier of the tester\n * @param {Array} results - The results of the test\n */\n this.trigger('endtester', testerId, status);\n this.setState(testerId, false);\n\n // results should be filtered in order to encode complex data\n results = _.mapValues(results, value => {\n switch (typeof value) {\n case 'boolean':\n return value ? 1 : 0;\n case 'object':\n return JSON.stringify(value);\n }\n return value;\n });\n\n // send the data to store\n this.store(testerId, results, () => {\n this.addResult(status);\n cb();\n });\n });\n };\n\n /**\n * React to loading failure\n * @param {Error} err\n * @private\n */\n const processFailure = err => {\n logger.error(err);\n feedback().error(\n __(\n 'Unable to process with the diagnostic tester %s. The tester module is unreachable.',\n testerId\n )\n );\n cb();\n };\n\n require([testerConfig.tester], processTester, processFailure);\n };\n\n if (this.is('rendered')) {\n // set up the component to a new run\n this.prepare();\n\n _.forEach(this.config.testers, (testerConfig, testerId) => {\n testerConfig.id = testerConfig.id || testerId;\n if (testerConfig.enabled) {\n testers.push(cb => doCheck(testerConfig, cb));\n }\n });\n\n // launch each testers in series, then display the results\n async.series(testers, () => {\n // pick the lowest percentage as the main score\n const total = _.minBy(scores, 'globalPercentage');\n\n // get a status according to the main score\n const status = getStatus(total.globalPercentage, _thresholds);\n\n // display the result\n status.title = __('Total');\n status.id = 'total';\n this.addCustomFeedbackMsg(status, this.config.configurableText.diagTotalCheckResult);\n\n status.details = information;\n this.addResult(status);\n\n // done !\n this.finish();\n });\n }\n };\n\n if (_.size(customInput) > 0) {\n this.store('custom_input', customInput, doRun);\n } else {\n doRun();\n }\n\n return this;\n },\n\n getCustomInput() {\n const vars = {};\n\n window.location.href.replace(location.hash, '').replace(/[?&]+([^=&]+)=?([^&]*)?/gi, (m, key, value) => {\n if (_.has(this.config['customInput'], key)) {\n vars[key] = typeof value !== 'undefined' ? value : '';\n }\n });\n\n return vars;\n }\n };\n\n /**\n * Builds an instance of the diagnostic tool\n * @param {object} container - Container in which the initialisation will render the diagnostic\n * @param {object} config\n * @param {string} [config.title] - The displayed title\n * @param {string} [config.header] - A header text displayed to describe the component\n * @param {string} [config.info] - An information text displayed to warn about run duration\n * @param {string} [config.button] - The caption of the start button\n * @param {string} [config.actionStore] - The name of the action to call to store the results\n * @param {string} [config.actionCheck] - The name of the action to call to check the browser results\n * @param {string} [config.actionSchool] - The name of the action to call to get the school name\n * @param {string} [config.controller] - The name of the controller to call\n * @param {string} [config.extension] - The name of the extension containing the controller\n * @param {object} [config.storeParams] - A list of additional parameters to send with diagnostic results\n * @param {boolean} [config.requireSchoolName] - If `true` require a school name to allow the tests to start\n * @param {boolean} [config.requireSchoolId] - If `true` require a school ID to allow the tests to start\n * @param {boolean} [config.validateSchoolName] - If `true` require a school number and a PIN to get the school name and to allow the tests to start\n *\n * @param {string} [config.browser.action] - The name of the action to call to get the browser checker\n * @param {string} [config.browser.controller] - The name of the controller to call to get the browser checker\n * @param {string} [config.browser.extension] - The name of the extension containing the controller to call to get the browser checker\n *\n * @param {number} [config.bandwidth.unit] - The typical bandwidth needed for a test taker (Mbps)\n * @param {Array} [config.bandwidth.ideal] - The thresholds for optimal bandwidth, one by bar\n * @param {number} [config.bandwidth.max] - Maximum number of test takers to display\n *\n * @param {Array} [config.performances.samples] - A list of samples to render in order to compute the rendering performances\n * @param {number} [config.performances.occurrences] - The number of renderings by samples\n * @param {number} [config.performances.timeout] - Max allowed duration for a sample rendering\n * @param {number} [config.performances.optimal] - The threshold for optimal performances\n * @param {number} [config.performances.threshold] - The threshold for minimal performances\n * @returns {diagnostic}\n */\n return function diagnosticFactory(container, config) {\n // fix the translations for content loaded from config files\n if (config) {\n _.forEach(['title', 'header', 'footer', 'info', 'button'], name => {\n if (config[name]) {\n config[name] = __(config[name]);\n }\n });\n }\n\n const diagComponent = component(diagnostic, _defaults)\n .setTemplate(mainTpl)\n\n // uninstalls the component\n .on('destroy', function onDiagnosticDestroy() {\n this.controls = null;\n })\n\n // initialise component\n .on('init', function onDiagnosticInit() {\n this.render(container);\n })\n // renders the component\n .on('render', function onDiagnosticRender() {\n /**\n * Starts the tests\n * @param {object} [data]\n * @private\n */\n const runDiagnostics = data => {\n // append the school name to the queries\n if (data && _.isPlainObject(data)) {\n this.config.storeParams = _.assign(this.config.storeParams || {}, data);\n }\n\n this.run();\n };\n\n /**\n * Default launcher\n * @private\n */\n let launch = () => runDiagnostics();\n\n /**\n * Gets a control by its registered name\n * @param {string} name - the name registered in the collection of controls\n * @private\n */\n const getControl = name => this.controls[`\\$${name}`];\n\n /**\n * Gets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @returns {string}\n * @private\n */\n function getInputValue(name) {\n const $control = getControl(name);\n return (($control && $control.val()) || '').trim();\n }\n\n /**\n * Sets the value of an input field\n * @param {string} name - the name registered in the collection of controls\n * @param {string} value\n * @private\n */\n function setInputValue(name, value) {\n const $control = getControl(name);\n $control && $control.val(value);\n }\n\n /**\n * Enable/Disable a control\n * @param {string} name - the name registered in the collection of controls\n * @param {boolean} [state]\n * @private\n */\n function toggleControl(name, state) {\n const $control = getControl(name);\n if ($control) {\n if (typeof state === 'undefined') {\n state = !$control.is(':enabled');\n }\n if (state) {\n $control.prop('disabled', false);\n } else {\n $control.prop('disabled', true);\n }\n }\n }\n\n /**\n * Requests the server to get the school name\n * @param {object} values\n * @private\n */\n const requestSchoolName = values => {\n const componentConfig = this.config;\n return requestData(\n urlHelper.route(\n componentConfig.actionSchool,\n componentConfig.controller,\n componentConfig.extension\n ),\n values,\n 'POST'\n ).then(data => {\n return {\n school_name: data,\n school_number: values.school_number\n };\n });\n };\n\n /**\n * Install the school name manager.\n * @todo: improve this by moving it into a plugin, and obviously implement the plugin handling\n * @private\n */\n const manageSchoolProperties = (fields, validate) => {\n /**\n * Checks if the start button can be enabled\n * @returns {boolean}\n * @private\n */\n function toggleStart() {\n const allow = _.every(fields, getInputValue);\n toggleControl('start', allow);\n return allow;\n }\n\n /**\n * Enables/Disables the fields\n * @param {boolean} state\n * @private\n */\n function toggleFields(state) {\n _.forEach(fields, function(fieldName) {\n toggleControl(fieldName, state);\n });\n }\n\n // ensure the diagnostic cannot start without all fields properly input\n _.forEach(fields, fieldName => {\n this.controls[`\\$${fieldName}`] = this.getElement()\n .find(`[data-control=\"${fieldName}\"]`)\n .on('keypress', e => {\n const shouldStart = e.which === 13;\n if (shouldStart) {\n e.preventDefault();\n }\n _.defer(() => {\n if (toggleStart() && shouldStart) {\n this.controls.$start.click();\n }\n });\n });\n });\n\n toggleStart();\n\n // will store the school name in the browser storage, that will allow to restore it next time\n toggleFields(false);\n store('client-diagnostic')\n .then(storage => {\n // store the school name on test start, to ensure consistency\n this.on('start.school', () => {\n _.forEach(fields, fieldName => {\n storage.setItem(fieldName, getInputValue(fieldName)).catch(error => {\n logger.error(error);\n });\n });\n });\n\n // restore the school name on load\n return Promise.all(\n _.map(fields, fieldName => {\n return storage.getItem(fieldName).then(value => {\n setInputValue(fieldName, value);\n });\n })\n );\n })\n .catch(error => {\n logger.error(error);\n })\n .then(() => {\n toggleFields(true);\n toggleStart();\n });\n\n // ensure the fields are validated and the school name is properly sent before allowing to launch the test\n launch = () => {\n const values = _.reduce(\n fields,\n (result, fieldName) => {\n result[fieldName] = getInputValue(fieldName);\n return result;\n },\n {}\n );\n\n this.changeStatus(__('Getting school name...'))\n .cleanUp()\n .disable();\n\n if (_.isFunction(validate)) {\n validate(values)\n .then(runDiagnostics)\n .catch(error => {\n const response = error.response || {};\n const message =\n response.errorMsg ||\n response.errorMessage ||\n __('An error occurred! Please verify your input!');\n dialogAlert(message);\n logger.error(error);\n this.changeStatus(__('Failed to get school name')).enable();\n });\n } else {\n runDiagnostics(values);\n }\n };\n\n // ensure the fields are not writable while the test is running\n this.on('start.school', () => {\n toggleFields(false);\n }).on('end.school', () => {\n toggleFields(true);\n });\n };\n\n // get access to all needed placeholders\n this.controls = {\n $start: this.$component.find('[data-action=\"test-launcher\"]'),\n $status: this.$component.find('.status h2'),\n $results: this.$component.find('.results')\n };\n\n // start the diagnostic\n this.controls.$start.on('click', () => {\n this.controls.$start.is(':enabled') && launch();\n });\n\n if (this.config.requireSchoolName) {\n if (this.config.validateSchoolName) {\n manageSchoolProperties(['school_number', 'school_pin'], requestSchoolName);\n } else {\n manageSchoolProperties(['school_name']);\n }\n }\n\n if (this.config.requireSchoolId) {\n manageSchoolProperties(['school_id', 'workstation']);\n }\n\n // show result details\n this.controls.$results.on('click', 'button[data-action=\"show-details\"]', function onShowDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.removeClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"hide-details\"]').removeClass('hidden');\n });\n\n // hide result details\n this.controls.$results.on('click', 'button[data-action=\"hide-details\"]', function onHideDetails() {\n const $btn = $(this).closest('button');\n const $result = $btn.closest('[data-result]');\n const $details = $result.find('.details');\n $details.addClass('hidden');\n $btn.addClass('hidden');\n $result.find('[data-action=\"show-details\"]').removeClass('hidden');\n });\n });\n\n _.defer(() => diagComponent.init(config));\n\n return diagComponent;\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/templates/diagnostic/main', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.diagInstructions), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                        \";\n if (helper = helpers.diagInstructions) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.diagInstructions); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                        \";\n return buffer;\n }\n\nfunction program4(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                        \";\n if (helper = helpers.header) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.header); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                        \";\n return buffer;\n }\n\nfunction program6(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"

                        \";\n if (helper = helpers.info) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.info); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                        \";\n return buffer;\n }\n\nfunction program8(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                        \\n \\n \\n

                        \\n \";\n return buffer;\n }\n\nfunction program10(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.validateSchoolName), {hash:{},inverse:self.program(13, program13, data),fn:self.program(11, program11, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n return buffer;\n }\nfunction program11(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                        \\n \\n \\n

                        \\n

                        \\n \\n \\n

                        \\n \";\n return buffer;\n }\n\nfunction program13(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n

                        \\n \\n \\n

                        \\n \";\n return buffer;\n }\n\n buffer += \"
                        \\n\\n

                        \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

                        \\n\\n
                        \\n \";\n stack1 = helpers['with'].call(depth0, (depth0 && depth0.configurableText), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.header), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.info), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolId), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.requireSchoolName), {hash:{},inverse:self.noop,fn:self.program(10, program10, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n

                        \\n \\n \\n

                        \\n
                        \\n\\n
                        \\n \\n
                        \\n\\n
                          \\n\\n
                          \\n

                          \\n
                          \\n\\n
                          \";\n return buffer;\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA;\n */\ndefine('taoClientDiagnostic/controller/Diagnostic/diagnostic',[\n 'module',\n 'jquery',\n 'i18n',\n 'helpers',\n 'core/request',\n 'layout/loading-bar',\n 'ui/actionbar',\n 'ui/feedback',\n 'taoClientDiagnostic/tools/diagnostic/diagnostic',\n 'tpl!taoClientDiagnostic/templates/diagnostic/main'\n], function(module, $, __, helpers, request, loadingBar, actionbar, feedback, diagnosticFactory, diagnosticTpl) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-runner';\n\n // the page is always loading data when starting\n loadingBar.start();\n\n /**\n * Controls the readiness check page\n * @type {object}\n */\n return {\n /**\n * Entry point of the page\n */\n start() {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const $list = $container.find('.list');\n const $panel = $('.panel');\n const extensionConfig = $container.data('config') || {};\n const config = extensionConfig.diagnostic || extensionConfig;\n const indexUrl = helpers._url('index', 'Diagnostic', extension);\n const buttons = [];\n const moduleConfig = module.config() || {};\n\n config.configurableText = moduleConfig.configurableText || {};\n\n /**\n * Installs the diagnostic tool GUI\n * @param {string} [workstation]\n */\n function installTester(workstation) {\n diagnosticFactory($list, config)\n .setTemplate(diagnosticTpl)\n .on('render', function onDiagnosticRender() {\n // get access to the input\n this.controls.$workstation = this.getElement()\n .find('[data-control=\"workstation\"]')\n .on('keypress', e => {\n if (e.which === 13) {\n e.preventDefault();\n this.run();\n }\n })\n .val(workstation);\n\n loadingBar.stop();\n if (config.autoStart) {\n this.run();\n }\n })\n .on('start', function onDiagnosticStart() {\n // append the workstation name to the queries\n this.config.storeParams = this.config.storeParams || {};\n this.config.storeParams.workstation = this.controls.$workstation.val();\n\n // disable the input when running the test\n this.controls.$workstation.prop('disabled', true);\n loadingBar.start();\n })\n .on('end', function onDiagnosticEnd() {\n // enable the input when the test is complete\n this.controls.$workstation.prop('disabled', false);\n loadingBar.stop();\n });\n }\n\n buttons.push({\n id: 'back',\n icon: 'step-backward',\n title: __('Return to the list'),\n label: __('List of readiness checks'),\n action() {\n window.location.href = indexUrl;\n }\n });\n\n // tool: close tab, this won't be present in an LTI iframe\n // button should always be right most\n if (window.self === window.top) {\n buttons.push({\n id: 'exitButton',\n icon: 'close',\n title: __('Exit'),\n label: __('Exit'),\n action() {\n window.self.close();\n }\n });\n }\n\n actionbar({\n renderTo: $panel,\n buttons\n });\n\n // need to know the workstation name to display it\n const url = helpers._url('workstation', 'DiagnosticChecker', extension);\n request({ url, noToken: true })\n .then(data => installTester(data && data.workstation))\n .catch(() => {\n feedback().error(__('Unable to get the workstation name!'));\n installTester();\n });\n }\n };\n});\n\n","!function(e,t,i){\"use strict\";\"function\"==typeof define&&define.amd?define('taoClientDiagnostic/lib/fingerprint/fingerprint2',i):\"undefined\"!=typeof module&&module.exports?module.exports=i():t.exports?t.exports=i():t[e]=i()}(\"Fingerprint2\",this,function(){\"use strict\";var e=function(t){if(!(this instanceof e))return new e(t);var i={swfContainerId:\"fingerprintjs2\",swfPath:\"flash/compiled/FontList.swf\",detectScreenOrientation:!0,sortPluginsFor:[/palemoon/i],userDefinedFonts:[]};this.options=this.extend(t,i),this.nativeForEach=Array.prototype.forEach,this.nativeMap=Array.prototype.map};return e.prototype={extend:function(e,t){if(null==e)return t;for(var i in e)null!=e[i]&&t[i]!==e[i]&&(t[i]=e[i]);return t},get:function(e){var t=this,i={data:[],push:function(e){var i=e.key,a=e.value;\"function\"==typeof t.options.preprocessor&&(a=t.options.preprocessor(i,a)),this.data.push({key:i,value:a})}};i=this.userAgentKey(i),i=this.languageKey(i),i=this.colorDepthKey(i),i=this.pixelRatioKey(i),i=this.hardwareConcurrencyKey(i),i=this.screenResolutionKey(i),i=this.availableScreenResolutionKey(i),i=this.timezoneOffsetKey(i),i=this.sessionStorageKey(i),i=this.localStorageKey(i),i=this.indexedDbKey(i),i=this.addBehaviorKey(i),i=this.openDatabaseKey(i),i=this.cpuClassKey(i),i=this.platformKey(i),i=this.doNotTrackKey(i),i=this.pluginsKey(i),i=this.canvasKey(i),i=this.webglKey(i),i=this.adBlockKey(i),i=this.hasLiedLanguagesKey(i),i=this.hasLiedResolutionKey(i),i=this.hasLiedOsKey(i),i=this.hasLiedBrowserKey(i),i=this.touchSupportKey(i),i=this.customEntropyFunction(i),this.fontsKey(i,function(i){var a=[];t.each(i.data,function(e){var t=e.value;\"undefined\"!=typeof e.value.join&&(t=e.value.join(\";\")),a.push(t)});var r=t.x64hash128(a.join(\"~~~\"),31);return e(r,i.data)})},customEntropyFunction:function(e){return\"function\"==typeof this.options.customFunction&&e.push({key:\"custom\",value:this.options.customFunction()}),e},userAgentKey:function(e){return this.options.excludeUserAgent||e.push({key:\"user_agent\",value:this.getUserAgent()}),e},getUserAgent:function(){return navigator.userAgent},languageKey:function(e){return this.options.excludeLanguage||e.push({key:\"language\",value:navigator.language||navigator.userLanguage||navigator.browserLanguage||navigator.systemLanguage||\"\"}),e},colorDepthKey:function(e){return this.options.excludeColorDepth||e.push({key:\"color_depth\",value:screen.colorDepth||-1}),e},pixelRatioKey:function(e){return this.options.excludePixelRatio||e.push({key:\"pixel_ratio\",value:this.getPixelRatio()}),e},getPixelRatio:function(){return window.devicePixelRatio||\"\"},screenResolutionKey:function(e){return this.options.excludeScreenResolution?e:this.getScreenResolution(e)},getScreenResolution:function(e){var t;return t=this.options.detectScreenOrientation&&screen.height>screen.width?[screen.height,screen.width]:[screen.width,screen.height],\"undefined\"!=typeof t&&e.push({key:\"resolution\",value:t}),e},availableScreenResolutionKey:function(e){return this.options.excludeAvailableScreenResolution?e:this.getAvailableScreenResolution(e)},getAvailableScreenResolution:function(e){var t;return screen.availWidth&&screen.availHeight&&(t=this.options.detectScreenOrientation?screen.availHeight>screen.availWidth?[screen.availHeight,screen.availWidth]:[screen.availWidth,screen.availHeight]:[screen.availHeight,screen.availWidth]),\"undefined\"!=typeof t&&e.push({key:\"available_resolution\",value:t}),e},timezoneOffsetKey:function(e){return this.options.excludeTimezoneOffset||e.push({key:\"timezone_offset\",value:(new Date).getTimezoneOffset()}),e},sessionStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasSessionStorage()&&e.push({key:\"session_storage\",value:1}),e},localStorageKey:function(e){return!this.options.excludeSessionStorage&&this.hasLocalStorage()&&e.push({key:\"local_storage\",value:1}),e},indexedDbKey:function(e){return!this.options.excludeIndexedDB&&this.hasIndexedDB()&&e.push({key:\"indexed_db\",value:1}),e},addBehaviorKey:function(e){return document.body&&!this.options.excludeAddBehavior&&document.body.addBehavior&&e.push({key:\"add_behavior\",value:1}),e},openDatabaseKey:function(e){return!this.options.excludeOpenDatabase&&window.openDatabase&&e.push({key:\"open_database\",value:1}),e},cpuClassKey:function(e){return this.options.excludeCpuClass||e.push({key:\"cpu_class\",value:this.getNavigatorCpuClass()}),e},platformKey:function(e){return this.options.excludePlatform||e.push({key:\"navigator_platform\",value:this.getNavigatorPlatform()}),e},doNotTrackKey:function(e){return this.options.excludeDoNotTrack||e.push({key:\"do_not_track\",value:this.getDoNotTrack()}),e},canvasKey:function(e){return!this.options.excludeCanvas&&this.isCanvasSupported()&&e.push({key:\"canvas\",value:this.getCanvasFp()}),e},webglKey:function(e){return this.options.excludeWebGL?e:this.isWebGlSupported()?(e.push({key:\"webgl\",value:this.getWebglFp()}),e):e},adBlockKey:function(e){return this.options.excludeAdBlock||e.push({key:\"adblock\",value:this.getAdBlock()}),e},hasLiedLanguagesKey:function(e){return this.options.excludeHasLiedLanguages||e.push({key:\"has_lied_languages\",value:this.getHasLiedLanguages()}),e},hasLiedResolutionKey:function(e){return this.options.excludeHasLiedResolution||e.push({key:\"has_lied_resolution\",value:this.getHasLiedResolution()}),e},hasLiedOsKey:function(e){return this.options.excludeHasLiedOs||e.push({key:\"has_lied_os\",value:this.getHasLiedOs()}),e},hasLiedBrowserKey:function(e){return this.options.excludeHasLiedBrowser||e.push({key:\"has_lied_browser\",value:this.getHasLiedBrowser()}),e},fontsKey:function(e,t){return this.options.excludeJsFonts?this.flashFontsKey(e,t):this.jsFontsKey(e,t)},flashFontsKey:function(e,t){return this.options.excludeFlashFonts?t(e):this.hasSwfObjectLoaded()&&this.hasMinFlashInstalled()?\"undefined\"==typeof this.options.swfPath?t(e):void this.loadSwfAndDetectFonts(function(i){e.push({key:\"swf_fonts\",value:i.join(\";\")}),t(e)}):t(e)},jsFontsKey:function(e,t){var i=this;return setTimeout(function(){var a=[\"monospace\",\"sans-serif\",\"serif\"],r=[\"Andale Mono\",\"Arial\",\"Arial Black\",\"Arial Hebrew\",\"Arial MT\",\"Arial Narrow\",\"Arial Rounded MT Bold\",\"Arial Unicode MS\",\"Bitstream Vera Sans Mono\",\"Book Antiqua\",\"Bookman Old Style\",\"Calibri\",\"Cambria\",\"Cambria Math\",\"Century\",\"Century Gothic\",\"Century Schoolbook\",\"Comic Sans\",\"Comic Sans MS\",\"Consolas\",\"Courier\",\"Courier New\",\"Garamond\",\"Geneva\",\"Georgia\",\"Helvetica\",\"Helvetica Neue\",\"Impact\",\"Lucida Bright\",\"Lucida Calligraphy\",\"Lucida Console\",\"Lucida Fax\",\"LUCIDA GRANDE\",\"Lucida Handwriting\",\"Lucida Sans\",\"Lucida Sans Typewriter\",\"Lucida Sans Unicode\",\"Microsoft Sans Serif\",\"Monaco\",\"Monotype Corsiva\",\"MS Gothic\",\"MS Outlook\",\"MS PGothic\",\"MS Reference Sans Serif\",\"MS Sans Serif\",\"MS Serif\",\"MYRIAD\",\"MYRIAD PRO\",\"Palatino\",\"Palatino Linotype\",\"Segoe Print\",\"Segoe Script\",\"Segoe UI\",\"Segoe UI Light\",\"Segoe UI Semibold\",\"Segoe UI Symbol\",\"Tahoma\",\"Times\",\"Times New Roman\",\"Times New Roman PS\",\"Trebuchet MS\",\"Verdana\",\"Wingdings\",\"Wingdings 2\",\"Wingdings 3\"],n=[\"Abadi MT Condensed Light\",\"Academy Engraved LET\",\"ADOBE CASLON PRO\",\"Adobe Garamond\",\"ADOBE GARAMOND PRO\",\"Agency FB\",\"Aharoni\",\"Albertus Extra Bold\",\"Albertus Medium\",\"Algerian\",\"Amazone BT\",\"American Typewriter\",\"American Typewriter Condensed\",\"AmerType Md BT\",\"Andalus\",\"Angsana New\",\"AngsanaUPC\",\"Antique Olive\",\"Aparajita\",\"Apple Chancery\",\"Apple Color Emoji\",\"Apple SD Gothic Neo\",\"Arabic Typesetting\",\"ARCHER\",\"ARNO PRO\",\"Arrus BT\",\"Aurora Cn BT\",\"AvantGarde Bk BT\",\"AvantGarde Md BT\",\"AVENIR\",\"Ayuthaya\",\"Bandy\",\"Bangla Sangam MN\",\"Bank Gothic\",\"BankGothic Md BT\",\"Baskerville\",\"Baskerville Old Face\",\"Batang\",\"BatangChe\",\"Bauer Bodoni\",\"Bauhaus 93\",\"Bazooka\",\"Bell MT\",\"Bembo\",\"Benguiat Bk BT\",\"Berlin Sans FB\",\"Berlin Sans FB Demi\",\"Bernard MT Condensed\",\"BernhardFashion BT\",\"BernhardMod BT\",\"Big Caslon\",\"BinnerD\",\"Blackadder ITC\",\"BlairMdITC TT\",\"Bodoni 72\",\"Bodoni 72 Oldstyle\",\"Bodoni 72 Smallcaps\",\"Bodoni MT\",\"Bodoni MT Black\",\"Bodoni MT Condensed\",\"Bodoni MT Poster Compressed\",\"Bookshelf Symbol 7\",\"Boulder\",\"Bradley Hand\",\"Bradley Hand ITC\",\"Bremen Bd BT\",\"Britannic Bold\",\"Broadway\",\"Browallia New\",\"BrowalliaUPC\",\"Brush Script MT\",\"Californian FB\",\"Calisto MT\",\"Calligrapher\",\"Candara\",\"CaslonOpnface BT\",\"Castellar\",\"Centaur\",\"Cezanne\",\"CG Omega\",\"CG Times\",\"Chalkboard\",\"Chalkboard SE\",\"Chalkduster\",\"Charlesworth\",\"Charter Bd BT\",\"Charter BT\",\"Chaucer\",\"ChelthmITC Bk BT\",\"Chiller\",\"Clarendon\",\"Clarendon Condensed\",\"CloisterBlack BT\",\"Cochin\",\"Colonna MT\",\"Constantia\",\"Cooper Black\",\"Copperplate\",\"Copperplate Gothic\",\"Copperplate Gothic Bold\",\"Copperplate Gothic Light\",\"CopperplGoth Bd BT\",\"Corbel\",\"Cordia New\",\"CordiaUPC\",\"Cornerstone\",\"Coronet\",\"Cuckoo\",\"Curlz MT\",\"DaunPenh\",\"Dauphin\",\"David\",\"DB LCD Temp\",\"DELICIOUS\",\"Denmark\",\"DFKai-SB\",\"Didot\",\"DilleniaUPC\",\"DIN\",\"DokChampa\",\"Dotum\",\"DotumChe\",\"Ebrima\",\"Edwardian Script ITC\",\"Elephant\",\"English 111 Vivace BT\",\"Engravers MT\",\"EngraversGothic BT\",\"Eras Bold ITC\",\"Eras Demi ITC\",\"Eras Light ITC\",\"Eras Medium ITC\",\"EucrosiaUPC\",\"Euphemia\",\"Euphemia UCAS\",\"EUROSTILE\",\"Exotc350 Bd BT\",\"FangSong\",\"Felix Titling\",\"Fixedsys\",\"FONTIN\",\"Footlight MT Light\",\"Forte\",\"FrankRuehl\",\"Fransiscan\",\"Freefrm721 Blk BT\",\"FreesiaUPC\",\"Freestyle Script\",\"French Script MT\",\"FrnkGothITC Bk BT\",\"Fruitger\",\"FRUTIGER\",\"Futura\",\"Futura Bk BT\",\"Futura Lt BT\",\"Futura Md BT\",\"Futura ZBlk BT\",\"FuturaBlack BT\",\"Gabriola\",\"Galliard BT\",\"Gautami\",\"Geeza Pro\",\"Geometr231 BT\",\"Geometr231 Hv BT\",\"Geometr231 Lt BT\",\"GeoSlab 703 Lt BT\",\"GeoSlab 703 XBd BT\",\"Gigi\",\"Gill Sans\",\"Gill Sans MT\",\"Gill Sans MT Condensed\",\"Gill Sans MT Ext Condensed Bold\",\"Gill Sans Ultra Bold\",\"Gill Sans Ultra Bold Condensed\",\"Gisha\",\"Gloucester MT Extra Condensed\",\"GOTHAM\",\"GOTHAM BOLD\",\"Goudy Old Style\",\"Goudy Stout\",\"GoudyHandtooled BT\",\"GoudyOLSt BT\",\"Gujarati Sangam MN\",\"Gulim\",\"GulimChe\",\"Gungsuh\",\"GungsuhChe\",\"Gurmukhi MN\",\"Haettenschweiler\",\"Harlow Solid Italic\",\"Harrington\",\"Heather\",\"Heiti SC\",\"Heiti TC\",\"HELV\",\"Herald\",\"High Tower Text\",\"Hiragino Kaku Gothic ProN\",\"Hiragino Mincho ProN\",\"Hoefler Text\",\"Humanst 521 Cn BT\",\"Humanst521 BT\",\"Humanst521 Lt BT\",\"Imprint MT Shadow\",\"Incised901 Bd BT\",\"Incised901 BT\",\"Incised901 Lt BT\",\"INCONSOLATA\",\"Informal Roman\",\"Informal011 BT\",\"INTERSTATE\",\"IrisUPC\",\"Iskoola Pota\",\"JasmineUPC\",\"Jazz LET\",\"Jenson\",\"Jester\",\"Jokerman\",\"Juice ITC\",\"Kabel Bk BT\",\"Kabel Ult BT\",\"Kailasa\",\"KaiTi\",\"Kalinga\",\"Kannada Sangam MN\",\"Kartika\",\"Kaufmann Bd BT\",\"Kaufmann BT\",\"Khmer UI\",\"KodchiangUPC\",\"Kokila\",\"Korinna BT\",\"Kristen ITC\",\"Krungthep\",\"Kunstler Script\",\"Lao UI\",\"Latha\",\"Leelawadee\",\"Letter Gothic\",\"Levenim MT\",\"LilyUPC\",\"Lithograph\",\"Lithograph Light\",\"Long Island\",\"Lydian BT\",\"Magneto\",\"Maiandra GD\",\"Malayalam Sangam MN\",\"Malgun Gothic\",\"Mangal\",\"Marigold\",\"Marion\",\"Marker Felt\",\"Market\",\"Marlett\",\"Matisse ITC\",\"Matura MT Script Capitals\",\"Meiryo\",\"Meiryo UI\",\"Microsoft Himalaya\",\"Microsoft JhengHei\",\"Microsoft New Tai Lue\",\"Microsoft PhagsPa\",\"Microsoft Tai Le\",\"Microsoft Uighur\",\"Microsoft YaHei\",\"Microsoft Yi Baiti\",\"MingLiU\",\"MingLiU_HKSCS\",\"MingLiU_HKSCS-ExtB\",\"MingLiU-ExtB\",\"Minion\",\"Minion Pro\",\"Miriam\",\"Miriam Fixed\",\"Mistral\",\"Modern\",\"Modern No. 20\",\"Mona Lisa Solid ITC TT\",\"Mongolian Baiti\",\"MONO\",\"MoolBoran\",\"Mrs Eaves\",\"MS LineDraw\",\"MS Mincho\",\"MS PMincho\",\"MS Reference Specialty\",\"MS UI Gothic\",\"MT Extra\",\"MUSEO\",\"MV Boli\",\"Nadeem\",\"Narkisim\",\"NEVIS\",\"News Gothic\",\"News GothicMT\",\"NewsGoth BT\",\"Niagara Engraved\",\"Niagara Solid\",\"Noteworthy\",\"NSimSun\",\"Nyala\",\"OCR A Extended\",\"Old Century\",\"Old English Text MT\",\"Onyx\",\"Onyx BT\",\"OPTIMA\",\"Oriya Sangam MN\",\"OSAKA\",\"OzHandicraft BT\",\"Palace Script MT\",\"Papyrus\",\"Parchment\",\"Party LET\",\"Pegasus\",\"Perpetua\",\"Perpetua Titling MT\",\"PetitaBold\",\"Pickwick\",\"Plantagenet Cherokee\",\"Playbill\",\"PMingLiU\",\"PMingLiU-ExtB\",\"Poor Richard\",\"Poster\",\"PosterBodoni BT\",\"PRINCETOWN LET\",\"Pristina\",\"PTBarnum BT\",\"Pythagoras\",\"Raavi\",\"Rage Italic\",\"Ravie\",\"Ribbon131 Bd BT\",\"Rockwell\",\"Rockwell Condensed\",\"Rockwell Extra Bold\",\"Rod\",\"Roman\",\"Sakkal Majalla\",\"Santa Fe LET\",\"Savoye LET\",\"Sceptre\",\"Script\",\"Script MT Bold\",\"SCRIPTINA\",\"Serifa\",\"Serifa BT\",\"Serifa Th BT\",\"ShelleyVolante BT\",\"Sherwood\",\"Shonar Bangla\",\"Showcard Gothic\",\"Shruti\",\"Signboard\",\"SILKSCREEN\",\"SimHei\",\"Simplified Arabic\",\"Simplified Arabic Fixed\",\"SimSun\",\"SimSun-ExtB\",\"Sinhala Sangam MN\",\"Sketch Rockwell\",\"Skia\",\"Small Fonts\",\"Snap ITC\",\"Snell Roundhand\",\"Socket\",\"Souvenir Lt BT\",\"Staccato222 BT\",\"Steamer\",\"Stencil\",\"Storybook\",\"Styllo\",\"Subway\",\"Swis721 BlkEx BT\",\"Swiss911 XCm BT\",\"Sylfaen\",\"Synchro LET\",\"System\",\"Tamil Sangam MN\",\"Technical\",\"Teletype\",\"Telugu Sangam MN\",\"Tempus Sans ITC\",\"Terminal\",\"Thonburi\",\"Traditional Arabic\",\"Trajan\",\"TRAJAN PRO\",\"Tristan\",\"Tubular\",\"Tunga\",\"Tw Cen MT\",\"Tw Cen MT Condensed\",\"Tw Cen MT Condensed Extra Bold\",\"TypoUpright BT\",\"Unicorn\",\"Univers\",\"Univers CE 55 Medium\",\"Univers Condensed\",\"Utsaah\",\"Vagabond\",\"Vani\",\"Vijaya\",\"Viner Hand ITC\",\"VisualUI\",\"Vivaldi\",\"Vladimir Script\",\"Vrinda\",\"Westminster\",\"WHITNEY\",\"Wide Latin\",\"ZapfEllipt BT\",\"ZapfHumnst BT\",\"ZapfHumnst Dm BT\",\"Zapfino\",\"Zurich BlkEx BT\",\"Zurich Ex BT\",\"ZWAdobeF\"];i.options.extendedJsFonts&&(r=r.concat(n)),r=r.concat(i.options.userDefinedFonts);var o=\"mmmmmmmmmmlli\",s=\"72px\",l=document.getElementsByTagName(\"body\")[0],h=document.createElement(\"div\"),u=document.createElement(\"div\"),c={},d={},g=function(){var e=document.createElement(\"span\");return e.style.position=\"absolute\",e.style.left=\"-9999px\",e.style.fontSize=s,e.style.lineHeight=\"normal\",e.innerHTML=o,e},p=function(e,t){var i=g();return i.style.fontFamily=\"'\"+e+\"',\"+t,i},f=function(){for(var e=[],t=0,i=a.length;tt.name?1:e.name=0?\"Windows Phone\":t.indexOf(\"win\")>=0?\"Windows\":t.indexOf(\"android\")>=0?\"Android\":t.indexOf(\"linux\")>=0?\"Linux\":t.indexOf(\"iphone\")>=0||t.indexOf(\"ipad\")>=0?\"iOS\":t.indexOf(\"mac\")>=0?\"Mac\":\"Other\";var r;if(r=\"ontouchstart\"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0,r&&\"Windows Phone\"!==e&&\"Android\"!==e&&\"iOS\"!==e&&\"Other\"!==e)return!0;if(\"undefined\"!=typeof i){if(i=i.toLowerCase(),i.indexOf(\"win\")>=0&&\"Windows\"!==e&&\"Windows Phone\"!==e)return!0;if(i.indexOf(\"linux\")>=0&&\"Linux\"!==e&&\"Android\"!==e)return!0;if(i.indexOf(\"mac\")>=0&&\"Mac\"!==e&&\"iOS\"!==e)return!0;if(0===i.indexOf(\"win\")&&0===i.indexOf(\"linux\")&&i.indexOf(\"mac\")>=0&&\"other\"!==e)return!0}return a.indexOf(\"win\")>=0&&\"Windows\"!==e&&\"Windows Phone\"!==e||((a.indexOf(\"linux\")>=0||a.indexOf(\"android\")>=0||a.indexOf(\"pike\")>=0)&&\"Linux\"!==e&&\"Android\"!==e||((a.indexOf(\"mac\")>=0||a.indexOf(\"ipad\")>=0||a.indexOf(\"ipod\")>=0||a.indexOf(\"iphone\")>=0)&&\"Mac\"!==e&&\"iOS\"!==e||(0===a.indexOf(\"win\")&&0===a.indexOf(\"linux\")&&a.indexOf(\"mac\")>=0&&\"other\"!==e||\"undefined\"==typeof navigator.plugins&&\"Windows\"!==e&&\"Windows Phone\"!==e)))},getHasLiedBrowser:function(){var e,t=navigator.userAgent.toLowerCase(),i=navigator.productSub;if(e=t.indexOf(\"firefox\")>=0?\"Firefox\":t.indexOf(\"opera\")>=0||t.indexOf(\"opr\")>=0?\"Opera\":t.indexOf(\"chrome\")>=0?\"Chrome\":t.indexOf(\"safari\")>=0?\"Safari\":t.indexOf(\"trident\")>=0?\"Internet Explorer\":\"Other\",(\"Chrome\"===e||\"Safari\"===e||\"Opera\"===e)&&\"20030107\"!==i)return!0;var a=eval.toString().length;if(37===a&&\"Safari\"!==e&&\"Firefox\"!==e&&\"Other\"!==e)return!0;if(39===a&&\"Internet Explorer\"!==e&&\"Other\"!==e)return!0;if(33===a&&\"Chrome\"!==e&&\"Opera\"!==e&&\"Other\"!==e)return!0;var r;try{throw\"a\"}catch(n){try{n.toSource(),r=!0}catch(o){r=!1}}return!(!r||\"Firefox\"===e||\"Other\"===e)},isCanvasSupported:function(){var e=document.createElement(\"canvas\");return!(!e.getContext||!e.getContext(\"2d\"))},isWebGlSupported:function(){if(!this.isCanvasSupported())return!1;var e,t=document.createElement(\"canvas\");try{e=t.getContext&&(t.getContext(\"webgl\")||t.getContext(\"experimental-webgl\"))}catch(i){e=!1}return!!window.WebGLRenderingContext&&!!e},isIE:function(){return\"Microsoft Internet Explorer\"===navigator.appName||!(\"Netscape\"!==navigator.appName||!/Trident/.test(navigator.userAgent))},hasSwfObjectLoaded:function(){return\"undefined\"!=typeof window.swfobject},hasMinFlashInstalled:function(){return swfobject.hasFlashPlayerVersion(\"9.0.0\")},addFlashDivNode:function(){var e=document.createElement(\"div\");e.setAttribute(\"id\",this.options.swfContainerId),document.body.appendChild(e)},loadSwfAndDetectFonts:function(e){var t=\"___fp_swf_loaded\";window[t]=function(t){e(t)};var i=this.options.swfContainerId;this.addFlashDivNode();var a={onReady:t},r={allowScriptAccess:\"always\",menu:\"false\"};swfobject.embedSWF(this.options.swfPath,i,\"1\",\"1\",\"9.0.0\",!1,a,r,{})},getWebglCanvas:function(){var e=document.createElement(\"canvas\"),t=null;try{t=e.getContext(\"webgl\")||e.getContext(\"experimental-webgl\")}catch(i){}return t||(t=null),t},each:function(e,t,i){if(null!==e)if(this.nativeForEach&&e.forEach===this.nativeForEach)e.forEach(t,i);else if(e.length===+e.length){for(var a=0,r=e.length;a>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]+t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]+t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]+t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]+t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Multiply:function(e,t){e=[e[0]>>>16,65535&e[0],e[1]>>>16,65535&e[1]],t=[t[0]>>>16,65535&t[0],t[1]>>>16,65535&t[1]];var i=[0,0,0,0];return i[3]+=e[3]*t[3],i[2]+=i[3]>>>16,i[3]&=65535,i[2]+=e[2]*t[3],i[1]+=i[2]>>>16,i[2]&=65535,i[2]+=e[3]*t[2],i[1]+=i[2]>>>16,i[2]&=65535,i[1]+=e[1]*t[3],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[2]*t[2],i[0]+=i[1]>>>16,i[1]&=65535,i[1]+=e[3]*t[1],i[0]+=i[1]>>>16,i[1]&=65535,i[0]+=e[0]*t[3]+e[1]*t[2]+e[2]*t[1]+e[3]*t[0],i[0]&=65535,[i[0]<<16|i[1],i[2]<<16|i[3]]},x64Rotl:function(e,t){return t%=64,32===t?[e[1],e[0]]:t<32?[e[0]<>>32-t,e[1]<>>32-t]:(t-=32,[e[1]<>>32-t,e[0]<>>32-t])},x64LeftShift:function(e,t){return t%=64,0===t?e:t<32?[e[0]<>>32-t,e[1]<>>1]),e=this.x64Multiply(e,[4283543511,3981806797]),e=this.x64Xor(e,[0,e[0]>>>1]),e=this.x64Multiply(e,[3301882366,444984403]),e=this.x64Xor(e,[0,e[0]>>>1])},x64hash128:function(e,t){\ne=e||\"\",t=t||0;for(var i=e.length%16,a=e.length-i,r=[0,t],n=[0,t],o=[0,0],s=[0,0],l=[2277735313,289559509],h=[1291169091,658871167],u=0;u>>0).toString(16)).slice(-8)+(\"00000000\"+(r[1]>>>0).toString(16)).slice(-8)+(\"00000000\"+(n[0]>>>0).toString(16)).slice(-8)+(\"00000000\"+(n[1]>>>0).toString(16)).slice(-8)}},e.VERSION=\"1.5.1\",e});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/fingerprint/tester',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/logger',\n 'core/store',\n 'core/format',\n 'lib/uuid',\n 'taoClientDiagnostic/tools/getConfig',\n 'taoClientDiagnostic/tools/getLabels',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/lib/fingerprint/fingerprint2'\n], function($, _, __, url, loggerFactory, store, format, uuid, getConfig, getLabels, getStatus, Fingerprint2) {\n 'use strict';\n\n /**\n * @type {logger}\n * @private\n */\n const logger = loggerFactory('taoClientDiagnostic/fingerprint');\n\n /**\n * Some default values\n * @type {object}\n * @private\n */\n const _defaults = {\n id: 'fingerprint'\n };\n\n /**\n * The names of the storage keys used to persist info on the browser\n * @type {object}\n * @private\n */\n const _storageKeys = {\n store: 'client-diagnostic',\n uuid: 'uuid',\n fingerprint: 'value',\n details: 'details',\n errors: 'errors',\n changed: 'changed'\n };\n\n /**\n * List of threshold values, for each kind of context\n * @type {object}\n * @private\n */\n const _thresholdValues = {\n error: 0,\n storageIssue: 50,\n changedFingerprint: 90,\n success: 100\n };\n\n /**\n * A list of thresholds\n * @type {Array}\n * @private\n */\n const _thresholds = [\n {\n threshold: _thresholdValues.error,\n message: __('Cannot get your fingerprint'),\n type: 'error'\n },\n {\n threshold: _thresholdValues.storageIssue,\n message: __(\n 'Your fingerprint is %s. However we encountered issue while retrieving the data. Maybe your available disk space is too small'\n ),\n type: 'warning'\n },\n {\n threshold: _thresholdValues.changedFingerprint,\n message: __(\n 'Your fingerprint is %s. However it seems it has changed since the last check. It could be related to changes in your system.'\n ),\n type: 'success'\n },\n {\n threshold: _thresholdValues.success,\n message: __('Your fingerprint is %s'),\n type: 'success'\n }\n ];\n\n /**\n * List of translated texts per level.\n * The level is provided through the config as a numeric value, starting from 1.\n * @type {object}\n * @private\n */\n const _messages = [\n // level 1\n {\n title: __('Fingerprint'),\n status: __('Computing the fingerprint...'),\n fingerprintValue: __('Fingerprint'),\n fingerprintUUID: __('Dynamic UID'),\n fingerprintDetails: __('Fingerprint sources'),\n fingerprintChanged: __('Change since last fingerprint'),\n fingerprintErrors: __('Fingerprint errors'),\n fingerprintError: __('Fingerprint error')\n }\n ];\n\n /**\n * Performs a browser fingerprint capture\n *\n * @param {object} config - Some optional configs\n * @param {string} [config.id] - The identifier of the test\n * @param {string} [config.level] - The intensity level of the test. It will aim which messages list to use.\n * @returns {object}\n */\n return function browserFingerprint(config) {\n const initConfig = getConfig(config, _defaults);\n const labels = getLabels(_messages, initConfig.level);\n\n return {\n /**\n * Performs a browser fingerprint capture, then call a function to provide the result\n * @param {Function} done\n */\n start(done) {\n let browserId = 'error';\n let lastFingerprint = 'error';\n let freshBrowserId = false;\n let newFingerprint = false;\n let browserStorage;\n const errors = [];\n\n function handleError(error) {\n errors.push({\n key: 'error',\n value: '' + error\n });\n logger.error(error);\n }\n\n function getStorageKey(key) {\n return `${initConfig.id}-${_storageKeys[key]}`;\n }\n\n store(_storageKeys.store)\n .then(storage => {\n browserStorage = storage;\n return Promise.all([\n browserStorage.getItem(getStorageKey('uuid')).then(value => {\n browserId = value;\n }),\n browserStorage.getItem(getStorageKey('fingerprint')).then(value => {\n lastFingerprint = value;\n })\n ]);\n })\n .catch(handleError)\n .then(() => {\n return new Promise(resolve => {\n new Fingerprint2().get((result, details) => {\n const results = {};\n results[_storageKeys.fingerprint] = ('' + result).toUpperCase();\n results[_storageKeys.details] = details;\n resolve(results);\n });\n });\n })\n .then(results => {\n const pendingPromises = [];\n const resultFingerprint = results[_storageKeys.fingerprint];\n\n if (!browserId) {\n browserId = uuid(32, 16);\n freshBrowserId = true;\n }\n\n newFingerprint = lastFingerprint !== resultFingerprint && lastFingerprint !== 'error';\n\n // update the results with storage state\n // also detect a change in the fingerprint\n // (if the browser already have a uuid in the storage but the fingerprint changes)\n results[_storageKeys.uuid] = browserId;\n results[_storageKeys.changed] = newFingerprint && !freshBrowserId;\n\n if (browserStorage) {\n if (freshBrowserId) {\n pendingPromises.push(browserStorage.setItem(getStorageKey('uuid'), browserId));\n }\n if (newFingerprint) {\n pendingPromises.push(\n browserStorage.setItem(getStorageKey('fingerprint'), resultFingerprint)\n );\n }\n }\n\n return Promise.all(pendingPromises)\n .catch(handleError)\n .then(() => results);\n })\n .catch(handleError)\n .then(results => {\n results = results || {};\n if (errors.length) {\n results[_storageKeys.errors] = errors.length;\n results[_storageKeys.details] = (results[_storageKeys.details] || []).concat(errors);\n }\n\n const summary = this.getSummary(results);\n const status = this.getFeedback(results);\n done(status, summary, results);\n });\n },\n\n /**\n * Gets the labels loaded for the tester\n * @returns {object}\n */\n get labels() {\n return labels;\n },\n\n /**\n * Builds the results summary\n * @param {object} results\n * @returns {object}\n */\n getSummary(results) {\n const sources = _(results[_storageKeys.details])\n .map('key')\n .pull('error')\n .value();\n const summary = {\n fingerprintValue: {\n message: labels.fingerprintValue,\n value: results[_storageKeys.fingerprint]\n },\n fingerprintDetails: {\n message: labels.fingerprintDetails,\n value: __('%d sources (%s)', _.size(sources), sources.join(', '))\n },\n fingerprintChanged: {\n message: labels.fingerprintChanged,\n value: results[_storageKeys.changed] ? __('Yes') : __('No')\n }\n };\n\n if (results[_storageKeys.errors]) {\n summary.fingerprintErrors = {\n message: labels.fingerprintErrors,\n value: results[_storageKeys.errors]\n };\n\n _.forEach(results[_storageKeys.details], (details, idx) => {\n if (details.key === 'error') {\n summary['fingerprintError' + idx] = {\n message: labels.fingerprintError,\n value: details.value\n };\n }\n });\n }\n\n return summary;\n },\n\n /**\n * Gets the feedback status for the provided result value\n * @param {object} results\n * @returns {object}\n */\n getFeedback(results) {\n let percentage;\n\n if (!results || !results[_storageKeys.fingerprint] || results[_storageKeys.fingerprint] === 'error') {\n percentage = _thresholdValues.error;\n } else if (results[_storageKeys.uuid] === 'error') {\n percentage = _thresholdValues.storageIssue;\n } else if (results[_storageKeys.changed]) {\n percentage = _thresholdValues.changedFingerprint;\n } else {\n percentage = _thresholdValues.success;\n }\n\n const status = getStatus(percentage, _thresholds);\n status.id = initConfig.id;\n status.title = labels.title;\n status.feedback.message = format(status.feedback.message, results && results[_storageKeys.fingerprint]);\n\n return status;\n }\n };\n };\n});\n\n","\ndefine('tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint', ['handlebars'], function(hb){ return hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this, functionType=\"function\";\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n\\n \";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1);\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.errors), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n \\n \\n\";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \" errors\";\n }\n\nfunction program4(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Errors occurred! Please see details\", options) : helperMissing.call(depth0, \"__\", \"Errors occurred! Please see details\", options)))\n + \"\\\"\";\n return buffer;\n }\n\nfunction program6(depth0,data) {\n \n \n return \" \";\n }\n\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.value), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }); });\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/tools/csvExporter',['jquery', 'lodash', 'i18n', 'core/request', 'layout/loading-bar', 'helpers'], function(\n $,\n _,\n __,\n request,\n loadingBar,\n helpers\n) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-index';\n\n /**\n * Export diagnostics to CSV\n * @type {object}\n */\n return {\n /**\n * Exports all diagnostics to CSV\n * @param {Array} model - data presentation model\n */\n exportCsv(model) {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const serviceUrl = helpers._url('diagnosticData', 'Diagnostic', extension);\n\n // filtering and transforming diagnostic data according to the model\n function mappingDiagnosticsData(diagnostics) {\n return diagnostics.map(diagnostic => {\n const result = {};\n _.forEach(model, field => {\n result[field.id] = field.transform\n ? field.transform(diagnostic[field.id], diagnostic)\n : diagnostic[field.id];\n });\n return result;\n });\n }\n\n // a string variable is created containing the contents of the csv file\n function arrayToCsv(data, columnDelimiter = ',', lineDelimiter = '\\n') {\n const keys = Object.keys(data[0]);\n let result = `${keys.join(columnDelimiter)}${lineDelimiter}`;\n data.forEach(item => {\n let ctr = 0;\n keys.forEach(key => {\n if (ctr > 0) {\n result += columnDelimiter;\n }\n result +=\n typeof item[key] === 'string' && item[key].includes(columnDelimiter)\n ? `\"${item[key]}\"`\n : item[key];\n ctr++;\n });\n result += lineDelimiter;\n });\n return result;\n }\n\n // file download from content\n function downloadFile(content, filename, type) {\n const blob = new Blob([content], { type: type });\n const url = URL.createObjectURL(blob);\n let link = $('');\n link.attr('download', filename)\n .attr('href', url)\n .get(0)\n .click();\n\n URL.revokeObjectURL(url);\n\n link = null;\n }\n\n loadingBar.start();\n\n request({\n url: serviceUrl,\n data: { rows: Number.MAX_SAFE_INTEGER },\n noToken: true\n })\n .then(response => {\n const mappedData = mappingDiagnosticsData(response.data);\n let csvContent = arrayToCsv(mappedData);\n downloadFile(csvContent, __('diagnostics.csv'), 'text/csv');\n loadingBar.stop();\n })\n .catch(() => {\n loadingBar.stop();\n });\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 (original work) Open Assessment Technologies SA ;\n */\ndefine('taoClientDiagnostic/controller/Diagnostic/index',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'helpers',\n 'moment',\n 'core/request',\n 'layout/loading-bar',\n 'util/encode',\n 'ui/feedback',\n 'ui/dialog',\n 'taoClientDiagnostic/tools/getStatus',\n 'taoClientDiagnostic/tools/performances/tester',\n 'taoClientDiagnostic/tools/fingerprint/tester',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/fingerprint',\n 'tpl!taoClientDiagnostic/tools/diagnostic/tpl/details',\n 'taoClientDiagnostic/tools/csvExporter',\n 'ui/datatable',\n 'lib/moment-timezone.min'\n], function(\n $,\n _,\n __,\n helpers,\n moment,\n request,\n loadingBar,\n encode,\n feedback,\n dialog,\n getStatus,\n performancesTesterFactory,\n fingerprintTesterFactory,\n fingerprintTpl,\n detailsTpl,\n csvExporter\n) {\n 'use strict';\n\n /**\n * The CSS scope\n * @type {string}\n * @private\n */\n const cssScope = '.diagnostic-index';\n\n /**\n * Default Time Zone for date\n * @type {string}\n * @private\n */\n const defaultDateTimeZone = 'UTC';\n\n /**\n * Default date format\n * @type {string}\n * @private\n */\n const defaultDateFormat = 'Y/MM/DD HH:mm:ss';\n\n /**\n * Format a number with decimals\n * @param {number} value - The number to format\n * @param {number|string} [digits] - The number of decimals\n * @returns {number}\n * @private\n */\n function formatNumber(value, digits) {\n const nb = 'undefined' === typeof digits ? 2 : Math.max(0, parseInt(digits, 10));\n const factor = Math.pow(10, nb) || 1;\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Format a bandwidth value\n * @param {number} value\n * @returns {number|string}\n * @private\n */\n function formatBandwidth(value) {\n if (value > 100) {\n return '> 100';\n }\n\n return formatNumber(value);\n }\n\n /**\n * Transform date to local timezone\n * @param {string} date\n * @returns {string}\n * @private\n */\n function transformDateToLocal(date) {\n let time;\n\n if (_.isFinite(date)) {\n if (!_.isNumber(date)) {\n date = _.parseInt(date, 10);\n }\n const d = new Date(date * 1000);\n time = moment.utc(d);\n } else {\n time = moment.tz(date, defaultDateTimeZone);\n }\n\n return time.tz(moment.tz.guess()).format(defaultDateFormat);\n }\n\n // the page is always loading data when starting\n loadingBar.start();\n\n /**\n * Controls the readiness check page\n */\n return {\n /**\n * Entry point of the page\n */\n start() {\n const $container = $(cssScope);\n const extension = $container.data('extension') || 'taoClientDiagnostic';\n const $list = $container.find('.list');\n let dataset = $container.data('set');\n const extensionConfig = $container.data('config') || {};\n const config = extensionConfig.diagnostic || extensionConfig;\n const installedExtension = $container.data('installedextension') || false;\n const diagnosticUrl = helpers._url('diagnostic', 'Diagnostic', extension);\n const removeUrl = helpers._url('remove', 'Diagnostic', extension);\n const serviceUrl = helpers._url('diagnosticData', 'Diagnostic', extension);\n const performancesTester = performancesTesterFactory(config.testers.performance || {});\n const fingerprintTester = fingerprintTesterFactory(config.testers.fingerprint || {});\n\n const tools = [];\n const actions = [];\n const model = [];\n\n // request the server with a selection of readiness check results\n function requestData(url, selection, message) {\n if (selection && selection.length) {\n loadingBar.start();\n\n request({\n url,\n data: {\n id: selection\n },\n method: 'POST',\n noToken: true\n })\n .then(response => {\n loadingBar.stop();\n\n if (response && response.success) {\n if (message) {\n feedback().success(message);\n }\n $list.datatable('refresh');\n } else {\n feedback().error(\n `${__('Something went wrong ...')}
                          ${encode.html(response.error)}`,\n {\n encodeHtml: false\n }\n );\n }\n })\n .catch(() => loadingBar.stop());\n }\n }\n\n // request the server to remove the selected diagnostic-index\n function remove(selection) {\n requestData(removeUrl, selection, __('The readiness check result have been removed'));\n }\n\n // tool: page refresh\n tools.push({\n id: 'refresh',\n icon: 'reset',\n title: __('Refresh the page'),\n label: __('Refresh'),\n action() {\n $list.datatable('refresh');\n }\n });\n\n // tool: readiness check\n tools.push({\n id: 'launch',\n icon: 'play',\n title: __('Launch another readiness check'),\n label: __('Launch readiness check'),\n action() {\n window.location.href = diagnosticUrl;\n }\n });\n\n if (config.export) {\n // tool: export csv\n tools.push({\n id: 'csvExport',\n icon: 'export',\n title: __('Export CSV'),\n label: __('Export CSV'),\n action() {\n csvExporter.exportCsv(model);\n }\n });\n }\n\n if (installedExtension) {\n // tool: compatibility via lti\n tools.push({\n id: 'lti',\n icon: 'play',\n title: __('Try a test delivery'),\n label: __('Try a test delivery'),\n action() {\n window.location.href = deliveryUrl;\n }\n });\n }\n\n // tool: remove selected results\n tools.push({\n id: 'remove',\n icon: 'remove',\n title: __('Remove the selected readiness check results'),\n label: __('Remove'),\n massAction: true,\n action(selection) {\n dialog({\n message: __('The selected readiness check results will be removed. Continue ?'),\n autoRender: true,\n autoDestroy: true,\n onOkBtn() {\n remove(selection);\n }\n });\n }\n });\n\n // tool: close tab, this won't be present in an LTI iframe\n // button should always be right most\n if (window.self === window.top) {\n tools.push({\n id: 'exitButton',\n icon: 'close',\n title: __('Exit'),\n label: __('Exit'),\n action() {\n window.self.close();\n }\n });\n }\n\n // action: remove the result\n actions.push({\n id: 'remove',\n icon: 'remove',\n title: __('Remove the readiness check result?'),\n action(id) {\n dialog({\n autoRender: true,\n autoDestroy: true,\n message: __('The readiness check result will be removed. Continue ?'),\n onOkBtn() {\n remove([id]);\n }\n });\n }\n });\n\n // column: Workstation identifier\n model.push({\n id: 'workstation',\n label: __('Workstation')\n });\n\n // column: School name\n if (config.requireSchoolName) {\n model.push({\n id: 'school_name',\n label: __('School name')\n });\n }\n\n // column: School id\n if (config.requireSchoolId) {\n model.push({\n id: 'school_id',\n label: __('School id')\n });\n }\n\n // column: School number\n if (config.validateSchoolName) {\n model.push({\n id: 'school_number',\n label: __('School number')\n });\n }\n\n // results of fingerprinting\n if (config.testers.fingerprint && config.testers.fingerprint.enabled) {\n // column: Fingerprint of the workstation\n model.push({\n id: 'fingerprint-cell',\n label: __('Fingerprint'),\n transform(v, row) {\n return fingerprintTpl(row.fingerprint);\n }\n });\n\n $list.on('click.fingerprint', '.fingerprint-cell span.details', function(e) {\n const id = $(e.target)\n .closest('tr')\n .data('itemIdentifier');\n const row = _.find(dataset.data, { id: id });\n if (row) {\n dialog({\n content: detailsTpl(fingerprintTester.getSummary(row.fingerprint)),\n buttons: 'ok',\n autoRender: true,\n autoDestroy: true\n });\n }\n });\n }\n\n // results of screen test\n if (config.testers.screen && config.testers.screen.enabled) {\n // column: Screen Width and Height\n model.push({\n id: 'screen_size',\n label: __('Screen resolution'),\n transform(value, row) {\n if (row.screen && row.screen.width && row.screen.height) {\n return row.screen.width + 'x' + row.screen.height;\n }\n }\n });\n }\n\n // results of browser test\n if (config.testers.browser && config.testers.browser.enabled) {\n // column: Operating system information\n model.push({\n id: 'os',\n label: __('OS')\n });\n\n // column: Browser information\n model.push({\n id: 'browser',\n label: __('Browser')\n });\n }\n\n // results of performances test\n if (config.testers.performance && config.testers.performance.enabled) {\n // column: Performances of the workstation\n model.push({\n id: 'performance',\n label: __('Performances'),\n transform(value) {\n const status = performancesTester.getFeedback(value);\n return status.feedback && status.feedback.message;\n }\n });\n }\n\n // results of bandwidth test\n if (config.testers.bandwidth && config.testers.bandwidth.enabled) {\n // column: Available bandwidth\n model.push({\n id: 'bandwidth',\n label: __('Bandwidth'),\n transform: formatBandwidth\n });\n }\n\n // results of intensive bandwidth test\n if (config.testers.intensive_bandwidth && config.testers.intensive_bandwidth.enabled) {\n // column: Available bandwidth\n model.push({\n id: 'intensive_bandwidth',\n label: __('Intensive bandwidth'),\n transform: formatBandwidth\n });\n }\n\n // results of upload speed test\n if (config.testers.upload && config.testers.upload.enabled) {\n // column: Available upload speed\n model.push({\n id: 'upload',\n label: __('Upload speed'),\n transform: formatBandwidth\n });\n }\n\n // column: Date of diagnostic\n model.push({\n id: 'date',\n label: __('Date'),\n transform: transformDateToLocal\n });\n\n $list\n .on('query.datatable', () => loadingBar.start())\n .on('load.datatable', (e, data) => {\n dataset = data;\n loadingBar.stop();\n })\n .datatable(\n {\n url: serviceUrl,\n status: {\n empty: __('No readiness checks have been done!'),\n available: __('Readiness checks already done'),\n loading: __('Loading')\n },\n selectable: true,\n tools,\n actions,\n model\n },\n dataset\n );\n }\n };\n});\n\n","\ndefine('css!taoClientDiagnosticCss/exclusion-list-form',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n *\n */\ndefine('taoClientDiagnostic/controller/ExclusionList/editInstance',['jquery', 'ui/tooltipster', 'select2', 'css!taoClientDiagnosticCss/exclusion-list-form'], function(\n $,\n tooltipster\n) {\n 'use strict';\n\n return {\n start() {}\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2021 Open Assessment Technologies SA\n */\ndefine('taoClientDiagnostic/controller/routes',{\n Authenticator: {\n actions: {\n login: 'controller/Authenticator/login'\n }\n },\n CompatibilityChecker: {\n actions: {\n index: 'controller/CompatibilityChecker/diagnostics'\n }\n },\n Diagnostic: {\n actions: {\n index: 'controller/Diagnostic/index',\n diagnostic: 'controller/Diagnostic/diagnostic'\n }\n },\n ExcludedBrowsers: {\n actions: {\n editInstance: 'controller/ExclusionList/editInstance'\n }\n },\n ExcludedOS: {\n actions: {\n editInstance: 'controller/ExclusionList/editInstance'\n }\n }\n});\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.diagnostics-content-area{max-width:768px;margin:40px auto 40px auto}.diagnostics-main-area{margin:40px auto 0 auto;background:#f3f1ef;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;padding:20px}.diagnostics-main-area h1,.diagnostics-main-area h2,.diagnostics-main-area h3{font-style:normal;font-family:\\\"Source Sans Pro\\\",sans-serif}.diagnostics-main-area h1{margin-bottom:20px;font-size:20px;font-size:2rem}.diagnostics-main-area h2{margin:0;font-size:14px;font-size:1.4rem}.diagnostics-main-area h3{margin-top:10px;margin-bottom:5px;font-size:12px;font-size:1.2rem}.diagnostics-main-area .status h2,.diagnostics-main-area .details h2{margin:1rem 0}.diagnostics-main-area .legend{font-style:italic;font-weight:normal;font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:11px;font-size:1.1rem}.diagnostics-main-area .customMsg{margin-top:10px}.diagnostics-main-area .quality-bar{height:15px;background:linear-gradient(to right, #CE1431 0%, #D57915 25%, #D5A215 50%, #D5CB15 75%, #36B111 100%);opacity:.8;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;margin:5px 0 10px;position:relative}.diagnostics-main-area .quality-indicator{position:absolute;border-width:10px 8px;border-style:solid;border-color:#333 rgba(0,0,0,0) rgba(0,0,0,0);top:-1px;height:25px;width:0}.diagnostics-main-area .quality-indicator[title]:before{font-size:11px;font-size:1.1rem;content:attr(title);position:absolute;top:-36px;left:-12px;text-align:center;width:24px;height:24px;line-height:24px;display:inline-block;background-color:#0e5d91;color:rgba(255,255,255,.9);-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.diagnostics-main-area .quality-indicator.wide[title]:before{left:-16px;width:32px}.diagnostics-main-area [data-result],.diagnostics-main-area .bandwidth-box{display:none}.diagnostics-main-area [data-action=bandwidth-launcher]{margin:5px 0 10px}.diagnostics-main-area li{padding-bottom:10px}.diagnostics-main-area .intro{margin-bottom:20px}.diagnostics-main-area .intro label{display:inline-block;width:150px}table.datatable [class^=icon-]{padding:0}table.datatable td{font-size:90%;font-weight:normal}table.datatable .progress .state:not(:first-child):before{content:\\\" - \\\"}table.datatable .progress .item-time:before{content:\\\" (\\\"}table.datatable .progress .item-time .total:before{content:\\\" / \\\"}table.datatable .progress .item-time:after{content:\\\")\\\"}.details table.matrix{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;margin-top:5px}.details table.matrix td:first-child{min-width:30%}.diagnostic-scope h1{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:22px;font-size:2.2rem;font-weight:normal}.diagnostic-scope h2{font-family:\\\"Source Sans Pro\\\",sans-serif;font-size:18px;font-size:1.8rem;margin:30px 0 10px}.diagnostic-scope form.daterange label{padding:0}.diagnostic-scope form.daterange input{margin:0 10px}.diagnostic-scope table.datatable [class^=icon-]{padding:0}.diagnostic-scope table.datatable td{font-size:90%;font-weight:normal}.diagnostic-scope .content{margin:auto}.diagnostic-scope .diagnostic-index .content,.diagnostic-scope .diagnostic-runner .content{width:100%}.diagnostic-scope .diagnostic-index .message,.diagnostic-scope .diagnostic-runner .message{padding:8px;text-align:center}.diagnostic-scope .panel .action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.diagnostic-scope .panel .action-bar .btn-info{overflow:hidden;background:rgba(0,0,0,0);border:1px rgba(255,255,255,.3) solid}.diagnostic-scope .diagnostics-main-area{margin-top:0px;max-width:800px}.diagnostic-scope .detailed-value{display:flex;justify-content:space-between}.diagnostic-scope .detailed-value.errors{color:#d8ae5b}.diagnostic-scope .detailed-value .details{font-size:2rem;cursor:pointer;color:#3e7da7}.diagnostic-scope .detailed-value .details:hover{color:#03131d}.action-bar .tool-exitButton,.action-bar [data-control=exitButton]{float:right}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/diagnostics.css.map */.exclusion-list-form .xhtml_form input[type=text],.exclusion-list-form .xhtml_form select{width:60%}.exclusion-list-form .xhtml_form .icon-help.tooltipstered{float:right;line-height:25px}\\n\\n/*# sourceMappingURL=../../../taoClientDiagnostic/views/css/exclusion-list-form.css.map */');\n","\ndefine(\"taoClientDiagnostic/loader/taoClientDiagnostic.bundle\", function(){});\n","window.bundles = (window.bundles || []).concat([\"taoQtiItem/loader/taoQtiItem.min\",\"taoItems/loader/taoItems.min\"]);\n"],"mappings":"ACsBA,YACA,gBAIA,CAAAA,YAAA,CAAAC,QAAA,CAAAC,cAAA,eACAC,SAAA,CAAAH,YAAA,CAAAI,YAAA,gBACAC,MAAA,CAAAL,YAAA,CAAAI,YAAA,gBAEAE,cAAA,UAAAA,eAAA,KACA,CAAAC,iBAAA,IACAC,cAAA,CAAAR,YAAA,CAAAI,YAAA,oBACAK,MAAA,CAAAT,YAAA,CAAAI,YAAA,gBACA,IACAG,iBAAA,CAAAG,IAAA,CAAAC,KAAA,CAAAF,MAAA,CACA,OAAAG,GAAA,EACAL,iBAAA,GACA,CACAM,MAAA,CAAAC,OAAA,EAAAN,cAAA,WAAAO,UAAA,EACA,IAAAC,eAAA,UAAAA,gBAAA,EACAH,MAAA,CAAAI,OAAA,GACAJ,MAAA,CAAAI,OAAA,IACAF,UAAA,CAAAG,KAAA,CAAAX,iBAAA,EAEA,EACAN,QAAA,CAAAkB,gBAAA,oBAAAH,eAAA,KACA,aAAAf,QAAA,CAAAmB,UAAA,EACAJ,eAAA,EAEA,EACA,EAGAH,MAAA,CAAAC,OAAA,EAAAX,SAAA,aAGAU,MAAA,CAAAQ,WAAA,GAGAR,MAAA,CAAAS,MAAA,IAOAT,MAAA,CAAAQ,WAAA,UAAAA,YAAAE,OAAA,EACAA,OAAA,CAAAA,OAAA,KACAA,OAAA,CAAAA,OAAA,CAAAC,MAAA,CAAAX,MAAA,CAAAU,OAAA,EACAA,OAAA,CAAAA,OAAA,CAAAE,MAAA,UAAAC,IAAA,CAAAC,KAAA,EACA,OAAAD,IAAA,EAAAH,OAAA,CAAAK,OAAA,CAAAF,IAAA,IAAAC,KAAA,OAAAd,MAAA,CAAAS,MAAA,CAAAI,IAAA,CACA,GACAZ,OAAA,CAAAS,OAAA,YACAA,OAAA,CAAAM,OAAA,UAAAH,IAAA,EACAb,MAAA,CAAAS,MAAA,CAAAI,IAAA,IACA,GACApB,cAAA,EACA,EACA,GAGAD,MAAA,EAAAQ,MAAA,CAAAU,OAAA,EAAAV,MAAA,CAAAU,OAAA,CAAAO,MAAA,CACAjB,MAAA,CAAAQ,WAAA,EAAAhB,MAAA,GAEAC,cAAA,EAEA,EACA,KAEAyB,MAAA,kCC1EAA,MAAA,uEAAAC,CAAA,CAAAC,QAAA,EACA,aAMA,gBAAAC,aAAAC,SAAA,EACA,MAAAC,YAAA,CAAAJ,CAAA,CAAAG,SAAA,EAEAC,YAAA,CAAAC,IAAA,WACAJ,QAAA,GAAAK,KAAA,CAAAF,YAAA,CAAAC,IAAA,WAEAD,YAAA,CAAAC,IAAA,aACAJ,QAAA,GAAAK,KAAA,CAAAF,YAAA,CAAAC,IAAA,YAEA,CACA,GCjBAN,MAAA,qGAAAQ,WAAA,EACA,aAEA,OACArB,MAAA,EACAqB,WAAA,iBACA,CACA,CACA,GCxBAR,MAAA,sFAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EACA,KAAAS,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAAAC,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAMA,MAHA,CAAAF,MAAA,uDACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,mBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,wBAAAM,OAAA,IACA,gBACAC,MACA,KCMAnB,MAAA,8DACA,SACA,eACA,oBACA,UACA,SACA,6DACA,qBACA,UAAAyB,CAAA,CAAAC,gBAAA,CAAAC,YAAA,CAAAC,OAAA,CAAAC,MAAA,CAAAC,YAAA,CAAAC,UAAA,EACA,aAOA,gBAAAC,wBAAA5B,SAAA,CAAA6B,MAAA,EACA,MAAAC,SAAA,CAAAR,gBAAA,GAEAS,WAAA,CAAAL,YAAA,EAGAM,EAAA,iBAAAC,uBAAA,EACA,KAAAC,MAAA,CAAAlC,SAAA,CACA,GAEAgC,EAAA,mBAAAG,yBAAA,OACA,CAAAC,YAAA,CAAAX,MAAA,CAAAI,MAAA,GACAQ,WAAA,CAAAC,MAAA,CAAAC,IAAA,CAAAH,YAAA,CAAAI,WAAA,EAIAjB,YAAA,IAAAF,CAAA,CAAAoB,UAAA,EACAC,OAAA,CAAAN,YAAA,CAAAI,WAAA,EACAG,IAAA,CAAAnB,OAAA,CAAAtD,MAAA,EACA0E,IAAA,CAAAC,SAAA,GACA,MAAAC,eAAA,MAAAC,SAAA,GAKAF,SAAA,CAAAnD,OAAA,EAAAsD,OAAA,CAAAxD,KAAA,SACA,CAAAyD,WAAA,CAAAZ,WAAA,CAAA7C,KAAA,EACA0D,aAAA,CAAAJ,eAAA,CAAAG,WAAA,EACAC,aAAA,CAAAtE,UAAA,CAAAkE,eAAA,CAAAlE,UAAA,CAEAoE,OAAA,MAAAG,UAAA,GAAAD,aAAA,EACAlB,EAAA,mBAAAoB,SAAA,EACAF,aAAA,CAAAG,SAAA,EACA,KAAAC,GAAA,EAEA,GACAtB,EAAA,aAAAL,UAAA,CAAA5C,KAAA,IACAiD,EAAA,WAAAL,UAAA,CAAA4B,IAAA,GACA,GAKA,KAAAC,OAAA,SACA,EACA,GAIA,MAFA,CAAAnC,CAAA,CAAAoC,KAAA,KAAA3B,SAAA,CAAA4B,IAAA,CAAA7B,MAAA,GAEAC,SACA,CACA,GCnEAlC,MAAA,oEACA,SACA,oCACA,4DACA,UAAAC,CAAA,CAAAO,WAAA,CAAAuD,iBAAA,EACA,aAEA,OACA5E,KAAA,SAAAA,CAAA8C,MAAA,EACA,MAAA+B,YAAA,CAAA/D,CAAA,aAEAO,WAAA,kBAEAuD,iBAAA,CAAAC,YAAA,CAAA/B,MAAA,CACA,CACA,CACA,GChBAjC,MAAA,yDACA,aAQA,gBAAAiE,cAAAC,KAAA,CAAAC,QAAA,EACA,MAAAC,KAAA,CAAAC,IAAA,CAAAC,GAAA,IAAAD,IAAA,CAAAE,GAAA,CAAAJ,QAAA,MACA,OAAAE,IAAA,CAAAG,KAAA,EAAAN,KAAA,CAAAE,KAAA,EAAAA,KAAA,GACA,CACA,GCbApE,MAAA,iGAAAyB,CAAA,CAAAwC,aAAA,EACA,iBAAAQ,UAAA,CA+DAJ,IAAA,CAAAK,KAAA,CAAAC,QAAA,CAzBAN,IAAA,CAAAO,GAAA,CAAAC,QAAA,CADAR,IAAA,CAAAS,GAAA,CA7BA,SAAAC,YAAAC,IAAA,QACA,mBAAAA,IAAA,CACAA,IAAA,CAGArF,IAAA,EAAAA,IAAA,EAAAA,IAAA,CAAAqF,IAAA,IACA,CASA,gBAAAC,MAAAC,IAAA,CAAAC,SAAA,CAAAhB,QAAA,MAAAiB,SAAA,CAwCAf,IAAA,CAAAgB,IAAA,CAAAC,SAAA,CALAjB,IAAA,CAAAkB,IAAA,CAAAC,gBAAA,CAhCAC,MAAA,CAAAC,SAAA,MAFA,CAAAC,QAAA,CAAAZ,WAAA,CAAAI,SAAA,EACAS,MAAA,OACA,CAAAd,GAAA,CAAAU,gBAAA,CACAZ,GAAA,GACAiB,KAAA,QAGA,CAAAC,GAAA,CAAArE,CAAA,CAAAsE,MAAA,CACAb,IAAA,CACA,CAAAY,GAAA,CAAAnG,IAAA,IACA,uBAAAA,IAAA,EACA,MAAAuE,KAAA,CAAAyB,QAAA,CAAAhG,IAAA,EAMA,MALA,CAAAiG,MAAA,CAAAI,IAAA,CAAA9B,KAAA,EACAY,GAAA,CAAAD,QAAA,CAAAC,GAAA,CAAAZ,KAAA,EACAU,GAAA,CAAAD,QAAA,CAAAC,GAAA,CAAAV,KAAA,EACA4B,GAAA,EAAA5B,KAAA,CACA2B,KAAA,GACAC,GACA,CACA,EACA,CACA,EAGAG,OAAA,CAAAH,GAAA,EAAAD,KAAA,KAGAK,IAAA,CAAAN,MAAA,CAAAG,MAAA,EAAAD,GAAA,CAAA5B,KAAA,IACA,MAAAiC,IAAA,CAAAjC,KAAA,CAAA+B,OAAA,CAEA,MADA,CAAAH,GAAA,EAAAK,IAAA,CAAAA,IAAA,CACAL,GACA,KAGAM,QAAA,GAAAP,KAAA,CAAAP,SAAA,CAAAY,IAAA,EAAAL,KAAA,OAGAD,MAAA,CAAAS,IAAA,QACA,CAAAC,MAAA,CAAAT,KAAA,GACAU,MAAA,EAAAX,MAAA,CAAAnB,UAAA,CAAA6B,MAAA,GAAAV,MAAA,CAAAR,SAAA,CAAAkB,MAAA,MAEAE,OAAA,EACA1B,GAAA,CACAF,GAAA,CACAkB,GAAA,CACAD,KAAA,CACAI,OAAA,CACAM,MAAA,CACAH,QACA,EASA,MAPA,CAAAjC,QAAA,EACA1C,CAAA,CAAA3B,OAAA,CAAA0G,OAAA,EAAAtC,KAAA,CAAAuC,GAAA,IACAD,OAAA,CAAAC,GAAA,EAAAxC,aAAA,CAAAC,KAAA,CAAAC,QAAA,CACA,GAGAqC,OAAA,CAAAZ,MAAA,CAAAV,IAAA,CACAsB,OACA,CACA,GCrFAxG,MAAA,2DAAAyB,CAAA,EACA,aAQA,gBAAA0B,UAAAlB,MAAA,CAAAyE,QAAA,EACA,OAAAjF,CAAA,CAAAQ,MAAA,MACA0E,MAAA,CAAAzC,KAAA,SAAAA,KAAA,sBAAAA,KAAA,EACAwC,QAAA,CAAAA,QAAA,MACAxC,KAAA,EACA,CACA,GCfAlE,MAAA,qDACA,iBAAA4G,SAAA,CAuBAvC,IAAA,CAAAO,GAAA,CAAAiC,SAAA,CAAAxC,IAAA,CAAAS,GAAA,CAVA,gBAAAgC,UAAAC,QAAA,CAAAC,KAAA,EAYA,MAXA,CAAAD,QAAA,CAAAA,QAAA,KAEAE,KAAA,CAAAC,OAAA,CAAAH,QAAA,IACAA,QAAA,EAAAA,QAAA,GAMAC,KAAA,CAAAH,SAAA,CAAAD,SAAA,CAAAO,QAAA,CAAAH,KAAA,WAAAD,QAAA,CAAAhH,MAAA,OAEAgH,QAAA,CAAAC,KAAA,KACA,CACA,GC5BAhH,MAAA,2DAAAyB,CAAA,EACA,iBAAA2F,SAAA,CAcA/C,IAAA,CAAAO,GAAA,CAFA,gBAAAyC,UAAAC,UAAA,CAAAC,UAAA,CAAAC,IAAA,OACA,CAAAtG,OAAA,CAAAsG,IAAA,KACAC,cAAA,CAAAL,SAAA,GAAA/C,IAAA,CAAAS,GAAA,KAAAT,IAAA,CAAAG,KAAA,CAAA2C,QAAA,CAAAG,UAAA,WACAI,gBAAA,CAAAxG,OAAA,CAAAyG,uBAAA,CACAP,SAAA,CAAAK,cAAA,CAAAvG,OAAA,CAAAyG,uBAAA,EACAF,cAAA,CAGAG,MAAA,EAEAN,UAAA,CAAAG,cAAA,CACAC,gBAAA,CAAAA,gBAAA,CACAG,OAAA,GACA,EAGA,GAAAN,UAAA,EACAN,KAAA,CAAAC,OAAA,CAAAK,UAAA,IACAA,UAAA,EAAAA,UAAA,GAGA,IAAArH,QAAA,CACA,MAAA4H,GAAA,CAAAP,UAAA,CAAAxH,MAAA,CACA,QAAAgI,CAAA,GAAAA,CAAA,CAAAD,GAAA,CAAAC,CAAA,IACA,MAAAC,IAAA,CAAAT,UAAA,CAAAQ,CAAA,EACA,GAAAC,IAAA,IAAAA,IAAA,CAAAC,SAAA,EAAAL,MAAA,CAAAN,UAAA,EAAAU,IAAA,CAAAC,SAAA,EACA/H,QAAA,CAAA8H,IAAA,KAEA,MAEA,CAEA9H,QAAA,GACA0H,MAAA,CAAA1H,QAAA,CAAAuB,CAAA,CAAAyG,KAAA,CAAAhI,QAAA,EAEA,CAEA,OAAA0H,MACA,CACA,GCpDA5H,MAAA,kDACA,SACA,SACA,OACA,QACA,UACA,UACA,kCACA,iCACA,kDACA,sCACA,sCACA,sCACA,UAAAC,CAAA,CAAAwB,CAAA,CAAAH,EAAA,CAAA6G,KAAA,CAAAvG,OAAA,CAAAf,OAAA,CAAAoE,KAAA,CAAAmD,MAAA,CAAAC,QAAA,CAAAlF,SAAA,CAAA2D,SAAA,CAAAO,SAAA,EACA,iBAAAiB,QAAA,CAqPAjE,IAAA,CAAAE,GAAA,CA/IA,SAAAgE,SAAAjI,IAAA,CAAAkI,IAAA,OAEA,CAAAC,WAAA,IAAAnI,IAAA,CAAAoI,GAAA,WACAC,SAAA,CAAArI,IAAA,CAAAoI,GAAA,CAAAE,KAAA,MACAC,SAAA,CAAAF,SAAA,IACAG,QAAA,CAAA/J,OAAA,CAAAgK,CAAA,CAAAC,QAAA,CAAAvH,CAAA,CAAAQ,MAAA,CAAAgH,KAAA,CAAAJ,SAAA,EACAK,OAAA,CAAA5I,IAAA,CAAAoI,GAAA,CAAAS,OAAA,CAAAN,SAAA,CAAAC,QAAA,EACAM,MAAA,KAAAhB,MAAA,CACAiB,QAAA,KAAAhB,QAAA,EACAa,OAAA,CAAAA,OACA,GAGAG,QAAA,CAAAC,eAAA,EACAD,QAAA,CAAAC,eAAA,GAAAC,OAAA,WAAAL,OAAA,EAGAnK,OAAA,UAAA0J,WAAA,aAAAe,QAAA,EACAJ,MAAA,CAAAK,YAAA,CAAAD,QAAA,UAAA7J,IAAA,EACA0J,QAAA,CAAAtG,IAAA,YAEA,MAAA5D,KAAA,CAAAL,MAAA,CAAA4K,WAAA,CAAAC,GAAA,GAGAhK,IAAA,CAAAiK,WAAA,OAGA,MAAAC,UAAA,CAAA5J,CAAA,UAAA6J,QAAA,SACAD,UAAA,CAAAE,MAAA,CAAApK,IAAA,CAAA2C,MAAA,IAGA3C,IAAA,CAAAqK,UAAA,GAGAH,UAAA,CAAAI,MAAA,QAGA,CAAAC,GAAA,CAAApL,MAAA,CAAA4K,WAAA,CAAAC,GAAA,GAEAQ,QAAA,EAAAD,GAAA,CAAA/K,KAAA,EAAAiL,OAAA,CAEAC,MAAA,EACAC,EAAA,CAAAhK,IAAA,CAAAgK,EAAA,CACA5B,GAAA,CAAApI,IAAA,CAAAoI,GAAA,CACAyB,QAAA,CAAAA,QACA,EAEA3B,IAAA,MAAA6B,MAAA,CACA,OAAAE,gBAAA,GACA,EACA,EACA,MAlJA,CAAAH,OAAA,KAOAI,eAAA,OAOAC,wBAAA,IAOAC,eAAA,EACA,uDACA,uDACA,uDACA,CAOAC,SAAA,EACAL,EAAA,gBAGAM,OAAA,MAGA3C,SAAA,IACA,EAOA4C,WAAA,EACA,CACA5C,SAAA,GACA6C,OAAA,CAAAxJ,EAAA,2BACAyJ,IAAA,QACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,yBACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,sBACAyJ,IAAA,UACA,EACA,CAQAC,SAAA,EAEA,CACAC,KAAA,CAAA3J,EAAA,6BACAsG,MAAA,CAAAtG,EAAA,iCACA4J,eAAA,CAAA5J,EAAA,2BACA6J,eAAA,CAAA7J,EAAA,2BACA8J,mBAAA,CAAA9J,EAAA,0BACA,EACA,CAOA+J,aAAA,UAuEA,gBAAAC,mBAAArJ,MAAA,OACA,CAAAsJ,UAAA,CAAApI,SAAA,CAAAlB,MAAA,CAAA0I,SAAA,EACAa,MAAA,CAAA1E,SAAA,CAAAkE,SAAA,CAAAO,UAAA,CAAAvE,KAAA,EACA,IAAAyE,GAAA,GACA,MAAAC,QAAA,CAAAjK,CAAA,CAAAkK,GAAA,EAAAlK,CAAA,CAAAmK,OAAA,CAAAL,UAAA,CAAAM,OAAA,GAAAN,UAAA,CAAAM,OAAA,EAAAnB,eAAA,CAAAoB,MAAA,GACAL,GAAA,GACA,CACAnB,EAAA,CAAAe,aAAA,CAAAI,GAAA,CACA/C,GAAA,CAAAoD,MAAA,CACAC,OAAA,KAAAR,UAAA,CAAAQ,OAAA,EAAAvB,eAAA,CACAwB,EAAA,CAAAT,UAAA,CAAAU,WAAA,EAAAxB,wBACA,EACA,EAKA,MAFA,CAAAiB,QAAA,IAAAM,EAAA,GAEA,CAKA7M,MAAAqJ,IAAA,EACA,MAAA0D,KAAA,IAEAzK,CAAA,CAAA3B,OAAA,CAAA4L,QAAA,CAAApL,IAAA,GACA,MAAA6L,EAAA,CAAA1K,CAAA,CAAA2K,OAAA,CAAA7D,QAAA,CAAAjI,IAAA,MACA,IAAA+L,UAAA,CAAA/L,IAAA,CAAA0L,EAAA,IACAK,UAAA,IACAH,KAAA,CAAAlG,IAAA,CAAAmG,EAAA,CAEA,GAEAhE,KAAA,CAAAmE,MAAA,CAAAJ,KAAA,EAAArN,GAAA,CAAA0N,QAAA,IACA,MAAApI,QAAA,GAEA,GAAAtF,GAAA,GAAA0N,QAAA,CAAAxM,MAAA,CAEA,MAAAlB,GAAA,CAIA0N,QAAA,CAAAnI,KAAA,QAEA,CAAAoC,OAAA,CAAAvB,KAAA,CAAAsH,QAAA,eACA3E,MAAA,MAAA4E,WAAA,CAAAhG,OAAA,CAAAP,OAAA,EACAwG,OAAA,MAAAC,UAAA,CAAAlG,OAAA,EAEAgC,IAAA,CAAAZ,MAAA,CAAA6E,OAAA,CAAAjG,OAAA,CACA,EACA,EAMA,IAAAgF,OAAA,EACA,OAAAA,MACA,EAOAkB,WAAAlG,OAAA,EACA,OACA0E,eAAA,EAAAJ,OAAA,CAAAU,MAAA,CAAAN,eAAA,CAAAhH,KAAA,IAAAsC,OAAA,CAAA1B,GAAA,MACAqG,eAAA,EAAAL,OAAA,CAAAU,MAAA,CAAAL,eAAA,CAAAjH,KAAA,IAAAsC,OAAA,CAAA5B,GAAA,MACAwG,mBAAA,EAAAN,OAAA,CAAAU,MAAA,CAAAJ,mBAAA,CAAAlH,KAAA,IAAAsC,OAAA,CAAAP,OAAA,KACA,CACA,EAOAuG,YAAAnC,MAAA,OACA,CAAAO,OAAA,CAAAW,UAAA,CAAAX,OAAA,CACA+B,KAAA,CAAArE,QAAA,CAAAsC,OAAA,CAAAW,UAAA,CAAAtD,SAAA,EACAL,MAAA,CAAAP,SAAA,OAAAsF,KAAA,CAAA/B,OAAA,CAAAP,MAAA,EAAAsC,KAAA,EAAA9B,WAAA,EAIA,MAFA,CAAAjD,MAAA,CAAAqD,KAAA,CAAAO,MAAA,CAAAP,KAAA,CACArD,MAAA,CAAA0C,EAAA,CAAAiB,UAAA,CAAAjB,EAAA,CACA1C,MACA,CACA,CACA,CACA,GC5QA5H,MAAA,+CACA,SACA,OACA,QACA,UACA,sCACA,sCACA,kCACA,0CACA,sCACA,UAAAyB,CAAA,CAAAH,EAAA,CAAA6G,KAAA,CAAAvG,OAAA,CAAAuB,SAAA,CAAA2D,SAAA,CAAA7B,KAAA,CAAAhB,aAAA,CAAAoD,SAAA,EACA,iBAAAuF,WAAA,CAmUAvI,IAAA,CAAAK,KAAA,CAAAmI,SAAA,CA7JAxI,IAAA,CAAAO,GAAA,CAvBA,SAAAkI,SAAAxM,IAAA,CAAA6L,EAAA,EACA,GAAA7L,IAAA,CAAA2H,SAAA,OAAA8E,SAAA,CAAAzM,IAAA,CAAA2H,SAAA,CACA,OAAAkE,EAAA,cACA,KAEA,CAAAhN,KAAA,CAAAL,MAAA,CAAA4K,WAAA,CAAAC,GAAA,GACAjB,GAAA,IAAA9G,OAAA,CAAAoL,QAAA,gDAAA1M,IAAA,CAAA2M,IAAA,IAAAC,IAAA,CAAAvD,GAAA,KACAwD,SAAA,CAAArO,MAAA,CAAAsO,UAAA,CAAAjB,EAAA,CAAA7L,IAAA,CAAAyL,OAAA,YACAsB,OAAA,KAAAC,cAAA,CACAD,OAAA,CAAAE,IAAA,OAAA7E,GAAA,KACA2E,OAAA,CAAAG,gBAAA,sCAEAH,OAAA,CAAAI,MAAA,MACA,MAAAvD,GAAA,CAAApL,MAAA,CAAA4K,WAAA,CAAAC,GAAA,GACA+D,YAAA,CAAAP,SAAA,OAEA,CAAAhD,QAAA,CAAAD,GAAA,CAAA/K,KAAA,CACAwO,KAAA,CAAArN,IAAA,CAAAsN,IAAA,CACAC,OAAA,CAAA1D,QAAA,CAAAC,OAAA,CAGA0D,KAAA,GAAAH,KAAA,CAAAE,OAAA,CAAAE,KAAA,CAIA,MAFA,MAAAhB,SAAA,CAAAF,SAAA,MAAAE,SAAA,CAAAe,KAAA,EAEA3B,EAAA,OACA7B,EAAA,CAAAhK,IAAA,CAAAgK,EAAA,CACA2C,IAAA,CAAA3M,IAAA,CAAA2M,IAAA,CACAW,IAAA,CAAAtN,IAAA,CAAAsN,IAAA,CACAzD,QAAA,CACA2D,KACA,EACA,EACAT,OAAA,CAAAW,OAAA,CAAAnP,GAAA,GACA6O,YAAA,CAAAP,SAAA,EACAhB,EAAA,CAAAtN,GAAA,CACA,EAEAwO,OAAA,CAAAY,kBAAA,MACA,IAAAZ,OAAA,CAAAhO,UAAA,QAAAgO,OAAA,CAAAzF,MAAA,GACA8F,YAAA,CAAAP,SAAA,EACAhB,EAAA,CAAAkB,OAAA,CAAAzF,MAAA,EAEA,EAEAyF,OAAA,CAAAa,IAAA,EACA,MAtLA,CAAAC,KAAA,MAOAJ,KAAA,SAOA3D,OAAA,KAOAS,WAAA,EACA,CACA5C,SAAA,GACA6C,OAAA,CAAAxJ,EAAA,kBACAyJ,IAAA,QACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,sBACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,mBACAyJ,IAAA,UACA,EACA,CAOAJ,SAAA,EACAL,EAAA,aAGA8D,IAAA,KAGAC,KAAA,IAGAzJ,GAAA,KAGA+C,uBAAA,IAGA2G,kBAAA,CAAAzD,WAAA,CAEA0D,iBAAA,GACA,EAYAC,aAAA,EACAC,MAAA,EACAnE,EAAA,QACA2C,IAAA,qBACAW,IAAA,OACA7B,OAAA,CAAA3B,OAAA,CACAnC,SAAA,GACA+D,EAAA,GACA,EACA0C,OAAA,EACApE,EAAA,SACA2C,IAAA,sBACAW,IAAA,QACA7B,OAAA,GAAA3B,OAAA,CACAnC,SAAA,GACA+D,EAAA,EACA,EACA2C,KAAA,EACArE,EAAA,OACA2C,IAAA,oBACAW,IAAA,CAAAG,KAAA,CACAhC,OAAA,IAAA3B,OAAA,CACAnC,SAAA,GACA+D,EAAA,EACA,CACA,EAQAhB,SAAA,EAEA,CACAC,KAAA,CAAA3J,EAAA,cACAsG,MAAA,CAAAtG,EAAA,8BACAsN,MAAA,CAAAtN,EAAA,iEACAuN,YAAA,CAAAvN,EAAA,sBACAwN,YAAA,CAAAxN,EAAA,sBACAyN,gBAAA,CAAAzN,EAAA,qBACA,EAEA,CACA2J,KAAA,CAAA3J,EAAA,8BACAsG,MAAA,CAAAtG,EAAA,8CACAsN,MAAA,CAAAtN,EAAA,sFACAuN,YAAA,CAAAvN,EAAA,gCACAwN,YAAA,CAAAxN,EAAA,gCACAyN,gBAAA,CAAAzN,EAAA,+BACA,EACA,CAoEA,gBAAA0N,gBAAA/M,MAAA,OACA,CAAAsJ,UAAA,CAAApI,SAAA,CAAAlB,MAAA,CAAA0I,SAAA,EACAa,MAAA,CAAA1E,SAAA,CAAAkE,SAAA,CAAAO,UAAA,CAAAvE,KAAA,EAOA,MAJA,CAAAvF,CAAA,CAAAyF,OAAA,CAAAqE,UAAA,CAAA+C,kBAAA,IAAA/C,UAAA,CAAA+C,kBAAA,CAAAvO,MAAA,GACAwL,UAAA,CAAA+C,kBAAA,CAAAzD,WAAA,EAGA,CAKA1L,MAAAqJ,IAAA,EACA,MAAA0D,KAAA,IAEAzK,CAAA,CAAA3B,OAAA,CAAA0O,aAAA,CAAAlO,IAAA,GACA,MAAA6L,EAAA,CAAAW,QAAA,CAAAmC,IAAA,MAAA3O,IAAA,MACA,IAAA+L,UAAA,CAAA/L,IAAA,CAAA0L,EAAA,IACAK,UAAA,IACAH,KAAA,CAAAlG,IAAA,CAAAmG,EAAA,CAEA,GAEA,KAAAY,SAAA,GAEA5E,KAAA,CAAAmE,MAAA,CAAAJ,KAAA,EAAArN,GAAA,CAAA0N,QAAA,IAMA,SAAA5G,SAAAzB,KAAA,EACA,IAAA4J,KAAA,GAUA,MARA,CAAA5J,KAAA,GACAiG,QAAA,EAAAjG,KAAA,CAAAiG,QAAA,CACAyD,IAAA,EAAA1J,KAAA,CAAA0J,IAAA,CAEAE,KAAA,CAAA5J,KAAA,CAAA4J,KAAA,CACA5J,KAAA,CAAA4J,KAAA,CAAA7J,aAAA,CAAA6J,KAAA,CAAA3J,QAAA,GAGA2J,KACA,IAjBA,CAAA3D,QAAA,GACAyD,IAAA,QACA,CAAAzJ,QAAA,GACA+K,aAAA,IAgBA,GAAArQ,GAAA,GAAA0N,QAAA,CAAAxM,MAAA,CAEA,MAAAlB,GAAA,CAEA,MAAA2H,OAAA,CAAAvB,KAAA,CAAAsH,QAAA,CAAA5G,QAAA,IAEAlE,CAAA,CAAA3B,OAAA,CAAA0O,aAAA,EAAAlO,IAAA,CAAAmG,GAAA,IACAyI,aAAA,CAAAzI,GAAA,EAAAxB,KAAA,CACAxD,CAAA,CAAA/B,MAAA,CAAA6M,QAAA,CAAA4C,CAAA,EAAAA,CAAA,CAAA7E,EAAA,GAAA7D,GAAA,EACAd,QAAA,CACAxB,QACA,CACA,GAEAqC,OAAA,CAAA2D,QAAA,CAAAlG,aAAA,CAAAkG,QAAA,CAAAC,OAAA,IACA5D,OAAA,CAAAoH,IAAA,CAAAA,IAAA,MAEA,CAAAnB,OAAA,MAAAC,UAAA,CAAAlG,OAAA,EACAoB,MAAA,MAAA4E,WAAA,CAAAhG,OAAA,CAAA0I,aAAA,EAEA1G,IAAA,CAAAZ,MAAA,CAAA6E,OAAA,CAAAjG,OAAA,CACA,EACA,EAMA,IAAAgF,OAAA,EACA,OAAAA,MACA,EAOAkB,WAAAlG,OAAA,EACA,OACAqI,YAAA,EAAA/D,OAAA,CAAAU,MAAA,CAAAqD,YAAA,CAAA3K,KAAA,CAAAsC,OAAA,CAAA1B,GAAA,UACAgK,YAAA,EAAAhE,OAAA,CAAAU,MAAA,CAAAsD,YAAA,CAAA5K,KAAA,CAAAsC,OAAA,CAAA5B,GAAA,UACAmK,gBAAA,EAAAjE,OAAA,CAAAU,MAAA,CAAAuD,gBAAA,CAAA7K,KAAA,CAAAsC,OAAA,CAAAP,OAAA,SACA,CACA,EAWAuG,YAAAnC,MAAA,CAAA6E,aAAA,OACA,CAAAE,SAAA,CAAA/E,MAAA,CAAApE,OAAA,CACAoJ,aAAA,CAAA9D,UAAA,CAAA6C,IAAA,CACAnG,SAAA,CAAAsD,UAAA,CAAA8C,KAAA,CACAiB,aAAA,CAAA/D,UAAA,CAAA3G,GAAA,CACAA,GAAA,CAAAqD,SAAA,CAAAoH,aAAA,CACAE,gBAAA,CAAAhE,UAAA,CAAA5D,uBAAA,CACA,CAAAA,uBAAA,CAAA4D,UAAA,CAAA5D,uBAAA,EACA,GACA6H,aAAA,CAAAJ,SAAA,CACA,IAAAK,MAAA,IAEAhO,CAAA,CAAA3B,OAAA,CAAAoP,aAAA,CAAAQ,YAAA,GACAA,YAAA,CAAA5K,GAAA,CAAA4K,YAAA,CAAAzJ,OAAA,CAAAsF,UAAA,CAAAgD,iBAAA,GACAkB,MAAA,IAEA,GAEA,MAAA7H,MAAA,CAAAP,SAAA,MAAAmI,aAAA,CAAA5K,GAAA,EAAA2G,UAAA,CAAA+C,kBAAA,CAAAiB,gBAAA,EAEA,IAAAvD,EAAA,CAAAY,WAAA,CAAA4C,aAAA,CAAAH,aAAA,EAuBA,MArBA,CAAArD,EAAA,CAAAsD,aAAA,GACAtD,EAAA,KAAAsD,aAAA,EAGA1H,MAAA,CAAA0C,EAAA,CAAAiB,UAAA,CAAAjB,EAAA,CACA1C,MAAA,CAAAqD,KAAA,CAAAO,MAAA,CAAAP,KAAA,CACArD,MAAA,CAAA1H,QAAA,CAAA0O,MAAA,CAAApD,MAAA,CAAAoD,MAAA,CACAhH,MAAA,CAAAC,OAAA,CAAA8H,KAAA,CAAA3D,EAAA,CAEAyD,MAAA,GACA7H,MAAA,CAAA1H,QAAA,CAAA6K,IAAA,WACAnD,MAAA,CAAA1H,QAAA,CAAA4K,OAAA,CAAAxJ,EAAA,CACA,kGACA,EACAsG,MAAA,CAAA1H,QAAA,CAAA0O,MAAA,CAAAtN,EAAA,kEAGA,EAAA0K,EAAA,CAAA4D,QAAA,GAAA7P,MAAA,GACA6H,MAAA,CAAAC,OAAA,CAAAgI,IAAA,KAGAjI,MACA,CACA,CACA,CACA,GCzWA5H,MAAA,4CACA,SACA,SACA,OACA,QACA,WACA,sCACA,sCACA,sCACA,UAAAC,CAAA,CAAAwB,CAAA,CAAAH,EAAA,CAAA6G,KAAA,CAAA2H,SAAA,CAAA3M,SAAA,CAAA2D,SAAA,CAAAO,SAAA,EACA,iBAAA0I,UAAA,CA8JA1L,IAAA,CAAAG,KAAA,CA7EA,SAAAwL,YAAAjQ,MAAA,EACA,IAAAkQ,IAAA,IACA,MAAAC,QAAA,kEAEA,QAAAnI,CAAA,GAAAA,CAAA,CAAAhI,MAAA,CAAAgI,CAAA,GACAkI,IAAA,EAAAC,QAAA,CAAAC,MAAA,CAAA9L,IAAA,CAAAK,KAAA,CAAAL,IAAA,CAAA+L,MAAA,GAAAF,QAAA,CAAAnQ,MAAA,GAGA,OAAAkQ,IACA,CAOA,SAAAI,OAAAzC,IAAA,OACA,CAAAlF,GAAA,CAAAoH,SAAA,CAAAQ,KAAA,wDAAAC,KAAA,CAAArD,IAAA,CAAAvD,GAAA,KACA6G,GAAA,CAAAR,WAAA,CAAApC,IAAA,EAGA,MAFA,CAAAtN,IAAA,IAEAL,CAAA,CAAAwQ,IAAA,EACA/H,GAAA,CAAAA,GAAA,CACAqC,IAAA,QACAzK,IAAA,EACA+P,MAAA,CAAAG,GACA,EACAE,GAAA,CAAAA,CAAA,SACA,CAAAA,GAAA,KAAA5R,MAAA,CAAAwO,cAAA,CACAqD,SAAA,CAAAzD,IAAA,CAAAvD,GAAA,GAiBA,MAfA,CAAA+G,GAAA,CAAAL,MAAA,CAAAjR,gBAAA,CACA,WACAwR,GAAA,GACA,GAAAA,GAAA,CAAAC,gBAAA,EACA,MAAAC,UAAA,CAAA5D,IAAA,CAAAvD,GAAA,GAAAgH,SAAA,CACArQ,IAAA,CAAA0F,IAAA,EACA+K,IAAA,CAAAD,UAAA,CACAvR,MAAA,CAAAqR,GAAA,CAAArR,MAAA,CACAuO,KAAA,GAAA8C,GAAA,CAAArR,MAAA,CAAAwO,KAAA,EAAA+C,UAAA,KACA,EACA,CACA,IAEA,EAEAJ,GACA,CACA,EACA,MA3HA,CAAAvC,KAAA,MAOAJ,KAAA,SAOA,IAAAzN,IAAA,SAOA,CAAAqK,SAAA,EACAL,EAAA,UAGAsD,IAAA,CAAAG,KAAA,CAGAnD,OAAA,CAAAmD,KACA,EAOAlD,WAAA,EACA,CACA5C,SAAA,GACA6C,OAAA,CAAAxJ,EAAA,qBACAyJ,IAAA,QACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,yBACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,sBACAyJ,IAAA,UACA,EACA,CAQAC,SAAA,EAEA,CACAC,KAAA,CAAA3J,EAAA,iBACAsG,MAAA,CAAAtG,EAAA,6BACA0P,SAAA,CAAA1P,EAAA,yBACA2P,SAAA,CAAA3P,EAAA,oBACA,EACA,CAkEA,gBAAA4P,aAAAjP,MAAA,OACA,CAAAsJ,UAAA,CAAApI,SAAA,CAAAlB,MAAA,CAAA0I,SAAA,EACAa,MAAA,CAAA1E,SAAA,CAAAkE,SAAA,CAAAO,UAAA,CAAAvE,KAAA,EAEA,OAKA7H,MAAAqJ,IAAA,EACA6H,MAAA,CAAAlJ,QAAA,CAAAoE,UAAA,CAAAqC,IAAA,MAAA5K,IAAA,SACA,CAAAmO,UAAA,GACAC,QAAA,GAEA3P,CAAA,CAAA3B,OAAA,CAAAQ,IAAA,CAAA+Q,GAAA,GACAF,UAAA,EAAAE,GAAA,CAAAvD,KAAA,CACAsD,QAAA,CAAAC,GAAA,CAAAvD,KAAA,GACAsD,QAAA,CAAArB,UAAA,KAAAsB,GAAA,CAAAvD,KAAA,MAEA,QACA,CAAAwD,QAAA,CAAAvB,UAAA,MAAAoB,UAAA,CAAA7Q,IAAA,CAAAP,MAAA,OACAyG,OAAA,EACA5B,GAAA,CAAAwM,QAAA,CACAG,GAAA,CAAAD,QAAA,CACAvG,IAAA,SACA,EAEAnD,MAAA,MAAA4E,WAAA,CAAA8E,QAAA,EACA7E,OAAA,MAAAC,UAAA,CAAAlG,OAAA,EAEAgC,IAAA,CAAAZ,MAAA,CAAA6E,OAAA,CAAAjG,OAAA,CACA,EACA,EAMA,IAAAgF,OAAA,EACA,OAAAA,MACA,EAOAkB,WAAAlG,OAAA,EACA,OACAwK,SAAA,EAAAlG,OAAA,CAAAU,MAAA,CAAAwF,SAAA,CAAA9M,KAAA,IAAAsC,OAAA,CAAA+K,GAAA,SACAN,SAAA,EAAAnG,OAAA,CAAAU,MAAA,CAAAyF,SAAA,CAAA/M,KAAA,IAAAsC,OAAA,CAAA5B,GAAA,QACA,CACA,EAOA4H,YAAAnC,MAAA,OACA,CAAAO,OAAA,CAAAW,UAAA,CAAAX,OAAA,CAAAmD,KAAA,CACAnG,MAAA,CAAAP,SAAA,KAAAuD,OAAA,CAAAP,MAAA,CAAAQ,WAAA,EAKA,MAHA,CAAAjD,MAAA,CAAA0C,EAAA,CAAAiB,UAAA,CAAAjB,EAAA,CACA1C,MAAA,CAAAqD,KAAA,CAAAO,MAAA,CAAAP,KAAA,CAEArD,MACA,CACA,CACA,CACA,GC7NA5H,MAAA,wHAAAqN,OAAA,CAAAyC,SAAA,CAAA3M,SAAA,EACA,aAsBA,SAAAqO,aAAAC,GAAA,CAAAC,MAAA,CAAA1S,UAAA,CAAA6J,SAAA,OACA,CAAA3K,QAAA,CAAAuT,GAAA,CAAAvT,QAAA,CACAyT,SAAA,CAAAF,GAAA,CAAAE,SAAA,CACAC,MAAA,CAAAH,GAAA,CAAAG,MAAA,CACAlT,MAAA,OACA,CAAAmT,CAAA,GACAC,CAAA,GAoCA,MAjCA,CAAApT,MAAA,CAAAqT,EAAA,CAAAJ,SAAA,CAAAK,SAAA,CAGAH,CAAA,EAAAJ,GAAA,CAAAQ,aAAA,KACAJ,CAAA,EAAAJ,GAAA,CAAAS,KAAA,KACAL,CAAA,EAAAJ,GAAA,CAAAU,MAAA,KACAN,CAAA,sBAAA3T,QAAA,sBAAAuT,GAAA,KACAI,CAAA,EACA,oBAAAJ,GAAA,kBAAAA,GAAA,wBAAAA,GAAA,gBAAAA,GAAA,CACA,GACA,EACAI,CAAA,KAAAA,CAAA,UAAAjC,QAAA,CAAAA,QAAA,GAAA/P,OAAA,YACAnB,MAAA,CAAAmT,CAAA,CAAAA,CAAA,CAGAC,CAAA,cAAA5T,QAAA,CAAAkU,aAAA,eACAN,CAAA,gBAAAL,GAAA,KACAK,CAAA,EAAAL,GAAA,CAAAY,MAAA,KACAP,CAAA,EAAAL,GAAA,CAAAa,gBAAA,KACAR,CAAA,EAAAL,GAAA,CAAAc,OAAA,EAAAd,GAAA,CAAAc,OAAA,CAAAC,SAAA,MACAV,CAAA,EAAA5T,QAAA,CAAAuU,eAAA,CAAAC,uBAAA,MACAZ,CAAA,iBAAAL,GAAA,MACA/S,MAAA,CAAAoT,CAAA,CAAAA,CAAA,CAGApT,MAAA,CAAAiU,CAAA,CAAAtO,IAAA,CAAA+L,MAAA,GACAR,QAAA,KACAgD,SAAA,IAGAlU,MAAA,CAAAmU,CAAA,CAAAjB,MAAA,CAAAkB,KAAA,CACApU,MAAA,CAAAqU,CAAA,CAAAnB,MAAA,CAAAoB,MAAA,CAEAlD,SAAA,CAAAQ,KAAA,CAAAoB,MAAA,CAAA1S,UAAA,CAAA6J,SAAA,CAAAnK,MAAA,CACA,CA1DA,MAAAuU,aAAA,EACAC,oBAAA,gBACAC,wBAAA,wBACAC,uBAAA,sBACA,EAmEA,gBAAAC,gBAAA5B,GAAA,CAAAxP,MAAA,EACAA,MAAA,CAAAkB,SAAA,CAAAlB,MAAA,CAAAgR,aAAA,EAEA,MAAAvK,GAAA,CAAA8I,YAAA,CACAC,GAAA,CACAxP,MAAA,CAAAiR,oBAAA,CACAjR,MAAA,CAAAkR,wBAAA,CACAlR,MAAA,CAAAmR,uBACA,EAEA,OAAA/F,OAAA,EAAA3E,GAAA,CAAA4K,OAAA,KACA,CACA,GC3FAtT,MAAA,6CACA,SACA,SACA,OACA,WACA,cACA,eACA,sCACA,sCACA,4CACA,sCACA,UAAAC,CAAA,CAAAwB,CAAA,CAAAH,EAAA,CAAAwO,SAAA,CAAAyD,aAAA,CAAAlG,OAAA,CAAAlK,SAAA,CAAA2D,SAAA,CAAAuM,eAAA,CAAAhM,SAAA,EACA,kBAMA,CAAAmM,MAAA,CAAAD,aAAA,gCAOA5I,SAAA,EACAL,EAAA,WACA4I,oBAAA,gBACAC,wBAAA,wBACAC,uBAAA,uBACA1B,MAAA,SACA1S,UAAA,qBACAyU,eAAA,yDACA,EAOAC,aAAA,EACAC,eAAA,qBACAC,UAAA,eACA,EAQA5I,SAAA,EAEA,CACAC,KAAA,CAAA3J,EAAA,qCACAsG,MAAA,CAAAtG,EAAA,4BACAuS,OAAA,CAAAvS,EAAA,gBACAwS,EAAA,CAAAxS,EAAA,oBACA,EACA,CAOAyS,OAAA,CAAAzS,EAAA,YAaA,gBAAA0S,cAAA/R,MAAA,EAiBA,SAAAgS,oBAAAC,YAAA,OACA,CAAAC,aAAA,CAAAD,YAAA,CAAAE,QAAA,oBACAC,SAAA,CAAAH,YAAA,CAAAJ,EAAA,CAAAQ,WAAA,GACAC,cAAA,CAAAL,YAAA,CAAAL,OAAA,CAAAS,WAAA,GACAE,cAAA,CAAAN,YAAA,CAAAO,cAAA,CACA,OAAAC,gBAAA,GAAA1R,IAAA,CAAAkC,IAAA,EACAA,IAAA,CAAAyP,IAAA,CAAAC,KAAA,GACA,MAAAf,OAAA,CAAAgB,MAAA,CAAAf,EAAA,CAAAgB,QAAA,EAAAF,KAAA,SAEAT,aAAA,GAAAU,MAAA,KAIAf,EAAA,EAAAA,EAAA,CAAAQ,WAAA,KAAAD,SAAA,KAIAR,OAAA,CAAAS,WAAA,KAAAC,cAAA,GAOA9S,CAAA,CAAAqT,QAAA,EACAnJ,GAAA,CAAAoJ,OAAA,EAAAA,OAAA,CAAAnM,KAAA,OACAoM,OAAA,GACA9Q,KAAA,GACAyQ,IAAA,CAAAI,OAAA,KAAAP,cAAA,CAAAS,aAAA,CAAAF,OAAA,SAAAG,OAAA,MACA,KACA,CACA,MA/CA,CAAA3J,UAAA,CAAApI,SAAA,CAAAlB,MAAA,CAAA0I,SAAA,EACAa,MAAA,CAAA1E,SAAA,CAAAkE,SAAA,CAAAO,UAAA,CAAAvE,KAAA,EAOA0N,gBAAA,CAAAA,CAAA,GAAArH,OAAA,EAAA3E,GAAA,CAAA6C,UAAA,CAAAkI,eAAA,CAAAH,OAAA,MAAA6B,KAAA,SAyCA,OAKAhW,MAAAqJ,IAAA,EACA6K,eAAA,CAAAvU,MAAA,CAAAyM,UAAA,EACA4J,KAAA,CAAAtW,GAAA,GACA2U,MAAA,CAAAjT,KAAA,CAAA1B,GAAA,EACA,CACAgV,OAAA,CAAAE,OAAA,CACAU,cAAA,IACAX,EAAA,CAAAC,OAAA,CACAqB,SAAA,IACAhB,QAAA,GACA,EACA,EACApR,IAAA,CAAAkR,YAAA,EACAD,mBAAA,CAAAC,YAAA,EAAAlR,IAAA,CAAAqS,gBAAA,EACA3S,MAAA,CAAA4S,MAAA,CAAApB,YAAA,EAAAmB,gBAAA,EACA,CACA,EACArS,IAAA,CAAAkR,YAAA,GACA7G,OAAA,EACA3E,GAAA,CAAAoH,SAAA,CAAAQ,KAAA,CAAA/E,UAAA,CAAAmG,MAAA,CAAAnG,UAAA,CAAAvM,UAAA,CAAAuM,UAAA,CAAA1C,SAAA,EACAvI,IAAA,CAAA4T,YAAA,CACAqB,MAAA,QACAjC,OAAA,GACA,GACA6B,KAAA,MACA,CACAK,OAAA,IACAzK,IAAA,SACAD,OAAA,CAAAxJ,EAAA,sEACA,EACA,EACA0B,IAAA,CAAA1C,IAAA,QACA,CAAAgH,UAAA,aAAAhH,IAAA,CAAAyK,IAAA,iBAAAzK,IAAA,CAAAyK,IAAA,MACAnD,MAAA,MAAA4E,WAAA,CAAAlF,UAAA,CAAAhH,IAAA,EACAmM,OAAA,MAAAC,UAAA,CAAAwH,YAAA,EAEAtM,MAAA,CAAA6N,iBAAA,CAAAC,SAAA,EACA,CAAAA,SAAA,MACAvM,OAAA,CAAAuK,aAAA,CAAAC,eAAA,CAAAlH,OAAA,CAAAoH,OAAA,CAAA3P,KAAA,EACAiF,OAAA,CAAAuK,aAAA,CAAAE,UAAA,CAAAnH,OAAA,CAAAqH,EAAA,CAAA5P,KAAA,CACA,CAEAsE,IAAA,CAAAZ,MAAA,CAAA6E,OAAA,CAAAyH,YAAA,CACA,EACA,EACA,EAMA,IAAA1I,OAAA,EACA,OAAAA,MACA,EAOAkB,WAAAlG,OAAA,OACA,CAAA+N,cAAA,IAAA/N,OAAA,CAAAqN,OAAA,IAAArN,OAAA,CAAAiO,cAAA,GACAkB,SAAA,IAAAnP,OAAA,CAAAsN,EAAA,IAAAtN,OAAA,CAAA4O,SAAA,GACA,OACAvB,OAAA,EACA/I,OAAA,CAAAU,MAAA,CAAAqI,OAAA,CACA3P,KAAA,CAAAqQ,cACA,EACAT,EAAA,EACAhJ,OAAA,CAAAU,MAAA,CAAAsI,EAAA,CACA5P,KAAA,CAAAyR,SACA,CACA,CACA,EAQAnJ,YAAAnC,MAAA,CAAA/J,IAAA,EACA,MAAAsH,MAAA,CAAAP,SAAA,CAAAgD,MAAA,CAAA/J,IAAA,EAKA,MAHA,CAAAsH,MAAA,CAAA0C,EAAA,CAAAiB,UAAA,CAAAjB,EAAA,CACA1C,MAAA,CAAAqD,KAAA,CAAAO,MAAA,CAAAP,KAAA,CAEArD,MACA,CACA,CACA,CACA,GCjPA5H,MAAA,6EAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAiV,MAAA,EAAAD,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAkV,MAAA,CAAAD,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAA4U,SAAAnV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAmV,IAAA,EAAAH,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAoV,IAAA,CAAAH,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAA8U,SAAArV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAqV,KAAA,EAAAL,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAsV,KAAA,CAAAL,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAAgV,SAAAvV,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAUA,MATA,CAAAA,MAAA,yDACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,cAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,mBAAAM,OAAA,IACA,6IACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,aAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,kBAAAM,OAAA,IACA,4EACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,kJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,yBAAAM,OAAA,IACA,gCACAC,MACA,CAEA,SAAAiV,SAAAxV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA1U,MAAA,IAKA,MAJA,CAAAA,MAAA,mBACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAyV,kBAAA,EAAA9U,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAC,OAAA,IAAAC,SAAA,CAAAnW,IAAA,EAAAoW,EAAA,CAAAH,IAAA,CAAAC,OAAA,IAAAG,SAAA,CAAArW,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACAA,MACA,CACA,SAAAwV,UAAA/V,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAUA,MATA,CAAAA,MAAA,6DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,kBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,uBAAAM,OAAA,IACA,wJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,iBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,sBAAAM,OAAA,IACA,2EACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,eAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,IACA,8IACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,8BAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,mCAAAM,OAAA,IACA,oCACAC,MACA,CAEA,SAAAsV,UAAA7V,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAMA,MALA,CAAAA,MAAA,2DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,mJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,eAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,IACA,oCACAC,MACA,CArFA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAAAyV,YAAA,YAAAvV,gBAAA,MAAAA,gBAAA,CAAAD,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAAAmV,IAAA,MA6GA,MAxBA,CAAApV,MAAA,uDACAF,MAAA,CAAAJ,OAAA,CAAAoK,KAAA,EAAA4K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAqK,KAAA,CAAA4K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,+CACAA,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAkV,MAAA,EAAAvU,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAoV,IAAA,EAAAzU,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAT,QAAA,CAAAzV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAsV,KAAA,EAAA3U,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAP,QAAA,CAAA3V,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAkW,eAAA,EAAAvV,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAL,QAAA,CAAA7V,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmW,iBAAA,EAAAxV,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAJ,QAAA,CAAA9V,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,+HACAF,MAAA,CAAAJ,OAAA,CAAAmW,MAAA,EAAAnB,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAoW,MAAA,CAAAnB,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,wIACA1U,MACA,KCjHAnB,MAAA,+EAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAMA,MALA,CAAAA,MAAA,+GACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,+FACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,4EACAC,MACA,CAbA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAAAC,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAuV,YAAA,YAAAL,IAAA,MAyBA,MAZA,CAAApV,MAAA,wBACAF,MAAA,CAAAJ,OAAA,CAAAyJ,EAAA,EAAAuL,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAA0J,EAAA,CAAAuL,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,iBACA5U,MAAA,CAAAJ,OAAA,CAAAoK,KAAA,EAAA4K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAqK,KAAA,CAAA4K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,kDACAA,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAqW,OAAA,EAAA1V,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,YACAA,MACA,KC7BAnB,MAAA,gFAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAUA,MATA,CAAAA,MAAA,gCACAF,MAAA,CAAAJ,OAAA,CAAAiK,OAAA,EAAA+K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAkK,OAAA,CAAA+K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,aACA5U,MAAA,CAAAJ,OAAA,CAAAqD,KAAA,EAAA2R,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAsD,KAAA,CAAA2R,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,2BACA1U,MACA,CAjBA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAAAyV,YAAA,YAAAvV,gBAAA,MAAAA,gBAAA,CAAAD,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAAAmV,IAAA,MAuBA,MANA,CAAApV,MAAA,sCACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,WAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,IACA,wFACA2U,MAAA,CAAAhV,OAAA,CAAAqW,IAAA,CAAA1V,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAW,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,iEACAA,MACA,KC3BAnB,MAAA,iFAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,4BACAF,MAAA,CAAAJ,OAAA,CAAA+N,MAAA,EAAAiH,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAgO,MAAA,CAAAiH,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,SACA1U,MACA,CAEA,SAAA4U,SAAAnV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,+BACAF,MAAA,CAAAJ,OAAA,CAAA6U,SAAA,EAAAG,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAA8U,SAAA,CAAAG,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,SACA1U,MACA,CAxBA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAAAyV,YAAA,YAAAvV,gBAAA,MAAAA,gBAAA,CAAAkV,IAAA,MA2CA,MAnBA,CAAApV,MAAA,2CACAF,MAAA,CAAAJ,OAAA,CAAAkK,IAAA,EAAA8K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAmK,IAAA,CAAA8K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,qCACA5U,MAAA,CAAAJ,OAAA,CAAAkK,IAAA,EAAA8K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAmK,IAAA,CAAA8K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,wCACA5U,MAAA,CAAAJ,OAAA,CAAAiK,OAAA,EAAA+K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAkK,OAAA,CAAA+K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,gBACAA,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAgO,MAAA,EAAArN,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,WACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA8U,SAAA,EAAAnU,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAT,QAAA,CAAAzV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,aACAA,MACA,KC/CAnB,MAAA,oFAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAGA,aACA,CAEA,SAAAyV,SAAAnV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,eACAF,MAAA,CAAAJ,OAAA,CAAA8O,KAAA,EAAAkG,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAA+O,KAAA,CAAAkG,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,KACA1U,MACA,CAnBA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA1U,MAAA,IAAAyV,YAAA,YAAAvV,gBAAA,MAAAA,gBAAA,CAAAkV,IAAA,MA0BA,MAPA,CAAApV,MAAA,oEACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAiP,IAAA,EAAAtO,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,OACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAA+O,KAAA,EAAApO,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAT,QAAA,CAAAzV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,oBACAA,MACA,KC9BAnB,MAAA,2DCgBAA,MAAA,oDACA,SACA,SACA,OACA,QACA,eACA,cACA,aACA,eACA,4BACA,kBACA,cACA,WACA,gDACA,6CACA,0CACA,2CACA,sCACA,sCACA,oDACA,sDACA,uDACA,wDACA,2DACA,yCACA,UACAC,CAAA,CACAwB,CAAA,CACAH,EAAA,CACA6G,KAAA,CACAjG,SAAA,CACAqR,aAAA,CACA4D,KAAA,CACA9J,OAAA,CACA+J,WAAA,CACAC,WAAA,CACAnX,QAAA,CACA4P,SAAA,CACAxE,kBAAA,CACA0D,eAAA,CACAkC,YAAA,CACA8C,aAAA,CACA3M,SAAA,CACAlE,SAAA,CACAmU,OAAA,CACAC,SAAA,CACAC,UAAA,CACAC,WAAA,CACAC,aAAA,CACA,CACA,kBAKA,CAAAlE,MAAA,CAAAD,aAAA,mCAOA5I,SAAA,EACAM,KAAA,CAAA3J,EAAA,yBACAwU,MAAA,CAAAxU,EAAA,CACA,mIACA,EACA0U,IAAA,CAAA1U,EAAA,+DACA0V,MAAA,CAAA1V,EAAA,8BACAqW,WAAA,aACAC,YAAA,cACA5Y,UAAA,qBACA6J,SAAA,uBACAgP,YAAA,YACAC,YAAA,IACAC,gBAAA,GACA,EAOAlN,WAAA,EACA,CACA5C,SAAA,GACA6C,OAAA,CAAAxJ,EAAA,2FACAyJ,IAAA,QACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,0EACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,IACA6C,OAAA,CAAAxJ,EAAA,oCACAyJ,IAAA,UACA,EACA,CAMAiN,UAAA,EAOAC,aAAArQ,MAAA,EAIA,MAHA,MAAAsQ,EAAA,cACA,KAAAC,QAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAzQ,MAAA,EAEA,IACA,EAQAuP,MAAApM,IAAA,CAAAzK,IAAA,CAAAkI,IAAA,OACA,CAAAvG,MAAA,MAAAA,MAAA,CACAyG,GAAA,CAAAoH,SAAA,CAAAQ,KAAA,CAAArO,MAAA,CAAA0V,WAAA,CAAA1V,MAAA,CAAAjD,UAAA,CAAAiD,MAAA,CAAA4G,SAAA,CAAA5G,MAAA,CAAAqW,WAAA,EAEAhY,IAAA,CAAAmB,CAAA,CAAA8W,IAAA,CAAAjY,IAAA,WACAA,IAAA,CAAAyK,IAAA,CAAAA,IAAA,CAEAsC,OAAA,EAAA3E,GAAA,CAAApI,IAAA,CAAAiV,MAAA,QAAAjC,OAAA,MACAtQ,IAAA,CAAAwF,IAAA,EACA2M,KAAA,CAAAtW,GAAA,GACA2U,MAAA,CAAAjT,KAAA,CAAA1B,GAAA,EACAqB,QAAA,GAAAK,KAAA,CAAAe,EAAA,+DACAkH,IAAA,EACA,EACA,EAOAgQ,aAAA/R,GAAA,EACA,YAAAxE,MAAA,CAAA8V,gBAAA,CAAAtR,GAAA,CACA,EAOAgS,qBAAA7Q,MAAA,CAAA8Q,GAAA,EACA,KAAAC,SAAA,CAAA/Q,MAAA,GAAA8Q,GAAA,GACAjX,CAAA,CAAAoB,UAAA,CAAA+E,MAAA,CAAA6N,iBAAA,IACAiD,GAAA,CAAA9Q,MAAA,CAAA6N,iBAAA,CAAAiD,GAAA,GAEA9Q,MAAA,CAAA1H,QAAA,CAAA0H,MAAA,CAAA1H,QAAA,KACA0H,MAAA,CAAA1H,QAAA,CAAAwV,SAAA,CAAAgD,GAAA,CAEA,EAOAC,UAAAtO,MAAA,EACA,QAAAA,MAAA,EAAAA,MAAA,CAAAnK,QAAA,cAAAmK,MAAA,CAAAnK,QAAA,CAAA6K,IAAA,CACA,EAOA6N,UAAAvO,MAAA,EACA,QAAA6N,EAAA,cAEA7N,MAAA,CAAAxC,OAAA,EAAAwC,MAAA,CAAAxC,OAAA,CAAA8H,KAAA,IAAAtF,MAAA,CAAAxC,OAAA,CAAA8H,KAAA,CAAAC,QAAA,GAAA7P,MAAA,GACAsK,MAAA,CAAAxC,OAAA,CAAAgI,IAAA,UAIA,CAAAgJ,KAAA,CAAA5Y,CAAA,CAAAsX,SAAA,CAAAlN,MAAA,GACAyO,OAAA,CAAAD,KAAA,CAAAE,IAAA,YACA1O,MAAA,CAAAnK,QAAA,EACA4Y,OAAA,CAAA/O,MAAA,CAAA9J,CAAA,CAAAwX,WAAA,CAAApN,MAAA,CAAAnK,QAAA,IAEAmK,MAAA,CAAAxC,OAAA,EACAiR,OAAA,CAAA/O,MAAA,CAAA9J,CAAA,CAAAyX,aAAA,CAAArN,MAAA,CAAAxC,OAAA,IAEAwC,MAAA,CAAA4M,OAAA,EACA4B,KAAA,CAAAE,IAAA,aAAAhP,MAAA,CAAA9J,CAAA,CAAAuX,UAAA,CAAAnN,MAAA,CAAA4M,OAAA,IAGA,MAAA+B,UAAA,CAAAH,KAAA,CAAAE,IAAA,uBACA,KAAAZ,QAAA,CAAAc,QAAA,CAAAlP,MAAA,CAAA8O,KAAA,EAGAA,KAAA,CAAAK,MAAA,MACAF,UAAA,CAAAjZ,MAAA,EACAiZ,UAAA,CAAAG,OAAA,EACAC,IAAA,CAAA/O,MAAA,CAAA/C,UAAA,CAAAuR,KAAA,CAAAQ,UAAA,OAAAL,UAAA,CAAAK,UAAA,IACA,EAEA,EACA,CAEA,WACA,EAMAC,QAAA,EAEA,MADA,MAAAnB,QAAA,CAAAc,QAAA,CAAAM,KAAA,GACA,IACA,EAMAC,OAAA,EAEA,MADA,MAAArB,QAAA,CAAAsB,MAAA,CAAAC,WAAA,WACA,IACA,EAMAC,QAAA,EAEA,MADA,MAAAxB,QAAA,CAAAsB,MAAA,CAAAG,QAAA,WACA,IACA,EAOAC,QAAA,EAgBA,MAXA,MAAAjW,OAAA,UACA,KAAAqU,YAAA,CAAA3W,EAAA,iBACA,KAAAwY,QAAA,eACA,KAAAA,QAAA,YAGA,KAAAR,OAAA,GAGA,KAAAK,OAAA,GAEA,IACA,EAOAI,OAAA,EACA,MAAA9X,MAAA,MAAAA,MAAA,CAkBA,MAfA,MAAAuX,MAAA,GAEAvX,MAAA,CAAA6V,YAAA,EACA,KAAAkC,gBAAA,GAOA,KAAApW,OAAA,QACA,KAAAqU,YAAA,CAAA3W,EAAA,WACA,KAAAwY,QAAA,eACA,KAAAA,QAAA,YAEA,IACA,EAKAE,iBAAA,EACA,MAAAtR,GAAA,CAAAoH,SAAA,CAAAQ,KAAA,MAAArO,MAAA,CAAA4V,YAAA,MAAA5V,MAAA,CAAAjD,UAAA,MAAAiD,MAAA,CAAA4G,SAAA,EACA,OAAAwE,OAAA,EAAA3E,GAAA,CAAA6M,MAAA,QAAAjC,OAAA,KACA,EAMA5P,IAAA,OACA,CAAAuW,WAAA,IACAC,MAAA,IACAC,OAAA,IACAC,WAAA,MAAAC,cAAA,GAEAC,KAAA,CAAAA,CAAA,IAEA,MAAAC,OAAA,CAAAA,CAAAC,YAAA,CAAArO,EAAA,IACA,MAAAsO,QAAA,CAAAD,YAAA,CAAAlQ,EAAA,CAOA,KAAA1G,OAAA,eAAA6W,QAAA,EACA,KAAAX,QAAA,CAAAW,QAAA,UAOA,CAAAC,aAAA,CAAAC,aAAA,GACA,MAAAC,MAAA,CAAAD,aAAA,CAAAxX,SAAA,CAAAqX,YAAA,MAAAvY,MAAA,QACA,KAAAgW,YAAA,CAAA2C,MAAA,CAAApP,MAAA,CAAA5D,MAAA,EACAgT,MAAA,CAAAzb,KAAA,EAAAyI,MAAA,CAAAqP,OAAA,CAAAzQ,OAAA,IACA,GAAAgU,YAAA,CAAAK,YAAA,EACA,MAAAnF,SAAA,MAAA8C,YAAA,CAAAgC,YAAA,CAAAK,YAAA,EACA,KAAApC,oBAAA,CAAA7Q,MAAA,CAAA8N,SAAA,CACA,CAGAjU,CAAA,CAAA3B,OAAA,CAAAmX,OAAA,CAAAjB,IAAA,EAAAiE,WAAA,CAAAjU,IAAA,CAAAgQ,IAAA,GACAkE,MAAA,CAAAtS,MAAA,CAAA0C,EAAA,EAAA1C,MAAA,CAQA,KAAAhE,OAAA,aAAA6W,QAAA,CAAA7S,MAAA,EACA,KAAAkS,QAAA,CAAAW,QAAA,KAGAjU,OAAA,CAAA/E,CAAA,CAAAqZ,SAAA,CAAAtU,OAAA,CAAAtC,KAAA,GACA,cAAAA,KAAA,EACA,cACA,OAAAA,KAAA,KACA,aACA,OAAAvF,IAAA,CAAAoc,SAAA,CAAA7W,KAAA,CACA,CACA,OAAAA,KACA,GAGA,KAAAiT,KAAA,CAAAsD,QAAA,CAAAjU,OAAA,MACA,KAAAoS,SAAA,CAAAhR,MAAA,EACAuE,EAAA,EACA,EACA,EACA,EAOA6O,cAAA,CAAAnc,GAAA,GACA2U,MAAA,CAAAjT,KAAA,CAAA1B,GAAA,EACAqB,QAAA,GAAAK,KAAA,CACAe,EAAA,CACA,qFACAmZ,QACA,CACA,EACAtO,EAAA,EACA,EAEApN,OAAA,EAAAyb,YAAA,CAAAI,MAAA,EAAAF,aAAA,CAAAM,cAAA,CACA,EAEA,KAAA9C,EAAA,eAEA,KAAA2B,OAAA,GAEApY,CAAA,CAAA3B,OAAA,MAAAmC,MAAA,CAAAkY,OAAA,EAAAK,YAAA,CAAAC,QAAA,IACAD,YAAA,CAAAlQ,EAAA,CAAAkQ,YAAA,CAAAlQ,EAAA,EAAAmQ,QAAA,CACAD,YAAA,CAAAS,OAAA,EACAd,OAAA,CAAAnU,IAAA,CAAAmG,EAAA,EAAAoO,OAAA,CAAAC,YAAA,CAAArO,EAAA,EAEA,GAGAhE,KAAA,CAAAmE,MAAA,CAAA6N,OAAA,WAEA,CAAAe,KAAA,CAAAzZ,CAAA,CAAA0Z,KAAA,CAAAjB,MAAA,qBAGAtS,MAAA,CAAAP,SAAA,CAAA6T,KAAA,CAAAxT,gBAAA,CAAAmD,WAAA,EAGAjD,MAAA,CAAAqD,KAAA,CAAA3J,EAAA,UACAsG,MAAA,CAAA0C,EAAA,SACA,KAAAmO,oBAAA,CAAA7Q,MAAA,MAAA3F,MAAA,CAAA8V,gBAAA,CAAAqD,oBAAA,EAEAxT,MAAA,CAAAqP,OAAA,CAAAgD,WAAA,CACA,KAAArB,SAAA,CAAAhR,MAAA,EAGA,KAAAmS,MAAA,EACA,GAEA,EAQA,MANA,GAAAtY,CAAA,CAAAmM,IAAA,CAAAwM,WAAA,EACA,KAAAjD,KAAA,gBAAAiD,WAAA,CAAAE,KAAA,EAEAA,KAAA,GAGA,IACA,EAEAD,eAAA,EACA,MAAAgB,IAAA,IAQA,MANA,CAAAvc,MAAA,CAAAwc,QAAA,CAAAC,IAAA,CAAApS,OAAA,CAAAmS,QAAA,CAAA/Z,IAAA,KAAA4H,OAAA,8BAAAqS,CAAA,CAAA/U,GAAA,CAAAvC,KAAA,IACAzC,CAAA,CAAAga,GAAA,MAAAxZ,MAAA,CAAAmY,WAAA,CAAA3T,GAAA,IACA4U,IAAA,CAAA5U,GAAA,sBAAAvC,KAAA,IAAAA,KAAA,CAEA,GAEAmX,IACA,CACA,EAmCA,gBAAAtX,kBAAA3D,SAAA,CAAA6B,MAAA,EAEAA,MAAA,EACAR,CAAA,CAAA3B,OAAA,6CAAAkF,IAAA,GACA/C,MAAA,CAAA+C,IAAA,IACA/C,MAAA,CAAA+C,IAAA,EAAA1D,EAAA,CAAAW,MAAA,CAAA+C,IAAA,GAEA,GAGA,MAAA0W,aAAA,CAAAxZ,SAAA,CAAA8V,UAAA,CAAArN,SAAA,EACAxI,WAAA,CAAAmV,OAAA,EAGAlV,EAAA,oBAAAuZ,oBAAA,EACA,KAAAxD,QAAA,KACA,GAGA/V,EAAA,iBAAAwZ,iBAAA,EACA,KAAAtZ,MAAA,CAAAlC,SAAA,CACA,GAEAgC,EAAA,mBAAAyZ,mBAAA,EAkCA,SAAAC,cAAA9W,IAAA,EACA,MAAA+W,QAAA,CAAAC,UAAA,CAAAhX,IAAA,EACA,OAAA+W,QAAA,EAAAA,QAAA,CAAA1K,GAAA,QAAA4K,IAAA,EACA,CAQA,SAAAC,cAAAlX,IAAA,CAAAd,KAAA,EACA,MAAA6X,QAAA,CAAAC,UAAA,CAAAhX,IAAA,EACA+W,QAAA,EAAAA,QAAA,CAAA1K,GAAA,CAAAnN,KAAA,CACA,CAQA,SAAAiY,cAAAnX,IAAA,CAAAoX,KAAA,EACA,MAAAL,QAAA,CAAAC,UAAA,CAAAhX,IAAA,EACA+W,QAAA,GACA,oBAAAK,KAAA,GACAA,KAAA,EAAAL,QAAA,CAAA7D,EAAA,cAEAkE,KAAA,CACAL,QAAA,CAAAM,IAAA,gBAEAN,QAAA,CAAAM,IAAA,gBAGA,CA9DA,MAAAC,cAAA,CAAAhc,IAAA,GAEAA,IAAA,EAAAmB,CAAA,CAAA8a,aAAA,CAAAjc,IAAA,IACA,KAAA2B,MAAA,CAAAqW,WAAA,CAAA7W,CAAA,CAAA6T,MAAA,MAAArT,MAAA,CAAAqW,WAAA,KAAAhY,IAAA,GAGA,KAAAoD,GAAA,EACA,EAMA,IAAA8Y,MAAA,CAAAA,CAAA,GAAAF,cAAA,QAOA,CAAAN,UAAA,CAAAhX,IAAA,OAAAmT,QAAA,MAAAnT,IAAA,IAiDAyX,iBAAA,CAAA7W,MAAA,GACA,MAAA1C,eAAA,MAAAjB,MAAA,CACA,OAAAmV,WAAA,CACAtH,SAAA,CAAAQ,KAAA,CACApN,eAAA,CAAA0U,YAAA,CACA1U,eAAA,CAAAlE,UAAA,CACAkE,eAAA,CAAA2F,SACA,EACAjD,MAAA,CACA,MACA,EAAA5C,IAAA,CAAA1C,IAAA,GACA,CACAoc,WAAA,CAAApc,IAAA,CACAqc,aAAA,CAAA/W,MAAA,CAAA+W,aACA,EACA,CACA,EAOAC,sBAAA,CAAAA,CAAAC,MAAA,CAAAC,QAAA,IAMA,SAAAC,YAAA,EACA,MAAAC,KAAA,CAAAvb,CAAA,CAAAwb,KAAA,CAAAJ,MAAA,CAAAf,aAAA,EAEA,MADA,CAAAK,aAAA,SAAAa,KAAA,EACAA,KACA,CAOA,SAAAE,aAAAd,KAAA,EACA3a,CAAA,CAAA3B,OAAA,CAAA+c,MAAA,UAAA1X,SAAA,EACAgX,aAAA,CAAAhX,SAAA,CAAAiX,KAAA,CACA,EACA,CAGA3a,CAAA,CAAA3B,OAAA,CAAA+c,MAAA,CAAA1X,SAAA,GACA,KAAAgT,QAAA,MAAAhT,SAAA,SAAA5B,UAAA,GACAwV,IAAA,mBAAA5T,SAAA,MACA/C,EAAA,YAAAyP,CAAA,GACA,MAAAsL,WAAA,MAAAtL,CAAA,CAAAuL,KAAA,CACAD,WAAA,EACAtL,CAAA,CAAAwL,cAAA,GAEA5b,CAAA,CAAAoC,KAAA,MACAkZ,WAAA,IAAAI,WAAA,EACA,KAAAhF,QAAA,CAAAsB,MAAA,CAAA6D,KAAA,EAEA,EACA,EACA,GAEAP,WAAA,GAGAG,YAAA,KACA/F,KAAA,sBACAnU,IAAA,CAAAua,OAAA,GAEA,KAAAnb,EAAA,qBACAX,CAAA,CAAA3B,OAAA,CAAA+c,MAAA,CAAA1X,SAAA,GACAoY,OAAA,CAAAC,OAAA,CAAArY,SAAA,CAAA2W,aAAA,CAAA3W,SAAA,GAAAgQ,KAAA,CAAA5U,KAAA,GACAiT,MAAA,CAAAjT,KAAA,CAAAA,KAAA,CACA,EACA,EACA,GAGAkd,OAAA,CAAAC,GAAA,CACAjc,CAAA,CAAAkK,GAAA,CAAAkR,MAAA,CAAA1X,SAAA,EACAoY,OAAA,CAAAI,OAAA,CAAAxY,SAAA,EAAAnC,IAAA,CAAAkB,KAAA,GACAgY,aAAA,CAAA/W,SAAA,CAAAjB,KAAA,CACA,EACA,CACA,EACA,EACAiR,KAAA,CAAA5U,KAAA,GACAiT,MAAA,CAAAjT,KAAA,CAAAA,KAAA,CACA,GACAyC,IAAA,MACAka,YAAA,KACAH,WAAA,EACA,GAGAP,MAAA,CAAAA,CAAA,IACA,MAAA5W,MAAA,CAAAnE,CAAA,CAAAsE,MAAA,CACA8W,MAAA,CACA,CAAAxS,MAAA,CAAAlF,SAAA,IACAkF,MAAA,CAAAlF,SAAA,EAAA2W,aAAA,CAAA3W,SAAA,EACAkF,MAAA,CACA,CACA,EACA,EAEA,KAAA4N,YAAA,CAAA3W,EAAA,4BACAgY,OAAA,GACAK,OAAA,GAEAlY,CAAA,CAAAoB,UAAA,CAAAia,QAAA,EACAA,QAAA,CAAAlX,MAAA,EACA5C,IAAA,CAAAsZ,cAAA,EACAnH,KAAA,CAAA5U,KAAA,QACA,CAAAqd,QAAA,CAAArd,KAAA,CAAAqd,QAAA,KACA9S,OAAA,CACA8S,QAAA,CAAAC,QAAA,EACAD,QAAA,CAAAE,YAAA,EACAxc,EAAA,iDACA+V,WAAA,CAAAvM,OAAA,EACA0I,MAAA,CAAAjT,KAAA,CAAAA,KAAA,EACA,KAAA0X,YAAA,CAAA3W,EAAA,+BAAAkY,MAAA,EACA,GAEA8C,cAAA,CAAA1W,MAAA,CAEA,EAGA,KAAAxD,EAAA,qBACA8a,YAAA,IACA,GAAA9a,EAAA,mBACA8a,YAAA,IACA,EACA,EAGA,KAAA/E,QAAA,EACAsB,MAAA,MAAAsE,UAAA,CAAAhF,IAAA,oCACAX,OAAA,MAAA2F,UAAA,CAAAhF,IAAA,eACAE,QAAA,MAAA8E,UAAA,CAAAhF,IAAA,YACA,EAGA,KAAAZ,QAAA,CAAAsB,MAAA,CAAArX,EAAA,cACA,KAAA+V,QAAA,CAAAsB,MAAA,CAAAvB,EAAA,cAAAsE,MAAA,EACA,GAEA,KAAAva,MAAA,CAAA8U,iBAAA,GACA,KAAA9U,MAAA,CAAAoU,kBAAA,CACAuG,sBAAA,gCAAAH,iBAAA,EAEAG,sBAAA,mBAIA,KAAA3a,MAAA,CAAA6U,eAAA,EACA8F,sBAAA,8BAIA,KAAAzE,QAAA,CAAAc,QAAA,CAAA7W,EAAA,yDAAA4b,cAAA,OACA,CAAAC,IAAA,CAAAhe,CAAA,OAAAie,OAAA,WACApF,OAAA,CAAAmF,IAAA,CAAAC,OAAA,kBACAC,QAAA,CAAArF,OAAA,CAAAC,IAAA,aACAoF,QAAA,CAAAzE,WAAA,WACAuE,IAAA,CAAArE,QAAA,WACAd,OAAA,CAAAC,IAAA,mCAAAW,WAAA,UACA,GAGA,KAAAvB,QAAA,CAAAc,QAAA,CAAA7W,EAAA,yDAAAgc,cAAA,OACA,CAAAH,IAAA,CAAAhe,CAAA,OAAAie,OAAA,WACApF,OAAA,CAAAmF,IAAA,CAAAC,OAAA,kBACAC,QAAA,CAAArF,OAAA,CAAAC,IAAA,aACAoF,QAAA,CAAAvE,QAAA,WACAqE,IAAA,CAAArE,QAAA,WACAd,OAAA,CAAAC,IAAA,mCAAAW,WAAA,UACA,EACA,GAIA,MAFA,CAAAjY,CAAA,CAAAoC,KAAA,KAAA6X,aAAA,CAAA5X,IAAA,CAAA7B,MAAA,GAEAyZ,aACA,CACA,GCxwBA1b,MAAA,6EAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA1U,MAAA,IAKA,MAJA,CAAAA,MAAA,mBACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAyd,gBAAA,EAAA9c,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAA8H,QAAA,CAAAhe,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACAA,MACA,CACA,SAAAmd,SAAA1d,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAwd,gBAAA,EAAAxI,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAyd,gBAAA,CAAAxI,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAAod,SAAA3d,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAiV,MAAA,EAAAD,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAkV,MAAA,CAAAD,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAAqd,SAAA5d,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAE,MAAA,IAMA,MALA,CAAAA,MAAA,SACAF,MAAA,CAAAJ,OAAA,CAAAmV,IAAA,EAAAH,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAoV,IAAA,CAAAH,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,OACA1U,MACA,CAEA,SAAAsd,SAAA7d,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAMA,MALA,CAAAA,MAAA,iEACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,cAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,mBAAAM,OAAA,IACA,iJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,aAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,kBAAAM,OAAA,IACA,oCACAC,MACA,CAEA,SAAAwV,UAAA/V,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA1U,MAAA,IAKA,MAJA,CAAAA,MAAA,mBACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAyV,kBAAA,EAAA9U,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAC,OAAA,IAAAkI,SAAA,CAAApe,IAAA,EAAAoW,EAAA,CAAAH,IAAA,CAAAC,OAAA,IAAAmI,SAAA,CAAAre,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACAA,MACA,CACA,SAAAwd,UAAA/d,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAUA,MATA,CAAAA,MAAA,6DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,kBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,uBAAAM,OAAA,IACA,wJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,iBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,sBAAAM,OAAA,IACA,2EACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,eAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,IACA,8IACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,8BAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,mCAAAM,OAAA,IACA,oCACAC,MACA,CAEA,SAAAud,UAAA9d,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAMA,MALA,CAAAA,MAAA,2DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,mJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,eAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,IACA,oCACAC,MACA,CA1FA,KAAAJ,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAAAyV,YAAA,YAAAvV,gBAAA,MAAAA,gBAAA,CAAAkV,IAAA,MAAAnV,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAsHA,MA5BA,CAAAD,MAAA,uDACAF,MAAA,CAAAJ,OAAA,CAAAoK,KAAA,EAAA4K,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAqK,KAAA,CAAA4K,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,+CACAA,MAAA,CAAAhV,OAAA,SAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmX,gBAAA,EAAAxW,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAkV,MAAA,EAAAvU,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAA+H,QAAA,CAAAje,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAoV,IAAA,EAAAzU,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAgI,QAAA,CAAAle,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAkW,eAAA,EAAAvV,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAiI,QAAA,CAAAne,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,eACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAmW,iBAAA,EAAAxV,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,IAAAG,SAAA,CAAArW,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,2DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,gBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,qBAAAM,OAAA,IACA,kJACAG,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,oBAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,yBAAAM,OAAA,IACA,gJACAD,MAAA,CAAAJ,OAAA,CAAAmW,MAAA,EAAAnB,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAoW,MAAA,CAAAnB,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACA,wIACA1U,MACA,KC1GAnB,MAAA,yDACA,SACA,SACA,OACA,UACA,eACA,qBACA,eACA,cACA,kDACA,oDACA,UAAA6B,MAAA,CAAA5B,CAAA,CAAAqB,EAAA,CAAAT,OAAA,CAAAwM,OAAA,CAAAtL,UAAA,CAAA6c,SAAA,CAAA1e,QAAA,CAAA6D,iBAAA,CAAA8a,aAAA,EACA,aAOA,MAAAC,QAAA,sBASA,MANA,CAAA/c,UAAA,CAAA5C,KAAA,GAMA,CAIAA,MAAA,EAiBA,SAAA4f,cAAAC,WAAA,EACAjb,iBAAA,CAAAkb,KAAA,CAAAhd,MAAA,EACAE,WAAA,CAAA0c,aAAA,EACAzc,EAAA,mBAAAyZ,mBAAA,EAEA,KAAA1D,QAAA,CAAA+G,YAAA,MAAA3b,UAAA,GACAwV,IAAA,mCACA3W,EAAA,YAAAyP,CAAA,GACA,KAAAA,CAAA,CAAAuL,KAAA,GACAvL,CAAA,CAAAwL,cAAA,GACA,KAAA3Z,GAAA,GAEA,GACA2N,GAAA,CAAA2N,WAAA,EAEAjd,UAAA,CAAA4B,IAAA,GACA1B,MAAA,CAAAwB,SAAA,EACA,KAAAC,GAAA,EAEA,GACAtB,EAAA,kBAAA+c,kBAAA,EAEA,KAAAld,MAAA,CAAAqW,WAAA,MAAArW,MAAA,CAAAqW,WAAA,KACA,KAAArW,MAAA,CAAAqW,WAAA,CAAA0G,WAAA,MAAA7G,QAAA,CAAA+G,YAAA,CAAA7N,GAAA,GAGA,KAAA8G,QAAA,CAAA+G,YAAA,CAAA7C,IAAA,gBACAta,UAAA,CAAA5C,KAAA,EACA,GACAiD,EAAA,gBAAAgd,gBAAA,EAEA,KAAAjH,QAAA,CAAA+G,YAAA,CAAA7C,IAAA,gBACAta,UAAA,CAAA4B,IAAA,EACA,EACA,MAlDA,CAAAkG,UAAA,CAAA5J,CAAA,CAAA6e,QAAA,EACAjW,SAAA,CAAAgB,UAAA,CAAAvJ,IAAA,qCACA2e,KAAA,CAAApV,UAAA,CAAAkP,IAAA,UACAsG,MAAA,CAAApf,CAAA,WACAqf,eAAA,CAAAzV,UAAA,CAAAvJ,IAAA,eACA2B,MAAA,CAAAqd,eAAA,CAAAtH,UAAA,EAAAsH,eAAA,CACAC,QAAA,CAAA1e,OAAA,CAAA2e,IAAA,sBAAA3W,SAAA,EACA4W,OAAA,IACAjd,YAAA,CAAAX,MAAA,CAAAI,MAAA,OAEAA,MAAA,CAAA8V,gBAAA,CAAAvV,YAAA,CAAAuV,gBAAA,KA0CA0H,OAAA,CAAAzZ,IAAA,EACAsE,EAAA,QACAoV,IAAA,iBACAzU,KAAA,CAAA3J,EAAA,uBACAqO,KAAA,CAAArO,EAAA,6BACAoQ,OAAA,EACA5S,MAAA,CAAAwc,QAAA,CAAAC,IAAA,CAAAgE,QACA,CACA,GAIAzgB,MAAA,CAAAyX,IAAA,GAAAzX,MAAA,CAAA6gB,GAAA,EACAF,OAAA,CAAAzZ,IAAA,EACAsE,EAAA,cACAoV,IAAA,SACAzU,KAAA,CAAA3J,EAAA,SACAqO,KAAA,CAAArO,EAAA,SACAoQ,OAAA,EACA5S,MAAA,CAAAyX,IAAA,CAAAqJ,KAAA,EACA,CACA,GAGAhB,SAAA,EACAiB,QAAA,CAAAR,MAAA,CACAI,OACA,GAGA,MAAA/W,GAAA,CAAA7H,OAAA,CAAA2e,IAAA,mCAAA3W,SAAA,EACAwE,OAAA,EAAA3E,GAAA,CAAA4K,OAAA,MACAtQ,IAAA,CAAA1C,IAAA,EAAAye,aAAA,CAAAze,IAAA,EAAAA,IAAA,CAAA0e,WAAA,GACA7J,KAAA,MACAjV,QAAA,GAAAK,KAAA,CAAAe,EAAA,yCACAyd,aAAA,EACA,EACA,CACA,CACA,GAEA,CC/IA,SAAAlN,CAAA,CAAAiO,CAAA,CAAA/X,CAAA,kCAAA/H,MAAA,EAAAA,MAAA,CAAA+f,GAAA,CAAA/f,MAAA,oDAAA+H,CAAA,sBAAAlG,MAAA,EAAAA,MAAA,CAAAme,OAAA,CAAAne,MAAA,CAAAme,OAAA,CAAAjY,CAAA,GAAA+X,CAAA,CAAAE,OAAA,CAAAF,CAAA,CAAAE,OAAA,CAAAjY,CAAA,GAAA+X,CAAA,CAAAjO,CAAA,EAAA9J,CAAA,oDAAA8J,CAAA,SAAAA,CAAAiO,CAAA,uBAAAjO,CAAA,aAAAA,CAAA,CAAAiO,CAAA,MAAA/X,CAAA,EAAAkY,cAAA,kBAAAC,OAAA,+BAAAC,uBAAA,IAAAC,cAAA,eAAAC,gBAAA,UAAAnf,OAAA,MAAAof,MAAA,CAAAR,CAAA,CAAA/X,CAAA,OAAAwY,aAAA,CAAAtZ,KAAA,CAAAuZ,SAAA,CAAA1gB,OAAA,MAAA2gB,SAAA,CAAAxZ,KAAA,CAAAuZ,SAAA,CAAA7U,GAAA,SAAAkG,CAAA,CAAA2O,SAAA,EAAAF,MAAA,SAAAA,CAAAzO,CAAA,CAAAiO,CAAA,WAAAjO,CAAA,QAAAiO,CAAA,SAAA/X,CAAA,IAAA8J,CAAA,OAAAA,CAAA,CAAA9J,CAAA,GAAA+X,CAAA,CAAA/X,CAAA,IAAA8J,CAAA,CAAA9J,CAAA,IAAA+X,CAAA,CAAA/X,CAAA,EAAA8J,CAAA,CAAA9J,CAAA,UAAA+X,CAAA,EAAAY,GAAA,SAAAA,CAAA7O,CAAA,MAAAiO,CAAA,MAAA/X,CAAA,EAAAzH,IAAA,IAAA0F,IAAA,SAAAA,CAAA6L,CAAA,MAAA9J,CAAA,CAAA8J,CAAA,CAAApL,GAAA,CAAAka,CAAA,CAAA9O,CAAA,CAAA3N,KAAA,oBAAA4b,CAAA,CAAA5e,OAAA,CAAA0f,YAAA,GAAAD,CAAA,CAAAb,CAAA,CAAA5e,OAAA,CAAA0f,YAAA,CAAA7Y,CAAA,CAAA4Y,CAAA,QAAArgB,IAAA,CAAA0F,IAAA,EAAAS,GAAA,CAAAsB,CAAA,CAAA7D,KAAA,CAAAyc,CAAA,KAAA5Y,CAAA,MAAA8Y,YAAA,CAAA9Y,CAAA,EAAAA,CAAA,MAAA+Y,WAAA,CAAA/Y,CAAA,EAAAA,CAAA,MAAAgZ,aAAA,CAAAhZ,CAAA,EAAAA,CAAA,MAAAiZ,aAAA,CAAAjZ,CAAA,EAAAA,CAAA,MAAAkZ,sBAAA,CAAAlZ,CAAA,EAAAA,CAAA,MAAAmZ,mBAAA,CAAAnZ,CAAA,EAAAA,CAAA,MAAAoZ,4BAAA,CAAApZ,CAAA,EAAAA,CAAA,MAAAqZ,iBAAA,CAAArZ,CAAA,EAAAA,CAAA,MAAAsZ,iBAAA,CAAAtZ,CAAA,EAAAA,CAAA,MAAAuZ,eAAA,CAAAvZ,CAAA,EAAAA,CAAA,MAAAwZ,YAAA,CAAAxZ,CAAA,EAAAA,CAAA,MAAAyZ,cAAA,CAAAzZ,CAAA,EAAAA,CAAA,MAAA0Z,eAAA,CAAA1Z,CAAA,EAAAA,CAAA,MAAA2Z,WAAA,CAAA3Z,CAAA,EAAAA,CAAA,MAAA4Z,WAAA,CAAA5Z,CAAA,EAAAA,CAAA,MAAA6Z,aAAA,CAAA7Z,CAAA,EAAAA,CAAA,MAAA8Z,UAAA,CAAA9Z,CAAA,EAAAA,CAAA,MAAA+Z,SAAA,CAAA/Z,CAAA,EAAAA,CAAA,MAAAga,QAAA,CAAAha,CAAA,EAAAA,CAAA,MAAAia,UAAA,CAAAja,CAAA,EAAAA,CAAA,MAAAka,mBAAA,CAAAla,CAAA,EAAAA,CAAA,MAAAma,oBAAA,CAAAna,CAAA,EAAAA,CAAA,MAAAoa,YAAA,CAAApa,CAAA,EAAAA,CAAA,MAAAqa,iBAAA,CAAAra,CAAA,EAAAA,CAAA,MAAAsa,eAAA,CAAAta,CAAA,EAAAA,CAAA,MAAAua,qBAAA,CAAAva,CAAA,OAAAwa,QAAA,CAAAxa,CAAA,UAAAA,CAAA,MAAA4Y,CAAA,IAAAb,CAAA,CAAA5I,IAAA,CAAAnP,CAAA,CAAAzH,IAAA,UAAAuR,CAAA,MAAAiO,CAAA,CAAAjO,CAAA,CAAA3N,KAAA,qBAAA2N,CAAA,CAAA3N,KAAA,CAAAse,IAAA,GAAA1C,CAAA,CAAAjO,CAAA,CAAA3N,KAAA,CAAAse,IAAA,OAAA7B,CAAA,CAAA3a,IAAA,CAAA8Z,CAAA,QAAAnN,CAAA,CAAAmN,CAAA,CAAA2C,UAAA,CAAA9B,CAAA,CAAA6B,IAAA,mBAAA3Q,CAAA,CAAAc,CAAA,CAAA5K,CAAA,CAAAzH,IAAA,KAAAgiB,qBAAA,SAAAA,CAAAzQ,CAAA,gCAAA3Q,OAAA,CAAAwhB,cAAA,EAAA7Q,CAAA,CAAA7L,IAAA,EAAAS,GAAA,UAAAvC,KAAA,MAAAhD,OAAA,CAAAwhB,cAAA,KAAA7Q,CAAA,EAAAgP,YAAA,SAAAA,CAAAhP,CAAA,cAAA3Q,OAAA,CAAAyhB,gBAAA,EAAA9Q,CAAA,CAAA7L,IAAA,EAAAS,GAAA,cAAAvC,KAAA,MAAA0e,YAAA,KAAA/Q,CAAA,EAAA+Q,YAAA,SAAAA,CAAA,SAAAjR,SAAA,CAAAK,SAAA,EAAA8O,WAAA,SAAAA,CAAAjP,CAAA,cAAA3Q,OAAA,CAAA2hB,eAAA,EAAAhR,CAAA,CAAA7L,IAAA,EAAAS,GAAA,YAAAvC,KAAA,CAAAyN,SAAA,CAAAmR,QAAA,EAAAnR,SAAA,CAAAoR,YAAA,EAAApR,SAAA,CAAAqR,eAAA,EAAArR,SAAA,CAAAsR,cAAA,OAAApR,CAAA,EAAAkP,aAAA,SAAAA,CAAAlP,CAAA,cAAA3Q,OAAA,CAAAgiB,iBAAA,EAAArR,CAAA,CAAA7L,IAAA,EAAAS,GAAA,eAAAvC,KAAA,CAAA0N,MAAA,CAAAuR,UAAA,OAAAtR,CAAA,EAAAmP,aAAA,SAAAA,CAAAnP,CAAA,cAAA3Q,OAAA,CAAAkiB,iBAAA,EAAAvR,CAAA,CAAA7L,IAAA,EAAAS,GAAA,eAAAvC,KAAA,MAAAmf,aAAA,KAAAxR,CAAA,EAAAwR,aAAA,SAAAA,CAAA,SAAAvkB,MAAA,CAAAwkB,gBAAA,MAAApC,mBAAA,SAAAA,CAAArP,CAAA,cAAA3Q,OAAA,CAAAqiB,uBAAA,CAAA1R,CAAA,MAAA2R,mBAAA,CAAA3R,CAAA,GAAA2R,mBAAA,SAAAA,CAAA3R,CAAA,MAAAiO,CAAA,QAAAA,CAAA,MAAA5e,OAAA,CAAAif,uBAAA,EAAAvO,MAAA,CAAAoB,MAAA,CAAApB,MAAA,CAAAkB,KAAA,EAAAlB,MAAA,CAAAoB,MAAA,CAAApB,MAAA,CAAAkB,KAAA,GAAAlB,MAAA,CAAAkB,KAAA,CAAAlB,MAAA,CAAAoB,MAAA,sBAAA8M,CAAA,EAAAjO,CAAA,CAAA7L,IAAA,EAAAS,GAAA,cAAAvC,KAAA,CAAA4b,CAAA,GAAAjO,CAAA,EAAAsP,4BAAA,SAAAA,CAAAtP,CAAA,cAAA3Q,OAAA,CAAAuiB,gCAAA,CAAA5R,CAAA,MAAA6R,4BAAA,CAAA7R,CAAA,GAAA6R,4BAAA,SAAAA,CAAA7R,CAAA,MAAAiO,CAAA,QAAAlO,MAAA,CAAA+R,UAAA,EAAA/R,MAAA,CAAAgS,WAAA,GAAA9D,CAAA,MAAA5e,OAAA,CAAAif,uBAAA,CAAAvO,MAAA,CAAAgS,WAAA,CAAAhS,MAAA,CAAA+R,UAAA,EAAA/R,MAAA,CAAAgS,WAAA,CAAAhS,MAAA,CAAA+R,UAAA,GAAA/R,MAAA,CAAA+R,UAAA,CAAA/R,MAAA,CAAAgS,WAAA,GAAAhS,MAAA,CAAAgS,WAAA,CAAAhS,MAAA,CAAA+R,UAAA,uBAAA7D,CAAA,EAAAjO,CAAA,CAAA7L,IAAA,EAAAS,GAAA,wBAAAvC,KAAA,CAAA4b,CAAA,GAAAjO,CAAA,EAAAuP,iBAAA,SAAAA,CAAAvP,CAAA,cAAA3Q,OAAA,CAAA2iB,qBAAA,EAAAhS,CAAA,CAAA7L,IAAA,EAAAS,GAAA,mBAAAvC,KAAA,KAAAgJ,IAAA,GAAA4W,iBAAA,KAAAjS,CAAA,EAAAwP,iBAAA,SAAAA,CAAAxP,CAAA,cAAA3Q,OAAA,CAAA6iB,qBAAA,OAAAC,iBAAA,IAAAnS,CAAA,CAAA7L,IAAA,EAAAS,GAAA,mBAAAvC,KAAA,KAAA2N,CAAA,EAAAyP,eAAA,SAAAA,CAAAzP,CAAA,cAAA3Q,OAAA,CAAA6iB,qBAAA,OAAAE,eAAA,IAAApS,CAAA,CAAA7L,IAAA,EAAAS,GAAA,iBAAAvC,KAAA,KAAA2N,CAAA,EAAA0P,YAAA,SAAAA,CAAA1P,CAAA,cAAA3Q,OAAA,CAAAgjB,gBAAA,OAAAC,YAAA,IAAAtS,CAAA,CAAA7L,IAAA,EAAAS,GAAA,cAAAvC,KAAA,KAAA2N,CAAA,EAAA2P,cAAA,SAAAA,CAAA3P,CAAA,SAAA3T,QAAA,CAAAkmB,IAAA,QAAAljB,OAAA,CAAAmjB,kBAAA,EAAAnmB,QAAA,CAAAkmB,IAAA,CAAAE,WAAA,EAAAzS,CAAA,CAAA7L,IAAA,EAAAS,GAAA,gBAAAvC,KAAA,KAAA2N,CAAA,EAAA4P,eAAA,SAAAA,CAAA5P,CAAA,cAAA3Q,OAAA,CAAAqjB,mBAAA,EAAAzlB,MAAA,CAAA0lB,YAAA,EAAA3S,CAAA,CAAA7L,IAAA,EAAAS,GAAA,iBAAAvC,KAAA,KAAA2N,CAAA,EAAA6P,WAAA,SAAAA,CAAA7P,CAAA,cAAA3Q,OAAA,CAAAujB,eAAA,EAAA5S,CAAA,CAAA7L,IAAA,EAAAS,GAAA,aAAAvC,KAAA,MAAAwgB,oBAAA,KAAA7S,CAAA,EAAA8P,WAAA,SAAAA,CAAA9P,CAAA,cAAA3Q,OAAA,CAAAyjB,eAAA,EAAA9S,CAAA,CAAA7L,IAAA,EAAAS,GAAA,sBAAAvC,KAAA,MAAA0gB,oBAAA,KAAA/S,CAAA,EAAA+P,aAAA,SAAAA,CAAA/P,CAAA,cAAA3Q,OAAA,CAAA2jB,iBAAA,EAAAhT,CAAA,CAAA7L,IAAA,EAAAS,GAAA,gBAAAvC,KAAA,MAAA4gB,aAAA,KAAAjT,CAAA,EAAAiQ,SAAA,SAAAA,CAAAjQ,CAAA,cAAA3Q,OAAA,CAAA6jB,aAAA,OAAAC,iBAAA,IAAAnT,CAAA,CAAA7L,IAAA,EAAAS,GAAA,UAAAvC,KAAA,MAAA+gB,WAAA,KAAApT,CAAA,EAAAkQ,QAAA,SAAAA,CAAAlQ,CAAA,cAAA3Q,OAAA,CAAAgkB,YAAA,CAAArT,CAAA,MAAAsT,gBAAA,IAAAtT,CAAA,CAAA7L,IAAA,EAAAS,GAAA,SAAAvC,KAAA,MAAAkhB,UAAA,KAAAvT,CAAA,EAAAA,CAAA,EAAAmQ,UAAA,SAAAA,CAAAnQ,CAAA,cAAA3Q,OAAA,CAAAmkB,cAAA,EAAAxT,CAAA,CAAA7L,IAAA,EAAAS,GAAA,WAAAvC,KAAA,MAAAohB,UAAA,KAAAzT,CAAA,EAAAoQ,mBAAA,SAAAA,CAAApQ,CAAA,cAAA3Q,OAAA,CAAAqkB,uBAAA,EAAA1T,CAAA,CAAA7L,IAAA,EAAAS,GAAA,sBAAAvC,KAAA,MAAAshB,mBAAA,KAAA3T,CAAA,EAAAqQ,oBAAA,SAAAA,CAAArQ,CAAA,cAAA3Q,OAAA,CAAAukB,wBAAA,EAAA5T,CAAA,CAAA7L,IAAA,EAAAS,GAAA,uBAAAvC,KAAA,MAAAwhB,oBAAA,KAAA7T,CAAA,EAAAsQ,YAAA,SAAAA,CAAAtQ,CAAA,cAAA3Q,OAAA,CAAAykB,gBAAA,EAAA9T,CAAA,CAAA7L,IAAA,EAAAS,GAAA,eAAAvC,KAAA,MAAA0hB,YAAA,KAAA/T,CAAA,EAAAuQ,iBAAA,SAAAA,CAAAvQ,CAAA,cAAA3Q,OAAA,CAAA2kB,qBAAA,EAAAhU,CAAA,CAAA7L,IAAA,EAAAS,GAAA,oBAAAvC,KAAA,MAAA4hB,iBAAA,KAAAjU,CAAA,EAAA0Q,QAAA,SAAAA,CAAA1Q,CAAA,CAAAiO,CAAA,cAAA5e,OAAA,CAAA6kB,cAAA,MAAAC,aAAA,CAAAnU,CAAA,CAAAiO,CAAA,OAAAmG,UAAA,CAAApU,CAAA,CAAAiO,CAAA,GAAAkG,aAAA,SAAAA,CAAAnU,CAAA,CAAAiO,CAAA,cAAA5e,OAAA,CAAAglB,iBAAA,CAAApG,CAAA,CAAAjO,CAAA,OAAAsU,kBAAA,SAAAC,oBAAA,4BAAAllB,OAAA,CAAAgf,OAAA,CAAAJ,CAAA,CAAAjO,CAAA,YAAAwU,qBAAA,UAAAte,CAAA,EAAA8J,CAAA,CAAA7L,IAAA,EAAAS,GAAA,aAAAvC,KAAA,CAAA6D,CAAA,CAAAya,IAAA,QAAA1C,CAAA,CAAAjO,CAAA,IAAAiO,CAAA,CAAAjO,CAAA,GAAAoU,UAAA,SAAAA,CAAApU,CAAA,CAAAiO,CAAA,MAAA/X,CAAA,aAAAqF,UAAA,gBAAAuT,CAAA,oCAAAhO,CAAA,g9BAAA2T,CAAA,i/LAAAve,CAAA,CAAA7G,OAAA,CAAAqlB,eAAA,GAAA5T,CAAA,CAAAA,CAAA,CAAAlT,MAAA,CAAA6mB,CAAA,GAAA3T,CAAA,CAAAA,CAAA,CAAAlT,MAAA,CAAAsI,CAAA,CAAA7G,OAAA,CAAAmf,gBAAA,MAAAlR,CAAA,iBAAApG,CAAA,QAAAyd,CAAA,CAAAtoB,QAAA,CAAAuoB,oBAAA,YAAA1T,CAAA,CAAA7U,QAAA,CAAAkU,aAAA,QAAAsU,CAAA,CAAAxoB,QAAA,CAAAkU,aAAA,QAAAuU,CAAA,IAAAC,CAAA,IAAAC,CAAA,SAAAA,CAAA,MAAAhV,CAAA,CAAA3T,QAAA,CAAAkU,aAAA,gBAAAP,CAAA,CAAAiV,KAAA,CAAAC,QAAA,YAAAlV,CAAA,CAAAiV,KAAA,CAAA1N,IAAA,WAAAvH,CAAA,CAAAiV,KAAA,CAAAE,QAAA,QAAAnV,CAAA,CAAAiV,KAAA,CAAAG,UAAA,UAAApV,CAAA,CAAAqV,SAAA,iBAAArV,CAAA,EAAAsV,CAAA,SAAAA,CAAAtV,CAAA,CAAAiO,CAAA,MAAA/X,CAAA,CAAA8e,CAAA,UAAA9e,CAAA,CAAA+e,KAAA,CAAAM,UAAA,KAAAvV,CAAA,MAAAiO,CAAA,CAAA/X,CAAA,EAAA+J,CAAA,SAAAA,CAAA,UAAAa,CAAA,CAAAd,CAAA,IAAAiO,CAAA,GAAA/X,CAAA,CAAA4Y,CAAA,CAAA5gB,MAAA,CAAA+f,CAAA,CAAA/X,CAAA,CAAA+X,CAAA,GAAAnN,CAAA,CAAAkU,CAAA,GAAAlU,CAAA,CAAAmU,KAAA,CAAAM,UAAA,CAAAzG,CAAA,CAAAb,CAAA,EAAA/M,CAAA,CAAAsU,WAAA,CAAA1U,CAAA,EAAAd,CAAA,CAAA7L,IAAA,CAAA2M,CAAA,SAAAd,CAAA,EAAA2J,CAAA,SAAAA,CAAA,UAAA3J,CAAA,IAAAiO,CAAA,GAAA/X,CAAA,CAAA4K,CAAA,CAAA5S,MAAA,CAAA+f,CAAA,CAAA/X,CAAA,CAAA+X,CAAA,YAAA0G,CAAA,CAAAF,CAAA,IAAAnX,CAAA,GAAApG,CAAA,CAAA4X,CAAA,CAAA5gB,MAAA,CAAAoP,CAAA,CAAApG,CAAA,CAAAoG,CAAA,GAAAqX,CAAA,CAAAW,CAAA,CAAAxU,CAAA,CAAAmN,CAAA,EAAAa,CAAA,CAAAxR,CAAA,GAAAuX,CAAA,CAAAW,WAAA,CAAAb,CAAA,EAAAF,CAAA,CAAAtgB,IAAA,CAAAwgB,CAAA,EAAA3U,CAAA,CAAAc,CAAA,CAAAmN,CAAA,GAAAwG,CAAA,QAAAzU,CAAA,EAAAyV,CAAA,SAAAA,CAAAzV,CAAA,UAAAiO,CAAA,IAAA/X,CAAA,GAAAA,CAAA,CAAA4Y,CAAA,CAAA5gB,MAAA,CAAAgI,CAAA,MAAA+X,CAAA,CAAAjO,CAAA,CAAA9J,CAAA,EAAAwf,WAAA,GAAAZ,CAAA,CAAAhG,CAAA,CAAA5Y,CAAA,IAAA8J,CAAA,CAAA9J,CAAA,EAAAyf,YAAA,GAAAZ,CAAA,CAAAjG,CAAA,CAAA5Y,CAAA,UAAA+X,CAAA,QAAAA,CAAA,EAAA2H,CAAA,CAAA3V,CAAA,GAAA0U,CAAA,CAAAa,WAAA,CAAAtU,CAAA,UAAA2U,CAAA,GAAAC,CAAA,CAAAhH,CAAA,CAAA5gB,MAAA,CAAA2nB,CAAA,CAAAC,CAAA,CAAAD,CAAA,GAAAf,CAAA,CAAAhG,CAAA,CAAA+G,CAAA,GAAAD,CAAA,CAAAC,CAAA,EAAAH,WAAA,CAAAX,CAAA,CAAAjG,CAAA,CAAA+G,CAAA,GAAAD,CAAA,CAAAC,CAAA,EAAAF,YAAA,KAAAI,CAAA,CAAApM,CAAA,GAAAgL,CAAA,CAAAa,WAAA,CAAAX,CAAA,UAAAmB,CAAA,IAAAC,CAAA,GAAAC,CAAA,CAAApV,CAAA,CAAA5S,MAAA,CAAA+nB,CAAA,CAAAC,CAAA,CAAAD,CAAA,GAAAR,CAAA,CAAAM,CAAA,CAAAjV,CAAA,CAAAmV,CAAA,KAAAD,CAAA,CAAA7hB,IAAA,CAAA2M,CAAA,CAAAmV,CAAA,GAAAtB,CAAA,CAAAwB,WAAA,CAAAtB,CAAA,EAAAF,CAAA,CAAAwB,WAAA,CAAAjV,CAAA,EAAAlB,CAAA,CAAA7L,IAAA,EAAAS,GAAA,YAAAvC,KAAA,CAAA2jB,CAAA,GAAA/H,CAAA,CAAAjO,CAAA,OAAAgQ,UAAA,SAAAA,CAAAhQ,CAAA,cAAA3Q,OAAA,CAAA+mB,cAAA,QAAAC,IAAA,QAAAhnB,OAAA,CAAAinB,gBAAA,EAAAtW,CAAA,CAAA7L,IAAA,EAAAS,GAAA,cAAAvC,KAAA,MAAAkkB,YAAA,KAAAvW,CAAA,CAAA7L,IAAA,EAAAS,GAAA,mBAAAvC,KAAA,MAAAmkB,iBAAA,MAAAxW,CAAA,EAAAwW,iBAAA,SAAAA,CAAA,UAAAxW,CAAA,IAAAiO,CAAA,GAAA/X,CAAA,CAAA4J,SAAA,CAAA2W,OAAA,CAAAvoB,MAAA,CAAA+f,CAAA,CAAA/X,CAAA,CAAA+X,CAAA,GAAAjO,CAAA,CAAA7L,IAAA,CAAA2L,SAAA,CAAA2W,OAAA,CAAAxI,CAAA,eAAAyI,qBAAA,KAAA1W,CAAA,CAAAA,CAAA,CAAAxL,IAAA,UAAAwL,CAAA,CAAAiO,CAAA,SAAAjO,CAAA,CAAA7M,IAAA,CAAA8a,CAAA,CAAA9a,IAAA,GAAA6M,CAAA,CAAA7M,IAAA,CAAA8a,CAAA,CAAA9a,IAAA,cAAA2G,GAAA,CAAAkG,CAAA,UAAAA,CAAA,MAAAiO,CAAA,MAAAnU,GAAA,CAAAkG,CAAA,UAAAA,CAAA,SAAAA,CAAA,CAAA9G,IAAA,CAAA8G,CAAA,CAAA2W,QAAA,EAAAhG,IAAA,QAAAA,IAAA,aAAA3Q,CAAA,CAAA7M,IAAA,CAAA6M,CAAA,CAAA4W,WAAA,CAAA3I,CAAA,EAAA0C,IAAA,eAAA4F,YAAA,SAAAA,CAAA,MAAAvW,CAAA,OAAAnP,MAAA,CAAAgmB,wBAAA,EAAAhmB,MAAA,CAAAgmB,wBAAA,CAAA5pB,MAAA,qCAAAA,MAAA,MAAAghB,CAAA,4iBAAAjO,CAAA,MAAAlG,GAAA,CAAAmU,CAAA,UAAAjO,CAAA,iBAAAI,aAAA,CAAAJ,CAAA,EAAAA,CAAA,OAAAiO,CAAA,wBAAAnO,SAAA,CAAA2W,OAAA,GAAAzW,CAAA,CAAAA,CAAA,CAAApS,MAAA,MAAA4oB,iBAAA,KAAAxW,CAAA,EAAA0W,qBAAA,SAAAA,CAAA,UAAA5H,CAAA,CAAA9O,CAAA,IAAAiO,CAAA,GAAA/X,CAAA,MAAA7G,OAAA,CAAAkf,cAAA,CAAArgB,MAAA,CAAA+f,CAAA,CAAA/X,CAAA,CAAA+X,CAAA,MAAAa,CAAA,MAAAzf,OAAA,CAAAkf,cAAA,CAAAN,CAAA,EAAAnO,SAAA,CAAAK,SAAA,CAAA2W,KAAA,CAAAhI,CAAA,GAAA9O,CAAA,iBAAAA,CAAA,EAAAwQ,eAAA,SAAAA,CAAAxQ,CAAA,cAAA3Q,OAAA,CAAA0nB,mBAAA,EAAA/W,CAAA,CAAA7L,IAAA,EAAAS,GAAA,iBAAAvC,KAAA,MAAA2kB,eAAA,KAAAhX,CAAA,EAAAoP,sBAAA,SAAAA,CAAApP,CAAA,cAAA3Q,OAAA,CAAA4nB,0BAAA,EAAAjX,CAAA,CAAA7L,IAAA,EAAAS,GAAA,wBAAAvC,KAAA,MAAA6kB,sBAAA,KAAAlX,CAAA,EAAAmS,iBAAA,SAAAA,CAAA,cAAAllB,MAAA,CAAAkqB,cAAA,OAAAnX,CAAA,aAAAoS,eAAA,SAAAA,CAAA,cAAAnlB,MAAA,CAAAmqB,YAAA,OAAApX,CAAA,aAAAsS,YAAA,SAAAA,CAAA,cAAArlB,MAAA,CAAAoqB,SAAA,OAAArX,CAAA,aAAAkX,sBAAA,SAAAA,CAAA,SAAApX,SAAA,CAAAwX,mBAAA,CAAAxX,SAAA,CAAAwX,mBAAA,YAAAzE,oBAAA,SAAAA,CAAA,SAAA/S,SAAA,CAAAyX,QAAA,CAAAzX,SAAA,CAAAyX,QAAA,YAAAxE,oBAAA,SAAAA,CAAA,SAAAjT,SAAA,CAAA0X,QAAA,CAAA1X,SAAA,CAAA0X,QAAA,YAAAvE,aAAA,SAAAA,CAAA,SAAAnT,SAAA,CAAA2X,UAAA,CAAA3X,SAAA,CAAA2X,UAAA,CAAA3X,SAAA,CAAA4X,YAAA,CAAA5X,SAAA,CAAA4X,YAAA,CAAAzqB,MAAA,CAAAwqB,UAAA,CAAAxqB,MAAA,CAAAwqB,UAAA,YAAAT,eAAA,SAAAA,CAAA,MAAAhX,CAAA,GAAAiO,CAAA,wBAAAnO,SAAA,CAAA6X,cAAA,qBAAA7X,SAAA,CAAA8X,gBAAA,GAAA5X,CAAA,CAAAF,SAAA,CAAA8X,gBAAA,EAAA5X,CAAA,CAAAF,SAAA,CAAA6X,cAAA,KAAAtrB,QAAA,CAAAwrB,WAAA,eAAA5J,CAAA,UAAA/X,CAAA,OAAA4Y,CAAA,mBAAA7hB,MAAA,SAAA+S,CAAA,CAAAiO,CAAA,CAAAa,CAAA,GAAAsE,WAAA,SAAAA,CAAA,MAAA0E,OAAA,CAAAtlB,IAAA,CAAAulB,EAAA,CAAA/X,CAAA,IAAAiO,CAAA,CAAA5hB,QAAA,CAAAkU,aAAA,WAAA0N,CAAA,CAAAhN,KAAA,KAAAgN,CAAA,CAAA9M,MAAA,KAAA8M,CAAA,CAAAgH,KAAA,CAAA+C,OAAA,cAAA9hB,CAAA,CAAA+X,CAAA,CAAAgK,UAAA,cAAA/hB,CAAA,CAAAgiB,IAAA,YAAAhiB,CAAA,CAAAgiB,IAAA,UAAAlY,CAAA,CAAA7L,IAAA,yBAAA+B,CAAA,CAAAiiB,aAAA,6BAAAjiB,CAAA,CAAAkiB,YAAA,cAAAliB,CAAA,CAAAmiB,SAAA,QAAAniB,CAAA,CAAAoiB,QAAA,cAAApiB,CAAA,CAAAmiB,SAAA,QAAAniB,CAAA,CAAAqiB,IAAA,MAAAlpB,OAAA,CAAAmpB,uBAAA,sCAAAtiB,CAAA,CAAAuiB,QAAA,sDAAAviB,CAAA,CAAAmiB,SAAA,0BAAAniB,CAAA,CAAAqiB,IAAA,cAAAriB,CAAA,CAAAuiB,QAAA,sDAAAviB,CAAA,CAAAwiB,wBAAA,YAAAxiB,CAAA,CAAAmiB,SAAA,kBAAAniB,CAAA,CAAAyiB,SAAA,GAAAziB,CAAA,CAAA0iB,GAAA,cAAAd,OAAA,KAAA5hB,CAAA,CAAA2iB,SAAA,GAAA3iB,CAAA,CAAA4iB,IAAA,GAAA5iB,CAAA,CAAAmiB,SAAA,kBAAAniB,CAAA,CAAAyiB,SAAA,GAAAziB,CAAA,CAAA0iB,GAAA,eAAAd,OAAA,KAAA5hB,CAAA,CAAA2iB,SAAA,GAAA3iB,CAAA,CAAA4iB,IAAA,GAAA5iB,CAAA,CAAAmiB,SAAA,kBAAAniB,CAAA,CAAAyiB,SAAA,GAAAziB,CAAA,CAAA0iB,GAAA,eAAAd,OAAA,KAAA5hB,CAAA,CAAA2iB,SAAA,GAAA3iB,CAAA,CAAA4iB,IAAA,GAAA5iB,CAAA,CAAAmiB,SAAA,kBAAAniB,CAAA,CAAA0iB,GAAA,cAAAd,OAAA,KAAA5hB,CAAA,CAAA0iB,GAAA,cAAAd,OAAA,KAAA5hB,CAAA,CAAA4iB,IAAA,YAAA9Y,CAAA,CAAA7L,IAAA,cAAA8Z,CAAA,CAAA8K,SAAA,IAAA/Y,CAAA,CAAA2Q,IAAA,OAAA4C,UAAA,SAAAA,CAAA,MAAAvT,CAAA,CAAAiO,CAAA,SAAAA,EAAA,SAAAjO,CAAA,CAAAgZ,UAAA,UAAAhZ,CAAA,CAAA2H,MAAA,CAAA3H,CAAA,CAAAiZ,UAAA,EAAAjZ,CAAA,CAAAkZ,SAAA,CAAAlZ,CAAA,CAAAmZ,MAAA,EAAAnZ,CAAA,CAAAoZ,KAAA,CAAApZ,CAAA,CAAAqZ,gBAAA,CAAArZ,CAAA,CAAAsZ,gBAAA,MAAArL,CAAA,SAAAA,CAAA,SAAA/X,CAAA,SAAAA,CAAA8J,CAAA,MAAAiO,CAAA,CAAA/X,CAAA,CAAA8J,CAAA,CAAAuZ,YAAA,oCAAAvZ,CAAA,CAAAuZ,YAAA,2CAAAvZ,CAAA,CAAAuZ,YAAA,8CAAArjB,CAAA,EAAA+X,CAAA,CAAAjO,CAAA,CAAAwZ,YAAA,CAAAtjB,CAAA,CAAAujB,8BAAA,MAAAxL,CAAA,GAAAA,CAAA,IAAAA,CAAA,WAAAjO,CAAA,MAAA0Z,cAAA,IAAA1Z,CAAA,iBAAA8O,CAAA,IAAAhO,CAAA,qLAAA2T,CAAA,sHAAAnX,CAAA,CAAA0C,CAAA,CAAA2Z,YAAA,GAAA3Z,CAAA,CAAA4Z,UAAA,CAAA5Z,CAAA,CAAA6Z,YAAA,CAAAvc,CAAA,MAAApG,CAAA,KAAA4iB,YAAA,uCAAA9Z,CAAA,CAAA+Z,UAAA,CAAA/Z,CAAA,CAAA6Z,YAAA,CAAA3iB,CAAA,CAAA8I,CAAA,CAAAga,WAAA,EAAA1c,CAAA,CAAA2c,QAAA,GAAA3c,CAAA,CAAA4c,QAAA,OAAAvF,CAAA,CAAA3U,CAAA,CAAAma,aAAA,GAAAjZ,CAAA,CAAAlB,CAAA,CAAAoa,YAAA,CAAApa,CAAA,CAAAqa,aAAA,EAAAra,CAAA,CAAAsa,YAAA,CAAApZ,CAAA,sLAAAlB,CAAA,CAAAua,aAAA,CAAArZ,CAAA,MAAA2T,CAAA,CAAA7U,CAAA,CAAAoa,YAAA,CAAApa,CAAA,CAAAwa,eAAA,EAAAxa,CAAA,CAAAsa,YAAA,CAAAzF,CAAA,uHAAA7U,CAAA,CAAAua,aAAA,CAAA1F,CAAA,EAAA7U,CAAA,CAAAya,YAAA,CAAA9F,CAAA,CAAAzT,CAAA,EAAAlB,CAAA,CAAAya,YAAA,CAAA9F,CAAA,CAAAE,CAAA,EAAA7U,CAAA,CAAA0a,WAAA,CAAA/F,CAAA,EAAA3U,CAAA,CAAA2a,UAAA,CAAAhG,CAAA,EAAAA,CAAA,CAAAiG,eAAA,CAAA5a,CAAA,CAAA6a,iBAAA,CAAAlG,CAAA,eAAAA,CAAA,CAAAmG,aAAA,CAAA9a,CAAA,CAAA+a,kBAAA,CAAApG,CAAA,kBAAA3U,CAAA,CAAAgb,uBAAA,CAAArG,CAAA,CAAAsG,cAAA,EAAAjb,CAAA,CAAAkb,mBAAA,CAAAvG,CAAA,CAAAiG,eAAA,CAAAtd,CAAA,CAAA2c,QAAA,CAAAja,CAAA,CAAAmb,KAAA,SAAAnb,CAAA,CAAAob,SAAA,CAAAzG,CAAA,CAAAmG,aAAA,MAAA9a,CAAA,CAAAqb,UAAA,CAAArb,CAAA,CAAAsb,cAAA,GAAAhe,CAAA,CAAA4c,QAAA,QAAAla,CAAA,CAAAub,MAAA,EAAAzM,CAAA,CAAA3a,IAAA,CAAA6L,CAAA,CAAAub,MAAA,CAAAxC,SAAA,IAAAjK,CAAA,CAAA3a,IAAA,eAAA6L,CAAA,CAAAwb,sBAAA,GAAA7K,IAAA,OAAA7B,CAAA,CAAA3a,IAAA,mCAAA8Z,CAAA,CAAAjO,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAyb,wBAAA,IAAA3M,CAAA,CAAA3a,IAAA,mCAAA8Z,CAAA,CAAAjO,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA0b,wBAAA,IAAA5M,CAAA,CAAA3a,IAAA,qBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA2b,UAAA,GAAA7M,CAAA,CAAA3a,IAAA,wBAAA6L,CAAA,CAAA4b,oBAAA,GAAAC,SAAA,cAAA/M,CAAA,CAAA3a,IAAA,oBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA8b,SAAA,GAAAhN,CAAA,CAAA3a,IAAA,qBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA+b,UAAA,GAAAjN,CAAA,CAAA3a,IAAA,qBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAgc,UAAA,GAAAlN,CAAA,CAAA3a,IAAA,yBAAA+B,CAAA,CAAA8J,CAAA,GAAA8O,CAAA,CAAA3a,IAAA,2CAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAic,gCAAA,GAAAnN,CAAA,CAAA3a,IAAA,oCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAkc,yBAAA,GAAApN,CAAA,CAAA3a,IAAA,uCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAmc,4BAAA,GAAArN,CAAA,CAAA3a,IAAA,iCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAoc,qBAAA,GAAAtN,CAAA,CAAA3a,IAAA,kCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAqc,uBAAA,GAAAvN,CAAA,CAAA3a,IAAA,2BAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAsc,gBAAA,GAAAxN,CAAA,CAAA3a,IAAA,8BAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAuc,mBAAA,GAAAzN,CAAA,CAAA3a,IAAA,6BAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAwc,kBAAA,GAAA1N,CAAA,CAAA3a,IAAA,yCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAyc,8BAAA,GAAA3N,CAAA,CAAA3a,IAAA,qCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA0c,0BAAA,GAAA5N,CAAA,CAAA3a,IAAA,4BAAA8Z,CAAA,CAAAjO,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA2c,iBAAA,IAAA7N,CAAA,CAAA3a,IAAA,mBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA4c,QAAA,GAAA9N,CAAA,CAAA3a,IAAA,mBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA6c,QAAA,GAAA/N,CAAA,CAAA3a,IAAA,mCAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA8c,wBAAA,GAAAhO,CAAA,CAAA3a,IAAA,uBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAA+c,YAAA,GAAAjO,CAAA,CAAA3a,IAAA,iBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAgd,MAAA,GAAAlO,CAAA,CAAA3a,IAAA,kBAAA6L,CAAA,CAAAwZ,YAAA,CAAAxZ,CAAA,CAAAid,OAAA,WAAAnI,CAAA,CAAA9U,CAAA,CAAAuZ,YAAA,8BAAAzE,CAAA,GAAAhG,CAAA,CAAA3a,IAAA,0BAAA6L,CAAA,CAAAwZ,YAAA,CAAA1E,CAAA,CAAAoI,qBAAA,GAAApO,CAAA,CAAA3a,IAAA,4BAAA6L,CAAA,CAAAwZ,YAAA,CAAA1E,CAAA,CAAAqI,uBAAA,UAAApI,CAAA,UAAA/U,CAAA,CAAAod,wBAAA,EAAAtO,CAAA,CAAA3a,IAAA,6CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAqd,UAAA,EAAAC,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAqd,UAAA,EAAAE,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAqd,UAAA,EAAAG,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,+CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAyd,YAAA,EAAAH,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAyd,YAAA,EAAAF,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAAyd,YAAA,EAAAD,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,4CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA0d,SAAA,EAAAJ,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,qDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA0d,SAAA,EAAAH,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,qDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA0d,SAAA,EAAAF,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,+CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAqd,UAAA,EAAAC,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAqd,UAAA,EAAAE,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAqd,UAAA,EAAAG,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,iDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAyd,YAAA,EAAAH,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,0DAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAyd,YAAA,EAAAF,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,0DAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAAyd,YAAA,EAAAD,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,8CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA0d,SAAA,EAAAJ,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,uDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA0d,SAAA,EAAAH,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,uDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA0d,SAAA,EAAAF,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,2CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA2d,QAAA,EAAAL,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,oDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA2d,QAAA,EAAAJ,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,oDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA2d,QAAA,EAAAH,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,6CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA4d,UAAA,EAAAN,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA4d,UAAA,EAAAL,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA4d,UAAA,EAAAJ,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,0CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA6d,OAAA,EAAAP,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,mDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA6d,OAAA,EAAAN,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,mDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAqa,aAAA,CAAAra,CAAA,CAAA6d,OAAA,EAAAL,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,6CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA2d,QAAA,EAAAL,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA2d,QAAA,EAAAJ,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,sDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA2d,QAAA,EAAAH,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,+CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA4d,UAAA,EAAAN,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA4d,UAAA,EAAAL,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,wDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA4d,UAAA,EAAAJ,QAAA,EAAA1O,CAAA,CAAA3a,IAAA,4CAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA6d,OAAA,EAAAP,SAAA,EAAAxO,CAAA,CAAA3a,IAAA,qDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA6d,OAAA,EAAAN,QAAA,EAAAzO,CAAA,CAAA3a,IAAA,qDAAA6L,CAAA,CAAAod,wBAAA,CAAApd,CAAA,CAAAwa,eAAA,CAAAxa,CAAA,CAAA6d,OAAA,EAAAL,QAAA,EAAA1O,CAAA,CAAA6B,IAAA,OAAA7B,CAAA,CAAA6B,IAAA,OAAA8C,UAAA,SAAAA,CAAA,MAAAzT,CAAA,CAAA3T,QAAA,CAAAkU,aAAA,QAAAP,CAAA,CAAAqV,SAAA,UAAArV,CAAA,CAAA8d,SAAA,cAAA7P,CAAA,QAAA5hB,QAAA,CAAAkmB,IAAA,CAAAiD,WAAA,CAAAxV,CAAA,EAAAiO,CAAA,KAAA5hB,QAAA,CAAA0xB,sBAAA,cAAApI,YAAA,CAAAtpB,QAAA,CAAAkmB,IAAA,CAAA4D,WAAA,CAAAnW,CAAA,QAAA9J,CAAA,EAAA+X,CAAA,WAAAA,CAAA,EAAA0F,mBAAA,SAAAA,CAAA,yBAAA7T,SAAA,CAAAke,SAAA,SAAAhe,CAAA,CAAAF,SAAA,CAAAke,SAAA,IAAAC,MAAA,SAAAje,CAAA,GAAAF,SAAA,CAAAmR,QAAA,CAAAgN,MAAA,qBAAAhQ,CAAA,qBAAA4F,oBAAA,SAAAA,CAAA,SAAA9T,MAAA,CAAAkB,KAAA,CAAAlB,MAAA,CAAA+R,UAAA,EAAA/R,MAAA,CAAAoB,MAAA,CAAApB,MAAA,CAAAgS,WAAA,EAAAgC,YAAA,SAAAA,CAAA,MAAA/T,CAAA,CAAAiO,CAAA,CAAAnO,SAAA,CAAAK,SAAA,CAAAsC,WAAA,GAAAvM,CAAA,CAAA4J,SAAA,CAAAoe,KAAA,CAAApP,CAAA,CAAAhP,SAAA,CAAA0X,QAAA,CAAA/U,WAAA,GAAAzC,CAAA,IAAAiO,CAAA,CAAAjgB,OAAA,qCAAAigB,CAAA,CAAAjgB,OAAA,qBAAAigB,CAAA,CAAAjgB,OAAA,yBAAAigB,CAAA,CAAAjgB,OAAA,qBAAAigB,CAAA,CAAAjgB,OAAA,eAAAigB,CAAA,CAAAjgB,OAAA,kBAAAigB,CAAA,CAAAjgB,OAAA,0BAAA8S,CAAA,IAAAA,CAAA,kBAAA7T,MAAA,IAAA6S,SAAA,CAAA6X,cAAA,IAAA7X,SAAA,CAAA8X,gBAAA,CAAA9W,CAAA,oBAAAd,CAAA,cAAAA,CAAA,UAAAA,CAAA,YAAAA,CAAA,iCAAA9J,CAAA,KAAAA,CAAA,CAAAA,CAAA,CAAAuM,WAAA,MAAAvM,CAAA,CAAAlI,OAAA,qBAAAgS,CAAA,oBAAAA,CAAA,gBAAA9J,CAAA,CAAAlI,OAAA,qBAAAgS,CAAA,cAAAA,CAAA,gBAAA9J,CAAA,CAAAlI,OAAA,iBAAAgS,CAAA,UAAAA,CAAA,iBAAA9J,CAAA,CAAAlI,OAAA,aAAAkI,CAAA,CAAAlI,OAAA,cAAAkI,CAAA,CAAAlI,OAAA,mBAAAgS,CAAA,oBAAA8O,CAAA,CAAA9gB,OAAA,qBAAAgS,CAAA,oBAAAA,CAAA,MAAA8O,CAAA,CAAA9gB,OAAA,cAAA8gB,CAAA,CAAA9gB,OAAA,gBAAA8gB,CAAA,CAAA9gB,OAAA,qBAAAgS,CAAA,cAAAA,CAAA,MAAA8O,CAAA,CAAA9gB,OAAA,YAAA8gB,CAAA,CAAA9gB,OAAA,aAAA8gB,CAAA,CAAA9gB,OAAA,aAAA8gB,CAAA,CAAA9gB,OAAA,qBAAAgS,CAAA,UAAAA,CAAA,MAAA8O,CAAA,CAAA9gB,OAAA,aAAA8gB,CAAA,CAAA9gB,OAAA,cAAA8gB,CAAA,CAAA9gB,OAAA,mBAAAgS,CAAA,sBAAAF,SAAA,CAAA2W,OAAA,cAAAzW,CAAA,oBAAAA,CAAA,EAAAiU,iBAAA,SAAAA,CAAA,MAAAjU,CAAA,CAAAiO,CAAA,CAAAnO,SAAA,CAAAK,SAAA,CAAAsC,WAAA,GAAAvM,CAAA,CAAA4J,SAAA,CAAAqe,UAAA,IAAAne,CAAA,IAAAiO,CAAA,CAAAjgB,OAAA,yBAAAigB,CAAA,CAAAjgB,OAAA,cAAAigB,CAAA,CAAAjgB,OAAA,mBAAAigB,CAAA,CAAAjgB,OAAA,uBAAAigB,CAAA,CAAAjgB,OAAA,uBAAAigB,CAAA,CAAAjgB,OAAA,oDAAAgS,CAAA,aAAAA,CAAA,YAAAA,CAAA,gBAAA9J,CAAA,cAAA4Y,CAAA,CAAAsP,IAAA,CAAArgB,QAAA,GAAA7P,MAAA,SAAA4gB,CAAA,aAAA9O,CAAA,cAAAA,CAAA,YAAAA,CAAA,kBAAA8O,CAAA,wBAAA9O,CAAA,YAAAA,CAAA,kBAAA8O,CAAA,aAAA9O,CAAA,YAAAA,CAAA,YAAAA,CAAA,cAAAc,CAAA,oBAAA2T,CAAA,MAAAA,CAAA,CAAA4J,QAAA,GAAAvd,CAAA,UAAAxD,CAAA,EAAAwD,CAAA,YAAAA,CAAA,cAAAd,CAAA,YAAAA,CAAA,EAAAmT,iBAAA,SAAAA,CAAA,MAAAnT,CAAA,CAAA3T,QAAA,CAAAkU,aAAA,kBAAAP,CAAA,CAAAiY,UAAA,EAAAjY,CAAA,CAAAiY,UAAA,QAAA3E,gBAAA,SAAAA,CAAA,WAAAH,iBAAA,gBAAAnT,CAAA,CAAAiO,CAAA,CAAA5hB,QAAA,CAAAkU,aAAA,eAAAP,CAAA,CAAAiO,CAAA,CAAAgK,UAAA,GAAAhK,CAAA,CAAAgK,UAAA,WAAAhK,CAAA,CAAAgK,UAAA,8BAAA/hB,CAAA,EAAA8J,CAAA,YAAA/S,MAAA,CAAAqxB,qBAAA,IAAAte,CAAA,EAAAqW,IAAA,SAAAA,CAAA,wCAAAvW,SAAA,CAAAye,OAAA,eAAAze,SAAA,CAAAye,OAAA,YAAAC,IAAA,CAAA1e,SAAA,CAAAK,SAAA,GAAAmU,kBAAA,SAAAA,CAAA,4BAAArnB,MAAA,CAAAwxB,SAAA,EAAAlK,oBAAA,SAAAA,CAAA,SAAAkK,SAAA,CAAAC,qBAAA,WAAAC,eAAA,SAAAA,CAAA,MAAA3e,CAAA,CAAA3T,QAAA,CAAAkU,aAAA,QAAAP,CAAA,CAAA4e,YAAA,WAAAvvB,OAAA,CAAA+e,cAAA,EAAA/hB,QAAA,CAAAkmB,IAAA,CAAAiD,WAAA,CAAAxV,CAAA,GAAAwU,qBAAA,SAAAA,CAAAxU,CAAA,MAAAiO,CAAA,oBAAAhhB,MAAA,CAAA4xB,gBAAA,UAAA5Q,CAAA,EAAAjO,CAAA,CAAAiO,CAAA,OAAA/X,CAAA,MAAA7G,OAAA,CAAA+e,cAAA,MAAAuQ,eAAA,OAAA7P,CAAA,EAAAgQ,OAAA,qBAAAhe,CAAA,EAAAie,iBAAA,UAAAC,IAAA,UAAAP,SAAA,CAAAQ,QAAA,MAAA5vB,OAAA,CAAAgf,OAAA,CAAAnY,CAAA,oBAAA4Y,CAAA,CAAAhO,CAAA,MAAA4Y,cAAA,SAAAA,CAAA,MAAA1Z,CAAA,CAAA3T,QAAA,CAAAkU,aAAA,WAAA0N,CAAA,UAAAA,CAAA,CAAAjO,CAAA,CAAAiY,UAAA,WAAAjY,CAAA,CAAAiY,UAAA,6BAAA/hB,CAAA,UAAA+X,CAAA,GAAAA,CAAA,OAAAA,CAAA,EAAA5I,IAAA,SAAAA,CAAArF,CAAA,CAAAiO,CAAA,CAAA/X,CAAA,YAAA8J,CAAA,SAAA0O,aAAA,EAAA1O,CAAA,CAAA/R,OAAA,QAAAygB,aAAA,CAAA1O,CAAA,CAAA/R,OAAA,CAAAggB,CAAA,CAAA/X,CAAA,UAAA8J,CAAA,CAAA9R,MAAA,IAAA8R,CAAA,CAAA9R,MAAA,UAAA4gB,CAAA,GAAAhO,CAAA,CAAAd,CAAA,CAAA9R,MAAA,CAAA4gB,CAAA,CAAAhO,CAAA,CAAAgO,CAAA,WAAAb,CAAA,CAAAte,IAAA,CAAAuG,CAAA,CAAA8J,CAAA,CAAA8O,CAAA,EAAAA,CAAA,CAAA9O,CAAA,uBAAAyU,CAAA,IAAAzU,CAAA,IAAAA,CAAA,CAAAkf,cAAA,CAAAzK,CAAA,QAAAxG,CAAA,CAAAte,IAAA,CAAAuG,CAAA,CAAA8J,CAAA,CAAAyU,CAAA,EAAAA,CAAA,CAAAzU,CAAA,UAAAlG,GAAA,SAAAA,CAAAkG,CAAA,CAAAiO,CAAA,CAAA/X,CAAA,MAAA4Y,CAAA,iBAAA9O,CAAA,CAAA8O,CAAA,MAAAF,SAAA,EAAA5O,CAAA,CAAAlG,GAAA,QAAA8U,SAAA,CAAA5O,CAAA,CAAAlG,GAAA,CAAAmU,CAAA,CAAA/X,CAAA,QAAAmP,IAAA,CAAArF,CAAA,UAAAA,CAAA,CAAAc,CAAA,CAAA2T,CAAA,EAAA3F,CAAA,CAAAA,CAAA,CAAA5gB,MAAA,EAAA+f,CAAA,CAAAte,IAAA,CAAAuG,CAAA,CAAA8J,CAAA,CAAAc,CAAA,CAAA2T,CAAA,IAAA3F,CAAA,GAAAqQ,MAAA,SAAAA,CAAAnf,CAAA,CAAAiO,CAAA,EAAAjO,CAAA,EAAAA,CAAA,eAAAA,CAAA,IAAAA,CAAA,eAAAA,CAAA,KAAAiO,CAAA,EAAAA,CAAA,eAAAA,CAAA,IAAAA,CAAA,eAAAA,CAAA,SAAA/X,CAAA,kBAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,YAAAA,CAAA,QAAAA,CAAA,IAAAA,CAAA,QAAAA,CAAA,MAAAkpB,WAAA,SAAAA,CAAApf,CAAA,CAAAiO,CAAA,EAAAjO,CAAA,EAAAA,CAAA,eAAAA,CAAA,IAAAA,CAAA,eAAAA,CAAA,KAAAiO,CAAA,EAAAA,CAAA,eAAAA,CAAA,IAAAA,CAAA,eAAAA,CAAA,SAAA/X,CAAA,kBAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,KAAAA,CAAA,SAAAA,CAAA,WAAAA,CAAA,KAAA8J,CAAA,IAAAiO,CAAA,IAAAjO,CAAA,IAAAiO,CAAA,IAAAjO,CAAA,IAAAiO,CAAA,IAAAjO,CAAA,IAAAiO,CAAA,IAAA/X,CAAA,YAAAA,CAAA,QAAAA,CAAA,IAAAA,CAAA,QAAAA,CAAA,MAAAmpB,OAAA,SAAAA,CAAArf,CAAA,CAAAiO,CAAA,SAAAA,CAAA,UAAAA,CAAA,EAAAjO,CAAA,IAAAA,CAAA,QAAAiO,CAAA,EAAAjO,CAAA,KAAAiO,CAAA,CAAAjO,CAAA,SAAAiO,CAAA,CAAAjO,CAAA,KAAAiO,CAAA,CAAAjO,CAAA,SAAAiO,CAAA,GAAAA,CAAA,MAAAjO,CAAA,KAAAiO,CAAA,CAAAjO,CAAA,SAAAiO,CAAA,CAAAjO,CAAA,KAAAiO,CAAA,CAAAjO,CAAA,SAAAiO,CAAA,IAAAqR,YAAA,SAAAA,CAAAtf,CAAA,CAAAiO,CAAA,SAAAA,CAAA,SAAAA,CAAA,CAAAjO,CAAA,IAAAiO,CAAA,EAAAjO,CAAA,KAAAiO,CAAA,CAAAjO,CAAA,SAAAiO,CAAA,CAAAjO,CAAA,KAAAiO,CAAA,GAAAjO,CAAA,KAAAiO,CAAA,QAAAsR,MAAA,SAAAA,CAAAvf,CAAA,CAAAiO,CAAA,SAAAjO,CAAA,IAAAiO,CAAA,IAAAjO,CAAA,IAAAiO,CAAA,MAAAuR,OAAA,SAAAA,CAAAxf,CAAA,SAAAA,CAAA,MAAAuf,MAAA,CAAAvf,CAAA,IAAAA,CAAA,UAAAA,CAAA,MAAAof,WAAA,CAAApf,CAAA,0BAAAA,CAAA,MAAAuf,MAAA,CAAAvf,CAAA,IAAAA,CAAA,UAAAA,CAAA,MAAAof,WAAA,CAAApf,CAAA,yBAAAA,CAAA,MAAAuf,MAAA,CAAAvf,CAAA,IAAAA,CAAA,WAAA4Q,UAAA,SAAAA,CAAA5Q,CAAA,CAAAiO,CAAA,EACAjO,CAAA,CAAAA,CAAA,KAAAiO,CAAA,CAAAA,CAAA,YAAA/X,CAAA,CAAA8J,CAAA,CAAA9R,MAAA,IAAA4gB,CAAA,CAAA9O,CAAA,CAAA9R,MAAA,CAAAgI,CAAA,CAAA4K,CAAA,IAAAmN,CAAA,EAAAwG,CAAA,IAAAxG,CAAA,EAAA3Q,CAAA,OAAApG,CAAA,OAAAyd,CAAA,wBAAAzT,CAAA,wBAAA2T,CAAA,GAAAA,CAAA,CAAA/F,CAAA,CAAA+F,CAAA,KAAAvX,CAAA,MAAA0C,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,SAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,aAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,cAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,aAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,OAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,aAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,cAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,UAAA3d,CAAA,MAAA8I,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,UAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,cAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,eAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,cAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,SAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,aAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,eAAA7U,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,WAAAvX,CAAA,MAAA8hB,WAAA,CAAA9hB,CAAA,CAAAqX,CAAA,EAAArX,CAAA,MAAA+hB,OAAA,CAAA/hB,CAAA,KAAAA,CAAA,MAAA8hB,WAAA,CAAA9hB,CAAA,CAAA4D,CAAA,EAAAJ,CAAA,MAAAye,MAAA,CAAAze,CAAA,CAAAxD,CAAA,EAAAwD,CAAA,MAAAue,OAAA,CAAAve,CAAA,KAAAA,CAAA,MAAAqe,MAAA,CAAAre,CAAA,CAAA2T,CAAA,EAAA3T,CAAA,MAAAqe,MAAA,MAAAC,WAAA,CAAAte,CAAA,wBAAA5J,CAAA,MAAAkoB,WAAA,CAAAloB,CAAA,CAAAgK,CAAA,EAAAhK,CAAA,MAAAmoB,OAAA,CAAAnoB,CAAA,KAAAA,CAAA,MAAAkoB,WAAA,CAAAloB,CAAA,CAAAyd,CAAA,EAAAF,CAAA,MAAA8K,MAAA,CAAA9K,CAAA,CAAAvd,CAAA,EAAAud,CAAA,MAAA4K,OAAA,CAAA5K,CAAA,KAAAA,CAAA,MAAA0K,MAAA,CAAA1K,CAAA,CAAA3T,CAAA,EAAA2T,CAAA,MAAA0K,MAAA,MAAAC,WAAA,CAAA3K,CAAA,8BAAAnX,CAAA,OAAApG,CAAA,OAAAhB,CAAA,UAAAgB,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,mBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,mBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,mBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,mBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,mBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,MAAAooB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,gBAAA3d,CAAA,MAAAqoB,MAAA,CAAAroB,CAAA,IAAA8I,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,MAAA3d,CAAA,MAAAkoB,WAAA,CAAAloB,CAAA,CAAAgK,CAAA,EAAAhK,CAAA,MAAAmoB,OAAA,CAAAnoB,CAAA,KAAAA,CAAA,MAAAkoB,WAAA,CAAAloB,CAAA,CAAAyd,CAAA,EAAAF,CAAA,MAAA8K,MAAA,CAAA9K,CAAA,CAAAvd,CAAA,SAAAoG,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,iBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,MAAAgiB,YAAA,IAAAtf,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,gBAAAvX,CAAA,MAAAiiB,MAAA,CAAAjiB,CAAA,IAAA0C,CAAA,CAAAyf,UAAA,CAAA5K,CAAA,IAAAvX,CAAA,MAAA8hB,WAAA,CAAA9hB,CAAA,CAAAqX,CAAA,EAAArX,CAAA,MAAA+hB,OAAA,CAAA/hB,CAAA,KAAAA,CAAA,MAAA8hB,WAAA,CAAA9hB,CAAA,CAAA4D,CAAA,EAAAJ,CAAA,MAAAye,MAAA,CAAAze,CAAA,CAAAxD,CAAA,SAAAwD,CAAA,MAAAye,MAAA,CAAAze,CAAA,IAAAd,CAAA,CAAA9R,MAAA,GAAAumB,CAAA,MAAA8K,MAAA,CAAA9K,CAAA,IAAAzU,CAAA,CAAA9R,MAAA,GAAA4S,CAAA,MAAAqe,MAAA,CAAAre,CAAA,CAAA2T,CAAA,EAAAA,CAAA,MAAA0K,MAAA,CAAA1K,CAAA,CAAA3T,CAAA,EAAAA,CAAA,MAAA0e,OAAA,CAAA1e,CAAA,EAAA2T,CAAA,MAAA+K,OAAA,CAAA/K,CAAA,EAAA3T,CAAA,MAAAqe,MAAA,CAAAre,CAAA,CAAA2T,CAAA,EAAAA,CAAA,MAAA0K,MAAA,CAAA1K,CAAA,CAAA3T,CAAA,eAAAA,CAAA,SAAA/C,QAAA,MAAA2hB,KAAA,kBAAA5e,CAAA,SAAA/C,QAAA,MAAA2hB,KAAA,kBAAAjL,CAAA,SAAA1W,QAAA,MAAA2hB,KAAA,kBAAAjL,CAAA,SAAA1W,QAAA,MAAA2hB,KAAA,OAAA1f,CAAA,CAAAid,OAAA,SAAAjd,CAAA,GCgBA7R,MAAA,iDACA,SACA,SACA,OACA,WACA,cACA,aACA,cACA,WACA,sCACA,sCACA,sCACA,mDACA,UAAAC,CAAA,CAAAwB,CAAA,CAAAH,EAAA,CAAAoH,GAAA,CAAA6K,aAAA,CAAA4D,KAAA,CAAAqa,MAAA,CAAAC,IAAA,CAAAtuB,SAAA,CAAA2D,SAAA,CAAAO,SAAA,CAAAqqB,YAAA,EACA,kBAMA,CAAAle,MAAA,CAAAD,aAAA,oCAOA5I,SAAA,EACAL,EAAA,cACA,EAOAqnB,YAAA,EACAxa,KAAA,qBACAsa,IAAA,QACAG,WAAA,SACA3a,OAAA,WACA4a,MAAA,UACAC,OAAA,UACA,EAOAC,gBAAA,EACAxxB,KAAA,GACAyxB,YAAA,IACAC,kBAAA,IACAzc,OAAA,IACA,EAOA3K,WAAA,EACA,CACA5C,SAAA,CAAA8pB,gBAAA,CAAAxxB,KAAA,CACAuK,OAAA,CAAAxJ,EAAA,gCACAyJ,IAAA,QACA,EACA,CACA9C,SAAA,CAAA8pB,gBAAA,CAAAC,YAAA,CACAlnB,OAAA,CAAAxJ,EAAA,CACA,8HACA,EACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,CAAA8pB,gBAAA,CAAAE,kBAAA,CACAnnB,OAAA,CAAAxJ,EAAA,CACA,8HACA,EACAyJ,IAAA,UACA,EACA,CACA9C,SAAA,CAAA8pB,gBAAA,CAAAvc,OAAA,CACA1K,OAAA,CAAAxJ,EAAA,2BACAyJ,IAAA,UACA,EACA,CAQAC,SAAA,EAEA,CACAC,KAAA,CAAA3J,EAAA,gBACAsG,MAAA,CAAAtG,EAAA,iCACA4wB,gBAAA,CAAA5wB,EAAA,gBACA6wB,eAAA,CAAA7wB,EAAA,gBACA8wB,kBAAA,CAAA9wB,EAAA,wBACA+wB,kBAAA,CAAA/wB,EAAA,kCACAgxB,iBAAA,CAAAhxB,EAAA,uBACAixB,gBAAA,CAAAjxB,EAAA,qBACA,EACA,CAUA,gBAAAkxB,mBAAAvwB,MAAA,OACA,CAAAsJ,UAAA,CAAApI,SAAA,CAAAlB,MAAA,CAAA0I,SAAA,EACAa,MAAA,CAAA1E,SAAA,CAAAkE,SAAA,CAAAO,UAAA,CAAAvE,KAAA,EAEA,OAKA7H,MAAAqJ,IAAA,EAQA,SAAAiqB,YAAAlyB,KAAA,EACAsxB,MAAA,CAAA7rB,IAAA,EACAS,GAAA,SACAvC,KAAA,IAAA3D,KACA,GACAiT,MAAA,CAAAjT,KAAA,CAAAA,KAAA,CACA,CAEA,SAAAmyB,cAAAjsB,GAAA,EACA,SAAA8E,UAAA,CAAAjB,EAAA,IAAAqnB,YAAA,CAAAlrB,GAAA,GACA,IAbA,CAAAksB,cAAA,CAJAC,SAAA,SACAC,eAAA,SACAC,cAAA,IACAC,cAAA,IAEA,MAAAlB,MAAA,IAcA1a,KAAA,CAAAwa,YAAA,CAAAxa,KAAA,EACAnU,IAAA,CAAAua,OAAA,GACAoV,cAAA,CAAApV,OAAA,CACAE,OAAA,CAAAC,GAAA,EACAiV,cAAA,CAAAhV,OAAA,CAAA+U,aAAA,UAAA1vB,IAAA,CAAAkB,KAAA,GACA0uB,SAAA,CAAA1uB,KACA,GACAyuB,cAAA,CAAAhV,OAAA,CAAA+U,aAAA,iBAAA1vB,IAAA,CAAAkB,KAAA,GACA2uB,eAAA,CAAA3uB,KACA,GACA,EACA,EACAiR,KAAA,CAAAsd,WAAA,EACAzvB,IAAA,KACA,IAAAya,OAAA,CAAAuV,OAAA,GACA,IAAAtB,YAAA,GAAAhR,GAAA,EAAArW,MAAA,CAAA4M,OAAA,IACA,MAAAzQ,OAAA,IACAA,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,MAAAvnB,MAAA,EAAA4oB,WAAA,GACAzsB,OAAA,CAAAmrB,YAAA,CAAA1a,OAAA,EAAAA,OAAA,CACA+b,OAAA,CAAAxsB,OAAA,CACA,EACA,EACA,EACAxD,IAAA,CAAAwD,OAAA,QACA,CAAA0sB,eAAA,IACAC,iBAAA,CAAA3sB,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,EA0BA,MAxBA,CAAAgB,SAAA,GACAA,SAAA,CAAAnB,IAAA,QACAqB,cAAA,KAGAC,cAAA,CAAAF,eAAA,GAAAM,iBAAA,YAAAN,eAAA,CAKArsB,OAAA,CAAAmrB,YAAA,CAAAF,IAAA,EAAAmB,SAAA,CACApsB,OAAA,CAAAmrB,YAAA,CAAAG,OAAA,EAAAiB,cAAA,GAAAD,cAAA,CAEAH,cAAA,GACAG,cAAA,EACAI,eAAA,CAAAltB,IAAA,CAAA2sB,cAAA,CAAAnV,OAAA,CAAAkV,aAAA,SAAAE,SAAA,GAEAG,cAAA,EACAG,eAAA,CAAAltB,IAAA,CACA2sB,cAAA,CAAAnV,OAAA,CAAAkV,aAAA,gBAAAS,iBAAA,CACA,GAIA1V,OAAA,CAAAC,GAAA,CAAAwV,eAAA,EACA/d,KAAA,CAAAsd,WAAA,EACAzvB,IAAA,KAAAwD,OAAA,CACA,GACA2O,KAAA,CAAAsd,WAAA,EACAzvB,IAAA,CAAAwD,OAAA,GACAA,OAAA,CAAAA,OAAA,KACAqrB,MAAA,CAAA9xB,MAAA,GACAyG,OAAA,CAAAmrB,YAAA,CAAAE,MAAA,EAAAA,MAAA,CAAA9xB,MAAA,CACAyG,OAAA,CAAAmrB,YAAA,CAAA1a,OAAA,GAAAzQ,OAAA,CAAAmrB,YAAA,CAAA1a,OAAA,OAAAxX,MAAA,CAAAoyB,MAAA,QAGA,CAAAplB,OAAA,MAAAC,UAAA,CAAAlG,OAAA,EACAoB,MAAA,MAAA4E,WAAA,CAAAhG,OAAA,EACAgC,IAAA,CAAAZ,MAAA,CAAA6E,OAAA,CAAAjG,OAAA,CACA,EACA,EAMA,IAAAgF,OAAA,EACA,OAAAA,MACA,EAOAkB,WAAAlG,OAAA,OACA,CAAA4sB,OAAA,CAAA3xB,CAAA,CAAA+E,OAAA,CAAAmrB,YAAA,CAAA1a,OAAA,GACAtL,GAAA,QACA0nB,IAAA,UACAnvB,KAAA,GACAuI,OAAA,EACAylB,gBAAA,EACApnB,OAAA,CAAAU,MAAA,CAAA0mB,gBAAA,CACAhuB,KAAA,CAAAsC,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,CACA,EACAQ,kBAAA,EACAtnB,OAAA,CAAAU,MAAA,CAAA4mB,kBAAA,CACAluB,KAAA,CAAA5C,EAAA,mBAAAG,CAAA,CAAAmM,IAAA,CAAAwlB,OAAA,EAAAA,OAAA,CAAA5Q,IAAA,OACA,EACA6P,kBAAA,EACAvnB,OAAA,CAAAU,MAAA,CAAA6mB,kBAAA,CACAnuB,KAAA,CAAAsC,OAAA,CAAAmrB,YAAA,CAAAG,OAAA,EAAAxwB,EAAA,QAAAA,EAAA,MACA,CACA,EAkBA,MAhBA,CAAAkF,OAAA,CAAAmrB,YAAA,CAAAE,MAAA,IACAplB,OAAA,CAAA6lB,iBAAA,EACAxnB,OAAA,CAAAU,MAAA,CAAA8mB,iBAAA,CACApuB,KAAA,CAAAsC,OAAA,CAAAmrB,YAAA,CAAAE,MAAA,CACA,EAEApwB,CAAA,CAAA3B,OAAA,CAAA0G,OAAA,CAAAmrB,YAAA,CAAA1a,OAAA,GAAAA,OAAA,CAAAxL,GAAA,IACA,UAAAwL,OAAA,CAAAxQ,GAAA,GACAgG,OAAA,oBAAAhB,GAAA,GACAX,OAAA,CAAAU,MAAA,CAAA+mB,gBAAA,CACAruB,KAAA,CAAA+S,OAAA,CAAA/S,KACA,EAEA,IAGAuI,OACA,EAOAD,YAAAhG,OAAA,EACA,IAAAc,UAAA,CAKAA,UAAA,CAHAd,OAAA,EAAAA,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,aAAAprB,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,EAEA,UAAAprB,OAAA,CAAAmrB,YAAA,CAAAF,IAAA,EACAM,gBAAA,CAAAC,YAAA,CACAxrB,OAAA,CAAAmrB,YAAA,CAAAG,OAAA,EACAC,gBAAA,CAAAE,kBAAA,CAEAF,gBAAA,CAAAvc,OAAA,CANAuc,gBAAA,CAAAxxB,KAAA,CASA,MAAAqH,MAAA,CAAAP,SAAA,CAAAC,UAAA,CAAAuD,WAAA,EAKA,MAJA,CAAAjD,MAAA,CAAA0C,EAAA,CAAAiB,UAAA,CAAAjB,EAAA,CACA1C,MAAA,CAAAqD,KAAA,CAAAO,MAAA,CAAAP,KAAA,CACArD,MAAA,CAAA1H,QAAA,CAAA4K,OAAA,CAAA0mB,MAAA,CAAA5pB,MAAA,CAAA1H,QAAA,CAAA4K,OAAA,CAAAtE,OAAA,EAAAA,OAAA,CAAAmrB,YAAA,CAAAC,WAAA,GAEAhqB,MACA,CACA,CACA,CACA,GCtTA5H,MAAA,oFAAAS,EAAA,SAAAA,EAAA,CAAAC,QAAA,UAAAC,UAAA,CAAAC,MAAA,CAAAC,OAAA,CAAAC,QAAA,CAAAR,IAAA,EAKA,SAAAsV,SAAAhV,MAAA,CAAAN,IAAA,EAEA,IAAAuV,MAAA,CAAA5U,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAgBA,MAfA,CAAAA,MAAA,mCACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAixB,MAAA,EAAAtwB,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAA8H,QAAA,CAAAhe,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,OACA0U,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAixB,MAAA,EAAAtwB,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAA+H,QAAA,CAAAje,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,mCACAF,MAAA,CAAAJ,OAAA,CAAAqD,KAAA,EAAA2R,MAAA,CAAA5U,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,IACAW,MAAA,CAAAL,MAAA,EAAAA,MAAA,CAAAsD,KAAA,CAAA2R,MAAA,qBAAA5U,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,EAAAW,IAAA,IAAAjB,IAAA,CAAAA,IAAA,GAAAW,MAAA,EACAE,MAAA,EAAAE,gBAAA,CAAAwU,MAAA,EACAA,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAixB,MAAA,EAAAtwB,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAgI,QAAA,CAAAle,IAAA,EAAAA,IAAA,CAAAA,IAAA,IACAuV,MAAA,MAAAA,MAAA,IAAA1U,MAAA,EAAA0U,MAAA,EACA1U,MAAA,4DACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,4BAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,iCAAAM,OAAA,IACA,4BACAC,MACA,CACA,SAAAmd,SAAA1d,MAAA,CAAAN,IAAA,EAGA,eACA,CAEA,SAAAie,SAAA3d,MAAA,CAAAN,IAAA,EAEA,IAAAW,MAAA,CAAAC,OAAA,CAAAC,MAAA,IAIA,MAHA,CAAAA,MAAA,cACAE,gBAAA,EAAAJ,MAAA,CAAAJ,OAAA,CAAAS,EAAA,EAAAV,MAAA,EAAAA,MAAA,CAAAU,EAAA,CAAAJ,OAAA,EAAAK,IAAA,IAAAjB,IAAA,CAAAA,IAAA,EAAAW,MAAA,CAAAA,MAAA,CAAAO,IAAA,CAAAZ,MAAA,uCAAAM,OAAA,EAAAE,aAAA,CAAAI,IAAA,CAAAZ,MAAA,4CAAAM,OAAA,IACA,KACAC,MACA,CAEA,SAAAqd,SAAA5d,MAAA,CAAAN,IAAA,EAGA,6CACA,CA3CA,KAAAS,YAAA,gBACAF,OAAA,MAAAG,KAAA,CAAAH,OAAA,CAAAF,UAAA,CAAAE,OAAA,EAAAP,IAAA,CAAAA,IAAA,KACA,IAAAuV,MAAA,CAAAzU,aAAA,CAAAP,OAAA,CAAAO,aAAA,CAAAC,gBAAA,MAAAA,gBAAA,CAAAkV,IAAA,MAAAK,YAAA,kBA2CA,CAAAf,MAAA,CAAAhV,OAAA,OAAAW,IAAA,CAAAZ,MAAA,CAAAA,MAAA,EAAAA,MAAA,CAAAsD,KAAA,EAAA3C,IAAA,IAAA+U,OAAA,CAAAC,IAAA,CAAAM,IAAA,CAAAH,EAAA,CAAAH,IAAA,CAAAC,OAAA,GAAAZ,QAAA,CAAAtV,IAAA,EAAAA,IAAA,CAAAA,IAAA,GACAuV,MAAA,MAAAA,MAAA,CAAAA,MAAA,CACA,EACA,KCjCA7V,MAAA,2HACAC,CAAA,CACAwB,CAAA,CACAH,EAAA,CACA+L,OAAA,CACAtL,UAAA,CACAlB,OAAA,CACA,CACA,aAOA,MAAAie,QAAA,qBAMA,OAKAwU,UAAAC,KAAA,EAMA,SAAAC,uBAAA5wB,WAAA,EACA,OAAAA,WAAA,CAAA+I,GAAA,CAAAqM,UAAA,GACA,MAAA3N,MAAA,IAMA,MALA,CAAA5I,CAAA,CAAA3B,OAAA,CAAAyzB,KAAA,CAAAE,KAAA,GACAppB,MAAA,CAAAopB,KAAA,CAAAnpB,EAAA,EAAAmpB,KAAA,CAAAC,SAAA,CACAD,KAAA,CAAAC,SAAA,CAAA1b,UAAA,CAAAyb,KAAA,CAAAnpB,EAAA,EAAA0N,UAAA,EACAA,UAAA,CAAAyb,KAAA,CAAAnpB,EAAA,CACA,GACAD,MACA,EACA,CAGA,SAAAspB,WAAArzB,IAAA,MAAAszB,eAAA,GAAAC,SAAA,CAAA9zB,MAAA,WAAA8zB,SAAA,IAAAA,SAAA,QAAAC,aAAA,GAAAD,SAAA,CAAA9zB,MAAA,WAAA8zB,SAAA,IAAAA,SAAA,SACA,MAAAlxB,IAAA,CAAAD,MAAA,CAAAC,IAAA,CAAArC,IAAA,KACA,IAAA+J,MAAA,IAAA1H,IAAA,CAAA6f,IAAA,CAAAoR,eAAA,IAAAE,aAAA,GAeA,MAdA,CAAAxzB,IAAA,CAAAR,OAAA,CAAAH,IAAA,GACA,IAAAo0B,GAAA,GACApxB,IAAA,CAAA7C,OAAA,CAAA2G,GAAA,GACA,EAAAstB,GAAA,GACA1pB,MAAA,EAAAupB,eAAA,EAEAvpB,MAAA,EACA,iBAAA1K,IAAA,CAAA8G,GAAA,GAAA9G,IAAA,CAAA8G,GAAA,EAAAutB,QAAA,CAAAJ,eAAA,EACA,IAAAj0B,IAAA,CAAA8G,GAAA,KACA9G,IAAA,CAAA8G,GAAA,EACAstB,GAAA,EACA,GACA1pB,MAAA,EAAAypB,aACA,GACAzpB,MACA,CAGA,SAAA4pB,aAAAC,OAAA,CAAAC,QAAA,CAAAppB,IAAA,OACA,CAAAqpB,IAAA,KAAAC,IAAA,EAAAH,OAAA,GAAAnpB,IAAA,CAAAA,IAAA,GACArC,GAAA,CAAA4rB,GAAA,CAAAC,eAAA,CAAAH,IAAA,EACA,IAAAI,IAAA,CAAAv0B,CAAA,YACAu0B,IAAA,CAAAC,IAAA,YAAAN,QAAA,EACAM,IAAA,QAAA/rB,GAAA,EACAgY,GAAA,IACApD,KAAA,GAEAgX,GAAA,CAAAI,eAAA,CAAAhsB,GAAA,EAEA8rB,IAAA,KACA,MAnDA,CAAA3qB,UAAA,CAAA5J,CAAA,CAAA6e,QAAA,EACAjW,SAAA,CAAAgB,UAAA,CAAAvJ,IAAA,qCACAq0B,UAAA,CAAA9zB,OAAA,CAAA2e,IAAA,+BAAA3W,SAAA,EAmDA9G,UAAA,CAAA5C,KAAA,GAEAkO,OAAA,EACA3E,GAAA,CAAAisB,UAAA,CACAr0B,IAAA,EAAAs0B,IAAA,CAAAnvB,MAAA,CAAAovB,gBAAA,EACAvhB,OAAA,GACA,GACAtQ,IAAA,CAAA4a,QAAA,GACA,MAAAkX,UAAA,CAAAtB,sBAAA,CAAA5V,QAAA,CAAAtd,IAAA,EACA,IAAAy0B,UAAA,CAAApB,UAAA,CAAAmB,UAAA,EACAb,YAAA,CAAAc,UAAA,CAAAzzB,EAAA,gCACAS,UAAA,CAAA4B,IAAA,EACA,GACAwR,KAAA,MACApT,UAAA,CAAA4B,IAAA,EACA,EACA,CACA,CACA,GClGA3D,MAAA,oDACA,SACA,SACA,OACA,UACA,SACA,eACA,qBACA,cACA,cACA,YACA,sCACA,gDACA,+CACA,2DACA,uDACA,wCACA,eACA,0BACA,UACAC,CAAA,CACAwB,CAAA,CACAH,EAAA,CACAT,OAAA,CACAm0B,MAAA,CACA3nB,OAAA,CACAtL,UAAA,CACAkzB,MAAA,CACA/0B,QAAA,CACAg1B,MAAA,CACA7tB,SAAA,CACA8tB,yBAAA,CACAC,wBAAA,CACAC,cAAA,CACA7d,UAAA,CACA8d,WAAA,CACA,CACA,iBAAAC,SAAA,CA+BAlxB,IAAA,CAAAO,GAAA,CAAA4wB,WAAA,CAEAnxB,IAAA,CAAAG,KAAA,CAAAixB,QAAA,CADApxB,IAAA,CAAAC,GAAA,CAFA,SAAAoxB,aAAAxxB,KAAA,CAAAyxB,MAAA,OACA,CAAA3pB,EAAA,qBAAA2pB,MAAA,GAAAJ,SAAA,GAAApuB,QAAA,CAAAwuB,MAAA,MACAC,MAAA,CAAAH,QAAA,IAAAzpB,EAAA,KACA,OAAAwpB,WAAA,CAAAtxB,KAAA,CAAA0xB,MAAA,EAAAA,MACA,CAQA,SAAAC,gBAAA3xB,KAAA,QACA,KAAAA,KAAA,CACA,QAGAwxB,YAAA,CAAAxxB,KAAA,CACA,CAQA,SAAA4xB,qBAAAC,IAAA,EACA,IAAAhlB,IAAA,CAEA,GAAAtP,CAAA,CAAAu0B,QAAA,CAAAD,IAAA,GACAt0B,CAAA,CAAAw0B,QAAA,CAAAF,IAAA,IACAA,IAAA,CAAAt0B,CAAA,CAAA0F,QAAA,CAAA4uB,IAAA,MAEA,MAAAnP,CAAA,KAAA1Z,IAAA,KAAA6oB,IAAA,EACAhlB,IAAA,CAAAikB,MAAA,CAAAkB,GAAA,CAAAtP,CAAA,CACA,KACA,CAAA7V,IAAA,CAAAikB,MAAA,CAAAmB,EAAA,CAAAJ,IAAA,CAAAK,mBAAA,EAGA,OAAArlB,IAAA,CAAAolB,EAAA,CAAAnB,MAAA,CAAAmB,EAAA,CAAAE,KAAA,IAAA7E,MAAA,CAAA8E,iBAAA,CACA,MA/DA,CAAAxX,QAAA,qBAOAsX,mBAAA,OAOAE,iBAAA,oBAyDA,MALA,CAAAv0B,UAAA,CAAA5C,KAAA,GAKA,CAIAA,MAAA,EAmBA,SAAAiY,YAAA1O,GAAA,CAAA6tB,SAAA,CAAAzrB,OAAA,EACAyrB,SAAA,EAAAA,SAAA,CAAAx2B,MAAA,GACAgC,UAAA,CAAA5C,KAAA,GAEAkO,OAAA,EACA3E,GAAA,CACApI,IAAA,EACAgK,EAAA,CAAAisB,SACA,EACAhhB,MAAA,QACAjC,OAAA,GACA,GACAtQ,IAAA,CAAA4a,QAAA,GACA7b,UAAA,CAAA4B,IAAA,GAEAia,QAAA,EAAAA,QAAA,CAAApI,OAAA,EACA1K,OAAA,EACA5K,QAAA,GAAAsV,OAAA,CAAA1K,OAAA,EAEAmU,KAAA,CAAAuX,SAAA,aAEAt2B,QAAA,GAAAK,KAAA,CACA,GAAAe,EAAA,mCAAA2zB,MAAA,CAAA5c,IAAA,CAAAuF,QAAA,CAAArd,KAAA,IACA,CACAk2B,UAAA,GACA,CACA,CAEA,GACAthB,KAAA,KAAApT,UAAA,CAAA4B,IAAA,IAEA,CAGA,SAAAsG,OAAAssB,SAAA,EACAnf,WAAA,CAAAsf,SAAA,CAAAH,SAAA,CAAAj1B,EAAA,iDACA,MAtDA,CAAAuI,UAAA,CAAA5J,CAAA,CAAA6e,QAAA,EACAjW,SAAA,CAAAgB,UAAA,CAAAvJ,IAAA,qCACA2e,KAAA,CAAApV,UAAA,CAAAkP,IAAA,UACA,IAAA4d,OAAA,CAAA9sB,UAAA,CAAAvJ,IAAA,aACA,CAAAgf,eAAA,CAAAzV,UAAA,CAAAvJ,IAAA,eACA2B,MAAA,CAAAqd,eAAA,CAAAtH,UAAA,EAAAsH,eAAA,CACAsX,kBAAA,CAAA/sB,UAAA,CAAAvJ,IAAA,2BACAu2B,aAAA,CAAAh2B,OAAA,CAAA2e,IAAA,2BAAA3W,SAAA,EACA6tB,SAAA,CAAA71B,OAAA,CAAA2e,IAAA,uBAAA3W,SAAA,EACA8rB,UAAA,CAAA9zB,OAAA,CAAA2e,IAAA,+BAAA3W,SAAA,EACAyC,kBAAA,CAAA6pB,yBAAA,CAAAlzB,MAAA,CAAAkY,OAAA,CAAAzQ,WAAA,MACAotB,iBAAA,CAAA1B,wBAAA,CAAAnzB,MAAA,CAAAkY,OAAA,CAAAyX,WAAA,MAEAmF,KAAA,IACAC,OAAA,IACAzD,KAAA,IA0CAwD,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,WACAoV,IAAA,SACAzU,KAAA,CAAA3J,EAAA,qBACAqO,KAAA,CAAArO,EAAA,YACAoQ,OAAA,EACAuN,KAAA,CAAAuX,SAAA,WACA,CACA,GAGAO,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,UACAoV,IAAA,QACAzU,KAAA,CAAA3J,EAAA,mCACAqO,KAAA,CAAArO,EAAA,2BACAoQ,OAAA,EACA5S,MAAA,CAAAwc,QAAA,CAAAC,IAAA,CAAAsb,aACA,CACA,GAEA50B,MAAA,CAAAg1B,MAAA,EAEAF,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,aACAoV,IAAA,UACAzU,KAAA,CAAA3J,EAAA,eACAqO,KAAA,CAAArO,EAAA,eACAoQ,OAAA,EACA4jB,WAAA,CAAAhC,SAAA,CAAAC,KAAA,CACA,CACA,GAGAqD,kBAAA,EAEAG,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,OACAoV,IAAA,QACAzU,KAAA,CAAA3J,EAAA,wBACAqO,KAAA,CAAArO,EAAA,wBACAoQ,OAAA,EACA5S,MAAA,CAAAwc,QAAA,CAAAC,IAAA,CAAA2b,WACA,CACA,GAIAH,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,UACAoV,IAAA,UACAzU,KAAA,CAAA3J,EAAA,gDACAqO,KAAA,CAAArO,EAAA,WACA61B,UAAA,IACAzlB,OAAA6kB,SAAA,EACArB,MAAA,EACApqB,OAAA,CAAAxJ,EAAA,qEACA81B,UAAA,IACAC,WAAA,IACAC,QAAA,EACArtB,MAAA,CAAAssB,SAAA,CACA,CACA,EACA,CACA,GAIAz3B,MAAA,CAAAyX,IAAA,GAAAzX,MAAA,CAAA6gB,GAAA,EACAoX,KAAA,CAAA/wB,IAAA,EACAsE,EAAA,cACAoV,IAAA,SACAzU,KAAA,CAAA3J,EAAA,SACAqO,KAAA,CAAArO,EAAA,SACAoQ,OAAA,EACA5S,MAAA,CAAAyX,IAAA,CAAAqJ,KAAA,EACA,CACA,GAIAoX,OAAA,CAAAhxB,IAAA,EACAsE,EAAA,UACAoV,IAAA,UACAzU,KAAA,CAAA3J,EAAA,uCACAoQ,OAAApH,EAAA,EACA4qB,MAAA,EACAkC,UAAA,IACAC,WAAA,IACAvsB,OAAA,CAAAxJ,EAAA,2DACAg2B,QAAA,EACArtB,MAAA,EAAAK,EAAA,EACA,CACA,EACA,CACA,GAGAipB,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,eACAqF,KAAA,CAAArO,EAAA,eACA,GAGAW,MAAA,CAAA8U,iBAAA,EACAwc,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,eACAqF,KAAA,CAAArO,EAAA,eACA,GAIAW,MAAA,CAAA6U,eAAA,EACAyc,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,aACAqF,KAAA,CAAArO,EAAA,aACA,GAIAW,MAAA,CAAAoU,kBAAA,EACAkd,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,iBACAqF,KAAA,CAAArO,EAAA,iBACA,GAIAW,MAAA,CAAAkY,OAAA,CAAAyX,WAAA,EAAA3vB,MAAA,CAAAkY,OAAA,CAAAyX,WAAA,CAAA3W,OAAA,GAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,oBACAqF,KAAA,CAAArO,EAAA,gBACAoyB,UAAA/L,CAAA,CAAA4P,GAAA,EACA,OAAAlC,cAAA,CAAAkC,GAAA,CAAA3F,WAAA,CACA,CACA,GAEA3S,KAAA,CAAA7c,EAAA,+DAAAyP,CAAA,OACA,CAAAvH,EAAA,CAAArK,CAAA,CAAA4R,CAAA,CAAA2lB,MAAA,EACAtZ,OAAA,OACA5d,IAAA,mBACAi3B,GAAA,CAAA91B,CAAA,CAAAsX,IAAA,CAAA4d,OAAA,CAAAr2B,IAAA,EAAAgK,EAAA,CAAAA,EAAA,GACAitB,GAAA,EACArC,MAAA,EACAhB,OAAA,CAAA1c,UAAA,CAAAsf,iBAAA,CAAApqB,UAAA,CAAA6qB,GAAA,CAAA3F,WAAA,GACAnS,OAAA,MACA2X,UAAA,IACAC,WAAA,GACA,EAEA,IAIAp1B,MAAA,CAAAkY,OAAA,CAAAvI,MAAA,EAAA3P,MAAA,CAAAkY,OAAA,CAAAvI,MAAA,CAAAqJ,OAAA,EAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,eACAqF,KAAA,CAAArO,EAAA,sBACAoyB,UAAAxvB,KAAA,CAAAqzB,GAAA,EACA,GAAAA,GAAA,CAAA3lB,MAAA,EAAA2lB,GAAA,CAAA3lB,MAAA,CAAAkB,KAAA,EAAAykB,GAAA,CAAA3lB,MAAA,CAAAoB,MAAA,CACA,OAAAukB,GAAA,CAAA3lB,MAAA,CAAAkB,KAAA,KAAAykB,GAAA,CAAA3lB,MAAA,CAAAoB,MAEA,CACA,GAIA/Q,MAAA,CAAAkY,OAAA,CAAAtG,OAAA,EAAA5R,MAAA,CAAAkY,OAAA,CAAAtG,OAAA,CAAAoH,OAAA,GAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,MACAqF,KAAA,CAAArO,EAAA,MACA,GAGAiyB,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,WACAqF,KAAA,CAAArO,EAAA,WACA,IAIAW,MAAA,CAAAkY,OAAA,CAAAzQ,WAAA,EAAAzH,MAAA,CAAAkY,OAAA,CAAAzQ,WAAA,CAAAuR,OAAA,EAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,eACAqF,KAAA,CAAArO,EAAA,iBACAoyB,UAAAxvB,KAAA,EACA,MAAA0D,MAAA,CAAA0D,kBAAA,CAAAkB,WAAA,CAAAtI,KAAA,EACA,OAAA0D,MAAA,CAAA1H,QAAA,EAAA0H,MAAA,CAAA1H,QAAA,CAAA4K,OACA,CACA,GAIA7I,MAAA,CAAAkY,OAAA,CAAApN,SAAA,EAAA9K,MAAA,CAAAkY,OAAA,CAAApN,SAAA,CAAAkO,OAAA,EAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,aACAqF,KAAA,CAAArO,EAAA,cACAoyB,SAAA,CAAAmC,eACA,GAIA5zB,MAAA,CAAAkY,OAAA,CAAAsd,mBAAA,EAAAx1B,MAAA,CAAAkY,OAAA,CAAAsd,mBAAA,CAAAxc,OAAA,EAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,uBACAqF,KAAA,CAAArO,EAAA,wBACAoyB,SAAA,CAAAmC,eACA,GAIA5zB,MAAA,CAAAkY,OAAA,CAAA9J,MAAA,EAAApO,MAAA,CAAAkY,OAAA,CAAA9J,MAAA,CAAA4K,OAAA,EAEAsY,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,UACAqF,KAAA,CAAArO,EAAA,iBACAoyB,SAAA,CAAAmC,eACA,GAIAtC,KAAA,CAAAvtB,IAAA,EACAsE,EAAA,QACAqF,KAAA,CAAArO,EAAA,SACAoyB,SAAA,CAAAoC,oBACA,GAEA7W,KAAA,CACA7c,EAAA,uBAAAL,UAAA,CAAA5C,KAAA,IACAiD,EAAA,mBAAAyP,CAAA,CAAAvR,IAAA,IACAq2B,OAAA,CAAAr2B,IAAA,CACAyB,UAAA,CAAA4B,IAAA,EACA,GACA6yB,SAAA,CACA,CACA9tB,GAAA,CAAAisB,UAAA,CACA/sB,MAAA,EACA2R,KAAA,CAAAjY,EAAA,wCACAo2B,SAAA,CAAAp2B,EAAA,kCACAq2B,OAAA,CAAAr2B,EAAA,WACA,EACAs2B,UAAA,IACAb,KAAA,CACAC,OAAA,CACAzD,KACA,EACAoD,OACA,CACA,CACA,CACA,GCjcA32B,MAAA,mECkBAA,MAAA,6JACAC,CAAA,CACA43B,WAAA,CACA,CACA,aAEA,OACA14B,MAAA,GACA,CACA,GCXAa,MAAA,0CACA83B,aAAA,EACAd,OAAA,EACAe,KAAA,iCACA,CACA,EACAC,oBAAA,EACAhB,OAAA,EACAp3B,KAAA,8CACA,CACA,EACAq4B,UAAA,EACAjB,OAAA,EACAp3B,KAAA,+BACAoY,UAAA,mCACA,CACA,EACAkgB,gBAAA,EACAlB,OAAA,EACAmB,YAAA,wCACA,CACA,EACAC,UAAA,EACApB,OAAA,EACAmB,YAAA,wCACA,CACA,CACA,GC3CA,SAAAxR,CAAA,MAAAC,CAAA,CAAA1oB,QAAA,CAAAyiB,CAAA,eAAA5Y,CAAA,cAAAgB,CAAA,CAAA6d,CAAA,CAAAxU,aAAA,UAAArJ,CAAA,CAAAgC,IAAA,YAAA6b,CAAA,CAAAH,oBAAA,YAAAY,WAAA,CAAAte,CAAA,EAAAA,CAAA,CAAAsvB,UAAA,CAAAtvB,CAAA,CAAAsvB,UAAA,CAAAC,OAAA,CAAA3R,CAAA,CAAA5d,CAAA,CAAAse,WAAA,CAAAT,CAAA,CAAA2R,cAAA,CAAA5R,CAAA,IACA,6oICDA3mB,MAAA,uEACAlB,MCFA,CAAAU,OAAA,EAAAV,MAAA,CAAAU,OAAA,MAAAC,MAAA"} \ No newline at end of file diff --git a/views/js/tools/getConfig.js b/views/js/tools/getConfig.js index 4dc3736..0ab58cd 100644 --- a/views/js/tools/getConfig.js +++ b/views/js/tools/getConfig.js @@ -13,7 +13,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Copyright (c) 2016-2021 (original work) Open Assessment Technologies SA ; + * Copyright (c) 2016-2024 (original work) Open Assessment Technologies SA ; */ define(['lodash'], function(_) { 'use strict'; @@ -26,7 +26,7 @@ define(['lodash'], function(_) { */ return function getConfig(config, defaults) { return _(config || {}) - .omit(value => value === null || typeof value === 'undefined') + .omitBy(value => value === null || typeof value === 'undefined') .defaults(defaults || {}) .value(); };